Blob ConvertFromBase58ShaSquare(RCString s) { BigInteger bi = 0; for (const char *p=s; *p; ++p) { if (const char *q = strchr(s_pszBase58, *p)) { bi = bi*58 + BigInteger(q-s_pszBase58); } else Throw(E_INVALIDARG); } vector<byte> v((bi.Length+7)/8); bi.ToBytes(&v[0], v.size()); if (v.size()>=2 && v.end()[-1]==0 && v.end()[-1]>=0x80) v.resize(v.size()-1); vector<byte> r; for (const char *p=s; *p==s_pszBase58[0]; ++p) r.push_back(0); r.resize(r.size()+v.size()); std::reverse_copy(v.begin(), v.end(), r.end()-v.size()); if (r.size() < 4) Throw(E_FAIL); SHA256 sha; HashValue hash = HashValue(sha.ComputeHash(sha.ComputeHash(ConstBuf(&r[0], r.size()-4)))); if (memcmp(hash.data(), &r.end()[-4], 4)) Throw(HRESULT_FROM_WIN32(ERROR_CRC)); return Blob(&r[0], r.size()-4); }
Blob ConvertFromBase58(RCString s, bool bCheckHash) { BigInteger bi = 0; for (const char *p=s; *p; ++p) { if (const char *q = strchr(s_pszBase58, *p)) { bi = bi*58 + BigInteger(q-s_pszBase58); } else Throw(errc::invalid_argument); } vector<byte> v((bi.Length+7)/8); bi.ToBytes(&v[0], v.size()); if (v.size()>=2 && v.end()[-1]==0 && v.end()[-1]>=0x80) v.resize(v.size()-1); vector<byte> r; for (const char *p=s; *p==s_pszBase58[0]; ++p) r.push_back(0); r.resize(r.size()+v.size()); std::reverse_copy(v.begin(), v.end(), r.end()-v.size()); if (r.size() < 4) Throw(E_FAIL); if (bCheckHash) { HashValue hash = HasherEng::GetCurrent()->HashForAddress(ConstBuf(&r[0], r.size()-4)); if (memcmp(hash.data(), &r.end()[-4], 4)) Throw(HRESULT_FROM_WIN32(ERROR_CRC)); } return Blob(&r[0], r.size()-4); }
OpensslBn::OpensslBn(const BigInteger& bn) { int n = (bn.Length+8)/8; byte *p = (byte*)alloca(n); bn.ToBytes(p, n); std::reverse(p, p+n); SslCheck(m_bn = ::BN_bin2bn(p, n, 0)); }