void test_base58check() { const char** raw = base58_vector; const char** str = base58_vector + 1; uint8_t rawn[96]; char strn[53]; while (*raw && *str) { size_t len = strlen(*raw) / 2; memcpy(rawn, utils_hex_to_uint8(*raw), len); int r = btc_base58_encode_check(rawn, len, strn, sizeof(strn)); assert(r == (int)strlen(*str) + 1); assert(strcmp(strn, *str) == 0); r = btc_base58_decode_check(strn, rawn, sizeof(rawn)); assert(r == (int)len + 4); raw += 2; str += 2; } const char** i_cmd = base58_invalid_vector; const char** i_raw = base58_invalid_vector + 1; uint8_t i_rawn[2048]; while (*i_raw && *i_cmd) { size_t len = strlen(*i_raw) / 2; memcpy(i_rawn, utils_hex_to_uint8(*i_raw), len); unsigned char outbuf[1024]; int r = 0; if (strncmp(*i_cmd, "ec", 2) == 0) r = btc_base58_encode_check(i_rawn, len, strn, sizeof(strn)); else r = btc_base58_decode_check(*i_raw, outbuf, sizeof(outbuf)); assert(r == 0); i_raw += 2; i_cmd += 2; } }
const std::string DBBComServer::getAESKeyBase58() { std::string aesKeyBase58; aesKeyBase58.resize(100); uint8_t hash[33]; hash[0] = AES_KEY_BASE57_PREFIX; assert(encryptionKey.size() > 0); std::string base64dec = base64_encode(&encryptionKey[0], encryptionKey.size()); return base64dec; hmac_sha256((const uint8_t *)aesKeyHMAC_Key, strlen(aesKeyHMAC_Key), &encryptionKey[0], encryptionKey.size(), hash); btc_hash(&encryptionKey[0], encryptionKey.size(), hash); int sizeOut = btc_base58_encode_check(hash, 33, &aesKeyBase58[0], aesKeyBase58.size()); aesKeyBase58.resize(sizeOut-1); return aesKeyBase58; }
bool DBBComServer::generateNewKey() { // generate new private key btc_key key; btc_privkey_init(&key); btc_privkey_gen(&key); assert(btc_privkey_is_valid(&key) == 1); // derive pubkey btc_pubkey pubkey; btc_pubkey_init(&pubkey); btc_pubkey_from_key(&key, &pubkey); assert(btc_pubkey_is_valid(&pubkey) == 1); // remove the current enc key encryptionKey.clear(); // copy over the privatekey and clean libbtc privkey std::copy(key.privkey,key.privkey+BTC_ECKEY_PKEY_LENGTH,std::back_inserter(encryptionKey)); btc_privkey_cleanse(&key); // generate hash160(hash(pubkey)) // create base58c string with 0x91 as base58 identifier size_t len = 67; uint8_t hashout[32]; uint8_t hash160[21]; hash160[0] = CHANNEL_ID_BASE58_PREFIX; btc_hash_sngl_sha256(pubkey.pubkey, BTC_ECKEY_COMPRESSED_LENGTH, hashout); ripemd160(hashout, 32, hash160+1); // make enought space for the base58c channel ID channelID.resize(100); int sizeOut = btc_base58_encode_check(hash160, 21, &channelID[0], channelID.size()); channelID.resize(sizeOut-1); return true; }