cryptoconditions functions to create conditions
This commit is contained in:
@@ -26,7 +26,6 @@ enum CCTypeId {
|
||||
};
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Evaliliary verification callback
|
||||
*/
|
||||
@@ -88,6 +87,7 @@ struct CC* cc_conditionFromJSON(cJSON *params, char *err);
|
||||
struct CC* cc_conditionFromJSONString(const char *json, char *err);
|
||||
struct CC* cc_readConditionBinary(const unsigned char *cond_bin, size_t cond_bin_len);
|
||||
struct CC* cc_readFulfillmentBinary(const unsigned char *ffill_bin, size_t ffill_bin_len);
|
||||
struct CC* cc_new(int typeId);
|
||||
struct cJSON* cc_conditionToJSON(const CC *cond);
|
||||
char* cc_conditionToJSONString(const CC *cond);
|
||||
char* cc_conditionUri(const CC *cond);
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#include "cryptoconditions.h"
|
||||
|
||||
|
||||
struct CCType cc_anonType;
|
||||
struct CCType CC_AnonType;
|
||||
|
||||
|
||||
static CC *mkAnon(const Condition_t *asnCond) {
|
||||
@@ -18,7 +18,7 @@ static CC *mkAnon(const Condition_t *asnCond) {
|
||||
return 0;
|
||||
}
|
||||
CC *cond = calloc(1, sizeof(CC));
|
||||
cond->type = &cc_anonType;
|
||||
cond->type = &CC_AnonType;
|
||||
cond->conditionType = realType;
|
||||
const CompoundSha256Condition_t *deets = &asnCond->choice.thresholdSha256;
|
||||
memcpy(cond->fingerprint, deets->fingerprint.buf, 32);
|
||||
@@ -71,4 +71,4 @@ static int anonIsFulfilled(const CC *cond) {
|
||||
}
|
||||
|
||||
|
||||
struct CCType cc_anonType = { -1, "(anon)", Condition_PR_NOTHING, NULL, &anonFingerprint, &anonCost, &anonSubtypes, NULL, &anonToJSON, NULL, &anonFulfillment, &anonIsFulfilled, &anonFree };
|
||||
struct CCType CC_AnonType = { -1, "(anon)", Condition_PR_NOTHING, NULL, &anonFingerprint, &anonCost, &anonSubtypes, NULL, &anonToJSON, NULL, &anonFulfillment, &anonIsFulfilled, &anonFree };
|
||||
|
||||
@@ -17,14 +17,14 @@
|
||||
|
||||
|
||||
struct CCType *CCTypeRegistry[] = {
|
||||
&cc_preimageType,
|
||||
&cc_prefixType,
|
||||
&cc_thresholdType,
|
||||
NULL, /* &cc_rsaType */
|
||||
&cc_ed25519Type,
|
||||
&cc_secp256k1Type,
|
||||
&CC_PreimageType,
|
||||
&CC_PrefixType,
|
||||
&CC_ThresholdType,
|
||||
NULL, /* &CC_rsaType */
|
||||
&CC_Ed25519Type,
|
||||
&CC_Secp256k1Type,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 6-14 unused */
|
||||
&cc_evalType
|
||||
&CC_EvalType
|
||||
};
|
||||
|
||||
|
||||
@@ -281,6 +281,12 @@ char *cc_typeName(const CC *cond) {
|
||||
return cc_isAnon(cond) ? cond->conditionType->name : cond->type->name;
|
||||
}
|
||||
|
||||
CC *cc_new(int typeId) {
|
||||
CC *cond = malloc(sizeof(CC*));
|
||||
cond->type = CCTypeRegistry[type];
|
||||
return cond;
|
||||
}
|
||||
|
||||
|
||||
void cc_free(CC *cond) {
|
||||
if (cond)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#include "cryptoconditions.h"
|
||||
|
||||
|
||||
struct CCType cc_ed25519Type;
|
||||
struct CCType CC_Ed25519Type;
|
||||
|
||||
|
||||
static unsigned char *ed25519Fingerprint(const CC *cond) {
|
||||
@@ -18,7 +18,7 @@ static unsigned char *ed25519Fingerprint(const CC *cond) {
|
||||
|
||||
|
||||
int ed25519Verify(CC *cond, CCVisitor visitor) {
|
||||
if (cond->type->typeId != cc_ed25519Type.typeId) return 1;
|
||||
if (cond->type->typeId != CC_Ed25519Type.typeId) return 1;
|
||||
// TODO: test failure mode: empty sig / null pointer
|
||||
return ed25519_verify(cond->signature, visitor.msg, visitor.msgLength, cond->publicKey);
|
||||
}
|
||||
@@ -44,7 +44,7 @@ typedef struct CCEd25519SigningData {
|
||||
* Visitor that signs an ed25519 condition if it has a matching public key
|
||||
*/
|
||||
static int ed25519Sign(CC *cond, CCVisitor visitor) {
|
||||
if (cond->type->typeId != cc_ed25519Type.typeId) return 1;
|
||||
if (cond->type->typeId != CC_Ed25519Type.typeId) return 1;
|
||||
CCEd25519SigningData *signing = (CCEd25519SigningData*) visitor.context;
|
||||
if (0 != memcmp(cond->publicKey, signing->pk, 32)) return 1;
|
||||
if (!cond->signature) cond->signature = malloc(64);
|
||||
@@ -105,7 +105,7 @@ static CC *ed25519FromJSON(const cJSON *params, unsigned char *err) {
|
||||
}
|
||||
|
||||
CC *cond = calloc(1, sizeof(CC));
|
||||
cond->type = &cc_ed25519Type;
|
||||
cond->type = &CC_Ed25519Type;
|
||||
cond->publicKey = pk;
|
||||
cond->signature = sig;
|
||||
return cond;
|
||||
@@ -126,7 +126,7 @@ static void ed25519ToJSON(const CC *cond, cJSON *params) {
|
||||
|
||||
static CC *ed25519FromFulfillment(const Fulfillment_t *ffill) {
|
||||
CC *cond = calloc(1, sizeof(CC));
|
||||
cond->type = &cc_ed25519Type;
|
||||
cond->type = &CC_Ed25519Type;
|
||||
cond->publicKey = malloc(32);
|
||||
memcpy(cond->publicKey, ffill->choice.ed25519Sha256.publicKey.buf, 32);
|
||||
cond->signature = malloc(64);
|
||||
@@ -166,4 +166,4 @@ static uint32_t ed25519Subtypes(const CC *cond) {
|
||||
}
|
||||
|
||||
|
||||
struct CCType cc_ed25519Type = { 4, "ed25519-sha-256", Condition_PR_ed25519Sha256, 0, &ed25519Fingerprint, &ed25519Cost, &ed25519Subtypes, &ed25519FromJSON, &ed25519ToJSON, &ed25519FromFulfillment, &ed25519ToFulfillment, &ed25519IsFulfilled, &ed25519Free };
|
||||
struct CCType CC_Ed25519Type = { 4, "ed25519-sha-256", Condition_PR_ed25519Sha256, 0, &ed25519Fingerprint, &ed25519Cost, &ed25519Subtypes, &ed25519FromJSON, &ed25519ToJSON, &ed25519FromFulfillment, &ed25519ToFulfillment, &ed25519IsFulfilled, &ed25519Free };
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#include "include/cJSON.h"
|
||||
|
||||
|
||||
struct CCType cc_evalType;
|
||||
struct CCType CC_EvalType;
|
||||
|
||||
|
||||
static unsigned char *evalFingerprint(const CC *cond) {
|
||||
@@ -46,7 +46,7 @@ static CC *evalFromJSON(const cJSON *params, unsigned char *err) {
|
||||
strcpy(cond->method, method_item->valuestring);
|
||||
cond->paramsBin = paramsBin;
|
||||
cond->paramsBinLength = paramsBinLength;
|
||||
cond->type = &cc_evalType;
|
||||
cond->type = &CC_EvalType;
|
||||
return cond;
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@ static void evalToJSON(const CC *cond, cJSON *params) {
|
||||
|
||||
static CC *evalFromFulfillment(const Fulfillment_t *ffill) {
|
||||
CC *cond = calloc(1, sizeof(CC));
|
||||
cond->type = &cc_evalType;
|
||||
cond->type = &CC_EvalType;
|
||||
|
||||
EvalFulfillment_t *eval = &ffill->choice.evalSha256;
|
||||
|
||||
@@ -125,7 +125,7 @@ typedef struct CCEvalVerifyData {
|
||||
|
||||
|
||||
int evalVisit(CC *cond, CCVisitor visitor) {
|
||||
if (cond->type->typeId != cc_evalType.typeId) return 1;
|
||||
if (cond->type->typeId != CC_Eval) return 1;
|
||||
CCEvalVerifyData *evalData = visitor.context;
|
||||
return evalData->verify(cond, evalData->context);
|
||||
}
|
||||
@@ -138,4 +138,4 @@ int cc_verifyEval(const CC *cond, VerifyEval verify, void *context) {
|
||||
}
|
||||
|
||||
|
||||
struct CCType cc_evalType = { 15, "eval-sha-256", Condition_PR_evalSha256, 0, &evalFingerprint, &evalCost, &evalSubtypes, &evalFromJSON, &evalToJSON, &evalFromFulfillment, &evalToFulfillment, &evalIsFulfilled, &evalFree };
|
||||
struct CCType CC_EvalType = { 15, "eval-sha-256", Condition_PR_evalSha256, 0, &evalFingerprint, &evalCost, &evalSubtypes, &evalFromJSON, &evalToJSON, &evalFromFulfillment, &evalToFulfillment, &evalIsFulfilled, &evalFree };
|
||||
|
||||
@@ -17,7 +17,8 @@ extern "C" {
|
||||
|
||||
|
||||
/*
|
||||
* Condition Type */
|
||||
* Condition Type
|
||||
*/
|
||||
typedef struct CCType {
|
||||
int typeId;
|
||||
char name[100];
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#include "cryptoconditions.h"
|
||||
|
||||
|
||||
struct CCType cc_prefixType;
|
||||
struct CCType CC_PrefixType;
|
||||
|
||||
|
||||
static int prefixVisitChildren(CC *cond, CCVisitor visitor) {
|
||||
@@ -43,7 +43,7 @@ static CC *prefixFromFulfillment(const Fulfillment_t *ffill) {
|
||||
CC *sub = fulfillmentToCC(p->subfulfillment);
|
||||
if (!sub) return 0;
|
||||
CC *cond = calloc(1, sizeof(CC));
|
||||
cond->type = &cc_prefixType;
|
||||
cond->type = &CC_PrefixType;
|
||||
cond->maxMessageLength = p->maxMessageLength;
|
||||
cond->prefix = calloc(1, p->prefix.size);
|
||||
memcpy(cond->prefix, p->prefix.buf, p->prefix.size);
|
||||
@@ -89,7 +89,7 @@ static CC *prefixFromJSON(const cJSON *params, unsigned char *err) {
|
||||
}
|
||||
|
||||
CC *cond = calloc(1, sizeof(CC));
|
||||
cond->type = &cc_prefixType;
|
||||
cond->type = &CC_PrefixType;
|
||||
cond->maxMessageLength = (unsigned long) mml_item->valuedouble;
|
||||
cond->subcondition = sub;
|
||||
|
||||
@@ -122,4 +122,4 @@ static void prefixFree(CC *cond) {
|
||||
}
|
||||
|
||||
|
||||
struct CCType cc_prefixType = { 1, "prefix-sha-256", Condition_PR_prefixSha256, &prefixVisitChildren, &prefixFingerprint, &prefixCost, &prefixSubtypes, &prefixFromJSON, &prefixToJSON, &prefixFromFulfillment, &prefixToFulfillment, &prefixIsFulfilled, &prefixFree };
|
||||
struct CCType CC_PrefixType = { 1, "prefix-sha-256", Condition_PR_prefixSha256, &prefixVisitChildren, &prefixFingerprint, &prefixCost, &prefixSubtypes, &prefixFromJSON, &prefixToJSON, &prefixFromFulfillment, &prefixToFulfillment, &prefixIsFulfilled, &prefixFree };
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#include "cryptoconditions.h"
|
||||
|
||||
|
||||
struct CCType cc_preimageType;
|
||||
struct CCType CC_PreimageType;
|
||||
|
||||
|
||||
static CC *preimageFromJSON(const cJSON *params, unsigned char *err) {
|
||||
@@ -19,7 +19,7 @@ static CC *preimageFromJSON(const cJSON *params, unsigned char *err) {
|
||||
unsigned char *preimage_b64 = preimage_item->valuestring;
|
||||
|
||||
CC *cond = calloc(1, sizeof(CC));
|
||||
cond->type = &cc_preimageType;
|
||||
cond->type = &CC_PreimageType;
|
||||
cond->preimage = base64_decode(preimage_b64, &cond->preimageLength);
|
||||
return cond;
|
||||
}
|
||||
@@ -46,7 +46,7 @@ static unsigned char *preimageFingerprint(const CC *cond) {
|
||||
|
||||
static CC *preimageFromFulfillment(const Fulfillment_t *ffill) {
|
||||
CC *cond = calloc(1, sizeof(CC));
|
||||
cond->type = &cc_preimageType;
|
||||
cond->type = &CC_PreimageType;
|
||||
PreimageFulfillment_t p = ffill->choice.preimageSha256;
|
||||
cond->preimage = calloc(1, p.preimage.size);
|
||||
memcpy(cond->preimage, p.preimage.buf, p.preimage.size);
|
||||
@@ -79,4 +79,4 @@ static uint32_t preimageSubtypes(const CC *cond) {
|
||||
}
|
||||
|
||||
|
||||
struct CCType cc_preimageType = { 0, "preimage-sha-256", Condition_PR_preimageSha256, 0, &preimageFingerprint, &preimageCost, &preimageSubtypes, &preimageFromJSON, &preimageToJSON, &preimageFromFulfillment, &preimageToFulfillment, &preimageIsFulfilled, &preimageFree };
|
||||
struct CCType CC_PreimageType = { 0, "preimage-sha-256", Condition_PR_preimageSha256, 0, &preimageFingerprint, &preimageCost, &preimageSubtypes, &preimageFromJSON, &preimageToJSON, &preimageFromFulfillment, &preimageToFulfillment, &preimageIsFulfilled, &preimageFree };
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
struct CCType cc_secp256k1Type;
|
||||
struct CCType CC_Secp256k1Type;
|
||||
|
||||
|
||||
static const size_t SECP256K1_PK_SIZE = 33;
|
||||
@@ -74,7 +74,7 @@ static unsigned char *secp256k1Fingerprint(const CC *cond) {
|
||||
|
||||
|
||||
int secp256k1Verify(CC *cond, CCVisitor visitor) {
|
||||
if (cond->type->typeId != cc_secp256k1Type.typeId) return 1;
|
||||
if (cond->type->typeId != CC_Secp256k1Type.typeId) return 1;
|
||||
initVerify();
|
||||
|
||||
int rc;
|
||||
@@ -99,8 +99,8 @@ int secp256k1Verify(CC *cond, CCVisitor visitor) {
|
||||
|
||||
static int cc_secp256k1VerifyTreeMsg32(const CC *cond, const unsigned char *msg32) {
|
||||
int subtypes = cc_typeMask(cond);
|
||||
if (subtypes & (1 << cc_prefixType.typeId) &&
|
||||
subtypes & (1 << cc_secp256k1Type.typeId)) {
|
||||
if (subtypes & (1 << CC_PrefixType.typeId) &&
|
||||
subtypes & (1 << CC_Secp256k1Type.typeId)) {
|
||||
// No support for prefix currently, due to pending protocol decision on
|
||||
// how to combine message and prefix into 32 byte hash
|
||||
return 0;
|
||||
@@ -203,7 +203,7 @@ static CC *cc_secp256k1Condition(const unsigned char *publicKey, const unsigned
|
||||
}
|
||||
|
||||
CC *cond = calloc(1, sizeof(CC));
|
||||
cond->type = &cc_secp256k1Type;
|
||||
cond->type = &CC_Secp256k1Type;
|
||||
cond->publicKey = pk;
|
||||
cond->signature = sig;
|
||||
return cond;
|
||||
@@ -281,4 +281,4 @@ static uint32_t secp256k1Subtypes(const CC *cond) {
|
||||
}
|
||||
|
||||
|
||||
struct CCType cc_secp256k1Type = { 5, "secp256k1-sha-256", Condition_PR_secp256k1Sha256, 0, &secp256k1Fingerprint, &secp256k1Cost, &secp256k1Subtypes, &secp256k1FromJSON, &secp256k1ToJSON, &secp256k1FromFulfillment, &secp256k1ToFulfillment, &secp256k1IsFulfilled, &secp256k1Free };
|
||||
struct CCType CC_Secp256k1Type = { 5, "secp256k1-sha-256", Condition_PR_secp256k1Sha256, 0, &secp256k1Fingerprint, &secp256k1Cost, &secp256k1Subtypes, &secp256k1FromJSON, &secp256k1ToJSON, &secp256k1FromFulfillment, &secp256k1ToFulfillment, &secp256k1IsFulfilled, &secp256k1Free };
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
struct CCType cc_thresholdType;
|
||||
struct CCType CC_ThresholdType;
|
||||
|
||||
|
||||
static uint32_t thresholdSubtypes(const CC *cond) {
|
||||
@@ -120,7 +120,7 @@ static CC *thresholdFromFulfillment(const Fulfillment_t *ffill) {
|
||||
}
|
||||
|
||||
CC *cond = calloc(1, sizeof(CC));
|
||||
cond->type = &cc_thresholdType;
|
||||
cond->type = &CC_ThresholdType;
|
||||
cond->threshold = threshold;
|
||||
cond->size = size;
|
||||
cond->subconditions = subconditions;
|
||||
@@ -174,7 +174,7 @@ static CC *thresholdFromJSON(const cJSON *params, unsigned char *err) {
|
||||
}
|
||||
|
||||
CC *cond = calloc(1, sizeof(CC));
|
||||
cond->type = &cc_thresholdType;
|
||||
cond->type = &CC_ThresholdType;
|
||||
cond->threshold = (long) threshold_item->valuedouble;
|
||||
cond->size = cJSON_GetArraySize(subfulfillments_item);
|
||||
cond->subconditions = calloc(cond->size, sizeof(CC*));
|
||||
@@ -222,4 +222,4 @@ static void thresholdFree(CC *cond) {
|
||||
}
|
||||
|
||||
|
||||
struct CCType cc_thresholdType = { 2, "threshold-sha-256", Condition_PR_thresholdSha256, &thresholdVisitChildren, &thresholdFingerprint, &thresholdCost, &thresholdSubtypes, &thresholdFromJSON, &thresholdToJSON, &thresholdFromFulfillment, &thresholdToFulfillment, &thresholdIsFulfilled, &thresholdFree };
|
||||
struct CCType CC_ThresholdType = { 2, "threshold-sha-256", Condition_PR_thresholdSha256, &thresholdVisitChildren, &thresholdFingerprint, &thresholdCost, &thresholdSubtypes, &thresholdFromJSON, &thresholdToJSON, &thresholdFromFulfillment, &thresholdToFulfillment, &thresholdIsFulfilled, &thresholdFree };
|
||||
|
||||
Reference in New Issue
Block a user