diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/usr.bin/openssl/ecparam.c | 412 |
1 files changed, 215 insertions, 197 deletions
diff --git a/src/usr.bin/openssl/ecparam.c b/src/usr.bin/openssl/ecparam.c index 782069a8e5..7336360b35 100644 --- a/src/usr.bin/openssl/ecparam.c +++ b/src/usr.bin/openssl/ecparam.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ecparam.c,v 1.2 2014/08/28 14:23:52 jsing Exp $ */ | 1 | /* $OpenBSD: ecparam.c,v 1.3 2014/09/01 14:26:01 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Written by Nils Larsch for the OpenSSL project. | 3 | * Written by Nils Larsch for the OpenSSL project. |
| 4 | */ | 4 | */ |
| @@ -87,179 +87,198 @@ | |||
| 87 | #include <openssl/pem.h> | 87 | #include <openssl/pem.h> |
| 88 | #include <openssl/x509.h> | 88 | #include <openssl/x509.h> |
| 89 | 89 | ||
| 90 | /* -inform arg - input format - default PEM (DER or PEM) | 90 | static int ecparam_print_var(BIO *, BIGNUM *, const char *, int, |
| 91 | * -outform arg - output format - default PEM | 91 | unsigned char *); |
| 92 | * -in arg - input file - default stdin | 92 | |
| 93 | * -out arg - output file - default stdout | 93 | static struct { |
| 94 | * -noout - do not print the ec parameter | 94 | int C; |
| 95 | * -text - print the ec parameters in text form | 95 | int asn1_flag; |
| 96 | * -check - validate the ec parameters | 96 | int check; |
| 97 | * -C - print a 'C' function creating the parameters | 97 | char *curve_name; |
| 98 | * -name arg - use the ec parameters with 'short name' name | 98 | char *engine; |
| 99 | * -list_curves - prints a list of all currently available curve 'short names' | 99 | point_conversion_form_t form; |
| 100 | * -conv_form arg - specifies the point conversion form | 100 | int genkey; |
| 101 | * - possible values: compressed | 101 | char *infile; |
| 102 | * uncompressed (default) | 102 | int informat; |
| 103 | * hybrid | 103 | int list_curves; |
| 104 | * -param_enc arg - specifies the way the ec parameters are encoded | 104 | int new_asn1_flag; |
| 105 | * in the asn1 der encoding | 105 | int new_form; |
| 106 | * possible values: named_curve (default) | 106 | int no_seed; |
| 107 | * explicit | 107 | int noout; |
| 108 | * -no_seed - if 'explicit' parameters are chosen do not use the seed | 108 | char *outfile; |
| 109 | * -genkey - generate ec key | 109 | int outformat; |
| 110 | * -engine e - use engine e, possibly a hardware device | 110 | int text; |
| 111 | */ | 111 | } ecparam_config; |
| 112 | 112 | ||
| 113 | static int | ||
| 114 | ecparam_opt_form(struct option *opt, char *arg) | ||
| 115 | { | ||
| 116 | if (strcmp(arg, "compressed") == 0) | ||
| 117 | ecparam_config.form = POINT_CONVERSION_COMPRESSED; | ||
| 118 | else if (strcmp(arg, "uncompressed") == 0) | ||
| 119 | ecparam_config.form = POINT_CONVERSION_UNCOMPRESSED; | ||
| 120 | else if (strcmp(arg, "hybrid") == 0) | ||
| 121 | ecparam_config.form = POINT_CONVERSION_HYBRID; | ||
| 122 | else | ||
| 123 | return (1); | ||
| 124 | |||
| 125 | ecparam_config.new_form = 1; | ||
| 126 | return (0); | ||
| 127 | } | ||
| 113 | 128 | ||
| 114 | static int ecparam_print_var(BIO *, BIGNUM *, const char *, int, unsigned char *); | 129 | static int |
| 130 | ecparam_opt_enctype(struct option *opt, char *arg) | ||
| 131 | { | ||
| 132 | if (strcmp(arg, "explicit") == 0) | ||
| 133 | ecparam_config.asn1_flag = 0; | ||
| 134 | else if (strcmp(arg, "named_curve") == 0) | ||
| 135 | ecparam_config.asn1_flag = OPENSSL_EC_NAMED_CURVE; | ||
| 136 | else | ||
| 137 | return (1); | ||
| 138 | |||
| 139 | ecparam_config.new_asn1_flag = 1; | ||
| 140 | return (0); | ||
| 141 | } | ||
| 142 | |||
| 143 | struct option ecparam_options[] = { | ||
| 144 | { | ||
| 145 | .name = "C", | ||
| 146 | .desc = "Convert the EC parameters into C code", | ||
| 147 | .type = OPTION_FLAG, | ||
| 148 | .opt.flag = &ecparam_config.C, | ||
| 149 | }, | ||
| 150 | { | ||
| 151 | .name = "check", | ||
| 152 | .desc = "Validate the elliptic curve parameters", | ||
| 153 | .type = OPTION_FLAG, | ||
| 154 | .opt.flag = &ecparam_config.check, | ||
| 155 | }, | ||
| 156 | { | ||
| 157 | .name = "conv_form", | ||
| 158 | .argname = "form", | ||
| 159 | .desc = "Specify point conversion form:\n" | ||
| 160 | " compressed, uncompressed (default), hybrid", | ||
| 161 | .type = OPTION_ARG_FUNC, | ||
| 162 | .func = ecparam_opt_form, | ||
| 163 | }, | ||
| 164 | #ifndef OPENSSL_NO_ENGINE | ||
| 165 | { | ||
| 166 | .name = "engine", | ||
| 167 | .argname = "id", | ||
| 168 | .desc = "Use the engine specified by the given identifier", | ||
| 169 | .type = OPTION_ARG, | ||
| 170 | .opt.arg = &ecparam_config.engine, | ||
| 171 | }, | ||
| 172 | #endif | ||
| 173 | { | ||
| 174 | .name = "genkey", | ||
| 175 | .desc = "Generate an EC private key using the specified " | ||
| 176 | "parameters", | ||
| 177 | .type = OPTION_FLAG, | ||
| 178 | .opt.flag = &ecparam_config.genkey, | ||
| 179 | }, | ||
| 180 | { | ||
| 181 | .name = "in", | ||
| 182 | .argname = "file", | ||
| 183 | .desc = "Input file to read parameters from (default stdin)", | ||
| 184 | .type = OPTION_ARG, | ||
| 185 | .opt.arg = &ecparam_config.infile, | ||
| 186 | }, | ||
| 187 | { | ||
| 188 | .name = "inform", | ||
| 189 | .argname = "format", | ||
| 190 | .desc = "Input format (DER or PEM)", | ||
| 191 | .type = OPTION_ARG_FORMAT, | ||
| 192 | .opt.value = &ecparam_config.informat, | ||
| 193 | }, | ||
| 194 | { | ||
| 195 | .name = "list_curves", | ||
| 196 | .desc = "Print list of all currently implemented EC " | ||
| 197 | "parameter names", | ||
| 198 | .type = OPTION_FLAG, | ||
| 199 | .opt.flag = &ecparam_config.list_curves, | ||
| 200 | }, | ||
| 201 | { | ||
| 202 | .name = "name", | ||
| 203 | .argname = "curve", | ||
| 204 | .desc = "Use the EC parameters with the specified name", | ||
| 205 | .type = OPTION_ARG, | ||
| 206 | .opt.arg = &ecparam_config.curve_name, | ||
| 207 | }, | ||
| 208 | { | ||
| 209 | .name = "no_seed", | ||
| 210 | .desc = "Do not output seed with explicit parameter encoding", | ||
| 211 | .type = OPTION_FLAG, | ||
| 212 | .opt.flag = &ecparam_config.no_seed, | ||
| 213 | }, | ||
| 214 | { | ||
| 215 | .name = "noout", | ||
| 216 | .desc = "Do not output encoded version of EC parameters", | ||
| 217 | .type = OPTION_FLAG, | ||
| 218 | .opt.flag = &ecparam_config.noout, | ||
| 219 | }, | ||
| 220 | { | ||
| 221 | .name = "out", | ||
| 222 | .argname = "file", | ||
| 223 | .desc = "Output file to write parameters to (default stdout)", | ||
| 224 | .type = OPTION_ARG, | ||
| 225 | .opt.arg = &ecparam_config.outfile, | ||
| 226 | }, | ||
| 227 | { | ||
| 228 | .name = "outform", | ||
| 229 | .argname = "format", | ||
| 230 | .desc = "Output format (DER or PEM)", | ||
| 231 | .type = OPTION_ARG_FORMAT, | ||
| 232 | .opt.value = &ecparam_config.outformat, | ||
| 233 | }, | ||
| 234 | { | ||
| 235 | .name = "param_enc", | ||
| 236 | .argname = "type", | ||
| 237 | .desc = "Specify EC parameter ASN.1 encoding type:\n" | ||
| 238 | " explicit, named_curve (default)", | ||
| 239 | .type = OPTION_ARG_FUNC, | ||
| 240 | .func = ecparam_opt_enctype, | ||
| 241 | }, | ||
| 242 | { | ||
| 243 | .name = "text", | ||
| 244 | .desc = "Print out the EC parameters in human readable form", | ||
| 245 | .type = OPTION_FLAG, | ||
| 246 | .opt.flag = &ecparam_config.text, | ||
| 247 | }, | ||
| 248 | {}, | ||
| 249 | }; | ||
| 250 | |||
| 251 | static void | ||
| 252 | ecparam_usage(void) | ||
| 253 | { | ||
| 254 | fprintf(stderr, "usage: ecparam [-C] [-check] [-conv_form arg] " | ||
| 255 | "[-engine id] [-genkey]\n" | ||
| 256 | " [-in file] [-inform DER | PEM] [-list_curves] [-name arg]\n" | ||
| 257 | " [-no_seed] [-noout] [-out file] [-outform DER | PEM]\n" | ||
| 258 | " [-param_enc arg] [-text]\n\n"); | ||
| 259 | options_usage(ecparam_options); | ||
| 260 | } | ||
| 115 | 261 | ||
| 116 | int ecparam_main(int, char **); | 262 | int ecparam_main(int, char **); |
| 117 | 263 | ||
| 118 | int | 264 | int |
| 119 | ecparam_main(int argc, char **argv) | 265 | ecparam_main(int argc, char **argv) |
| 120 | { | 266 | { |
| 267 | BIGNUM *ec_p = NULL, *ec_a = NULL, *ec_b = NULL, *ec_gen = NULL; | ||
| 268 | BIGNUM *ec_order = NULL, *ec_cofactor = NULL; | ||
| 121 | EC_GROUP *group = NULL; | 269 | EC_GROUP *group = NULL; |
| 122 | point_conversion_form_t form = POINT_CONVERSION_UNCOMPRESSED; | ||
| 123 | int new_form = 0; | ||
| 124 | int asn1_flag = OPENSSL_EC_NAMED_CURVE; | ||
| 125 | int new_asn1_flag = 0; | ||
| 126 | char *curve_name = NULL; | ||
| 127 | int list_curves = 0, no_seed = 0, check = 0, badops = 0, text = 0, | ||
| 128 | i, genkey = 0; | ||
| 129 | char *infile = NULL, *outfile = NULL, *prog; | ||
| 130 | BIO *in = NULL, *out = NULL; | ||
| 131 | int informat, outformat, noout = 0, C = 0, ret = 1; | ||
| 132 | char *engine = NULL; | ||
| 133 | |||
| 134 | BIGNUM *ec_p = NULL, *ec_a = NULL, *ec_b = NULL, *ec_gen = NULL, | ||
| 135 | *ec_order = NULL, *ec_cofactor = NULL; | ||
| 136 | unsigned char *buffer = NULL; | 270 | unsigned char *buffer = NULL; |
| 271 | BIO *in = NULL, *out = NULL; | ||
| 272 | int i, ret = 1; | ||
| 137 | 273 | ||
| 138 | informat = FORMAT_PEM; | 274 | memset(&ecparam_config, 0, sizeof(ecparam_config)); |
| 139 | outformat = FORMAT_PEM; | 275 | ecparam_config.asn1_flag = OPENSSL_EC_NAMED_CURVE; |
| 140 | 276 | ecparam_config.form = POINT_CONVERSION_UNCOMPRESSED; | |
| 141 | prog = argv[0]; | 277 | ecparam_config.informat = FORMAT_PEM; |
| 142 | argc--; | 278 | ecparam_config.outformat = FORMAT_PEM; |
| 143 | argv++; | ||
| 144 | while (argc >= 1) { | ||
| 145 | if (strcmp(*argv, "-inform") == 0) { | ||
| 146 | if (--argc < 1) | ||
| 147 | goto bad; | ||
| 148 | informat = str2fmt(*(++argv)); | ||
| 149 | } else if (strcmp(*argv, "-outform") == 0) { | ||
| 150 | if (--argc < 1) | ||
| 151 | goto bad; | ||
| 152 | outformat = str2fmt(*(++argv)); | ||
| 153 | } else if (strcmp(*argv, "-in") == 0) { | ||
| 154 | if (--argc < 1) | ||
| 155 | goto bad; | ||
| 156 | infile = *(++argv); | ||
| 157 | } else if (strcmp(*argv, "-out") == 0) { | ||
| 158 | if (--argc < 1) | ||
| 159 | goto bad; | ||
| 160 | outfile = *(++argv); | ||
| 161 | } else if (strcmp(*argv, "-text") == 0) | ||
| 162 | text = 1; | ||
| 163 | else if (strcmp(*argv, "-C") == 0) | ||
| 164 | C = 1; | ||
| 165 | else if (strcmp(*argv, "-check") == 0) | ||
| 166 | check = 1; | ||
| 167 | else if (strcmp(*argv, "-name") == 0) { | ||
| 168 | if (--argc < 1) | ||
| 169 | goto bad; | ||
| 170 | curve_name = *(++argv); | ||
| 171 | } else if (strcmp(*argv, "-list_curves") == 0) | ||
| 172 | list_curves = 1; | ||
| 173 | else if (strcmp(*argv, "-conv_form") == 0) { | ||
| 174 | if (--argc < 1) | ||
| 175 | goto bad; | ||
| 176 | ++argv; | ||
| 177 | new_form = 1; | ||
| 178 | if (strcmp(*argv, "compressed") == 0) | ||
| 179 | form = POINT_CONVERSION_COMPRESSED; | ||
| 180 | else if (strcmp(*argv, "uncompressed") == 0) | ||
| 181 | form = POINT_CONVERSION_UNCOMPRESSED; | ||
| 182 | else if (strcmp(*argv, "hybrid") == 0) | ||
| 183 | form = POINT_CONVERSION_HYBRID; | ||
| 184 | else | ||
| 185 | goto bad; | ||
| 186 | } else if (strcmp(*argv, "-param_enc") == 0) { | ||
| 187 | if (--argc < 1) | ||
| 188 | goto bad; | ||
| 189 | ++argv; | ||
| 190 | new_asn1_flag = 1; | ||
| 191 | if (strcmp(*argv, "named_curve") == 0) | ||
| 192 | asn1_flag = OPENSSL_EC_NAMED_CURVE; | ||
| 193 | else if (strcmp(*argv, "explicit") == 0) | ||
| 194 | asn1_flag = 0; | ||
| 195 | else | ||
| 196 | goto bad; | ||
| 197 | } else if (strcmp(*argv, "-no_seed") == 0) | ||
| 198 | no_seed = 1; | ||
| 199 | else if (strcmp(*argv, "-noout") == 0) | ||
| 200 | noout = 1; | ||
| 201 | else if (strcmp(*argv, "-genkey") == 0) { | ||
| 202 | genkey = 1; | ||
| 203 | } else if (strcmp(*argv, "-engine") == 0) { | ||
| 204 | if (--argc < 1) | ||
| 205 | goto bad; | ||
| 206 | engine = *(++argv); | ||
| 207 | } else { | ||
| 208 | BIO_printf(bio_err, "unknown option %s\n", *argv); | ||
| 209 | badops = 1; | ||
| 210 | break; | ||
| 211 | } | ||
| 212 | argc--; | ||
| 213 | argv++; | ||
| 214 | } | ||
| 215 | 279 | ||
| 216 | if (badops) { | 280 | if (options_parse(argc, argv, ecparam_options, NULL) != 0) { |
| 217 | bad: | 281 | ecparam_usage(); |
| 218 | BIO_printf(bio_err, "%s [options] <infile >outfile\n", prog); | ||
| 219 | BIO_printf(bio_err, "where options are\n"); | ||
| 220 | BIO_printf(bio_err, " -inform arg input format - " | ||
| 221 | "default PEM (DER or PEM)\n"); | ||
| 222 | BIO_printf(bio_err, " -outform arg output format - " | ||
| 223 | "default PEM\n"); | ||
| 224 | BIO_printf(bio_err, " -in arg input file - " | ||
| 225 | "default stdin\n"); | ||
| 226 | BIO_printf(bio_err, " -out arg output file - " | ||
| 227 | "default stdout\n"); | ||
| 228 | BIO_printf(bio_err, " -noout do not print the " | ||
| 229 | "ec parameter\n"); | ||
| 230 | BIO_printf(bio_err, " -text print the ec " | ||
| 231 | "parameters in text form\n"); | ||
| 232 | BIO_printf(bio_err, " -check validate the ec " | ||
| 233 | "parameters\n"); | ||
| 234 | BIO_printf(bio_err, " -C print a 'C' " | ||
| 235 | "function creating the parameters\n"); | ||
| 236 | BIO_printf(bio_err, " -name arg use the " | ||
| 237 | "ec parameters with 'short name' name\n"); | ||
| 238 | BIO_printf(bio_err, " -list_curves prints a list of " | ||
| 239 | "all currently available curve 'short names'\n"); | ||
| 240 | BIO_printf(bio_err, " -conv_form arg specifies the " | ||
| 241 | "point conversion form \n"); | ||
| 242 | BIO_printf(bio_err, " possible values:" | ||
| 243 | " compressed\n"); | ||
| 244 | BIO_printf(bio_err, " " | ||
| 245 | " uncompressed (default)\n"); | ||
| 246 | BIO_printf(bio_err, " " | ||
| 247 | " hybrid\n"); | ||
| 248 | BIO_printf(bio_err, " -param_enc arg specifies the way" | ||
| 249 | " the ec parameters are encoded\n"); | ||
| 250 | BIO_printf(bio_err, " in the asn1 der " | ||
| 251 | "encoding\n"); | ||
| 252 | BIO_printf(bio_err, " possible values:" | ||
| 253 | " named_curve (default)\n"); | ||
| 254 | BIO_printf(bio_err, " " | ||
| 255 | " explicit\n"); | ||
| 256 | BIO_printf(bio_err, " -no_seed if 'explicit'" | ||
| 257 | " parameters are chosen do not" | ||
| 258 | " use the seed\n"); | ||
| 259 | BIO_printf(bio_err, " -genkey generate ec" | ||
| 260 | " key\n"); | ||
| 261 | BIO_printf(bio_err, " -engine e use engine e, " | ||
| 262 | "possibly a hardware device\n"); | ||
| 263 | goto end; | 282 | goto end; |
| 264 | } | 283 | } |
| 265 | 284 | ||
| @@ -269,28 +288,28 @@ bad: | |||
| 269 | ERR_print_errors(bio_err); | 288 | ERR_print_errors(bio_err); |
| 270 | goto end; | 289 | goto end; |
| 271 | } | 290 | } |
| 272 | if (infile == NULL) | 291 | if (ecparam_config.infile == NULL) |
| 273 | BIO_set_fp(in, stdin, BIO_NOCLOSE); | 292 | BIO_set_fp(in, stdin, BIO_NOCLOSE); |
| 274 | else { | 293 | else { |
| 275 | if (BIO_read_filename(in, infile) <= 0) { | 294 | if (BIO_read_filename(in, ecparam_config.infile) <= 0) { |
| 276 | perror(infile); | 295 | perror(ecparam_config.infile); |
| 277 | goto end; | 296 | goto end; |
| 278 | } | 297 | } |
| 279 | } | 298 | } |
| 280 | if (outfile == NULL) { | 299 | if (ecparam_config.outfile == NULL) { |
| 281 | BIO_set_fp(out, stdout, BIO_NOCLOSE); | 300 | BIO_set_fp(out, stdout, BIO_NOCLOSE); |
| 282 | } else { | 301 | } else { |
| 283 | if (BIO_write_filename(out, outfile) <= 0) { | 302 | if (BIO_write_filename(out, ecparam_config.outfile) <= 0) { |
| 284 | perror(outfile); | 303 | perror(ecparam_config.outfile); |
| 285 | goto end; | 304 | goto end; |
| 286 | } | 305 | } |
| 287 | } | 306 | } |
| 288 | 307 | ||
| 289 | #ifndef OPENSSL_NO_ENGINE | 308 | #ifndef OPENSSL_NO_ENGINE |
| 290 | setup_engine(bio_err, engine, 0); | 309 | setup_engine(bio_err, ecparam_config.engine, 0); |
| 291 | #endif | 310 | #endif |
| 292 | 311 | ||
| 293 | if (list_curves) { | 312 | if (ecparam_config.list_curves) { |
| 294 | EC_builtin_curve *curves = NULL; | 313 | EC_builtin_curve *curves = NULL; |
| 295 | size_t crv_len = 0; | 314 | size_t crv_len = 0; |
| 296 | size_t n = 0; | 315 | size_t n = 0; |
| @@ -298,7 +317,6 @@ bad: | |||
| 298 | crv_len = EC_get_builtin_curves(NULL, 0); | 317 | crv_len = EC_get_builtin_curves(NULL, 0); |
| 299 | 318 | ||
| 300 | curves = reallocarray(NULL, crv_len, sizeof(EC_builtin_curve)); | 319 | curves = reallocarray(NULL, crv_len, sizeof(EC_builtin_curve)); |
| 301 | |||
| 302 | if (curves == NULL) | 320 | if (curves == NULL) |
| 303 | goto end; | 321 | goto end; |
| 304 | 322 | ||
| @@ -324,7 +342,7 @@ bad: | |||
| 324 | ret = 0; | 342 | ret = 0; |
| 325 | goto end; | 343 | goto end; |
| 326 | } | 344 | } |
| 327 | if (curve_name != NULL) { | 345 | if (ecparam_config.curve_name != NULL) { |
| 328 | int nid; | 346 | int nid; |
| 329 | 347 | ||
| 330 | /* | 348 | /* |
| @@ -332,33 +350,33 @@ bad: | |||
| 332 | * secp256r1 (which are the same as the curves prime192v1 and | 350 | * secp256r1 (which are the same as the curves prime192v1 and |
| 333 | * prime256v1 defined in X9.62) | 351 | * prime256v1 defined in X9.62) |
| 334 | */ | 352 | */ |
| 335 | if (!strcmp(curve_name, "secp192r1")) { | 353 | if (!strcmp(ecparam_config.curve_name, "secp192r1")) { |
| 336 | BIO_printf(bio_err, "using curve name prime192v1 " | 354 | BIO_printf(bio_err, "using curve name prime192v1 " |
| 337 | "instead of secp192r1\n"); | 355 | "instead of secp192r1\n"); |
| 338 | nid = NID_X9_62_prime192v1; | 356 | nid = NID_X9_62_prime192v1; |
| 339 | } else if (!strcmp(curve_name, "secp256r1")) { | 357 | } else if (!strcmp(ecparam_config.curve_name, "secp256r1")) { |
| 340 | BIO_printf(bio_err, "using curve name prime256v1 " | 358 | BIO_printf(bio_err, "using curve name prime256v1 " |
| 341 | "instead of secp256r1\n"); | 359 | "instead of secp256r1\n"); |
| 342 | nid = NID_X9_62_prime256v1; | 360 | nid = NID_X9_62_prime256v1; |
| 343 | } else | 361 | } else |
| 344 | nid = OBJ_sn2nid(curve_name); | 362 | nid = OBJ_sn2nid(ecparam_config.curve_name); |
| 345 | 363 | ||
| 346 | if (nid == 0) { | 364 | if (nid == 0) { |
| 347 | BIO_printf(bio_err, "unknown curve name (%s)\n", | 365 | BIO_printf(bio_err, "unknown curve name (%s)\n", |
| 348 | curve_name); | 366 | ecparam_config.curve_name); |
| 349 | goto end; | 367 | goto end; |
| 350 | } | 368 | } |
| 351 | group = EC_GROUP_new_by_curve_name(nid); | 369 | group = EC_GROUP_new_by_curve_name(nid); |
| 352 | if (group == NULL) { | 370 | if (group == NULL) { |
| 353 | BIO_printf(bio_err, "unable to create curve (%s)\n", | 371 | BIO_printf(bio_err, "unable to create curve (%s)\n", |
| 354 | curve_name); | 372 | ecparam_config.curve_name); |
| 355 | goto end; | 373 | goto end; |
| 356 | } | 374 | } |
| 357 | EC_GROUP_set_asn1_flag(group, asn1_flag); | 375 | EC_GROUP_set_asn1_flag(group, ecparam_config.asn1_flag); |
| 358 | EC_GROUP_set_point_conversion_form(group, form); | 376 | EC_GROUP_set_point_conversion_form(group, ecparam_config.form); |
| 359 | } else if (informat == FORMAT_ASN1) { | 377 | } else if (ecparam_config.informat == FORMAT_ASN1) { |
| 360 | group = d2i_ECPKParameters_bio(in, NULL); | 378 | group = d2i_ECPKParameters_bio(in, NULL); |
| 361 | } else if (informat == FORMAT_PEM) { | 379 | } else if (ecparam_config.informat == FORMAT_PEM) { |
| 362 | group = PEM_read_bio_ECPKParameters(in, NULL, NULL, NULL); | 380 | group = PEM_read_bio_ECPKParameters(in, NULL, NULL, NULL); |
| 363 | } else { | 381 | } else { |
| 364 | BIO_printf(bio_err, "bad input format specified\n"); | 382 | BIO_printf(bio_err, "bad input format specified\n"); |
| @@ -371,20 +389,20 @@ bad: | |||
| 371 | ERR_print_errors(bio_err); | 389 | ERR_print_errors(bio_err); |
| 372 | goto end; | 390 | goto end; |
| 373 | } | 391 | } |
| 374 | if (new_form) | 392 | if (ecparam_config.new_form) |
| 375 | EC_GROUP_set_point_conversion_form(group, form); | 393 | EC_GROUP_set_point_conversion_form(group, ecparam_config.form); |
| 376 | 394 | ||
| 377 | if (new_asn1_flag) | 395 | if (ecparam_config.new_asn1_flag) |
| 378 | EC_GROUP_set_asn1_flag(group, asn1_flag); | 396 | EC_GROUP_set_asn1_flag(group, ecparam_config.asn1_flag); |
| 379 | 397 | ||
| 380 | if (no_seed) { | 398 | if (ecparam_config.no_seed) |
| 381 | EC_GROUP_set_seed(group, NULL, 0); | 399 | EC_GROUP_set_seed(group, NULL, 0); |
| 382 | } | 400 | |
| 383 | if (text) { | 401 | if (ecparam_config.text) { |
| 384 | if (!ECPKParameters_print(out, group, 0)) | 402 | if (!ECPKParameters_print(out, group, 0)) |
| 385 | goto end; | 403 | goto end; |
| 386 | } | 404 | } |
| 387 | if (check) { | 405 | if (ecparam_config.check) { |
| 388 | if (group == NULL) | 406 | if (group == NULL) |
| 389 | BIO_printf(bio_err, "no elliptic curve parameters\n"); | 407 | BIO_printf(bio_err, "no elliptic curve parameters\n"); |
| 390 | BIO_printf(bio_err, "checking elliptic curve parameters: "); | 408 | BIO_printf(bio_err, "checking elliptic curve parameters: "); |
| @@ -395,7 +413,7 @@ bad: | |||
| 395 | BIO_printf(bio_err, "ok\n"); | 413 | BIO_printf(bio_err, "ok\n"); |
| 396 | 414 | ||
| 397 | } | 415 | } |
| 398 | if (C) { | 416 | if (ecparam_config.C) { |
| 399 | size_t buf_len = 0, tmp_len = 0; | 417 | size_t buf_len = 0, tmp_len = 0; |
| 400 | const EC_POINT *point; | 418 | const EC_POINT *point; |
| 401 | int is_prime, len = 0; | 419 | int is_prime, len = 0; |
| @@ -413,7 +431,7 @@ bad: | |||
| 413 | 431 | ||
| 414 | if (is_prime) { | 432 | if (is_prime) { |
| 415 | if (!EC_GROUP_get_curve_GFp(group, ec_p, ec_a, | 433 | if (!EC_GROUP_get_curve_GFp(group, ec_p, ec_a, |
| 416 | ec_b, NULL)) | 434 | ec_b, NULL)) |
| 417 | goto end; | 435 | goto end; |
| 418 | } else { | 436 | } else { |
| 419 | /* TODO */ | 437 | /* TODO */ |
| @@ -517,10 +535,10 @@ bad: | |||
| 517 | BIO_printf(out, "\t\t}\n"); | 535 | BIO_printf(out, "\t\t}\n"); |
| 518 | BIO_printf(out, "\treturn(group);\n\t}\n"); | 536 | BIO_printf(out, "\treturn(group);\n\t}\n"); |
| 519 | } | 537 | } |
| 520 | if (!noout) { | 538 | if (!ecparam_config.noout) { |
| 521 | if (outformat == FORMAT_ASN1) | 539 | if (ecparam_config.outformat == FORMAT_ASN1) |
| 522 | i = i2d_ECPKParameters_bio(out, group); | 540 | i = i2d_ECPKParameters_bio(out, group); |
| 523 | else if (outformat == FORMAT_PEM) | 541 | else if (ecparam_config.outformat == FORMAT_PEM) |
| 524 | i = PEM_write_bio_ECPKParameters(out, group); | 542 | i = PEM_write_bio_ECPKParameters(out, group); |
| 525 | else { | 543 | else { |
| 526 | BIO_printf(bio_err, "bad output format specified for" | 544 | BIO_printf(bio_err, "bad output format specified for" |
| @@ -534,7 +552,7 @@ bad: | |||
| 534 | goto end; | 552 | goto end; |
| 535 | } | 553 | } |
| 536 | } | 554 | } |
| 537 | if (genkey) { | 555 | if (ecparam_config.genkey) { |
| 538 | EC_KEY *eckey = EC_KEY_new(); | 556 | EC_KEY *eckey = EC_KEY_new(); |
| 539 | 557 | ||
| 540 | if (eckey == NULL) | 558 | if (eckey == NULL) |
| @@ -549,9 +567,9 @@ bad: | |||
| 549 | EC_KEY_free(eckey); | 567 | EC_KEY_free(eckey); |
| 550 | goto end; | 568 | goto end; |
| 551 | } | 569 | } |
| 552 | if (outformat == FORMAT_ASN1) | 570 | if (ecparam_config.outformat == FORMAT_ASN1) |
| 553 | i = i2d_ECPrivateKey_bio(out, eckey); | 571 | i = i2d_ECPrivateKey_bio(out, eckey); |
| 554 | else if (outformat == FORMAT_PEM) | 572 | else if (ecparam_config.outformat == FORMAT_PEM) |
| 555 | i = PEM_write_bio_ECPrivateKey(out, eckey, NULL, | 573 | i = PEM_write_bio_ECPrivateKey(out, eckey, NULL, |
| 556 | NULL, 0, NULL, NULL); | 574 | NULL, 0, NULL, NULL); |
| 557 | else { | 575 | else { |
