1515#include < vector>
1616
1717
18- /* *
18+ /* *
1919 * secp256k1:
2020 * const unsigned int PRIVATE_KEY_SIZE = 279;
2121 * const unsigned int PUBLIC_KEY_SIZE = 65;
@@ -45,6 +45,8 @@ class CKey
4545 // ! The actual byte data
4646 unsigned char vch[32 ];
4747
48+ static_assert (sizeof (vch) == 32 , " vch must be 32 bytes in length to not break serialization" );
49+
4850 // ! Check whether the 32-byte array pointed to be vch is valid keydata.
4951 bool static Check (const unsigned char * vch);
5052
@@ -70,20 +72,19 @@ class CKey
7072
7173 friend bool operator ==(const CKey& a, const CKey& b)
7274 {
73- return a.fCompressed == b.fCompressed && a.size () == b.size () &&
74- memcmp (&a.vch [0 ], &b.vch [0 ], a.size ()) == 0 ;
75+ return a.fCompressed == b.fCompressed &&
76+ a.size () == b.size () &&
77+ memcmp (&a.vch [0 ], &b.vch [0 ], a.size ()) == 0 ;
7578 }
7679
7780 // ! Initialize using begin and end iterators to byte data.
7881 template <typename T>
7982 void Set (const T pbegin, const T pend, bool fCompressedIn )
8083 {
81- if (pend - pbegin != 32 ) {
84+ if (pend - pbegin != sizeof (vch) ) {
8285 fValid = false ;
83- return ;
84- }
85- if (Check (&pbegin[0 ])) {
86- memcpy (vch, (unsigned char *)&pbegin[0 ], 32 );
86+ } else if (Check (&pbegin[0 ])) {
87+ memcpy (vch, (unsigned char *)&pbegin[0 ], sizeof (vch));
8788 fValid = true ;
8889 fCompressed = fCompressedIn ;
8990 } else {
@@ -92,7 +93,7 @@ class CKey
9293 }
9394
9495 // ! Simple read-only vector-like interface.
95- unsigned int size () const { return (fValid ? 32 : 0 ); }
96+ unsigned int size () const { return (fValid ? sizeof (vch) : 0 ); }
9697 const unsigned char * begin () const { return vch; }
9798 const unsigned char * end () const { return vch + size (); }
9899
@@ -110,7 +111,7 @@ class CKey
110111
111112 /* *
112113 * Convert the private key to a CPrivKey (serialized OpenSSL private key data).
113- * This is expensive.
114+ * This is expensive.
114115 */
115116 CPrivKey GetPrivKey () const ;
116117
@@ -160,8 +161,11 @@ struct CExtKey {
160161
161162 friend bool operator ==(const CExtKey& a, const CExtKey& b)
162163 {
163- return a.nDepth == b.nDepth && memcmp (&a.vchFingerprint [0 ], &b.vchFingerprint [0 ], 4 ) == 0 && a.nChild == b.nChild &&
164- a.chaincode == b.chaincode && a.key == b.key ;
164+ return a.nDepth == b.nDepth &&
165+ memcmp (&a.vchFingerprint [0 ], &b.vchFingerprint [0 ], sizeof (vchFingerprint)) == 0 &&
166+ a.nChild == b.nChild &&
167+ a.chaincode == b.chaincode &&
168+ a.key == b.key ;
165169 }
166170
167171 void Encode (unsigned char code[BIP32_EXTKEY_SIZE]) const ;
0 commit comments