From 2af52de7b5c414bf73302a2495c21dcb2db3b90c Mon Sep 17 00:00:00 2001 From: "Dr. Stephen Henson" Date: Wed, 14 Aug 2002 00:48:02 +0000 Subject: [PATCH 01/55] Fix typo in OBJ_txt2obj which incorrectly passed the content length, instead of the encoding length to d2i_ASN1_OBJECT. This wasn't visible before becuse ASN1_get_object() used to read past the length of the supplied buffer. --- CHANGES | 6 ++++++ crypto/objects/obj_dat.c | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 15b69a3f3..c6b51e9f2 100644 --- a/CHANGES +++ b/CHANGES @@ -1908,6 +1908,12 @@ des-cbc 3624.96k 5258.21k 5530.91k 5624.30k 5628.26k *) Clean old EAY MD5 hack from e_os.h. [Richard Levitte] + Changes between 0.9.6g and 0.9.6h [xx XXX xxxx] + + *) Fix typo in OBJ_txt2obj which incorrectly passed the content + length, instead of the encoding length to d2i_ASN1_OBJECT. + [Steve Henson] + Changes between 0.9.6f and 0.9.6g [9 Aug 2002] *) [In 0.9.6g-engine release:] diff --git a/crypto/objects/obj_dat.c b/crypto/objects/obj_dat.c index 02c3719f0..ce779dc1b 100644 --- a/crypto/objects/obj_dat.c +++ b/crypto/objects/obj_dat.c @@ -425,7 +425,7 @@ ASN1_OBJECT *OBJ_txt2obj(const char *s, int no_name) a2d_ASN1_OBJECT(p,i,s,-1); p=buf; - op=d2i_ASN1_OBJECT(NULL,&p,i); + op=d2i_ASN1_OBJECT(NULL,&p,j); OPENSSL_free(buf); return op; } From 49a0f77867627993c0936ac40f086df5fbc7d090 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Wed, 14 Aug 2002 10:49:29 +0000 Subject: [PATCH 02/55] add 'TODO' items --- CHANGES | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES b/CHANGES index c6b51e9f2..d16f2397d 100644 --- a/CHANGES +++ b/CHANGES @@ -16,6 +16,8 @@ cipher suites correctly. [Nils Gura and Douglas Stebila (Sun Microsystems Laboratories)] *) Add ECDH in new directory crypto/ecdh/. +TODO: more general interface (return x coordinate, not its hash) +TODO: bug: pad x with leading zeros if necessary [Douglas Stebila (Sun Microsystems Laboratories)] *) Let BN_rand_range() abort with an error after 100 iterations From 749d055ebaefa2098cfe598ef269efbd6c1e3459 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Wed, 14 Aug 2002 11:07:29 +0000 Subject: [PATCH 03/55] move a TODO from CHANGES to STATUS --- CHANGES | 3 --- STATUS | 5 ++++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index d16f2397d..0eac5f617 100644 --- a/CHANGES +++ b/CHANGES @@ -9,9 +9,6 @@ the "ECCdraft" ciphersuite group alias can be used to select them. [Vipul Gupta and Sumit Gupta (Sun Microsystems Laboratories)] -TODO: COMPLEMENTOFALL and COMPLEMENTOFDEFAULT do not handle ECCdraft -cipher suites correctly. - *) Add ECDH engine support. [Nils Gura and Douglas Stebila (Sun Microsystems Laboratories)] diff --git a/STATUS b/STATUS index 5731aae29..40f6414d2 100644 --- a/STATUS +++ b/STATUS @@ -1,6 +1,6 @@ OpenSSL STATUS Last modified at - ______________ $Date: 2002/08/12 06:53:17 $ + ______________ $Date: 2002/08/14 11:07:29 $ DEVELOPMENT STATE @@ -58,6 +58,9 @@ NEEDS PATCH + o 0.9.8-dev: COMPLEMENTOFALL and COMPLEMENTOFDEFAULT do not + handle ECCdraft cipher suites correctly. + o apps/ca.c: "Sign the certificate?" - "n" creates empty certificate file o "OpenSSL STATUS" is never up-to-date. From b44069730b63600dc57b553ba72c4a11551aa690 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Wed, 14 Aug 2002 11:08:43 +0000 Subject: [PATCH 04/55] Make sure that the test input file comes in the same record format as the typical output from a program in C. PR: 222 --- test/tcrl.com | 4 +++- test/testenc.com | 4 +++- test/tpkcs7.com | 4 +++- test/tpkcs7d.com | 4 +++- test/treq.com | 4 +++- test/trsa.com | 4 +++- test/tsid.com | 4 +++- test/tx509.com | 4 +++- 8 files changed, 24 insertions(+), 8 deletions(-) diff --git a/test/tcrl.com b/test/tcrl.com index 2e6ab2814..86bf9735a 100644 --- a/test/tcrl.com +++ b/test/tcrl.com @@ -13,7 +13,9 @@ $ write sys$output "testing CRL conversions" $ if f$search("fff.*") .nes "" then delete fff.*;* $ if f$search("ff.*") .nes "" then delete ff.*;* $ if f$search("f.*") .nes "" then delete f.*;* -$ copy 't' fff.p +$ convert/fdl=sys$input: 't' fff.p +RECORD + FORMAT STREAM_LF $ $ write sys$output "p -> d" $ 'cmd' -in fff.p -inform p -outform d -out f.d diff --git a/test/testenc.com b/test/testenc.com index 3b66f2e0d..c24fa388c 100644 --- a/test/testenc.com +++ b/test/testenc.com @@ -9,7 +9,9 @@ $ test := p.txt $ cmd := mcr 'exe_dir'openssl $ $ if f$search(test) .nes. "" then delete 'test';* -$ copy 'testsrc' 'test' +$ convert/fdl=sys$input: 'testsrc' 'test' +RECORD + FORMAT STREAM_LF $ $ if f$search(test+"-cipher") .nes. "" then delete 'test'-cipher;* $ if f$search(test+"-clear") .nes. "" then delete 'test'-clear;* diff --git a/test/tpkcs7.com b/test/tpkcs7.com index 9e345937c..047834fba 100644 --- a/test/tpkcs7.com +++ b/test/tpkcs7.com @@ -13,7 +13,9 @@ $ write sys$output "testing PKCS7 conversions" $ if f$search("fff.*") .nes "" then delete fff.*;* $ if f$search("ff.*") .nes "" then delete ff.*;* $ if f$search("f.*") .nes "" then delete f.*;* -$ copy 't' fff.p +$ convert/fdl=sys$input: 't' fff.p +RECORD + FORMAT STREAM_LF $ $ write sys$output "p -> d" $ 'cmd' -in fff.p -inform p -outform d -out f.d diff --git a/test/tpkcs7d.com b/test/tpkcs7d.com index 7d4f8794a..193bb7213 100644 --- a/test/tpkcs7d.com +++ b/test/tpkcs7d.com @@ -13,7 +13,9 @@ $ write sys$output "testing PKCS7 conversions (2)" $ if f$search("fff.*") .nes "" then delete fff.*;* $ if f$search("ff.*") .nes "" then delete ff.*;* $ if f$search("f.*") .nes "" then delete f.*;* -$ copy 't' fff.p +$ convert/fdl=sys$input: 't' fff.p +RECORD + FORMAT STREAM_LF $ $ write sys$output "p -> d" $ 'cmd' -in fff.p -inform p -outform d -out f.d diff --git a/test/treq.com b/test/treq.com index 22c22c3aa..5524e485b 100644 --- a/test/treq.com +++ b/test/treq.com @@ -13,7 +13,9 @@ $ write sys$output "testing req conversions" $ if f$search("fff.*") .nes "" then delete fff.*;* $ if f$search("ff.*") .nes "" then delete ff.*;* $ if f$search("f.*") .nes "" then delete f.*;* -$ copy 't' fff.p +$ convert/fdl=sys$input: 't' fff.p +RECORD + FORMAT STREAM_LF $ $ write sys$output "p -> d" $ 'cmd' -in fff.p -inform p -outform d -out f.d diff --git a/test/trsa.com b/test/trsa.com index 6b6c318e2..6dbe59ef6 100644 --- a/test/trsa.com +++ b/test/trsa.com @@ -24,7 +24,9 @@ $ write sys$output "testing RSA conversions" $ if f$search("fff.*") .nes "" then delete fff.*;* $ if f$search("ff.*") .nes "" then delete ff.*;* $ if f$search("f.*") .nes "" then delete f.*;* -$ copy 't' fff.p +$ convert/fdl=sys$input: 't' fff.p +RECORD + FORMAT STREAM_LF $ $ write sys$output "p -> d" $ 'cmd' -in fff.p -inform p -outform d -out f.d diff --git a/test/tsid.com b/test/tsid.com index bde23f9bb..abd1d4d73 100644 --- a/test/tsid.com +++ b/test/tsid.com @@ -13,7 +13,9 @@ $ write sys$output "testing session-id conversions" $ if f$search("fff.*") .nes "" then delete fff.*;* $ if f$search("ff.*") .nes "" then delete ff.*;* $ if f$search("f.*") .nes "" then delete f.*;* -$ copy 't' fff.p +$ convert/fdl=sys$input: 't' fff.p +RECORD + FORMAT STREAM_LF $ $ write sys$output "p -> d" $ 'cmd' -in fff.p -inform p -outform d -out f.d diff --git a/test/tx509.com b/test/tx509.com index 985969c56..7b2592f77 100644 --- a/test/tx509.com +++ b/test/tx509.com @@ -13,7 +13,9 @@ $ write sys$output "testing X509 conversions" $ if f$search("fff.*") .nes "" then delete fff.*;* $ if f$search("ff.*") .nes "" then delete ff.*;* $ if f$search("f.*") .nes "" then delete f.*;* -$ copy 't' fff.p +$ convert/fdl=sys$input: 't' fff.p +RECORD + FORMAT STREAM_LF $ $ write sys$output "p -> d" $ 'cmd' -in fff.p -inform p -outform d -out f.d From bf625abe295000cc8526ee1ca3a1363cf6bf1f03 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Wed, 14 Aug 2002 11:16:20 +0000 Subject: [PATCH 05/55] The applications 'ecdsa' and 'ecparam' were missing from the VMS build. --- apps/makeapps.com | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/makeapps.com b/apps/makeapps.com index 2e666368b..546e5f8c1 100644 --- a/apps/makeapps.com +++ b/apps/makeapps.com @@ -155,13 +155,13 @@ $! Define The Application Files. $! $ LIB_FILES = "VERIFY;ASN1PARS;REQ;DGST;DH;DHPARAM;ENC;PASSWD;GENDH;ERRSTR;"+- "CA;PKCS7;CRL2P7;CRL;"+- - "RSA;RSAUTL;DSA;DSAPARAM;"+- + "RSA;RSAUTL;DSA;DSAPARAM;ECDSA;ECPARAM;"+- "X509;GENRSA;GENDSA;S_SERVER;S_CLIENT;SPEED;"+- "S_TIME;APPS;S_CB;S_SOCKET;APP_RAND;VERSION;SESS_ID;"+- "CIPHERS;NSEQ;PKCS12;PKCS8;SPKAC;SMIME;RAND;ENGINE;OCSP" $ APP_FILES := OPENSSL,'OBJ_DIR'VERIFY.OBJ,ASN1PARS.OBJ,REQ.OBJ,DGST.OBJ,DH.OBJ,DHPARAM.OBJ,ENC.OBJ,PASSWD.OBJ,GENDH.OBJ,ERRSTR.OBJ,- CA.OBJ,PKCS7.OBJ,CRL2P7.OBJ,CRL.OBJ,- - RSA.OBJ,RSAUTL.OBJ,DSA.OBJ,DSAPARAM.OBJ,- + RSA.OBJ,RSAUTL.OBJ,DSA.OBJ,DSAPARAM.OBJ,ECDSA.OBJ,ECPARAM.OBJ,- X509.OBJ,GENRSA.OBJ,GENDSA.OBJ,S_SERVER.OBJ,S_CLIENT.OBJ,SPEED.OBJ,- S_TIME.OBJ,APPS.OBJ,S_CB.OBJ,S_SOCKET.OBJ,APP_RAND.OBJ,VERSION.OBJ,SESS_ID.OBJ,- CIPHERS.OBJ,NSEQ.OBJ,PKCS12.OBJ,PKCS8.OBJ,SPKAC.OBJ,SMIME.OBJ,RAND.OBJ,ENGINE.OBJ,OCSP.OBJ From 90f5a2b6fedaa952d015bb845ca075ef2eeba566 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Wed, 14 Aug 2002 12:16:27 +0000 Subject: [PATCH 06/55] Instead of returning errors when certain flags are unusable, just ignore them. That will make the test go through even if DH (or in some cases ECDH) aren't built into OpenSSL. PR: 216, part 2 --- ssl/ssltest.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/ssl/ssltest.c b/ssl/ssltest.c index 30473b5ff..c84c643c2 100644 --- a/ssl/ssltest.c +++ b/ssl/ssltest.c @@ -418,12 +418,22 @@ int main(int argc, char *argv[]) debug=1; else if (strcmp(*argv,"-reuse") == 0) reuse=1; -#ifndef OPENSSL_NO_DH else if (strcmp(*argv,"-dhe1024") == 0) + { +#ifndef OPENSSL_NO_DH dhe1024=1; - else if (strcmp(*argv,"-dhe1024dsa") == 0) - dhe1024dsa=1; +#else + fprintf(stderr,"ignoring -dhe1024, since I'm compiled without DH\n"; #endif + } + else if (strcmp(*argv,"-dhe1024dsa") == 0) + { +#ifndef OPENSSL_NO_DH + dhe1024dsa=1; +#else + fprintf(stderr,"ignoring -dhe1024, since I'm compiled without DH\n"; +#endif + } else if (strcmp(*argv,"-no_dhe") == 0) no_dhe=1; else if (strcmp(*argv,"-no_ecdhe") == 0) @@ -514,13 +524,16 @@ int main(int argc, char *argv[]) { comp = COMP_RLE; } -#ifndef OPENSSL_NO_ECDH else if (strcmp(*argv,"-named_curve") == 0) { if (--argc < 1) goto bad; +#ifndef OPENSSL_NO_ECDH named_curve = *(++argv); - } +#else + fprintf(stderr,"ignoring -named_curve, since I'm compiled without ECDH\n" + ++argv; #endif + } else if (strcmp(*argv,"-app_verify") == 0) { app_verify = 1; From 623e9e66c0de2981420af35c9f06b2c900538d22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Wed, 14 Aug 2002 14:04:24 +0000 Subject: [PATCH 07/55] change how pod2man is handled: explicitly invoke '$PERL' only when needed, call 'pod2man' directly if this works PR: 217 --- Makefile.org | 6 +++--- util/pod2mantest | 22 +++++++++++++--------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/Makefile.org b/Makefile.org index 1db864b27..d87dfa3f7 100644 --- a/Makefile.org +++ b/Makefile.org @@ -743,13 +743,13 @@ install_docs: $(INSTALL_PREFIX)$(MANDIR)/man3 \ $(INSTALL_PREFIX)$(MANDIR)/man5 \ $(INSTALL_PREFIX)$(MANDIR)/man7 - @pod2man=`cd util; ./pod2mantest ignore`; \ + @pod2man="`cd util; ./pod2mantest $(PERL)`"; \ for i in doc/apps/*.pod; do \ fn=`basename $$i .pod`; \ if [ "$$fn" = "config" ]; then sec=5; else sec=1; fi; \ echo "installing man$$sec/`basename $$i .pod`.$$sec"; \ (cd `$(PERL) util/dirname.pl $$i`; \ - sh -c "$(PERL) $$pod2man \ + sh -c "$$pod2man \ --section=$$sec --center=OpenSSL \ --release=$(VERSION) `basename $$i`") \ > $(INSTALL_PREFIX)$(MANDIR)/man$$sec/`basename $$i .pod`.$$sec; \ @@ -759,7 +759,7 @@ install_docs: if [ "$$fn" = "des_modes" ]; then sec=7; else sec=3; fi; \ echo "installing man$$sec/`basename $$i .pod`.$$sec"; \ (cd `$(PERL) util/dirname.pl $$i`; \ - sh -c "$(PERL) $$pod2man \ + sh -c "$$pod2man \ --section=$$sec --center=OpenSSL \ --release=$(VERSION) `basename $$i`") \ > $(INSTALL_PREFIX)$(MANDIR)/man$$sec/`basename $$i .pod`.$$sec; \ diff --git a/util/pod2mantest b/util/pod2mantest index e01c6192a..412ca8d6d 100755 --- a/util/pod2mantest +++ b/util/pod2mantest @@ -12,7 +12,8 @@ IFS=: if test "$OSTYPE" = "msdosdjgpp"; then IFS=";"; fi -try_without_dir=false + +try_without_dir=true # First we try "pod2man", then "$dir/pod2man" for each item in $PATH. for dir in dummy${IFS}$PATH; do if [ "$try_without_dir" = true ]; then @@ -30,9 +31,16 @@ for dir in dummy${IFS}$PATH; do if [ ! "$pod2man" = '' ]; then failure=none + if "$pod2man" --section=1 --center=OpenSSL --release=dev pod2mantest.pod | fgrep OpenSSL >/dev/null; then + : + else + failure=BasicTest + fi - if "$pod2man" --section=1 --center=OpenSSL --release=dev pod2mantest.pod | grep '^MARKER - ' >/dev/null 2>&1; then - failure=MultilineTest + if [ "$failure" = none ]; then + if "$pod2man" --section=1 --center=OpenSSL --release=dev pod2mantest.pod | grep '^MARKER - ' >/dev/null; then + failure=MultilineTest + fi fi @@ -46,9 +54,5 @@ for dir in dummy${IFS}$PATH; do done echo "No working pod2man found. Consider installing a new version." >&2 -if [ "$1" = ignore ]; then - echo "As a workaround, we'll use a bundled old copy of pod2man.pl." >&2 - echo "../../util/pod2man.pl" - exit 0 -fi -exit 1 +echo "As a workaround, we'll use a bundled old copy of pod2man.pl." >&2 +echo "$1 ../../util/pod2man.pl" From 265e892fede07013088e383bc630b8186c8b6e7c Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 15 Aug 2002 08:28:38 +0000 Subject: [PATCH 08/55] Sometimes, the value of the variable containing the compiler call can become rather large. This becomes a problem when the default 1024 character large buffer that WRITE uses isn't enough. WRITE/SYMBOL uses a 2048 byte large buffer instead. --- apps/makeapps.com | 2 +- crypto/crypto-lib.com | 4 ++-- ssl/ssl-lib.com | 2 +- test/maketests.com | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/makeapps.com b/apps/makeapps.com index 546e5f8c1..b03c44535 100644 --- a/apps/makeapps.com +++ b/apps/makeapps.com @@ -1086,7 +1086,7 @@ $ CC = CC + "/DEFINE=(" + CCDEFS + ")" + CCDISABLEWARNINGS $! $! Show user the result $! -$ WRITE SYS$OUTPUT "Main Compiling Command: ",CC +$ WRITE/SYMBOL SYS$OUTPUT "Main Compiling Command: ",CC $! $! Special Threads For OpenVMS v7.1 Or Later $! diff --git a/crypto/crypto-lib.com b/crypto/crypto-lib.com index fa787867a..7fb5b4e91 100644 --- a/crypto/crypto-lib.com +++ b/crypto/crypto-lib.com @@ -1328,7 +1328,7 @@ $ CC4 = CC - CCDISABLEWARNINGS + CC4DISABLEWARNINGS $! $! Show user the result $! -$ WRITE SYS$OUTPUT "Main C Compiling Command: ",CC +$ WRITE/SYMBOL SYS$OUTPUT "Main C Compiling Command: ",CC $! $! Else The User Entered An Invalid Arguement. $! @@ -1359,7 +1359,7 @@ $ IF ARCH .EQS. "AXP" THEN MACRO = "MACRO/MIGRATION/''DEBUGGER'/''MACRO_OPTIMIZE $! $! Show user the result $! -$ WRITE SYS$OUTPUT "Main MACRO Compiling Command: ",MACRO +$ WRITE/SYMBOL SYS$OUTPUT "Main MACRO Compiling Command: ",MACRO $! $! Time to check the contents, and to make sure we get the correct library. $! diff --git a/ssl/ssl-lib.com b/ssl/ssl-lib.com index 1f1921e16..d6829a8d6 100644 --- a/ssl/ssl-lib.com +++ b/ssl/ssl-lib.com @@ -1067,7 +1067,7 @@ $ ENDIF $! $! Show user the result $! -$ WRITE SYS$OUTPUT "Main Compiling Command: ",CC +$ WRITE/SYMBOL SYS$OUTPUT "Main Compiling Command: ",CC $! $! Else The User Entered An Invalid Arguement. $! diff --git a/test/maketests.com b/test/maketests.com index 66d79a21a..0026cf003 100644 --- a/test/maketests.com +++ b/test/maketests.com @@ -888,7 +888,7 @@ $ CC = CC + "/DEFINE=(" + CCDEFS + ")" + CCDISABLEWARNINGS $! $! Show user the result $! -$ WRITE SYS$OUTPUT "Main Compiling Command: ",CC +$ WRITE/SYMBOL SYS$OUTPUT "Main Compiling Command: ",CC $! $! Else The User Entered An Invalid Arguement. $! From 7eb18f1237f517d7072c6d5d4602b68c8e0a1a21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Thu, 15 Aug 2002 09:21:31 +0000 Subject: [PATCH 09/55] Simplify handling of named curves: get rid of EC_GROUP_new_by_name(), EC_GROUP_new_by_nid() should be enough. This avoids a lot of redundancy. Submitted by: Nils Larsch --- CHANGES | 3 +- apps/ecparam.c | 103 +-- apps/s_server.c | 2 +- apps/speed.c | 30 +- crypto/ec/Makefile.ssl | 11 +- crypto/ec/ec.h | 234 ++--- crypto/ec/ec_asn1.c | 2 +- crypto/ec/ec_curve.c | 1873 ++++++++++++++++++++++---------------- crypto/ec/ec_err.c | 17 +- crypto/ecdh/ecdhtest.c | 32 +- crypto/ecdsa/ecdsatest.c | 36 +- util/libeay.num | 13 +- 12 files changed, 1283 insertions(+), 1073 deletions(-) diff --git a/CHANGES b/CHANGES index 0eac5f617..a588c7f20 100644 --- a/CHANGES +++ b/CHANGES @@ -233,9 +233,8 @@ TODO: bug: pad x with leading zeros if necessary *) Include some named elliptic curves, and add OIDs from X9.62, SECG, and WAP/WTLS. The curves can be obtained from the new - functions + function EC_GROUP_new_by_nid() - EC_GROUP_new_by_name() Also add a 'curve_name' member to EC_GROUP objects, which can be accessed via EC_GROUP_set_nid() diff --git a/apps/ecparam.c b/apps/ecparam.c index 228791dec..f7f2fafea 100644 --- a/apps/ecparam.c +++ b/apps/ecparam.c @@ -1,6 +1,6 @@ /* apps/ecparam.c */ /* - * Originally written by Nils Larsch for the OpenSSL project. + * Written by Nils Larsch for the OpenSSL project. */ /* ==================================================================== * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. @@ -92,9 +92,6 @@ #include #include #include -#ifndef OPENSSL_NO_ECDSA -#include -#endif #include #include @@ -123,80 +120,11 @@ * explicit * -no_seed - if 'explicit' parameters are choosen do not * use the seed - * -genkey - generates a ecdsa private key + * -genkey - generates a ec private key * -rand file * -engine e - use engine e, possible a hardware device */ -static const char *curve_list[67] = { - "prime192v1 - 192 bit prime curve from the X9.62 draft", - "prime192v2 - 192 bit prime curve from the X9.62 draft", - "prime192v3 - 192 bit prime curve from the X9.62 draft", - "prime239v1 - 239 bit prime curve from the X9.62 draft", - "prime239v2 - 239 bit prime curve from the X9.62 draft", - "prime239v3 - 239 bit prime curve from the X9.62 draft", - "prime256v1 - 256 bit prime curve from the X9.62 draft", - "secp112r1 - SECG recommended curve over a 112 bit prime field", - "secp112r2 - SECG recommended curve over a 112 bit prime field", - "secp128r1 - SECG recommended curve over a 128 bit prime field", - "secp128r2 - SECG recommended curve over a 128 bit prime field", - "secp160k1 - SECG recommended curve over a 160 bit prime field", - "secp160r1 - SECG recommended curve over a 160 bit prime field", - "secp160r2 - SECG recommended curve over a 160 bit prime field", - "secp192k1 - SECG recommended curve over a 192 bit prime field", - "prime192v1 - SECG recommended curve over a 192 bit prime field (aka secp192r1)", - "secp224k1 - SECG recommended curve over a 224 bit prime field", - "secp224r1 - SECG/NIST recommended curve over a 224 bit prime field", - "secp256k1 - SECG recommended curve over a 256 bit prime field", - "prime256v1 - SECG recommended curve over a 256 bit prime field (aka secp256r1)", - "secp384r1 - SECG/NIST recommended curve over a 384 bit prime field", - "secp521r1 - SECG/NIST recommended curve over a 521 bit prime field", - "wap-wsg-idm-ecid-wtls6 - 112 bit prime curve from the WTLS standard", - "wap-wsg-idm-ecid-wtls8 - 112 bit prime curve from the WTLS standard", - "wap-wsg-idm-ecid-wtls7 - 160 bit prime curve from the WTLS standard", - "wap-wsg-idm-ecid-wtls9 - 160 bit prime curve from the WTLS standard", - "wap-wsg-idm-ecid-wtls12 - 224 bit prime curve from the WTLS standard", - "c2pnb163v1 - 163 bit binary curve from the X9.62 draft", - "c2pnb163v2 - 163 bit binary curve from the X9.62 draft", - "c2pnb163v3 - 163 bit binary curve from the X9.62 draft", - "c2pnb176v1 - 176 bit binary curve from the X9.62 draft", - "c2tnb191v1 - 191 bit binary curve from the X9.62 draft", - "c2tnb191v2 - 191 bit binary curve from the X9.62 draft", - "c2tnb191v3 - 191 bit binary curve from the X9.62 draft", - "c2pnb208w1 - 208 bit binary curve from the X9.62 draft", - "c2tnb239v1 - 239 bit binary curve from the X9.62 draft", - "c2tnb239v2 - 239 bit binary curve from the X9.62 draft", - "c2tnb239v3 - 239 bit binary curve from the X9.62 draft", - "c2pnb272w1 - 272 bit binary curve from the X9.62 draft", - "c2pnb304w1 - 304 bit binary curve from the X9.62 draft", - "c2tnb359v1 - 359 bit binary curve from the X9.62 draft", - "c2pnb368w1 - 368 bit binary curve from the X9.62 draft", - "c2tnb431r1 - 431 bit binary curve from the X9.62 draft", - "sect113r1 - SECG recommended curve over a 113 bit binary field", - "sect113r2 - SECG recommended curve over a 113 bit binary field", - "sect131r1 - SECG recommended curve over a 131 bit binary field", - "sect131r2 - SECG recommended curve over a 131 bit binary field", - "sect163k1 - SECG/NIST recommended curve over a 163 bit binary field", - "sect163r1 - SECG recommended curve over a 163 bit binary field", - "sect163r2 - SECG/NIST recommended curve over a 163 bit binary field", - "sect193r1 - SECG recommended curve over a 193 bit binary field", - "sect193r2 - SECG recommended curve over a 193 bit binary field", - "sect233k1 - SECG/NIST recommended curve over a 233 bit binary field", - "sect233r1 - SECG/NIST recommended curve over a 233 bit binary field", - "sect239k1 - SECG recommended curve over a 239 bit binary field", - "sect283k1 - SECG/NIST recommended curve over a 283 bit binary field", - "sect283r1 - SECG/NIST recommended curve over a 283 bit binary field", - "sect409k1 - SECG/NIST recommended curve over a 409 bit binary field", - "sect409r1 - SECG/NIST recommended curve over a 409 bit binary field", - "sect571k1 - SECG/NIST recommended curve over a 571 bit binary field", - "sect571r1 - SECG/NIST recommended curve over a 571 bit binary field", - "wap-wsg-idm-ecid-wtls1 - 113 bit binary curve from the WTLS standard", - "wap-wsg-idm-ecid-wtls4 - 113 bit binary curve from the WTLS standard", - "wap-wsg-idm-ecid-wtls3 - 163 bit binary curve from the WTLS standard", - "wap-wsg-idm-ecid-wtls5 - 163 bit binary curve from the WTLS standard", - "wap-wsg-idm-ecid-wtls10 - 233 bit binary curve from the WTLS standard", - "wap-wsg-idm-ecid-wtls11 - 233 bit binary curve from the WTLS standard" -}; static int ecparam_print_var(BIO *,BIGNUM *,const char *,int,unsigned char *); @@ -376,7 +304,7 @@ bad: BIO_printf(bio_err, " -no_seed if 'explicit'" " parameters are choosen do not\n"); BIO_printf(bio_err, " use the seed\n"); - BIO_printf(bio_err, " -genkey generate ecdsa" + BIO_printf(bio_err, " -genkey generate ec" " key\n"); BIO_printf(bio_err, " -rand file files to use for" " random number input\n"); @@ -430,10 +358,27 @@ bad: { int counter=0; - for (; counter < sizeof(curve_list)/sizeof(char *); counter++) - if (BIO_printf(bio_err, " %s\n", curve_list[counter]) - <= 0) - goto end; + for (;;) + { + const char *comment; + const char *sname; + int len, nid = ec_group_index2nid(counter++); + if (!nid) + break; + comment = EC_GROUP_get0_comment(nid); + sname = OBJ_nid2sn(nid); + if (comment == NULL) + comment = ""; + 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); + } + ret = 0; goto end; } diff --git a/apps/s_server.c b/apps/s_server.c index 828d5ef3a..725efd3b1 100644 --- a/apps/s_server.c +++ b/apps/s_server.c @@ -110,7 +110,7 @@ */ /* ==================================================================== * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. - * ECDH support in OpenSSL originally developed by + * ECC cipher suite support in OpenSSL originally developed by * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project. */ diff --git a/apps/speed.c b/apps/speed.c index abcede337..84e8f98e8 100644 --- a/apps/speed.c +++ b/apps/speed.c @@ -559,22 +559,22 @@ int MAIN(int argc, char **argv) static unsigned int test_curves[EC_NUM] = { /* Prime Curves */ - EC_GROUP_SECG_PRIME_160R1, - EC_GROUP_NIST_PRIME_224, - EC_GROUP_NIST_PRIME_256, - EC_GROUP_NIST_PRIME_384, - EC_GROUP_NIST_PRIME_521, + NID_secp160r1, + NID_secp224r1, + NID_X9_62_prime256v1, + NID_secp384r1, + NID_secp521r1, /* Binary Curves */ - EC_GROUP_NIST_CHAR2_K163, - EC_GROUP_NIST_CHAR2_K233, - EC_GROUP_NIST_CHAR2_K283, - EC_GROUP_NIST_CHAR2_K409, - EC_GROUP_NIST_CHAR2_K571, - EC_GROUP_NIST_CHAR2_B163, - EC_GROUP_NIST_CHAR2_B233, - EC_GROUP_NIST_CHAR2_B283, - EC_GROUP_NIST_CHAR2_B409, - EC_GROUP_NIST_CHAR2_B571 + NID_sect163k1, + NID_sect233k1, + NID_sect283k1, + NID_sect409k1, + NID_sect571k1, + NID_sect163r2, + NID_sect233r1, + NID_sect283r1, + NID_sect409r1, + NID_sect571r1 }; static char * test_curves_names[EC_NUM] = { diff --git a/crypto/ec/Makefile.ssl b/crypto/ec/Makefile.ssl index d183f679c..431a14c8a 100644 --- a/crypto/ec/Makefile.ssl +++ b/crypto/ec/Makefile.ssl @@ -118,12 +118,11 @@ ec_check.o: ../../include/openssl/obj_mac.h ../../include/openssl/opensslconf.h ec_check.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h ec_check.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h ec_check.o: ../../include/openssl/symhacks.h ec_check.c ec_lcl.h -ec_curve.o: ../../include/openssl/asn1.h ../../include/openssl/asn1t.h -ec_curve.o: ../../include/openssl/bio.h ../../include/openssl/bn.h -ec_curve.o: ../../include/openssl/crypto.h ../../include/openssl/e_os2.h -ec_curve.o: ../../include/openssl/ec.h ../../include/openssl/err.h -ec_curve.o: ../../include/openssl/lhash.h ../../include/openssl/obj_mac.h -ec_curve.o: ../../include/openssl/opensslconf.h +ec_curve.o: ../../include/openssl/asn1.h ../../include/openssl/bio.h +ec_curve.o: ../../include/openssl/bn.h ../../include/openssl/crypto.h +ec_curve.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h +ec_curve.o: ../../include/openssl/err.h ../../include/openssl/lhash.h +ec_curve.o: ../../include/openssl/obj_mac.h ../../include/openssl/opensslconf.h ec_curve.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h ec_curve.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h ec_curve.o: ../../include/openssl/symhacks.h ec_curve.c ec_lcl.h diff --git a/crypto/ec/ec.h b/crypto/ec/ec.h index 17083f23a..4eb4ad678 100644 --- a/crypto/ec/ec.h +++ b/crypto/ec/ec.h @@ -182,94 +182,15 @@ int EC_GROUP_check_discriminant(const EC_GROUP *, BN_CTX *); EC_GROUP *EC_GROUP_new_curve_GFp(const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *); EC_GROUP *EC_GROUP_new_curve_GF2m(const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *); -/* EC_GROUP_new_by_nid() and EC_GROUP_new_by_name() also set - * generator and order */ +/* EC_GROUP_new_by_nid() creates a EC_GROUP structure specified by a NID */ EC_GROUP *EC_GROUP_new_by_nid(int nid); -EC_GROUP *EC_GROUP_new_by_name(int name); -/* Currently valid arguments to EC_GROUP_new_by_name() */ -#define EC_GROUP_NO_CURVE 0 -#define EC_GROUP_NIST_PRIME_192 NID_X9_62_prime192v1 -#define EC_GROUP_NIST_PRIME_224 NID_secp224r1 -#define EC_GROUP_NIST_PRIME_256 NID_X9_62_prime256v1 -#define EC_GROUP_NIST_PRIME_384 NID_secp384r1 -#define EC_GROUP_NIST_PRIME_521 NID_secp521r1 -#define EC_GROUP_X9_62_PRIME_192V1 NID_X9_62_prime192v1 -#define EC_GROUP_X9_62_PRIME_192V2 NID_X9_62_prime192v2 -#define EC_GROUP_X9_62_PRIME_192V3 NID_X9_62_prime192v3 -#define EC_GROUP_X9_62_PRIME_239V1 NID_X9_62_prime239v1 -#define EC_GROUP_X9_62_PRIME_239V2 NID_X9_62_prime239v2 -#define EC_GROUP_X9_62_PRIME_239V3 NID_X9_62_prime239v3 -#define EC_GROUP_X9_62_PRIME_256V1 NID_X9_62_prime256v1 -#define EC_GROUP_SECG_PRIME_112R1 NID_secp112r1 -#define EC_GROUP_SECG_PRIME_112R2 NID_secp112r2 -#define EC_GROUP_SECG_PRIME_128R1 NID_secp128r1 -#define EC_GROUP_SECG_PRIME_128R2 NID_secp128r2 -#define EC_GROUP_SECG_PRIME_160K1 NID_secp160k1 -#define EC_GROUP_SECG_PRIME_160R1 NID_secp160r1 -#define EC_GROUP_SECG_PRIME_160R2 NID_secp160r2 -#define EC_GROUP_SECG_PRIME_192K1 NID_secp192k1 -#define EC_GROUP_SECG_PRIME_192R1 NID_X9_62_prime192v1 -#define EC_GROUP_SECG_PRIME_224K1 NID_secp224k1 -#define EC_GROUP_SECG_PRIME_224R1 NID_secp224r1 -#define EC_GROUP_SECG_PRIME_256K1 NID_secp256k1 -#define EC_GROUP_SECG_PRIME_256R1 NID_X9_62_prime256v1 -#define EC_GROUP_SECG_PRIME_384R1 NID_secp384r1 -#define EC_GROUP_SECG_PRIME_521R1 NID_secp521r1 -#define EC_GROUP_WTLS_6 NID_wap_wsg_idm_ecid_wtls6 -#define EC_GROUP_WTLS_7 NID_wap_wsg_idm_ecid_wtls7 -#define EC_GROUP_WTLS_8 NID_wap_wsg_idm_ecid_wtls8 -#define EC_GROUP_WTLS_9 NID_wap_wsg_idm_ecid_wtls9 -#define EC_GROUP_WTLS_12 NID_wap_wsg_idm_ecid_wtls12 -#define EC_GROUP_NIST_CHAR2_K163 NID_sect163k1 -#define EC_GROUP_NIST_CHAR2_B163 NID_sect163r2 -#define EC_GROUP_NIST_CHAR2_K233 NID_sect233k1 -#define EC_GROUP_NIST_CHAR2_B233 NID_sect233r1 -#define EC_GROUP_NIST_CHAR2_K283 NID_sect283k1 -#define EC_GROUP_NIST_CHAR2_B283 NID_sect283r1 -#define EC_GROUP_NIST_CHAR2_K409 NID_sect409k1 -#define EC_GROUP_NIST_CHAR2_B409 NID_sect409r1 -#define EC_GROUP_NIST_CHAR2_K571 NID_sect571k1 -#define EC_GROUP_NIST_CHAR2_B571 NID_sect571r1 -#define EC_GROUP_X9_62_CHAR2_163V1 NID_X9_62_c2pnb163v1 -#define EC_GROUP_X9_62_CHAR2_163V2 NID_X9_62_c2pnb163v2 -#define EC_GROUP_X9_62_CHAR2_163V3 NID_X9_62_c2pnb163v3 -#define EC_GROUP_X9_62_CHAR2_176V1 NID_X9_62_c2pnb176v1 -#define EC_GROUP_X9_62_CHAR2_191V1 NID_X9_62_c2tnb191v1 -#define EC_GROUP_X9_62_CHAR2_191V2 NID_X9_62_c2tnb191v2 -#define EC_GROUP_X9_62_CHAR2_191V3 NID_X9_62_c2tnb191v3 -#define EC_GROUP_X9_62_CHAR2_208W1 NID_X9_62_c2pnb208w1 -#define EC_GROUP_X9_62_CHAR2_239V1 NID_X9_62_c2tnb239v1 -#define EC_GROUP_X9_62_CHAR2_239V2 NID_X9_62_c2tnb239v2 -#define EC_GROUP_X9_62_CHAR2_239V3 NID_X9_62_c2tnb239v3 -#define EC_GROUP_X9_62_CHAR2_272W1 NID_X9_62_c2pnb272w1 -#define EC_GROUP_X9_62_CHAR2_304W1 NID_X9_62_c2pnb304w1 -#define EC_GROUP_X9_62_CHAR2_359V1 NID_X9_62_c2tnb359v1 -#define EC_GROUP_X9_62_CHAR2_368W1 NID_X9_62_c2pnb368w1 -#define EC_GROUP_X9_62_CHAR2_431R1 NID_X9_62_c2tnb431r1 -#define EC_GROUP_SECG_CHAR2_113R1 NID_sect113r1 -#define EC_GROUP_SECG_CHAR2_113R2 NID_sect113r2 -#define EC_GROUP_SECG_CHAR2_131R1 NID_sect131r1 -#define EC_GROUP_SECG_CHAR2_131R2 NID_sect131r2 -#define EC_GROUP_SECG_CHAR2_163K1 NID_sect163k1 -#define EC_GROUP_SECG_CHAR2_163R1 NID_sect163r1 -#define EC_GROUP_SECG_CHAR2_163R2 NID_sect163r2 -#define EC_GROUP_SECG_CHAR2_193R1 NID_sect193r1 -#define EC_GROUP_SECG_CHAR2_193R2 NID_sect193r2 -#define EC_GROUP_SECG_CHAR2_233K1 NID_sect233k1 -#define EC_GROUP_SECG_CHAR2_233R1 NID_sect233r1 -#define EC_GROUP_SECG_CHAR2_239K1 NID_sect239k1 -#define EC_GROUP_SECG_CHAR2_283K1 NID_sect283k1 -#define EC_GROUP_SECG_CHAR2_283R1 NID_sect283r1 -#define EC_GROUP_SECG_CHAR2_409K1 NID_sect409k1 -#define EC_GROUP_SECG_CHAR2_409R1 NID_sect409r1 -#define EC_GROUP_SECG_CHAR2_571K1 NID_sect571k1 -#define EC_GROUP_SECG_CHAR2_571R1 NID_sect571r1 -#define EC_GROUP_WTLS_1 NID_wap_wsg_idm_ecid_wtls1 -#define EC_GROUP_WTLS_3 NID_wap_wsg_idm_ecid_wtls3 -#define EC_GROUP_WTLS_4 NID_wap_wsg_idm_ecid_wtls4 -#define EC_GROUP_WTLS_5 NID_wap_wsg_idm_ecid_wtls5 -#define EC_GROUP_WTLS_10 NID_wap_wsg_idm_ecid_wtls10 -#define EC_GROUP_WTLS_11 NID_wap_wsg_idm_ecid_wtls11 +/* EC_GROUP_get0_comment() returns a pointer to the 'comment' field of + * ec_curve_data_st structure */ +const char *EC_GROUP_get0_comment(int nid); +/* internal function : ec_group_index2nid() returns the NID of curve + * with the given index i from the internal curve list */ +int ec_group_index2nid(int i); + EC_POINT *EC_POINT_new(const EC_GROUP *); void EC_POINT_free(EC_POINT *); @@ -426,111 +347,109 @@ void ERR_load_EC_strings(void); /* Function codes. */ #define EC_F_COMPUTE_WNAF 143 -#define EC_F_D2I_ECPARAMETERS 155 -#define EC_F_D2I_ECPKPARAMETERS 161 -#define EC_F_D2I_ECPRIVATEKEY 168 -#define EC_F_ECPARAMETERS_PRINT 173 -#define EC_F_ECPARAMETERS_PRINT_FP 174 -#define EC_F_ECPKPARAMETERS_PRINT 166 -#define EC_F_ECPKPARAMETERS_PRINT_FP 167 -#define EC_F_ECPUBLICKEY_GET_OCTET 170 -#define EC_F_ECPUBLICKEY_SET_OCTET 171 -#define EC_F_EC_ASN1_GROUP2CURVE 159 -#define EC_F_EC_ASN1_GROUP2FIELDID 156 -#define EC_F_EC_ASN1_GROUP2PARAMETERS 160 -#define EC_F_EC_ASN1_GROUP2PKPARAMETERS 162 +#define EC_F_D2I_ECPARAMETERS 144 +#define EC_F_D2I_ECPKPARAMETERS 145 +#define EC_F_D2I_ECPRIVATEKEY 146 +#define EC_F_ECPARAMETERS_PRINT 147 +#define EC_F_ECPARAMETERS_PRINT_FP 148 +#define EC_F_ECPKPARAMETERS_PRINT 149 +#define EC_F_ECPKPARAMETERS_PRINT_FP 150 +#define EC_F_ECPUBLICKEY_GET_OCTET 151 +#define EC_F_ECPUBLICKEY_SET_OCTET 152 +#define EC_F_EC_ASN1_GROUP2CURVE 153 +#define EC_F_EC_ASN1_GROUP2FIELDID 154 +#define EC_F_EC_ASN1_GROUP2PARAMETERS 155 +#define EC_F_EC_ASN1_GROUP2PKPARAMETERS 156 #define EC_F_EC_ASN1_PARAMETERS2GROUP 157 -#define EC_F_EC_ASN1_PKPARAMETERS2GROUP 163 -#define EC_F_EC_GF2M_SIMPLE_GROUP_CHECK_DISCRIMINANT 168 -#define EC_F_EC_GF2M_SIMPLE_OCT2POINT 169 -#define EC_F_EC_GF2M_SIMPLE_POINT2OCT 170 -#define EC_F_EC_GF2M_SIMPLE_POINT_GET_AFFINE_COORDINATES 171 -#define EC_F_EC_GF2M_SIMPLE_POINT_SET_AFFINE_COORDINATES 172 -#define EC_F_EC_GF2M_SIMPLE_SET_COMPRESSED_COORDINATES 182 +#define EC_F_EC_ASN1_PKPARAMETERS2GROUP 158 +#define EC_F_EC_GF2M_SIMPLE_GROUP_CHECK_DISCRIMINANT 159 +#define EC_F_EC_GF2M_SIMPLE_OCT2POINT 160 +#define EC_F_EC_GF2M_SIMPLE_POINT2OCT 161 +#define EC_F_EC_GF2M_SIMPLE_POINT_GET_AFFINE_COORDINATES 162 +#define EC_F_EC_GF2M_SIMPLE_POINT_SET_AFFINE_COORDINATES 163 +#define EC_F_EC_GF2M_SIMPLE_SET_COMPRESSED_COORDINATES 164 #define EC_F_EC_GFP_MONT_FIELD_DECODE 133 #define EC_F_EC_GFP_MONT_FIELD_ENCODE 134 #define EC_F_EC_GFP_MONT_FIELD_MUL 131 #define EC_F_EC_GFP_MONT_FIELD_SQR 132 -#define EC_F_EC_GFP_SIMPLE_GROUP_CHECK_DISCRIMINANT 152 -#define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE 100 +#define EC_F_EC_GFP_SIMPLE_GROUP_CHECK_DISCRIMINANT 165 +#define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE 166 +#define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE_GFP 100 #define EC_F_EC_GFP_SIMPLE_GROUP_SET_GENERATOR 101 #define EC_F_EC_GFP_SIMPLE_MAKE_AFFINE 102 #define EC_F_EC_GFP_SIMPLE_OCT2POINT 103 #define EC_F_EC_GFP_SIMPLE_POINT2OCT 104 #define EC_F_EC_GFP_SIMPLE_POINTS_MAKE_AFFINE 137 -#define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES 105 -#define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES 128 -#define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES 129 -#define EC_F_EC_GROUP_CHECK 150 -#define EC_F_EC_GROUP_CHECK_DISCRIMINANT 153 +#define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES 167 +#define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES_GFP 105 +#define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES 168 +#define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES_GFP 128 +#define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES 169 +#define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES_GFP 129 +#define EC_F_EC_GROUP_CHECK 170 +#define EC_F_EC_GROUP_CHECK_DISCRIMINANT 171 #define EC_F_EC_GROUP_COPY 106 #define EC_F_EC_GROUP_GET0_GENERATOR 139 #define EC_F_EC_GROUP_GET_COFACTOR 140 -#define EC_F_EC_GROUP_GET_CURVE_GF2M 173 +#define EC_F_EC_GROUP_GET_CURVE_GF2M 172 #define EC_F_EC_GROUP_GET_CURVE_GFP 130 -#define EC_F_EC_GROUP_GET_DEGREE 174 +#define EC_F_EC_GROUP_GET_DEGREE 173 #define EC_F_EC_GROUP_GET_EXTRA_DATA 107 #define EC_F_EC_GROUP_GET_ORDER 141 #define EC_F_EC_GROUP_GROUP2NID 147 #define EC_F_EC_GROUP_NEW 108 -#define EC_F_EC_GROUP_NEW_BY_NAME 144 -#define EC_F_EC_GROUP_NEW_BY_NID 146 -#define EC_F_EC_GROUP_NEW_GF2M_FROM_HEX 175 -#define EC_F_EC_GROUP_NEW_GFP_FROM_HEX 148 +#define EC_F_EC_GROUP_NEW_BY_NID 174 +#define EC_F_EC_GROUP_NEW_FROM_DATA 175 #define EC_F_EC_GROUP_PRECOMPUTE_MULT 142 #define EC_F_EC_GROUP_SET_CURVE_GF2M 176 #define EC_F_EC_GROUP_SET_CURVE_GFP 109 #define EC_F_EC_GROUP_SET_EXTRA_DATA 110 #define EC_F_EC_GROUP_SET_GENERATOR 111 -#define EC_F_EC_KEY_CHECK_KEY 184 -#define EC_F_EC_KEY_COPY 186 -#define EC_F_EC_KEY_GENERATE_KEY 185 -#define EC_F_EC_KEY_PRINT 175 -#define EC_F_EC_KEY_PRINT_FP 176 -#define EC_F_EC_NEW 172 +#define EC_F_EC_KEY_CHECK_KEY 177 +#define EC_F_EC_KEY_COPY 178 +#define EC_F_EC_KEY_GENERATE_KEY 179 +#define EC_F_EC_KEY_PRINT 180 +#define EC_F_EC_KEY_PRINT_FP 181 +#define EC_F_EC_NEW 182 #define EC_F_EC_POINTS_MAKE_AFFINE 136 #define EC_F_EC_POINTS_MUL 138 #define EC_F_EC_POINT_ADD 112 #define EC_F_EC_POINT_CMP 113 #define EC_F_EC_POINT_COPY 114 #define EC_F_EC_POINT_DBL 115 -#define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GF2M 177 +#define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GF2M 183 #define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP 116 #define EC_F_EC_POINT_GET_JPROJECTIVE_COORDINATES_GFP 117 #define EC_F_EC_POINT_IS_AT_INFINITY 118 #define EC_F_EC_POINT_IS_ON_CURVE 119 #define EC_F_EC_POINT_MAKE_AFFINE 120 -#define EC_F_EC_POINT_MUL 179 +#define EC_F_EC_POINT_MUL 184 #define EC_F_EC_POINT_NEW 121 #define EC_F_EC_POINT_OCT2POINT 122 #define EC_F_EC_POINT_POINT2OCT 123 -#define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GF2M 180 +#define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GF2M 185 #define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP 124 -#define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GF2M 181 +#define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GF2M 186 #define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP 125 #define EC_F_EC_POINT_SET_JPROJECTIVE_COORDINATES_GFP 126 #define EC_F_EC_POINT_SET_TO_INFINITY 127 -#define EC_F_EC_WNAF_MUL 183 -#define EC_F_EC_WNAF_PRECOMPUTE_MULT 178 -#define EC_F_GFP_MONT_GROUP_SET_CURVE 135 -#define EC_F_I2D_ECDSAPARAMETERS 158 -#define EC_F_I2D_ECPARAMETERS 164 -#define EC_F_I2D_ECPKPARAMETERS 165 -#define EC_F_I2D_ECPRIVATEKEY 169 +#define EC_F_EC_WNAF_MUL 187 +#define EC_F_EC_WNAF_PRECOMPUTE_MULT 188 +#define EC_F_GFP_MONT_GROUP_SET_CURVE 189 +#define EC_F_GFP_MONT_GROUP_SET_CURVE_GFP 135 +#define EC_F_I2D_ECPARAMETERS 190 +#define EC_F_I2D_ECPKPARAMETERS 191 +#define EC_F_I2D_ECPRIVATEKEY 192 /* Reason codes. */ -#define EC_R_ASN1_ERROR 130 -#define EC_R_ASN1_UNKNOWN_FIELD 131 +#define EC_R_ASN1_ERROR 115 +#define EC_R_ASN1_UNKNOWN_FIELD 116 #define EC_R_BUFFER_TOO_SMALL 100 -#define EC_R_D2I_ECPARAMETERS_FAILURE 132 -#define EC_R_D2I_ECPKPARAMETERS_FAILURE 133 -#define EC_R_D2I_EC_PARAMETERS_FAILURE 123 +#define EC_R_D2I_ECPKPARAMETERS_FAILURE 117 #define EC_R_DISCRIMINANT_IS_ZERO 118 -#define EC_R_EC_GROUP_NEW_BY_NAME_FAILURE 124 -#define EC_R_GROUP2PARAMETERS_FAILURE 125 -#define EC_R_GROUP2PKPARAMETERS_FAILURE 134 -#define EC_R_I2D_ECPKPARAMETERS_FAILURE 135 -#define EC_R_I2D_EC_PARAMETERS_FAILURE 126 +#define EC_R_EC_GROUP_NEW_BY_NAME_FAILURE 119 +#define EC_R_GROUP2PKPARAMETERS_FAILURE 120 +#define EC_R_I2D_ECPKPARAMETERS_FAILURE 121 #define EC_R_INCOMPATIBLE_OBJECTS 101 #define EC_R_INVALID_ARGUMENT 112 #define EC_R_INVALID_COMPRESSED_POINT 110 @@ -538,25 +457,22 @@ void ERR_load_EC_strings(void); #define EC_R_INVALID_ENCODING 102 #define EC_R_INVALID_FIELD 103 #define EC_R_INVALID_FORM 104 -#define EC_R_INVALID_GROUP_ORDER 119 -#define EC_R_INVALID_PRIVATE_KEY 139 -#define EC_R_MISSING_PARAMETERS 127 -#define EC_R_MISSING_PRIVATE_KEY 138 -#define EC_R_NOT_IMPLEMENTED 136 +#define EC_R_INVALID_GROUP_ORDER 122 +#define EC_R_INVALID_PRIVATE_KEY 123 +#define EC_R_MISSING_PARAMETERS 124 +#define EC_R_MISSING_PRIVATE_KEY 125 +#define EC_R_NOT_IMPLEMENTED 126 #define EC_R_NOT_INITIALIZED 111 #define EC_R_NO_SUCH_EXTRA_DATA 105 -#define EC_R_PARAMETERS2GROUP_FAILURE 128 -#define EC_R_PKPARAMETERS2GROUP_FAILURE 137 +#define EC_R_PKPARAMETERS2GROUP_FAILURE 127 #define EC_R_POINT_AT_INFINITY 106 #define EC_R_POINT_IS_NOT_ON_CURVE 107 #define EC_R_SLOT_FULL 108 #define EC_R_UNDEFINED_GENERATOR 113 -#define EC_R_UNDEFINED_ORDER 122 -#define EC_R_UNKNOWN_GROUP 116 -#define EC_R_UNKNOWN_NID 117 +#define EC_R_UNDEFINED_ORDER 128 +#define EC_R_UNKNOWN_GROUP 129 #define EC_R_UNKNOWN_ORDER 114 -#define EC_R_UNKNOWN_PARAMETERS_TYPE 129 -#define EC_R_WRONG_ORDER 140 +#define EC_R_WRONG_ORDER 130 #ifdef __cplusplus } diff --git a/crypto/ec/ec_asn1.c b/crypto/ec/ec_asn1.c index c1879dc51..8aa07c4dc 100644 --- a/crypto/ec/ec_asn1.c +++ b/crypto/ec/ec_asn1.c @@ -770,7 +770,7 @@ EC_GROUP *EC_ASN1_pkparameters2group(const ECPKPARAMETERS *params) if (params->type == 0) { /* the curve is given by an OID */ tmp = OBJ_obj2nid(params->value.named_curve); - if ((ret = EC_GROUP_new_by_name(tmp)) == NULL) + if ((ret = EC_GROUP_new_by_nid(tmp)) == NULL) { ECerr(EC_F_EC_ASN1_PKPARAMETERS2GROUP, EC_R_EC_GROUP_NEW_BY_NAME_FAILURE); diff --git a/crypto/ec/ec_curve.c b/crypto/ec/ec_curve.c index 55ce45d8c..93f775d55 100644 --- a/crypto/ec/ec_curve.c +++ b/crypto/ec/ec_curve.c @@ -1,4 +1,7 @@ /* crypto/ec/ec_curve.c */ +/* + * Written by Nils Larsch for the OpenSSL project. + */ /* ==================================================================== * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. * @@ -82,793 +85,1141 @@ #include "ec_lcl.h" #include #include -#include -#include -/* #define _EC_GROUP_EXAMPLE_PRIME_CURVE \ - * "the prime number p", "a", "b", "the compressed base point", "y-bit", "order", "cofactor" - */ +typedef struct ec_curve_data_st { + int field_type; /* either NID_X9_62_prime_field or + * NID_X9_62_characteristic_two_field */ + const char *p; /* either a prime number or a polynomial */ + const char *a; + const char *b; + const char *x; /* the x coordinate of the generator */ + const char *y; /* the y coordinate of the generator */ + const char *order; /* the order of the group generated by the + * generator */ + const BN_ULONG cofactor;/* the cofactor */ + const unsigned char *seed;/* the seed (optional) */ + size_t seed_len; + const char *comment; /* a short (less than 80 characters) + * description of the curve */ +} EC_CURVE_DATA; + /* the nist prime curves */ -#define _EC_GROUP_NIST_PRIME_192 \ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF",\ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC",\ - "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1",\ - "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012",1,\ - "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831",1 -#define _EC_GROUP_NIST_PRIME_224 \ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001",\ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE",\ - "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4",\ - "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21",0,\ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D",1 -#define _EC_GROUP_NIST_PRIME_384 \ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF",\ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC",\ - "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF",\ - "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7",1,\ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973",1 -#define _EC_GROUP_NIST_PRIME_521 \ - "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"\ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",\ - "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"\ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC",\ - "051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B"\ - "315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00",\ - "C6858E06B70404E9CD9E3ECB662395B4429C648139053F"\ - "B521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66",0,\ - "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"\ - "FFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409",1 +static const unsigned char _EC_NIST_PRIME_192_SEED[] = { + 0x30,0x45,0xAE,0x6F,0xC8,0x42,0x2F,0x64,0xED,0x57, + 0x95,0x28,0xD3,0x81,0x20,0xEA,0xE1,0x21,0x96,0xD5}; +static const EC_CURVE_DATA _EC_NIST_PRIME_192 = { + NID_X9_62_prime_field, + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", + "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1", + "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012", + "07192b95ffc8da78631011ed6b24cdd573f977a11e794811", + "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831",1, + _EC_NIST_PRIME_192_SEED, 20, + "192 bit prime curve from the X9.62 draft" + }; + +static const unsigned char _EC_NIST_PRIME_224_SEED[] = { + 0xBD,0x71,0x34,0x47,0x99,0xD5,0xC7,0xFC,0xDC,0x45, + 0xB5,0x9F,0xA3,0xB9,0xAB,0x8F,0x6A,0x94,0x8B,0xC5}; +static const EC_CURVE_DATA _EC_NIST_PRIME_224 = { + NID_X9_62_prime_field, + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE", + "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4", + "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21", + "bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D",1, + _EC_NIST_PRIME_224_SEED, 20, + "SECG/NIST recommended curve over a 224 bit prime field" + }; + +static const unsigned char _EC_NIST_PRIME_384_SEED[] = { + 0xA3,0x35,0x92,0x6A,0xA3,0x19,0xA2,0x7A,0x1D,0x00, + 0x89,0x6A,0x67,0x73,0xA4,0x82,0x7A,0xCD,0xAC,0x73}; +static const EC_CURVE_DATA _EC_NIST_PRIME_384 = { + NID_X9_62_prime_field, + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFF" + "FFF0000000000000000FFFFFFFF", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFF" + "FFF0000000000000000FFFFFFFC", + "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC6563" + "98D8A2ED19D2A85C8EDD3EC2AEF", + "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F" + "25DBF55296C3A545E3872760AB7", + "3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b" + "1ce1d7e819d7a431d7c90ea0e5f", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0" + "DB248B0A77AECEC196ACCC52973",1, + _EC_NIST_PRIME_384_SEED, 20, + "SECG/NIST recommended curve over a 384 bit prime field" + }; + +static const unsigned char _EC_NIST_PRIME_521_SEED[] = { + 0xD0,0x9E,0x88,0x00,0x29,0x1C,0xB8,0x53,0x96,0xCC, + 0x67,0x17,0x39,0x32,0x84,0xAA,0xA0,0xDA,0x64,0xBA}; +static const EC_CURVE_DATA _EC_NIST_PRIME_521 = { + NID_X9_62_prime_field, + "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC", + "051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156" + "193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00", + "C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14" + "B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66", + "011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c9" + "7ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650", + "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51" + "868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409",1, + _EC_NIST_PRIME_521_SEED, 20, + "SECG/NIST recommended curve over a 521 bit prime field" + }; /* the x9.62 prime curves (minus the nist prime curves) */ -#define _EC_GROUP_X9_62_PRIME_192V2 \ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF",\ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC",\ - "CC22D6DFB95C6B25E49C0D6364A4E5980C393AA21668D953",\ - "EEA2BAE7E1497842F2DE7769CFE9C989C072AD696F48034A",1,\ - "FFFFFFFFFFFFFFFFFFFFFFFE5FB1A724DC80418648D8DD31",1 -#define _EC_GROUP_X9_62_PRIME_192V3 \ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF",\ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC",\ - "22123DC2395A05CAA7423DAECCC94760A7D462256BD56916",\ - "7D29778100C65A1DA1783716588DCE2B8B4AEE8E228F1896",0,\ - "FFFFFFFFFFFFFFFFFFFFFFFF7A62D031C83F4294F640EC13",1 -#define _EC_GROUP_X9_62_PRIME_239V1 \ - "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF",\ - "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC",\ - "6B016C3BDCF18941D0D654921475CA71A9DB2FB27D1D37796185C2942C0A",\ - "0FFA963CDCA8816CCC33B8642BEDF905C3D358573D3F27FBBD3B3CB9AAAF",0,\ - "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF9E5E9A9F5D9071FBD1522688909D0B",1 -#define _EC_GROUP_X9_62_PRIME_239V2 \ - "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF",\ - "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC",\ - "617FAB6832576CBBFED50D99F0249C3FEE58B94BA0038C7AE84C8C832F2C",\ - "38AF09D98727705120C921BB5E9E26296A3CDCF2F35757A0EAFD87B830E7",0,\ - "7FFFFFFFFFFFFFFFFFFFFFFF800000CFA7E8594377D414C03821BC582063",1 -#define _EC_GROUP_X9_62_PRIME_239V3 \ - "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF",\ - "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC",\ - "255705FA2A306654B1F4CB03D6A750A30C250102D4988717D9BA15AB6D3E",\ - "6768AE8E18BB92CFCF005C949AA2C6D94853D0E660BBF854B1C9505FE95A",1,\ - "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF975DEB41B3A6057C3C432146526551",1 -#define _EC_GROUP_X9_62_PRIME_256V1 \ - "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF",\ - "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC",\ - "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B",\ - "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296",1,\ - "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551",1 +static const unsigned char _EC_X9_62_PRIME_192V2_SEED[] = { + 0x31,0xA9,0x2E,0xE2,0x02,0x9F,0xD1,0x0D,0x90,0x1B, + 0x11,0x3E,0x99,0x07,0x10,0xF0,0xD2,0x1A,0xC6,0xB6}; +static const EC_CURVE_DATA _EC_X9_62_PRIME_192V2 = { + NID_X9_62_prime_field, + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", + "CC22D6DFB95C6B25E49C0D6364A4E5980C393AA21668D953", + "EEA2BAE7E1497842F2DE7769CFE9C989C072AD696F48034A", + "6574d11d69b6ec7a672bb82a083df2f2b0847de970b2de15", + "FFFFFFFFFFFFFFFFFFFFFFFE5FB1A724DC80418648D8DD31",1, + _EC_X9_62_PRIME_192V2_SEED, 20, + "192 bit prime curve from the X9.62 draft" + }; + +static const unsigned char _EC_X9_62_PRIME_192V3_SEED[] = { + 0xC4,0x69,0x68,0x44,0x35,0xDE,0xB3,0x78,0xC4,0xB6, + 0x5C,0xA9,0x59,0x1E,0x2A,0x57,0x63,0x05,0x9A,0x2E}; +static const EC_CURVE_DATA _EC_X9_62_PRIME_192V3 = { + NID_X9_62_prime_field, + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", + "22123DC2395A05CAA7423DAECCC94760A7D462256BD56916", + "7D29778100C65A1DA1783716588DCE2B8B4AEE8E228F1896", + "38a90f22637337334b49dcb66a6dc8f9978aca7648a943b0", + "FFFFFFFFFFFFFFFFFFFFFFFF7A62D031C83F4294F640EC13",1, + _EC_X9_62_PRIME_192V3_SEED, 20, + "192 bit prime curve from the X9.62 draft" + }; + +static const unsigned char _EC_X9_62_PRIME_239V1_SEED[] = { + 0xE4,0x3B,0xB4,0x60,0xF0,0xB8,0x0C,0xC0,0xC0,0xB0, + 0x75,0x79,0x8E,0x94,0x80,0x60,0xF8,0x32,0x1B,0x7D}; +static const EC_CURVE_DATA _EC_X9_62_PRIME_239V1 = { + NID_X9_62_prime_field, + "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF", + "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC", + "6B016C3BDCF18941D0D654921475CA71A9DB2FB27D1D37796185C2942C0A", + "0FFA963CDCA8816CCC33B8642BEDF905C3D358573D3F27FBBD3B3CB9AAAF", + "7debe8e4e90a5dae6e4054ca530ba04654b36818ce226b39fccb7b02f1ae", + "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF9E5E9A9F5D9071FBD1522688909D0B",1, + _EC_X9_62_PRIME_239V1_SEED, 20, + "239 bit prime curve from the X9.62 draft" + }; + +static const unsigned char _EC_X9_62_PRIME_239V2_SEED[] = { + 0xE8,0xB4,0x01,0x16,0x04,0x09,0x53,0x03,0xCA,0x3B, + 0x80,0x99,0x98,0x2B,0xE0,0x9F,0xCB,0x9A,0xE6,0x16}; +static const EC_CURVE_DATA _EC_X9_62_PRIME_239V2 = { + NID_X9_62_prime_field, + "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF", + "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC", + "617FAB6832576CBBFED50D99F0249C3FEE58B94BA0038C7AE84C8C832F2C", + "38AF09D98727705120C921BB5E9E26296A3CDCF2F35757A0EAFD87B830E7", + "5b0125e4dbea0ec7206da0fc01d9b081329fb555de6ef460237dff8be4ba", + "7FFFFFFFFFFFFFFFFFFFFFFF800000CFA7E8594377D414C03821BC582063",1, + _EC_X9_62_PRIME_239V2_SEED, 20, + "239 bit prime curve from the X9.62 draft" + }; + +static const unsigned char _EC_X9_62_PRIME_239V3_SEED[] = { + 0x7D,0x73,0x74,0x16,0x8F,0xFE,0x34,0x71,0xB6,0x0A, + 0x85,0x76,0x86,0xA1,0x94,0x75,0xD3,0xBF,0xA2,0xFF}; +static const EC_CURVE_DATA _EC_X9_62_PRIME_239V3 = { + NID_X9_62_prime_field, + "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF", + "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC", + "255705FA2A306654B1F4CB03D6A750A30C250102D4988717D9BA15AB6D3E", + "6768AE8E18BB92CFCF005C949AA2C6D94853D0E660BBF854B1C9505FE95A", + "1607e6898f390c06bc1d552bad226f3b6fcfe48b6e818499af18e3ed6cf3", + "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF975DEB41B3A6057C3C432146526551",1, + _EC_X9_62_PRIME_239V3_SEED, 20, + "239 bit prime curve from the X9.62 draft" + }; + +static const unsigned char _EC_X9_62_PRIME_256V1_SEED[] = { + 0xC4,0x9D,0x36,0x08,0x86,0xE7,0x04,0x93,0x6A,0x66, + 0x78,0xE1,0x13,0x9D,0x26,0xB7,0x81,0x9F,0x7E,0x90}; +static const EC_CURVE_DATA _EC_X9_62_PRIME_256V1 = { + NID_X9_62_prime_field, + "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", + "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", + "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", + "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", + "4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5", + "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551",1, + _EC_X9_62_PRIME_256V1_SEED, 20, + "256 bit prime curve from the X9.62 draft" + }; /* the secg prime curves (minus the nist and x9.62 prime curves) */ -#define _EC_GROUP_SECG_PRIME_112R1 \ - "DB7C2ABF62E35E668076BEAD208B",\ - "DB7C2ABF62E35E668076BEAD2088",\ - "659EF8BA043916EEDE8911702B22",\ - "09487239995A5EE76B55F9C2F098",0,\ - "DB7C2ABF62E35E7628DFAC6561C5",1 -#define _EC_GROUP_SECG_PRIME_112R2 \ - "DB7C2ABF62E35E668076BEAD208B",\ - "6127C24C05F38A0AAAF65C0EF02C",\ - "51DEF1815DB5ED74FCC34C85D709",\ - "4BA30AB5E892B4E1649DD0928643",1,\ - "36DF0AAFD8B8D7597CA10520D04B",4 -#define _EC_GROUP_SECG_PRIME_128R1 \ - "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF",\ - "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC",\ - "E87579C11079F43DD824993C2CEE5ED3",\ - "161FF7528B899B2D0C28607CA52C5B86",1,\ - "FFFFFFFE0000000075A30D1B9038A115",1 -#define _EC_GROUP_SECG_PRIME_128R2 \ - "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF",\ - "D6031998D1B3BBFEBF59CC9BBFF9AEE1",\ - "5EEEFCA380D02919DC2C6558BB6D8A5D",\ - "7B6AA5D85E572983E6FB32A7CDEBC140",0,\ - "3FFFFFFF7FFFFFFFBE0024720613B5A3",4 -#define _EC_GROUP_SECG_PRIME_160K1 \ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73",\ - "0",\ - "7",\ - "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB",0,\ - "0100000000000000000001B8FA16DFAB9ACA16B6B3",1 -#define _EC_GROUP_SECG_PRIME_160R1 \ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF",\ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC",\ - "1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45",\ - "4A96B5688EF573284664698968C38BB913CBFC82",0,\ - "0100000000000000000001F4C8F927AED3CA752257",1 -#define _EC_GROUP_SECG_PRIME_160R2 \ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73",\ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70",\ - "B4E134D3FB59EB8BAB57274904664D5AF50388BA",\ - "52DCB034293A117E1F4FF11B30F7199D3144CE6D",0,\ - "0100000000000000000000351EE786A818F3A1A16B",1 -#define _EC_GROUP_SECG_PRIME_192K1 \ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37",\ - "0",\ - "3",\ - "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D",1,\ - "FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D",1 -#define _EC_GROUP_SECG_PRIME_224K1 \ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D",\ - "0",\ - "5",\ - "A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C",1,\ - "010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7",1 -#define _EC_GROUP_SECG_PRIME_256K1 \ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F",\ - "0",\ - "7",\ - "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798",0,\ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141",1 +static const unsigned char _EC_SECG_PRIME_112R1_SEED[] = { + 0x00,0xF5,0x0B,0x02,0x8E,0x4D,0x69,0x6E,0x67,0x68, + 0x75,0x61,0x51,0x75,0x29,0x04,0x72,0x78,0x3F,0xB1}; +static const EC_CURVE_DATA _EC_SECG_PRIME_112R1 = { + NID_X9_62_prime_field, + "DB7C2ABF62E35E668076BEAD208B", + "DB7C2ABF62E35E668076BEAD2088", + "659EF8BA043916EEDE8911702B22", + "09487239995A5EE76B55F9C2F098", + "a89ce5af8724c0a23e0e0ff77500", + "DB7C2ABF62E35E7628DFAC6561C5",1, + _EC_SECG_PRIME_112R1_SEED, 20, + "SECG/WTLS recommended curve over a 112 bit prime field" + }; + +static const unsigned char _EC_SECG_PRIME_112R2_SEED[] = { + 0x00,0x27,0x57,0xA1,0x11,0x4D,0x69,0x6E,0x67,0x68, + 0x75,0x61,0x51,0x75,0x53,0x16,0xC0,0x5E,0x0B,0xD4}; +static const EC_CURVE_DATA _EC_SECG_PRIME_112R2 = { + NID_X9_62_prime_field, + "DB7C2ABF62E35E668076BEAD208B", + "6127C24C05F38A0AAAF65C0EF02C", + "51DEF1815DB5ED74FCC34C85D709", + "4BA30AB5E892B4E1649DD0928643", + "adcd46f5882e3747def36e956e97", + "36DF0AAFD8B8D7597CA10520D04B",4, + _EC_SECG_PRIME_112R2_SEED, 20, + "SECG recommended curve over a 112 bit prime field" + }; + +static const unsigned char _EC_SECG_PRIME_128R1_SEED[] = { + 0x00,0x0E,0x0D,0x4D,0x69,0x6E,0x67,0x68,0x75,0x61, + 0x51,0x75,0x0C,0xC0,0x3A,0x44,0x73,0xD0,0x36,0x79}; +static const EC_CURVE_DATA _EC_SECG_PRIME_128R1 = { + NID_X9_62_prime_field, + "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF", + "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC", + "E87579C11079F43DD824993C2CEE5ED3", + "161FF7528B899B2D0C28607CA52C5B86", + "cf5ac8395bafeb13c02da292dded7a83", + "FFFFFFFE0000000075A30D1B9038A115",1, + _EC_SECG_PRIME_128R1_SEED, 20, + "SECG recommended curve over a 128 bit prime field" + }; + +static const unsigned char _EC_SECG_PRIME_128R2_SEED[] = { + 0x00,0x4D,0x69,0x6E,0x67,0x68,0x75,0x61,0x51,0x75, + 0x12,0xD8,0xF0,0x34,0x31,0xFC,0xE6,0x3B,0x88,0xF4}; +static const EC_CURVE_DATA _EC_SECG_PRIME_128R2 = { + NID_X9_62_prime_field, + "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF", + "D6031998D1B3BBFEBF59CC9BBFF9AEE1", + "5EEEFCA380D02919DC2C6558BB6D8A5D", + "7B6AA5D85E572983E6FB32A7CDEBC140", + "27b6916a894d3aee7106fe805fc34b44", + "3FFFFFFF7FFFFFFFBE0024720613B5A3",4, + _EC_SECG_PRIME_128R2_SEED, 20, + "SECG recommended curve over a 128 bit prime field" + }; + +static const EC_CURVE_DATA _EC_SECG_PRIME_160K1 = { + NID_X9_62_prime_field, + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73", + "0", + "7", + "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB", + "938cf935318fdced6bc28286531733c3f03c4fee", + "0100000000000000000001B8FA16DFAB9ACA16B6B3",1, + NULL, 0, + "SECG recommended curve over a 160 bit prime field" + }; + +static const unsigned char _EC_SECG_PRIME_160R1_SEED[] = { + 0x10,0x53,0xCD,0xE4,0x2C,0x14,0xD6,0x96,0xE6,0x76, + 0x87,0x56,0x15,0x17,0x53,0x3B,0xF3,0xF8,0x33,0x45}; +static const EC_CURVE_DATA _EC_SECG_PRIME_160R1 = { + NID_X9_62_prime_field, + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC", + "1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45", + "4A96B5688EF573284664698968C38BB913CBFC82", + "23a628553168947d59dcc912042351377ac5fb32", + "0100000000000000000001F4C8F927AED3CA752257",1, + _EC_SECG_PRIME_160R1_SEED, 20, + "SECG recommended curve over a 160 bit prime field" + }; + +static const unsigned char _EC_SECG_PRIME_160R2_SEED[] = { + 0xB9,0x9B,0x99,0xB0,0x99,0xB3,0x23,0xE0,0x27,0x09, + 0xA4,0xD6,0x96,0xE6,0x76,0x87,0x56,0x15,0x17,0x51}; +static const EC_CURVE_DATA _EC_SECG_PRIME_160R2 = { + NID_X9_62_prime_field, + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70", + "B4E134D3FB59EB8BAB57274904664D5AF50388BA", + "52DCB034293A117E1F4FF11B30F7199D3144CE6D", + "feaffef2e331f296e071fa0df9982cfea7d43f2e", + "0100000000000000000000351EE786A818F3A1A16B",1, + _EC_SECG_PRIME_160R2_SEED, 20, + "SECG/WTLS recommended curve over a 160 bit prime field" + }; + +static const EC_CURVE_DATA _EC_SECG_PRIME_192K1 = { + NID_X9_62_prime_field, + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37", + "0", + "3", + "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D", + "9b2f2f6d9c5628a7844163d015be86344082aa88d95e2f9d", + "FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D",1, + NULL, 20, + "SECG recommended curve over a 192 bit prime field" + }; + +static const EC_CURVE_DATA _EC_SECG_PRIME_224K1 = { + NID_X9_62_prime_field, + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D", + "0", + "5", + "A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C", + "7e089fed7fba344282cafbd6f7e319f7c0b0bd59e2ca4bdb556d61a5", + "010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7",1, + NULL, 20, + "SECG recommended curve over a 224 bit prime field" + }; + +static const EC_CURVE_DATA _EC_SECG_PRIME_256K1 = { + NID_X9_62_prime_field, + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", + "0", + "7", + "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", + "483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141",1, + NULL, 20, + "SECG recommended curve over a 256 bit prime field" + }; + /* some wap/wtls curves */ -#define _EC_GROUP_WTLS_8 \ - "FFFFFFFFFFFFFFFFFFFFFFFFFDE7",\ - "0",\ - "3",\ - "1",0,\ - "0100000000000001ECEA551AD837E9",1 -#define _EC_GROUP_WTLS_9 \ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC808F",\ - "0",\ - "3",\ - "1",0,\ - "0100000000000000000001CDC98AE0E2DE574ABF33",1 -#define _EC_GROUP_WTLS_12 \ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001", \ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE", \ - "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4", \ - "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21", 0, \ - "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D", 1 +static const EC_CURVE_DATA _EC_WTLS_8 = { + NID_X9_62_prime_field, + "FFFFFFFFFFFFFFFFFFFFFFFFFDE7", + "0", + "3", + "1", + "2", + "0100000000000001ECEA551AD837E9",1, + NULL, 20, + "112 bit prime curve from the WTLS standard" + }; -/* #define _EC_GROUP_EXAMPLE_CHAR2_CURVE \ - * "prime polynomial", "a", "b", "base point x-coord", "base point y-coord", "order", "cofactor" - */ -#define _EC_GROUP_SECG_CHAR2_113R1 \ - "020000000000000000000000000201", \ - "003088250CA6E7C7FE649CE85820F7", \ - "00E8BEE4D3E2260744188BE0E9C723", \ - "009D73616F35F4AB1407D73562C10F", \ - "00A52830277958EE84D1315ED31886", \ - "0100000000000000D9CCEC8A39E56F", 2 -#define _EC_GROUP_SECG_CHAR2_113R2 \ - "020000000000000000000000000201", \ - "00689918DBEC7E5A0DD6DFC0AA55C7", \ - "0095E9A9EC9B297BD4BF36E059184F", \ - "01A57A6A7B26CA5EF52FCDB8164797", \ - "00B3ADC94ED1FE674C06E695BABA1D", \ - "010000000000000108789B2496AF93", 2 -#define _EC_GROUP_SECG_CHAR2_131R1 \ - "080000000000000000000000000000010D", \ - "07A11B09A76B562144418FF3FF8C2570B8", \ - "0217C05610884B63B9C6C7291678F9D341", \ - "0081BAF91FDF9833C40F9C181343638399", \ - "078C6E7EA38C001F73C8134B1B4EF9E150", \ - "0400000000000000023123953A9464B54D", 2 -#define _EC_GROUP_SECG_CHAR2_131R2 \ - "080000000000000000000000000000010D", \ - "03E5A88919D7CAFCBF415F07C2176573B2", \ - "04B8266A46C55657AC734CE38F018F2192", \ - "0356DCD8F2F95031AD652D23951BB366A8", \ - "0648F06D867940A5366D9E265DE9EB240F", \ - "0400000000000000016954A233049BA98F", 2 -#define _EC_GROUP_SECG_CHAR2_163K1 \ - "0800000000000000000000000000000000000000C9", \ - "1", \ - "1", \ - "02FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE8", \ - "0289070FB05D38FF58321F2E800536D538CCDAA3D9", \ - "04000000000000000000020108A2E0CC0D99F8A5EF", 2 -#define _EC_GROUP_SECG_CHAR2_163R1 \ - "0800000000000000000000000000000000000000C9", \ - "07B6882CAAEFA84F9554FF8428BD88E246D2782AE2", \ - "0713612DCDDCB40AAB946BDA29CA91F73AF958AFD9", \ - "0369979697AB43897789566789567F787A7876A654", \ - "00435EDB42EFAFB2989D51FEFCE3C80988F41FF883", \ - "03FFFFFFFFFFFFFFFFFFFF48AAB689C29CA710279B", 2 -#define _EC_GROUP_SECG_CHAR2_163R2 \ - "0800000000000000000000000000000000000000C9", \ - "1", \ - "020A601907B8C953CA1481EB10512F78744A3205FD", \ - "03F0EBA16286A2D57EA0991168D4994637E8343E36", \ - "00D51FBC6C71A0094FA2CDD545B11C5C0C797324F1", \ - "040000000000000000000292FE77E70C12A4234C33", 2 -#define _EC_GROUP_SECG_CHAR2_193R1 \ - "02000000000000000000000000000000000000000000008001", \ - "0017858FEB7A98975169E171F77B4087DE098AC8A911DF7B01", \ - "00FDFB49BFE6C3A89FACADAA7A1E5BBC7CC1C2E5D831478814", \ - "01F481BC5F0FF84A74AD6CDF6FDEF4BF6179625372D8C0C5E1", \ - "0025E399F2903712CCF3EA9E3A1AD17FB0B3201B6AF7CE1B05", \ - "01000000000000000000000000C7F34A778F443ACC920EBA49", 2 -#define _EC_GROUP_SECG_CHAR2_193R2 \ - "02000000000000000000000000000000000000000000008001", \ - "0163F35A5137C2CE3EA6ED8667190B0BC43ECD69977702709B", \ - "00C9BB9E8927D4D64C377E2AB2856A5B16E3EFB7F61D4316AE", \ - "00D9B67D192E0367C803F39E1A7E82CA14A651350AAE617E8F", \ - "01CE94335607C304AC29E7DEFBD9CA01F596F927224CDECF6C", \ - "010000000000000000000000015AAB561B005413CCD4EE99D5", 2 -#define _EC_GROUP_SECG_CHAR2_233K1 \ - "020000000000000000000000000000000000000004000000000000000001", \ - "0", \ - "1", \ - "017232BA853A7E731AF129F22FF4149563A419C26BF50A4C9D6EEFAD6126", \ - "01DB537DECE819B7F70F555A67C427A8CD9BF18AEB9B56E0C11056FAE6A3", \ - "008000000000000000000000000000069D5BB915BCD46EFB1AD5F173ABDF", 4 -#define _EC_GROUP_SECG_CHAR2_233R1 \ - "020000000000000000000000000000000000000004000000000000000001", \ - "000000000000000000000000000000000000000000000000000000000001", \ - "0066647EDE6C332C7F8C0923BB58213B333B20E9CE4281FE115F7D8F90AD", \ - "00FAC9DFCBAC8313BB2139F1BB755FEF65BC391F8B36F8F8EB7371FD558B", \ - "01006A08A41903350678E58528BEBF8A0BEFF867A7CA36716F7E01F81052", \ - "01000000000000000000000000000013E974E72F8A6922031D2603CFE0D7", 2 -#define _EC_GROUP_SECG_CHAR2_239K1 \ - "800000000000000000004000000000000000000000000000000000000001", \ - "0", \ - "1", \ - "29A0B6A887A983E9730988A68727A8B2D126C44CC2CC7B2A6555193035DC", \ - "76310804F12E549BDB011C103089E73510ACB275FC312A5DC6B76553F0CA", \ - "2000000000000000000000000000005A79FEC67CB6E91F1C1DA800E478A5", 4 -#define _EC_GROUP_SECG_CHAR2_283K1 \ - "0800000000000000000000000000000000000000000000000000000000000000000010A1", \ - "0", \ - "1", \ - "0503213F78CA44883F1A3B8162F188E553CD265F23C1567A16876913B0C2AC2458492836", \ - "01CCDA380F1C9E318D90F95D07E5426FE87E45C0E8184698E45962364E34116177DD2259", \ - "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9AE2ED07577265DFF7F94451E061E163C61", 4 -#define _EC_GROUP_SECG_CHAR2_283R1 \ - "0800000000000000000000000000000000000000000000000000000000000000000010A1", \ - "000000000000000000000000000000000000000000000000000000000000000000000001", \ - "027B680AC8B8596DA5A4AF8A19A0303FCA97FD7645309FA2A581485AF6263E313B79A2F5", \ - "05F939258DB7DD90E1934F8C70B0DFEC2EED25B8557EAC9C80E2E198F8CDBECD86B12053", \ - "03676854FE24141CB98FE6D4B20D02B4516FF702350EDDB0826779C813F0DF45BE8112F4", \ - "03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF90399660FC938A90165B042A7CEFADB307", 2 -#define _EC_GROUP_SECG_CHAR2_409K1 \ - "02000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000001", \ - "0", \ - "1", \ - "0060F05F658F49C1AD3AB1890F7184210EFD0987E307C84C27ACCFB8F9F67CC2C460189EB5AAAA62EE222EB1B35540CFE9023746", \ - "01E369050B7C4E42ACBA1DACBF04299C3460782F918EA427E6325165E9EA10E3DA5F6C42E9C55215AA9CA27A5863EC48D8E0286B", \ - "007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5F83B2D4EA20400EC4557D5ED3E3E7CA5B4B5C83B8E01E5FCF", 4 +static const EC_CURVE_DATA _EC_WTLS_9 = { + NID_X9_62_prime_field, + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC808F", + "0", + "3", + "1", + "2", + "0100000000000000000001CDC98AE0E2DE574ABF33",1, + NULL, 20, + "160 bit prime curve from the WTLS standard" + }; -#define _EC_GROUP_SECG_CHAR2_409R1 \ - "02000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000001", \ - "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", \ - "0021A5C2C8EE9FEB5C4B9A753B7B476B7FD6422EF1F3DD674761FA99D6AC27C8A9A197B272822F6CD57A55AA4F50AE317B13545F", \ - "015D4860D088DDB3496B0C6064756260441CDE4AF1771D4DB01FFE5B34E59703DC255A868A1180515603AEAB60794E54BB7996A7", \ - "0061B1CFAB6BE5F32BBFA78324ED106A7636B9C5A7BD198D0158AA4F5488D08F38514F1FDF4B4F40D2181B3681C364BA0273C706", \ - "010000000000000000000000000000000000000000000000000001E2AAD6A612F33307BE5FA47C3C9E052F838164CD37D9A21173", 2 -#define _EC_GROUP_SECG_CHAR2_571K1 \ - "80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425", \ - "0", \ - "1", \ - "026EB7A859923FBC82189631F8103FE4AC9CA2970012D5D46024804801841CA44370958493B205E647DA304DB4CEB08CBBD1BA39494776FB988B47174DCA88C7E2945283A01C8972", \ - "0349DC807F4FBF374F4AEADE3BCA95314DD58CEC9F307A54FFC61EFC006D8A2C9D4979C0AC44AEA74FBEBBB9F772AEDCB620B01A7BA7AF1B320430C8591984F601CD4C143EF1C7A3", \ - "020000000000000000000000000000000000000000000000000000000000000000000000131850E1F19A63E4B391A8DB917F4138B630D84BE5D639381E91DEB45CFE778F637C1001", 4 -#define _EC_GROUP_SECG_CHAR2_571R1 \ - "80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425", \ - "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", \ - "02F40E7E2221F295DE297117B7F3D62F5C6A97FFCB8CEFF1CD6BA8CE4A9A18AD84FFABBD8EFA59332BE7AD6756A66E294AFD185A78FF12AA520E4DE739BACA0C7FFEFF7F2955727A", \ - "0303001D34B856296C16C0D40D3CD7750A93D1D2955FA80AA5F40FC8DB7B2ABDBDE53950F4C0D293CDD711A35B67FB1499AE60038614F1394ABFA3B4C850D927E1E7769C8EEC2D19", \ - "037BF27342DA639B6DCCFFFEB73D69D78C6C27A6009CBBCA1980F8533921E8A684423E43BAB08A576291AF8F461BB2A8B3531D2F0485C19B16E2F1516E23DD3C1A4827AF1B8AC15B", \ - "03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE661CE18FF55987308059B186823851EC7DD9CA1161DE93D5174D66E8382E9BB2FE84E47", 2 +static const EC_CURVE_DATA _EC_WTLS_12 = { + NID_X9_62_prime_field, + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE", + "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4", + "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21", + "bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34", + "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D", 1, + NULL, 0, + "224 bit prime curve from the WTLS standard" + }; -#define _EC_GROUP_X9_62_CHAR2_163V1 \ - "0800000000000000000000000000000000000000C9", \ - "072546B5435234A422E0789675F432C89435DE5242", \ - "00C9517D06D5240D3CFF38C74B20B6CD4D6F9DD4D9", \ - "07AF69989546103D79329FCC3D74880F33BBE803CB", \ - "0190C402D65BCC2B845337BC52352774E879B94B0D", \ - "0400000000000000000001E60FC8821CC74DAEAFC1", 2 -#define _EC_GROUP_X9_62_CHAR2_163V2 \ - "0800000000000000000000000000000000000000C9", \ - "0108B39E77C4B108BED981ED0E890E117C511CF072", \ - "0667ACEB38AF4E488C407433FFAE4F1C811638DF20", \ - "0024266E4EB5106D0A964D92C4860E2671DB9B6CC5", \ - "01F64F1C0280E19A062003DBAECEAEDEC1CE141D41", \ - "03FFFFFFFFFFFFFFFFFFFDF64DE1151ADBB78F10A7", 2 -#define _EC_GROUP_X9_62_CHAR2_163V3 \ - "0800000000000000000000000000000000000000C9", \ - "07A526C63D3E25A256A007699F5447E32AE456B50E", \ - "03F7061798EB99E238FD6F1BF95B48FEEB4854252B", \ - "02F9F87B7C574D0BDECF8A22E6524775F98CDEBDCB", \ - "01D42417D750A363F61E455807D047059CA039ACFE", \ - "03FFFFFFFFFFFFFFFFFFFE1AEE140F110AFF961309", 2 -#define _EC_GROUP_X9_62_CHAR2_176V1 \ - "0100000000000000000000000000000000080000000007", \ - "E4E6DB2995065C407D9D39B8D0967B96704BA8E9C90B", \ - "5DDA470ABE6414DE8EC133AE28E9BBD7FCEC0AE0FFF2", \ - "8D16C2866798B600F9F08BB4A8E860F3298CE04A5798", \ - "6FA4539C2DADDDD6BAB5167D61B436E1D92BB16A562C", \ - "00010092537397ECA4F6145799D62B0A19CE06FE26AD", 0xFF6E -#define _EC_GROUP_X9_62_CHAR2_191V1 \ - "800000000000000000000000000000000000000000000201", \ - "2866537B676752636A68F56554E12640276B649EF7526267", \ - "2E45EF571F00786F67B0081B9495A3D95462F5DE0AA185EC", \ - "36B3DAF8A23206F9C4F299D7B21A9C369137F2C84AE1AA0D", \ - "765BE73433B3F95E332932E70EA245CA2418EA0EF98018FB", \ - "40000000000000000000000004A20E90C39067C893BBB9A5", 2 -#define _EC_GROUP_X9_62_CHAR2_191V2 \ - "800000000000000000000000000000000000000000000201", \ - "401028774D7777C7B7666D1366EA432071274F89FF01E718", \ - "0620048D28BCBD03B6249C99182B7C8CD19700C362C46A01", \ - "3809B2B7CC1B28CC5A87926AAD83FD28789E81E2C9E3BF10", \ - "17434386626D14F3DBF01760D9213A3E1CF37AEC437D668A", \ - "20000000000000000000000050508CB89F652824E06B8173", 4 -#define _EC_GROUP_X9_62_CHAR2_191V3 \ - "800000000000000000000000000000000000000000000201", \ - "6C01074756099122221056911C77D77E77A777E7E7E77FCB", \ - "71FE1AF926CF847989EFEF8DB459F66394D90F32AD3F15E8", \ - "375D4CE24FDE434489DE8746E71786015009E66E38A926DD", \ - "545A39176196575D985999366E6AD34CE0A77CD7127B06BE", \ - "155555555555555555555555610C0B196812BFB6288A3EA3", 6 -#define _EC_GROUP_X9_62_CHAR2_208W1 \ - "010000000000000000000000000000000800000000000000000007", \ - "0000000000000000000000000000000000000000000000000000", \ - "C8619ED45A62E6212E1160349E2BFA844439FAFC2A3FD1638F9E", \ - "89FDFBE4ABE193DF9559ECF07AC0CE78554E2784EB8C1ED1A57A", \ - "0F55B51A06E78E9AC38A035FF520D8B01781BEB1A6BB08617DE3", \ - "000101BAF95C9723C57B6C21DA2EFF2D5ED588BDD5717E212F9D", 0xFE48 -#define _EC_GROUP_X9_62_CHAR2_239V1 \ - "800000000000000000000000000000000000000000000000001000000001", \ - "32010857077C5431123A46B808906756F543423E8D27877578125778AC76", \ - "790408F2EEDAF392B012EDEFB3392F30F4327C0CA3F31FC383C422AA8C16", \ - "57927098FA932E7C0A96D3FD5B706EF7E5F5C156E16B7E7C86038552E91D", \ - "61D8EE5077C33FECF6F1A16B268DE469C3C7744EA9A971649FC7A9616305", \ - "2000000000000000000000000000000F4D42FFE1492A4993F1CAD666E447", 4 -#define _EC_GROUP_X9_62_CHAR2_239V2 \ - "800000000000000000000000000000000000000000000000001000000001", \ - "4230017757A767FAE42398569B746325D45313AF0766266479B75654E65F", \ - "5037EA654196CFF0CD82B2C14A2FCF2E3FF8775285B545722F03EACDB74B", \ - "28F9D04E900069C8DC47A08534FE76D2B900B7D7EF31F5709F200C4CA205", \ - "5667334C45AFF3B5A03BAD9DD75E2C71A99362567D5453F7FA6E227EC833", \ - "1555555555555555555555555555553C6F2885259C31E3FCDF154624522D", 6 -#define _EC_GROUP_X9_62_CHAR2_239V3 \ - "800000000000000000000000000000000000000000000000001000000001", \ - "01238774666A67766D6676F778E676B66999176666E687666D8766C66A9F", \ - "6A941977BA9F6A435199ACFC51067ED587F519C5ECB541B8E44111DE1D40", \ - "70F6E9D04D289C4E89913CE3530BFDE903977D42B146D539BF1BDE4E9C92", \ - "2E5A0EAF6E5E1305B9004DCE5C0ED7FE59A35608F33837C816D80B79F461", \ - "0CCCCCCCCCCCCCCCCCCCCCCCCCCCCCAC4912D2D9DF903EF9888B8A0E4CFF", 0xA -#define _EC_GROUP_X9_62_CHAR2_272W1 \ - "010000000000000000000000000000000000000000000000000000010000000000000B", \ - "91A091F03B5FBA4AB2CCF49C4EDD220FB028712D42BE752B2C40094DBACDB586FB20", \ - "7167EFC92BB2E3CE7C8AAAFF34E12A9C557003D7C73A6FAF003F99F6CC8482E540F7", \ - "6108BABB2CEEBCF787058A056CBE0CFE622D7723A289E08A07AE13EF0D10D171DD8D", \ - "10C7695716851EEF6BA7F6872E6142FBD241B830FF5EFCACECCAB05E02005DDE9D23", \ - "000100FAF51354E0E39E4892DF6E319C72C8161603FA45AA7B998A167B8F1E629521", 0xFF06 -#define _EC_GROUP_X9_62_CHAR2_304W1 \ - "010000000000000000000000000000000000000000000000000000000000000000000000000807", \ - "FD0D693149A118F651E6DCE6802085377E5F882D1B510B44160074C1288078365A0396C8E681", \ - "BDDB97E555A50A908E43B01C798EA5DAA6788F1EA2794EFCF57166B8C14039601E55827340BE", \ - "197B07845E9BE2D96ADB0F5F3C7F2CFFBD7A3EB8B6FEC35C7FD67F26DDF6285A644F740A2614", \ - "E19FBEB76E0DA171517ECF401B50289BF014103288527A9B416A105E80260B549FDC1B92C03B", \ - "000101D556572AABAC800101D556572AABAC8001022D5C91DD173F8FB561DA6899164443051D", 0xFE2E -#define _EC_GROUP_X9_62_CHAR2_359V1 \ - "800000000000000000000000000000000000000000000000000000000000000000000000100000000000000001", \ - "5667676A654B20754F356EA92017D946567C46675556F19556A04616B567D223A5E05656FB549016A96656A557", \ - "2472E2D0197C49363F1FE7F5B6DB075D52B6947D135D8CA445805D39BC345626089687742B6329E70680231988", \ - "3C258EF3047767E7EDE0F1FDAA79DAEE3841366A132E163ACED4ED2401DF9C6BDCDE98E8E707C07A2239B1B097", \ - "53D7E08529547048121E9C95F3791DD804963948F34FAE7BF44EA82365DC7868FE57E4AE2DE211305A407104BD", \ - "01AF286BCA1AF286BCA1AF286BCA1AF286BCA1AF286BC9FB8F6B85C556892C20A7EB964FE7719E74F490758D3B", 0x4C -#define _EC_GROUP_X9_62_CHAR2_368W1 \ - "0100000000000000000000000000000000000000000000000000000000000000000000002000000000000000000007", \ - "E0D2EE25095206F5E2A4F9ED229F1F256E79A0E2B455970D8D0D865BD94778C576D62F0AB7519CCD2A1A906AE30D", \ - "FC1217D4320A90452C760A58EDCD30C8DD069B3C34453837A34ED50CB54917E1C2112D84D164F444F8F74786046A", \ - "1085E2755381DCCCE3C1557AFA10C2F0C0C2825646C5B34A394CBCFA8BC16B22E7E789E927BE216F02E1FB136A5F", \ - "7B3EB1BDDCBA62D5D8B2059B525797FC73822C59059C623A45FF3843CEE8F87CD1855ADAA81E2A0750B80FDA2310", \ - "00010090512DA9AF72B08349D98A5DD4C7B0532ECA51CE03E2D10F3B7AC579BD87E909AE40A6F131E9CFCE5BD967", 0xFF70 -#define _EC_GROUP_X9_62_CHAR2_431R1 \ - "800000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000001", \ - "1A827EF00DD6FC0E234CAF046C6A5D8A85395B236CC4AD2CF32A0CADBDC9DDF620B0EB9906D0957F6C6FEACD615468DF104DE296CD8F", \ - "10D9B4A3D9047D8B154359ABFB1B7F5485B04CEB868237DDC9DEDA982A679A5A919B626D4E50A8DD731B107A9962381FB5D807BF2618", \ - "120FC05D3C67A99DE161D2F4092622FECA701BE4F50F4758714E8A87BBF2A658EF8C21E7C5EFE965361F6C2999C0C247B0DBD70CE6B7", \ - "20D0AF8903A96F8D5FA2C255745D3C451B302C9346D9B7E485E7BCE41F6B591F3E8F6ADDCBB0BC4C2F947A7DE1A89B625D6A598B3760", \ - "0340340340340340340340340340340340340340340340340340340323C313FAB50589703B5EC68D3587FEC60D161CC149C1AD4A91", 0x2760 +/* characteristic two curves */ +static const unsigned char _EC_SECG_CHAR2_113R1_SEED[] = { + 0x10,0xE7,0x23,0xAB,0x14,0xD6,0x96,0xE6,0x76,0x87, + 0x56,0x15,0x17,0x56,0xFE,0xBF,0x8F,0xCB,0x49,0xA9}; +static const EC_CURVE_DATA _EC_SECG_CHAR2_113R1 = { + NID_X9_62_characteristic_two_field, + "020000000000000000000000000201", + "003088250CA6E7C7FE649CE85820F7", + "00E8BEE4D3E2260744188BE0E9C723", + "009D73616F35F4AB1407D73562C10F", + "00A52830277958EE84D1315ED31886", + "0100000000000000D9CCEC8A39E56F", 2, + _EC_SECG_CHAR2_113R1_SEED, 20, + "SECG recommended curve over a 113 bit binary field" + }; -#define _EC_GROUP_WTLS_1 \ - "020000000000000000000000000201", \ - "1", \ - "1", \ - "01667979A40BA497E5D5C270780617", \ - "00F44B4AF1ECC2630E08785CEBCC15", \ - "00FFFFFFFFFFFFFFFDBF91AF6DEA73", 2 +static const unsigned char _EC_SECG_CHAR2_113R2_SEED[] = { + 0x10,0xC0,0xFB,0x15,0x76,0x08,0x60,0xDE,0xF1,0xEE, + 0xF4,0xD6,0x96,0xE6,0x76,0x87,0x56,0x15,0x17,0x5D}; +static const EC_CURVE_DATA _EC_SECG_CHAR2_113R2 = { + NID_X9_62_characteristic_two_field, + "020000000000000000000000000201", + "00689918DBEC7E5A0DD6DFC0AA55C7", + "0095E9A9EC9B297BD4BF36E059184F", + "01A57A6A7B26CA5EF52FCDB8164797", + "00B3ADC94ED1FE674C06E695BABA1D", + "010000000000000108789B2496AF93", 2, + _EC_SECG_CHAR2_113R2_SEED, 20, + "SECG recommended curve over a 113 bit binary field" + }; -static EC_GROUP *ec_group_new_GFp_from_hex(const char *prime_in, - const char *a_in, const char *b_in, - const char *x_in, const int y_bit, const char *order_in, const BN_ULONG cofac_in) - { - EC_GROUP *group=NULL; - EC_POINT *P=NULL; - BN_CTX *ctx=NULL; - BIGNUM *prime=NULL,*a=NULL,*b=NULL,*x=NULL,*order=NULL; - int ok=0; +static const unsigned char _EC_SECG_CHAR2_131R1_SEED[] = { + 0x4D,0x69,0x6E,0x67,0x68,0x75,0x61,0x51,0x75,0x98, + 0x5B,0xD3,0xAD,0xBA,0xDA,0x21,0xB4,0x3A,0x97,0xE2}; +static const EC_CURVE_DATA _EC_SECG_CHAR2_131R1 = { + NID_X9_62_characteristic_two_field, + "080000000000000000000000000000010D", + "07A11B09A76B562144418FF3FF8C2570B8", + "0217C05610884B63B9C6C7291678F9D341", + "0081BAF91FDF9833C40F9C181343638399", + "078C6E7EA38C001F73C8134B1B4EF9E150", + "0400000000000000023123953A9464B54D", 2, + _EC_SECG_CHAR2_131R1_SEED, 20, + "SECG/WTLS recommended curve over a 131 bit binary field" + }; - if ((ctx = BN_CTX_new()) == NULL) goto bn_err; - if ((prime = BN_new()) == NULL || (a = BN_new()) == NULL || (b = BN_new()) == NULL || - (x = BN_new()) == NULL || (order = BN_new()) == NULL) goto bn_err; - - if (!BN_hex2bn(&prime, prime_in)) goto bn_err; - if (!BN_hex2bn(&a, a_in)) goto bn_err; - if (!BN_hex2bn(&b, b_in)) goto bn_err; +static const unsigned char _EC_SECG_CHAR2_131R2_SEED[] = { + 0x98,0x5B,0xD3,0xAD,0xBA,0xD4,0xD6,0x96,0xE6,0x76, + 0x87,0x56,0x15,0x17,0x5A,0x21,0xB4,0x3A,0x97,0xE3}; +static const EC_CURVE_DATA _EC_SECG_CHAR2_131R2 = { + NID_X9_62_characteristic_two_field, + "080000000000000000000000000000010D", + "03E5A88919D7CAFCBF415F07C2176573B2", + "04B8266A46C55657AC734CE38F018F2192", + "0356DCD8F2F95031AD652D23951BB366A8", + "0648F06D867940A5366D9E265DE9EB240F", + "0400000000000000016954A233049BA98F", 2, + _EC_SECG_CHAR2_131R2_SEED, 20, + "SECG recommended curve over a 131 bit binary field" + }; - if ((group = EC_GROUP_new_curve_GFp(prime, a, b, ctx)) == NULL) goto err; - if ((P = EC_POINT_new(group)) == NULL) goto err; - - if (!BN_hex2bn(&x, x_in)) goto bn_err; - if (!EC_POINT_set_compressed_coordinates_GFp(group, P, x, y_bit, ctx)) goto err; - if (!BN_hex2bn(&order, order_in)) goto bn_err; - if (!BN_set_word(x, cofac_in)) goto bn_err; - if (!EC_GROUP_set_generator(group, P, order, x)) goto err; - ok=1; -bn_err: - if (!ok) - ECerr(EC_F_EC_GROUP_NEW_GFP_FROM_HEX, ERR_R_BN_LIB); -err: - if (!ok) - { - EC_GROUP_free(group); - group = NULL; - } - if (P) EC_POINT_free(P); - if (ctx) BN_CTX_free(ctx); - if (prime) BN_free(prime); - if (a) BN_free(a); - if (b) BN_free(b); - if (order) BN_free(order); - if (x) BN_free(x); - return(group); - } +static const EC_CURVE_DATA _EC_SECG_CHAR2_163K1 = { + NID_X9_62_characteristic_two_field, + "0800000000000000000000000000000000000000C9", + "1", + "1", + "02FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE8", + "0289070FB05D38FF58321F2E800536D538CCDAA3D9", + "04000000000000000000020108A2E0CC0D99F8A5EF", 2, + NULL, 0, + "SECG/NIST/WTLS recommended curve over a 163 bit binary field" + }; -static EC_GROUP *ec_group_new_GF2m_from_hex(const char *prime_in, - const char *a_in, const char *b_in, - const char *x_in, const char *y_in, const char *order_in, const BN_ULONG cofac_in) - { - EC_GROUP *group=NULL; - EC_POINT *P=NULL; - BN_CTX *ctx=NULL; - BIGNUM *prime=NULL,*a=NULL,*b=NULL,*x=NULL,*y=NULL,*order=NULL; - int ok=0; +static const unsigned char _EC_SECG_CHAR2_163R1_SEED[] = { + 0x24,0xB7,0xB1,0x37,0xC8,0xA1,0x4D,0x69,0x6E,0x67, + 0x68,0x75,0x61,0x51,0x75,0x6F,0xD0,0xDA,0x2E,0x5C}; +static const EC_CURVE_DATA _EC_SECG_CHAR2_163R1 = { + NID_X9_62_characteristic_two_field, + "0800000000000000000000000000000000000000C9", + "07B6882CAAEFA84F9554FF8428BD88E246D2782AE2", + "0713612DCDDCB40AAB946BDA29CA91F73AF958AFD9", + "0369979697AB43897789566789567F787A7876A654", + "00435EDB42EFAFB2989D51FEFCE3C80988F41FF883", + "03FFFFFFFFFFFFFFFFFFFF48AAB689C29CA710279B", 2, + _EC_SECG_CHAR2_163R1_SEED, 20, + "SECG recommended curve over a 163 bit binary field" + }; - if ((ctx = BN_CTX_new()) == NULL) goto bn_err; - if ((prime = BN_new()) == NULL || (a = BN_new()) == NULL || (b = BN_new()) == NULL || - (x = BN_new()) == NULL || (y = BN_new()) == NULL || (order = BN_new()) == NULL) goto bn_err; - - if (!BN_hex2bn(&prime, prime_in)) goto bn_err; - if (!BN_hex2bn(&a, a_in)) goto bn_err; - if (!BN_hex2bn(&b, b_in)) goto bn_err; +static const unsigned char _EC_SECG_CHAR2_163R2_SEED[] = { + 0x85,0xE2,0x5B,0xFE,0x5C,0x86,0x22,0x6C,0xDB,0x12, + 0x01,0x6F,0x75,0x53,0xF9,0xD0,0xE6,0x93,0xA2,0x68}; +static const EC_CURVE_DATA _EC_SECG_CHAR2_163R2 ={ + NID_X9_62_characteristic_two_field, + "0800000000000000000000000000000000000000C9", + "1", + "020A601907B8C953CA1481EB10512F78744A3205FD", + "03F0EBA16286A2D57EA0991168D4994637E8343E36", + "00D51FBC6C71A0094FA2CDD545B11C5C0C797324F1", + "040000000000000000000292FE77E70C12A4234C33", 2, + _EC_SECG_CHAR2_163R2_SEED, 20, + "SECG/NIST recommended curve over a 163 bit binary field" + }; - if ((group = EC_GROUP_new_curve_GF2m(prime, a, b, ctx)) == NULL) goto err; - if ((P = EC_POINT_new(group)) == NULL) goto err; - - if (!BN_hex2bn(&x, x_in)) goto bn_err; - if (!BN_hex2bn(&y, y_in)) goto bn_err; - if (!EC_POINT_set_affine_coordinates_GF2m(group, P, x, y, ctx)) goto err; - if (!BN_hex2bn(&order, order_in)) goto bn_err; - if (!BN_set_word(x, cofac_in)) goto bn_err; - if (!EC_GROUP_set_generator(group, P, order, x)) goto err; - ok=1; -bn_err: - if (!ok) - ECerr(EC_F_EC_GROUP_NEW_GF2M_FROM_HEX, ERR_R_BN_LIB); -err: - if (!ok) - { - EC_GROUP_free(group); - group = NULL; - } - if (P) EC_POINT_free(P); - if (ctx) BN_CTX_free(ctx); - if (prime) BN_free(prime); - if (a) BN_free(a); - if (b) BN_free(b); - if (order) BN_free(order); - if (x) BN_free(x); - if (y) BN_free(y); - return(group); - } +static const unsigned char _EC_SECG_CHAR2_193R1_SEED[] = { + 0x10,0x3F,0xAE,0xC7,0x4D,0x69,0x6E,0x67,0x68,0x75, + 0x61,0x51,0x75,0x77,0x7F,0xC5,0xB1,0x91,0xEF,0x30}; +static const EC_CURVE_DATA _EC_SECG_CHAR2_193R1 = { + NID_X9_62_characteristic_two_field, + "02000000000000000000000000000000000000000000008001", + "0017858FEB7A98975169E171F77B4087DE098AC8A911DF7B01", + "00FDFB49BFE6C3A89FACADAA7A1E5BBC7CC1C2E5D831478814", + "01F481BC5F0FF84A74AD6CDF6FDEF4BF6179625372D8C0C5E1", + "0025E399F2903712CCF3EA9E3A1AD17FB0B3201B6AF7CE1B05", + "01000000000000000000000000C7F34A778F443ACC920EBA49", 2, + _EC_SECG_CHAR2_193R1_SEED, 20, + "SECG recommended curve over a 193 bit binary field" + }; -EC_GROUP *EC_GROUP_new_by_name(int name) - { - EC_GROUP *ret = NULL; - switch (name) - { - case EC_GROUP_NO_CURVE: - return NULL; +static const unsigned char _EC_SECG_CHAR2_193R2_SEED[] = { + 0x10,0xB7,0xB4,0xD6,0x96,0xE6,0x76,0x87,0x56,0x15, + 0x17,0x51,0x37,0xC8,0xA1,0x6F,0xD0,0xDA,0x22,0x11}; +static const EC_CURVE_DATA _EC_SECG_CHAR2_193R2 = { + NID_X9_62_characteristic_two_field, + "02000000000000000000000000000000000000000000008001", + "0163F35A5137C2CE3EA6ED8667190B0BC43ECD69977702709B", + "00C9BB9E8927D4D64C377E2AB2856A5B16E3EFB7F61D4316AE", + "00D9B67D192E0367C803F39E1A7E82CA14A651350AAE617E8F", + "01CE94335607C304AC29E7DEFBD9CA01F596F927224CDECF6C", + "010000000000000000000000015AAB561B005413CCD4EE99D5", 2, + _EC_SECG_CHAR2_193R2_SEED, 20, + "SECG recommended curve over a 193 bit binary field" + }; +static const EC_CURVE_DATA _EC_SECG_CHAR2_233K1 = { + NID_X9_62_characteristic_two_field, + "020000000000000000000000000000000000000004000000000000000001", + "0", + "1", + "017232BA853A7E731AF129F22FF4149563A419C26BF50A4C9D6EEFAD6126", + "01DB537DECE819B7F70F555A67C427A8CD9BF18AEB9B56E0C11056FAE6A3", + "008000000000000000000000000000069D5BB915BCD46EFB1AD5F173ABDF", 4, + NULL, 0, + "SECG/NIST/WTLS recommended curve over a 233 bit binary field" + }; + +static const unsigned char _EC_SECG_CHAR2_233R1_SEED[] = { + 0x74,0xD5,0x9F,0xF0,0x7F,0x6B,0x41,0x3D,0x0E,0xA1, + 0x4B,0x34,0x4B,0x20,0xA2,0xDB,0x04,0x9B,0x50,0xC3}; +static const EC_CURVE_DATA _EC_SECG_CHAR2_233R1 = { + NID_X9_62_characteristic_two_field, + "020000000000000000000000000000000000000004000000000000000001", + "000000000000000000000000000000000000000000000000000000000001", + "0066647EDE6C332C7F8C0923BB58213B333B20E9CE4281FE115F7D8F90AD", + "00FAC9DFCBAC8313BB2139F1BB755FEF65BC391F8B36F8F8EB7371FD558B", + "01006A08A41903350678E58528BEBF8A0BEFF867A7CA36716F7E01F81052", + "01000000000000000000000000000013E974E72F8A6922031D2603CFE0D7", 2, + _EC_SECG_CHAR2_233R1_SEED, 20, + "SECG/NIST/WTLS recommended curve over a 233 bit binary field" + }; + +static const EC_CURVE_DATA _EC_SECG_CHAR2_239K1 = { + NID_X9_62_characteristic_two_field, + "800000000000000000004000000000000000000000000000000000000001", + "0", + "1", + "29A0B6A887A983E9730988A68727A8B2D126C44CC2CC7B2A6555193035DC", + "76310804F12E549BDB011C103089E73510ACB275FC312A5DC6B76553F0CA", + "2000000000000000000000000000005A79FEC67CB6E91F1C1DA800E478A5", 4, + NULL, 0, + "SECG recommended curve over a 239 bit binary field" + }; + +static const EC_CURVE_DATA _EC_SECG_CHAR2_283K1 = { + NID_X9_62_characteristic_two_field, + "080000000000000000000000000000000000000000000000000000000000000000001" + "0A1", + "0", + "1", + "0503213F78CA44883F1A3B8162F188E553CD265F23C1567A16876913B0C2AC2458492" + "836", + "01CCDA380F1C9E318D90F95D07E5426FE87E45C0E8184698E45962364E34116177DD2" + "259", + "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9AE2ED07577265DFF7F94451E061E163" + "C61", 4, + NULL, 20, + "SECG/NIST recommended curve over a 283 bit binary field" + }; + +static const unsigned char _EC_SECG_CHAR2_283R1_SEED[] = { + 0x77,0xE2,0xB0,0x73,0x70,0xEB,0x0F,0x83,0x2A,0x6D, + 0xD5,0xB6,0x2D,0xFC,0x88,0xCD,0x06,0xBB,0x84,0xBE}; +static const EC_CURVE_DATA _EC_SECG_CHAR2_283R1 = { + NID_X9_62_characteristic_two_field, + "080000000000000000000000000000000000000000000000000000000000000000001" + "0A1", + "000000000000000000000000000000000000000000000000000000000000000000000" + "001", + "027B680AC8B8596DA5A4AF8A19A0303FCA97FD7645309FA2A581485AF6263E313B79A" + "2F5", + "05F939258DB7DD90E1934F8C70B0DFEC2EED25B8557EAC9C80E2E198F8CDBECD86B12" + "053", + "03676854FE24141CB98FE6D4B20D02B4516FF702350EDDB0826779C813F0DF45BE811" + "2F4", + "03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF90399660FC938A90165B042A7CEFADB" + "307", 2, + _EC_SECG_CHAR2_283R1_SEED, 20, + "SECG/NIST recommended curve over a 283 bit binary field" + }; + +static const EC_CURVE_DATA _EC_SECG_CHAR2_409K1 = { + NID_X9_62_characteristic_two_field, + "020000000000000000000000000000000000000000000000000000000000000000000" + "00000000000008000000000000000000001", + "0", + "1", + "0060F05F658F49C1AD3AB1890F7184210EFD0987E307C84C27ACCFB8F9F67CC2C4601" + "89EB5AAAA62EE222EB1B35540CFE9023746", + "01E369050B7C4E42ACBA1DACBF04299C3460782F918EA427E6325165E9EA10E3DA5F6" + "C42E9C55215AA9CA27A5863EC48D8E0286B", + "007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5F83B2D4EA20400" + "EC4557D5ED3E3E7CA5B4B5C83B8E01E5FCF", 4, + NULL, 0, + "SECG/NIST recommended curve over a 409 bit binary field" + }; + +static const unsigned char _EC_SECG_CHAR2_409R1_SEED[] = { + 0x40,0x99,0xB5,0xA4,0x57,0xF9,0xD6,0x9F,0x79,0x21, + 0x3D,0x09,0x4C,0x4B,0xCD,0x4D,0x42,0x62,0x21,0x0B}; +static const EC_CURVE_DATA _EC_SECG_CHAR2_409R1 = { + NID_X9_62_characteristic_two_field, + "020000000000000000000000000000000000000000000000000000000000000000000" + "00000000000008000000000000000000001", + "000000000000000000000000000000000000000000000000000000000000000000000" + "00000000000000000000000000000000001", + "0021A5C2C8EE9FEB5C4B9A753B7B476B7FD6422EF1F3DD674761FA99D6AC27C8A9A19" + "7B272822F6CD57A55AA4F50AE317B13545F", + "015D4860D088DDB3496B0C6064756260441CDE4AF1771D4DB01FFE5B34E59703DC255" + "A868A1180515603AEAB60794E54BB7996A7", + "0061B1CFAB6BE5F32BBFA78324ED106A7636B9C5A7BD198D0158AA4F5488D08F38514" + "F1FDF4B4F40D2181B3681C364BA0273C706", + "010000000000000000000000000000000000000000000000000001E2AAD6A612F3330" + "7BE5FA47C3C9E052F838164CD37D9A21173", 2, + _EC_SECG_CHAR2_409R1_SEED, 20, + "SECG/NIST recommended curve over a 409 bit binary field" + }; + +static const EC_CURVE_DATA _EC_SECG_CHAR2_571K1 = { + NID_X9_62_characteristic_two_field, + "800000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000" + "00425", + "0", + "1", + "026EB7A859923FBC82189631F8103FE4AC9CA2970012D5D46024804801841CA443709" + "58493B205E647DA304DB4CEB08CBBD1BA39494776FB988B47174DCA88C7E2945283A0" + "1C8972", + "0349DC807F4FBF374F4AEADE3BCA95314DD58CEC9F307A54FFC61EFC006D8A2C9D497" + "9C0AC44AEA74FBEBBB9F772AEDCB620B01A7BA7AF1B320430C8591984F601CD4C143E" + "F1C7A3", + "020000000000000000000000000000000000000000000000000000000000000000000" + "000131850E1F19A63E4B391A8DB917F4138B630D84BE5D639381E91DEB45CFE778F63" + "7C1001", 4, + NULL, 0, + "SECG/NIST recommended curve over a 571 bit binary field" + }; + +static const unsigned char _EC_SECG_CHAR2_571R1_SEED[] = { + 0x2A,0xA0,0x58,0xF7,0x3A,0x0E,0x33,0xAB,0x48,0x6B, + 0x0F,0x61,0x04,0x10,0xC5,0x3A,0x7F,0x13,0x23,0x10}; +static const EC_CURVE_DATA _EC_SECG_CHAR2_571R1 = { + NID_X9_62_characteristic_two_field, + "800000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000" + "00425", + "000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000" + "000001", + "02F40E7E2221F295DE297117B7F3D62F5C6A97FFCB8CEFF1CD6BA8CE4A9A18AD84FFA" + "BBD8EFA59332BE7AD6756A66E294AFD185A78FF12AA520E4DE739BACA0C7FFEFF7F29" + "55727A", + "0303001D34B856296C16C0D40D3CD7750A93D1D2955FA80AA5F40FC8DB7B2ABDBDE53" + "950F4C0D293CDD711A35B67FB1499AE60038614F1394ABFA3B4C850D927E1E7769C8E" + "EC2D19", + "037BF27342DA639B6DCCFFFEB73D69D78C6C27A6009CBBCA1980F8533921E8A684423" + "E43BAB08A576291AF8F461BB2A8B3531D2F0485C19B16E2F1516E23DD3C1A4827AF1B" + "8AC15B", + "03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + "FFFE661CE18FF55987308059B186823851EC7DD9CA1161DE93D5174D66E8382E9BB2F" + "E84E47", 2, + _EC_SECG_CHAR2_571R1_SEED, 20, + "SECG/NIST recommended curve over a 571 bit binary field" + }; + +static const unsigned char _EC_X9_62_CHAR2_163V1_SEED[] = { + 0xD2,0xC0,0xFB,0x15,0x76,0x08,0x60,0xDE,0xF1,0xEE, + 0xF4,0xD6,0x96,0xE6,0x76,0x87,0x56,0x15,0x17,0x54}; +static const EC_CURVE_DATA _EC_X9_62_CHAR2_163V1 = { + NID_X9_62_characteristic_two_field, + "0800000000000000000000000000000000000000C9", + "072546B5435234A422E0789675F432C89435DE5242", + "00C9517D06D5240D3CFF38C74B20B6CD4D6F9DD4D9", + "07AF69989546103D79329FCC3D74880F33BBE803CB", + "0190C402D65BCC2B845337BC52352774E879B94B0D", + "0400000000000000000001E60FC8821CC74DAEAFC1", 2, + _EC_X9_62_CHAR2_163V1_SEED, 20, + "163 bit binary curve from the X9.62 draft" + }; + +static const unsigned char _EC_X9_62_CHAR2_163V2_SEED[] = { + 0x53,0x81,0x4C,0x05,0x0D,0x44,0xD6,0x96,0xE6,0x76, + 0x87,0x56,0x15,0x17,0x58,0x0C,0xA4,0xE2,0x9F,0xFD}; +static const EC_CURVE_DATA _EC_X9_62_CHAR2_163V2 = { + NID_X9_62_characteristic_two_field, + "0800000000000000000000000000000000000000C9", + "0108B39E77C4B108BED981ED0E890E117C511CF072", + "0667ACEB38AF4E488C407433FFAE4F1C811638DF20", + "0024266E4EB5106D0A964D92C4860E2671DB9B6CC5", + "01F64F1C0280E19A062003DBAECEAEDEC1CE141D41", + "03FFFFFFFFFFFFFFFFFFFDF64DE1151ADBB78F10A7", 2, + _EC_X9_62_CHAR2_163V2_SEED, 20, + "163 bit binary curve from the X9.62 draft" + }; + +static const unsigned char _EC_X9_62_CHAR2_163V3_SEED[] = { + 0x50,0xCB,0xF1,0xD9,0x5C,0xA9,0x4D,0x69,0x6E,0x67, + 0x68,0x75,0x61,0x51,0x75,0xF1,0x6A,0x36,0xA3,0xB8}; +static const EC_CURVE_DATA _EC_X9_62_CHAR2_163V3 = { + NID_X9_62_characteristic_two_field, + "0800000000000000000000000000000000000000C9", + "07A526C63D3E25A256A007699F5447E32AE456B50E", + "03F7061798EB99E238FD6F1BF95B48FEEB4854252B", + "02F9F87B7C574D0BDECF8A22E6524775F98CDEBDCB", + "01D42417D750A363F61E455807D047059CA039ACFE", + "03FFFFFFFFFFFFFFFFFFFE1AEE140F110AFF961309", 2, + _EC_X9_62_CHAR2_163V3_SEED, 20, + "163 bit binary curve from the X9.62 draft" + }; + +static const EC_CURVE_DATA _EC_X9_62_CHAR2_176V1 = { + NID_X9_62_characteristic_two_field, + "0100000000000000000000000000000000080000000007", + "E4E6DB2995065C407D9D39B8D0967B96704BA8E9C90B", + "5DDA470ABE6414DE8EC133AE28E9BBD7FCEC0AE0FFF2", + "8D16C2866798B600F9F08BB4A8E860F3298CE04A5798", + "6FA4539C2DADDDD6BAB5167D61B436E1D92BB16A562C", + "00010092537397ECA4F6145799D62B0A19CE06FE26AD", 0xFF6E, + NULL, 0, + "176 bit binary curve from the X9.62 draft" + }; + +static const unsigned char _EC_X9_62_CHAR2_191V1_SEED[] = { + 0x4E,0x13,0xCA,0x54,0x27,0x44,0xD6,0x96,0xE6,0x76, + 0x87,0x56,0x15,0x17,0x55,0x2F,0x27,0x9A,0x8C,0x84}; +static const EC_CURVE_DATA _EC_X9_62_CHAR2_191V1 = { + NID_X9_62_characteristic_two_field, + "800000000000000000000000000000000000000000000201", + "2866537B676752636A68F56554E12640276B649EF7526267", + "2E45EF571F00786F67B0081B9495A3D95462F5DE0AA185EC", + "36B3DAF8A23206F9C4F299D7B21A9C369137F2C84AE1AA0D", + "765BE73433B3F95E332932E70EA245CA2418EA0EF98018FB", + "40000000000000000000000004A20E90C39067C893BBB9A5", 2, + _EC_X9_62_CHAR2_191V1_SEED, 20, + "191 bit binary curve from the X9.62 draft" + }; + +static const unsigned char _EC_X9_62_CHAR2_191V2_SEED[] = { + 0x08,0x71,0xEF,0x2F,0xEF,0x24,0xD6,0x96,0xE6,0x76, + 0x87,0x56,0x15,0x17,0x58,0xBE,0xE0,0xD9,0x5C,0x15}; +static const EC_CURVE_DATA _EC_X9_62_CHAR2_191V2 = { + NID_X9_62_characteristic_two_field, + "800000000000000000000000000000000000000000000201", + "401028774D7777C7B7666D1366EA432071274F89FF01E718", + "0620048D28BCBD03B6249C99182B7C8CD19700C362C46A01", + "3809B2B7CC1B28CC5A87926AAD83FD28789E81E2C9E3BF10", + "17434386626D14F3DBF01760D9213A3E1CF37AEC437D668A", + "20000000000000000000000050508CB89F652824E06B8173", 4, + _EC_X9_62_CHAR2_191V2_SEED, 20, + "191 bit binary curve from the X9.62 draft" + }; + +static const unsigned char _EC_X9_62_CHAR2_191V3_SEED[] = { + 0xE0,0x53,0x51,0x2D,0xC6,0x84,0xD6,0x96,0xE6,0x76, + 0x87,0x56,0x15,0x17,0x50,0x67,0xAE,0x78,0x6D,0x1F}; +static const EC_CURVE_DATA _EC_X9_62_CHAR2_191V3 = { + NID_X9_62_characteristic_two_field, + "800000000000000000000000000000000000000000000201", + "6C01074756099122221056911C77D77E77A777E7E7E77FCB", + "71FE1AF926CF847989EFEF8DB459F66394D90F32AD3F15E8", + "375D4CE24FDE434489DE8746E71786015009E66E38A926DD", + "545A39176196575D985999366E6AD34CE0A77CD7127B06BE", + "155555555555555555555555610C0B196812BFB6288A3EA3", 6, + _EC_X9_62_CHAR2_191V3_SEED, 20, + "191 bit binary curve from the X9.62 draft" + }; + +static const EC_CURVE_DATA _EC_X9_62_CHAR2_208W1 = { + NID_X9_62_characteristic_two_field, + "010000000000000000000000000000000800000000000000000007", + "0000000000000000000000000000000000000000000000000000", + "C8619ED45A62E6212E1160349E2BFA844439FAFC2A3FD1638F9E", + "89FDFBE4ABE193DF9559ECF07AC0CE78554E2784EB8C1ED1A57A", + "0F55B51A06E78E9AC38A035FF520D8B01781BEB1A6BB08617DE3", + "000101BAF95C9723C57B6C21DA2EFF2D5ED588BDD5717E212F9D", 0xFE48, + NULL, 0, + "208 bit binary curve from the X9.62 draft" + }; + +static const unsigned char _EC_X9_62_CHAR2_239V1_SEED[] = { + 0xD3,0x4B,0x9A,0x4D,0x69,0x6E,0x67,0x68,0x75,0x61, + 0x51,0x75,0xCA,0x71,0xB9,0x20,0xBF,0xEF,0xB0,0x5D}; +static const EC_CURVE_DATA _EC_X9_62_CHAR2_239V1 = { + NID_X9_62_characteristic_two_field, + "800000000000000000000000000000000000000000000000001000000001", + "32010857077C5431123A46B808906756F543423E8D27877578125778AC76", + "790408F2EEDAF392B012EDEFB3392F30F4327C0CA3F31FC383C422AA8C16", + "57927098FA932E7C0A96D3FD5B706EF7E5F5C156E16B7E7C86038552E91D", + "61D8EE5077C33FECF6F1A16B268DE469C3C7744EA9A971649FC7A9616305", + "2000000000000000000000000000000F4D42FFE1492A4993F1CAD666E447", 4, + _EC_X9_62_CHAR2_239V1_SEED, 20, + "239 bit binary curve from the X9.62 draft" + }; + +static const unsigned char _EC_X9_62_CHAR2_239V2_SEED[] = { + 0x2A,0xA6,0x98,0x2F,0xDF,0xA4,0xD6,0x96,0xE6,0x76, + 0x87,0x56,0x15,0x17,0x5D,0x26,0x67,0x27,0x27,0x7D}; +static const EC_CURVE_DATA _EC_X9_62_CHAR2_239V2 = { + NID_X9_62_characteristic_two_field, + "800000000000000000000000000000000000000000000000001000000001", + "4230017757A767FAE42398569B746325D45313AF0766266479B75654E65F", + "5037EA654196CFF0CD82B2C14A2FCF2E3FF8775285B545722F03EACDB74B", + "28F9D04E900069C8DC47A08534FE76D2B900B7D7EF31F5709F200C4CA205", + "5667334C45AFF3B5A03BAD9DD75E2C71A99362567D5453F7FA6E227EC833", + "1555555555555555555555555555553C6F2885259C31E3FCDF154624522D", 6, + _EC_X9_62_CHAR2_239V2_SEED, 20, + "239 bit binary curve from the X9.62 draft" + }; + +static const unsigned char _EC_X9_62_CHAR2_239V3_SEED[] = { + 0x9E,0x07,0x6F,0x4D,0x69,0x6E,0x67,0x68,0x75,0x61, + 0x51,0x75,0xE1,0x1E,0x9F,0xDD,0x77,0xF9,0x20,0x41}; +static const EC_CURVE_DATA _EC_X9_62_CHAR2_239V3 = { + NID_X9_62_characteristic_two_field, + "800000000000000000000000000000000000000000000000001000000001", + "01238774666A67766D6676F778E676B66999176666E687666D8766C66A9F", + "6A941977BA9F6A435199ACFC51067ED587F519C5ECB541B8E44111DE1D40", + "70F6E9D04D289C4E89913CE3530BFDE903977D42B146D539BF1BDE4E9C92", + "2E5A0EAF6E5E1305B9004DCE5C0ED7FE59A35608F33837C816D80B79F461", + "0CCCCCCCCCCCCCCCCCCCCCCCCCCCCCAC4912D2D9DF903EF9888B8A0E4CFF", 0xA, + _EC_X9_62_CHAR2_239V3_SEED, 20, + "239 bit binary curve from the X9.62 draft" + }; + +static const EC_CURVE_DATA _EC_X9_62_CHAR2_272W1 = { + NID_X9_62_characteristic_two_field, + "010000000000000000000000000000000000000000000000000000010000000000000" + "B", + "91A091F03B5FBA4AB2CCF49C4EDD220FB028712D42BE752B2C40094DBACDB586FB20", + "7167EFC92BB2E3CE7C8AAAFF34E12A9C557003D7C73A6FAF003F99F6CC8482E540F7", + "6108BABB2CEEBCF787058A056CBE0CFE622D7723A289E08A07AE13EF0D10D171DD8D", + "10C7695716851EEF6BA7F6872E6142FBD241B830FF5EFCACECCAB05E02005DDE9D23", + "000100FAF51354E0E39E4892DF6E319C72C8161603FA45AA7B998A167B8F1E629521", + 0xFF06, + NULL, 0, + "272 bit binary curve from the X9.62 draft" + }; + +static const EC_CURVE_DATA _EC_X9_62_CHAR2_304W1 = { + NID_X9_62_characteristic_two_field, + "010000000000000000000000000000000000000000000000000000000000000000000" + "000000807", + "FD0D693149A118F651E6DCE6802085377E5F882D1B510B44160074C1288078365A039" + "6C8E681", + "BDDB97E555A50A908E43B01C798EA5DAA6788F1EA2794EFCF57166B8C14039601E558" + "27340BE", + "197B07845E9BE2D96ADB0F5F3C7F2CFFBD7A3EB8B6FEC35C7FD67F26DDF6285A644F7" + "40A2614", + "E19FBEB76E0DA171517ECF401B50289BF014103288527A9B416A105E80260B549FDC1" + "B92C03B", + "000101D556572AABAC800101D556572AABAC8001022D5C91DD173F8FB561DA6899164" + "443051D", 0xFE2E, + NULL, 0, + "304 bit binary curve from the X9.62 draft" + }; + +static const unsigned char _EC_X9_62_CHAR2_359V1_SEED[] = { + 0x2B,0x35,0x49,0x20,0xB7,0x24,0xD6,0x96,0xE6,0x76, + 0x87,0x56,0x15,0x17,0x58,0x5B,0xA1,0x33,0x2D,0xC6}; +static const EC_CURVE_DATA _EC_X9_62_CHAR2_359V1 = { + NID_X9_62_characteristic_two_field, + "800000000000000000000000000000000000000000000000000000000000000000000" + "000100000000000000001", + "5667676A654B20754F356EA92017D946567C46675556F19556A04616B567D223A5E05" + "656FB549016A96656A557", + "2472E2D0197C49363F1FE7F5B6DB075D52B6947D135D8CA445805D39BC34562608968" + "7742B6329E70680231988", + "3C258EF3047767E7EDE0F1FDAA79DAEE3841366A132E163ACED4ED2401DF9C6BDCDE9" + "8E8E707C07A2239B1B097", + "53D7E08529547048121E9C95F3791DD804963948F34FAE7BF44EA82365DC7868FE57E" + "4AE2DE211305A407104BD", + "01AF286BCA1AF286BCA1AF286BCA1AF286BCA1AF286BC9FB8F6B85C556892C20A7EB9" + "64FE7719E74F490758D3B", 0x4C, + _EC_X9_62_CHAR2_359V1_SEED, 20, + "359 bit binary curve from the X9.62 draft" + }; + +static const EC_CURVE_DATA _EC_X9_62_CHAR2_368W1 = { + NID_X9_62_characteristic_two_field, + "010000000000000000000000000000000000000000000000000000000000000000000" + "0002000000000000000000007", + "E0D2EE25095206F5E2A4F9ED229F1F256E79A0E2B455970D8D0D865BD94778C576D62" + "F0AB7519CCD2A1A906AE30D", + "FC1217D4320A90452C760A58EDCD30C8DD069B3C34453837A34ED50CB54917E1C2112" + "D84D164F444F8F74786046A", + "1085E2755381DCCCE3C1557AFA10C2F0C0C2825646C5B34A394CBCFA8BC16B22E7E78" + "9E927BE216F02E1FB136A5F", + "7B3EB1BDDCBA62D5D8B2059B525797FC73822C59059C623A45FF3843CEE8F87CD1855" + "ADAA81E2A0750B80FDA2310", + "00010090512DA9AF72B08349D98A5DD4C7B0532ECA51CE03E2D10F3B7AC579BD87E90" + "9AE40A6F131E9CFCE5BD967", 0xFF70, + NULL, 0, + "368 bit binary curve from the X9.62 draft" + }; + +static const EC_CURVE_DATA _EC_X9_62_CHAR2_431R1 = { + NID_X9_62_characteristic_two_field, + "800000000000000000000000000000000000000000000000000000000000000000000" + "000000001000000000000000000000000000001", + "1A827EF00DD6FC0E234CAF046C6A5D8A85395B236CC4AD2CF32A0CADBDC9DDF620B0E" + "B9906D0957F6C6FEACD615468DF104DE296CD8F", + "10D9B4A3D9047D8B154359ABFB1B7F5485B04CEB868237DDC9DEDA982A679A5A919B6" + "26D4E50A8DD731B107A9962381FB5D807BF2618", + "120FC05D3C67A99DE161D2F4092622FECA701BE4F50F4758714E8A87BBF2A658EF8C2" + "1E7C5EFE965361F6C2999C0C247B0DBD70CE6B7", + "20D0AF8903A96F8D5FA2C255745D3C451B302C9346D9B7E485E7BCE41F6B591F3E8F6" + "ADDCBB0BC4C2F947A7DE1A89B625D6A598B3760", + "0340340340340340340340340340340340340340340340340340340323C313FAB5058" + "9703B5EC68D3587FEC60D161CC149C1AD4A91", 0x2760, + NULL, 0, + "431 bit binary curve from the X9.62 draft" + }; + +static const EC_CURVE_DATA _EC_WTLS_1 = { + NID_X9_62_characteristic_two_field, + "020000000000000000000000000201", + "1", + "1", + "01667979A40BA497E5D5C270780617", + "00F44B4AF1ECC2630E08785CEBCC15", + "00FFFFFFFFFFFFFFFDBF91AF6DEA73", 2, + NULL, 0, + "113 bit binary curve from the WTLS standard" + }; + +typedef struct _ec_list_element_st { + int nid; + const EC_CURVE_DATA *data; + } ec_list_element; + +static const ec_list_element curve_list[] = { /* prime field curves */ - /* prime field curves of degree 112 */ - case EC_GROUP_SECG_PRIME_112R1: - case EC_GROUP_WTLS_6: - ret = ec_group_new_GFp_from_hex(_EC_GROUP_SECG_PRIME_112R1); - break; - - case EC_GROUP_SECG_PRIME_112R2: - ret = ec_group_new_GFp_from_hex(_EC_GROUP_SECG_PRIME_112R2); - break; - - case EC_GROUP_WTLS_8: - ret = ec_group_new_GFp_from_hex(_EC_GROUP_WTLS_8); - break; - - /* prime field curves of degree 128 */ - case EC_GROUP_SECG_PRIME_128R1: - ret = ec_group_new_GFp_from_hex(_EC_GROUP_SECG_PRIME_128R1); - break; - - case EC_GROUP_SECG_PRIME_128R2: - ret = ec_group_new_GFp_from_hex(_EC_GROUP_SECG_PRIME_128R2); - break; - - /* prime field curves of degree 160 */ - case EC_GROUP_SECG_PRIME_160K1: - ret = ec_group_new_GFp_from_hex(_EC_GROUP_SECG_PRIME_160K1); - break; - - case EC_GROUP_SECG_PRIME_160R1: - ret = ec_group_new_GFp_from_hex(_EC_GROUP_SECG_PRIME_160R1); - break; - - case EC_GROUP_SECG_PRIME_160R2: - case EC_GROUP_WTLS_7: - ret = ec_group_new_GFp_from_hex(_EC_GROUP_SECG_PRIME_160R2); - break; - - case EC_GROUP_WTLS_9: - ret = ec_group_new_GFp_from_hex(_EC_GROUP_WTLS_9); - break; - - /* prime field curves of degree 192 */ - case EC_GROUP_SECG_PRIME_192K1: - ret = ec_group_new_GFp_from_hex(_EC_GROUP_SECG_PRIME_192K1); - break; - - case EC_GROUP_X9_62_PRIME_192V1: /* == EC_GROUP_NIST_PRIME_192 == EC_GROUP_SECG_PRIME_192R1 */ - ret = ec_group_new_GFp_from_hex(_EC_GROUP_NIST_PRIME_192); - break; - - case EC_GROUP_X9_62_PRIME_192V2: - ret = ec_group_new_GFp_from_hex(_EC_GROUP_X9_62_PRIME_192V2); - break; - - case EC_GROUP_X9_62_PRIME_192V3: - ret = ec_group_new_GFp_from_hex(_EC_GROUP_X9_62_PRIME_192V3); - break; - - /* prime field curves of degree 224 */ - case EC_GROUP_SECG_PRIME_224K1: - ret = ec_group_new_GFp_from_hex(_EC_GROUP_SECG_PRIME_224K1); - break; - - case EC_GROUP_SECG_PRIME_224R1: /* == EC_GROUP_NIST_PRIME_224 */ - ret = ec_group_new_GFp_from_hex(_EC_GROUP_NIST_PRIME_224); - break; - - case EC_GROUP_WTLS_12: - ret = ec_group_new_GFp_from_hex(_EC_GROUP_WTLS_12); - break; - - /* prime field curves of degree 239 */ - case EC_GROUP_X9_62_PRIME_239V1: - ret = ec_group_new_GFp_from_hex(_EC_GROUP_X9_62_PRIME_239V1); - break; - - case EC_GROUP_X9_62_PRIME_239V2: - ret = ec_group_new_GFp_from_hex(_EC_GROUP_X9_62_PRIME_239V2); - break; - - case EC_GROUP_X9_62_PRIME_239V3: - ret = ec_group_new_GFp_from_hex(_EC_GROUP_X9_62_PRIME_239V3); - break; - - /* prime field curves of degree 256 */ - case EC_GROUP_SECG_PRIME_256K1: - ret = ec_group_new_GFp_from_hex(_EC_GROUP_SECG_PRIME_256K1); - break; - - case EC_GROUP_SECG_PRIME_256R1: /* == EC_GROUP_NIST_PRIME_256 == EC_GROUP_X9_62_PRIME_256V1 */ - ret = ec_group_new_GFp_from_hex(_EC_GROUP_X9_62_PRIME_256V1); - break; - - /* prime field curves of degree 384 */ - case EC_GROUP_SECG_PRIME_384R1: /* == EC_GROUP_NIST_PRIME_384 */ - ret = ec_group_new_GFp_from_hex(_EC_GROUP_NIST_PRIME_384); - break; - - /* prime field curves of degree 521 */ - case EC_GROUP_SECG_PRIME_521R1: /* == EC_GROUP_NIST_PRIME_521 */ - ret = ec_group_new_GFp_from_hex(_EC_GROUP_NIST_PRIME_521); - break; - + /* secg curves */ + { NID_secp112r1, &_EC_SECG_PRIME_112R1}, + { NID_secp112r2, &_EC_SECG_PRIME_112R2}, + { NID_secp128r1, &_EC_SECG_PRIME_128R1}, + { NID_secp128r2, &_EC_SECG_PRIME_128R2}, + { NID_secp160k1, &_EC_SECG_PRIME_160K1}, + { NID_secp160r1, &_EC_SECG_PRIME_160R1}, + { NID_secp160r2, &_EC_SECG_PRIME_160R2}, + { NID_secp192k1, &_EC_SECG_PRIME_192K1}, + { NID_secp224k1, &_EC_SECG_PRIME_224K1}, + { NID_secp224r1, &_EC_NIST_PRIME_224}, + { NID_secp256k1, &_EC_SECG_PRIME_256K1}, + { NID_secp384r1, &_EC_NIST_PRIME_384}, + { NID_secp521r1, &_EC_NIST_PRIME_521}, + /* X9.62 curves */ + { NID_X9_62_prime192v1, &_EC_NIST_PRIME_192}, + { NID_X9_62_prime192v2, &_EC_X9_62_PRIME_192V2}, + { NID_X9_62_prime192v3, &_EC_X9_62_PRIME_192V3}, + { NID_X9_62_prime239v1, &_EC_X9_62_PRIME_239V1}, + { NID_X9_62_prime239v2, &_EC_X9_62_PRIME_239V2}, + { NID_X9_62_prime239v3, &_EC_X9_62_PRIME_239V3}, + { NID_X9_62_prime256v1, &_EC_X9_62_PRIME_256V1}, /* characteristic two field curves */ - /* binary curves of degree 113 */ - case EC_GROUP_SECG_CHAR2_113R1: - case EC_GROUP_WTLS_4: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_SECG_CHAR2_113R1); - break; - - case EC_GROUP_SECG_CHAR2_113R2: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_SECG_CHAR2_113R2); - break; - - case EC_GROUP_WTLS_1: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_WTLS_1); - break; + /* secg curves */ + { NID_sect113r1, &_EC_SECG_CHAR2_113R1}, + { NID_sect113r2, &_EC_SECG_CHAR2_113R2}, + { NID_sect131r1, &_EC_SECG_CHAR2_131R1}, + { NID_sect131r2, &_EC_SECG_CHAR2_131R2}, + { NID_sect163k1, &_EC_SECG_CHAR2_163K1}, + { NID_sect163r1, &_EC_SECG_CHAR2_163R1}, + { NID_sect163r2, &_EC_SECG_CHAR2_163R2}, + { NID_sect193r1, &_EC_SECG_CHAR2_193R1}, + { NID_sect193r2, &_EC_SECG_CHAR2_193R2}, + { NID_sect233k1, &_EC_SECG_CHAR2_233K1}, + { NID_sect233r1, &_EC_SECG_CHAR2_233R1}, + { NID_sect239k1, &_EC_SECG_CHAR2_239K1}, + { NID_sect283k1, &_EC_SECG_CHAR2_283K1}, + { NID_sect283r1, &_EC_SECG_CHAR2_283R1}, + { NID_sect409k1, &_EC_SECG_CHAR2_409K1}, + { NID_sect409r1, &_EC_SECG_CHAR2_409R1}, + { NID_sect571k1, &_EC_SECG_CHAR2_571K1}, + { NID_sect571r1, &_EC_SECG_CHAR2_571R1}, + /* X9.62 curves */ + { NID_X9_62_c2pnb163v1, &_EC_X9_62_CHAR2_163V1}, + { NID_X9_62_c2pnb163v2, &_EC_X9_62_CHAR2_163V2}, + { NID_X9_62_c2pnb163v3, &_EC_X9_62_CHAR2_163V3}, + { NID_X9_62_c2pnb176v1, &_EC_X9_62_CHAR2_176V1}, + { NID_X9_62_c2tnb191v1, &_EC_X9_62_CHAR2_191V1}, + { NID_X9_62_c2tnb191v2, &_EC_X9_62_CHAR2_191V2}, + { NID_X9_62_c2tnb191v3, &_EC_X9_62_CHAR2_191V3}, + { NID_X9_62_c2pnb208w1, &_EC_X9_62_CHAR2_208W1}, + { NID_X9_62_c2tnb239v1, &_EC_X9_62_CHAR2_239V1}, + { NID_X9_62_c2tnb239v2, &_EC_X9_62_CHAR2_239V2}, + { NID_X9_62_c2tnb239v3, &_EC_X9_62_CHAR2_239V3}, + { NID_X9_62_c2pnb272w1, &_EC_X9_62_CHAR2_272W1}, + { NID_X9_62_c2pnb304w1, &_EC_X9_62_CHAR2_304W1}, + { NID_X9_62_c2tnb359v1, &_EC_X9_62_CHAR2_359V1}, + { NID_X9_62_c2pnb368w1, &_EC_X9_62_CHAR2_368W1}, + { NID_X9_62_c2tnb431r1, &_EC_X9_62_CHAR2_431R1}, + /* the WAP/WTLS curves */ + { NID_wap_wsg_idm_ecid_wtls1, &_EC_WTLS_1}, + { NID_wap_wsg_idm_ecid_wtls3, &_EC_SECG_CHAR2_163K1}, + { NID_wap_wsg_idm_ecid_wtls4, &_EC_SECG_CHAR2_113R1}, + { NID_wap_wsg_idm_ecid_wtls5, &_EC_X9_62_CHAR2_163V1}, + { NID_wap_wsg_idm_ecid_wtls6, &_EC_SECG_PRIME_112R1}, + { NID_wap_wsg_idm_ecid_wtls7, &_EC_SECG_PRIME_160R2}, + { NID_wap_wsg_idm_ecid_wtls8, &_EC_WTLS_8}, + { NID_wap_wsg_idm_ecid_wtls9, &_EC_WTLS_9 }, + { NID_wap_wsg_idm_ecid_wtls10, &_EC_SECG_CHAR2_233K1}, + { NID_wap_wsg_idm_ecid_wtls11, &_EC_SECG_CHAR2_233R1}, + { NID_wap_wsg_idm_ecid_wtls12, &_EC_WTLS_12}, +}; - /* binary curves of degree 131 */ - case EC_GROUP_SECG_CHAR2_131R1: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_SECG_CHAR2_131R1); - break; - - case EC_GROUP_SECG_CHAR2_131R2: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_SECG_CHAR2_131R2); - break; +static size_t curve_list_length = sizeof(curve_list)/sizeof(ec_list_element); - /* binary curves of degree 163 */ - case EC_GROUP_SECG_CHAR2_163K1: /* == EC_GROUP_NIST_CHAR2_K163 */ - case EC_GROUP_WTLS_3: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_SECG_CHAR2_163K1); - break; +static EC_GROUP *ec_group_new_from_data(const EC_CURVE_DATA *data) + { + EC_GROUP *group=NULL; + EC_POINT *P=NULL; + BN_CTX *ctx=NULL; + BIGNUM *p=NULL, *a=NULL, *b=NULL, *x=NULL, *y=NULL, *order=NULL; + int ok=0; - case EC_GROUP_SECG_CHAR2_163R1: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_SECG_CHAR2_163R1); - break; - - case EC_GROUP_SECG_CHAR2_163R2: /* == EC_GROUP_NIST_CHAR2_B163 */ - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_SECG_CHAR2_163R2); - break; - - case EC_GROUP_X9_62_CHAR2_163V1: - case EC_GROUP_WTLS_5: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_X9_62_CHAR2_163V1); - break; - - case EC_GROUP_X9_62_CHAR2_163V2: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_X9_62_CHAR2_163V2); - break; - - case EC_GROUP_X9_62_CHAR2_163V3: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_X9_62_CHAR2_163V3); - break; - - /* binary curves of degree 176 */ - case EC_GROUP_X9_62_CHAR2_176V1: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_X9_62_CHAR2_176V1); - break; - - /* binary curves of degree 191 */ - case EC_GROUP_X9_62_CHAR2_191V1: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_X9_62_CHAR2_191V1); - break; - - case EC_GROUP_X9_62_CHAR2_191V2: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_X9_62_CHAR2_191V2); - break; - - case EC_GROUP_X9_62_CHAR2_191V3: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_X9_62_CHAR2_191V3); - break; - - /* binary curves of degree 193 */ - case EC_GROUP_SECG_CHAR2_193R1: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_SECG_CHAR2_193R1); - break; - - case EC_GROUP_SECG_CHAR2_193R2: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_SECG_CHAR2_193R2); - break; - - /* binary curves of degree 208 */ - case EC_GROUP_X9_62_CHAR2_208W1: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_X9_62_CHAR2_208W1); - break; - - /* binary curves of degree 233 */ - case EC_GROUP_SECG_CHAR2_233K1: /* == EC_GROUP_NIST_CHAR2_K233 */ - case EC_GROUP_WTLS_10: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_SECG_CHAR2_233K1); - break; - - case EC_GROUP_SECG_CHAR2_233R1: /* == EC_GROUP_NIST_CHAR2_B233 */ - case EC_GROUP_WTLS_11: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_SECG_CHAR2_233R1); - break; - - /* binary curves of degree 239 */ - case EC_GROUP_SECG_CHAR2_239K1: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_SECG_CHAR2_239K1); - break; - - case EC_GROUP_X9_62_CHAR2_239V1: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_X9_62_CHAR2_239V1); - break; - - case EC_GROUP_X9_62_CHAR2_239V2: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_X9_62_CHAR2_239V2); - break; - - case EC_GROUP_X9_62_CHAR2_239V3: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_X9_62_CHAR2_239V3); - break; - - /* binary curves of degree 272 */ - case EC_GROUP_X9_62_CHAR2_272W1: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_X9_62_CHAR2_272W1); - break; - - /* binary curves of degree 283 */ - case EC_GROUP_SECG_CHAR2_283K1: /* == EC_GROUP_NIST_CHAR2_K283 */ - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_SECG_CHAR2_283K1); - break; - - case EC_GROUP_SECG_CHAR2_283R1: /* == EC_GROUP_NIST_CHAR2_B283 */ - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_SECG_CHAR2_283R1); - break; - - /* binary curves of degree 304 */ - case EC_GROUP_X9_62_CHAR2_304W1: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_X9_62_CHAR2_304W1); - break; - - /* binary curves of degree 359 */ - case EC_GROUP_X9_62_CHAR2_359V1: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_X9_62_CHAR2_359V1); - break; - - /* binary curves of degree 368 */ - case EC_GROUP_X9_62_CHAR2_368W1: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_X9_62_CHAR2_368W1); - break; - - /* binary curves of degree 409 */ - case EC_GROUP_SECG_CHAR2_409K1: /* == EC_GROUP_NIST_CHAR2_K409 */ - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_SECG_CHAR2_409K1); - break; - - case EC_GROUP_SECG_CHAR2_409R1: /* == EC_GROUP_NIST_CHAR2_B409 */ - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_SECG_CHAR2_409R1); - break; - - /* binary curves of degree 431 */ - case EC_GROUP_X9_62_CHAR2_431R1: - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_X9_62_CHAR2_431R1); - break; - - /* binary curves of degree 571 */ - case EC_GROUP_SECG_CHAR2_571K1: /* == EC_GROUP_NIST_CHAR2_K571 */ - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_SECG_CHAR2_571K1); - break; - - case EC_GROUP_SECG_CHAR2_571R1: /* == EC_GROUP_NIST_CHAR2_B571 */ - ret = ec_group_new_GF2m_from_hex(_EC_GROUP_SECG_CHAR2_571R1); - break; - - } - if (ret == NULL) + if ((ctx = BN_CTX_new()) == NULL) { - ECerr(EC_F_EC_GROUP_NEW_BY_NAME, EC_R_UNKNOWN_GROUP); - return NULL; + ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_MALLOC_FAILURE); + goto err; + } + if ((p = BN_new()) == NULL || (a = BN_new()) == NULL || + (b = BN_new()) == NULL || (x = BN_new()) == NULL || + (y = BN_new()) == NULL || (order = BN_new()) == NULL) + { + ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_MALLOC_FAILURE); + goto err; + } + + if (!BN_hex2bn(&p, data->p) || !BN_hex2bn(&a, data->a) + || !BN_hex2bn(&b, data->b)) + { + ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_BN_LIB); + goto err; } - EC_GROUP_set_nid(ret, name); - return ret; - } + if (data->field_type == NID_X9_62_prime_field) + { + if ((group = EC_GROUP_new_curve_GFp(p, a, b, ctx)) == NULL) + { + ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB); + goto err; + } + } + else + { /* field_type == NID_X9_62_characteristic_two_field */ + if ((group = EC_GROUP_new_curve_GF2m(p, a, b, ctx)) == NULL) + { + ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB); + goto err; + } + } + + if ((P = EC_POINT_new(group)) == NULL) + { + ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB); + goto err; + } + + if (!BN_hex2bn(&x, data->x) || !BN_hex2bn(&y, data->y)) + { + ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_BN_LIB); + goto err; + } + if (!EC_POINT_set_affine_coordinates_GF2m(group, P, x, y, ctx)) + { + ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB); + goto err; + } + if (!BN_hex2bn(&order, data->order) || !BN_set_word(x, data->cofactor)) + { + ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_BN_LIB); + goto err; + } + if (!EC_GROUP_set_generator(group, P, order, x)) + { + ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB); + goto err; + } + if (data->seed) + { + if (!EC_GROUP_set_seed(group, data->seed, data->seed_len)) + { + ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB); + goto err; + } + } + ok=1; +err: + if (!ok) + { + EC_GROUP_free(group); + group = NULL; + } + if (P) + EC_POINT_free(P); + if (ctx) + BN_CTX_free(ctx); + if (p) + BN_free(p); + if (a) + BN_free(a); + if (b) + BN_free(b); + if (order) + BN_free(order); + if (x) + BN_free(x); + if (y) + BN_free(y); + return group; + } EC_GROUP *EC_GROUP_new_by_nid(int nid) { - return EC_GROUP_new_by_name(nid); + size_t i; + EC_GROUP *ret = NULL; + + if (nid <= 0) + return NULL; + + for (i=0; icomment; + return NULL; + } + +int ec_group_index2nid(int i) + { + if (i >= curve_list_length || i < 0) + return 0; + return curve_list[i].nid; } diff --git a/crypto/ec/ec_err.c b/crypto/ec/ec_err.c index 8626ef0d3..3a0f3f10e 100644 --- a/crypto/ec/ec_err.c +++ b/crypto/ec/ec_err.c @@ -94,14 +94,18 @@ static ERR_STRING_DATA EC_str_functs[]= {ERR_PACK(0,EC_F_EC_GFP_MONT_FIELD_SQR,0), "ec_GFp_mont_field_sqr"}, {ERR_PACK(0,EC_F_EC_GFP_SIMPLE_GROUP_CHECK_DISCRIMINANT,0), "ec_GFp_simple_group_check_discriminant"}, {ERR_PACK(0,EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE,0), "ec_GFp_simple_group_set_curve"}, +{ERR_PACK(0,EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE_GFP,0), "EC_GFP_SIMPLE_GROUP_SET_CURVE_GFP"}, {ERR_PACK(0,EC_F_EC_GFP_SIMPLE_GROUP_SET_GENERATOR,0), "EC_GFP_SIMPLE_GROUP_SET_GENERATOR"}, {ERR_PACK(0,EC_F_EC_GFP_SIMPLE_MAKE_AFFINE,0), "ec_GFp_simple_make_affine"}, {ERR_PACK(0,EC_F_EC_GFP_SIMPLE_OCT2POINT,0), "ec_GFp_simple_oct2point"}, {ERR_PACK(0,EC_F_EC_GFP_SIMPLE_POINT2OCT,0), "ec_GFp_simple_point2oct"}, {ERR_PACK(0,EC_F_EC_GFP_SIMPLE_POINTS_MAKE_AFFINE,0), "ec_GFp_simple_points_make_affine"}, {ERR_PACK(0,EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES,0), "ec_GFp_simple_point_get_affine_coordinates"}, +{ERR_PACK(0,EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES_GFP,0), "EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES_GFP"}, {ERR_PACK(0,EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES,0), "ec_GFp_simple_point_set_affine_coordinates"}, +{ERR_PACK(0,EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES_GFP,0), "EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES_GFP"}, {ERR_PACK(0,EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES,0), "ec_GFp_simple_set_compressed_coordinates"}, +{ERR_PACK(0,EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES_GFP,0), "EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES_GFP"}, {ERR_PACK(0,EC_F_EC_GROUP_CHECK,0), "EC_GROUP_check"}, {ERR_PACK(0,EC_F_EC_GROUP_CHECK_DISCRIMINANT,0), "EC_GROUP_check_discriminant"}, {ERR_PACK(0,EC_F_EC_GROUP_COPY,0), "EC_GROUP_copy"}, @@ -114,10 +118,8 @@ static ERR_STRING_DATA EC_str_functs[]= {ERR_PACK(0,EC_F_EC_GROUP_GET_ORDER,0), "EC_GROUP_get_order"}, {ERR_PACK(0,EC_F_EC_GROUP_GROUP2NID,0), "EC_GROUP_GROUP2NID"}, {ERR_PACK(0,EC_F_EC_GROUP_NEW,0), "EC_GROUP_new"}, -{ERR_PACK(0,EC_F_EC_GROUP_NEW_BY_NAME,0), "EC_GROUP_new_by_name"}, {ERR_PACK(0,EC_F_EC_GROUP_NEW_BY_NID,0), "EC_GROUP_new_by_nid"}, -{ERR_PACK(0,EC_F_EC_GROUP_NEW_GF2M_FROM_HEX,0), "EC_GROUP_NEW_GF2M_FROM_HEX"}, -{ERR_PACK(0,EC_F_EC_GROUP_NEW_GFP_FROM_HEX,0), "EC_GROUP_NEW_GFP_FROM_HEX"}, +{ERR_PACK(0,EC_F_EC_GROUP_NEW_FROM_DATA,0), "EC_GROUP_NEW_FROM_DATA"}, {ERR_PACK(0,EC_F_EC_GROUP_PRECOMPUTE_MULT,0), "EC_GROUP_precompute_mult"}, {ERR_PACK(0,EC_F_EC_GROUP_SET_CURVE_GF2M,0), "EC_GROUP_set_curve_GF2m"}, {ERR_PACK(0,EC_F_EC_GROUP_SET_CURVE_GFP,0), "EC_GROUP_set_curve_GFp"}, @@ -154,7 +156,7 @@ static ERR_STRING_DATA EC_str_functs[]= {ERR_PACK(0,EC_F_EC_WNAF_MUL,0), "ec_wNAF_mul"}, {ERR_PACK(0,EC_F_EC_WNAF_PRECOMPUTE_MULT,0), "ec_wNAF_precompute_mult"}, {ERR_PACK(0,EC_F_GFP_MONT_GROUP_SET_CURVE,0), "GFP_MONT_GROUP_SET_CURVE"}, -{ERR_PACK(0,EC_F_I2D_ECDSAPARAMETERS,0), "I2D_ECDSAPARAMETERS"}, +{ERR_PACK(0,EC_F_GFP_MONT_GROUP_SET_CURVE_GFP,0), "GFP_MONT_GROUP_SET_CURVE_GFP"}, {ERR_PACK(0,EC_F_I2D_ECPARAMETERS,0), "i2d_ECParameters"}, {ERR_PACK(0,EC_F_I2D_ECPKPARAMETERS,0), "i2d_ECPKParameters"}, {ERR_PACK(0,EC_F_I2D_ECPRIVATEKEY,0), "i2d_ECPrivateKey"}, @@ -166,15 +168,11 @@ static ERR_STRING_DATA EC_str_reasons[]= {EC_R_ASN1_ERROR ,"asn1 error"}, {EC_R_ASN1_UNKNOWN_FIELD ,"asn1 unknown field"}, {EC_R_BUFFER_TOO_SMALL ,"buffer too small"}, -{EC_R_D2I_ECPARAMETERS_FAILURE ,"d2i ecparameters failure"}, {EC_R_D2I_ECPKPARAMETERS_FAILURE ,"d2i ecpkparameters failure"}, -{EC_R_D2I_EC_PARAMETERS_FAILURE ,"d2i ec parameters failure"}, {EC_R_DISCRIMINANT_IS_ZERO ,"discriminant is zero"}, {EC_R_EC_GROUP_NEW_BY_NAME_FAILURE ,"ec group new by name failure"}, -{EC_R_GROUP2PARAMETERS_FAILURE ,"group2parameters failure"}, {EC_R_GROUP2PKPARAMETERS_FAILURE ,"group2pkparameters failure"}, {EC_R_I2D_ECPKPARAMETERS_FAILURE ,"i2d ecpkparameters failure"}, -{EC_R_I2D_EC_PARAMETERS_FAILURE ,"i2d ec parameters failure"}, {EC_R_INCOMPATIBLE_OBJECTS ,"incompatible objects"}, {EC_R_INVALID_ARGUMENT ,"invalid argument"}, {EC_R_INVALID_COMPRESSED_POINT ,"invalid compressed point"}, @@ -189,7 +187,6 @@ static ERR_STRING_DATA EC_str_reasons[]= {EC_R_NOT_IMPLEMENTED ,"not implemented"}, {EC_R_NOT_INITIALIZED ,"not initialized"}, {EC_R_NO_SUCH_EXTRA_DATA ,"no such extra data"}, -{EC_R_PARAMETERS2GROUP_FAILURE ,"parameters2group failure"}, {EC_R_PKPARAMETERS2GROUP_FAILURE ,"pkparameters2group failure"}, {EC_R_POINT_AT_INFINITY ,"point at infinity"}, {EC_R_POINT_IS_NOT_ON_CURVE ,"point is not on curve"}, @@ -197,9 +194,7 @@ static ERR_STRING_DATA EC_str_reasons[]= {EC_R_UNDEFINED_GENERATOR ,"undefined generator"}, {EC_R_UNDEFINED_ORDER ,"undefined order"}, {EC_R_UNKNOWN_GROUP ,"unknown group"}, -{EC_R_UNKNOWN_NID ,"unknown nid"}, {EC_R_UNKNOWN_ORDER ,"unknown order"}, -{EC_R_UNKNOWN_PARAMETERS_TYPE ,"unknown parameters type"}, {EC_R_WRONG_ORDER ,"wrong order"}, {0,NULL} }; diff --git a/crypto/ecdh/ecdhtest.c b/crypto/ecdh/ecdhtest.c index a9ee28caf..935c7c57d 100644 --- a/crypto/ecdh/ecdhtest.c +++ b/crypto/ecdh/ecdhtest.c @@ -129,7 +129,7 @@ int test_ecdh_curve(int nid, char *text, BN_CTX *ctx, BIO *out) int i,alen,blen,aout,bout,ret=0; if ((a=EC_KEY_new()) == NULL) goto err; - if ((a->group=EC_GROUP_new_by_name(nid)) == NULL) goto err; + if ((a->group=EC_GROUP_new_by_nid(nid)) == NULL) goto err; if ((b=EC_KEY_new()) == NULL) goto err; b->group = a->group; @@ -242,22 +242,22 @@ int main(int argc, char *argv[]) if ((ctx=BN_CTX_new()) == NULL) goto err; /* NIST PRIME CURVES TESTS */ - if (!test_ecdh_curve(EC_GROUP_NIST_PRIME_192, "NIST Prime-Curve P-192", ctx, out)) goto err; - if (!test_ecdh_curve(EC_GROUP_NIST_PRIME_224, "NIST Prime-Curve P-224", ctx, out)) goto err; - if (!test_ecdh_curve(EC_GROUP_NIST_PRIME_256, "NIST Prime-Curve P-256", ctx, out)) goto err; - if (!test_ecdh_curve(EC_GROUP_NIST_PRIME_384, "NIST Prime-Curve P-384", ctx, out)) goto err; - if (!test_ecdh_curve(EC_GROUP_NIST_PRIME_521, "NIST Prime-Curve P-521", ctx, out)) goto err; + if (!test_ecdh_curve(NID_X9_62_prime192v1, "NIST Prime-Curve P-192", ctx, out)) goto err; + if (!test_ecdh_curve(NID_secp224r1, "NIST Prime-Curve P-224", ctx, out)) goto err; + if (!test_ecdh_curve(NID_X9_62_prime256v1, "NIST Prime-Curve P-256", ctx, out)) goto err; + if (!test_ecdh_curve(NID_secp384r1, "NIST Prime-Curve P-384", ctx, out)) goto err; + if (!test_ecdh_curve(NID_secp521r1, "NIST Prime-Curve P-521", ctx, out)) goto err; /* NIST BINARY CURVES TESTS */ - if (!test_ecdh_curve(EC_GROUP_NIST_CHAR2_K163, "NIST Binary-Curve K-163", ctx, out)) goto err; - if (!test_ecdh_curve(EC_GROUP_NIST_CHAR2_B163, "NIST Binary-Curve B-163", ctx, out)) goto err; - if (!test_ecdh_curve(EC_GROUP_NIST_CHAR2_K233, "NIST Binary-Curve K-233", ctx, out)) goto err; - if (!test_ecdh_curve(EC_GROUP_NIST_CHAR2_B233, "NIST Binary-Curve B-233", ctx, out)) goto err; - if (!test_ecdh_curve(EC_GROUP_NIST_CHAR2_K283, "NIST Binary-Curve K-283", ctx, out)) goto err; - if (!test_ecdh_curve(EC_GROUP_NIST_CHAR2_B283, "NIST Binary-Curve B-283", ctx, out)) goto err; - if (!test_ecdh_curve(EC_GROUP_NIST_CHAR2_K409, "NIST Binary-Curve K-409", ctx, out)) goto err; - if (!test_ecdh_curve(EC_GROUP_NIST_CHAR2_B409, "NIST Binary-Curve B-409", ctx, out)) goto err; - if (!test_ecdh_curve(EC_GROUP_NIST_CHAR2_K571, "NIST Binary-Curve K-571", ctx, out)) goto err; - if (!test_ecdh_curve(EC_GROUP_NIST_CHAR2_B571, "NIST Binary-Curve B-571", ctx, out)) goto err; + if (!test_ecdh_curve(NID_sect163k1, "NIST Binary-Curve K-163", ctx, out)) goto err; + if (!test_ecdh_curve(NID_sect163r2, "NIST Binary-Curve B-163", ctx, out)) goto err; + if (!test_ecdh_curve(NID_sect233k1, "NIST Binary-Curve K-233", ctx, out)) goto err; + if (!test_ecdh_curve(NID_sect233r1, "NIST Binary-Curve B-233", ctx, out)) goto err; + if (!test_ecdh_curve(NID_sect283k1, "NIST Binary-Curve K-283", ctx, out)) goto err; + if (!test_ecdh_curve(NID_sect283r1, "NIST Binary-Curve B-283", ctx, out)) goto err; + if (!test_ecdh_curve(NID_sect409k1, "NIST Binary-Curve K-409", ctx, out)) goto err; + if (!test_ecdh_curve(NID_sect409r1, "NIST Binary-Curve B-409", ctx, out)) goto err; + if (!test_ecdh_curve(NID_sect571k1, "NIST Binary-Curve K-571", ctx, out)) goto err; + if (!test_ecdh_curve(NID_sect571r1, "NIST Binary-Curve B-571", ctx, out)) goto err; ret = 0; diff --git a/crypto/ecdsa/ecdsatest.c b/crypto/ecdsa/ecdsatest.c index b410fd68a..8b8c64ebc 100644 --- a/crypto/ecdsa/ecdsatest.c +++ b/crypto/ecdsa/ecdsatest.c @@ -156,7 +156,7 @@ int set_p192_param(EC_KEY *ecdsa) if ((ctx = BN_CTX_new()) == NULL) goto err; clear_ecdsa(ecdsa); - if ((ecdsa->group = EC_GROUP_new_by_name(EC_GROUP_X9_62_PRIME_192V1)) == NULL) + if ((ecdsa->group = EC_GROUP_new_by_nid(NID_X9_62_prime192v1)) == NULL) { BIO_printf(bio_err,"ECDSA_SET_GROUP_P_192_V1() failed \n"); goto err; @@ -189,7 +189,7 @@ int set_p239_param(EC_KEY *ecdsa) if ((ctx = BN_CTX_new()) == NULL) goto err; clear_ecdsa(ecdsa); - if ((ecdsa->group = EC_GROUP_new_by_name(EC_GROUP_X9_62_PRIME_239V1)) == NULL) + if ((ecdsa->group = EC_GROUP_new_by_nid(NID_X9_62_prime239v1)) == NULL) { BIO_printf(bio_err,"ECDSA_SET_GROUP_P_239_V1() failed \n"); goto err; @@ -566,7 +566,7 @@ int main(void) BIO_printf(bio_err, "Testing sign & verify with %s : \n", text); \ EC_KEY_free(ecdsa); \ if ((ecdsa = EC_KEY_new()) == NULL) goto err; \ - if ((ecdsa->group = EC_GROUP_new_by_name(curve)) == NULL) goto err; \ + if ((ecdsa->group = EC_GROUP_new_by_nid(curve)) == NULL) goto err; \ if (!EC_KEY_generate_key(ecdsa)) goto err; \ tim = clock(); \ for (i=0; i Date: Thu, 15 Aug 2002 09:39:01 +0000 Subject: [PATCH 10/55] Yet a couple of modules forgotten. These weren't important for OpenSSL itself, since they aren't used there (yet). It became quite visible qhen building a shared library, however... --- crypto/crypto-lib.com | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crypto/crypto-lib.com b/crypto/crypto-lib.com index 7fb5b4e91..733ac7aaa 100644 --- a/crypto/crypto-lib.com +++ b/crypto/crypto-lib.com @@ -268,14 +268,14 @@ $ LIB_X509V3 = "v3_bcons,v3_bitst,v3_conf,v3_extku,v3_ia5,v3_lib,"+ - "v3_prn,v3_utl,v3err,v3_genn,v3_alt,v3_skey,v3_akey,v3_pku,"+ - "v3_int,v3_enum,v3_sxnet,v3_cpols,v3_crld,v3_purp,v3_info,"+ - "v3_ocsp,v3_akeya" -$ LIB_CONF = "conf_err,conf_lib,conf_api,conf_def,conf_mod,conf_mall" +$ LIB_CONF = "conf_err,conf_lib,conf_api,conf_def,conf_mod,conf_mall,conf_sap" $ LIB_TXT_DB = "txt_db" $ LIB_PKCS7 = "pk7_asn1,pk7_lib,pkcs7err,pk7_doit,pk7_smime,pk7_attr,"+ - "pk7_mime" $ LIB_PKCS12 = "p12_add,p12_asn,p12_attr,p12_crpt,p12_crt,p12_decr,"+ - "p12_init,p12_key,p12_kiss,p12_mutl,"+ - "p12_utl,p12_npas,pk12err,p12_p8d,p12_p8e" -$ LIB_COMP = "comp_lib,"+ - +$ LIB_COMP = "comp_lib,comp_err,"+ - "c_rle,c_zlib" $ LIB_OCSP = "ocsp_asn,ocsp_ext,ocsp_ht,ocsp_lib,ocsp_cl,"+ - "ocsp_srv,ocsp_prn,ocsp_vfy,ocsp_err" From f742e497dd0f90da69aabfbe5d32ecede3eb0749 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 15 Aug 2002 10:50:31 +0000 Subject: [PATCH 11/55] Add a FAQ entry for yet another bc failure. PR: 199 --- FAQ | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/FAQ b/FAQ index e7642707b..28027fdca 100644 --- a/FAQ +++ b/FAQ @@ -36,6 +36,7 @@ OpenSSL - Frequently Asked Questions * Why does the linker complain about undefined symbols? * Why does the OpenSSL test fail with "bc: command not found"? * Why does the OpenSSL test fail with "bc: 1 no implemented"? +* Why does the OpenSSL test fail with "bc: stack empty"? * Why does the OpenSSL compilation fail on Alpha Tru64 Unix? * Why does the OpenSSL compilation fail with "ar: command not found"? * Why does the OpenSSL compilation fail on Win32 with VC++? @@ -402,6 +403,17 @@ and compile/install it. GNU bc (see http://www.gnu.org/software/software.html for download instructions) can be safely used, for example. +* Why does the OpenSSL test fail with "bc: stack empty"? + +On some DG/ux versions, bc seems to have a too small stack for calculations +that the OpenSSL bntest throws at it. This gets triggered when you run the +test suite (using "make test"). The message returned is "bc: stack empty". + +The best way to deal with this is to find another implementation of bc +and compile/install it. GNU bc (see http://www.gnu.org/software/software.html +for download instructions) can be safely used, for example. + + * Why does the OpenSSL compilation fail on Alpha Tru64 Unix? On some Alpha installations running Tru64 Unix and Compaq C, the compilation From 37f5fcf85c598cfbe75a9e9df79f94194a33f5b7 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 15 Aug 2002 10:59:55 +0000 Subject: [PATCH 12/55] Missing =back. Part of PR 196 --- doc/ssl/SSL_CTX_set_msg_callback.pod | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/ssl/SSL_CTX_set_msg_callback.pod b/doc/ssl/SSL_CTX_set_msg_callback.pod index a423932d0..0015e6ea7 100644 --- a/doc/ssl/SSL_CTX_set_msg_callback.pod +++ b/doc/ssl/SSL_CTX_set_msg_callback.pod @@ -69,6 +69,8 @@ The B object that received or sent the message. The user-defined argument optionally defined by SSL_CTX_set_msg_callback_arg() or SSL_set_msg_callback_arg(). +=back + =head1 NOTES Protocol messages are passed to the callback function after decryption From b2be73e4e847ec3b0f10fa7af4b1317fc5223912 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Thu, 15 Aug 2002 14:17:19 +0000 Subject: [PATCH 13/55] add crypto/ecdh --- util/mkfiles.pl | 1 + 1 file changed, 1 insertion(+) diff --git a/util/mkfiles.pl b/util/mkfiles.pl index 0ae8695be..70d1348a3 100755 --- a/util/mkfiles.pl +++ b/util/mkfiles.pl @@ -30,6 +30,7 @@ my @dirs = ( "crypto/dso", "crypto/dh", "crypto/ec", +"crypto/ecdh", "crypto/ecdsa", "crypto/buffer", "crypto/bio", From 1fd0338b4943e88f18a6d5ba2dc4b0bacf1a42da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Thu, 15 Aug 2002 14:23:23 +0000 Subject: [PATCH 14/55] fix manpage --- doc/crypto/EVP_SealInit.pod | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/crypto/EVP_SealInit.pod b/doc/crypto/EVP_SealInit.pod index 0451eb648..25ef07f7c 100644 --- a/doc/crypto/EVP_SealInit.pod +++ b/doc/crypto/EVP_SealInit.pod @@ -73,4 +73,6 @@ L =head1 HISTORY +EVP_SealFinal() did not return a value before OpenSSL 0.9.7. + =cut From 0fd05a2f0f2907e93ca103e9d643a68625f2a93c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Thu, 15 Aug 2002 14:52:54 +0000 Subject: [PATCH 15/55] fix warnings (CHARSET_EBCDIC) Submitted by: Lorinczy Zsigmond --- apps/s_server.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/s_server.c b/apps/s_server.c index 725efd3b1..3295eb020 100644 --- a/apps/s_server.c +++ b/apps/s_server.c @@ -335,10 +335,10 @@ static char **local_argv; static int ebcdic_new(BIO *bi); static int ebcdic_free(BIO *a); static int ebcdic_read(BIO *b, char *out, int outl); -static int ebcdic_write(BIO *b, char *in, int inl); -static long ebcdic_ctrl(BIO *b, int cmd, long num, char *ptr); +static int ebcdic_write(BIO *b, const char *in, int inl); +static long ebcdic_ctrl(BIO *b, int cmd, long num, void *ptr); static int ebcdic_gets(BIO *bp, char *buf, int size); -static int ebcdic_puts(BIO *bp, char *str); +static int ebcdic_puts(BIO *bp, const char *str); #define BIO_TYPE_EBCDIC_FILTER (18|0x0200) static BIO_METHOD methods_ebcdic= @@ -403,7 +403,7 @@ static int ebcdic_read(BIO *b, char *out, int outl) return(ret); } -static int ebcdic_write(BIO *b, char *in, int inl) +static int ebcdic_write(BIO *b, const char *in, int inl) { EBCDIC_OUTBUFF *wbuf; int ret=0; @@ -436,7 +436,7 @@ static int ebcdic_write(BIO *b, char *in, int inl) return(ret); } -static long ebcdic_ctrl(BIO *b, int cmd, long num, char *ptr) +static long ebcdic_ctrl(BIO *b, int cmd, long num, void *ptr) { long ret; @@ -455,7 +455,7 @@ static long ebcdic_ctrl(BIO *b, int cmd, long num, char *ptr) static int ebcdic_gets(BIO *bp, char *buf, int size) { - int i, ret; + int i, ret=0; if (bp->next_bio == NULL) return(0); /* return(BIO_gets(bp->next_bio,buf,size));*/ for (i=0; inext_bio == NULL) return(0); return ebcdic_write(bp, str, strlen(str)); From c6bf63da7cebb6d477c377adf40e529816676588 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 15 Aug 2002 15:20:48 +0000 Subject: [PATCH 16/55] It seems like sun4u doesn't always have a sparcv9 inside. Trust isalist. PR: 220 --- config | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/config b/config index 3e9af7680..7cfc4f933 100755 --- a/config +++ b/config @@ -595,8 +595,10 @@ EOF fi ;; *-*-linux1) OUT="linux-aout" ;; sun4u*-*-solaris2) - OUT="solaris-sparcv9-$CC" - ISA64=`(isalist) 2>/dev/null | grep sparcv9` + ISA=`(isalist) 2>/dev/null` + ISA64=`echo $ISA | grep sparcv9` + ISA=`set $ISA; echo $1` + OUT="solaris-$ISA-$CC" ;; if [ "$ISA64" != "" ]; then if [ "$CC" = "cc" -a $CCVER -ge 50 ]; then echo "WARNING! If you wish to build 64-bit library, then you have to" From 52c29b7b994e85f775d076646fe5aa6714cc834c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Thu, 15 Aug 2002 16:17:20 +0000 Subject: [PATCH 17/55] use correct function code in error message --- ssl/s2_srvr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ssl/s2_srvr.c b/ssl/s2_srvr.c index 2d3b667d9..97dda2dde 100644 --- a/ssl/s2_srvr.c +++ b/ssl/s2_srvr.c @@ -1032,7 +1032,7 @@ static int request_certificate(SSL *s) len = 6 + (unsigned long)s->s2->tmp.clen + (unsigned long)s->s2->tmp.rlen; if (len > SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER) { - SSLerr(SSL_F_GET_CLIENT_MASTER_KEY,SSL_R_MESSAGE_TOO_LONG); + SSLerr(SSL_F_REQUEST_CERTIFICATE,SSL_R_MESSAGE_TOO_LONG); goto end; } j = (int)len - s->init_num; From 8435a755fd9b905f35b2986986ec7a860b2472b7 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Thu, 15 Aug 2002 22:06:00 +0000 Subject: [PATCH 18/55] q may be used uninitialised --- test/dummytest.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/dummytest.c b/test/dummytest.c index f98f003ef..5b4467e04 100644 --- a/test/dummytest.c +++ b/test/dummytest.c @@ -8,7 +8,7 @@ int main(int argc, char *argv[]) { - char *p, *q, *program; + char *p, *q = 0, *program; p = strrchr(argv[0], '/'); if (!p) p = strrchr(argv[0], '\\'); @@ -34,7 +34,8 @@ int main(int argc, char *argv[]) } for(p = program; *p; p++) - if (islower(*p)) *p = toupper(*p); + if (islower((unsigned char)(*p))) + *p = toupper((unsigned char)(*p)); q = strstr(program, "TEST"); if (q > p && q[-1] == '_') q--; From 3f6db7f518326381348aaeae70c2a6463a119bde Mon Sep 17 00:00:00 2001 From: "Dr. Stephen Henson" Date: Fri, 16 Aug 2002 01:53:24 +0000 Subject: [PATCH 19/55] Fix block_size field for CFB and OFB modes: it should be 1. --- CHANGES | 6 ++++++ crypto/evp/evp_locl.h | 12 ++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/CHANGES b/CHANGES index a588c7f20..eb964236f 100644 --- a/CHANGES +++ b/CHANGES @@ -243,6 +243,12 @@ TODO: bug: pad x with leading zeros if necessary Changes between 0.9.6g and 0.9.7 [XX xxx 2002] + *) The "block size" for block ciphers in CFB and OFB mode should be 1. + [Steve Henson, reported by Yngve Nysaeter Pettersen ] + + *) The "block size" for block ciphers in CFB and OFB mode should be 1. + [Steve Henson] + *) Make sure tests can be performed even if the corresponding algorithms have been removed entirely. This was also the last step to make OpenSSL compilable with DJGPP under all reasonable conditions. diff --git a/crypto/evp/evp_locl.h b/crypto/evp/evp_locl.h index 7b088b484..4d81a3bf4 100644 --- a/crypto/evp/evp_locl.h +++ b/crypto/evp/evp_locl.h @@ -124,17 +124,17 @@ const EVP_CIPHER *EVP_##cname##_##mode(void) { return &cname##_##mode; } BLOCK_CIPHER_def1(cname, cbc, cbc, CBC, kstruct, nid, block_size, key_len, \ iv_len, flags, init_key, cleanup, set_asn1, get_asn1, ctrl) -#define BLOCK_CIPHER_def_cfb(cname, kstruct, nid, block_size, key_len, \ +#define BLOCK_CIPHER_def_cfb(cname, kstruct, nid, key_len, \ iv_len, cbits, flags, init_key, cleanup, \ set_asn1, get_asn1, ctrl) \ -BLOCK_CIPHER_def1(cname, cfb##cbits, cfb, CFB, kstruct, nid, block_size, \ +BLOCK_CIPHER_def1(cname, cfb##cbits, cfb, CFB, kstruct, nid, 1, \ key_len, iv_len, flags, init_key, cleanup, set_asn1, \ get_asn1, ctrl) -#define BLOCK_CIPHER_def_ofb(cname, kstruct, nid, block_size, key_len, \ +#define BLOCK_CIPHER_def_ofb(cname, kstruct, nid, key_len, \ iv_len, cbits, flags, init_key, cleanup, \ set_asn1, get_asn1, ctrl) \ -BLOCK_CIPHER_def1(cname, ofb##cbits, ofb, OFB, kstruct, nid, block_size, \ +BLOCK_CIPHER_def1(cname, ofb##cbits, ofb, OFB, kstruct, nid, 1, \ key_len, iv_len, flags, init_key, cleanup, set_asn1, \ get_asn1, ctrl) @@ -149,9 +149,9 @@ BLOCK_CIPHER_def1(cname, ecb, ecb, ECB, kstruct, nid, block_size, key_len, \ init_key, cleanup, set_asn1, get_asn1, ctrl) \ BLOCK_CIPHER_def_cbc(cname, kstruct, nid, block_size, key_len, iv_len, flags, \ init_key, cleanup, set_asn1, get_asn1, ctrl) \ -BLOCK_CIPHER_def_cfb(cname, kstruct, nid, block_size, key_len, iv_len, cbits, \ +BLOCK_CIPHER_def_cfb(cname, kstruct, nid, key_len, iv_len, cbits, \ flags, init_key, cleanup, set_asn1, get_asn1, ctrl) \ -BLOCK_CIPHER_def_ofb(cname, kstruct, nid, block_size, key_len, iv_len, cbits, \ +BLOCK_CIPHER_def_ofb(cname, kstruct, nid, key_len, iv_len, cbits, \ flags, init_key, cleanup, set_asn1, get_asn1, ctrl) \ BLOCK_CIPHER_def_ecb(cname, kstruct, nid, block_size, key_len, iv_len, flags, \ init_key, cleanup, set_asn1, get_asn1, ctrl) From 1c4e4e4f5638ef828ca6c5df3697bc983a0aafc8 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Fri, 16 Aug 2002 06:15:41 +0000 Subject: [PATCH 20/55] Add -lz to the ld flags when the user has chosen to link in zlib *statically*. Notified by Doug Kaufman --- Configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Configure b/Configure index b459b05b1..2566a3fbe 100755 --- a/Configure +++ b/Configure @@ -1091,7 +1091,7 @@ if ($zlib) { $cflags = "-DZLIB $cflags"; $cflags = "-DZLIB_SHARED $cflags" if $zlib == 2; - $lflags = "$lflags -lz" if $zlib == 2; + $lflags = "$lflags -lz" if $zlib == 1; } # You will find shlib_mark1 and shlib_mark2 explained in Makefile.org From cc8aa08b02818bc7aab531dc55d65ff85dc74fd4 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Fri, 16 Aug 2002 09:41:14 +0000 Subject: [PATCH 21/55] isalist was less trustable than I thought (or rather, one can trust it to come up with all kinds of names we don't have in our targets). Besides, our sparcv9 targets currently generate sparcv8 code, I'm told. --- config | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/config b/config index 7cfc4f933..3e9af7680 100755 --- a/config +++ b/config @@ -595,10 +595,8 @@ EOF fi ;; *-*-linux1) OUT="linux-aout" ;; sun4u*-*-solaris2) - ISA=`(isalist) 2>/dev/null` - ISA64=`echo $ISA | grep sparcv9` - ISA=`set $ISA; echo $1` - OUT="solaris-$ISA-$CC" ;; + OUT="solaris-sparcv9-$CC" + ISA64=`(isalist) 2>/dev/null | grep sparcv9` if [ "$ISA64" != "" ]; then if [ "$CC" = "cc" -a $CCVER -ge 50 ]; then echo "WARNING! If you wish to build 64-bit library, then you have to" From 64376cd8ff7ac2db8e4645a365184f782bd7b835 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Fri, 16 Aug 2002 11:19:07 +0000 Subject: [PATCH 22/55] 'EC' vs. 'ECDSA' Submitted by: Nils Larsch --- apps/req.c | 21 ++++++++++++--------- crypto/evp/p_lib.c | 2 +- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/apps/req.c b/apps/req.c index 1f24be79b..1105e59e6 100644 --- a/apps/req.c +++ b/apps/req.c @@ -152,7 +152,7 @@ int MAIN(int argc, char **argv) #ifndef OPENSSL_NO_DSA DSA *dsa_params=NULL; #endif -#ifndef OPENSSL_NO_EC +#ifndef OPENSSL_NO_ECDSA EC_KEY *ec_params = NULL; #endif unsigned long nmflag = 0; @@ -327,8 +327,8 @@ int MAIN(int argc, char **argv) } else #endif -#ifndef OPENSSL_NO_EC - if (strncmp("ecdsa:",p,4) == 0) +#ifndef OPENSSL_NO_ECDSA + if (strncmp("ec:",p,4) == 0) { X509 *xtmp=NULL; EVP_PKEY *dtmp; @@ -354,7 +354,8 @@ int MAIN(int argc, char **argv) goto end; } - if ((dtmp=X509_get_pubkey(xtmp)) == NULL) goto end; + if ((dtmp=X509_get_pubkey(xtmp))==NULL) + goto end; if (dtmp->type == EVP_PKEY_EC) ec_params = ECParameters_dup(dtmp->pkey.eckey); EVP_PKEY_free(dtmp); @@ -485,7 +486,9 @@ bad: BIO_printf(bio_err," the random number generator\n"); BIO_printf(bio_err," -newkey rsa:bits generate a new RSA key of 'bits' in size\n"); BIO_printf(bio_err," -newkey dsa:file generate a new DSA key, parameters taken from CA in 'file'\n"); - BIO_printf(bio_err," -newkey ecdsa:file generate a new ECDSA key, parameters taken from CA in 'file'\n"); +#ifndef OPENSSL_NO_ECDSA + BIO_printf(bio_err," -newkey ec:file generate a new EC key, parameters taken from CA in 'file'\n"); +#endif BIO_printf(bio_err," -[digest] Digest to sign with (md5, sha1, md2, mdc2, md4)\n"); BIO_printf(bio_err," -config file request template file.\n"); BIO_printf(bio_err," -subj arg set or modify request subject\n"); @@ -708,14 +711,14 @@ bad: } if (newkey < MIN_KEY_LENGTH && (pkey_type == TYPE_RSA || pkey_type == TYPE_DSA)) - /* TODO: appropriate minimal keylength for the different algorithm (esp. ECDSA) */ { BIO_printf(bio_err,"private key length is too short,\n"); BIO_printf(bio_err,"it needs to be at least %d bits, not %d\n",MIN_KEY_LENGTH,newkey); goto end; } BIO_printf(bio_err,"Generating a %d bit %s private key\n", - newkey,(pkey_type == TYPE_RSA)?"RSA":(pkey_type == TYPE_DSA)?"DSA":"ECDSA"); + newkey,(pkey_type == TYPE_RSA)?"RSA": + (pkey_type == TYPE_DSA)?"DSA":"EC"); if ((pkey=EVP_PKEY_new()) == NULL) goto end; @@ -737,7 +740,7 @@ bad: dsa_params=NULL; } #endif -#ifndef OPENSSL_NO_EC +#ifndef OPENSSL_NO_ECDSA if (pkey_type == TYPE_EC) { if (!EC_KEY_generate_key(ec_params)) goto end; @@ -1137,7 +1140,7 @@ end: #ifndef OPENSSL_NO_DSA if (dsa_params != NULL) DSA_free(dsa_params); #endif -#ifndef OPENSSL_NO_EC +#ifndef OPENSSL_NO_ECDSA if (ec_params != NULL) EC_KEY_free(ec_params); #endif apps_shutdown(); diff --git a/crypto/evp/p_lib.c b/crypto/evp/p_lib.c index 1056e4bff..c7a3dee10 100644 --- a/crypto/evp/p_lib.c +++ b/crypto/evp/p_lib.c @@ -117,7 +117,7 @@ int EVP_PKEY_size(EVP_PKEY *pkey) if (pkey->type == EVP_PKEY_DSA) return(DSA_size(pkey->pkey.dsa)); #endif -#ifndef OPENSSL_NO_EC +#ifndef OPENSSL_NO_ECDSA if (pkey->type == EVP_PKEY_EC) return(ECDSA_size(pkey->pkey.eckey)); #endif From 428112ef10f63f748c4b6043e4640c4e5e99542b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Fri, 16 Aug 2002 11:19:59 +0000 Subject: [PATCH 23/55] typo Submitted by: Nils Larsch --- apps/ecparam.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/ecparam.c b/apps/ecparam.c index f7f2fafea..ac4c565a4 100644 --- a/apps/ecparam.c +++ b/apps/ecparam.c @@ -370,7 +370,7 @@ bad: if (comment == NULL) comment = ""; if (sname == NULL) - sname == ""; + sname = ""; len = BIO_printf(out, " %-10s: ", sname); if (len + strlen(comment) > 80) From 82a20fb0f0134a1762d4559f000292af60f399a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lutz=20J=C3=A4nicke?= Date: Fri, 16 Aug 2002 17:04:04 +0000 Subject: [PATCH 24/55] Reorder cleanup sequence in SSL_CTX_free() to leave ex_data for remove_cb(). Submitted by: Reviewed by: PR: 212 --- CHANGES | 6 ++++++ ssl/ssl_lib.c | 17 ++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index eb964236f..9d1ba42e9 100644 --- a/CHANGES +++ b/CHANGES @@ -1914,6 +1914,12 @@ des-cbc 3624.96k 5258.21k 5530.91k 5624.30k 5628.26k Changes between 0.9.6g and 0.9.6h [xx XXX xxxx] + *) Reorder cleanup sequence in SSL_CTX_free(): only remove the ex_data after + the cached sessions are flushed, as the remove_cb() might use ex_data + contents. Bug found by Sam Varshavchik + (see [openssl.org #212]). + [Geoff Thorpe, Lutz Jaenicke] + *) Fix typo in OBJ_txt2obj which incorrectly passed the content length, instead of the encoding length to d2i_ASN1_OBJECT. [Steve Henson] diff --git a/ssl/ssl_lib.c b/ssl/ssl_lib.c index eda3cfd11..1ddd3380a 100644 --- a/ssl/ssl_lib.c +++ b/ssl/ssl_lib.c @@ -1409,13 +1409,24 @@ void SSL_CTX_free(SSL_CTX *a) abort(); /* ok */ } #endif + + /* + * Free internal session cache. However: the remove_cb() may reference + * the ex_data of SSL_CTX, thus the ex_data store can only be removed + * after the sessions were flushed. + * As the ex_data handling routines might also touch the session cache, + * the most secure solution seems to be: empty (flush) the cache, then + * free ex_data, then finally free the cache. + * (See ticket [openssl.org #212].) + */ + if (a->sessions != NULL) + SSL_CTX_flush_sessions(a,0); + CRYPTO_free_ex_data(CRYPTO_EX_INDEX_SSL_CTX, a, &a->ex_data); if (a->sessions != NULL) - { - SSL_CTX_flush_sessions(a,0); lh_free(a->sessions); - } + if (a->cert_store != NULL) X509_STORE_free(a->cert_store); if (a->cipher_list != NULL) From f309c1ae50a58f9f4521506b0325de415fb773e0 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Sat, 17 Aug 2002 13:46:42 +0000 Subject: [PATCH 25/55] So, I discovered that if you have your $PATH set so a ld different from GNU ld comes first, checking the usage of collect2 gives that instead of GNU ld, even if GNU ld would be the one that would get used if we link using gcc. It's much better, apparently, to ask gcc directly what the path to GNU ld is (provided it's there at all and gcc knows about it), and ask the result if it's a GNU or not. The bonus is that our GNU ld detection mechanism got shorter and easier to understand... --- Makefile.org | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Makefile.org b/Makefile.org index d87dfa3f7..961146175 100644 --- a/Makefile.org +++ b/Makefile.org @@ -275,9 +275,7 @@ do_gnu-shared: done DETECT_GNU_LD=${CC} -v 2>&1 | grep '^gcc' >/dev/null 2>&1 && \ - collect2=`gcc -print-prog-name=collect2 2>&1` && \ - [ -n "$$collect2" ] && \ - my_ld=`$$collect2 --help 2>&1 | grep Usage: | sed 's/^Usage: *\([^ ][^ ]*\).*/\1/'` && \ + ld=`gcc -print-prog-name=ld 2>&1` && \ [ -n "$$my_ld" ] && \ $$my_ld -v 2>&1 | grep 'GNU ld' >/dev/null 2>&1 From fbb311a7d2de8f615d28f60429a906adf92b9316 Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Sun, 18 Aug 2002 21:32:19 +0000 Subject: [PATCH 26/55] Typo, I assigned the variable ld instead of my_ld... --- Makefile.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.org b/Makefile.org index 961146175..ab45a851c 100644 --- a/Makefile.org +++ b/Makefile.org @@ -275,7 +275,7 @@ do_gnu-shared: done DETECT_GNU_LD=${CC} -v 2>&1 | grep '^gcc' >/dev/null 2>&1 && \ - ld=`gcc -print-prog-name=ld 2>&1` && \ + my_ld=`gcc -print-prog-name=ld 2>&1` && \ [ -n "$$my_ld" ] && \ $$my_ld -v 2>&1 | grep 'GNU ld' >/dev/null 2>&1 From 9a2601033dcf12c3c8075719264cfea4985a8562 Mon Sep 17 00:00:00 2001 From: "Dr. Stephen Henson" Date: Thu, 22 Aug 2002 21:54:51 +0000 Subject: [PATCH 27/55] Fix crahses and leaks in pkcs12 utility -chain option --- apps/pkcs12.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/apps/pkcs12.c b/apps/pkcs12.c index 73550d180..1697f6157 100644 --- a/apps/pkcs12.c +++ b/apps/pkcs12.c @@ -508,9 +508,10 @@ int MAIN(int argc, char **argv) /* Exclude verified certificate */ for (i = 1; i < sk_X509_num (chain2) ; i++) sk_X509_push(certs, sk_X509_value (chain2, i)); - } - sk_X509_free(chain2); - if (vret) { + /* Free first certificate */ + X509_free(sk_X509_value(chain2, 0)); + sk_X509_free(chain2); + } else { BIO_printf (bio_err, "Error %s getting chain.\n", X509_verify_cert_error_string(vret)); goto export_end; @@ -537,8 +538,6 @@ int MAIN(int argc, char **argv) } sk_X509_pop_free(certs, X509_free); certs = NULL; - /* ucert is part of certs so it is already freed */ - ucert = NULL; #ifdef CRYPTO_MDEBUG CRYPTO_pop_info(); @@ -627,7 +626,6 @@ int MAIN(int argc, char **argv) if (certs) sk_X509_pop_free(certs, X509_free); if (safes) sk_PKCS7_pop_free(safes, PKCS7_free); if (bags) sk_PKCS12_SAFEBAG_pop_free(bags, PKCS12_SAFEBAG_free); - if (ucert) X509_free(ucert); #ifdef CRYPTO_MDEBUG CRYPTO_pop_info(); From c787525ac80d63bfac0607929fbe8a0783de02b0 Mon Sep 17 00:00:00 2001 From: "Dr. Stephen Henson" Date: Thu, 22 Aug 2002 23:00:54 +0000 Subject: [PATCH 28/55] #if out unused function to shut the compiler up. --- crypto/ecdh/ecdhtest.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/crypto/ecdh/ecdhtest.c b/crypto/ecdh/ecdhtest.c index 935c7c57d..090737f0f 100644 --- a/crypto/ecdh/ecdhtest.c +++ b/crypto/ecdh/ecdhtest.c @@ -109,7 +109,10 @@ int main(int argc, char *argv[]) #define MS_CALLBACK #endif +#if 0 static void MS_CALLBACK cb(int p, int n, void *arg); +#endif + #ifdef OPENSSL_NO_STDIO #define APPS_WIN16 #include "bss_file.c" @@ -272,6 +275,7 @@ err: return(ret); } +#if 0 static void MS_CALLBACK cb(int p, int n, void *arg) { char c='*'; @@ -287,3 +291,4 @@ static void MS_CALLBACK cb(int p, int n, void *arg) #endif } #endif +#endif From e88479243cdb19d1bc194f280923395b7856380b Mon Sep 17 00:00:00 2001 From: "Dr. Stephen Henson" Date: Thu, 22 Aug 2002 23:03:04 +0000 Subject: [PATCH 29/55] Change C++ style comments --- crypto/engine/hw_openbsd_dev_crypto.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/crypto/engine/hw_openbsd_dev_crypto.c b/crypto/engine/hw_openbsd_dev_crypto.c index f946389b8..b8aab545d 100644 --- a/crypto/engine/hw_openbsd_dev_crypto.c +++ b/crypto/engine/hw_openbsd_dev_crypto.c @@ -408,7 +408,7 @@ static int do_digest(int ses,unsigned char *md,const void *data,int len) cryp.op=COP_ENCRYPT;/* required to do the MAC rather than check it */ cryp.len=len; cryp.src=(caddr_t)data; - cryp.dst=(caddr_t)data; // FIXME!!! + cryp.dst=(caddr_t)data; /* FIXME!!! */ cryp.mac=(caddr_t)md; if(ioctl(fd, CIOCCRYPT, &cryp) == -1) @@ -420,7 +420,7 @@ static int do_digest(int ses,unsigned char *md,const void *data,int len) dcopy=OPENSSL_malloc(len); memcpy(dcopy,data,len); cryp.src=dcopy; - cryp.dst=cryp.src; // FIXME!!! + cryp.dst=cryp.src; /* FIXME!!! */ if(ioctl(fd, CIOCCRYPT, &cryp) == -1) { @@ -437,7 +437,7 @@ static int do_digest(int ses,unsigned char *md,const void *data,int len) return 0; } } - // printf("done\n"); + /* printf("done\n"); */ return 1; } @@ -483,7 +483,7 @@ static int dev_crypto_md5_copy(EVP_MD_CTX *to,const EVP_MD_CTX *from) const MD_DATA *from_md=from->md_data; MD_DATA *to_md=to->md_data; - // How do we copy sessions? + /* How do we copy sessions? */ assert(from->digest->flags&EVP_MD_FLAG_ONESHOT); to_md->data=OPENSSL_malloc(from_md->len); @@ -530,7 +530,7 @@ static const EVP_MD md5_md= NID_md5, NID_md5WithRSAEncryption, MD5_DIGEST_LENGTH, - EVP_MD_FLAG_ONESHOT, // XXX: set according to device info... + EVP_MD_FLAG_ONESHOT, /* XXX: set according to device info... */ dev_crypto_md5_init, dev_crypto_md5_update, dev_crypto_md5_final, From fc85ac20c7540c2db46235f32b3505db6ca7f304 Mon Sep 17 00:00:00 2001 From: "Dr. Stephen Henson" Date: Thu, 22 Aug 2002 23:43:48 +0000 Subject: [PATCH 30/55] Make -nameopt work in req and add support for -reqopt --- CHANGES | 3 + apps/apps.c | 1 + apps/req.c | 14 ++- crypto/asn1/t_req.c | 263 +++++++++++++++++++++++++------------------- crypto/x509/x509.h | 2 + 5 files changed, 168 insertions(+), 115 deletions(-) diff --git a/CHANGES b/CHANGES index 9d1ba42e9..36a393c4b 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,9 @@ Changes between 0.9.7 and 0.9.8 [xx XXX 2002] + *) Make -nameopt work fully for req and add -reqopt switch. + [Michael Bell , Steve Henson] + *) Add support for ECC-based ciphersuites from draft-ietf-tls-ecc-01.txt. As these are not official, they are not included in "ALL"; the "ECCdraft" ciphersuite group alias can be used to select them. diff --git a/apps/apps.c b/apps/apps.c index 6f64e6313..1a24b1c59 100644 --- a/apps/apps.c +++ b/apps/apps.c @@ -1088,6 +1088,7 @@ int set_cert_ex(unsigned long *flags, const char *arg) { "no_extensions", X509_FLAG_NO_EXTENSIONS, 0}, { "no_sigdump", X509_FLAG_NO_SIGDUMP, 0}, { "no_aux", X509_FLAG_NO_AUX, 0}, + { "no_attributes", X509_FLAG_NO_ATTRIBUTES, 0}, { "ext_default", X509V3_EXT_DEFAULT, X509V3_EXT_UNKNOWN_MASK}, { "ext_error", X509V3_EXT_ERROR_UNKNOWN, X509V3_EXT_UNKNOWN_MASK}, { "ext_parse", X509V3_EXT_PARSE_UNKNOWN, X509V3_EXT_UNKNOWN_MASK}, diff --git a/apps/req.c b/apps/req.c index 1105e59e6..c4bec0543 100644 --- a/apps/req.c +++ b/apps/req.c @@ -155,7 +155,7 @@ int MAIN(int argc, char **argv) #ifndef OPENSSL_NO_ECDSA EC_KEY *ec_params = NULL; #endif - unsigned long nmflag = 0; + unsigned long nmflag = 0, reqflag = 0; int ex=1,x509=0,days=30; X509 *x509ss=NULL; X509_REQ *req=NULL; @@ -408,6 +408,11 @@ int MAIN(int argc, char **argv) if (--argc < 1) goto bad; if (!set_name_ex(&nmflag, *(++argv))) goto bad; } + else if (strcmp(*argv,"-reqopt") == 0) + { + if (--argc < 1) goto bad; + if (!set_cert_ex(&reqflag, *(++argv))) goto bad; + } else if (strcmp(*argv,"-subject") == 0) subject=1; else if (strcmp(*argv,"-text") == 0) @@ -503,7 +508,8 @@ bad: BIO_printf(bio_err," -extensions .. specify certificate extension section (override value in config file)\n"); BIO_printf(bio_err," -reqexts .. specify request extension section (override value in config file)\n"); BIO_printf(bio_err," -utf8 input characters are UTF8 (default ASCII)\n"); - BIO_printf(bio_err," -nameopt arg - various certificate name options\n"); + BIO_printf(bio_err," -nameopt arg - various certificate name options\n"); + BIO_printf(bio_err," -reqopt arg - various request text options\n\n"); goto end; } @@ -1051,9 +1057,9 @@ loop: if (text) { if (x509) - X509_print(out,x509ss); + X509_print_ex(out, x509ss, nmflag, reqflag); else - X509_REQ_print(out,req); + X509_REQ_print_ex(out, req, nmflag, reqflag); } if(subject) diff --git a/crypto/asn1/t_req.c b/crypto/asn1/t_req.c index 7cf09a464..7ebb39b21 100644 --- a/crypto/asn1/t_req.c +++ b/crypto/asn1/t_req.c @@ -82,7 +82,7 @@ int X509_REQ_print_fp(FILE *fp, X509_REQ *x) } #endif -int X509_REQ_print(BIO *bp, X509_REQ *x) +int X509_REQ_print_ex(BIO *bp, X509_REQ *x, unsigned long nmflags, unsigned long cflag) { unsigned long l; int i; @@ -92,152 +92,193 @@ int X509_REQ_print(BIO *bp, X509_REQ *x) STACK_OF(X509_ATTRIBUTE) *sk; STACK_OF(X509_EXTENSION) *exts; char str[128]; + char mlch = ' '; + int nmindent = 0; + + if((nmflags & XN_FLAG_SEP_MASK) == XN_FLAG_SEP_MULTILINE) { + mlch = '\n'; + nmindent = 12; + } + + if(nmflags == X509_FLAG_COMPAT) + nmindent = 16; + ri=x->req_info; - sprintf(str,"Certificate Request:\n"); - if (BIO_puts(bp,str) <= 0) goto err; - sprintf(str,"%4sData:\n",""); - if (BIO_puts(bp,str) <= 0) goto err; - - neg=(ri->version->type == V_ASN1_NEG_INTEGER)?"-":""; - l=0; - for (i=0; iversion->length; i++) - { l<<=8; l+=ri->version->data[i]; } - sprintf(str,"%8sVersion: %s%lu (%s0x%lx)\n","",neg,l,neg,l); - if (BIO_puts(bp,str) <= 0) goto err; - sprintf(str,"%8sSubject: ",""); - if (BIO_puts(bp,str) <= 0) goto err; - - X509_NAME_print(bp,ri->subject,16); - sprintf(str,"\n%8sSubject Public Key Info:\n",""); - if (BIO_puts(bp,str) <= 0) goto err; - i=OBJ_obj2nid(ri->pubkey->algor->algorithm); - sprintf(str,"%12sPublic Key Algorithm: %s\n","", - (i == NID_undef)?"UNKNOWN":OBJ_nid2ln(i)); - if (BIO_puts(bp,str) <= 0) goto err; - - pkey=X509_REQ_get_pubkey(x); -#ifndef OPENSSL_NO_RSA - if (pkey != NULL && pkey->type == EVP_PKEY_RSA) + if(!(cflag & X509_FLAG_NO_HEADER)) { - BIO_printf(bp,"%12sRSA Public Key: (%d bit)\n","", - BN_num_bits(pkey->pkey.rsa->n)); - RSA_print(bp,pkey->pkey.rsa,16); + if (BIO_write(bp,"Certificate Request:\n",21) <= 0) goto err; + if (BIO_write(bp," Data:\n",10) <= 0) goto err; } - else + if(!(cflag & X509_FLAG_NO_VERSION)) + { + neg=(ri->version->type == V_ASN1_NEG_INTEGER)?"-":""; + l=0; + for (i=0; iversion->length; i++) + { l<<=8; l+=ri->version->data[i]; } + sprintf(str,"%8sVersion: %s%lu (%s0x%lx)\n","",neg,l,neg,l); + if (BIO_puts(bp,str) <= 0) goto err; + } + if(!(cflag & X509_FLAG_NO_SUBJECT)) + { + if (BIO_printf(bp," Subject:%c",mlch) <= 0) goto err; + if (X509_NAME_print_ex(bp,ri->subject,nmindent, nmflags) < 0) goto err; + if (BIO_write(bp,"\n",1) <= 0) goto err; + } + if(!(cflag & X509_FLAG_NO_PUBKEY)) + { + if (BIO_write(bp," Subject Public Key Info:\n",33) <= 0) + goto err; + if (BIO_printf(bp,"%12sPublic Key Algorithm: ","") <= 0) + goto err; + if (i2a_ASN1_OBJECT(bp, ri->pubkey->algor->algorithm) <= 0) + goto err; + if (BIO_puts(bp, "\n") <= 0) + goto err; + + pkey=X509_REQ_get_pubkey(x); + if (pkey == NULL) + { + BIO_printf(bp,"%12sUnable to load Public Key\n",""); + ERR_print_errors(bp); + } + else +#ifndef OPENSSL_NO_RSA + if (pkey->type == EVP_PKEY_RSA) + { + BIO_printf(bp,"%12sRSA Public Key: (%d bit)\n","", + BN_num_bits(pkey->pkey.rsa->n)); + RSA_print(bp,pkey->pkey.rsa,16); + } + else #endif #ifndef OPENSSL_NO_DSA - if (pkey != NULL && pkey->type == EVP_PKEY_DSA) - { - BIO_printf(bp,"%12sDSA Public Key:\n",""); - DSA_print(bp,pkey->pkey.dsa,16); - } - else + if (pkey->type == EVP_PKEY_DSA) + { + BIO_printf(bp,"%12sDSA Public Key:\n",""); + DSA_print(bp,pkey->pkey.dsa,16); + } + else #endif #ifndef OPENSSL_NO_EC - if (pkey != NULL && pkey->type == EVP_PKEY_EC) + if (pkey->type == EVP_PKEY_EC) { BIO_printf(bp, "%12sEC Public Key: \n",""); EC_KEY_print(bp, pkey->pkey.eckey, 16); } else #endif + BIO_printf(bp,"%12sUnknown Public Key:\n",""); - BIO_printf(bp,"%12sUnknown Public Key:\n",""); + EVP_PKEY_free(pkey); + } - if (pkey != NULL) - EVP_PKEY_free(pkey); - - /* may not be */ - sprintf(str,"%8sAttributes:\n",""); - if (BIO_puts(bp,str) <= 0) goto err; - - sk=x->req_info->attributes; - if (sk_X509_ATTRIBUTE_num(sk) == 0) + if(!(cflag & X509_FLAG_NO_ATTRIBUTES)) { - sprintf(str,"%12sa0:00\n",""); + /* may not be */ + sprintf(str,"%8sAttributes:\n",""); if (BIO_puts(bp,str) <= 0) goto err; - } - else - { - for (i=0; iobject))) - continue; - sprintf(str,"%12s",""); + sk=x->req_info->attributes; + if (sk_X509_ATTRIBUTE_num(sk) == 0) + { + sprintf(str,"%12sa0:00\n",""); if (BIO_puts(bp,str) <= 0) goto err; - if ((j=i2a_ASN1_OBJECT(bp,a->object)) > 0) + } + else { - if (a->single) + for (i=0; ivalue.single; - type=t->type; - bs=t->value.bit_string; - } - else + ASN1_TYPE *at; + X509_ATTRIBUTE *a; + ASN1_BIT_STRING *bs=NULL; + ASN1_TYPE *t; + int j,type=0,count=1,ii=0; + + a=sk_X509_ATTRIBUTE_value(sk,i); + if(X509_REQ_extension_nid(OBJ_obj2nid(a->object))) + continue; + sprintf(str,"%12s",""); + if (BIO_puts(bp,str) <= 0) goto err; + if ((j=i2a_ASN1_OBJECT(bp,a->object)) > 0) { - ii=0; - count=sk_ASN1_TYPE_num(a->value.set); + if (a->single) + { + t=a->value.single; + type=t->type; + bs=t->value.bit_string; + } + else + { + ii=0; + count=sk_ASN1_TYPE_num(a->value.set); get_next: - at=sk_ASN1_TYPE_value(a->value.set,ii); - type=at->type; - bs=at->value.asn1_string; + at=sk_ASN1_TYPE_value(a->value.set,ii); + type=at->type; + bs=at->value.asn1_string; + } + } + for (j=25-j; j>0; j--) + if (BIO_write(bp," ",1) != 1) goto err; + if (BIO_puts(bp,":") <= 0) goto err; + if ( (type == V_ASN1_PRINTABLESTRING) || + (type == V_ASN1_T61STRING) || + (type == V_ASN1_IA5STRING)) + { + if (BIO_write(bp,(char *)bs->data,bs->length) + != bs->length) + goto err; + BIO_puts(bp,"\n"); + } + else + { + BIO_puts(bp,"unable to print attribute\n"); + } + if (++ii < count) goto get_next; } } - for (j=25-j; j>0; j--) - if (BIO_write(bp," ",1) != 1) goto err; - if (BIO_puts(bp,":") <= 0) goto err; - if ( (type == V_ASN1_PRINTABLESTRING) || - (type == V_ASN1_T61STRING) || - (type == V_ASN1_IA5STRING)) + } + if(!(cflag & X509_FLAG_NO_ATTRIBUTES)) + { + exts = X509_REQ_get_extensions(x); + if(exts) + { + BIO_printf(bp,"%8sRequested Extensions:\n",""); + for (i=0; idata,bs->length) - != bs->length) + ASN1_OBJECT *obj; + X509_EXTENSION *ex; + int j; + ex=sk_X509_EXTENSION_value(exts, i); + if (BIO_printf(bp,"%12s","") <= 0) goto err; + obj=X509_EXTENSION_get_object(ex); + i2a_ASN1_OBJECT(bp,obj); + j=X509_EXTENSION_get_critical(ex); + if (BIO_printf(bp,": %s\n",j?"critical":"","") <= 0) goto err; - BIO_puts(bp,"\n"); + if(!X509V3_EXT_print(bp, ex, 0, 16)) + { + BIO_printf(bp, "%16s", ""); + M_ASN1_OCTET_STRING_print(bp,ex->value); + } + if (BIO_write(bp,"\n",1) <= 0) goto err; } - else - { - BIO_puts(bp,"unable to print attribute\n"); - } - if (++ii < count) goto get_next; + sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free); } } - exts = X509_REQ_get_extensions(x); - if(exts) { - BIO_printf(bp,"%8sRequested Extensions:\n",""); - for (i=0; ivalue); - } - if (BIO_write(bp,"\n",1) <= 0) goto err; + if(!(cflag & X509_FLAG_NO_SIGDUMP)) + { + if(!X509_signature_print(bp, x->sig_alg, x->signature)) goto err; } - sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free); - } - - if(!X509_signature_print(bp, x->sig_alg, x->signature)) goto err; return(1); err: X509err(X509_F_X509_REQ_PRINT,ERR_R_BUF_LIB); return(0); } + +int X509_REQ_print(BIO *bp, X509_REQ *x) + { + return X509_REQ_print_ex(bp, x, XN_FLAG_COMPAT, X509_FLAG_COMPAT); + } diff --git a/crypto/x509/x509.h b/crypto/x509/x509.h index 8b42b09f6..96d3b6988 100644 --- a/crypto/x509/x509.h +++ b/crypto/x509/x509.h @@ -348,6 +348,7 @@ DECLARE_STACK_OF(X509_TRUST) #define X509_FLAG_NO_EXTENSIONS (1L << 8) #define X509_FLAG_NO_SIGDUMP (1L << 9) #define X509_FLAG_NO_AUX (1L << 10) +#define X509_FLAG_NO_ATTRIBUTES (1L << 11) /* Flags specific to X509_NAME_print_ex() */ @@ -1060,6 +1061,7 @@ int X509_print(BIO *bp,X509 *x); int X509_ocspid_print(BIO *bp,X509 *x); int X509_CERT_AUX_print(BIO *bp,X509_CERT_AUX *x, int indent); int X509_CRL_print(BIO *bp,X509_CRL *x); +int X509_REQ_print_ex(BIO *bp, X509_REQ *x, unsigned long nmflag, unsigned long cflag); int X509_REQ_print(BIO *bp,X509_REQ *req); #endif From 41ab00bedf7259c60555a080219ed68e1afb8a22 Mon Sep 17 00:00:00 2001 From: "Dr. Stephen Henson" Date: Fri, 23 Aug 2002 00:02:11 +0000 Subject: [PATCH 31/55] Reinstate the check for invalid length BIT STRINGS, which was effectively bypassed in the ASN1 changed. --- crypto/asn1/a_bitstr.c | 6 ++++++ crypto/asn1/tasn_dec.c | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/crypto/asn1/a_bitstr.c b/crypto/asn1/a_bitstr.c index ed0bdfbde..e0265f69d 100644 --- a/crypto/asn1/a_bitstr.c +++ b/crypto/asn1/a_bitstr.c @@ -120,6 +120,12 @@ ASN1_BIT_STRING *c2i_ASN1_BIT_STRING(ASN1_BIT_STRING **a, unsigned char **pp, unsigned char *p,*s; int i; + if (len < 1) + { + i=ASN1_R_STRING_TOO_SHORT; + goto err; + } + if ((a == NULL) || ((*a) == NULL)) { if ((ret=M_ASN1_BIT_STRING_new()) == NULL) return(NULL); diff --git a/crypto/asn1/tasn_dec.c b/crypto/asn1/tasn_dec.c index 0fc1f421e..f87c08793 100644 --- a/crypto/asn1/tasn_dec.c +++ b/crypto/asn1/tasn_dec.c @@ -913,10 +913,10 @@ static int asn1_check_tlen(long *olen, int *otag, unsigned char *oclass, char *i ctx->ptag = ptag; ctx->hdrlen = p - q; ctx->valid = 1; - /* If definite length, length + header can't exceed total - * amount of data available. + /* If definite length, and no error, length + + * header can't exceed total amount of data available. */ - if(!(i & 1) && ((plen + ctx->hdrlen) > len)) { + if(!(i & 0x81) && ((plen + ctx->hdrlen) > len)) { ASN1err(ASN1_F_ASN1_CHECK_TLEN, ASN1_R_TOO_LONG); asn1_tlc_clear(ctx); return 0; From d4a8f90cabb74cbc2d5eaa463f4e7f2a81f50db1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Mon, 26 Aug 2002 11:20:50 +0000 Subject: [PATCH 32/55] ecdsa => ec Submitted by: Nils Larsch --- apps/Makefile.ssl | 56 +++++++++++++++++++++--------------------- apps/{ecdsa.c => ec.c} | 13 +++++----- apps/makeapps.com | 4 +-- apps/progs.h | 8 +++--- apps/progs.pl | 4 +-- 5 files changed, 43 insertions(+), 42 deletions(-) rename apps/{ecdsa.c => ec.c} (98%) diff --git a/apps/Makefile.ssl b/apps/Makefile.ssl index 0272d551d..c75c5f3b8 100644 --- a/apps/Makefile.ssl +++ b/apps/Makefile.ssl @@ -42,7 +42,7 @@ SCRIPTS=CA.sh CA.pl der_chop EXE= $(PROGRAM)$(EXE_EXT) E_EXE= verify asn1pars req dgst dh dhparam enc passwd gendh errstr \ - ca crl rsa rsautl dsa dsaparam ecdsa ecparam \ + ca crl rsa rsautl dsa dsaparam ec ecparam \ x509 genrsa gendsa s_server s_client speed \ s_time version pkcs7 crl2pkcs7 sess_id ciphers nseq pkcs12 \ pkcs8 spkac smime rand engine ocsp @@ -58,14 +58,14 @@ RAND_SRC=app_rand.c E_OBJ= verify.o asn1pars.o req.o dgst.o dh.o dhparam.o enc.o passwd.o gendh.o errstr.o \ ca.o pkcs7.o crl2p7.o crl.o \ - rsa.o rsautl.o dsa.o dsaparam.o ecdsa.o ecparam.o \ + rsa.o rsautl.o dsa.o dsaparam.o ec.o ecparam.o \ x509.o genrsa.o gendsa.o s_server.o s_client.o speed.o \ s_time.o $(A_OBJ) $(S_OBJ) $(RAND_OBJ) version.o sess_id.o \ ciphers.o nseq.o pkcs12.o pkcs8.o spkac.o smime.o rand.o engine.o ocsp.o E_SRC= verify.c asn1pars.c req.c dgst.c dh.c enc.c passwd.c gendh.c errstr.c ca.c \ pkcs7.c crl2p7.c crl.c \ - rsa.c rsautl.c dsa.c dsaparam.c ecdsa.c ecparam.c \ + rsa.c rsautl.c dsa.c dsaparam.c ec.c ecparam.c \ x509.c genrsa.c gendsa.c s_server.c s_client.c speed.c \ s_time.c $(A_SRC) $(S_SRC) $(RAND_SRC) version.c sess_id.c \ ciphers.c nseq.c pkcs12.c pkcs8.c spkac.c smime.c rand.c engine.c ocsp.c @@ -437,31 +437,31 @@ dsaparam.o: ../include/openssl/stack.h ../include/openssl/symhacks.h dsaparam.o: ../include/openssl/txt_db.h ../include/openssl/ui.h dsaparam.o: ../include/openssl/ui_compat.h ../include/openssl/x509.h dsaparam.o: ../include/openssl/x509_vfy.h apps.h dsaparam.c -ecdsa.o: ../e_os.h ../include/openssl/aes.h ../include/openssl/asn1.h -ecdsa.o: ../include/openssl/bio.h ../include/openssl/blowfish.h -ecdsa.o: ../include/openssl/bn.h ../include/openssl/buffer.h -ecdsa.o: ../include/openssl/cast.h ../include/openssl/conf.h -ecdsa.o: ../include/openssl/crypto.h ../include/openssl/des.h -ecdsa.o: ../include/openssl/des_old.h ../include/openssl/dh.h -ecdsa.o: ../include/openssl/dsa.h ../include/openssl/e_os2.h -ecdsa.o: ../include/openssl/ec.h ../include/openssl/ecdh.h -ecdsa.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h -ecdsa.o: ../include/openssl/err.h ../include/openssl/evp.h -ecdsa.o: ../include/openssl/idea.h ../include/openssl/lhash.h -ecdsa.o: ../include/openssl/md2.h ../include/openssl/md4.h -ecdsa.o: ../include/openssl/md5.h ../include/openssl/mdc2.h -ecdsa.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h -ecdsa.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h -ecdsa.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h -ecdsa.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h -ecdsa.o: ../include/openssl/rand.h ../include/openssl/rc2.h -ecdsa.o: ../include/openssl/rc4.h ../include/openssl/rc5.h -ecdsa.o: ../include/openssl/ripemd.h ../include/openssl/rsa.h -ecdsa.o: ../include/openssl/safestack.h ../include/openssl/sha.h -ecdsa.o: ../include/openssl/stack.h ../include/openssl/symhacks.h -ecdsa.o: ../include/openssl/txt_db.h ../include/openssl/ui.h -ecdsa.o: ../include/openssl/ui_compat.h ../include/openssl/x509.h -ecdsa.o: ../include/openssl/x509_vfy.h apps.h ecdsa.c +ec.o: ../e_os.h ../include/openssl/aes.h ../include/openssl/asn1.h +ec.o: ../include/openssl/bio.h ../include/openssl/blowfish.h +ec.o: ../include/openssl/bn.h ../include/openssl/buffer.h +ec.o: ../include/openssl/cast.h ../include/openssl/conf.h +ec.o: ../include/openssl/crypto.h ../include/openssl/des.h +ec.o: ../include/openssl/des_old.h ../include/openssl/dh.h +ec.o: ../include/openssl/dsa.h ../include/openssl/e_os2.h +ec.o: ../include/openssl/ec.h ../include/openssl/ecdh.h +ec.o: ../include/openssl/ecdsa.h ../include/openssl/engine.h +ec.o: ../include/openssl/err.h ../include/openssl/evp.h +ec.o: ../include/openssl/idea.h ../include/openssl/lhash.h +ec.o: ../include/openssl/md2.h ../include/openssl/md4.h +ec.o: ../include/openssl/md5.h ../include/openssl/mdc2.h +ec.o: ../include/openssl/obj_mac.h ../include/openssl/objects.h +ec.o: ../include/openssl/opensslconf.h ../include/openssl/opensslv.h +ec.o: ../include/openssl/ossl_typ.h ../include/openssl/pem.h +ec.o: ../include/openssl/pem2.h ../include/openssl/pkcs7.h +ec.o: ../include/openssl/rand.h ../include/openssl/rc2.h +ec.o: ../include/openssl/rc4.h ../include/openssl/rc5.h +ec.o: ../include/openssl/ripemd.h ../include/openssl/rsa.h +ec.o: ../include/openssl/safestack.h ../include/openssl/sha.h +ec.o: ../include/openssl/stack.h ../include/openssl/symhacks.h +ec.o: ../include/openssl/txt_db.h ../include/openssl/ui.h +ec.o: ../include/openssl/ui_compat.h ../include/openssl/x509.h +ec.o: ../include/openssl/x509_vfy.h apps.h ec.c ecparam.o: ../e_os.h ../include/openssl/aes.h ../include/openssl/asn1.h ecparam.o: ../include/openssl/bio.h ../include/openssl/blowfish.h ecparam.o: ../include/openssl/bn.h ../include/openssl/buffer.h diff --git a/apps/ecdsa.c b/apps/ec.c similarity index 98% rename from apps/ecdsa.c rename to apps/ec.c index f54590d61..79d0df986 100644 --- a/apps/ecdsa.c +++ b/apps/ec.c @@ -1,4 +1,7 @@ -/* apps/ecdsa.c */ +/* apps/ec.c */ +/* + * Written by Nils Larsch for the OpenSSL project. + */ /* ==================================================================== * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. * @@ -53,7 +56,7 @@ * */ -#ifndef OPENSSL_NO_ECDSA +#ifndef OPENSSL_NO_EC #include #include #include @@ -61,12 +64,10 @@ #include #include #include -#include -#include #include #undef PROG -#define PROG ecdsa_main +#define PROG ec_main /* -inform arg - input format - default PEM (one of DER, NET or PEM) * -outform arg - output format - default PEM @@ -275,7 +276,7 @@ bad: } } - BIO_printf(bio_err, "read ECDSA key\n"); + BIO_printf(bio_err, "read EC key\n"); if (informat == FORMAT_ASN1) { if (pubin) diff --git a/apps/makeapps.com b/apps/makeapps.com index b03c44535..cfb959151 100644 --- a/apps/makeapps.com +++ b/apps/makeapps.com @@ -155,13 +155,13 @@ $! Define The Application Files. $! $ LIB_FILES = "VERIFY;ASN1PARS;REQ;DGST;DH;DHPARAM;ENC;PASSWD;GENDH;ERRSTR;"+- "CA;PKCS7;CRL2P7;CRL;"+- - "RSA;RSAUTL;DSA;DSAPARAM;ECDSA;ECPARAM;"+- + "RSA;RSAUTL;DSA;DSAPARAM;EC;ECPARAM;"+- "X509;GENRSA;GENDSA;S_SERVER;S_CLIENT;SPEED;"+- "S_TIME;APPS;S_CB;S_SOCKET;APP_RAND;VERSION;SESS_ID;"+- "CIPHERS;NSEQ;PKCS12;PKCS8;SPKAC;SMIME;RAND;ENGINE;OCSP" $ APP_FILES := OPENSSL,'OBJ_DIR'VERIFY.OBJ,ASN1PARS.OBJ,REQ.OBJ,DGST.OBJ,DH.OBJ,DHPARAM.OBJ,ENC.OBJ,PASSWD.OBJ,GENDH.OBJ,ERRSTR.OBJ,- CA.OBJ,PKCS7.OBJ,CRL2P7.OBJ,CRL.OBJ,- - RSA.OBJ,RSAUTL.OBJ,DSA.OBJ,DSAPARAM.OBJ,ECDSA.OBJ,ECPARAM.OBJ,- + RSA.OBJ,RSAUTL.OBJ,DSA.OBJ,DSAPARAM.OBJ,EC.OBJ,ECPARAM.OBJ,- X509.OBJ,GENRSA.OBJ,GENDSA.OBJ,S_SERVER.OBJ,S_CLIENT.OBJ,SPEED.OBJ,- S_TIME.OBJ,APPS.OBJ,S_CB.OBJ,S_SOCKET.OBJ,APP_RAND.OBJ,VERSION.OBJ,SESS_ID.OBJ,- CIPHERS.OBJ,NSEQ.OBJ,PKCS12.OBJ,PKCS8.OBJ,SPKAC.OBJ,SMIME.OBJ,RAND.OBJ,ENGINE.OBJ,OCSP.OBJ diff --git a/apps/progs.h b/apps/progs.h index 6498e3fb2..999de31bd 100644 --- a/apps/progs.h +++ b/apps/progs.h @@ -17,7 +17,7 @@ extern int rsa_main(int argc,char *argv[]); extern int rsautl_main(int argc,char *argv[]); extern int dsa_main(int argc,char *argv[]); extern int dsaparam_main(int argc,char *argv[]); -extern int ecdsa_main(int argc,char *argv[]); +extern int ec_main(int argc,char *argv[]); extern int ecparam_main(int argc,char *argv[]); extern int x509_main(int argc,char *argv[]); extern int genrsa_main(int argc,char *argv[]); @@ -81,10 +81,10 @@ FUNCTION functions[] = { #ifndef OPENSSL_NO_DSA {FUNC_TYPE_GENERAL,"dsaparam",dsaparam_main}, #endif -#ifndef OPENSSL_NO_ECDSA - {FUNC_TYPE_GENERAL,"ecdsa",ecdsa_main}, +#ifndef OPENSSL_NO_EC + {FUNC_TYPE_GENERAL,"ec",ec_main}, #endif -#ifndef OPENSSL_NO_ECDSA +#ifndef OPENSSL_NO_EC {FUNC_TYPE_GENERAL,"ecparam",ecparam_main}, #endif {FUNC_TYPE_GENERAL,"x509",x509_main}, diff --git a/apps/progs.pl b/apps/progs.pl index 7672d076c..c94f49bbf 100644 --- a/apps/progs.pl +++ b/apps/progs.pl @@ -33,8 +33,8 @@ foreach (@ARGV) { print "#ifndef OPENSSL_NO_RSA\n${str}#endif\n"; } elsif ( ($_ =~ /^dsa$/) || ($_ =~ /^gendsa$/) || ($_ =~ /^dsaparam$/)) { print "#ifndef OPENSSL_NO_DSA\n${str}#endif\n"; } - elsif ( ($_ =~ /^ecdsa$/) || ($_ =~ /^ecdsaparam$/)) - { print "#ifndef OPENSSL_NO_ECDSA\n${str}#endif\n";} + elsif ( ($_ =~ /^ec$/) || ($_ =~ /^ecparam$/)) + { print "#ifndef OPENSSL_NO_EC\n${str}#endif\n";} elsif ( ($_ =~ /^dh$/) || ($_ =~ /^gendh$/) || ($_ =~ /^dhparam$/)) { print "#ifndef OPENSSL_NO_DH\n${str}#endif\n"; } elsif ( ($_ =~ /^pkcs12$/)) From ad55f581f93592705617039cd4b5ed8dc02b6192 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Mon, 26 Aug 2002 11:25:14 +0000 Subject: [PATCH 33/55] fix offsets Submitted by: Nils Larsch --- apps/req.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/req.c b/apps/req.c index c4bec0543..79b1ded73 100644 --- a/apps/req.c +++ b/apps/req.c @@ -328,13 +328,13 @@ int MAIN(int argc, char **argv) else #endif #ifndef OPENSSL_NO_ECDSA - if (strncmp("ec:",p,4) == 0) + if (strncmp("ec:",p,3) == 0) { X509 *xtmp=NULL; EVP_PKEY *dtmp; pkey_type=TYPE_EC; - p+=6; + p+=3; if ((in=BIO_new_file(p,"r")) == NULL) { perror(p); From 7e31164ae08fdc00fb62f749f7b6d18aaa75523e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Mon, 26 Aug 2002 11:25:54 +0000 Subject: [PATCH 34/55] ASN1 for binary curves Submitted by: Nils Larsch --- crypto/asn1/t_pkey.c | 28 ++- crypto/ec/ec.h | 8 + crypto/ec/ec_asn1.c | 490 ++++++++++++++++++++++++++++++------------- crypto/ec/ec_lib.c | 39 ++++ util/libeay.num | 2 + 5 files changed, 425 insertions(+), 142 deletions(-) diff --git a/crypto/asn1/t_pkey.c b/crypto/asn1/t_pkey.c index 964fd914f..0a20311c5 100644 --- a/crypto/asn1/t_pkey.c +++ b/crypto/asn1/t_pkey.c @@ -412,13 +412,32 @@ int ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off) if (BIO_write(bp, str, off) <= 0) goto err; } - + /* print the 'short name' of the field type */ if (BIO_printf(bp, "Field Type: %s\n", OBJ_nid2sn(tmp_nid)) <= 0) goto err; if (is_char_two) { + /* print the 'short name' of the base type OID */ + int basis_type = EC_GROUP_get_basis_type(x, NULL, + NULL, NULL); + if (basis_type == 0) + goto err; + + if (off) + { + if (off > 128) off=128; + memset(str,' ',off); + if (BIO_write(bp, str, off) <= 0) + goto err; + } + + if (BIO_printf(bp, "Basis Type: %s\n", + OBJ_nid2sn(basis_type)) <= 0) + goto err; + + /* print the polynomial */ if ((p != NULL) && !print(bp, "Polynomial:", p, buffer, off)) goto err; @@ -565,6 +584,13 @@ static int print(BIO *bp, const char *number, BIGNUM *num, unsigned char *buf, if (BIO_write(bp,str,off) <= 0) return(0); } + if (BN_is_zero(num)) + { + if (BIO_printf(bp, "%s 0\n", number) <= 0) + return 0; + return 1; + } + if (BN_num_bytes(num) <= BN_BYTES) { if (BIO_printf(bp,"%s %s%lu (%s0x%lx)\n",number,neg, diff --git a/crypto/ec/ec.h b/crypto/ec/ec.h index 4eb4ad678..51cc3f8c0 100644 --- a/crypto/ec/ec.h +++ b/crypto/ec/ec.h @@ -191,6 +191,14 @@ const char *EC_GROUP_get0_comment(int nid); * with the given index i from the internal curve list */ int ec_group_index2nid(int i); +/* EC_GROUP_get_basis_type() returns the NID of the basis type + * used to represent the field elements (in case of a pentanomial or trinomial + * basis the coefficient are returned in the k? arguments) */ +int EC_GROUP_get_basis_type(const EC_GROUP *, unsigned int *k1, + unsigned int *k2, unsigned int *k3); + + +/* EC_POINT functions */ EC_POINT *EC_POINT_new(const EC_GROUP *); void EC_POINT_free(EC_POINT *); diff --git a/crypto/ec/ec_asn1.c b/crypto/ec/ec_asn1.c index 8aa07c4dc..26f3916d0 100644 --- a/crypto/ec/ec_asn1.c +++ b/crypto/ec/ec_asn1.c @@ -1,4 +1,7 @@ /* crypto/ec/ec_asn1.c */ +/* + * Written by Nils Larsch for the OpenSSL project. + */ /* ==================================================================== * Copyright (c) 2000-2002 The OpenSSL Project. All rights reserved. * @@ -58,7 +61,6 @@ #include #include #include -#include /* some structures needed for the asn1 encoding */ typedef struct x9_62_fieldid_st { @@ -67,15 +69,15 @@ typedef struct x9_62_fieldid_st { } X9_62_FIELDID; typedef struct x9_62_characteristic_two_st { - ASN1_INTEGER *m; + long m; ASN1_OBJECT *basis; ASN1_TYPE *parameters; } X9_62_CHARACTERISTIC_TWO; typedef struct x9_62_pentanomial_st { - ASN1_INTEGER k1; - ASN1_INTEGER k2; - ASN1_INTEGER k3; + long k1; + long k2; + long k3; } X9_62_PENTANOMIAL; typedef struct x9_62_curve_st { @@ -85,7 +87,7 @@ typedef struct x9_62_curve_st { } X9_62_CURVE; typedef struct ec_parameters_st { - ASN1_INTEGER *version; + long version; X9_62_FIELDID *fieldID; X9_62_CURVE *curve; ASN1_OCTET_STRING *base; @@ -104,7 +106,7 @@ struct ecpk_parameters_st { /* SEC1 ECPrivateKey */ typedef struct ec_privatekey_st { - int version; + long version; ASN1_OCTET_STRING *privateKey; ECPKPARAMETERS *parameters; ASN1_BIT_STRING *publicKey; @@ -122,7 +124,7 @@ DECLARE_ASN1_ENCODE_FUNCTIONS_const(X9_62_FIELDID, X9_62_FIELDID) IMPLEMENT_ASN1_FUNCTIONS_const(X9_62_FIELDID) ASN1_SEQUENCE(X9_62_CHARACTERISTIC_TWO) = { - ASN1_SIMPLE(X9_62_CHARACTERISTIC_TWO, m, ASN1_INTEGER), + ASN1_SIMPLE(X9_62_CHARACTERISTIC_TWO, m, LONG), ASN1_SIMPLE(X9_62_CHARACTERISTIC_TWO, basis, ASN1_OBJECT), ASN1_SIMPLE(X9_62_CHARACTERISTIC_TWO, parameters, ASN1_ANY) } ASN1_SEQUENCE_END(X9_62_CHARACTERISTIC_TWO) @@ -132,9 +134,9 @@ DECLARE_ASN1_ENCODE_FUNCTIONS_const(X9_62_CHARACTERISTIC_TWO, X9_62_CHARACTERIST IMPLEMENT_ASN1_FUNCTIONS_const(X9_62_CHARACTERISTIC_TWO) ASN1_SEQUENCE(X9_62_PENTANOMIAL) = { - ASN1_SIMPLE(X9_62_PENTANOMIAL, k1, ASN1_INTEGER), - ASN1_SIMPLE(X9_62_PENTANOMIAL, k2, ASN1_INTEGER), - ASN1_SIMPLE(X9_62_PENTANOMIAL, k3, ASN1_INTEGER) + ASN1_SIMPLE(X9_62_PENTANOMIAL, k1, LONG), + ASN1_SIMPLE(X9_62_PENTANOMIAL, k2, LONG), + ASN1_SIMPLE(X9_62_PENTANOMIAL, k3, LONG) } ASN1_SEQUENCE_END(X9_62_PENTANOMIAL) DECLARE_ASN1_FUNCTIONS_const(X9_62_PENTANOMIAL) @@ -152,7 +154,7 @@ DECLARE_ASN1_ENCODE_FUNCTIONS_const(X9_62_CURVE, X9_62_CURVE) IMPLEMENT_ASN1_FUNCTIONS_const(X9_62_CURVE) ASN1_SEQUENCE(ECPARAMETERS) = { - ASN1_SIMPLE(ECPARAMETERS, version, ASN1_INTEGER), + ASN1_SIMPLE(ECPARAMETERS, version, LONG), ASN1_SIMPLE(ECPARAMETERS, fieldID, X9_62_FIELDID), ASN1_SIMPLE(ECPARAMETERS, curve, X9_62_CURVE), ASN1_SIMPLE(ECPARAMETERS, base, ASN1_OCTET_STRING), @@ -185,22 +187,42 @@ DECLARE_ASN1_FUNCTIONS_const(EC_PRIVATEKEY) DECLARE_ASN1_ENCODE_FUNCTIONS_const(EC_PRIVATEKEY, EC_PRIVATEKEY) IMPLEMENT_ASN1_FUNCTIONS_const(EC_PRIVATEKEY) -/* some internal functions */ +/* some declarations of internal function */ +/* ec_asn1_group2field() creates a X9_62_FIELDID object from a + * EC_GROUP object */ static X9_62_FIELDID *ec_asn1_group2field(const EC_GROUP *, X9_62_FIELDID *); +/* ec_asn1_group2curve() creates a X9_62_CURVE object from a + * EC_GROUP object */ static X9_62_CURVE *ec_asn1_group2curve(const EC_GROUP *, X9_62_CURVE *); +/* ec_asn1_parameters2group() creates a EC_GROUP object from a + * ECPARAMETERS object */ static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *); -static ECPARAMETERS *ec_asn1_group2parameters(const EC_GROUP *, - ECPARAMETERS *); -EC_GROUP *EC_ASN1_pkparameters2group(const ECPKPARAMETERS *); -ECPKPARAMETERS *EC_ASN1_group2pkparameters(const EC_GROUP *, ECPKPARAMETERS *); +/* ec_asn1_group2parameters() creates a ECPARAMETERS object from a + * EC_GROUP object */ +static ECPARAMETERS *ec_asn1_group2parameters(const EC_GROUP *,ECPARAMETERS *); +/* ec_asn1_pkparameters2group() creates a EC_GROUP object from a + * ECPKPARAMETERS object */ +static EC_GROUP *ec_asn1_pkparameters2group(const ECPKPARAMETERS *); +/* ec_asn1_group2pkparameters() creates a ECPKPARAMETERS object from a + * EC_GROUP object */ +static ECPKPARAMETERS *ec_asn1_group2pkparameters(const EC_GROUP *, + ECPKPARAMETERS *); + + +/* the function definitions */ static X9_62_FIELDID *ec_asn1_group2field(const EC_GROUP *group, X9_62_FIELDID *field) { - int ok=0, nid; - X9_62_FIELDID *ret=NULL; - BIGNUM *tmp=NULL; + int ok=0, nid; + X9_62_FIELDID *ret = NULL; + X9_62_CHARACTERISTIC_TWO *char_two = NULL; + X9_62_PENTANOMIAL *penta = NULL; + BIGNUM *tmp = NULL; + unsigned char *buffer = NULL; + unsigned char *pp; + size_t buf_len = 0; if (field == NULL) { @@ -213,6 +235,7 @@ static X9_62_FIELDID *ec_asn1_group2field(const EC_GROUP *group, else { ret = field; + /* clear the old values */ if (ret->fieldType != NULL) ASN1_OBJECT_free(ret->fieldType); if (ret->parameters != NULL) @@ -220,13 +243,19 @@ static X9_62_FIELDID *ec_asn1_group2field(const EC_GROUP *group, } nid = EC_METHOD_get_field_type(EC_GROUP_method_of(group)); - + /* set OID for the field */ if ((ret->fieldType = OBJ_nid2obj(nid)) == NULL) { ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_OBJ_LIB); goto err; } + if ((ret->parameters = ASN1_TYPE_new()) == NULL) + { + ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE); + goto err; + } + if (nid == NID_X9_62_prime_field) { if ((tmp = BN_new()) == NULL) @@ -234,17 +263,14 @@ static X9_62_FIELDID *ec_asn1_group2field(const EC_GROUP *group, ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE); goto err; } - if ((ret->parameters = ASN1_TYPE_new()) == NULL) - { - ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE); - goto err; - } + /* the parameters are specified by the prime number p */ ret->parameters->type = V_ASN1_INTEGER; if (!EC_GROUP_get_curve_GFp(group, tmp, NULL, NULL, NULL)) { ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_EC_LIB); goto err; } + /* set the prime number */ ret->parameters->value.integer = BN_to_ASN1_INTEGER(tmp, NULL); if (ret->parameters->value.integer == NULL) { @@ -252,8 +278,99 @@ static X9_62_FIELDID *ec_asn1_group2field(const EC_GROUP *group, goto err; } } - else - goto err; + else /* nid == NID_X9_62_characteristic_two_field */ + { + int field_type; + unsigned int k1, k2, k3; + + char_two = X9_62_CHARACTERISTIC_TWO_new(); + if (char_two == NULL) + { + ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE); + goto err; + } + + char_two->m = (long)EC_GROUP_get_degree(group); + + field_type = EC_GROUP_get_basis_type(group, &k1, &k2, &k3); + + if (field_type == 0) + { + ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_EC_LIB); + goto err; + } + /* set base type OID */ + if ((char_two->basis = OBJ_nid2obj(field_type)) == NULL) + { + ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_OBJ_LIB); + goto err; + } + + if (field_type == NID_X9_62_tpBasis) + { + char_two->parameters->type = V_ASN1_INTEGER; + char_two->parameters->value.integer = + ASN1_INTEGER_new(); + if (char_two->parameters->value.integer == NULL) + { + ECerr(EC_F_EC_ASN1_GROUP2FIELDID, + ERR_R_ASN1_LIB); + goto err; + } + if (!ASN1_INTEGER_set(char_two->parameters->value.integer, (long)k1)) + { + ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, + ERR_R_ASN1_LIB); + goto err; + } + } + else if (field_type == NID_X9_62_ppBasis) + { + penta = X9_62_PENTANOMIAL_new(); + /* set k? values */ + penta->k1 = (long)k1; + penta->k2 = (long)k2; + penta->k3 = (long)k3; + /* get the length of the encoded structure */ + buf_len = i2d_X9_62_PENTANOMIAL(penta, NULL); + if ((buffer = OPENSSL_malloc(buf_len)) == NULL) + { + ECerr(EC_F_EC_ASN1_GROUP2FIELDID, + ERR_R_MALLOC_FAILURE); + goto err; + } + pp = buffer; + i2d_X9_62_PENTANOMIAL(penta, &pp); + /* set the encoded pentanomial */ + char_two->parameters->type=V_ASN1_SEQUENCE; + char_two->parameters->value.sequence=ASN1_STRING_new(); + ASN1_STRING_set(char_two->parameters->value.sequence, + buffer, buf_len); + + OPENSSL_free(buffer); + buffer = NULL; + } + else /* field_type == NID_X9_62_onBasis */ + { + /* for ONB the parameters are (asn1) NULL */ + char_two->parameters->type = V_ASN1_NULL; + } + /* encoded the X9_62_CHARACTERISTIC_TWO structure */ + buf_len = i2d_X9_62_CHARACTERISTIC_TWO(char_two, NULL); + + if ((buffer = OPENSSL_malloc(buf_len)) == NULL) + { + ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE); + goto err; + } + pp = buffer; + i2d_X9_62_CHARACTERISTIC_TWO(char_two, &pp); + /* set the encoded parameters */ + ret->parameters->type = V_ASN1_SEQUENCE; + ret->parameters->value.sequence = ASN1_STRING_new(); + ASN1_STRING_set(ret->parameters->value.sequence, + buffer, buf_len); + } ok = 1; @@ -265,6 +382,12 @@ err : if (!ok) } if (tmp) BN_free(tmp); + if (char_two) + X9_62_CHARACTERISTIC_TWO_free(char_two); + if (penta) + X9_62_PENTANOMIAL_free(penta); + if (buffer) + OPENSSL_free(buffer); return(ret); } @@ -317,57 +440,63 @@ static X9_62_CURVE *ec_asn1_group2curve(const EC_GROUP *group, ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_EC_LIB); goto err; } - - len_1 = (size_t)BN_num_bytes(tmp_1); - len_2 = (size_t)BN_num_bytes(tmp_2); - - if (len_1 == 0) + } + else /* nid == NID_X9_62_characteristic_two_field */ + { + if (!EC_GROUP_get_curve_GF2m(group, NULL, tmp_1, tmp_2, NULL)) { - /* len_1 == 0 => a == 0 */ - a_buf = &char_zero; - len_1 = 1; - } - else - { - if ((buffer_1 = OPENSSL_malloc(len_1)) == NULL) - { - ECerr(EC_F_EC_ASN1_GROUP2CURVE, - ERR_R_MALLOC_FAILURE); - goto err; - } - if ( (len_1 = BN_bn2bin(tmp_1, buffer_1)) == 0) - { - ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_BN_LIB); - goto err; - } - a_buf = buffer_1; - } - - if (len_2 == 0) - { - /* len_2 == 0 => b == 0 */ - b_buf = &char_zero; - len_2 = 1; - } - else - { - if ((buffer_2 = OPENSSL_malloc(len_2)) == NULL) - { - ECerr(EC_F_EC_ASN1_GROUP2CURVE, - ERR_R_MALLOC_FAILURE); - goto err; - } - if ( (len_2 = BN_bn2bin(tmp_2, buffer_2)) == 0) - { - ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_BN_LIB); - goto err; - } - b_buf = buffer_2; + ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_EC_LIB); + goto err; } } - else - goto err; + len_1 = (size_t)BN_num_bytes(tmp_1); + len_2 = (size_t)BN_num_bytes(tmp_2); + + if (len_1 == 0) + { + /* len_1 == 0 => a == 0 */ + a_buf = &char_zero; + len_1 = 1; + } + else + { + if ((buffer_1 = OPENSSL_malloc(len_1)) == NULL) + { + ECerr(EC_F_EC_ASN1_GROUP2CURVE, + ERR_R_MALLOC_FAILURE); + goto err; + } + if ( (len_1 = BN_bn2bin(tmp_1, buffer_1)) == 0) + { + ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_BN_LIB); + goto err; + } + a_buf = buffer_1; + } + + if (len_2 == 0) + { + /* len_2 == 0 => b == 0 */ + b_buf = &char_zero; + len_2 = 1; + } + else + { + if ((buffer_2 = OPENSSL_malloc(len_2)) == NULL) + { + ECerr(EC_F_EC_ASN1_GROUP2CURVE, + ERR_R_MALLOC_FAILURE); + goto err; + } + if ( (len_2 = BN_bn2bin(tmp_2, buffer_2)) == 0) + { + ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_BN_LIB); + goto err; + } + b_buf = buffer_2; + } + /* set a and b */ if ((ret->a = M_ASN1_OCTET_STRING_new()) == NULL || (ret->b = M_ASN1_OCTET_STRING_new()) == NULL ) @@ -399,11 +528,11 @@ static X9_62_CURVE *ec_asn1_group2curve(const EC_GROUP *group, ok = 1; err : if (!ok) - { + { if (ret && !curve) X9_62_CURVE_free(ret); ret = NULL; - } + } if (buffer_1) OPENSSL_free(buffer_1); if (buffer_2) @@ -413,7 +542,7 @@ err : if (!ok) if (tmp_2) BN_free(tmp_2); return(ret); -} + } static ECPARAMETERS *ec_asn1_group2parameters(const EC_GROUP *group, ECPARAMETERS *param) @@ -445,16 +574,7 @@ static ECPARAMETERS *ec_asn1_group2parameters(const EC_GROUP *group, ret = param; /* set the version (always one) */ - if (ret->version == NULL && !(ret->version = ASN1_INTEGER_new())) - { - ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_MALLOC_FAILURE); - goto err; - } - if (!ASN1_INTEGER_set(ret->version, (long)0x1)) - { - ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_ASN1_LIB); - goto err; - } + ret->version = (long)0x1; /* set the fieldID */ ret->fieldID = ec_asn1_group2field(group, ret->fieldID); @@ -549,7 +669,7 @@ err : if(!ok) return(ret); } -ECPKPARAMETERS *EC_ASN1_group2pkparameters(const EC_GROUP *group, +ECPKPARAMETERS *ec_asn1_group2pkparameters(const EC_GROUP *group, ECPKPARAMETERS *params) { int ok = 1, tmp; @@ -585,15 +705,8 @@ ECPKPARAMETERS *EC_ASN1_group2pkparameters(const EC_GROUP *group, ok = 0; } else - { - /* we have no nid => use the normal - * ECPARAMETERS structure - */ - ret->type = 1; - if ((ret->value.parameters = ec_asn1_group2parameters( - group, NULL)) == NULL) - ok = 0; - } + /* we don't kmow the nid => ERROR */ + ok = 0; } else { @@ -614,10 +727,13 @@ ECPKPARAMETERS *EC_ASN1_group2pkparameters(const EC_GROUP *group, static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *params) { - int ok=0, tmp; - EC_GROUP *ret=NULL; - BIGNUM *p=NULL, *a=NULL, *b=NULL; - EC_POINT *point=NULL; + int ok = 0, tmp; + EC_GROUP *ret = NULL; + BIGNUM *p = NULL, *a = NULL, *b = NULL; + EC_POINT *point=NULL; + X9_62_CHARACTERISTIC_TWO *char_two = NULL; + X9_62_PENTANOMIAL *penta = NULL; + unsigned char *pp; if (!params->fieldID || !params->fieldID->fieldType || !params->fieldID->parameters) @@ -626,12 +742,126 @@ static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *params) goto err; } + /* now extract the curve parameters a and b */ + if (!params->curve || !params->curve->a || + !params->curve->a->data || !params->curve->b || + !params->curve->b->data) + { + ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); + goto err; + } + a = BN_bin2bn(params->curve->a->data, params->curve->a->length, NULL); + if (a == NULL) + { + ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_BN_LIB); + goto err; + } + b = BN_bin2bn(params->curve->b->data, params->curve->b->length, NULL); + if (b == NULL) + { + ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_BN_LIB); + goto err; + } + + /* get the field parameters */ tmp = OBJ_obj2nid(params->fieldID->fieldType); if (tmp == NID_X9_62_characteristic_two_field) { - ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_NOT_IMPLEMENTED); - goto err; + ASN1_TYPE *parameters = params->fieldID->parameters; + + if (parameters->type != V_ASN1_SEQUENCE) + { + ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); + goto err; + } + + if ((p = BN_new()) == NULL) + { + ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, + ERR_R_MALLOC_FAILURE); + goto err; + } + + /* extract the X9_62_CHARACTERISTIC_TWO object */ + pp = M_ASN1_STRING_data(parameters->value.sequence); + char_two = d2i_X9_62_CHARACTERISTIC_TWO(NULL, + (const unsigned char **) &pp, + M_ASN1_STRING_length(parameters->value.sequence)); + if (char_two == NULL) + { + ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_ASN1_LIB); + goto err; + } + /* get the base type */ + tmp = OBJ_obj2nid(char_two->basis); + + if (tmp == NID_X9_62_tpBasis) + { + long tmp_long; + + if (char_two->parameters->type != V_ASN1_INTEGER || + char_two->parameters->value.integer == NULL) + { + ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, + EC_R_ASN1_ERROR); + goto err; + } + + tmp_long = ASN1_INTEGER_get(char_two->parameters->value.integer); + /* create the polynomial */ + if (!BN_set_bit(p, (int)char_two->m)) goto err; + if (!BN_set_bit(p, (int)tmp_long)) goto err; + if (!BN_set_bit(p, 0)) goto err; + } + else if (tmp == NID_X9_62_ppBasis) + { + if (char_two->parameters->type != V_ASN1_SEQUENCE || + char_two->parameters->value.sequence == NULL) + { + ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, + EC_R_ASN1_ERROR); + goto err; + } + /* extract the pentanomial data */ + pp = M_ASN1_STRING_data( + char_two->parameters->value.sequence); + penta = d2i_X9_62_PENTANOMIAL(NULL, + (const unsigned char **) &pp, + M_ASN1_STRING_length( + char_two->parameters->value.sequence)); + if (penta == NULL) + { + ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, + ERR_R_ASN1_LIB); + goto err; + } + /* create the polynomial */ + if (!BN_set_bit(p, (int)char_two->m)) goto err; + if (!BN_set_bit(p, (int)penta->k1)) goto err; + if (!BN_set_bit(p, (int)penta->k2)) goto err; + if (!BN_set_bit(p, (int)penta->k3)) goto err; + if (!BN_set_bit(p, 0)) goto err; + } + else if (tmp == NID_X9_62_onBasis) + { + ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, + EC_R_NOT_IMPLEMENTED); + goto err; + } + else /* error */ + { + ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); + goto err; + } + + /* create the EC_GROUP structure */ + ret = EC_GROUP_new_curve_GF2m(p, a, b, NULL); + if (ret == NULL) + { + ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_EC_LIB); + goto err; + } } else if (tmp == NID_X9_62_prime_field) { @@ -649,44 +879,16 @@ static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *params) ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_ASN1_LIB); goto err; } - /* now extract the curve parameters a and b */ - if (!params->curve || !params->curve->a || - !params->curve->a->data || !params->curve->b || - !params->curve->b->data) - { - ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); - goto err; - } - a = BN_bin2bn(params->curve->a->data, - params->curve->a->length, NULL); - if (a == NULL) - { - ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_BN_LIB); - goto err; - } - b = BN_bin2bn(params->curve->b->data, params->curve->b->length, NULL); - if (b == NULL) - { - ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_BN_LIB); - goto err; - } /* create the EC_GROUP structure */ -/* TODO */ ret = EC_GROUP_new_curve_GFp(p, a, b, NULL); if (ret == NULL) { ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_EC_LIB); goto err; } - /* create the generator */ - if ((point = EC_POINT_new(ret)) == NULL) goto err; - } - else - { - ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_UNKNOWN_FIELD); - goto err; } + /* extract seed (optional) */ if (params->curve->seed != NULL) { if (ret->seed != NULL) @@ -702,6 +904,7 @@ static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *params) ret->seed_len = params->curve->seed->length; } + /* extract the order, cofactor and generator */ if (!params->order || !params->cofactor || !params->base || !params->base->data) { @@ -709,6 +912,7 @@ static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *params) goto err; } + if ((point = EC_POINT_new(ret)) == NULL) goto err; a = ASN1_INTEGER_to_BN(params->order, a); b = ASN1_INTEGER_to_BN(params->cofactor, b); @@ -752,10 +956,14 @@ err: if (!ok) BN_free(b); if (point) EC_POINT_free(point); + if (char_two) + X9_62_CHARACTERISTIC_TWO_free(char_two); + if (penta) + X9_62_PENTANOMIAL_free(penta); return(ret); } -EC_GROUP *EC_ASN1_pkparameters2group(const ECPKPARAMETERS *params) +EC_GROUP *ec_asn1_pkparameters2group(const ECPKPARAMETERS *params) { EC_GROUP *ret=NULL; int tmp=0; @@ -794,13 +1002,13 @@ EC_GROUP *EC_ASN1_pkparameters2group(const ECPKPARAMETERS *params) return NULL; } else - { + { ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR); return NULL; - } + } return ret; -} + } /* EC_GROUP <-> DER encoding of ECPKPARAMETERS */ @@ -816,7 +1024,7 @@ EC_GROUP *d2i_ECPKParameters(EC_GROUP **a, const unsigned char **in, long len) return NULL; } - if ((group = EC_ASN1_pkparameters2group(params)) == NULL) + if ((group = ec_asn1_pkparameters2group(params)) == NULL) { ECerr(EC_F_D2I_ECPKPARAMETERS, EC_R_PKPARAMETERS2GROUP_FAILURE); return NULL; @@ -835,7 +1043,7 @@ EC_GROUP *d2i_ECPKParameters(EC_GROUP **a, const unsigned char **in, long len) int i2d_ECPKParameters(const EC_GROUP *a, unsigned char **out) { int ret=0; - ECPKPARAMETERS *tmp = EC_ASN1_group2pkparameters(a, NULL); + ECPKPARAMETERS *tmp = ec_asn1_group2pkparameters(a, NULL); if (tmp == NULL) { ECerr(EC_F_I2D_ECPKPARAMETERS, EC_R_GROUP2PKPARAMETERS_FAILURE); @@ -890,7 +1098,7 @@ EC_KEY *d2i_ECPrivateKey(EC_KEY **a, const unsigned char **in, long len) { if (ret->group) EC_GROUP_clear_free(ret->group); - ret->group = EC_ASN1_pkparameters2group(priv_key->parameters); + ret->group = ec_asn1_pkparameters2group(priv_key->parameters); } if (ret->group == NULL) @@ -1001,7 +1209,7 @@ int i2d_ECPrivateKey(EC_KEY *a, unsigned char **out) if (!(a->enc_flag & EC_PKEY_NO_PARAMETERS)) { - if ((priv_key->parameters = EC_ASN1_group2pkparameters( + if ((priv_key->parameters = ec_asn1_group2pkparameters( a->group, priv_key->parameters)) == NULL) { ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_EC_LIB); diff --git a/crypto/ec/ec_lib.c b/crypto/ec/ec_lib.c index 9669f42aa..9bccb073c 100644 --- a/crypto/ec/ec_lib.c +++ b/crypto/ec/ec_lib.c @@ -537,6 +537,45 @@ void EC_GROUP_clear_free_extra_data(EC_GROUP *group) } +int EC_GROUP_get_basis_type(const EC_GROUP *group, unsigned int *k1, + unsigned int *k2, unsigned int *k3) + { + int i = 0; + + if (group == NULL) + return 0; + + if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) != + NID_X9_62_characteristic_two_field) + /* everything else is currently not supported */ + return 0; + + while (group->poly[i] != 0) + i++; + + if (i == 4) + { + if (k1) + *k1 = group->poly[3]; + if (k2) + *k2 = group->poly[2]; + if (k3) + *k3 = group->poly[1]; + + return NID_X9_62_ppBasis; + } + else if (i == 2) + { + if (k1) + *k1 = group->poly[1]; + + return NID_X9_62_tpBasis; + } + else + /* everything else is currently not supported */ + return 0; + } + /* functions for EC_POINT objects */ EC_POINT *EC_POINT_new(const EC_GROUP *group) diff --git a/util/libeay.num b/util/libeay.num index 4269919b2..5a28ed130 100755 --- a/util/libeay.num +++ b/util/libeay.num @@ -3005,3 +3005,5 @@ ENGINE_set_default_ECDH 3438 EXIST::FUNCTION: ENGINE_register_ECDH 3439 EXIST::FUNCTION: EC_GROUP_get0_comment 3440 EXIST::FUNCTION:EC ec_group_index2nid 3441 EXIST::FUNCTION:EC +EC_GROUP_get_basis_type 3442 EXIST::FUNCTION:EC +X509_REQ_print_ex 3443 EXIST::FUNCTION:BIO From 8aefe253a7bd734bcfa025cd6f5fe3ab31206583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Mon, 26 Aug 2002 11:33:13 +0000 Subject: [PATCH 35/55] move EC_GROUP_get_basis_type() from ec_lib.c to ec_asn1.c --- crypto/ec/ec.h | 13 +++++++------ crypto/ec/ec_asn1.c | 42 ++++++++++++++++++++++++++++++++++++++++++ crypto/ec/ec_lcl.h | 5 +++++ crypto/ec/ec_lib.c | 39 --------------------------------------- 4 files changed, 54 insertions(+), 45 deletions(-) diff --git a/crypto/ec/ec.h b/crypto/ec/ec.h index 51cc3f8c0..e401eb739 100644 --- a/crypto/ec/ec.h +++ b/crypto/ec/ec.h @@ -191,12 +191,6 @@ const char *EC_GROUP_get0_comment(int nid); * with the given index i from the internal curve list */ int ec_group_index2nid(int i); -/* EC_GROUP_get_basis_type() returns the NID of the basis type - * used to represent the field elements (in case of a pentanomial or trinomial - * basis the coefficient are returned in the k? arguments) */ -int EC_GROUP_get_basis_type(const EC_GROUP *, unsigned int *k1, - unsigned int *k2, unsigned int *k3); - /* EC_POINT functions */ @@ -261,6 +255,13 @@ int EC_GROUP_precompute_mult(EC_GROUP *, BN_CTX *); /* ASN1 stuff */ + +/* EC_GROUP_get_basis_type() returns the NID of the basis type + * used to represent the field elements (in case of a pentanomial or trinomial + * basis the coefficient are returned in the k? arguments) */ +int EC_GROUP_get_basis_type(const EC_GROUP *, unsigned int *k1, + unsigned int *k2, unsigned int *k3); + #define OPENSSL_EC_NAMED_CURVE 0x001 typedef struct ecpk_parameters_st ECPKPARAMETERS; diff --git a/crypto/ec/ec_asn1.c b/crypto/ec/ec_asn1.c index 26f3916d0..8b0167bd6 100644 --- a/crypto/ec/ec_asn1.c +++ b/crypto/ec/ec_asn1.c @@ -62,6 +62,48 @@ #include #include + +int EC_GROUP_get_basis_type(const EC_GROUP *group, unsigned int *k1, + unsigned int *k2, unsigned int *k3) + { + int i = 0; + + if (group == NULL) + return 0; + + if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) != + NID_X9_62_characteristic_two_field) + /* everything else is currently not supported */ + return 0; + + while (group->poly[i] != 0) + i++; + + if (i == 4) + { + if (k1) + *k1 = group->poly[3]; + if (k2) + *k2 = group->poly[2]; + if (k3) + *k3 = group->poly[1]; + + return NID_X9_62_ppBasis; + } + else if (i == 2) + { + if (k1) + *k1 = group->poly[1]; + + return NID_X9_62_tpBasis; + } + else + /* everything else is currently not supported */ + return 0; + } + + + /* some structures needed for the asn1 encoding */ typedef struct x9_62_fieldid_st { ASN1_OBJECT *fieldType; diff --git a/crypto/ec/ec_lcl.h b/crypto/ec/ec_lcl.h index 247c985a2..ae67ccfdc 100644 --- a/crypto/ec/ec_lcl.h +++ b/crypto/ec/ec_lcl.h @@ -89,6 +89,11 @@ #include +/* internal function: ec_group_index2nid() returns the NID of curve + * with the given index i from the internal curve list */ +int ec_group_index2nid(int i); + + /* Structure details are not part of the exported interface, * so all this may change in future versions. */ diff --git a/crypto/ec/ec_lib.c b/crypto/ec/ec_lib.c index 9bccb073c..9669f42aa 100644 --- a/crypto/ec/ec_lib.c +++ b/crypto/ec/ec_lib.c @@ -537,45 +537,6 @@ void EC_GROUP_clear_free_extra_data(EC_GROUP *group) } -int EC_GROUP_get_basis_type(const EC_GROUP *group, unsigned int *k1, - unsigned int *k2, unsigned int *k3) - { - int i = 0; - - if (group == NULL) - return 0; - - if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) != - NID_X9_62_characteristic_two_field) - /* everything else is currently not supported */ - return 0; - - while (group->poly[i] != 0) - i++; - - if (i == 4) - { - if (k1) - *k1 = group->poly[3]; - if (k2) - *k2 = group->poly[2]; - if (k3) - *k3 = group->poly[1]; - - return NID_X9_62_ppBasis; - } - else if (i == 2) - { - if (k1) - *k1 = group->poly[1]; - - return NID_X9_62_tpBasis; - } - else - /* everything else is currently not supported */ - return 0; - } - /* functions for EC_POINT objects */ EC_POINT *EC_POINT_new(const EC_GROUP *group) From c96f0fd2d110fe5ff48a4fbc0e95f78b26323908 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Mon, 26 Aug 2002 14:50:52 +0000 Subject: [PATCH 36/55] fix spacing --- apps/ec.c | 8 ++++---- apps/ecparam.c | 20 ++++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/apps/ec.c b/apps/ec.c index 79d0df986..71ffaecb1 100644 --- a/apps/ec.c +++ b/apps/ec.c @@ -230,9 +230,9 @@ bad: "curve parameters\n"); BIO_printf(bio_err, " -conv_form arg specifies the " "point conversion form \n"); - BIO_printf(bio_err, " possible values :" + BIO_printf(bio_err, " possible values:" " compressed\n"); - BIO_printf(bio_err, " " + BIO_printf(bio_err, " " " uncompressed (default)\n"); BIO_printf(bio_err, " " " hybrid\n"); @@ -240,9 +240,9 @@ bad: " the ec parameters are encoded\n"); BIO_printf(bio_err, " in the asn1 der " "encoding\n"); - BIO_printf(bio_err, " possilbe values :" + BIO_printf(bio_err, " possilbe values:" " named_curve (default)\n"); - BIO_printf(bio_err," " + BIO_printf(bio_err," " "explicit\n"); goto end; } diff --git a/apps/ecparam.c b/apps/ecparam.c index ac4c565a4..e03dc9d3b 100644 --- a/apps/ecparam.c +++ b/apps/ecparam.c @@ -111,13 +111,13 @@ * -list_curves - prints a list of all currently available curve * 'short names' and exits * -conv_form - specifies the point conversion form - * possible values : compressed - * uncompressed (default) - * hybrid + * possible values: compressed + * uncompressed (default) + * hybrid * -param_enc - specifies the way the ec parameters are encoded * in the asn1 der encoding - * possilbe values : named_curve (default) - * explicit + * possilbe values: named_curve (default) + * explicit * -no_seed - if 'explicit' parameters are choosen do not * use the seed * -genkey - generates a ec private key @@ -287,20 +287,20 @@ bad: BIO_printf(bio_err, " 'short names'\n"); BIO_printf(bio_err, " -conv_form arg specifies the " "point conversion form \n"); - BIO_printf(bio_err, " possible values :" + BIO_printf(bio_err, " possible values:" " compressed\n"); - BIO_printf(bio_err, " " + BIO_printf(bio_err, " " " uncompressed (default)\n"); - BIO_printf(bio_err, " " + BIO_printf(bio_err, " " " hybrid\n"); BIO_printf(bio_err, " -param_enc arg specifies the way" " the ec parameters are encoded\n"); BIO_printf(bio_err, " in the asn1 der " "encoding\n"); - BIO_printf(bio_err, " possilbe values :" + BIO_printf(bio_err, " possilbe values:" " named_curve (default)\n"); BIO_printf(bio_err," " - " explicit\n"); + " explicit\n"); BIO_printf(bio_err, " -no_seed if 'explicit'" " parameters are choosen do not\n"); BIO_printf(bio_err, " use the seed\n"); From 34f1f2a81cd15ed15007506a3d50c1ce73986c10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Mon, 26 Aug 2002 18:08:53 +0000 Subject: [PATCH 37/55] less specific interface for EC_GROUP_get_basis_type Submitted by: Nils Larsch, Bodo Moeller --- crypto/asn1/t_pkey.c | 3 +- crypto/ec/ec.h | 11 +++++-- crypto/ec/ec2_smpl.c | 6 +++- crypto/ec/ec_asn1.c | 78 +++++++++++++++++++++++++++++++------------- crypto/ec/ec_err.c | 4 +++ util/libeay.num | 2 ++ 6 files changed, 75 insertions(+), 29 deletions(-) diff --git a/crypto/asn1/t_pkey.c b/crypto/asn1/t_pkey.c index 0a20311c5..0112f7cce 100644 --- a/crypto/asn1/t_pkey.c +++ b/crypto/asn1/t_pkey.c @@ -420,8 +420,7 @@ int ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off) if (is_char_two) { /* print the 'short name' of the base type OID */ - int basis_type = EC_GROUP_get_basis_type(x, NULL, - NULL, NULL); + int basis_type = EC_GROUP_get_basis_type(x); if (basis_type == 0) goto err; diff --git a/crypto/ec/ec.h b/crypto/ec/ec.h index e401eb739..faca04aab 100644 --- a/crypto/ec/ec.h +++ b/crypto/ec/ec.h @@ -257,9 +257,10 @@ int EC_GROUP_precompute_mult(EC_GROUP *, BN_CTX *); /* ASN1 stuff */ /* EC_GROUP_get_basis_type() returns the NID of the basis type - * used to represent the field elements (in case of a pentanomial or trinomial - * basis the coefficient are returned in the k? arguments) */ -int EC_GROUP_get_basis_type(const EC_GROUP *, unsigned int *k1, + * used to represent the field elements */ +int EC_GROUP_get_basis_type(const EC_GROUP *); +int EC_GROUP_get_trinomial_basis(const EC_GROUP *, unsigned int *k); +int EC_GROUP_get_pentanomial_basis(const EC_GROUP *, unsigned int *k1, unsigned int *k2, unsigned int *k3); #define OPENSSL_EC_NAMED_CURVE 0x001 @@ -372,6 +373,7 @@ void ERR_load_EC_strings(void); #define EC_F_EC_ASN1_PARAMETERS2GROUP 157 #define EC_F_EC_ASN1_PKPARAMETERS2GROUP 158 #define EC_F_EC_GF2M_SIMPLE_GROUP_CHECK_DISCRIMINANT 159 +#define EC_F_EC_GF2M_SIMPLE_GROUP_SET_CURVE 195 #define EC_F_EC_GF2M_SIMPLE_OCT2POINT 160 #define EC_F_EC_GF2M_SIMPLE_POINT2OCT 161 #define EC_F_EC_GF2M_SIMPLE_POINT_GET_AFFINE_COORDINATES 162 @@ -405,6 +407,8 @@ void ERR_load_EC_strings(void); #define EC_F_EC_GROUP_GET_DEGREE 173 #define EC_F_EC_GROUP_GET_EXTRA_DATA 107 #define EC_F_EC_GROUP_GET_ORDER 141 +#define EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS 193 +#define EC_F_EC_GROUP_GET_TRINOMIAL_BASIS 194 #define EC_F_EC_GROUP_GROUP2NID 147 #define EC_F_EC_GROUP_NEW 108 #define EC_F_EC_GROUP_NEW_BY_NID 174 @@ -481,6 +485,7 @@ void ERR_load_EC_strings(void); #define EC_R_UNDEFINED_ORDER 128 #define EC_R_UNKNOWN_GROUP 129 #define EC_R_UNKNOWN_ORDER 114 +#define EC_R_UNSUPPORTED_FIELD 131 #define EC_R_WRONG_ORDER 130 #ifdef __cplusplus diff --git a/crypto/ec/ec2_smpl.c b/crypto/ec/ec2_smpl.c index 980d396c8..ece8abb8f 100644 --- a/crypto/ec/ec2_smpl.c +++ b/crypto/ec/ec2_smpl.c @@ -200,7 +200,11 @@ int ec_GF2m_simple_group_set_curve(EC_GROUP *group, /* group->field */ if (!BN_copy(&group->field, p)) goto err; i = BN_GF2m_poly2arr(&group->field, group->poly, 5); - if ((i != 5) && (i != 3)) goto err; + if ((i != 5) && (i != 3)) + { + ECerr(EC_F_EC_GF2M_SIMPLE_GROUP_SET_CURVE, EC_R_UNSUPPORTED_FIELD); + goto err; + } /* group->a */ if (!BN_GF2m_mod_arr(&group->a, a, group->poly)) goto err; diff --git a/crypto/ec/ec_asn1.c b/crypto/ec/ec_asn1.c index 8b0167bd6..63d33a5f5 100644 --- a/crypto/ec/ec_asn1.c +++ b/crypto/ec/ec_asn1.c @@ -63,13 +63,9 @@ #include -int EC_GROUP_get_basis_type(const EC_GROUP *group, unsigned int *k1, - unsigned int *k2, unsigned int *k3) +int EC_GROUP_get_basis_type(const EC_GROUP *group) { - int i = 0; - - if (group == NULL) - return 0; + int i=0; if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) != NID_X9_62_characteristic_two_field) @@ -80,28 +76,55 @@ int EC_GROUP_get_basis_type(const EC_GROUP *group, unsigned int *k1, i++; if (i == 4) - { - if (k1) - *k1 = group->poly[3]; - if (k2) - *k2 = group->poly[2]; - if (k3) - *k3 = group->poly[1]; - return NID_X9_62_ppBasis; - } else if (i == 2) - { - if (k1) - *k1 = group->poly[1]; - return NID_X9_62_tpBasis; - } else /* everything else is currently not supported */ return 0; } +int EC_GROUP_get_trinomial_basis(const EC_GROUP *group, unsigned int *k) + { + if (group == NULL) + return 0; + + if (EC_GROUP_method_of(group)->group_set_curve != ec_GF2m_simple_group_set_curve + || !((group->poly[0] != 0) && (group->poly[1] != 0) && (group->poly[2] == 0))) + { + ECerr(EC_F_EC_GROUP_GET_TRINOMIAL_BASIS, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); + return 0; + } + + if (k) + *k = group->poly[1]; + + return 1; + } + +int EC_GROUP_get_pentanomial_basis(const EC_GROUP *group, unsigned int *k1, + unsigned int *k2, unsigned int *k3) + { + if (group == NULL) + return 0; + + if (EC_GROUP_method_of(group)->group_set_curve != ec_GF2m_simple_group_set_curve + || !((group->poly[0] != 0) && (group->poly[1] != 0) && (group->poly[2] != 0) && (group->poly[3] != 0) && (group->poly[4] == 0))) + { + ECerr(EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); + return 0; + } + + if (k1) + *k1 = group->poly[3]; + if (k2) + *k2 = group->poly[2]; + if (k3) + *k3 = group->poly[1]; + + return 1; + } + /* some structures needed for the asn1 encoding */ @@ -323,7 +346,6 @@ static X9_62_FIELDID *ec_asn1_group2field(const EC_GROUP *group, else /* nid == NID_X9_62_characteristic_two_field */ { int field_type; - unsigned int k1, k2, k3; char_two = X9_62_CHARACTERISTIC_TWO_new(); if (char_two == NULL) @@ -334,7 +356,7 @@ static X9_62_FIELDID *ec_asn1_group2field(const EC_GROUP *group, char_two->m = (long)EC_GROUP_get_degree(group); - field_type = EC_GROUP_get_basis_type(group, &k1, &k2, &k3); + field_type = EC_GROUP_get_basis_type(group); if (field_type == 0) { @@ -350,6 +372,11 @@ static X9_62_FIELDID *ec_asn1_group2field(const EC_GROUP *group, if (field_type == NID_X9_62_tpBasis) { + unsigned int k; + + if (!EC_GROUP_get_trinomial_basis(group, &k)) + goto err; + char_two->parameters->type = V_ASN1_INTEGER; char_two->parameters->value.integer = ASN1_INTEGER_new(); @@ -359,7 +386,7 @@ static X9_62_FIELDID *ec_asn1_group2field(const EC_GROUP *group, ERR_R_ASN1_LIB); goto err; } - if (!ASN1_INTEGER_set(char_two->parameters->value.integer, (long)k1)) + if (!ASN1_INTEGER_set(char_two->parameters->value.integer, (long)k)) { ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_ASN1_LIB); @@ -368,6 +395,11 @@ static X9_62_FIELDID *ec_asn1_group2field(const EC_GROUP *group, } else if (field_type == NID_X9_62_ppBasis) { + unsigned int k1, k2, k3; + + if (!EC_GROUP_get_pentanomial_basis(group, &k1, &k2, &k3)) + goto err; + penta = X9_62_PENTANOMIAL_new(); /* set k? values */ penta->k1 = (long)k1; diff --git a/crypto/ec/ec_err.c b/crypto/ec/ec_err.c index 3a0f3f10e..8ae2c00e3 100644 --- a/crypto/ec/ec_err.c +++ b/crypto/ec/ec_err.c @@ -83,6 +83,7 @@ static ERR_STRING_DATA EC_str_functs[]= {ERR_PACK(0,EC_F_EC_ASN1_PARAMETERS2GROUP,0), "EC_ASN1_PARAMETERS2GROUP"}, {ERR_PACK(0,EC_F_EC_ASN1_PKPARAMETERS2GROUP,0), "EC_ASN1_PKPARAMETERS2GROUP"}, {ERR_PACK(0,EC_F_EC_GF2M_SIMPLE_GROUP_CHECK_DISCRIMINANT,0), "ec_GF2m_simple_group_check_discriminant"}, +{ERR_PACK(0,EC_F_EC_GF2M_SIMPLE_GROUP_SET_CURVE,0), "ec_GF2m_simple_group_set_curve"}, {ERR_PACK(0,EC_F_EC_GF2M_SIMPLE_OCT2POINT,0), "ec_GF2m_simple_oct2point"}, {ERR_PACK(0,EC_F_EC_GF2M_SIMPLE_POINT2OCT,0), "ec_GF2m_simple_point2oct"}, {ERR_PACK(0,EC_F_EC_GF2M_SIMPLE_POINT_GET_AFFINE_COORDINATES,0), "ec_GF2m_simple_point_get_affine_coordinates"}, @@ -116,6 +117,8 @@ static ERR_STRING_DATA EC_str_functs[]= {ERR_PACK(0,EC_F_EC_GROUP_GET_DEGREE,0), "EC_GROUP_get_degree"}, {ERR_PACK(0,EC_F_EC_GROUP_GET_EXTRA_DATA,0), "EC_GROUP_get_extra_data"}, {ERR_PACK(0,EC_F_EC_GROUP_GET_ORDER,0), "EC_GROUP_get_order"}, +{ERR_PACK(0,EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS,0), "EC_GROUP_get_pentanomial_basis"}, +{ERR_PACK(0,EC_F_EC_GROUP_GET_TRINOMIAL_BASIS,0), "EC_GROUP_get_trinomial_basis"}, {ERR_PACK(0,EC_F_EC_GROUP_GROUP2NID,0), "EC_GROUP_GROUP2NID"}, {ERR_PACK(0,EC_F_EC_GROUP_NEW,0), "EC_GROUP_new"}, {ERR_PACK(0,EC_F_EC_GROUP_NEW_BY_NID,0), "EC_GROUP_new_by_nid"}, @@ -195,6 +198,7 @@ static ERR_STRING_DATA EC_str_reasons[]= {EC_R_UNDEFINED_ORDER ,"undefined order"}, {EC_R_UNKNOWN_GROUP ,"unknown group"}, {EC_R_UNKNOWN_ORDER ,"unknown order"}, +{EC_R_UNSUPPORTED_FIELD ,"unsupported field"}, {EC_R_WRONG_ORDER ,"wrong order"}, {0,NULL} }; diff --git a/util/libeay.num b/util/libeay.num index 5a28ed130..7f86dbc01 100755 --- a/util/libeay.num +++ b/util/libeay.num @@ -3007,3 +3007,5 @@ EC_GROUP_get0_comment 3440 EXIST::FUNCTION:EC ec_group_index2nid 3441 EXIST::FUNCTION:EC EC_GROUP_get_basis_type 3442 EXIST::FUNCTION:EC X509_REQ_print_ex 3443 EXIST::FUNCTION:BIO +EC_GROUP_get_pentanomial_basis 3444 EXIST::FUNCTION:EC +EC_GROUP_get_trinomial_basis 3445 EXIST::FUNCTION:EC From e2aeb8174bd11c3dff2861fb6e1afa4c04587b19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Tue, 27 Aug 2002 10:38:09 +0000 Subject: [PATCH 38/55] change 'usage' formatting --- apps/ecparam.c | 102 ++++++++++++++++++++++++------------------------- 1 file changed, 49 insertions(+), 53 deletions(-) diff --git a/apps/ecparam.c b/apps/ecparam.c index e03dc9d3b..e0a56062d 100644 --- a/apps/ecparam.c +++ b/apps/ecparam.c @@ -98,31 +98,28 @@ #undef PROG #define PROG ecparam_main -/* -inform arg - input format - default PEM (DER or PEM) - * -outform arg - output format - default PEM - * -in arg - input file - default stdin - * -out arg - output file - default stdout - * -noout - * -text - * -check - validate the ec parameters - * -C - * -noout - * -name file - use the ecparameters with 'short name' name - * -list_curves - prints a list of all currently available curve - * 'short names' and exits - * -conv_form - specifies the point conversion form - * possible values: compressed - * uncompressed (default) - * hybrid - * -param_enc - specifies the way the ec parameters are encoded - * in the asn1 der encoding - * possilbe values: named_curve (default) - * explicit - * -no_seed - if 'explicit' parameters are choosen do not - * use the seed - * -genkey - generates a ec private key - * -rand file - * -engine e - use engine e, possible a hardware device +/* -inform arg - input format - default PEM (DER or PEM) + * -outform arg - output format - default PEM + * -in arg - input file - default stdin + * -out arg - output file - default stdout + * -noout - do not print the ec parameter + * -text - print the ec parameters in text form + * -check - validate the ec parameters + * -C - print a 'C' function creating the parameters + * -name arg - use the ec parameters with 'short name' name + * -list_curves - prints a list of all currently available curve 'short names' + * -conv_form arg - specifies the point conversion form + * - possible values: compressed + * uncompressed (default) + * hybrid + * -param_enc arg - specifies the way the ec parameters are encoded + * in the asn1 der encoding + * possible values: named_curve (default) + * explicit + * -no_seed - if 'explicit' parameters are choosen do not use the seed + * -genkey - generate ec key + * -rand file - files to use for random number input + * -engine e - use engine e, possibly a hardware device */ @@ -264,52 +261,51 @@ int MAIN(int argc, char **argv) bad: BIO_printf(bio_err, "%s [options] outfile\n",prog); BIO_printf(bio_err, "where options are\n"); - BIO_printf(bio_err, " -inform arg input format - " + BIO_printf(bio_err, " -inform arg input format - " "default PEM (DER or PEM)\n"); - BIO_printf(bio_err, " -outform arg output format - " + BIO_printf(bio_err, " -outform arg output format - " "default PEM\n"); - BIO_printf(bio_err, " -in arg input file - " + BIO_printf(bio_err, " -in arg input file - " "default stdin\n"); - BIO_printf(bio_err, " -out arg output file - " + BIO_printf(bio_err, " -out arg output file - " "default stdout\n"); - BIO_printf(bio_err, " -noout do not print the " + BIO_printf(bio_err, " -noout do not print the " "ec parameter\n"); - BIO_printf(bio_err, " -text print the ec " + BIO_printf(bio_err, " -text print the ec " "parameters in text form\n"); - BIO_printf(bio_err, " -check validate the ec " + BIO_printf(bio_err, " -check validate the ec " "parameters\n"); - BIO_printf(bio_err, " -C print a 'C' " + BIO_printf(bio_err, " -C print a 'C' " "function creating the parameters\n"); - BIO_printf(bio_err, " -name arg use the " + BIO_printf(bio_err, " -name arg use the " "ec parameters with 'short name' name\n"); - BIO_printf(bio_err, " -list_curves prints a list of " - "all currently available curve\n"); - BIO_printf(bio_err, " 'short names'\n"); - BIO_printf(bio_err, " -conv_form arg specifies the " + BIO_printf(bio_err, " -list_curves prints a list of " + "all currently available curve 'short names'\n"); + BIO_printf(bio_err, " -conv_form arg specifies the " "point conversion form \n"); - BIO_printf(bio_err, " possible values:" + BIO_printf(bio_err, " possible values:" " compressed\n"); - BIO_printf(bio_err, " " + BIO_printf(bio_err, " " " uncompressed (default)\n"); - BIO_printf(bio_err, " " + BIO_printf(bio_err, " " " hybrid\n"); - BIO_printf(bio_err, " -param_enc arg specifies the way" + BIO_printf(bio_err, " -param_enc arg specifies the way" " the ec parameters are encoded\n"); - BIO_printf(bio_err, " in the asn1 der " + BIO_printf(bio_err, " in the asn1 der " "encoding\n"); - BIO_printf(bio_err, " possilbe values:" + BIO_printf(bio_err, " possible values:" " named_curve (default)\n"); - BIO_printf(bio_err," " - " explicit\n"); - BIO_printf(bio_err, " -no_seed if 'explicit'" - " parameters are choosen do not\n"); - BIO_printf(bio_err, " use the seed\n"); - BIO_printf(bio_err, " -genkey generate ec" + BIO_printf(bio_err, " " + " explicit\n"); + BIO_printf(bio_err, " -no_seed if 'explicit'" + " parameters are choosen do not" + " use the seed\n"); + BIO_printf(bio_err, " -genkey generate ec" " key\n"); - BIO_printf(bio_err, " -rand file files to use for" + BIO_printf(bio_err, " -rand file files to use for" " random number input\n"); - BIO_printf(bio_err, " -engine e use engine e, " - "possible a hardware device\n"); + BIO_printf(bio_err, " -engine e use engine e, " + "possibly a hardware device\n"); goto end; } From c237de058f91072b5d54ad9c570049c14df6957e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Tue, 27 Aug 2002 13:32:35 +0000 Subject: [PATCH 39/55] don't write beyond buffer Submitted by: Nils Larsch --- crypto/bn/bn_gf2m.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/crypto/bn/bn_gf2m.c b/crypto/bn/bn_gf2m.c index 8bd17e0e7..dea1fd3b8 100644 --- a/crypto/bn/bn_gf2m.c +++ b/crypto/bn/bn_gf2m.c @@ -370,12 +370,16 @@ int BN_GF2m_mod_arr(BIGNUM *r, const BIGNUM *a, const unsigned int p[]) for (k = 1; p[k] > 0; k++) { + BN_ULONG tmp_ulong; + /* reducing component t^p[k]*/ n = p[k] / BN_BITS2; d0 = p[k] % BN_BITS2; d1 = BN_BITS2 - d0; z[n] ^= (zz << d0); - if (d0) z[n+1] ^= (zz >> d1); + tmp_ulong = zz >> d1; + if (d0 && tmp_ulong) + z[n+1] ^= tmp_ulong; } From 41cc7096b84277073764181fdf303fe357aa9b0d Mon Sep 17 00:00:00 2001 From: Geoff Thorpe Date: Wed, 28 Aug 2002 19:11:08 +0000 Subject: [PATCH 40/55] Fix a bug to allow the 4758 ENGINE to build as a DSO. --- crypto/engine/hw_4758_cca.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto/engine/hw_4758_cca.c b/crypto/engine/hw_4758_cca.c index 1053c5208..bfb80968e 100644 --- a/crypto/engine/hw_4758_cca.c +++ b/crypto/engine/hw_4758_cca.c @@ -953,7 +953,7 @@ static void cca_ex_free(void *obj, void *item, CRYPTO_EX_DATA *ad, int idx, #ifdef ENGINE_DYNAMIC_SUPPORT static int bind_fn(ENGINE *e, const char *id) { - if(id && (strcmp(id, engine_cswift_id) != 0)) + if(id && (strcmp(id, engine_4758_cca_id) != 0)) return 0; if(!bind_helper(e)) return 0; From 6ff7c95843b25ee818d986510cfd085a99a319a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Thu, 29 Aug 2002 11:45:40 +0000 Subject: [PATCH 41/55] don't memset(data,0,...) if data is NULL Submitted by: anonymous PR: 254 --- crypto/pem/pem_lib.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/crypto/pem/pem_lib.c b/crypto/pem/pem_lib.c index c32044cf7..7066e67b3 100644 --- a/crypto/pem/pem_lib.c +++ b/crypto/pem/pem_lib.c @@ -368,8 +368,11 @@ err: memset(iv,0,sizeof(iv)); memset((char *)&ctx,0,sizeof(ctx)); memset(buf,0,PEM_BUFSIZE); - memset(data,0,(unsigned int)dsize); - OPENSSL_free(data); + if (data != NULL) + { + memset(data,0,(unsigned int)dsize); + OPENSSL_free(data); + } return(ret); } From b499ed06d2afa4e495f0985ba3c571a1e6ee3f69 Mon Sep 17 00:00:00 2001 From: "Dr. Stephen Henson" Date: Fri, 30 Aug 2002 17:18:22 +0000 Subject: [PATCH 42/55] Fix ASN1_STRING_to_UTF8: remove non sensical !*out test. --- crypto/asn1/a_strex.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crypto/asn1/a_strex.c b/crypto/asn1/a_strex.c index 8dab29dca..7ddb7662f 100644 --- a/crypto/asn1/a_strex.c +++ b/crypto/asn1/a_strex.c @@ -544,7 +544,7 @@ int ASN1_STRING_to_UTF8(unsigned char **out, ASN1_STRING *in) { ASN1_STRING stmp, *str = &stmp; int mbflag, type, ret; - if(!*out || !in) return -1; + if(!in) return -1; type = in->type; if((type < 0) || (type > 30)) return -1; mbflag = tag2nbyte[type]; @@ -553,6 +553,6 @@ int ASN1_STRING_to_UTF8(unsigned char **out, ASN1_STRING *in) stmp.data = NULL; ret = ASN1_mbstring_copy(&str, in->data, in->length, mbflag, B_ASN1_UTF8STRING); if(ret < 0) return ret; - if(out) *out = stmp.data; + *out = stmp.data; return stmp.length; } From 65b1d31df53fecefbf53dedd8fc4f9f64a62a92b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Mon, 2 Sep 2002 07:08:33 +0000 Subject: [PATCH 43/55] change API for looking at the internal curve list Submitted by: Nils Larsch --- apps/ecparam.c | 31 +++++++++++++++++++++++-------- crypto/ec/ec.h | 16 ++++++++++------ crypto/ec/ec_curve.c | 25 +++++++++++++------------ util/libeay.num | 5 +++-- 4 files changed, 49 insertions(+), 28 deletions(-) diff --git a/apps/ecparam.c b/apps/ecparam.c index e0a56062d..71ae9e7d9 100644 --- a/apps/ecparam.c +++ b/apps/ecparam.c @@ -352,19 +352,33 @@ bad: if (list_curves) { - int counter=0; + EC_builtin_curve *curves = NULL; + size_t crv_len = 0; + size_t n = 0; + size_t len; - for (;;) + crv_len = EC_get_builtin_curves(NULL, 0); + + curves = OPENSSL_malloc(sizeof(EC_builtin_curve) * crv_len); + + if (curves == NULL) + goto end; + + if (!EC_get_builtin_curves(curves, crv_len)) + { + OPENSSL_free(curves); + goto end; + } + + + for (n = 0; n < crv_len; n++) { const char *comment; const char *sname; - int len, nid = ec_group_index2nid(counter++); - if (!nid) - break; - comment = EC_GROUP_get0_comment(nid); - sname = OBJ_nid2sn(nid); + comment = curves[n].comment; + sname = OBJ_nid2sn(curves[n].nid); if (comment == NULL) - comment = ""; + comment = "CURVE DESCRIPTION NOT AVAILABLE"; if (sname == NULL) sname = ""; @@ -375,6 +389,7 @@ bad: BIO_printf(out, "%s\n", comment); } + OPENSSL_free(curves); ret = 0; goto end; } diff --git a/crypto/ec/ec.h b/crypto/ec/ec.h index faca04aab..094e05e16 100644 --- a/crypto/ec/ec.h +++ b/crypto/ec/ec.h @@ -184,12 +184,16 @@ EC_GROUP *EC_GROUP_new_curve_GF2m(const BIGNUM *p, const BIGNUM *a, const BIGNUM /* EC_GROUP_new_by_nid() creates a EC_GROUP structure specified by a NID */ EC_GROUP *EC_GROUP_new_by_nid(int nid); -/* EC_GROUP_get0_comment() returns a pointer to the 'comment' field of - * ec_curve_data_st structure */ -const char *EC_GROUP_get0_comment(int nid); -/* internal function : ec_group_index2nid() returns the NID of curve - * with the given index i from the internal curve list */ -int ec_group_index2nid(int i); +/* handling of internal curves */ +typedef struct { + int nid; + const char *comment; + } EC_builtin_curve; +/* EC_builtin_curves(EC_builtin_curve *r, size_t size) returns number + * of all available curves or zero if a error occurred. + * In case r ist not zero nitems EC_builtin_curve structures + * are filled with the data of the first nitems internal groups */ +size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems); /* EC_POINT functions */ diff --git a/crypto/ec/ec_curve.c b/crypto/ec/ec_curve.c index 93f775d55..090520372 100644 --- a/crypto/ec/ec_curve.c +++ b/crypto/ec/ec_curve.c @@ -1207,19 +1207,20 @@ EC_GROUP *EC_GROUP_new_by_nid(int nid) return ret; } -const char *EC_GROUP_get0_comment(int nid) +size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems) { - size_t i; + size_t i, min; - for (i=0; icomment; - return NULL; - } + if (r == NULL || nitems == 0) + return curve_list_length; -int ec_group_index2nid(int i) - { - if (i >= curve_list_length || i < 0) - return 0; - return curve_list[i].nid; + min = nitems < curve_list_length ? nitems : curve_list_length; + + for (i = 0; i < min; i++) + { + r[i].nid = curve_list[i].nid; + r[i].comment = curve_list[i].data->comment; + } + + return curve_list_length; } diff --git a/util/libeay.num b/util/libeay.num index 7f86dbc01..4b96ca8bf 100755 --- a/util/libeay.num +++ b/util/libeay.num @@ -3003,9 +3003,10 @@ ENGINE_register_all_ECDH 3436 EXIST::FUNCTION: ECDH_DATA_new_method 3437 EXIST::FUNCTION:ECDH ENGINE_set_default_ECDH 3438 EXIST::FUNCTION: ENGINE_register_ECDH 3439 EXIST::FUNCTION: -EC_GROUP_get0_comment 3440 EXIST::FUNCTION:EC -ec_group_index2nid 3441 EXIST::FUNCTION:EC +EC_GROUP_get0_comment 3440 NOEXIST::FUNCTION: +ec_group_index2nid 3441 NOEXIST::FUNCTION: EC_GROUP_get_basis_type 3442 EXIST::FUNCTION:EC X509_REQ_print_ex 3443 EXIST::FUNCTION:BIO EC_GROUP_get_pentanomial_basis 3444 EXIST::FUNCTION:EC EC_GROUP_get_trinomial_basis 3445 EXIST::FUNCTION:EC +EC_get_builtin_curves 3446 EXIST::FUNCTION:EC From ed5e37c3097f04d55534cc8198c39279ef0fe853 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Mon, 2 Sep 2002 07:12:08 +0000 Subject: [PATCH 44/55] mention EC_get_builtin_curves() --- CHANGES | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 36a393c4b..5f9849c92 100644 --- a/CHANGES +++ b/CHANGES @@ -235,9 +235,11 @@ TODO: bug: pad x with leading zeros if necessary [Nils Larsch ] *) Include some named elliptic curves, and add OIDs from X9.62, - SECG, and WAP/WTLS. The curves can be obtained from the new + SECG, and WAP/WTLS. Each curve can be obtained from the new function - EC_GROUP_new_by_nid() + EC_GROUP_new_by_nid(), + and the list of available named curves can be obtained with + EC_get_builtin_curves(). Also add a 'curve_name' member to EC_GROUP objects, which can be accessed via EC_GROUP_set_nid() From ba11121731cb1474479b655e47e15d40f80ebed6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Mon, 2 Sep 2002 14:22:51 +0000 Subject: [PATCH 45/55] -nameopt fix has been moved to 0.9.7 --- CHANGES | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 5f9849c92..9dbb21213 100644 --- a/CHANGES +++ b/CHANGES @@ -4,9 +4,6 @@ Changes between 0.9.7 and 0.9.8 [xx XXX 2002] - *) Make -nameopt work fully for req and add -reqopt switch. - [Michael Bell , Steve Henson] - *) Add support for ECC-based ciphersuites from draft-ietf-tls-ecc-01.txt. As these are not official, they are not included in "ALL"; the "ECCdraft" ciphersuite group alias can be used to select them. @@ -248,6 +245,9 @@ TODO: bug: pad x with leading zeros if necessary Changes between 0.9.6g and 0.9.7 [XX xxx 2002] + *) Make -nameopt work fully for req and add -reqopt switch. + [Michael Bell , Steve Henson] + *) The "block size" for block ciphers in CFB and OFB mode should be 1. [Steve Henson, reported by Yngve Nysaeter Pettersen ] From 3403caf3da9ed1b9852db5b462d25c5c33c6a0ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lutz=20J=C3=A4nicke?= Date: Thu, 5 Sep 2002 07:52:05 +0000 Subject: [PATCH 46/55] Consequently use term URI instead of URL Submitted by: TJ Saunders Reviewed by: PR: 268 --- doc/openssl.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/openssl.txt b/doc/openssl.txt index 5da519e7e..432a17b66 100644 --- a/doc/openssl.txt +++ b/doc/openssl.txt @@ -344,7 +344,7 @@ the extension. Examples: -subjectAltName=email:copy,email:my@other.address,URL:http://my.url.here/ +subjectAltName=email:copy,email:my@other.address,URI:http://my.url.here/ subjectAltName=email:my@other.address,RID:1.2.3.4 Issuer Alternative Name. From f8049301509dc1ee13d1b3e4c0d19ad3d84013d5 Mon Sep 17 00:00:00 2001 From: "Dr. Stephen Henson" Date: Sat, 7 Sep 2002 22:57:49 +0000 Subject: [PATCH 47/55] Fix typos in PKCS#12 ASN1 code. Make PKCS7_set_detached work again. --- crypto/pkcs12/p12_asn.c | 6 +++--- crypto/pkcs7/pk7_lib.c | 7 +++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/crypto/pkcs12/p12_asn.c b/crypto/pkcs12/p12_asn.c index c327bdba0..a3739fee1 100644 --- a/crypto/pkcs12/p12_asn.c +++ b/crypto/pkcs12/p12_asn.c @@ -83,8 +83,8 @@ ASN1_ADB_TEMPLATE(bag_default) = ASN1_EXP(PKCS12_BAGS, value.other, ASN1_ANY, 0) ASN1_ADB(PKCS12_BAGS) = { ADB_ENTRY(NID_x509Certificate, ASN1_EXP(PKCS12_BAGS, value.x509cert, ASN1_OCTET_STRING, 0)), - ADB_ENTRY(NID_x509Certificate, ASN1_EXP(PKCS12_BAGS, value.x509crl, ASN1_OCTET_STRING, 0)), - ADB_ENTRY(NID_x509Certificate, ASN1_EXP(PKCS12_BAGS, value.sdsicert, ASN1_IA5STRING, 0)), + ADB_ENTRY(NID_x509Crl, ASN1_EXP(PKCS12_BAGS, value.x509crl, ASN1_OCTET_STRING, 0)), + ADB_ENTRY(NID_sdsiCertificate, ASN1_EXP(PKCS12_BAGS, value.sdsicert, ASN1_IA5STRING, 0)), } ASN1_ADB_END(PKCS12_BAGS, 0, type, 0, &bag_default_tt, NULL); ASN1_SEQUENCE(PKCS12_BAGS) = { @@ -98,7 +98,7 @@ ASN1_ADB_TEMPLATE(safebag_default) = ASN1_EXP(PKCS12_SAFEBAG, value.other, ASN1_ ASN1_ADB(PKCS12_SAFEBAG) = { ADB_ENTRY(NID_keyBag, ASN1_EXP(PKCS12_SAFEBAG, value.keybag, PKCS8_PRIV_KEY_INFO, 0)), - ADB_ENTRY(NID_pkcs8ShroudedKeyBag, ASN1_EXP(PKCS12_SAFEBAG, value.keybag, X509_SIG, 0)), + ADB_ENTRY(NID_pkcs8ShroudedKeyBag, ASN1_EXP(PKCS12_SAFEBAG, value.shkeybag, X509_SIG, 0)), ADB_ENTRY(NID_safeContentsBag, ASN1_EXP_SET_OF(PKCS12_SAFEBAG, value.safes, PKCS12_SAFEBAG, 0)), ADB_ENTRY(NID_certBag, ASN1_EXP(PKCS12_SAFEBAG, value.bag, PKCS12_BAGS, 0)), ADB_ENTRY(NID_crlBag, ASN1_EXP(PKCS12_SAFEBAG, value.bag, PKCS12_BAGS, 0)), diff --git a/crypto/pkcs7/pk7_lib.c b/crypto/pkcs7/pk7_lib.c index c913c5979..d4804f883 100644 --- a/crypto/pkcs7/pk7_lib.c +++ b/crypto/pkcs7/pk7_lib.c @@ -74,6 +74,13 @@ long PKCS7_ctrl(PKCS7 *p7, int cmd, long larg, char *parg) if (nid == NID_pkcs7_signed) { ret=p7->detached=(int)larg; + if (PKCS7_type_is_data(p7->d.sign->contents)) + { + ASN1_OCTET_STRING *os; + os=p7->d.sign->contents->d.data; + ASN1_OCTET_STRING_free(os); + p7->d.sign->contents->d.data = NULL; + } } else { From 48921e00fc69060b7b29bab707ebc255a3506aff Mon Sep 17 00:00:00 2001 From: "Dr. Stephen Henson" Date: Sun, 8 Sep 2002 16:25:03 +0000 Subject: [PATCH 48/55] Really fix PKCS7_set_detached this time... --- crypto/pkcs7/pk7_lib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto/pkcs7/pk7_lib.c b/crypto/pkcs7/pk7_lib.c index d4804f883..9b647b212 100644 --- a/crypto/pkcs7/pk7_lib.c +++ b/crypto/pkcs7/pk7_lib.c @@ -74,7 +74,7 @@ long PKCS7_ctrl(PKCS7 *p7, int cmd, long larg, char *parg) if (nid == NID_pkcs7_signed) { ret=p7->detached=(int)larg; - if (PKCS7_type_is_data(p7->d.sign->contents)) + if (ret && PKCS7_type_is_data(p7->d.sign->contents)) { ASN1_OCTET_STRING *os; os=p7->d.sign->contents->d.data; From 9226e2187c14979352cb78886ab8f0a90b3aef46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Tue, 10 Sep 2002 07:34:45 +0000 Subject: [PATCH 49/55] Let 'openssl req' fail if an argument to '-newkey' is not recognized instead of using RSA as a default. --- CHANGES | 4 ++++ apps/req.c | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 9dbb21213..dbb70cb11 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,10 @@ Changes between 0.9.7 and 0.9.8 [xx XXX 2002] + *) Let 'openssl req' fail if an argument to '-newkey' is not + recognized instead of using RSA as a default. + [Bodo Moeller] + *) Add support for ECC-based ciphersuites from draft-ietf-tls-ecc-01.txt. As these are not official, they are not included in "ALL"; the "ECCdraft" ciphersuite group alias can be used to select them. diff --git a/apps/req.c b/apps/req.c index 79b1ded73..729cb2d5b 100644 --- a/apps/req.c +++ b/apps/req.c @@ -383,7 +383,9 @@ int MAIN(int argc, char **argv) } else #endif - pkey_type=TYPE_RSA; + { + goto bad; + } newreq=1; } From c2bbf275b2be79bcfccde4475331742e984c8e3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Tue, 10 Sep 2002 07:36:52 +0000 Subject: [PATCH 50/55] 1. switch from "-newkey ecdsa:..." to "-newkey ec:..." 2. automatically create required sub-directories Submitted by: Vipul Gupta --- demos/ssltest-ecc/ECC-RSAcertgen.sh | 9 +++++++-- demos/ssltest-ecc/ECCcertgen.sh | 27 +++++++++------------------ demos/ssltest-ecc/RSAcertgen.sh | 6 ++++++ 3 files changed, 22 insertions(+), 20 deletions(-) diff --git a/demos/ssltest-ecc/ECC-RSAcertgen.sh b/demos/ssltest-ecc/ECC-RSAcertgen.sh index ce182e313..b31a4f1ee 100755 --- a/demos/ssltest-ecc/ECC-RSAcertgen.sh +++ b/demos/ssltest-ecc/ECC-RSAcertgen.sh @@ -19,6 +19,8 @@ COMBO_DIR=$CERTS_DIR CAT=/bin/cat # rm command RM=/bin/rm +# mkdir command +MKDIR=/bin/mkdir # The certificate will expire these many days after the issue date. DAYS=1500 TEST_CA_FILE=rsa1024TestCA @@ -38,6 +40,9 @@ TEST_CLIENT_DN="/C=US/ST=CA/L=Mountain View/O=Sun Microsystems, Inc./OU=Sun Micr # 4. [Optional] One can combine the cert and private key into a single # file and also delete the certificate request +$MKDIR -p $CERTS_DIR +$MKDIR -p $KEYS_DIR +$MKDIR -p $COMBO_DIR echo "GENERATING A TEST SERVER CERTIFICATE (ECC key signed with RSA)" echo "==============================================================" @@ -45,7 +50,7 @@ $OPENSSL_CMD ecparam -name $TEST_SERVER_CURVE -out $TEST_SERVER_CURVE.pem $OPENSSL_CMD req $OPENSSL_CNF -nodes -subj "$TEST_SERVER_DN" \ -keyout $KEYS_DIR/$TEST_SERVER_FILE.key.pem \ - -newkey ecdsa:$TEST_SERVER_CURVE.pem -new \ + -newkey ec:$TEST_SERVER_CURVE.pem -new \ -out $CERTS_DIR/$TEST_SERVER_FILE.req.pem $OPENSSL_CMD x509 -req -days $DAYS \ @@ -71,7 +76,7 @@ $OPENSSL_CMD ecparam -name $TEST_CLIENT_CURVE -out $TEST_CLIENT_CURVE.pem $OPENSSL_CMD req $OPENSSL_CNF -nodes -subj "$TEST_CLIENT_DN" \ -keyout $KEYS_DIR/$TEST_CLIENT_FILE.key.pem \ - -newkey ecdsa:$TEST_CLIENT_CURVE.pem -new \ + -newkey ec:$TEST_CLIENT_CURVE.pem -new \ -out $CERTS_DIR/$TEST_CLIENT_FILE.req.pem $OPENSSL_CMD x509 -req -days $DAYS \ diff --git a/demos/ssltest-ecc/ECCcertgen.sh b/demos/ssltest-ecc/ECCcertgen.sh index b99a9b938..a47b8bb0b 100755 --- a/demos/ssltest-ecc/ECCcertgen.sh +++ b/demos/ssltest-ecc/ECCcertgen.sh @@ -19,6 +19,8 @@ COMBO_DIR=$CERTS_DIR CAT=/bin/cat # rm command RM=/bin/rm +# mkdir command +MKDIR=/bin/mkdir # The certificate will expire these many days after the issue date. DAYS=1500 TEST_CA_CURVE=secp160r1 @@ -40,6 +42,10 @@ TEST_CLIENT_DN="/C=US/ST=CA/L=Mountain View/O=Sun Microsystems, Inc./OU=Sun Micr # 4. [Optional] One can combine the cert and private key into a single # file and also delete the certificate request +$MKDIR -p $CERTS_DIR +$MKDIR -p $KEYS_DIR +$MKDIR -p $COMBO_DIR + echo "Generating self-signed CA certificate (on curve $TEST_CA_CURVE)" echo "===============================================================" $OPENSSL_CMD ecparam -name $TEST_CA_CURVE -out $TEST_CA_CURVE.pem @@ -51,7 +57,7 @@ $OPENSSL_CMD ecparam -name $TEST_CA_CURVE -out $TEST_CA_CURVE.pem # stored in the clear (rather than encrypted with a password). $OPENSSL_CMD req $OPENSSL_CNF -nodes -subj "$TEST_CA_DN" \ -keyout $KEYS_DIR/$TEST_CA_FILE.key.pem \ - -newkey ecdsa:$TEST_CA_CURVE.pem -new \ + -newkey ec:$TEST_CA_CURVE.pem -new \ -out $CERTS_DIR/$TEST_CA_FILE.req.pem # Sign the certificate request in $TEST_CA_FILE.req.pem using the @@ -89,7 +95,7 @@ $OPENSSL_CMD ecparam -name $TEST_SERVER_CURVE -out $TEST_SERVER_CURVE.pem # stored in the clear (rather than encrypted with a password). $OPENSSL_CMD req $OPENSSL_CNF -nodes -subj "$TEST_SERVER_DN" \ -keyout $KEYS_DIR/$TEST_SERVER_FILE.key.pem \ - -newkey ecdsa:$TEST_SERVER_CURVE.pem -new \ + -newkey ec:$TEST_SERVER_CURVE.pem -new \ -out $CERTS_DIR/$TEST_SERVER_FILE.req.pem # Sign the certificate request in $TEST_SERVER_FILE.req.pem using the @@ -128,7 +134,7 @@ $OPENSSL_CMD ecparam -name $TEST_CLIENT_CURVE -out $TEST_CLIENT_CURVE.pem # stored in the clear (rather than encrypted with a password). $OPENSSL_CMD req $OPENSSL_CNF -nodes -subj "$TEST_CLIENT_DN" \ -keyout $KEYS_DIR/$TEST_CLIENT_FILE.key.pem \ - -newkey ecdsa:$TEST_CLIENT_CURVE.pem -new \ + -newkey ec:$TEST_CLIENT_CURVE.pem -new \ -out $CERTS_DIR/$TEST_CLIENT_FILE.req.pem # Sign the certificate request in $TEST_CLIENT_FILE.req.pem using the @@ -154,20 +160,5 @@ $CAT $KEYS_DIR/$TEST_CLIENT_FILE.key.pem >> $COMBO_DIR/$TEST_CLIENT_FILE.pem # Remove the cert request file (no longer needed) $RM $CERTS_DIR/$TEST_CLIENT_FILE.req.pem -############################################################################ -#OLD STUFF (ignore this) -# -#These are the commands I used, but you may wish to add -named_curve to the first command per our discussion about parameter encoding in certificates. -# -#apps/openssl ecdsaparam -out nist192.param.pem -NIST_192 -# -#apps/openssl ecdsaparam -out nistB163.param.pem -named_curve -NIST_B163 -# the nodes option causes output key to be stored unencrypted -#apps/openssl req -nodes -keyout nistB163.priv.pem -newkey ecdsa:nistB163.param.pem -new -out nistB163.req.pem -#apps/openssl x509 -req -in nistB163.req.pem -extfile apps/cert.cnf -extensions v3_ca -signkey nistB163.priv.pem -out nistB163.cert.pem -# -#crypto/x509/x509_ext.c has X509_EXTENSION *X509_get_ext(X509 *x, int loc) -#crypto/asn1/t_x509.c has code to print certificates -#crypto/x509v3/v3_prn.c has code to print extensions X509V3_extensions_print diff --git a/demos/ssltest-ecc/RSAcertgen.sh b/demos/ssltest-ecc/RSAcertgen.sh index ea7984bae..0cb015359 100755 --- a/demos/ssltest-ecc/RSAcertgen.sh +++ b/demos/ssltest-ecc/RSAcertgen.sh @@ -19,6 +19,8 @@ COMBO_DIR=$CERTS_DIR CAT=/bin/cat # rm command RM=/bin/rm +# mkdir command +MKDIR=/bin/mkdir # The certificate will expire these many days after the issue date. DAYS=1500 TEST_CA_FILE=rsa1024TestCA @@ -37,6 +39,10 @@ TEST_CLIENT_DN="/C=US/ST=CA/L=Mountain View/O=Sun Microsystems, Inc./OU=Sun Micr # 4. [Optional] One can combine the cert and private key into a single # file and also delete the certificate request +$MKDIR -p $CERTS_DIR +$MKDIR -p $KEYS_DIR +$MKDIR -p $COMBO_DIR + echo "Generating self-signed CA certificate (RSA)" echo "===========================================" From 7cc6ec7af70d1a11bc0277364c07031f6acecad3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Mon, 16 Sep 2002 13:45:14 +0000 Subject: [PATCH 51/55] add URL for Internet Draft --- demos/ssltest-ecc/README | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/demos/ssltest-ecc/README b/demos/ssltest-ecc/README index 3e2c95cbe..b045c28fb 100644 --- a/demos/ssltest-ecc/README +++ b/demos/ssltest-ecc/README @@ -1,4 +1,6 @@ -Scripts for using ECC ciphersuites with test/testssl. +Scripts for using ECC ciphersuites with test/testssl +(these ciphersuites are described in the Internet Draft available at +http://www.ietf.org/internet-drafts/draft-ietf-tls-ecc-02.txt). Use ECCcertgen.sh, RSAcertgen.sh, ECC-RSAcertgen.sh to generate root, client and server certs of the following types: From 4c8f79a33e8efe5302700389edb4d574f2228765 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Mon, 16 Sep 2002 13:52:48 +0000 Subject: [PATCH 52/55] make sure 'neg' flag (which does not really matter for GF(2^m), but could cause confusion for ECDSA) is set to zero Submitted by: Sheueling Chang --- crypto/ec/ec2_smpl.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/crypto/ec/ec2_smpl.c b/crypto/ec/ec2_smpl.c index ece8abb8f..b218c5639 100644 --- a/crypto/ec/ec2_smpl.c +++ b/crypto/ec/ec2_smpl.c @@ -364,8 +364,11 @@ int ec_GF2m_simple_point_set_affine_coordinates(const EC_GROUP *group, EC_POINT } if (!BN_copy(&point->X, x)) goto err; + point->X.neg = 0; if (!BN_copy(&point->Y, y)) goto err; + point->Y.neg = 0; if (!BN_copy(&point->Z, BN_value_one())) goto err; + point->Z.neg = 0; point->Z_is_one = 1; ret = 1; @@ -396,10 +399,12 @@ int ec_GF2m_simple_point_get_affine_coordinates(const EC_GROUP *group, const EC_ if (x != NULL) { if (!BN_copy(x, &point->X)) goto err; + x->neg = 0; } if (y != NULL) { if (!BN_copy(y, &point->Y)) goto err; + y->neg = 0; } ret = 1; From a90ae02454ed755a56a00943ea49195c6b565655 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Thu, 19 Sep 2002 11:26:45 +0000 Subject: [PATCH 53/55] fix race condition PR: 262 --- CHANGES | 3 +++ ssl/s3_clnt.c | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index dbb70cb11..0cfe8adc9 100644 --- a/CHANGES +++ b/CHANGES @@ -1923,6 +1923,9 @@ des-cbc 3624.96k 5258.21k 5530.91k 5624.30k 5628.26k Changes between 0.9.6g and 0.9.6h [xx XXX xxxx] + *) Fix race condition in SSLv3_client_method(). + [Bodo Moeller] + *) Reorder cleanup sequence in SSL_CTX_free(): only remove the ex_data after the cached sessions are flushed, as the remove_cb() might use ex_data contents. Bug found by Sam Varshavchik diff --git a/ssl/s3_clnt.c b/ssl/s3_clnt.c index 3784e7d8c..ca15881ea 100644 --- a/ssl/s3_clnt.c +++ b/ssl/s3_clnt.c @@ -178,11 +178,11 @@ SSL_METHOD *SSLv3_client_method(void) if (init) { - init=0; memcpy((char *)&SSLv3_client_data,(char *)sslv3_base_method(), sizeof(SSL_METHOD)); SSLv3_client_data.ssl_connect=ssl3_connect; SSLv3_client_data.get_ssl_method=ssl3_get_client_method; + init=0; } return(&SSLv3_client_data); } From a4f53a1c736a7c4cd9684d892ab4f33318a77a51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodo=20M=C3=B6ller?= Date: Thu, 19 Sep 2002 11:44:07 +0000 Subject: [PATCH 54/55] there is no minimum length for session IDs PR: 274 --- CHANGES | 4 ++++ ssl/s3_clnt.c | 21 +++++---------------- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/CHANGES b/CHANGES index 0cfe8adc9..b21766284 100644 --- a/CHANGES +++ b/CHANGES @@ -1923,6 +1923,10 @@ des-cbc 3624.96k 5258.21k 5530.91k 5624.30k 5628.26k Changes between 0.9.6g and 0.9.6h [xx XXX xxxx] + *) Don't impose a 16-byte length minimum on session IDs in ssl/s3_clnt.c + (the SSL 3.0 and TLS 1.0 specifications allow any length up to 32 bytes). + [Bodo Moeller] + *) Fix race condition in SSLv3_client_method(). [Bodo Moeller] diff --git a/ssl/s3_clnt.c b/ssl/s3_clnt.c index ca15881ea..578eca457 100644 --- a/ssl/s3_clnt.c +++ b/ssl/s3_clnt.c @@ -671,23 +671,11 @@ static int ssl3_get_server_hello(SSL *s) /* get the session-id */ j= *(p++); - if(j > sizeof s->session->session_id) - { - al=SSL_AD_ILLEGAL_PARAMETER; - SSLerr(SSL_F_SSL3_GET_SERVER_HELLO, - SSL_R_SSL3_SESSION_ID_TOO_LONG); - goto f_err; - } - - if ((j != 0) && (j != SSL3_SESSION_ID_SIZE)) + if ((j > sizeof s->session->session_id) || (j > SSL3_SESSION_ID_SIZE)) { - /* SSLref returns 16 :-( */ - if (j < SSL2_SSL_SESSION_ID_LENGTH) - { - al=SSL_AD_ILLEGAL_PARAMETER; - SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_SSL3_SESSION_ID_TOO_SHORT); - goto f_err; - } + al=SSL_AD_ILLEGAL_PARAMETER; + SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_SSL3_SESSION_ID_TOO_LONG); + goto f_err; } if (j != 0 && j == s->session->session_id_length && memcmp(p,s->session->session_id,j) == 0) @@ -695,6 +683,7 @@ static int ssl3_get_server_hello(SSL *s) if(s->sid_ctx_length != s->session->sid_ctx_length || memcmp(s->session->sid_ctx,s->sid_ctx,s->sid_ctx_length)) { + /* actually a client application bug */ al=SSL_AD_ILLEGAL_PARAMETER; SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT); goto f_err; From 6e32d0a74be5fc9340c66dd03f11f89f8ac193bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ulf=20M=C3=B6ller?= Date: Sun, 22 Sep 2002 08:44:03 +0000 Subject: [PATCH 55/55] make files didn't work on case insensitive filesystems --- crypto/des/{FILES => FILES0} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename crypto/des/{FILES => FILES0} (100%) diff --git a/crypto/des/FILES b/crypto/des/FILES0 similarity index 100% rename from crypto/des/FILES rename to crypto/des/FILES0