Use proper secp API to compare generators in issuance validation

This commit is contained in:
Gregory Sanders 2018-12-27 15:10:06 -05:00
parent 2300bcf1b5
commit 67fa9497cf

View file

@ -757,7 +757,7 @@ bool VerifyAmounts(const CCoinsViewCache& cache, const CTransaction& tx, std::ve
vData.reserve((tx.vin.size() + tx.vout.size() + GetNumIssuances(tx))); vData.reserve((tx.vin.size() + tx.vout.size() + GetNumIssuances(tx)));
secp256k1_pedersen_commitment *p = vData.data(); secp256k1_pedersen_commitment *p = vData.data();
secp256k1_pedersen_commitment commit; secp256k1_pedersen_commitment commit;
secp256k1_generator gen, gencmp; secp256k1_generator gen;
// This is used to add in the explicit values // This is used to add in the explicit values
unsigned char explBlinds[32]; unsigned char explBlinds[32];
memset(explBlinds, 0, sizeof(explBlinds)); memset(explBlinds, 0, sizeof(explBlinds));
@ -847,13 +847,22 @@ bool VerifyAmounts(const CCoinsViewCache& cache, const CTransaction& tx, std::ve
// Must check that prevout is the blinded issuance token // Must check that prevout is the blinded issuance token
// prevout's asset tag = assetTokenID + assetBlindingNonce // prevout's asset tag = assetTokenID + assetBlindingNonce
if (secp256k1_generator_generate_blinded(secp256k1_ctx_verify_amounts, &gen, assetTokenID.begin(), issuance.assetBlindingNonce.begin()) != 1) {
return false;
}
// Serialize the generator for direct comparison
unsigned char derived_generator[33];
secp256k1_generator_serialize(secp256k1_ctx_verify_amounts, derived_generator, &gen);
if (secp256k1_generator_generate_blinded(secp256k1_ctx_verify_amounts, &gen, assetTokenID.begin(), issuance.assetBlindingNonce.begin()) != 1) // Belt-and-suspenders: Check that asset commitment from issuance input is correct size
if (asset.vchCommitment.size() != sizeof(derived_generator)) {
return false; return false;
if (secp256k1_generator_parse(secp256k1_ctx_verify_amounts, &gencmp, &asset.vchCommitment[0]) != 1) }
return false;
if (memcmp(&gen, &gencmp, 33)) // We have already checked the outputs' generator commitment for general validity, so directly compare serialized bytes
if (memcmp(asset.vchCommitment.data(), derived_generator, sizeof(derived_generator))) {
return false; return false;
}
} }
// Process issuance of asset // Process issuance of asset