|
|
@ -21,7 +21,7 @@ |
|
|
|
|
|
|
|
|
|
|
|
static const char* pszBase58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; |
|
|
|
static const char* pszBase58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Encode a byte sequence as a base58-encoded string
|
|
|
|
inline std::string EncodeBase58(const unsigned char* pbegin, const unsigned char* pend) |
|
|
|
inline std::string EncodeBase58(const unsigned char* pbegin, const unsigned char* pend) |
|
|
|
{ |
|
|
|
{ |
|
|
|
CAutoBN_CTX pctx; |
|
|
|
CAutoBN_CTX pctx; |
|
|
@ -62,11 +62,14 @@ inline std::string EncodeBase58(const unsigned char* pbegin, const unsigned char |
|
|
|
return str; |
|
|
|
return str; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Encode a byte vector as a base58-encoded string
|
|
|
|
inline std::string EncodeBase58(const std::vector<unsigned char>& vch) |
|
|
|
inline std::string EncodeBase58(const std::vector<unsigned char>& vch) |
|
|
|
{ |
|
|
|
{ |
|
|
|
return EncodeBase58(&vch[0], &vch[0] + vch.size()); |
|
|
|
return EncodeBase58(&vch[0], &vch[0] + vch.size()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Decode a base58-encoded string psz into byte vector vchRet
|
|
|
|
|
|
|
|
// returns true if decoding is succesful
|
|
|
|
inline bool DecodeBase58(const char* psz, std::vector<unsigned char>& vchRet) |
|
|
|
inline bool DecodeBase58(const char* psz, std::vector<unsigned char>& vchRet) |
|
|
|
{ |
|
|
|
{ |
|
|
|
CAutoBN_CTX pctx; |
|
|
|
CAutoBN_CTX pctx; |
|
|
@ -113,6 +116,8 @@ inline bool DecodeBase58(const char* psz, std::vector<unsigned char>& vchRet) |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Decode a base58-encoded string str into byte vector vchRet
|
|
|
|
|
|
|
|
// returns true if decoding is succesful
|
|
|
|
inline bool DecodeBase58(const std::string& str, std::vector<unsigned char>& vchRet) |
|
|
|
inline bool DecodeBase58(const std::string& str, std::vector<unsigned char>& vchRet) |
|
|
|
{ |
|
|
|
{ |
|
|
|
return DecodeBase58(str.c_str(), vchRet); |
|
|
|
return DecodeBase58(str.c_str(), vchRet); |
|
|
@ -121,7 +126,7 @@ inline bool DecodeBase58(const std::string& str, std::vector<unsigned char>& vch |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Encode a byte vector to a base58-encoded string, including checksum
|
|
|
|
inline std::string EncodeBase58Check(const std::vector<unsigned char>& vchIn) |
|
|
|
inline std::string EncodeBase58Check(const std::vector<unsigned char>& vchIn) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// add 4-byte hash check to the end
|
|
|
|
// add 4-byte hash check to the end
|
|
|
@ -131,6 +136,8 @@ inline std::string EncodeBase58Check(const std::vector<unsigned char>& vchIn) |
|
|
|
return EncodeBase58(vch); |
|
|
|
return EncodeBase58(vch); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Decode a base58-encoded string psz that includes a checksum, into byte vector vchRet
|
|
|
|
|
|
|
|
// returns true if decoding is succesful
|
|
|
|
inline bool DecodeBase58Check(const char* psz, std::vector<unsigned char>& vchRet) |
|
|
|
inline bool DecodeBase58Check(const char* psz, std::vector<unsigned char>& vchRet) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (!DecodeBase58(psz, vchRet)) |
|
|
|
if (!DecodeBase58(psz, vchRet)) |
|
|
@ -150,6 +157,8 @@ inline bool DecodeBase58Check(const char* psz, std::vector<unsigned char>& vchRe |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Decode a base58-encoded string str that includes a checksum, into byte vector vchRet
|
|
|
|
|
|
|
|
// returns true if decoding is succesful
|
|
|
|
inline bool DecodeBase58Check(const std::string& str, std::vector<unsigned char>& vchRet) |
|
|
|
inline bool DecodeBase58Check(const std::string& str, std::vector<unsigned char>& vchRet) |
|
|
|
{ |
|
|
|
{ |
|
|
|
return DecodeBase58Check(str.c_str(), vchRet); |
|
|
|
return DecodeBase58Check(str.c_str(), vchRet); |
|
|
@ -159,11 +168,14 @@ inline bool DecodeBase58Check(const std::string& str, std::vector<unsigned char> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Base class for all base58-encoded data
|
|
|
|
class CBase58Data |
|
|
|
class CBase58Data |
|
|
|
{ |
|
|
|
{ |
|
|
|
protected: |
|
|
|
protected: |
|
|
|
|
|
|
|
// the version byte
|
|
|
|
unsigned char nVersion; |
|
|
|
unsigned char nVersion; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// the actually encoded data
|
|
|
|
std::vector<unsigned char> vchData; |
|
|
|
std::vector<unsigned char> vchData; |
|
|
|
|
|
|
|
|
|
|
|
CBase58Data() |
|
|
|
CBase58Data() |
|
|
@ -174,6 +186,7 @@ protected: |
|
|
|
|
|
|
|
|
|
|
|
~CBase58Data() |
|
|
|
~CBase58Data() |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
// zero the memory, as it may contain sensitive data
|
|
|
|
if (!vchData.empty()) |
|
|
|
if (!vchData.empty()) |
|
|
|
memset(&vchData[0], 0, vchData.size()); |
|
|
|
memset(&vchData[0], 0, vchData.size()); |
|
|
|
} |
|
|
|
} |
|
|
@ -238,7 +251,9 @@ public: |
|
|
|
bool operator> (const CBase58Data& b58) const { return CompareTo(b58) > 0; } |
|
|
|
bool operator> (const CBase58Data& b58) const { return CompareTo(b58) > 0; } |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// base58-encoded bitcoin addresses
|
|
|
|
|
|
|
|
// Addresses have version 0 or 111 (testnet)
|
|
|
|
|
|
|
|
// The data vector contains RIPEMD160(SHA256(pubkey)), where pubkey is the serialized public key
|
|
|
|
class CBitcoinAddress : public CBase58Data |
|
|
|
class CBitcoinAddress : public CBase58Data |
|
|
|
{ |
|
|
|
{ |
|
|
|
public: |
|
|
|
public: |
|
|
|