dcrypt_params/traditional/
ecdsa.rs

1//! Constants for ECDSA algorithm
2
3/// NIST P-192 (secp192r1) curve parameters
4pub struct NistP192Params {
5    /// Prime modulus p = 2^192 − 2^64 − 1
6    pub p: [u8; 24],
7
8    /// Curve coefficient a = p − 3
9    pub a: [u8; 24],
10
11    /// Curve coefficient b
12    pub b: [u8; 24],
13
14    /// Generator x-coordinate Gx
15    pub g_x: [u8; 24],
16
17    /// Generator y-coordinate Gy
18    pub g_y: [u8; 24],
19
20    /// Order of the curve n
21    pub n: [u8; 24],
22
23    /// Cofactor h
24    pub h: u8,
25}
26
27/// Standard NIST P-192 (secp192r1) parameters (big‐endian):
28pub const NIST_P192: NistP192Params = NistP192Params {
29    // p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF
30    p: [
31        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
32        0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
33    ],
34
35    // a = p - 3 = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC
36    a: [
37        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
38        0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC,
39    ],
40
41    // b = 0x64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1
42    b: [
43        0x64, 0x21, 0x05, 0x19, 0xE5, 0x9C, 0x80, 0xE7, 0x0F, 0xA7, 0xE9, 0xAB, 0x72, 0x24, 0x30,
44        0x49, 0xFE, 0xB8, 0xDE, 0xEC, 0xC1, 0x46, 0xB9, 0xB1,
45    ],
46
47    // Gx = 0x188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012
48    g_x: [
49        0x18, 0x8D, 0xA8, 0x0E, 0xB0, 0x30, 0x90, 0xF6, 0x7C, 0xBF, 0x20, 0xEB, 0x43, 0xA1, 0x88,
50        0x00, 0xF4, 0xFF, 0x0A, 0xFD, 0x82, 0xFF, 0x10, 0x12,
51    ],
52
53    // Gy = 0x07192B95FFC8DA78631011ED6B24CDD573F977A11E794811
54    g_y: [
55        0x07, 0x19, 0x2B, 0x95, 0xFF, 0xC8, 0xDA, 0x78, 0x63, 0x10, 0x11, 0xED, 0x6B, 0x24, 0xCD,
56        0xD5, 0x73, 0xF9, 0x77, 0xA1, 0x1E, 0x79, 0x48, 0x11,
57    ],
58
59    // n = 0xFFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831 (FIXED: 24 bytes)
60    n: [
61        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
62        0xFF, // 12 × 0xFF (not 16)
63        0x99, 0xDE, 0xF8, 0x36, 0x14, 0x6B, 0xC9, 0xB1, 0xB4, 0xD2, 0x28,
64        0x31, // total 24 bytes
65    ],
66
67    // Cofactor h = 1
68    h: 1,
69};
70
71/// NIST P-224 curve parameters
72pub struct NistP224Params {
73    /// Prime modulus
74    pub p: [u8; 28],
75
76    /// Curve coefficient a
77    pub a: [u8; 28],
78
79    /// Curve coefficient b
80    pub b: [u8; 28],
81
82    /// Generator x-coordinate
83    pub g_x: [u8; 28],
84
85    /// Generator y-coordinate
86    pub g_y: [u8; 28],
87
88    /// Order of the curve
89    pub n: [u8; 28],
90
91    /// Cofactor
92    pub h: u8,
93}
94
95/// NIST P-224 curve parameters
96pub const NIST_P224: NistP224Params = NistP224Params {
97    // P-224 prime: 2^224 - 2^96 + 1
98    p: [
99        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
100        0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
101    ],
102
103    // a = -3 mod p
104    a: [
105        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
106        0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
107    ],
108
109    // b
110    b: [
111        0xB4, 0x05, 0x0A, 0x85, 0x0C, 0x04, 0xB3, 0xAB, 0xF5, 0x41, 0x32, 0x56, 0x50, 0x44, 0xB0,
112        0xB7, 0xD7, 0xBF, 0xD8, 0xBA, 0x27, 0x0B, 0x39, 0x43, 0x23, 0x55, 0xFF, 0xB4,
113    ],
114
115    // Generator x-coordinate (NIST FIPS 186-4, big-endian)
116    g_x: [
117        0xB7, 0x0E, 0x0C, 0xBD, 0x6B, 0xB4, 0xBF, 0x7F, 0x32, 0x13, 0x90, 0xB9, 0x4A, 0x03, 0xC1,
118        0xD3, 0x56, 0xC2, 0x11, 0x22, 0x34, 0x32, 0x80, 0xD6, 0x11, 0x5C, 0x1D, 0x21,
119    ],
120
121    // Generator y-coordinate (big-endian, NIST FIPS 186-4)
122    g_y: [
123        0xBD, 0x37, 0x63, 0x88, 0xB5, 0xF7, 0x23, 0xFB, 0x4C, 0x22, 0xDF, 0xE6, 0xCD, 0x43, 0x75,
124        0xA0, 0x5A, 0x07, 0x47, 0x64, 0x44, 0xD5, 0x81, 0x99, 0x85, 0x00, 0x7E, 0x34,
125    ],
126
127    // Order of the curve
128    n: [
129        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x16,
130        0xA2, 0xE0, 0xB8, 0xF0, 0x3E, 0x13, 0xDD, 0x29, 0x45, 0x5C, 0x5C, 0x2A, 0x3D,
131    ],
132
133    // Cofactor
134    h: 1,
135};
136
137/// NIST P-256 curve parameters
138pub struct NistP256Params {
139    /// Prime modulus
140    pub p: [u8; 32],
141
142    /// Curve coefficient a
143    pub a: [u8; 32],
144
145    /// Curve coefficient b
146    pub b: [u8; 32],
147
148    /// Generator x-coordinate
149    pub g_x: [u8; 32],
150
151    /// Generator y-coordinate
152    pub g_y: [u8; 32],
153
154    /// Order of the curve
155    pub n: [u8; 32],
156
157    /// Cofactor
158    pub h: u8,
159}
160
161/// NIST P-256 curve parameters
162pub const NIST_P256: NistP256Params = NistP256Params {
163    // P-256 prime: 2^256 - 2^224 + 2^192 + 2^96 - 1
164    p: [
165        0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
166        0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
167        0xFF, 0xFF,
168    ],
169
170    // a = p - 3 (FIXED: 0xFC should be at the end)
171    a: [
172        0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
173        0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
174        0xFF, 0xFC,
175    ],
176
177    // b
178    b: [
179        0x5A, 0xC6, 0x35, 0xD8, 0xAA, 0x3A, 0x93, 0xE7, 0xB3, 0xEB, 0xBD, 0x55, 0x76, 0x98, 0x86,
180        0xBC, 0x65, 0x1D, 0x06, 0xB0, 0xCC, 0x53, 0xB0, 0xF6, 0x3B, 0xCE, 0x3C, 0x3E, 0x27, 0xD2,
181        0x60, 0x4B,
182    ],
183
184    // Generator x-coordinate
185    g_x: [
186        0x6B, 0x17, 0xD1, 0xF2, 0xE1, 0x2C, 0x42, 0x47, 0xF8, 0xBC, 0xE6, 0xE5, 0x63, 0xA4, 0x40,
187        0xF2, 0x77, 0x03, 0x7D, 0x81, 0x2D, 0xEB, 0x33, 0xA0, 0xF4, 0xA1, 0x39, 0x45, 0xD8, 0x98,
188        0xC2, 0x96,
189    ],
190
191    // Generator y-coordinate
192    g_y: [
193        0x4F, 0xE3, 0x42, 0xE2, 0xFE, 0x1A, 0x7F, 0x9B, 0x8E, 0xE7, 0xEB, 0x4A, 0x7C, 0x0F, 0x9E,
194        0x16, 0x2B, 0xCE, 0x33, 0x57, 0x6B, 0x31, 0x5E, 0xCE, 0xCB, 0xB6, 0x40, 0x68, 0x37, 0xBF,
195        0x51, 0xF5,
196    ],
197
198    // Order of the curve
199    n: [
200        0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
201        0xFF, 0xBC, 0xE6, 0xFA, 0xAD, 0xA7, 0x17, 0x9E, 0x84, 0xF3, 0xB9, 0xCA, 0xC2, 0xFC, 0x63,
202        0x25, 0x51,
203    ],
204
205    // Cofactor
206    h: 1,
207};
208
209/// NIST P-384 curve parameters
210pub struct NistP384Params {
211    /// Prime modulus
212    pub p: [u8; 48],
213
214    /// Curve coefficient a
215    pub a: [u8; 48],
216
217    /// Curve coefficient b
218    pub b: [u8; 48],
219
220    /// Generator x-coordinate
221    pub g_x: [u8; 48],
222
223    /// Generator y-coordinate
224    pub g_y: [u8; 48],
225
226    /// Order of the curve
227    pub n: [u8; 48],
228
229    /// Cofactor
230    pub h: u8,
231}
232
233/// NIST P-384 curve parameters
234pub const NIST_P384: NistP384Params = NistP384Params {
235    // P-384 prime
236    p: [
237        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
238        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
239        0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
240        0xFF, 0xFF, 0xFF,
241    ],
242
243    // a = -3 mod p
244    a: [
245        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
246        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
247        0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
248        0xFF, 0xFF, 0xFC,
249    ],
250
251    // b
252    b: [
253        0xB3, 0x31, 0x2F, 0xA7, 0xE2, 0x3E, 0xE7, 0xE4, 0x98, 0x8E, 0x05, 0x6B, 0xE3, 0xF8, 0x2D,
254        0x19, 0x18, 0x1D, 0x9C, 0x6E, 0xFE, 0x81, 0x41, 0x12, 0x03, 0x14, 0x08, 0x8F, 0x50, 0x13,
255        0x87, 0x5A, 0xC6, 0x56, 0x39, 0x8D, 0x8A, 0x2E, 0xD1, 0x9D, 0x2A, 0x85, 0xC8, 0xED, 0xD3,
256        0xEC, 0x2A, 0xEF,
257    ],
258
259    // Generator x-coordinate
260    g_x: [
261        0xAA, 0x87, 0xCA, 0x22, 0xBE, 0x8B, 0x05, 0x37, 0x8E, 0xB1, 0xC7, 0x1E, 0xF3, 0x20, 0xAD,
262        0x74, 0x6E, 0x1D, 0x3B, 0x62, 0x8B, 0xA7, 0x9B, 0x98, 0x59, 0xF7, 0x41, 0xE0, 0x82, 0x54,
263        0x2A, 0x38, 0x55, 0x02, 0xF2, 0x5D, 0xBF, 0x55, 0x29, 0x6C, 0x3A, 0x54, 0x5E, 0x38, 0x72,
264        0x76, 0x0A, 0xB7,
265    ],
266
267    // Generator y-coordinate
268    g_y: [
269        0x36, 0x17, 0xDE, 0x4A, 0x96, 0x26, 0x2C, 0x6F, 0x5D, 0x9E, 0x98, 0xBF, 0x92, 0x92, 0xDC,
270        0x29, 0xF8, 0xF4, 0x1D, 0xBD, 0x28, 0x9A, 0x14, 0x7C, 0xE9, 0xDA, 0x31, 0x13, 0xB5, 0xF0,
271        0xB8, 0xC0, 0x0A, 0x60, 0xB1, 0xCE, 0x1D, 0x7E, 0x81, 0x9D, 0x7A, 0x43, 0x1D, 0x7C, 0x90,
272        0xEA, 0x0E, 0x5F,
273    ],
274
275    // Order of the curve
276    n: [
277        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
278        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0x63, 0x4D, 0x81, 0xF4, 0x37,
279        0x2D, 0xDF, 0x58, 0x1A, 0x0D, 0xB2, 0x48, 0xB0, 0xA7, 0x7A, 0xEC, 0xEC, 0x19, 0x6A, 0xCC,
280        0xC5, 0x29, 0x73,
281    ],
282
283    // Cofactor
284    h: 1,
285};
286
287/// NIST P-521 curve parameters
288pub struct NistP521Params {
289    /// Prime modulus p = 2^521 - 1
290    pub p: [u8; 66],
291    /// Curve coefficient a = p - 3
292    pub a: [u8; 66],
293    /// Curve coefficient b
294    pub b: [u8; 66],
295    /// Generator x-coordinate Gx
296    pub g_x: [u8; 66],
297    /// Generator y-coordinate Gy
298    pub g_y: [u8; 66],
299    /// Order of the curve n
300    pub n: [u8; 66],
301    /// Cofactor h
302    pub h: u8,
303}
304
305// Standard NIST P-521 (secp521r1) parameters (Big-Endian)
306pub const NIST_P521: NistP521Params = NistP521Params {
307    p: [
308        // 66 bytes for 2^521 - 1
309        0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
310        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
311        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
312        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
313        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
314    ],
315    a: [
316        // 66 bytes for p - 3 = 2^521 - 4. This is 0x01 followed by 64 0xFFs, then 0xFC.
317        0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
318        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
319        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
320        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
321        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // This makes it 64 0xFFs after 0x01
322        0xFC,
323    ],
324    b: [
325        // 66 bytes
326        0x00, 0x51, 0x95, 0x3E, 0xB9, 0x61, 0x8E, 0x1C, 0x9A, 0x1F, 0x92, 0x9A, 0x21, 0xA0, 0xB6,
327        0x85, 0x40, 0xEE, 0xA2, 0xDA, 0x72, 0x5B, 0x99, 0xB3, 0x15, 0xF3, 0xB8, 0xB4, 0x89, 0x91,
328        0x8E, 0xF1, 0x09, 0xE1, 0x56, 0x19, 0x39, 0x51, 0xEC, 0x7E, 0x93, 0x7B, 0x16, 0x52, 0xC0,
329        0xBD, 0x3B, 0xB1, 0xBF, 0x07, 0x35, 0x73, 0xDF, 0x88, 0x3D, 0x2C, 0x34, 0xF1, 0xEF, 0x45,
330        0x1F, 0xD4, 0x6B, 0x50, 0x3F, 0x00,
331    ],
332    g_x: [
333        // 66 bytes
334        0x00, 0xC6, 0x85, 0x8E, 0x06, 0xB7, 0x04, 0x04, 0xE9, 0xCD, 0x9E, 0x3E, 0xCB, 0x66, 0x23,
335        0x95, 0xB4, 0x42, 0x9C, 0x64, 0x81, 0x39, 0x05, 0x3F, 0xB5, 0x21, 0xF8, 0x28, 0xAF, 0x60,
336        0x6B, 0x4D, 0x3D, 0xBA, 0xA1, 0x4B, 0x5E, 0x77, 0xEF, 0xE7, 0x59, 0x28, 0xFE, 0x1D, 0xC1,
337        0x27, 0xA2, 0xFF, 0xA8, 0xDE, 0x33, 0x48, 0xB3, 0xC1, 0x85, 0x6A, 0x42, 0x9B, 0xF9, 0x7E,
338        0x7E, 0x31, 0xC2, 0xE5, 0xBD, 0x66,
339    ],
340    g_y: [
341        // 66 bytes
342        0x01, 0x18, 0x39, 0x29, 0x6A, 0x78, 0x9A, 0x3B, 0xC0, 0x04, 0x5C, 0x8A, 0x5F, 0xB4, 0x2C,
343        0x7D, 0x1B, 0xD9, 0x98, 0xF5, 0x44, 0x49, 0x57, 0x9B, 0x44, 0x68, 0x17, 0xAF, 0xBD, 0x17,
344        0x27, 0x3E, 0x66, 0x2C, 0x97, 0xEE, 0x72, 0x99, 0x5E, 0xF4, 0x26, 0x40, 0xC5, 0x50, 0xB9,
345        0x01, 0x3F, 0xAD, 0x07, 0x61, 0x35, 0x3C, 0x70, 0x86, 0xA2, 0x72, 0xC2, 0x40, 0x88, 0xBE,
346        0x94, 0x76, 0x9F, 0xD1, 0x66, 0x50,
347    ],
348    n: [
349        // 66 bytes for P-521 order n. This is 0x01, then 32 0xFFs, then the 33-byte tail starting with 0xFA.
350        0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
351        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
352        0xFF, 0xFF, 0xFF, // This completes 32 0xFFs after 0x01
353        // 33-byte tail starts here
354        0xFA, 0x51, 0x86, 0x87, 0x83, 0xBF, 0x2F, 0x96, 0x6B, 0x7F, 0xCC, 0x01, 0x48, 0xF7, 0x09,
355        0xA5, 0xD0, 0x3B, 0xB5, 0xC9, 0xB8, 0x89, 0x9C, 0x47, 0xAE, 0xBB, 0x6F, 0xB7, 0x1E, 0x91,
356        0x38, 0x64, 0x09,
357    ],
358    h: 1,
359};