Exemple #1
0
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;
}