fix fingerprint encoding

This commit is contained in:
ssadler
2020-04-27 16:10:30 -03:00
committed by Duke Leto
parent 095157d2d9
commit 2324e8ca4b
3 changed files with 35 additions and 8 deletions

View File

@@ -117,14 +117,15 @@ uint32_t fromAsnSubtypes(const ConditionTypes_t types) {
size_t cc_conditionBinary(const CC *cond, unsigned char *buf) {
Condition_t *asn = calloc(1, sizeof(Condition_t));
asnCondition(cond, asn);
bool r = asnCondition(cond, asn);
size_t out = 0;
if (!r) goto end;
asn_enc_rval_t rc = der_encode_to_buffer(&asn_DEF_Condition, asn, buf, 1000);
if (rc.encoded == -1) {
fprintf(stderr, "CONDITION NOT ENCODED\n");
return 0;
}
if (rc.encoded == -1) goto end;
out = rc.encoded;
end:
ASN_STRUCT_FREE(asn_DEF_Condition, asn);
return rc.encoded;
return out;
}
@@ -140,17 +141,22 @@ size_t cc_fulfillmentBinary(const CC *cond, unsigned char *buf, size_t length) {
}
void asnCondition(const CC *cond, Condition_t *asn) {
bool asnCondition(const CC *cond, Condition_t *asn) {
asn->present = cc_isAnon(cond) ? cond->conditionType->asnType : cond->type->asnType;
// This may look a little weird - we dont have a reference here to the correct
// union choice for the condition type, so we just assign everything to the threshold
// type. This works out nicely since the union choices have the same binary interface.
CompoundSha256Condition_t *choice = &asn->choice.thresholdSha256;
choice->cost = cc_getCost(cond);
choice->fingerprint.buf = cond->type->fingerprint(cond);
if (choice->fingerprint.buf == 0) {
return 0;
}
choice->fingerprint.size = 32;
choice->subtypes = asnSubtypes(cond->type->getSubtypes(cond));
return 1;
}

View File

@@ -65,7 +65,7 @@ extern int CCTypeRegistryLength;
*/
uint32_t fromAsnSubtypes(ConditionTypes_t types);
CC *mkAnon(const Condition_t *asnCond);
void asnCondition(const CC *cond, Condition_t *asn);
bool asnCondition(const CC *cond, Condition_t *asn);
Condition_t *asnConditionNew(const CC *cond);
Fulfillment_t *asnFulfillmentNew(const CC *cond);
struct CC *fulfillmentToCC(Fulfillment_t *ffill);

View File

@@ -82,4 +82,25 @@ def test_malleability_checked():
assert not cc_rfb(b'\xa2\x13\xa0\x0f\xa0\x06\x80\x04abcd\xa0\x05\x80\x03abc\xa1\x00')
def test_large_threshold():
conds = [{
'type': "secp256k1-sha-256",
"publicKey": "02D5D969305535AC29A77079C11D4F0DD40661CF96E04E974A5E8D7E374EE225AA"
}]
for i in range(250):
conds.append({
"type": "eval-sha-256",
"code": "VEVTVAE"
})
r = jsonRPC("encodeCondition", {
"type": "threshold-sha-256",
"subfulfillments": conds,
"threshold": 251
})
assert 'error' not in r, r
so.cc_conditionUri.restype = ctypes.c_char_p