mirror of
https://github.com/ElementsProject/elements.git
synced 2026-08-17 13:07:54 +02:00
Use proper secp API to compare generators in issuance validation
This commit is contained in:
parent
2300bcf1b5
commit
67fa9497cf
1 changed files with 14 additions and 5 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue