@ -11,6 +11,8 @@
# include <assert.h>
# include <assert.h>
# include <string.h>
# include <string.h>
# include <limits>
/** All alphanumeric characters except for "0", "I", "O", and "l" */
/** All alphanumeric characters except for "0", "I", "O", and "l" */
static const char * pszBase58 = " 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz " ;
static const char * pszBase58 = " 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz " ;
static const int8_t mapBase58 [ 256 ] = {
static const int8_t mapBase58 [ 256 ] = {
@ -32,7 +34,7 @@ static const int8_t mapBase58[256] = {
- 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 ,
- 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 ,
} ;
} ;
bool DecodeBase58 ( const char * psz , std : : vector < unsigned char > & vch )
bool DecodeBase58 ( const char * psz , std : : vector < unsigned char > & vch , int max_ret_len )
{
{
// Skip leading spaces.
// Skip leading spaces.
while ( * psz & & IsSpace ( * psz ) )
while ( * psz & & IsSpace ( * psz ) )
@ -42,6 +44,7 @@ bool DecodeBase58(const char* psz, std::vector<unsigned char>& vch)
int length = 0 ;
int length = 0 ;
while ( * psz = = ' 1 ' ) {
while ( * psz = = ' 1 ' ) {
zeroes + + ;
zeroes + + ;
if ( zeroes > max_ret_len ) return false ;
psz + + ;
psz + + ;
}
}
// Allocate enough space in big-endian base256 representation.
// Allocate enough space in big-endian base256 representation.
@ -62,6 +65,7 @@ bool DecodeBase58(const char* psz, std::vector<unsigned char>& vch)
}
}
assert ( carry = = 0 ) ;
assert ( carry = = 0 ) ;
length = i ;
length = i ;
if ( length + zeroes > max_ret_len ) return false ;
psz + + ;
psz + + ;
}
}
// Skip trailing spaces.
// Skip trailing spaces.
@ -71,8 +75,6 @@ bool DecodeBase58(const char* psz, std::vector<unsigned char>& vch)
return false ;
return false ;
// Skip leading zeroes in b256.
// Skip leading zeroes in b256.
std : : vector < unsigned char > : : iterator it = b256 . begin ( ) + ( size - length ) ;
std : : vector < unsigned char > : : iterator it = b256 . begin ( ) + ( size - length ) ;
while ( it ! = b256 . end ( ) & & * it = = 0 )
it + + ;
// Copy result into output vector.
// Copy result into output vector.
vch . reserve ( zeroes + ( b256 . end ( ) - it ) ) ;
vch . reserve ( zeroes + ( b256 . end ( ) - it ) ) ;
vch . assign ( zeroes , 0x00 ) ;
vch . assign ( zeroes , 0x00 ) ;
@ -126,9 +128,9 @@ std::string EncodeBase58(const std::vector<unsigned char>& vch)
return EncodeBase58 ( vch . data ( ) , vch . data ( ) + vch . size ( ) ) ;
return EncodeBase58 ( vch . data ( ) , vch . data ( ) + vch . size ( ) ) ;
}
}
bool DecodeBase58 ( const std : : string & str , std : : vector < unsigned char > & vchRet )
bool DecodeBase58 ( const std : : string & str , std : : vector < unsigned char > & vchRet , int max_ret_len )
{
{
return DecodeBase58 ( str . c_str ( ) , vchRet );
return DecodeBase58 ( str . c_str ( ) , vchRet , max_ret_len );
}
}
std : : string EncodeBase58Check ( const std : : vector < unsigned char > & vchIn )
std : : string EncodeBase58Check ( const std : : vector < unsigned char > & vchIn )
@ -140,9 +142,9 @@ std::string EncodeBase58Check(const std::vector<unsigned char>& vchIn)
return EncodeBase58 ( vch ) ;
return EncodeBase58 ( vch ) ;
}
}
bool DecodeBase58Check ( const char * psz , std : : vector < unsigned char > & vchRet )
bool DecodeBase58Check ( const char * psz , std : : vector < unsigned char > & vchRet , int max_ret_len )
{
{
if ( ! DecodeBase58 ( psz , vchRet ) | |
if ( ! DecodeBase58 ( psz , vchRet , max_ret_len > std : : numeric_limits < int > : : max ( ) - 4 ? std : : numeric_limits < int > : : max ( ) : max_ret_len + 4 ) | |
( vchRet . size ( ) < 4 ) ) {
( vchRet . size ( ) < 4 ) ) {
vchRet . clear ( ) ;
vchRet . clear ( ) ;
return false ;
return false ;
@ -157,7 +159,7 @@ bool DecodeBase58Check(const char* psz, std::vector<unsigned char>& vchRet)
return true ;
return true ;
}
}
bool DecodeBase58Check ( const std : : string & str , std : : vector < unsigned char > & vchRet )
bool DecodeBase58Check ( const std : : string & str , std : : vector < unsigned char > & vchRet , int max_ret )
{
{
return DecodeBase58Check ( str . c_str ( ) , vchRet );
return DecodeBase58Check ( str . c_str ( ) , vchRet , max_ret );
}
}