Document removal of digest+signature algorithm link.
[openssl.git] / apps / ecparam.c
index 02bf6c1a9dd5e0bfebb48caaf713e7aa0a4ed3dd..e9aa0a184ae7a38868d1bd3753c5cbdc6fe06cc7 100644 (file)
@@ -3,7 +3,7 @@
  * Written by Nils Larsch for the OpenSSL project.
  */
 /* ====================================================================
- * Copyright (c) 1998-2002 The OpenSSL Project.  All rights reserved.
+ * Copyright (c) 1998-2005 The OpenSSL Project.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -68,6 +68,8 @@
  * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories.
  *
  */
+
+#include <openssl/opensslconf.h>
 #ifndef OPENSSL_NO_EC
 #include <assert.h>
 #include <stdio.h>
@@ -127,7 +129,9 @@ int MAIN(int argc, char **argv)
        char    *infile = NULL, *outfile = NULL, *prog;
        BIO     *in = NULL, *out = NULL;
        int     informat, outformat, noout = 0, C = 0, ret = 1;
+#ifndef OPENSSL_NO_ENGINE
        ENGINE  *e = NULL;
+#endif
        char    *engine = NULL;
 
        BIGNUM  *ec_p = NULL, *ec_a = NULL, *ec_b = NULL,
@@ -335,18 +339,19 @@ bad:
                        }
                }
 
+#ifndef OPENSSL_NO_ENGINE
        e = setup_engine(bio_err, engine, 0);
+#endif
 
        if (list_curves)
                {
                EC_builtin_curve *curves = NULL;
                size_t crv_len = 0;
                size_t n = 0;
-               size_t len;
 
                crv_len = EC_get_builtin_curves(NULL, 0);
 
-               curves = OPENSSL_malloc(sizeof(EC_builtin_curve) * crv_len);
+               curves = OPENSSL_malloc((int)(sizeof(EC_builtin_curve) * crv_len));
 
                if (curves == NULL)
                        goto end;
@@ -369,11 +374,8 @@ bad:
                        if (sname == NULL)
                                sname = "";
 
-                       len = BIO_printf(out, "  %-10s: ", sname);
-                       if (len + strlen(comment) > 80)
-                               BIO_printf(out, "\n%80s\n", comment);
-                       else
-                               BIO_printf(out, "%s\n", comment);
+                       BIO_printf(out, "  %-10s: ", sname);
+                       BIO_printf(out, "%s\n", comment);
                        } 
 
                OPENSSL_free(curves);
@@ -383,7 +385,26 @@ bad:
 
        if (curve_name != NULL)
                {
-               int nid = OBJ_sn2nid(curve_name);
+               int nid;
+
+               /* workaround for the SECG curve names secp192r1
+                * and secp256r1 (which are the same as the curves
+                * prime192v1 and prime256v1 defined in X9.62)
+                */
+               if (!strcmp(curve_name, "secp192r1"))
+                       {
+                       BIO_printf(bio_err, "using curve name prime192v1 "
+                               "instead of secp192r1\n");
+                       nid = NID_X9_62_prime192v1;
+                       }
+               else if (!strcmp(curve_name, "secp256r1"))
+                       {
+                       BIO_printf(bio_err, "using curve name prime256v1 "
+                               "instead of secp256r1\n");
+                       nid = NID_X9_62_prime256v1;
+                       }
+               else
+                       nid = OBJ_sn2nid(curve_name);
        
                if (nid == 0)
                        {
@@ -392,7 +413,7 @@ bad:
                        goto end;
                        }
 
-               group = EC_GROUP_new_by_nid(nid);
+               group = EC_GROUP_new_by_curve_name(nid);
                if (group == NULL)
                        {
                        BIO_printf(bio_err, "unable to create curve (%s)\n", 
@@ -628,11 +649,11 @@ bad:
 
                assert(need_rand);
 
-               eckey->group = group;
+               if (EC_KEY_set_group(eckey, group) == 0)
+                       goto end;
                
                if (!EC_KEY_generate_key(eckey))
                        {
-                       eckey->group = NULL;
                        EC_KEY_free(eckey);
                        goto end;
                        }
@@ -645,11 +666,9 @@ bad:
                        {
                        BIO_printf(bio_err, "bad output format specified "
                                "for outfile\n");
-                       eckey->group = NULL;
                        EC_KEY_free(eckey);
                        goto end;
                        }
-               eckey->group = NULL;
                EC_KEY_free(eckey);
                }
 
@@ -679,10 +698,10 @@ end:
        if (group != NULL)
                EC_GROUP_free(group);
        apps_shutdown();
-       EXIT(ret);
+       OPENSSL_EXIT(ret);
 }
 
-int ecparam_print_var(BIO *out, BIGNUM *in, const char *var,
+static int ecparam_print_var(BIO *out, BIGNUM *in, const char *var,
        int len, unsigned char *buffer)
        {
        BIO_printf(out, "static unsigned char %s_%d[] = {", var, len);
@@ -706,4 +725,10 @@ int ecparam_print_var(BIO *out, BIGNUM *in, const char *var,
        BIO_printf(out, "\n\t};\n\n");
        return 1;
        }
+#else /* !OPENSSL_NO_EC */
+
+# if PEDANTIC
+static void *dummy=&dummy;
+# endif
+
 #endif