]> Cypherpunks.ru repositories - gogost.git/blob - src/cypherpunks.ru/gogost/gost3410/params.go
Coordinates conversion from/to twisted Edwards to Weierstass form
[gogost.git] / src / cypherpunks.ru / gogost / gost3410 / params.go
1 // GoGOST -- Pure Go GOST cryptographic functions library
2 // Copyright (C) 2015-2019 Sergey Matveev <stargrave@stargrave.org>
3 //
4 // This program is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
17 package gost3410
18
19 type Mode int
20
21 var (
22         Mode2001 Mode = Mode(32)
23         Mode2012 Mode = Mode(64)
24
25         CurveGostR34102001ParamSetcc func() *Curve = func() *Curve {
26                 curve, err := NewCurve(
27                         bytes2big([]byte{
28                                 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
29                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
30                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
31                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC7,
32                         }),
33                         bytes2big([]byte{
34                                 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
35                                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
36                                 0x60, 0x61, 0x17, 0xa2, 0xf4, 0xbd, 0xe4, 0x28,
37                                 0xb7, 0x45, 0x8a, 0x54, 0xb6, 0xe8, 0x7b, 0x85,
38                         }),
39                         bytes2big([]byte{
40                                 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
41                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
42                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
43                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc4,
44                         }),
45                         bytes2big([]byte{
46                                 0x2d, 0x06, 0xB4, 0x26, 0x5e, 0xbc, 0x74, 0x9f,
47                                 0xf7, 0xd0, 0xf1, 0xf1, 0xf8, 0x82, 0x32, 0xe8,
48                                 0x16, 0x32, 0xe9, 0x08, 0x8f, 0xd4, 0x4b, 0x77,
49                                 0x87, 0xd5, 0xe4, 0x07, 0xe9, 0x55, 0x08, 0x0c,
50                         }),
51                         bytes2big([]byte{
52                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
53                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
54                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
55                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
56                         }),
57                         bytes2big([]byte{
58                                 0xa2, 0x0e, 0x03, 0x4b, 0xf8, 0x81, 0x3e, 0xf5,
59                                 0xc1, 0x8d, 0x01, 0x10, 0x5e, 0x72, 0x6a, 0x17,
60                                 0xeb, 0x24, 0x8b, 0x26, 0x4a, 0xe9, 0x70, 0x6f,
61                                 0x44, 0x0b, 0xed, 0xc8, 0xcc, 0xb6, 0xb2, 0x2c,
62                         }),
63                         nil,
64                         nil,
65                 )
66                 if err != nil {
67                         panic(err)
68                 }
69                 return curve
70         }
71         // id-GostR3410-2001-TestParamSet
72         CurveIdGostR34102001TestParamSet func() *Curve = func() *Curve {
73                 curve, err := NewCurve(
74                         bytes2big([]byte{
75                                 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
76                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
77                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
78                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x31,
79                         }),
80                         bytes2big([]byte{
81                                 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
82                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
83                                 0x50, 0xFE, 0x8A, 0x18, 0x92, 0x97, 0x61, 0x54,
84                                 0xC5, 0x9C, 0xFC, 0x19, 0x3A, 0xCC, 0xF5, 0xB3,
85                         }),
86                         bytes2big([]byte{
87                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
88                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
89                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
90                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
91                         }),
92                         bytes2big([]byte{
93                                 0x5F, 0xBF, 0xF4, 0x98, 0xAA, 0x93, 0x8C, 0xE7,
94                                 0x39, 0xB8, 0xE0, 0x22, 0xFB, 0xAF, 0xEF, 0x40,
95                                 0x56, 0x3F, 0x6E, 0x6A, 0x34, 0x72, 0xFC, 0x2A,
96                                 0x51, 0x4C, 0x0C, 0xE9, 0xDA, 0xE2, 0x3B, 0x7E,
97                         }),
98                         bytes2big([]byte{
99                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
100                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
102                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
103                         }),
104                         bytes2big([]byte{
105                                 0x08, 0xE2, 0xA8, 0xA0, 0xE6, 0x51, 0x47, 0xD4,
106                                 0xBD, 0x63, 0x16, 0x03, 0x0E, 0x16, 0xD1, 0x9C,
107                                 0x85, 0xC9, 0x7F, 0x0A, 0x9C, 0xA2, 0x67, 0x12,
108                                 0x2B, 0x96, 0xAB, 0xBC, 0xEA, 0x7E, 0x8F, 0xC8,
109                         }),
110                         nil,
111                         nil,
112                 )
113                 if err != nil {
114                         panic(err)
115                 }
116                 return curve
117         }
118         // id-GostR3410-2001-CryptoPro-A-ParamSet
119         CurveIdGostR34102001CryptoProAParamSet func() *Curve = func() *Curve {
120                 curve, err := NewCurve(
121                         bytes2big([]byte{
122                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
123                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
124                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
125                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x97,
126                         }),
127                         bytes2big([]byte{
128                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
129                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
130                                 0x6C, 0x61, 0x10, 0x70, 0x99, 0x5A, 0xD1, 0x00,
131                                 0x45, 0x84, 0x1B, 0x09, 0xB7, 0x61, 0xB8, 0x93,
132                         }),
133                         bytes2big([]byte{
134                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
135                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
136                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
137                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x94,
138                         }),
139                         bytes2big([]byte{
140                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
141                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
142                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
143                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6,
144                         }),
145                         bytes2big([]byte{
146                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
147                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
148                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
149                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
150                         }),
151                         bytes2big([]byte{
152                                 0x8D, 0x91, 0xE4, 0x71, 0xE0, 0x98, 0x9C, 0xDA,
153                                 0x27, 0xDF, 0x50, 0x5A, 0x45, 0x3F, 0x2B, 0x76,
154                                 0x35, 0x29, 0x4F, 0x2D, 0xDF, 0x23, 0xE3, 0xB1,
155                                 0x22, 0xAC, 0xC9, 0x9C, 0x9E, 0x9F, 0x1E, 0x14,
156                         }),
157                         nil,
158                         nil,
159                 )
160                 if err != nil {
161                         panic(err)
162                 }
163                 return curve
164         }
165         // id-GostR3410-2001-CryptoPro-B-ParamSet
166         CurveIdGostR34102001CryptoProBParamSet func() *Curve = func() *Curve {
167                 curve, err := NewCurve(
168                         bytes2big([]byte{
169                                 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
170                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
171                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
172                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x99,
173                         }),
174                         bytes2big([]byte{
175                                 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
176                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
177                                 0x5F, 0x70, 0x0C, 0xFF, 0xF1, 0xA6, 0x24, 0xE5,
178                                 0xE4, 0x97, 0x16, 0x1B, 0xCC, 0x8A, 0x19, 0x8F,
179                         }),
180                         bytes2big([]byte{
181                                 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
182                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
183                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
184                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x96,
185                         }),
186                         bytes2big([]byte{
187                                 0x3E, 0x1A, 0xF4, 0x19, 0xA2, 0x69, 0xA5, 0xF8,
188                                 0x66, 0xA7, 0xD3, 0xC2, 0x5C, 0x3D, 0xF8, 0x0A,
189                                 0xE9, 0x79, 0x25, 0x93, 0x73, 0xFF, 0x2B, 0x18,
190                                 0x2F, 0x49, 0xD4, 0xCE, 0x7E, 0x1B, 0xBC, 0x8B,
191                         }),
192                         bytes2big([]byte{
193                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
194                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
195                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
196                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
197                         }),
198                         bytes2big([]byte{
199                                 0x3F, 0xA8, 0x12, 0x43, 0x59, 0xF9, 0x66, 0x80,
200                                 0xB8, 0x3D, 0x1C, 0x3E, 0xB2, 0xC0, 0x70, 0xE5,
201                                 0xC5, 0x45, 0xC9, 0x85, 0x8D, 0x03, 0xEC, 0xFB,
202                                 0x74, 0x4B, 0xF8, 0xD7, 0x17, 0x71, 0x7E, 0xFC,
203                         }),
204                         nil,
205                         nil,
206                 )
207                 if err != nil {
208                         panic(err)
209                 }
210                 return curve
211         }
212         // id-GostR3410-2001-CryptoPro-C-ParamSet
213         CurveIdGostR34102001CryptoProCParamSet func() *Curve = func() *Curve {
214                 curve, err := NewCurve(
215                         bytes2big([]byte{
216                                 0x9B, 0x9F, 0x60, 0x5F, 0x5A, 0x85, 0x81, 0x07,
217                                 0xAB, 0x1E, 0xC8, 0x5E, 0x6B, 0x41, 0xC8, 0xAA,
218                                 0xCF, 0x84, 0x6E, 0x86, 0x78, 0x90, 0x51, 0xD3,
219                                 0x79, 0x98, 0xF7, 0xB9, 0x02, 0x2D, 0x75, 0x9B,
220                         }),
221                         bytes2big([]byte{
222                                 0x9B, 0x9F, 0x60, 0x5F, 0x5A, 0x85, 0x81, 0x07,
223                                 0xAB, 0x1E, 0xC8, 0x5E, 0x6B, 0x41, 0xC8, 0xAA,
224                                 0x58, 0x2C, 0xA3, 0x51, 0x1E, 0xDD, 0xFB, 0x74,
225                                 0xF0, 0x2F, 0x3A, 0x65, 0x98, 0x98, 0x0B, 0xB9,
226                         }),
227                         bytes2big([]byte{
228                                 0x9B, 0x9F, 0x60, 0x5F, 0x5A, 0x85, 0x81, 0x07,
229                                 0xAB, 0x1E, 0xC8, 0x5E, 0x6B, 0x41, 0xC8, 0xAA,
230                                 0xCF, 0x84, 0x6E, 0x86, 0x78, 0x90, 0x51, 0xD3,
231                                 0x79, 0x98, 0xF7, 0xB9, 0x02, 0x2D, 0x75, 0x98,
232                         }),
233                         bytes2big([]byte{
234                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
235                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
236                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
237                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x5a,
238                         }),
239                         bytes2big([]byte{
240                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
241                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
242                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
243                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
244                         }),
245                         bytes2big([]byte{
246                                 0x41, 0xEC, 0xE5, 0x57, 0x43, 0x71, 0x1A, 0x8C,
247                                 0x3C, 0xBF, 0x37, 0x83, 0xCD, 0x08, 0xC0, 0xEE,
248                                 0x4D, 0x4D, 0xC4, 0x40, 0xD4, 0x64, 0x1A, 0x8F,
249                                 0x36, 0x6E, 0x55, 0x0D, 0xFD, 0xB3, 0xBB, 0x67,
250                         }),
251                         nil,
252                         nil,
253                 )
254                 if err != nil {
255                         panic(err)
256                 }
257                 return curve
258         }
259         // id-GostR3410-2001-CryptoPro-XchA-ParamSet
260         CurveIdGostR34102001CryptoProXchAParamSet func() *Curve = func() *Curve {
261                 curve, err := NewCurve(
262                         bytes2big([]byte{
263                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
264                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
265                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
266                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x97,
267                         }),
268                         bytes2big([]byte{
269                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
270                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
271                                 0x6C, 0x61, 0x10, 0x70, 0x99, 0x5A, 0xD1, 0x00,
272                                 0x45, 0x84, 0x1B, 0x09, 0xB7, 0x61, 0xB8, 0x93,
273                         }),
274                         bytes2big([]byte{
275                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
276                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
277                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
278                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x94,
279                         }),
280                         bytes2big([]byte{
281                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
282                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
283                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
284                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6,
285                         }),
286                         bytes2big([]byte{
287                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
288                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
289                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
290                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
291                         }),
292                         bytes2big([]byte{
293                                 0x8D, 0x91, 0xE4, 0x71, 0xE0, 0x98, 0x9C, 0xDA,
294                                 0x27, 0xDF, 0x50, 0x5A, 0x45, 0x3F, 0x2B, 0x76,
295                                 0x35, 0x29, 0x4F, 0x2D, 0xDF, 0x23, 0xE3, 0xB1,
296                                 0x22, 0xAC, 0xC9, 0x9C, 0x9E, 0x9F, 0x1E, 0x14,
297                         }),
298                         nil,
299                         nil,
300                 )
301                 if err != nil {
302                         panic(err)
303                 }
304                 return curve
305         }
306         // id-GostR3410-2001-CryptoPro-XchB-ParamSet
307         CurveIdGostR34102001CryptoProXchBParamSet func() *Curve = func() *Curve {
308                 curve, err := NewCurve(
309                         bytes2big([]byte{
310                                 0x9B, 0x9F, 0x60, 0x5F, 0x5A, 0x85, 0x81, 0x07,
311                                 0xAB, 0x1E, 0xC8, 0x5E, 0x6B, 0x41, 0xC8, 0xAA,
312                                 0xCF, 0x84, 0x6E, 0x86, 0x78, 0x90, 0x51, 0xD3,
313                                 0x79, 0x98, 0xF7, 0xB9, 0x02, 0x2D, 0x75, 0x9B,
314                         }),
315                         bytes2big([]byte{
316                                 0x9B, 0x9F, 0x60, 0x5F, 0x5A, 0x85, 0x81, 0x07,
317                                 0xAB, 0x1E, 0xC8, 0x5E, 0x6B, 0x41, 0xC8, 0xAA,
318                                 0x58, 0x2C, 0xA3, 0x51, 0x1E, 0xDD, 0xFB, 0x74,
319                                 0xF0, 0x2F, 0x3A, 0x65, 0x98, 0x98, 0x0B, 0xB9,
320                         }),
321                         bytes2big([]byte{
322                                 0x9B, 0x9F, 0x60, 0x5F, 0x5A, 0x85, 0x81, 0x07,
323                                 0xAB, 0x1E, 0xC8, 0x5E, 0x6B, 0x41, 0xC8, 0xAA,
324                                 0xCF, 0x84, 0x6E, 0x86, 0x78, 0x90, 0x51, 0xD3,
325                                 0x79, 0x98, 0xF7, 0xB9, 0x02, 0x2D, 0x75, 0x98,
326                         }),
327                         bytes2big([]byte{
328                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
329                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
330                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
331                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x5a,
332                         }),
333                         bytes2big([]byte{
334                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
335                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
336                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
337                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
338                         }),
339                         bytes2big([]byte{
340                                 0x41, 0xEC, 0xE5, 0x57, 0x43, 0x71, 0x1A, 0x8C,
341                                 0x3C, 0xBF, 0x37, 0x83, 0xCD, 0x08, 0xC0, 0xEE,
342                                 0x4D, 0x4D, 0xC4, 0x40, 0xD4, 0x64, 0x1A, 0x8F,
343                                 0x36, 0x6E, 0x55, 0x0D, 0xFD, 0xB3, 0xBB, 0x67,
344                         }),
345                         nil,
346                         nil,
347                 )
348                 if err != nil {
349                         panic(err)
350                 }
351                 return curve
352         }
353         // id-tc26-gost-3410-2012-256-paramSetA
354         CurveIdtc26gost34102012256paramSetA func() *Curve = func() *Curve {
355                 curve, err := NewCurve(
356                         bytes2big([]byte{
357                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
358                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
359                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
360                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x97,
361                         }),
362                         bytes2big([]byte{
363                                 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
364                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
365                                 0x0F, 0xD8, 0xCD, 0xDF, 0xC8, 0x7B, 0x66, 0x35,
366                                 0xC1, 0x15, 0xAF, 0x55, 0x6C, 0x36, 0x0C, 0x67,
367                         }),
368                         bytes2big([]byte{
369                                 0xC2, 0x17, 0x3F, 0x15, 0x13, 0x98, 0x16, 0x73,
370                                 0xAF, 0x48, 0x92, 0xC2, 0x30, 0x35, 0xA2, 0x7C,
371                                 0xE2, 0x5E, 0x20, 0x13, 0xBF, 0x95, 0xAA, 0x33,
372                                 0xB2, 0x2C, 0x65, 0x6F, 0x27, 0x7E, 0x73, 0x35,
373                         }),
374                         bytes2big([]byte{
375                                 0x29, 0x5F, 0x9B, 0xAE, 0x74, 0x28, 0xED, 0x9C,
376                                 0xCC, 0x20, 0xE7, 0xC3, 0x59, 0xA9, 0xD4, 0x1A,
377                                 0x22, 0xFC, 0xCD, 0x91, 0x08, 0xE1, 0x7B, 0xF7,
378                                 0xBA, 0x93, 0x37, 0xA6, 0xF8, 0xAE, 0x95, 0x13,
379                         }),
380                         bytes2big([]byte{
381                                 0x91, 0xE3, 0x84, 0x43, 0xA5, 0xE8, 0x2C, 0x0D,
382                                 0x88, 0x09, 0x23, 0x42, 0x57, 0x12, 0xB2, 0xBB,
383                                 0x65, 0x8B, 0x91, 0x96, 0x93, 0x2E, 0x02, 0xC7,
384                                 0x8B, 0x25, 0x82, 0xFE, 0x74, 0x2D, 0xAA, 0x28,
385                         }),
386                         bytes2big([]byte{
387                                 0x32, 0x87, 0x94, 0x23, 0xAB, 0x1A, 0x03, 0x75,
388                                 0x89, 0x57, 0x86, 0xC4, 0xBB, 0x46, 0xE9, 0x56,
389                                 0x5F, 0xDE, 0x0B, 0x53, 0x44, 0x76, 0x67, 0x40,
390                                 0xAF, 0x26, 0x8A, 0xDB, 0x32, 0x32, 0x2E, 0x5C,
391                         }),
392                         bigInt1,
393                         bytes2big([]byte{
394                                 0x06, 0x05, 0xF6, 0xB7, 0xC1, 0x83, 0xFA, 0x81,
395                                 0x57, 0x8B, 0xC3, 0x9C, 0xFA, 0xD5, 0x18, 0x13,
396                                 0x2B, 0x9D, 0xF6, 0x28, 0x97, 0x00, 0x9A, 0xF7,
397                                 0xE5, 0x22, 0xC3, 0x2D, 0x6D, 0xC7, 0xBF, 0xFB,
398                         }),
399                 )
400                 if err != nil {
401                         panic(err)
402                 }
403                 return curve
404         }
405         // id-tc26-gost-3410-12-512-paramSetA
406         CurveIdtc26gost341012512paramSetA func() *Curve = func() *Curve {
407                 curve, err := NewCurve(
408                         bytes2big([]byte{
409                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
410                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
411                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
412                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
413                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
414                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
415                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
416                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xC7,
417                         }),
418                         bytes2big([]byte{
419                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
420                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
421                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
422                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
423                                 0x27, 0xE6, 0x95, 0x32, 0xF4, 0x8D, 0x89, 0x11,
424                                 0x6F, 0xF2, 0x2B, 0x8D, 0x4E, 0x05, 0x60, 0x60,
425                                 0x9B, 0x4B, 0x38, 0xAB, 0xFA, 0xD2, 0xB8, 0x5D,
426                                 0xCA, 0xCD, 0xB1, 0x41, 0x1F, 0x10, 0xB2, 0x75,
427                         }),
428                         bytes2big([]byte{
429                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
430                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
431                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
432                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
433                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
434                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
435                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
436                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xC4,
437                         }),
438                         bytes2big([]byte{
439                                 0xE8, 0xC2, 0x50, 0x5D, 0xED, 0xFC, 0x86, 0xDD,
440                                 0xC1, 0xBD, 0x0B, 0x2B, 0x66, 0x67, 0xF1, 0xDA,
441                                 0x34, 0xB8, 0x25, 0x74, 0x76, 0x1C, 0xB0, 0xE8,
442                                 0x79, 0xBD, 0x08, 0x1C, 0xFD, 0x0B, 0x62, 0x65,
443                                 0xEE, 0x3C, 0xB0, 0x90, 0xF3, 0x0D, 0x27, 0x61,
444                                 0x4C, 0xB4, 0x57, 0x40, 0x10, 0xDA, 0x90, 0xDD,
445                                 0x86, 0x2E, 0xF9, 0xD4, 0xEB, 0xEE, 0x47, 0x61,
446                                 0x50, 0x31, 0x90, 0x78, 0x5A, 0x71, 0xC7, 0x60,
447                         }),
448                         bytes2big([]byte{
449                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
450                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
451                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
452                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
453                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
454                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
455                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
456                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
457                         }),
458                         bytes2big([]byte{
459                                 0x75, 0x03, 0xCF, 0xE8, 0x7A, 0x83, 0x6A, 0xE3,
460                                 0xA6, 0x1B, 0x88, 0x16, 0xE2, 0x54, 0x50, 0xE6,
461                                 0xCE, 0x5E, 0x1C, 0x93, 0xAC, 0xF1, 0xAB, 0xC1,
462                                 0x77, 0x80, 0x64, 0xFD, 0xCB, 0xEF, 0xA9, 0x21,
463                                 0xDF, 0x16, 0x26, 0xBE, 0x4F, 0xD0, 0x36, 0xE9,
464                                 0x3D, 0x75, 0xE6, 0xA5, 0x0E, 0x3A, 0x41, 0xE9,
465                                 0x80, 0x28, 0xFE, 0x5F, 0xC2, 0x35, 0xF5, 0xB8,
466                                 0x89, 0xA5, 0x89, 0xCB, 0x52, 0x15, 0xF2, 0xA4,
467                         }),
468                         nil,
469                         nil,
470                 )
471                 if err != nil {
472                         panic(err)
473                 }
474                 return curve
475         }
476         // id-tc26-gost-3410-12-512-paramSetB
477         CurveIdtc26gost341012512paramSetB func() *Curve = func() *Curve {
478                 curve, err := NewCurve(
479                         bytes2big([]byte{
480                                 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
481                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
482                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
483                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
484                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
485                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
486                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
487                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F,
488                         }),
489                         bytes2big([]byte{
490                                 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
491                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
492                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
493                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
494                                 0x49, 0xA1, 0xEC, 0x14, 0x25, 0x65, 0xA5, 0x45,
495                                 0xAC, 0xFD, 0xB7, 0x7B, 0xD9, 0xD4, 0x0C, 0xFA,
496                                 0x8B, 0x99, 0x67, 0x12, 0x10, 0x1B, 0xEA, 0x0E,
497                                 0xC6, 0x34, 0x6C, 0x54, 0x37, 0x4F, 0x25, 0xBD,
498                         }),
499                         bytes2big([]byte{
500                                 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
501                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
502                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
503                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
504                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
505                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
506                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
507                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C,
508                         }),
509                         bytes2big([]byte{
510                                 0x68, 0x7D, 0x1B, 0x45, 0x9D, 0xC8, 0x41, 0x45,
511                                 0x7E, 0x3E, 0x06, 0xCF, 0x6F, 0x5E, 0x25, 0x17,
512                                 0xB9, 0x7C, 0x7D, 0x61, 0x4A, 0xF1, 0x38, 0xBC,
513                                 0xBF, 0x85, 0xDC, 0x80, 0x6C, 0x4B, 0x28, 0x9F,
514                                 0x3E, 0x96, 0x5D, 0x2D, 0xB1, 0x41, 0x6D, 0x21,
515                                 0x7F, 0x8B, 0x27, 0x6F, 0xAD, 0x1A, 0xB6, 0x9C,
516                                 0x50, 0xF7, 0x8B, 0xEE, 0x1F, 0xA3, 0x10, 0x6E,
517                                 0xFB, 0x8C, 0xCB, 0xC7, 0xC5, 0x14, 0x01, 0x16,
518                         }),
519                         bytes2big([]byte{
520                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
521                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
522                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
523                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
524                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
525                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
526                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
527                                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
528                         }),
529                         bytes2big([]byte{
530                                 0x1A, 0x8F, 0x7E, 0xDA, 0x38, 0x9B, 0x09, 0x4C,
531                                 0x2C, 0x07, 0x1E, 0x36, 0x47, 0xA8, 0x94, 0x0F,
532                                 0x3C, 0x12, 0x3B, 0x69, 0x75, 0x78, 0xC2, 0x13,
533                                 0xBE, 0x6D, 0xD9, 0xE6, 0xC8, 0xEC, 0x73, 0x35,
534                                 0xDC, 0xB2, 0x28, 0xFD, 0x1E, 0xDF, 0x4A, 0x39,
535                                 0x15, 0x2C, 0xBC, 0xAA, 0xF8, 0xC0, 0x39, 0x88,
536                                 0x28, 0x04, 0x10, 0x55, 0xF9, 0x4C, 0xEE, 0xEC,
537                                 0x7E, 0x21, 0x34, 0x07, 0x80, 0xFE, 0x41, 0xBD,
538                         }),
539                         nil,
540                         nil,
541                 )
542                 if err != nil {
543                         panic(err)
544                 }
545                 return curve
546         }
547         // id-tc26-gost-3410-2012-512-paramSetC
548         CurveIdtc26gost34102012512paramSetC func() *Curve = func() *Curve {
549                 curve, err := NewCurve(
550                         bytes2big([]byte{
551                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
552                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
553                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
554                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
555                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
556                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
557                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
558                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xC7,
559                         }),
560                         bytes2big([]byte{
561                                 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
562                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
563                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
564                                 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
565                                 0xC9, 0x8C, 0xDB, 0xA4, 0x65, 0x06, 0xAB, 0x00,
566                                 0x4C, 0x33, 0xA9, 0xFF, 0x51, 0x47, 0x50, 0x2C,
567                                 0xC8, 0xED, 0xA9, 0xE7, 0xA7, 0x69, 0xA1, 0x26,
568                                 0x94, 0x62, 0x3C, 0xEF, 0x47, 0xF0, 0x23, 0xED,
569                         }),
570                         bytes2big([]byte{
571                                 0xDC, 0x92, 0x03, 0xE5, 0x14, 0xA7, 0x21, 0x87,
572                                 0x54, 0x85, 0xA5, 0x29, 0xD2, 0xC7, 0x22, 0xFB,
573                                 0x18, 0x7B, 0xC8, 0x98, 0x0E, 0xB8, 0x66, 0x64,
574                                 0x4D, 0xE4, 0x1C, 0x68, 0xE1, 0x43, 0x06, 0x45,
575                                 0x46, 0xE8, 0x61, 0xC0, 0xE2, 0xC9, 0xED, 0xD9,
576                                 0x2A, 0xDE, 0x71, 0xF4, 0x6F, 0xCF, 0x50, 0xFF,
577                                 0x2A, 0xD9, 0x7F, 0x95, 0x1F, 0xDA, 0x9F, 0x2A,
578                                 0x2E, 0xB6, 0x54, 0x6F, 0x39, 0x68, 0x9B, 0xD3,
579                         }),
580                         bytes2big([]byte{
581                                 0xB4, 0xC4, 0xEE, 0x28, 0xCE, 0xBC, 0x6C, 0x2C,
582                                 0x8A, 0xC1, 0x29, 0x52, 0xCF, 0x37, 0xF1, 0x6A,
583                                 0xC7, 0xEF, 0xB6, 0xA9, 0xF6, 0x9F, 0x4B, 0x57,
584                                 0xFF, 0xDA, 0x2E, 0x4F, 0x0D, 0xE5, 0xAD, 0xE0,
585                                 0x38, 0xCB, 0xC2, 0xFF, 0xF7, 0x19, 0xD2, 0xC1,
586                                 0x8D, 0xE0, 0x28, 0x4B, 0x8B, 0xFE, 0xF3, 0xB5,
587                                 0x2B, 0x8C, 0xC7, 0xA5, 0xF5, 0xBF, 0x0A, 0x3C,
588                                 0x8D, 0x23, 0x19, 0xA5, 0x31, 0x25, 0x57, 0xE1,
589                         }),
590                         bytes2big([]byte{
591                                 0xE2, 0xE3, 0x1E, 0xDF, 0xC2, 0x3D, 0xE7, 0xBD,
592                                 0xEB, 0xE2, 0x41, 0xCE, 0x59, 0x3E, 0xF5, 0xDE,
593                                 0x22, 0x95, 0xB7, 0xA9, 0xCB, 0xAE, 0xF0, 0x21,
594                                 0xD3, 0x85, 0xF7, 0x07, 0x4C, 0xEA, 0x04, 0x3A,
595                                 0xA2, 0x72, 0x72, 0xA7, 0xAE, 0x60, 0x2B, 0xF2,
596                                 0xA7, 0xB9, 0x03, 0x3D, 0xB9, 0xED, 0x36, 0x10,
597                                 0xC6, 0xFB, 0x85, 0x48, 0x7E, 0xAE, 0x97, 0xAA,
598                                 0xC5, 0xBC, 0x79, 0x28, 0xC1, 0x95, 0x01, 0x48,
599                         }),
600                         bytes2big([]byte{
601                                 0xF5, 0xCE, 0x40, 0xD9, 0x5B, 0x5E, 0xB8, 0x99,
602                                 0xAB, 0xBC, 0xCF, 0xF5, 0x91, 0x1C, 0xB8, 0x57,
603                                 0x79, 0x39, 0x80, 0x4D, 0x65, 0x27, 0x37, 0x8B,
604                                 0x8C, 0x10, 0x8C, 0x3D, 0x20, 0x90, 0xFF, 0x9B,
605                                 0xE1, 0x8E, 0x2D, 0x33, 0xE3, 0x02, 0x1E, 0xD2,
606                                 0xEF, 0x32, 0xD8, 0x58, 0x22, 0x42, 0x3B, 0x63,
607                                 0x04, 0xF7, 0x26, 0xAA, 0x85, 0x4B, 0xAE, 0x07,
608                                 0xD0, 0x39, 0x6E, 0x9A, 0x9A, 0xDD, 0xC4, 0x0F,
609                         }),
610                         bigInt1,
611                         bytes2big([]byte{
612                                 0x9E, 0x4F, 0x5D, 0x8C, 0x01, 0x7D, 0x8D, 0x9F,
613                                 0x13, 0xA5, 0xCF, 0x3C, 0xDF, 0x5B, 0xFE, 0x4D,
614                                 0xAB, 0x40, 0x2D, 0x54, 0x19, 0x8E, 0x31, 0xEB,
615                                 0xDE, 0x28, 0xA0, 0x62, 0x10, 0x50, 0x43, 0x9C,
616                                 0xA6, 0xB3, 0x9E, 0x0A, 0x51, 0x5C, 0x06, 0xB3,
617                                 0x04, 0xE2, 0xCE, 0x43, 0xE7, 0x9E, 0x36, 0x9E,
618                                 0x91, 0xA0, 0xCF, 0xC2, 0xBC, 0x2A, 0x22, 0xB4,
619                                 0xCA, 0x30, 0x2D, 0xBB, 0x33, 0xEE, 0x75, 0x50,
620                         }),
621                 )
622                 if err != nil {
623                         panic(err)
624                 }
625                 return curve
626         }
627
628         CurveDefault = CurveIdGostR34102001CryptoProAParamSet
629 )