bool b58check_enc(char *b58c, size_t *b58c_sz, uint8_t ver, const void *data, size_t datasz) { uint8_t buf[1 + datasz + 0x20]; uint8_t *hash = &buf[1 + datasz]; buf[0] = ver; memcpy(&buf[1], data, datasz); if (!my_dblsha256(hash, buf, datasz + 1)) { *b58c_sz = 0; return false; } return b58enc(b58c, b58c_sz, buf, 1 + datasz + 4); }
int base58_encode_check(const uint8_t *data, int datalen, char *str, int strsize) { if (datalen > 128) { return 0; } uint8_t buf[datalen + 32]; uint8_t *hash = buf + datalen; memcpy(buf, data, datalen); sha256_Raw(data, datalen, hash); sha256_Raw(hash, 32, hash); size_t res = strsize; bool success = b58enc(str, &res, buf, datalen + 4); MEMSET_BZERO(buf, sizeof(buf)); return success ? res : 0; }
int base58_encode_check(const uint8_t *data, int datalen, char *str, int strsize) { int ret; if (datalen > 128) { return 0; } uint8_t buf[datalen + 32]; uint8_t *hash = buf + datalen; memcpy(buf, data, datalen); sha256_Raw(data, datalen, hash); sha256_Raw(hash, 32, hash); size_t res = strsize; if (b58enc(str, &res, buf, datalen + 4) != true) { ret = 0; } else { ret = res; } utils_zero(buf, sizeof(buf)); return ret; }
ustring PubAddr::buildAddressFromKeys(ustring Skey, ustring Ekey, int stream, int version) { CryptoPP::SHA512 hash; byte digest[CryptoPP::SHA512::DIGESTSIZE]; byte digest1[CryptoPP::SHA512::DIGESTSIZE]; ustring buffer; if (Skey.size() == 64) { ustring tmp = Skey; Skey.clear(); Skey += 0x04; Skey += tmp; } if (Ekey.size() == 64) { ustring tmp = Ekey; Ekey.clear(); Ekey += 0x04; Ekey += tmp; } buffer += Skey; buffer += Ekey; hash.CalculateDigest(digest, (byte*)buffer.c_str(), buffer.length()); CryptoPP::RIPEMD160 hash2; byte digest2[CryptoPP::RIPEMD160::DIGESTSIZE]; hash2.CalculateDigest(digest2, digest, sizeof digest); ustring ripe; int i = 0; while (digest2[i] == 0x00) i++; while (i < sizeof digest2) { ripe += digest2[i]; i++; } ustring tmp; tmp.appendVarInt_B(version); tmp.appendVarInt_B(stream); tmp += ripe; //generate checksum hash.CalculateDigest(digest, (byte*)tmp.c_str(), tmp.length()); hash.CalculateDigest(digest1, digest, sizeof digest); tmp += digest1[0]; tmp += digest1[1]; tmp += digest1[2]; tmp += digest1[3]; //convert to base58 char * ret = new char[256]; size_t size = 256; if (!b58enc(ret, &size, tmp.c_str(), tmp.size())) { delete[] ret; throw runtime_error("cannot encode base58"); } ustring addr; addr.fromString(string("BM-")); addr.append((unsigned char*)ret, size-1); delete[] ret; return addr; }