void test_ecc() { unsigned char r_buf[32]; memset(r_buf, 0, 32); random_init(); while (btc_ecc_verify_privatekey(r_buf) == 0) { random_bytes(r_buf, 32, 0); } memset(r_buf, 0xFF, 32); u_assert_int_eq(btc_ecc_verify_privatekey(r_buf), 0); //secp256k1 overflow uint8_t pub_key33[33], pub_key33_invalid[33], pub_key65[65], pub_key65_invalid[65]; memcpy(pub_key33, utils_hex_to_uint8("02fcba7ecf41bc7e1be4ee122d9d22e3333671eb0a3a87b5cdf099d59874e1940f"), 33); memcpy(pub_key33_invalid, utils_hex_to_uint8("999999999941bc7e1be4ee122d9d22e3333671eb0a3a87b5cdf099d59874e1940f"), 33); memcpy(pub_key65, utils_hex_to_uint8("044054fd18aeb277aeedea01d3f3986ff4e5be18092a04339dcf4e524e2c0a09746c7083ed2097011b1223a17a644e81f59aa3de22dac119fd980b36a8ff29a244"), 65); memcpy(pub_key65_invalid, utils_hex_to_uint8("044054fd18aeb277aeedea01d3f3986ff4e5be18092a04339dcf4e524e2c0a09746c7083ed2097011b1223a17a644e81f59aa3de22dac119fd980b39999f29a244"), 65); u_assert_int_eq(btc_ecc_verify_pubkey(pub_key33, 1), 1); u_assert_int_eq(btc_ecc_verify_pubkey(pub_key65, 0), 1); u_assert_int_eq(btc_ecc_verify_pubkey(pub_key33_invalid, 1), 0); u_assert_int_eq(btc_ecc_verify_pubkey(pub_key65_invalid, 0), 0); btc_key key; btc_privkey_init(&key); assert(btc_privkey_is_valid(&key) == 0); btc_privkey_gen(&key); uint8_t* hash = utils_hex_to_uint8((const char*)"26db47a48a10b9b0b697b793f5c0231aa35fe192c9d063d7b03a55e3c302850a"); unsigned char sig[74]; size_t outlen = 74; btc_key_sign_hash(&key, hash, sig, &outlen); uint8_t sigcomp[64]; unsigned char sigder[74]; size_t sigderlen = 74; u_assert_int_eq(btc_ecc_der_to_compact(sig, outlen, sigcomp), true); u_assert_int_eq(btc_ecc_compact_to_der_normalized(sigcomp, sigder, &sigderlen), true); u_assert_int_eq(outlen, sigderlen); u_assert_int_eq(memcmp(sig,sigder,sigderlen), 0); }
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; }