Print private key component is -exout parameter is given.
[openssl.git] / fips / ecdh / fips_ecdhvs.c
index 3182f6e4cebce79fb0cae74f7929d423e78600e2..72ebe815ddb310f570689fdbf5d6d6ec7ebc30fe 100644 (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, ']');
        if (!p)
                {
        p = strchr(cname, ']');
        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)
        {
        EC_POINT *peer;
 static EC_POINT *make_peer(EC_GROUP *group, BIGNUM *x, BIGNUM *y)
        {
        EC_POINT *peer;
@@ -171,10 +177,17 @@ static EC_POINT *make_peer(EC_GROUP *group, BIGNUM *x, BIGNUM *y)
                return NULL;
        c = BN_CTX_new();
        if (EC_METHOD_get_field_type(EC_GROUP_method_of(group))
                return NULL;
        c = BN_CTX_new();
        if (EC_METHOD_get_field_type(EC_GROUP_method_of(group))
-               == NID_X9_62_characteristic_two_field)
-               rv = EC_POINT_set_affine_coordinates_GF2m(group, peer, x, y, c);
-       else
+               == NID_X9_62_prime_field)
                rv = EC_POINT_set_affine_coordinates_GFp(group, peer, x, y, c);
                rv = EC_POINT_set_affine_coordinates_GFp(group, peer, x, y, c);
+       else
+#ifdef OPENSSL_NO_EC2M
+               {
+               fprintf(stderr, "ERROR: GF2m not supported\n");
+               exit(1);
+               }
+#else
+               rv = EC_POINT_set_affine_coordinates_GF2m(group, peer, x, y, c);
+#endif
 
        BN_CTX_free(c);
        if (rv)
 
        BN_CTX_free(c);
        if (rv)
@@ -183,13 +196,14 @@ 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_key(FILE *out, EC_KEY *key, int add_e, int exout)
        {
        const EC_POINT *pt;
        const EC_GROUP *grp;
        const EC_METHOD *meth;
        int rv;
        BIGNUM *tx, *ty;
        {
        const EC_POINT *pt;
        const EC_GROUP *grp;
        const EC_METHOD *meth;
        int rv;
        BIGNUM *tx, *ty;
+       const BIGNUM *d = NULL;
        BN_CTX *ctx;
        ctx = BN_CTX_new();
        if (!ctx)
        BN_CTX *ctx;
        ctx = BN_CTX_new();
        if (!ctx)
@@ -200,14 +214,35 @@ static int ec_print_pubkey(FILE *out, EC_KEY *key)
                return 0;
        grp = EC_KEY_get0_group(key);
        pt = EC_KEY_get0_public_key(key);
                return 0;
        grp = EC_KEY_get0_group(key);
        pt = EC_KEY_get0_public_key(key);
+       if (exout)
+               d = EC_KEY_get0_private_key(key);
        meth = EC_GROUP_method_of(grp);
        if (EC_METHOD_get_field_type(meth) == NID_X9_62_prime_field)
                rv = EC_POINT_get_affine_coordinates_GFp(grp, pt, tx, ty, ctx);
        else
        meth = EC_GROUP_method_of(grp);
        if (EC_METHOD_get_field_type(meth) == NID_X9_62_prime_field)
                rv = EC_POINT_get_affine_coordinates_GFp(grp, pt, tx, ty, ctx);
        else
+#ifdef OPENSSL_NO_EC2M
+               {
+               fprintf(stderr, "ERROR: GF2m not supported\n");
+               exit(1);
+               }
+#else
                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
 
 
-       do_bn_print_name(out, "QeIUTx", tx);
-       do_bn_print_name(out, "QeIUTy", ty);
+       if (add_e)
+               {
+               do_bn_print_name(out, "QeIUTx", tx);
+               do_bn_print_name(out, "QeIUTy", ty);
+               if (d)
+                       do_bn_print_name(out, "QeIUTd", d);
+               }
+       else
+               {
+               do_bn_print_name(out, "QIUTx", tx);
+               do_bn_print_name(out, "QIUTy", ty);
+               if (d)
+                       do_bn_print_name(out, "QIUTd", d);
+               }
 
        BN_CTX_free(ctx);
 
 
        BN_CTX_free(ctx);
 
@@ -230,9 +265,10 @@ static void ec_output_Zhash(FILE *out, int exout, EC_GROUP *group,
        peerkey = make_peer(group, cx, cy);
        if (rhash == NULL)
                {
        peerkey = make_peer(group, cx, cy);
        if (rhash == NULL)
                {
-               rhashlen = M_EVP_MD_size(md);
+               if (md)
+                       rhashlen = M_EVP_MD_size(md);
                EC_KEY_generate_key(ec);
                EC_KEY_generate_key(ec);
-               ec_print_pubkey(out, ec);
+               ec_print_key(out, ec, md ? 1 : 0, exout);
                }
        else
                {
                }
        else
                {
@@ -244,15 +280,21 @@ static void ec_output_Zhash(FILE *out, int exout, EC_GROUP *group,
        if (!Z)
                exit(1);
        ECDH_compute_key(Z, Zlen, peerkey, ec, 0);
        if (!Z)
                exit(1);
        ECDH_compute_key(Z, Zlen, peerkey, ec, 0);
-       if (exout)
-               OutputValue("Z", Z, Zlen, out, 0);
-       FIPS_digest(Z, Zlen, chash, NULL, md);
-       OutputValue(rhash ? "IUTHashZZ" : "HashZZ", chash, rhashlen, out, 0);
-       if (rhash)
+       if (md)
                {
                {
-               fprintf(out, "Result = %s\n",
+               if (exout)
+                       OutputValue("Z", Z, Zlen, out, 0);
+               FIPS_digest(Z, Zlen, chash, NULL, md);
+               OutputValue(rhash ? "IUTHashZZ" : "HashZZ",
+                                               chash, rhashlen, out, 0);
+               if (rhash)
+                       {
+                       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_free(Z);
        EC_KEY_free(ec);
        OPENSSL_cleanse(Z, Zlen);
        OPENSSL_free(Z);
        EC_KEY_free(ec);
@@ -265,7 +307,7 @@ int main(int argc,char **argv)
        int argn = argc - 1;
        FILE *in, *out;
        char buf[2048], lbuf[2048];
        int argn = argc - 1;
        FILE *in, *out;
        char buf[2048], lbuf[2048];
-       unsigned char *rhash;
+       unsigned char *rhash = NULL;
        long rhashlen;
        BIGNUM *cx = NULL, *cy = NULL;
        BIGNUM *id = NULL, *ix = NULL, *iy = NULL;
        long rhashlen;
        BIGNUM *cx = NULL, *cy = NULL;
        BIGNUM *id = NULL, *ix = NULL, *iy = NULL;
@@ -277,9 +319,7 @@ int main(int argc,char **argv)
        int curve_nids[5] = {0,0,0,0,0};
        int param_set = -1;
 
        int curve_nids[5] = {0,0,0,0,0};
        int param_set = -1;
 
-       fips_set_error_print();
-       if(!FIPS_mode_set(1))
-               exit(1);
+       fips_algtest_init();
 
        if (argn && !strcmp(*args, "ecdhver"))
                {
 
        if (argn && !strcmp(*args, "ecdhver"))
                {
@@ -360,6 +400,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))
                        {
                        md = parse_md(buf);
                if (strlen(buf) > 6 && !strncmp(buf, "[E", 2))
                        {
                        md = parse_md(buf);
@@ -369,12 +419,12 @@ int main(int argc,char **argv)
                        }
                if (!parse_line(&keyword, &value, lbuf, buf))
                        continue;
                        }
                if (!parse_line(&keyword, &value, lbuf, buf))
                        continue;
-               if (!strcmp(keyword, "QeCAVSx"))
+               if (!strcmp(keyword, "QeCAVSx") || !strcmp(keyword, "QCAVSx"))
                        {
                        if (!do_hex2bn(&cx, value))
                                goto parse_error;
                        }
                        {
                        if (!do_hex2bn(&cx, value))
                                goto parse_error;
                        }
-               else if (!strcmp(keyword, "QeCAVSy"))
+               else if (!strcmp(keyword, "QeCAVSy") || !strcmp(keyword, "QCAVSy"))
                        {
                        if (!do_hex2bn(&cy, value))
                                goto parse_error;
                        {
                        if (!do_hex2bn(&cy, value))
                                goto parse_error;