Trivial: Fix Magic Numbers in key and pubkey - fixes #1968
This commit is contained in:
parent
e4dccd20ae
commit
c7a1b7c90c
|
@ -86,7 +86,7 @@ static int ec_privkey_export_der(const secp256k1_context *ctx, unsigned char *pr
|
|||
memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin);
|
||||
memcpy(ptr, key32, 32); ptr += 32;
|
||||
memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle);
|
||||
pubkeylen = 33;
|
||||
pubkeylen = CPubKey::COMPRESSED_SIZE;
|
||||
secp256k1_ec_pubkey_serialize(ctx, ptr, &pubkeylen, &pubkey, SECP256K1_EC_COMPRESSED);
|
||||
ptr += pubkeylen;
|
||||
*privkeylen = ptr - privkey;
|
||||
|
@ -111,7 +111,7 @@ static int ec_privkey_export_der(const secp256k1_context *ctx, unsigned char *pr
|
|||
memcpy(ptr, begin, sizeof(begin)); ptr += sizeof(begin);
|
||||
memcpy(ptr, key32, 32); ptr += 32;
|
||||
memcpy(ptr, middle, sizeof(middle)); ptr += sizeof(middle);
|
||||
pubkeylen = 65;
|
||||
pubkeylen = CPubKey::SIZE;
|
||||
secp256k1_ec_pubkey_serialize(ctx, ptr, &pubkeylen, &pubkey, SECP256K1_EC_UNCOMPRESSED);
|
||||
ptr += pubkeylen;
|
||||
*privkeylen = ptr - privkey;
|
||||
|
@ -155,7 +155,7 @@ CPrivKey CKey::GetPrivKey() const {
|
|||
CPubKey CKey::GetPubKey() const {
|
||||
assert(fValid);
|
||||
secp256k1_pubkey pubkey;
|
||||
size_t clen = 65;
|
||||
size_t clen = CPubKey::SIZE;
|
||||
CPubKey result;
|
||||
int ret = secp256k1_ec_pubkey_create(secp256k1_context_sign, &pubkey, begin());
|
||||
assert(ret);
|
||||
|
@ -227,7 +227,7 @@ bool CKey::Derive(CKey& keyChild, ChainCode &ccChild, unsigned int nChild, const
|
|||
std::vector<unsigned char, secure_allocator<unsigned char>> vout(64);
|
||||
if ((nChild >> 31) == 0) {
|
||||
CPubKey pubkey = GetPubKey();
|
||||
assert(pubkey.begin() + 33 == pubkey.end());
|
||||
assert(pubkey.begin() + CPubKey::COMPRESSED_SIZE == pubkey.end());
|
||||
BIP32Hash(cc, nChild, *pubkey.begin(), pubkey.begin()+1, vout.data());
|
||||
} else {
|
||||
assert(begin() + 32 == end());
|
||||
|
|
|
@ -185,7 +185,7 @@ bool CPubKey::Verify(const uint256 &hash, const std::vector<unsigned char>& vchS
|
|||
}
|
||||
|
||||
bool CPubKey::RecoverCompact(const uint256 &hash, const std::vector<unsigned char>& vchSig) {
|
||||
if (vchSig.size() != 65)
|
||||
if (vchSig.size() != CPubKey::SIZE)
|
||||
return false;
|
||||
int recid = (vchSig[0] - 27) & 3;
|
||||
bool fComp = ((vchSig[0] - 27) & 4) != 0;
|
||||
|
@ -197,8 +197,8 @@ bool CPubKey::RecoverCompact(const uint256 &hash, const std::vector<unsigned cha
|
|||
if (!secp256k1_ecdsa_recover(secp256k1_context_verify, &pubkey, &sig, hash.begin())) {
|
||||
return false;
|
||||
}
|
||||
unsigned char pub[65];
|
||||
size_t publen = 65;
|
||||
unsigned char pub[CPubKey::SIZE];
|
||||
size_t publen = CPubKey::SIZE;
|
||||
secp256k1_ec_pubkey_serialize(secp256k1_context_verify, pub, &publen, &pubkey, fComp ? SECP256K1_EC_COMPRESSED : SECP256K1_EC_UNCOMPRESSED);
|
||||
Set(pub, pub + publen);
|
||||
return true;
|
||||
|
@ -217,8 +217,8 @@ bool CPubKey::Compress() {
|
|||
secp256k1_pubkey pubkey;
|
||||
if (!secp256k1_ec_pubkey_parse(secp256k1_context_verify, &pubkey, &(*this)[0], size()))
|
||||
return false;
|
||||
unsigned char pub[33];
|
||||
size_t publen = 33;
|
||||
unsigned char pub[CPubKey::COMPRESSED_SIZE];
|
||||
size_t publen = CPubKey::COMPRESSED_SIZE;
|
||||
secp256k1_ec_pubkey_serialize(secp256k1_context_verify, pub, &publen, &pubkey, SECP256K1_EC_COMPRESSED);
|
||||
Set(pub, pub + publen);
|
||||
return true;
|
||||
|
@ -231,8 +231,8 @@ bool CPubKey::Decompress() {
|
|||
if (!secp256k1_ec_pubkey_parse(secp256k1_context_verify, &pubkey, &(*this)[0], size())) {
|
||||
return false;
|
||||
}
|
||||
unsigned char pub[65];
|
||||
size_t publen = 65;
|
||||
unsigned char pub[CPubKey::SIZE];
|
||||
size_t publen = CPubKey::SIZE;
|
||||
secp256k1_ec_pubkey_serialize(secp256k1_context_verify, pub, &publen, &pubkey, SECP256K1_EC_UNCOMPRESSED);
|
||||
Set(pub, pub + publen);
|
||||
return true;
|
||||
|
@ -241,7 +241,7 @@ bool CPubKey::Decompress() {
|
|||
bool CPubKey::Derive(CPubKey& pubkeyChild, ChainCode &ccChild, unsigned int nChild, const ChainCode& cc) const {
|
||||
assert(IsValid());
|
||||
assert((nChild >> 31) == 0);
|
||||
assert(begin() + 33 == end());
|
||||
assert(begin() + CPubKey::COMPRESSED_SIZE == end());
|
||||
unsigned char out[64];
|
||||
BIP32Hash(cc, nChild, *begin(), begin()+1, out);
|
||||
memcpy(ccChild.begin(), out+32, 32);
|
||||
|
@ -252,8 +252,8 @@ bool CPubKey::Derive(CPubKey& pubkeyChild, ChainCode &ccChild, unsigned int nChi
|
|||
if (!secp256k1_ec_pubkey_tweak_add(secp256k1_context_verify, &pubkey, out)) {
|
||||
return false;
|
||||
}
|
||||
unsigned char pub[33];
|
||||
size_t publen = 33;
|
||||
unsigned char pub[CPubKey::COMPRESSED_SIZE];
|
||||
size_t publen = CPubKey::COMPRESSED_SIZE;
|
||||
secp256k1_ec_pubkey_serialize(secp256k1_context_verify, pub, &publen, &pubkey, SECP256K1_EC_COMPRESSED);
|
||||
pubkeyChild.Set(pub, pub + publen);
|
||||
return true;
|
||||
|
@ -265,7 +265,7 @@ void CExtPubKey::Encode(unsigned char code[BIP32_EXTKEY_SIZE]) const {
|
|||
code[5] = (nChild >> 24) & 0xFF; code[6] = (nChild >> 16) & 0xFF;
|
||||
code[7] = (nChild >> 8) & 0xFF; code[8] = (nChild >> 0) & 0xFF;
|
||||
memcpy(code+9, chaincode.begin(), 32);
|
||||
assert(pubkey.size() == 33);
|
||||
assert(pubkey.size() == CPubKey::COMPRESSED_SIZE);
|
||||
memcpy(code+41, pubkey.begin(), 33);
|
||||
}
|
||||
|
||||
|
|
60
src/pubkey.h
60
src/pubkey.h
|
@ -38,32 +38,16 @@ typedef uint256 ChainCode;
|
|||
/** An encapsulated public key. */
|
||||
class CPubKey
|
||||
{
|
||||
private:
|
||||
|
||||
/**
|
||||
* Just store the serialized data.
|
||||
* Its length can very cheaply be computed from the first byte.
|
||||
*/
|
||||
unsigned char vch[65];
|
||||
|
||||
//! Compute the length of a pubkey with a given first byte.
|
||||
unsigned int static GetLen(unsigned char chHeader)
|
||||
{
|
||||
if (chHeader == 2 || chHeader == 3)
|
||||
return 33;
|
||||
if (chHeader == 4 || chHeader == 6 || chHeader == 7)
|
||||
return 65;
|
||||
return 0;
|
||||
}
|
||||
|
||||
//! Set this key data to be invalid
|
||||
void Invalidate()
|
||||
{
|
||||
vch[0] = 0xFF;
|
||||
}
|
||||
|
||||
public:
|
||||
//! Construct an invalid public key.
|
||||
|
||||
static constexpr unsigned int SIZE = 65;
|
||||
static constexpr unsigned int COMPRESSED_SIZE = 33;
|
||||
|
||||
bool static ValidSize(const std::vector<unsigned char> &vch) {
|
||||
return vch.size() > 0 && GetLen(vch[0]) == vch.size();
|
||||
}
|
||||
|
||||
CPubKey()
|
||||
{
|
||||
Invalidate();
|
||||
|
@ -127,7 +111,7 @@ public:
|
|||
void Unserialize(Stream& s)
|
||||
{
|
||||
unsigned int len = ::ReadCompactSize(s);
|
||||
if (len <= 65) {
|
||||
if (len <= SIZE) {
|
||||
s.read((char*)vch, len);
|
||||
} else {
|
||||
// invalid pubkey, skip available data
|
||||
|
@ -191,6 +175,32 @@ public:
|
|||
|
||||
//! Derive BIP32 child pubkey.
|
||||
bool Derive(CPubKey& pubkeyChild, ChainCode &ccChild, unsigned int nChild, const ChainCode& cc) const;
|
||||
|
||||
private:
|
||||
|
||||
/**
|
||||
* Just store the serialized data.
|
||||
* Its length can very cheaply be computed from the first byte.
|
||||
*/
|
||||
unsigned char vch[SIZE];
|
||||
|
||||
//! Compute the length of a pubkey with a given first byte.
|
||||
unsigned int static GetLen(unsigned char chHeader)
|
||||
{
|
||||
if (chHeader == 2 || chHeader == 3)
|
||||
return CPubKey::COMPRESSED_SIZE;
|
||||
if (chHeader == 4 || chHeader == 6 || chHeader == 7)
|
||||
return CPubKey::SIZE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
//! Set this key data to be invalid
|
||||
void Invalidate()
|
||||
{
|
||||
vch[0] = 0xFF;
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
struct CExtPubKey {
|
||||
|
|
Loading…
Reference in New Issue