/* Construct ECGroup from named parameters. */ ECGroup * ECGroup_fromName(const ECCurveName name) { ECGroup *group = NULL; ECCurveParams *params = NULL; mp_err res = MP_OKAY; params = EC_GetNamedCurveParams(name); if (params == NULL) { res = MP_UNDEF; goto CLEANUP; } /* construct actual group */ group = ecgroup_fromNameAndHex(name, params); if (group == NULL) { res = MP_UNDEF; goto CLEANUP; } CLEANUP: EC_FreeCurveParams(params); if (res != MP_OKAY) { ECGroup_free(group); return NULL; } return group; }
/* Duplicates an ECCurveParams */ ECCurveParams * ECCurveParams_dup(const ECCurveParams * params, int kmflag) { int res = 1; ECCurveParams *ret = NULL; #ifdef _KERNEL ret = (ECCurveParams *) kmem_zalloc(sizeof(ECCurveParams), kmflag); #else CHECK(ret = (ECCurveParams *) calloc(1, sizeof(ECCurveParams))); #endif if (params->text != NULL) { #ifdef _KERNEL ret->text = kmem_alloc(strlen(params->text) + 1, kmflag); bcopy(params->text, ret->text, strlen(params->text) + 1); #else CHECK(ret->text = strdup(params->text)); #endif } ret->field = params->field; ret->size = params->size; if (params->irr != NULL) { #ifdef _KERNEL ret->irr = kmem_alloc(strlen(params->irr) + 1, kmflag); bcopy(params->irr, ret->irr, strlen(params->irr) + 1); #else CHECK(ret->irr = strdup(params->irr)); #endif } if (params->curvea != NULL) { #ifdef _KERNEL ret->curvea = kmem_alloc(strlen(params->curvea) + 1, kmflag); bcopy(params->curvea, ret->curvea, strlen(params->curvea) + 1); #else CHECK(ret->curvea = strdup(params->curvea)); #endif } if (params->curveb != NULL) { #ifdef _KERNEL ret->curveb = kmem_alloc(strlen(params->curveb) + 1, kmflag); bcopy(params->curveb, ret->curveb, strlen(params->curveb) + 1); #else CHECK(ret->curveb = strdup(params->curveb)); #endif } if (params->genx != NULL) { #ifdef _KERNEL ret->genx = kmem_alloc(strlen(params->genx) + 1, kmflag); bcopy(params->genx, ret->genx, strlen(params->genx) + 1); #else CHECK(ret->genx = strdup(params->genx)); #endif } if (params->geny != NULL) { #ifdef _KERNEL ret->geny = kmem_alloc(strlen(params->geny) + 1, kmflag); bcopy(params->geny, ret->geny, strlen(params->geny) + 1); #else CHECK(ret->geny = strdup(params->geny)); #endif } if (params->order != NULL) { #ifdef _KERNEL ret->order = kmem_alloc(strlen(params->order) + 1, kmflag); bcopy(params->order, ret->order, strlen(params->order) + 1); #else CHECK(ret->order = strdup(params->order)); #endif } ret->cofactor = params->cofactor; CLEANUP: if (res != 1) { EC_FreeCurveParams(ret); return NULL; } return ret; }
/* Performs tests of elliptic curve cryptography over prime fields If * tests fail, then it prints an error message, aborts, and returns an * error code. Otherwise, returns 0. */ int main(int argv, char **argc) { int ectestTime = 0; int ectestPrint = 0; int i; ECGroup *group = NULL; ECCurveParams *params = NULL; mp_err res; /* read command-line arguments */ for (i = 1; i < argv; i++) { if ((strcasecmp(argc[i], "time") == 0) || (strcasecmp(argc[i], "-time") == 0) || (strcasecmp(argc[i], "--time") == 0)) { ectestTime = 1; } else if ((strcasecmp(argc[i], "print") == 0) || (strcasecmp(argc[i], "-print") == 0) || (strcasecmp(argc[i], "--print") == 0)) { ectestPrint = 1; } else { printUsage(); return 0; } } /* generic arithmetic tests */ ECTEST_GENERIC_GFP("SECP-160R1", ECCurve_SECG_PRIME_160R1); /* specific arithmetic tests */ ECTEST_NAMED_GFP("NIST-P192", ECCurve_NIST_P192); ECTEST_NAMED_GFP("NIST-P224", ECCurve_NIST_P224); ECTEST_NAMED_GFP("NIST-P256", ECCurve_NIST_P256); ECTEST_NAMED_GFP("NIST-P384", ECCurve_NIST_P384); ECTEST_NAMED_GFP("NIST-P521", ECCurve_NIST_P521); ECTEST_NAMED_GFP("ANSI X9.62 PRIME192v1", ECCurve_X9_62_PRIME_192V1); ECTEST_NAMED_GFP("ANSI X9.62 PRIME192v2", ECCurve_X9_62_PRIME_192V2); ECTEST_NAMED_GFP("ANSI X9.62 PRIME192v3", ECCurve_X9_62_PRIME_192V3); ECTEST_NAMED_GFP("ANSI X9.62 PRIME239v1", ECCurve_X9_62_PRIME_239V1); ECTEST_NAMED_GFP("ANSI X9.62 PRIME239v2", ECCurve_X9_62_PRIME_239V2); ECTEST_NAMED_GFP("ANSI X9.62 PRIME239v3", ECCurve_X9_62_PRIME_239V3); ECTEST_NAMED_GFP("ANSI X9.62 PRIME256v1", ECCurve_X9_62_PRIME_256V1); ECTEST_NAMED_GFP("SECP-112R1", ECCurve_SECG_PRIME_112R1); ECTEST_NAMED_GFP("SECP-112R2", ECCurve_SECG_PRIME_112R2); ECTEST_NAMED_GFP("SECP-128R1", ECCurve_SECG_PRIME_128R1); ECTEST_NAMED_GFP("SECP-128R2", ECCurve_SECG_PRIME_128R2); ECTEST_NAMED_GFP("SECP-160K1", ECCurve_SECG_PRIME_160K1); ECTEST_NAMED_GFP("SECP-160R1", ECCurve_SECG_PRIME_160R1); ECTEST_NAMED_GFP("SECP-160R2", ECCurve_SECG_PRIME_160R2); ECTEST_NAMED_GFP("SECP-192K1", ECCurve_SECG_PRIME_192K1); ECTEST_NAMED_GFP("SECP-192R1", ECCurve_SECG_PRIME_192R1); ECTEST_NAMED_GFP("SECP-224K1", ECCurve_SECG_PRIME_224K1); ECTEST_NAMED_GFP("SECP-224R1", ECCurve_SECG_PRIME_224R1); ECTEST_NAMED_GFP("SECP-256K1", ECCurve_SECG_PRIME_256K1); ECTEST_NAMED_GFP("SECP-256R1", ECCurve_SECG_PRIME_256R1); ECTEST_NAMED_GFP("SECP-384R1", ECCurve_SECG_PRIME_384R1); ECTEST_NAMED_GFP("SECP-521R1", ECCurve_SECG_PRIME_521R1); ECTEST_NAMED_GFP("WTLS-6 (112)", ECCurve_WTLS_6); ECTEST_NAMED_GFP("WTLS-7 (160)", ECCurve_WTLS_7); ECTEST_NAMED_GFP("WTLS-8 (112)", ECCurve_WTLS_8); ECTEST_NAMED_GFP("WTLS-9 (160)", ECCurve_WTLS_9); ECTEST_NAMED_GFP("WTLS-12 (224)", ECCurve_WTLS_12); ECTEST_NAMED_GFP("Curve25519", ECCurve25519); CLEANUP: EC_FreeCurveParams(params); ECGroup_free(group); if (res != MP_OKAY) { printf("Error: exiting with error value %i\n", res); } return res; }
/* Performs tests of elliptic curve cryptography over binary polynomial * fields. If tests fail, then it prints an error message, aborts, and * returns an error code. Otherwise, returns 0. */ int main(int argv, char **argc) { int ectestTime = 0; int ectestPrint = 0; int i; ECGroup *group = NULL; ECCurveParams *params = NULL; mp_err res; /* read command-line arguments */ for (i = 1; i < argv; i++) { if ((strcasecmp(argc[i], "time") == 0) || (strcasecmp(argc[i], "-time") == 0) || (strcasecmp(argc[i], "--time") == 0)) { ectestTime = 1; } else if ((strcasecmp(argc[i], "print") == 0) || (strcasecmp(argc[i], "-print") == 0) || (strcasecmp(argc[i], "--print") == 0)) { ectestPrint = 1; } else { printUsage(); return 0; } } /* generic arithmetic tests */ ECTEST_GENERIC_GF2M("SECT-131R1", ECCurve_SECG_CHAR2_131R1); /* specific arithmetic tests */ ECTEST_NAMED_GF2M("NIST-K163", ECCurve_NIST_K163); ECTEST_NAMED_GF2M("NIST-B163", ECCurve_NIST_B163); ECTEST_NAMED_GF2M("NIST-K233", ECCurve_NIST_K233); ECTEST_NAMED_GF2M("NIST-B233", ECCurve_NIST_B233); ECTEST_NAMED_GF2M("NIST-K283", ECCurve_NIST_K283); ECTEST_NAMED_GF2M("NIST-B283", ECCurve_NIST_B283); ECTEST_NAMED_GF2M("NIST-K409", ECCurve_NIST_K409); ECTEST_NAMED_GF2M("NIST-B409", ECCurve_NIST_B409); ECTEST_NAMED_GF2M("NIST-K571", ECCurve_NIST_K571); ECTEST_NAMED_GF2M("NIST-B571", ECCurve_NIST_B571); ECTEST_NAMED_GF2M("ANSI X9.62 C2PNB163V1", ECCurve_X9_62_CHAR2_PNB163V1); ECTEST_NAMED_GF2M("ANSI X9.62 C2PNB163V2", ECCurve_X9_62_CHAR2_PNB163V2); ECTEST_NAMED_GF2M("ANSI X9.62 C2PNB163V3", ECCurve_X9_62_CHAR2_PNB163V3); ECTEST_NAMED_GF2M("ANSI X9.62 C2PNB176V1", ECCurve_X9_62_CHAR2_PNB176V1); ECTEST_NAMED_GF2M("ANSI X9.62 C2TNB191V1", ECCurve_X9_62_CHAR2_TNB191V1); ECTEST_NAMED_GF2M("ANSI X9.62 C2TNB191V2", ECCurve_X9_62_CHAR2_TNB191V2); ECTEST_NAMED_GF2M("ANSI X9.62 C2TNB191V3", ECCurve_X9_62_CHAR2_TNB191V3); ECTEST_NAMED_GF2M("ANSI X9.62 C2PNB208W1", ECCurve_X9_62_CHAR2_PNB208W1); ECTEST_NAMED_GF2M("ANSI X9.62 C2TNB239V1", ECCurve_X9_62_CHAR2_TNB239V1); ECTEST_NAMED_GF2M("ANSI X9.62 C2TNB239V2", ECCurve_X9_62_CHAR2_TNB239V2); ECTEST_NAMED_GF2M("ANSI X9.62 C2TNB239V3", ECCurve_X9_62_CHAR2_TNB239V3); ECTEST_NAMED_GF2M("ANSI X9.62 C2PNB272W1", ECCurve_X9_62_CHAR2_PNB272W1); ECTEST_NAMED_GF2M("ANSI X9.62 C2PNB304W1", ECCurve_X9_62_CHAR2_PNB304W1); ECTEST_NAMED_GF2M("ANSI X9.62 C2TNB359V1", ECCurve_X9_62_CHAR2_TNB359V1); ECTEST_NAMED_GF2M("ANSI X9.62 C2PNB368W1", ECCurve_X9_62_CHAR2_PNB368W1); ECTEST_NAMED_GF2M("ANSI X9.62 C2TNB431R1", ECCurve_X9_62_CHAR2_TNB431R1); ECTEST_NAMED_GF2M("SECT-113R1", ECCurve_SECG_CHAR2_113R1); ECTEST_NAMED_GF2M("SECT-113R2", ECCurve_SECG_CHAR2_113R2); ECTEST_NAMED_GF2M("SECT-131R1", ECCurve_SECG_CHAR2_131R1); ECTEST_NAMED_GF2M("SECT-131R2", ECCurve_SECG_CHAR2_131R2); ECTEST_NAMED_GF2M("SECT-163K1", ECCurve_SECG_CHAR2_163K1); ECTEST_NAMED_GF2M("SECT-163R1", ECCurve_SECG_CHAR2_163R1); ECTEST_NAMED_GF2M("SECT-163R2", ECCurve_SECG_CHAR2_163R2); ECTEST_NAMED_GF2M("SECT-193R1", ECCurve_SECG_CHAR2_193R1); ECTEST_NAMED_GF2M("SECT-193R2", ECCurve_SECG_CHAR2_193R2); ECTEST_NAMED_GF2M("SECT-233K1", ECCurve_SECG_CHAR2_233K1); ECTEST_NAMED_GF2M("SECT-233R1", ECCurve_SECG_CHAR2_233R1); ECTEST_NAMED_GF2M("SECT-239K1", ECCurve_SECG_CHAR2_239K1); ECTEST_NAMED_GF2M("SECT-283K1", ECCurve_SECG_CHAR2_283K1); ECTEST_NAMED_GF2M("SECT-283R1", ECCurve_SECG_CHAR2_283R1); ECTEST_NAMED_GF2M("SECT-409K1", ECCurve_SECG_CHAR2_409K1); ECTEST_NAMED_GF2M("SECT-409R1", ECCurve_SECG_CHAR2_409R1); ECTEST_NAMED_GF2M("SECT-571K1", ECCurve_SECG_CHAR2_571K1); ECTEST_NAMED_GF2M("SECT-571R1", ECCurve_SECG_CHAR2_571R1); ECTEST_NAMED_GF2M("WTLS-1 (113)", ECCurve_WTLS_1); ECTEST_NAMED_GF2M("WTLS-3 (163)", ECCurve_WTLS_3); ECTEST_NAMED_GF2M("WTLS-4 (113)", ECCurve_WTLS_4); ECTEST_NAMED_GF2M("WTLS-5 (163)", ECCurve_WTLS_5); ECTEST_NAMED_GF2M("WTLS-10 (233)", ECCurve_WTLS_10); ECTEST_NAMED_GF2M("WTLS-11 (233)", ECCurve_WTLS_11); CLEANUP: EC_FreeCurveParams(params); ECGroup_free(group); if (res != MP_OKAY) { printf("Error: exiting with error value %i\n", res); } return res; }