@@ -22,24 +22,6 @@ void static secp256k1_ecdsa_sig_free(secp256k1_ecdsa_sig_t *r) {
2222 secp256k1_num_free (& r -> s );
2323}
2424
25- int static secp256k1_ecdsa_pubkey_parse (secp256k1_ge_t * elem , const unsigned char * pub , int size ) {
26- if (size == 33 && (pub [0 ] == 0x02 || pub [0 ] == 0x03 )) {
27- secp256k1_fe_t x ;
28- secp256k1_fe_set_b32 (& x , pub + 1 );
29- return secp256k1_ge_set_xo (elem , & x , pub [0 ] == 0x03 );
30- } else if (size == 65 && (pub [0 ] == 0x04 || pub [0 ] == 0x06 || pub [0 ] == 0x07 )) {
31- secp256k1_fe_t x , y ;
32- secp256k1_fe_set_b32 (& x , pub + 1 );
33- secp256k1_fe_set_b32 (& y , pub + 33 );
34- secp256k1_ge_set_xy (elem , & x , & y );
35- if ((pub [0 ] == 0x06 || pub [0 ] == 0x07 ) && secp256k1_fe_is_odd (& y ) != (pub [0 ] == 0x07 ))
36- return 0 ;
37- return secp256k1_ge_is_valid (elem );
38- } else {
39- return 0 ;
40- }
41- }
42-
4325int static secp256k1_ecdsa_sig_parse (secp256k1_ecdsa_sig_t * r , const unsigned char * sig , int size ) {
4426 if (sig [0 ] != 0x30 ) return 0 ;
4527 int lenr = sig [3 ];
@@ -206,105 +188,4 @@ void static secp256k1_ecdsa_sig_set_rs(secp256k1_ecdsa_sig_t *sig, const secp256
206188 secp256k1_num_copy (& sig -> s , s );
207189}
208190
209- void static secp256k1_ecdsa_pubkey_serialize (secp256k1_ge_t * elem , unsigned char * pub , int * size , int compressed ) {
210- secp256k1_fe_normalize (& elem -> x );
211- secp256k1_fe_normalize (& elem -> y );
212- secp256k1_fe_get_b32 (& pub [1 ], & elem -> x );
213- if (compressed ) {
214- * size = 33 ;
215- pub [0 ] = 0x02 | (secp256k1_fe_is_odd (& elem -> y ) ? 0x01 : 0x00 );
216- } else {
217- * size = 65 ;
218- pub [0 ] = 0x04 ;
219- secp256k1_fe_get_b32 (& pub [33 ], & elem -> y );
220- }
221- }
222-
223- int static secp256k1_ecdsa_privkey_parse (secp256k1_num_t * key , const unsigned char * privkey , int privkeylen ) {
224- const unsigned char * end = privkey + privkeylen ;
225- // sequence header
226- if (end < privkey + 1 || * privkey != 0x30 )
227- return 0 ;
228- privkey ++ ;
229- // sequence length constructor
230- int lenb = 0 ;
231- if (end < privkey + 1 || !(* privkey & 0x80 ))
232- return 0 ;
233- lenb = * privkey & ~0x80 ; privkey ++ ;
234- if (lenb < 1 || lenb > 2 )
235- return 0 ;
236- if (end < privkey + lenb )
237- return 0 ;
238- // sequence length
239- int len = 0 ;
240- len = privkey [lenb - 1 ] | (lenb > 1 ? privkey [lenb - 2 ] << 8 : 0 );
241- privkey += lenb ;
242- if (end < privkey + len )
243- return 0 ;
244- // sequence element 0: version number (=1)
245- if (end < privkey + 3 || privkey [0 ] != 0x02 || privkey [1 ] != 0x01 || privkey [2 ] != 0x01 )
246- return 0 ;
247- privkey += 3 ;
248- // sequence element 1: octet string, up to 32 bytes
249- if (end < privkey + 2 || privkey [0 ] != 0x04 || privkey [1 ] > 0x20 || end < privkey + 2 + privkey [1 ])
250- return 0 ;
251- secp256k1_num_set_bin (key , privkey + 2 , privkey [1 ]);
252- return 1 ;
253- }
254-
255- int static secp256k1_ecdsa_privkey_serialize (unsigned char * privkey , int * privkeylen , const secp256k1_num_t * key , int compressed ) {
256- secp256k1_gej_t rp ;
257- secp256k1_ecmult_gen (& rp , key );
258- secp256k1_ge_t r ;
259- secp256k1_ge_set_gej (& r , & rp );
260- if (compressed ) {
261- static const unsigned char begin [] = {
262- 0x30 ,0x81 ,0xD3 ,0x02 ,0x01 ,0x01 ,0x04 ,0x20
263- };
264- static const unsigned char middle [] = {
265- 0xA0 ,0x81 ,0x85 ,0x30 ,0x81 ,0x82 ,0x02 ,0x01 ,0x01 ,0x30 ,0x2C ,0x06 ,0x07 ,0x2A ,0x86 ,0x48 ,
266- 0xCE ,0x3D ,0x01 ,0x01 ,0x02 ,0x21 ,0x00 ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,
267- 0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,
268- 0xFF ,0xFF ,0xFE ,0xFF ,0xFF ,0xFC ,0x2F ,0x30 ,0x06 ,0x04 ,0x01 ,0x00 ,0x04 ,0x01 ,0x07 ,0x04 ,
269- 0x21 ,0x02 ,0x79 ,0xBE ,0x66 ,0x7E ,0xF9 ,0xDC ,0xBB ,0xAC ,0x55 ,0xA0 ,0x62 ,0x95 ,0xCE ,0x87 ,
270- 0x0B ,0x07 ,0x02 ,0x9B ,0xFC ,0xDB ,0x2D ,0xCE ,0x28 ,0xD9 ,0x59 ,0xF2 ,0x81 ,0x5B ,0x16 ,0xF8 ,
271- 0x17 ,0x98 ,0x02 ,0x21 ,0x00 ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,
272- 0xFF ,0xFF ,0xFF ,0xFF ,0xFE ,0xBA ,0xAE ,0xDC ,0xE6 ,0xAF ,0x48 ,0xA0 ,0x3B ,0xBF ,0xD2 ,0x5E ,
273- 0x8C ,0xD0 ,0x36 ,0x41 ,0x41 ,0x02 ,0x01 ,0x01 ,0xA1 ,0x24 ,0x03 ,0x22 ,0x00
274- };
275- unsigned char * ptr = privkey ;
276- memcpy (ptr , begin , sizeof (begin )); ptr += sizeof (begin );
277- secp256k1_num_get_bin (ptr , 32 , key ); ptr += 32 ;
278- memcpy (ptr , middle , sizeof (middle )); ptr += sizeof (middle );
279- int pubkeylen = 0 ;
280- secp256k1_ecdsa_pubkey_serialize (& r , ptr , & pubkeylen , 1 ); ptr += pubkeylen ;
281- * privkeylen = ptr - privkey ;
282- } else {
283- static const unsigned char begin [] = {
284- 0x30 ,0x82 ,0x01 ,0x13 ,0x02 ,0x01 ,0x01 ,0x04 ,0x20
285- };
286- static const unsigned char middle [] = {
287- 0xA0 ,0x81 ,0xA5 ,0x30 ,0x81 ,0xA2 ,0x02 ,0x01 ,0x01 ,0x30 ,0x2C ,0x06 ,0x07 ,0x2A ,0x86 ,0x48 ,
288- 0xCE ,0x3D ,0x01 ,0x01 ,0x02 ,0x21 ,0x00 ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,
289- 0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,
290- 0xFF ,0xFF ,0xFE ,0xFF ,0xFF ,0xFC ,0x2F ,0x30 ,0x06 ,0x04 ,0x01 ,0x00 ,0x04 ,0x01 ,0x07 ,0x04 ,
291- 0x41 ,0x04 ,0x79 ,0xBE ,0x66 ,0x7E ,0xF9 ,0xDC ,0xBB ,0xAC ,0x55 ,0xA0 ,0x62 ,0x95 ,0xCE ,0x87 ,
292- 0x0B ,0x07 ,0x02 ,0x9B ,0xFC ,0xDB ,0x2D ,0xCE ,0x28 ,0xD9 ,0x59 ,0xF2 ,0x81 ,0x5B ,0x16 ,0xF8 ,
293- 0x17 ,0x98 ,0x48 ,0x3A ,0xDA ,0x77 ,0x26 ,0xA3 ,0xC4 ,0x65 ,0x5D ,0xA4 ,0xFB ,0xFC ,0x0E ,0x11 ,
294- 0x08 ,0xA8 ,0xFD ,0x17 ,0xB4 ,0x48 ,0xA6 ,0x85 ,0x54 ,0x19 ,0x9C ,0x47 ,0xD0 ,0x8F ,0xFB ,0x10 ,
295- 0xD4 ,0xB8 ,0x02 ,0x21 ,0x00 ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,0xFF ,
296- 0xFF ,0xFF ,0xFF ,0xFF ,0xFE ,0xBA ,0xAE ,0xDC ,0xE6 ,0xAF ,0x48 ,0xA0 ,0x3B ,0xBF ,0xD2 ,0x5E ,
297- 0x8C ,0xD0 ,0x36 ,0x41 ,0x41 ,0x02 ,0x01 ,0x01 ,0xA1 ,0x44 ,0x03 ,0x42 ,0x00
298- };
299- unsigned char * ptr = privkey ;
300- memcpy (ptr , begin , sizeof (begin )); ptr += sizeof (begin );
301- secp256k1_num_get_bin (ptr , 32 , key ); ptr += 32 ;
302- memcpy (ptr , middle , sizeof (middle )); ptr += sizeof (middle );
303- int pubkeylen = 0 ;
304- secp256k1_ecdsa_pubkey_serialize (& r , ptr , & pubkeylen , 0 ); ptr += pubkeylen ;
305- * privkeylen = ptr - privkey ;
306- }
307- return 1 ;
308- }
309-
310191#endif
0 commit comments