Skip to main content

dcrypt_params/traditional/
ecdsa.rs

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