Add support for ECCCDH test format.

This commit is contained in:
Dr. Stephen Henson 2011-07-18 00:45:05 +00:00
parent 87873f4328
commit 81c2920849

View File

@ -106,18 +106,9 @@ static const EVP_MD *parse_md(char *line)
return NULL; return NULL;
} }
static int lookup_curve(char *cname) static int lookup_curve2(char *cname)
{ {
char *p; char *p;
p = strchr(cname, ':');
if (!p)
{
fprintf(stderr, "Parse error: missing :\n");
return NID_undef;
}
cname = p + 1;
while(isspace(*cname))
cname++;
p = strchr(cname, ']'); p = strchr(cname, ']');
if (!p) if (!p)
{ {
@ -161,6 +152,21 @@ static int lookup_curve(char *cname)
return NID_undef; return NID_undef;
} }
static int lookup_curve(char *cname)
{
char *p;
p = strchr(cname, ':');
if (!p)
{
fprintf(stderr, "Parse error: missing :\n");
return NID_undef;
}
cname = p + 1;
while(isspace(*cname))
cname++;
return lookup_curve2(cname);
}
static EC_POINT *make_peer(EC_GROUP *group, BIGNUM *x, BIGNUM *y) static EC_POINT *make_peer(EC_GROUP *group, BIGNUM *x, BIGNUM *y)
{ {
EC_POINT *peer; EC_POINT *peer;
@ -190,7 +196,7 @@ static EC_POINT *make_peer(EC_GROUP *group, BIGNUM *x, BIGNUM *y)
return NULL; return NULL;
} }
static int ec_print_pubkey(FILE *out, EC_KEY *key) static int ec_print_pubkey(FILE *out, EC_KEY *key, int add_e)
{ {
const EC_POINT *pt; const EC_POINT *pt;
const EC_GROUP *grp; const EC_GROUP *grp;
@ -220,8 +226,16 @@ static int ec_print_pubkey(FILE *out, EC_KEY *key)
rv = EC_POINT_get_affine_coordinates_GF2m(grp, pt, tx, ty, ctx); rv = EC_POINT_get_affine_coordinates_GF2m(grp, pt, tx, ty, ctx);
#endif #endif
if (add_e)
{
do_bn_print_name(out, "QeIUTx", tx); do_bn_print_name(out, "QeIUTx", tx);
do_bn_print_name(out, "QeIUTy", ty); do_bn_print_name(out, "QeIUTy", ty);
}
else
{
do_bn_print_name(out, "QIUTx", tx);
do_bn_print_name(out, "QIUTy", ty);
}
BN_CTX_free(ctx); BN_CTX_free(ctx);
@ -244,9 +258,10 @@ static void ec_output_Zhash(FILE *out, int exout, EC_GROUP *group,
peerkey = make_peer(group, cx, cy); peerkey = make_peer(group, cx, cy);
if (rhash == NULL) if (rhash == NULL)
{ {
if (md)
rhashlen = M_EVP_MD_size(md); rhashlen = M_EVP_MD_size(md);
EC_KEY_generate_key(ec); EC_KEY_generate_key(ec);
ec_print_pubkey(out, ec); ec_print_pubkey(out, ec, md ? 1 : 0);
} }
else else
{ {
@ -258,15 +273,21 @@ static void ec_output_Zhash(FILE *out, int exout, EC_GROUP *group,
if (!Z) if (!Z)
exit(1); exit(1);
ECDH_compute_key(Z, Zlen, peerkey, ec, 0); ECDH_compute_key(Z, Zlen, peerkey, ec, 0);
if (md)
{
if (exout) if (exout)
OutputValue("Z", Z, Zlen, out, 0); OutputValue("Z", Z, Zlen, out, 0);
FIPS_digest(Z, Zlen, chash, NULL, md); FIPS_digest(Z, Zlen, chash, NULL, md);
OutputValue(rhash ? "IUTHashZZ" : "HashZZ", chash, rhashlen, out, 0); OutputValue(rhash ? "IUTHashZZ" : "HashZZ",
chash, rhashlen, out, 0);
if (rhash) if (rhash)
{ {
fprintf(out, "Result = %s\n", fprintf(out, "Result = %s\n",
memcmp(chash, rhash, rhashlen) ? "F" : "P"); memcmp(chash, rhash, rhashlen) ? "F" : "P");
} }
}
else
OutputValue("ZIUT", Z, Zlen, out, 0);
OPENSSL_cleanse(Z, Zlen); OPENSSL_cleanse(Z, Zlen);
OPENSSL_free(Z); OPENSSL_free(Z);
EC_KEY_free(ec); EC_KEY_free(ec);
@ -372,6 +393,16 @@ int main(int argc,char **argv)
curve_nids[param_set] = nid; curve_nids[param_set] = nid;
} }
if (strlen(buf) > 4 && buf[0] == '[' && buf[2] == '-')
{
int nid = lookup_curve2(buf + 1);
if (nid == NID_undef)
goto parse_error;
if (group)
EC_GROUP_free(group);
group = EC_GROUP_new_by_curve_name(nid);
}
if (strlen(buf) > 6 && !strncmp(buf, "[E", 2)) if (strlen(buf) > 6 && !strncmp(buf, "[E", 2))
{ {
md = parse_md(buf); md = parse_md(buf);
@ -381,12 +412,12 @@ int main(int argc,char **argv)
} }
if (!parse_line(&keyword, &value, lbuf, buf)) if (!parse_line(&keyword, &value, lbuf, buf))
continue; continue;
if (!strcmp(keyword, "QeCAVSx")) if (!strcmp(keyword, "QeCAVSx") || !strcmp(keyword, "QCAVSx"))
{ {
if (!do_hex2bn(&cx, value)) if (!do_hex2bn(&cx, value))
goto parse_error; goto parse_error;
} }
else if (!strcmp(keyword, "QeCAVSy")) else if (!strcmp(keyword, "QeCAVSy") || !strcmp(keyword, "QCAVSy"))
{ {
if (!do_hex2bn(&cy, value)) if (!do_hex2bn(&cy, value))
goto parse_error; goto parse_error;