@@ -73,12 +73,11 @@ static SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_import_der(
7373 size_t privkeylen
7474) SECP256K1_ARG_NONNULL (1 ) SECP256K1_ARG_NONNULL (2 ) SECP256K1_ARG_NONNULL (3 );
7575
76- static int secp256k1_eckey_privkey_parse (secp256k1_scalar * key , const unsigned char * privkey , size_t privkeylen ) {
77- unsigned char c [32 ] = {0 };
76+ static int secp256k1_ec_privkey_import_der (const secp256k1_context * ctx , unsigned char * out32 , const unsigned char * privkey , size_t privkeylen ) {
7877 const unsigned char * end = privkey + privkeylen ;
7978 int lenb = 0 ;
8079 int len = 0 ;
81- int overflow = 0 ;
80+ memset ( out32 , 0 , 32 ) ;
8281 /* sequence header */
8382 if (end < privkey + 1 || * privkey != 0x30 ) {
8483 return 0 ;
@@ -110,18 +109,21 @@ static int secp256k1_eckey_privkey_parse(secp256k1_scalar *key, const unsigned c
110109 if (end < privkey + 2 || privkey [0 ] != 0x04 || privkey [1 ] > 0x20 || end < privkey + 2 + privkey [1 ]) {
111110 return 0 ;
112111 }
113- memcpy (c + 32 - privkey [1 ], privkey + 2 , privkey [1 ]);
114- secp256k1_scalar_set_b32 (key , c , & overflow );
115- memset (c , 0 , 32 );
116- return !overflow ;
112+ memcpy (out32 + 32 - privkey [1 ], privkey + 2 , privkey [1 ]);
113+ if (!secp256k1_ec_seckey_verify (ctx , out32 )) {
114+ memset (out32 , 0 , 32 );
115+ return 0 ;
116+ }
117+ return 1 ;
117118}
118119
119- static int secp256k1_eckey_privkey_serialize (const secp256k1_ecmult_gen_context * ctx , unsigned char * privkey , size_t * privkeylen , const secp256k1_scalar * key , int compressed ) {
120- secp256k1_gej rp ;
121- secp256k1_ge r ;
120+ static int secp256k1_ec_privkey_export_der (const secp256k1_context * ctx , unsigned char * privkey , size_t * privkeylen , const unsigned char * key32 , int compressed ) {
121+ secp256k1_pubkey pubkey ;
122122 size_t pubkeylen = 0 ;
123- secp256k1_ecmult_gen (ctx , & rp , key );
124- secp256k1_ge_set_gej (& r , & rp );
123+ if (!secp256k1_ec_pubkey_create (ctx , & pubkey , key32 )) {
124+ * privkeylen = 0 ;
125+ return 0 ;
126+ }
125127 if (compressed ) {
126128 static const unsigned char begin [] = {
127129 0x30 ,0x81 ,0xD3 ,0x02 ,0x01 ,0x01 ,0x04 ,0x20
@@ -139,11 +141,9 @@ static int secp256k1_eckey_privkey_serialize(const secp256k1_ecmult_gen_context
139141 };
140142 unsigned char * ptr = privkey ;
141143 memcpy (ptr , begin , sizeof (begin )); ptr += sizeof (begin );
142- secp256k1_scalar_get_b32 (ptr , key ); ptr += 32 ;
144+ memcpy (ptr , key32 , 32 ); ptr += 32 ;
143145 memcpy (ptr , middle , sizeof (middle )); ptr += sizeof (middle );
144- if (!secp256k1_eckey_pubkey_serialize (& r , ptr , & pubkeylen , 1 )) {
145- return 0 ;
146- }
146+ secp256k1_ec_pubkey_serialize (ctx , ptr , & pubkeylen , & pubkey , SECP256K1_EC_COMPRESSED );
147147 ptr += pubkeylen ;
148148 * privkeylen = ptr - privkey ;
149149 } else {
@@ -165,45 +165,13 @@ static int secp256k1_eckey_privkey_serialize(const secp256k1_ecmult_gen_context
165165 };
166166 unsigned char * ptr = privkey ;
167167 memcpy (ptr , begin , sizeof (begin )); ptr += sizeof (begin );
168- secp256k1_scalar_get_b32 (ptr , key ); ptr += 32 ;
168+ memcpy (ptr , key32 , 32 ); ptr += 32 ;
169169 memcpy (ptr , middle , sizeof (middle )); ptr += sizeof (middle );
170- if (!secp256k1_eckey_pubkey_serialize (& r , ptr , & pubkeylen , 0 )) {
171- return 0 ;
172- }
170+ secp256k1_ec_pubkey_serialize (ctx , ptr , & pubkeylen , & pubkey , SECP256K1_EC_UNCOMPRESSED );
173171 ptr += pubkeylen ;
174172 * privkeylen = ptr - privkey ;
175173 }
176174 return 1 ;
177175}
178176
179- static int secp256k1_ec_privkey_export_der (const secp256k1_context * ctx , unsigned char * privkey , size_t * privkeylen , const unsigned char * seckey , int compressed ) {
180- secp256k1_scalar key ;
181- int ret = 0 ;
182- VERIFY_CHECK (ctx != NULL );
183- ARG_CHECK (seckey != NULL );
184- ARG_CHECK (privkey != NULL );
185- ARG_CHECK (privkeylen != NULL );
186- ARG_CHECK (secp256k1_ecmult_gen_context_is_built (& ctx -> ecmult_gen_ctx ));
187-
188- secp256k1_scalar_set_b32 (& key , seckey , NULL );
189- ret = secp256k1_eckey_privkey_serialize (& ctx -> ecmult_gen_ctx , privkey , privkeylen , & key , compressed );
190- secp256k1_scalar_clear (& key );
191- return ret ;
192- }
193-
194- static int secp256k1_ec_privkey_import_der (const secp256k1_context * ctx , unsigned char * seckey , const unsigned char * privkey , size_t privkeylen ) {
195- secp256k1_scalar key ;
196- int ret = 0 ;
197- ARG_CHECK (seckey != NULL );
198- ARG_CHECK (privkey != NULL );
199- (void )ctx ;
200-
201- ret = secp256k1_eckey_privkey_parse (& key , privkey , privkeylen );
202- if (ret ) {
203- secp256k1_scalar_get_b32 (seckey , & key );
204- }
205- secp256k1_scalar_clear (& key );
206- return ret ;
207- }
208-
209177#endif
0 commit comments