ghash-x86_64.pl: optimize for upcoming Atom.
[openssl.git] / fips / ecdh / fips_ecdhvs.c
index 72ebe815ddb310f570689fdbf5d6d6ec7ebc30fe..a1422868b37b69f62ac618a82f02754c3c2145ef 100644 (file)
@@ -76,7 +76,7 @@ int main(int argc, char **argv)
 
 #include "fips_utl.h"
 
-static const EVP_MD *parse_md(char *line)
+static const EVP_MD *eparse_md(char *line)
        {
        char *p;
        if (line[0] != '[' || line[1] != 'E')
@@ -261,6 +261,7 @@ static void ec_output_Zhash(FILE *out, int exout, EC_GROUP *group,
        unsigned char chash[EVP_MAX_MD_SIZE];
        int Zlen;
        ec = EC_KEY_new();
+       EC_KEY_set_flags(ec, EC_FLAG_COFACTOR_ECDH);
        EC_KEY_set_group(ec, group);
        peerkey = make_peer(group, cx, cy);
        if (rhash == NULL)
@@ -301,7 +302,11 @@ static void ec_output_Zhash(FILE *out, int exout, EC_GROUP *group,
        EC_POINT_free(peerkey);
        }
                
-int main(int argc,char **argv)
+#ifdef FIPS_ALGVS
+int fips_ecdhvs_main(int argc, char **argv)
+#else
+int main(int argc, char **argv)
+#endif
        {
        char **args = argv + 1;
        int argn = argc - 1;
@@ -315,6 +320,7 @@ int main(int argc,char **argv)
        EC_GROUP *group = NULL;
        char *keyword = NULL, *value = NULL;
        int do_verify = -1, exout = 0;
+       int rv = 1;
 
        int curve_nids[5] = {0,0,0,0,0};
        int param_set = -1;
@@ -408,11 +414,16 @@ int main(int argc,char **argv)
                        if (group)
                                EC_GROUP_free(group);
                        group = EC_GROUP_new_by_curve_name(nid);
+                       if (!group)
+                               {
+                               fprintf(stderr, "ERROR: unsupported curve %s\n", buf + 1);
+                               return 1;
+                               }
                        }
 
                if (strlen(buf) > 6 && !strncmp(buf, "[E", 2))
                        {
-                       md = parse_md(buf);
+                       md = eparse_md(buf);
                        if (md == NULL)
                                goto parse_error;
                        continue;
@@ -459,10 +470,27 @@ int main(int argc,char **argv)
                                        md, rhash, rhashlen);
                        }
                }
-       return 0;
+       rv = 0;
        parse_error:
-       fprintf(stderr, "Error Parsing request file\n");
-       exit(1);
+       if (id)
+               BN_free(id);
+       if (ix)
+               BN_free(ix);
+       if (iy)
+               BN_free(iy);
+       if (cx)
+               BN_free(cx);
+       if (cy)
+               BN_free(cy);
+       if (group)
+               EC_GROUP_free(group);
+       if (in && in != stdin)
+               fclose(in);
+       if (out && out != stdout)
+               fclose(out);
+       if (rv)
+               fprintf(stderr, "Error Parsing request file\n");
+       return rv;
        }
 
 #endif