@@ -179,19 +179,17 @@ class CECKey {
179179 BN_clear_free (&bn);
180180 }
181181
182- void GetPrivKey (CPrivKey &privkey, bool fCompressed ) {
182+ int GetPrivKeySize ( bool fCompressed ) {
183183 EC_KEY_set_conv_form (pkey, fCompressed ? POINT_CONVERSION_COMPRESSED : POINT_CONVERSION_UNCOMPRESSED);
184- int nSize = i2d_ECPrivateKey (pkey, NULL );
185- assert (nSize);
186- privkey.resize (nSize);
187- unsigned char * pbegin = &privkey[0 ];
188- int nSize2 = i2d_ECPrivateKey (pkey, &pbegin);
189- assert (nSize == nSize2);
184+ return i2d_ECPrivateKey (pkey, NULL );
185+ }
186+ int GetPrivKey (unsigned char * privkey, bool fCompressed ) {
187+ EC_KEY_set_conv_form (pkey, fCompressed ? POINT_CONVERSION_COMPRESSED : POINT_CONVERSION_UNCOMPRESSED);
188+ return i2d_ECPrivateKey (pkey, &privkey);
190189 }
191190
192- bool SetPrivKey (const CPrivKey &privkey, bool fSkipCheck =false ) {
193- const unsigned char * pbegin = &privkey[0 ];
194- if (d2i_ECPrivateKey (&pkey, &pbegin, privkey.size ())) {
191+ bool SetPrivKey (const unsigned char * privkey, size_t size, bool fSkipCheck =false ) {
192+ if (d2i_ECPrivateKey (&pkey, &privkey, size)) {
195193 if (fSkipCheck )
196194 return true ;
197195
@@ -424,7 +422,7 @@ bool CKey::SetPrivKey(const CPrivKey &privkey, bool fCompressedIn) {
424422 return false ;
425423#else
426424 CECKey key;
427- if (!key.SetPrivKey (privkey))
425+ if (!key.SetPrivKey (& privkey[ 0 ], privkey. size () ))
428426 return false ;
429427 key.GetSecretBytes (vch);
430428#endif
@@ -436,16 +434,21 @@ bool CKey::SetPrivKey(const CPrivKey &privkey, bool fCompressedIn) {
436434CPrivKey CKey::GetPrivKey () const {
437435 assert (fValid );
438436 CPrivKey privkey;
437+ int privkeylen, ret;
439438#ifdef USE_SECP256K1
440439 privkey.resize (279 );
441- int privkeylen = 279 ;
442- int ret = secp256k1_ecdsa_privkey_export (begin (), (unsigned char *)&privkey[0 ], &privkeylen, fCompressed );
440+ privkeylen = 279 ;
441+ ret = secp256k1_ecdsa_privkey_export (begin (), (unsigned char *)&privkey[0 ], &privkeylen, fCompressed );
443442 assert (ret);
444443 privkey.resize (privkeylen);
445444#else
446445 CECKey key;
447446 key.SetSecretBytes (vch);
448- key.GetPrivKey (privkey, fCompressed );
447+ privkeylen = key.GetPrivKeySize (fCompressed );
448+ assert (privkeylen);
449+ privkey.resize (privkeylen);
450+ ret = key.GetPrivKey (&privkey[0 ], fCompressed );
451+ assert (ret == (int )privkey.size ());
449452#endif
450453 return privkey;
451454}
@@ -517,7 +520,7 @@ bool CKey::Load(CPrivKey &privkey, CPubKey &vchPubKey, bool fSkipCheck=false) {
517520 return false ;
518521#else
519522 CECKey key;
520- if (!key.SetPrivKey (privkey, fSkipCheck ))
523+ if (!key.SetPrivKey (& privkey[ 0 ], privkey. size () , fSkipCheck ))
521524 return false ;
522525 key.GetSecretBytes (vch);
523526#endif
0 commit comments