Skip to content

Commit e405aa4

Browse files
committed
boost: remove CPrivKey dependency from CECKey
This allows CECKey to be used without directly depending on the secure allocators
1 parent 5295506 commit e405aa4

File tree

1 file changed

+18
-15
lines changed

1 file changed

+18
-15
lines changed

src/key.cpp

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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) {
436434
CPrivKey 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

Comments
 (0)