diff --git a/certs/ecc/bp256r1-key.der b/certs/ecc/bp256r1-key.der new file mode 100644 index 000000000..86b9407ef Binary files /dev/null and b/certs/ecc/bp256r1-key.der differ diff --git a/certs/ecc/bp256r1-key.pem b/certs/ecc/bp256r1-key.pem new file mode 100644 index 000000000..165d0a867 --- /dev/null +++ b/certs/ecc/bp256r1-key.pem @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHgCAQEEIALRjSn7gQicLnRopI92xvo14rrdLVl0IEzDB40t3Pa7oAsGCSskAwMC +CAEBB6FEA0IABC7vJ8tXOtxiJba1QlzuKVbjqM6GbkRSIxXIQ8BiEBYeSsuI0HXg +OGuAhGSfcKrYuzOQwduBRq7pgckDabXOres= +-----END EC PRIVATE KEY----- diff --git a/certs/ecc/client-bp256r1-cert.der b/certs/ecc/client-bp256r1-cert.der new file mode 100644 index 000000000..2a70bc9fe Binary files /dev/null and b/certs/ecc/client-bp256r1-cert.der differ diff --git a/certs/ecc/client-bp256r1-cert.pem b/certs/ecc/client-bp256r1-cert.pem new file mode 100644 index 000000000..bdc13916e --- /dev/null +++ b/certs/ecc/client-bp256r1-cert.pem @@ -0,0 +1,57 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 23:c2:32:32:87:c0:20:35:77:e6:56:4b:ba:d3:ba:19:de:0e:ed:9e + Signature Algorithm: ecdsa-with-SHA256 + Issuer: C = US, ST = Washington, L = Seattle, O = Eliptic, OU = ECC256BPR1-CLI, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Validity + Not Before: Oct 15 20:13:58 2020 GMT + Not After : Oct 13 20:13:58 2030 GMT + Subject: C = US, ST = Washington, L = Seattle, O = Eliptic, OU = ECC256BPR1-CLI, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Subject Public Key Info: + Public Key Algorithm: id-ecPublicKey + Public-Key: (256 bit) + pub: + 04:2e:ef:27:cb:57:3a:dc:62:25:b6:b5:42:5c:ee: + 29:56:e3:a8:ce:86:6e:44:52:23:15:c8:43:c0:62: + 10:16:1e:4a:cb:88:d0:75:e0:38:6b:80:84:64:9f: + 70:aa:d8:bb:33:90:c1:db:81:46:ae:e9:81:c9:03: + 69:b5:ce:ad:eb + ASN1 OID: brainpoolP256r1 + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Cert Type: + SSL Client, S/MIME + X509v3 Subject Key Identifier: + B4:1B:3B:4F:65:F2:BF:9E:8A:8F:E3:33:96:44:1F:67:EA:B3:34:D5 + X509v3 Authority Key Identifier: + keyid:B4:1B:3B:4F:65:F2:BF:9E:8A:8F:E3:33:96:44:1F:67:EA:B3:34:D5 + + X509v3 Key Usage: critical + Digital Signature, Non Repudiation, Key Encipherment + X509v3 Extended Key Usage: + TLS Web Client Authentication, E-mail Protection + Signature Algorithm: ecdsa-with-SHA256 + 30:44:02:20:28:b6:b4:eb:ae:c1:9b:71:0a:15:92:93:d6:2d: + 12:a6:ff:2d:2a:f5:23:a8:e2:df:6c:d9:33:d4:7f:e9:2e:08: + 02:20:33:eb:45:aa:c1:7c:36:c1:60:52:09:0e:2d:e4:2a:49: + 1d:d8:b2:c5:79:3e:be:d4:61:c5:14:d0:b6:f2:42:d4 +-----BEGIN CERTIFICATE----- +MIICyTCCAnCgAwIBAgIUI8IyMofAIDV35lZLutO6Gd4O7Z4wCgYIKoZIzj0EAwIw +gZoxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT +ZWF0dGxlMRAwDgYDVQQKDAdFbGlwdGljMRcwFQYDVQQLDA5FQ0MyNTZCUFIxLUNM +STEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZv +QHdvbGZzc2wuY29tMB4XDTIwMTAxNTIwMTM1OFoXDTMwMTAxMzIwMTM1OFowgZox +CzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0 +dGxlMRAwDgYDVQQKDAdFbGlwdGljMRcwFQYDVQQLDA5FQ0MyNTZCUFIxLUNMSTEY +MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv +bGZzc2wuY29tMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABC7vJ8tXOtxiJba1 +QlzuKVbjqM6GbkRSIxXIQ8BiEBYeSsuI0HXgOGuAhGSfcKrYuzOQwduBRq7pgckD +abXOreujgZAwgY0wCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBaAwHQYDVR0O +BBYEFLQbO09l8r+eio/jM5ZEH2fqszTVMB8GA1UdIwQYMBaAFLQbO09l8r+eio/j +M5ZEH2fqszTVMA4GA1UdDwEB/wQEAwIF4DAdBgNVHSUEFjAUBggrBgEFBQcDAgYI +KwYBBQUHAwQwCgYIKoZIzj0EAwIDRwAwRAIgKLa0667Bm3EKFZKT1i0Spv8tKvUj +qOLfbNkz1H/pLggCIDPrRarBfDbBYFIJDi3kKkkd2LLFeT6+1GHFFNC28kLU +-----END CERTIFICATE----- diff --git a/certs/ecc/client-secp256k1-cert.der b/certs/ecc/client-secp256k1-cert.der new file mode 100644 index 000000000..1185dc21e Binary files /dev/null and b/certs/ecc/client-secp256k1-cert.der differ diff --git a/certs/ecc/client-secp256k1-cert.pem b/certs/ecc/client-secp256k1-cert.pem new file mode 100644 index 000000000..0d03c0889 --- /dev/null +++ b/certs/ecc/client-secp256k1-cert.pem @@ -0,0 +1,57 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 3d:12:fd:a2:a8:15:63:d8:4e:3f:48:81:46:92:ae:65:f3:27:7f:f2 + Signature Algorithm: ecdsa-with-SHA256 + Issuer: C = US, ST = Washington, L = Seattle, O = Eliptic, OU = ECC256K1-CLI, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Validity + Not Before: Oct 15 20:13:49 2020 GMT + Not After : Oct 13 20:13:49 2030 GMT + Subject: C = US, ST = Washington, L = Seattle, O = Eliptic, OU = ECC256K1-CLI, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Subject Public Key Info: + Public Key Algorithm: id-ecPublicKey + Public-Key: (256 bit) + pub: + 04:d7:0d:0b:f1:0e:22:88:fe:fb:d5:e5:e1:09:a4: + 3e:90:76:b3:29:cb:d9:13:60:b7:ea:88:82:d7:8c: + b6:db:21:dc:93:0f:e9:58:bb:c5:f2:a2:c2:f5:23: + 36:c5:d5:eb:24:a6:24:db:ee:02:b0:05:31:a6:33: + 1f:cd:79:82:10 + ASN1 OID: secp256k1 + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Cert Type: + SSL Client, S/MIME + X509v3 Subject Key Identifier: + 44:6A:D8:71:6D:AB:62:18:21:02:27:23:90:BF:1D:77:B6:79:4B:77 + X509v3 Authority Key Identifier: + keyid:44:6A:D8:71:6D:AB:62:18:21:02:27:23:90:BF:1D:77:B6:79:4B:77 + + X509v3 Key Usage: critical + Digital Signature, Non Repudiation, Key Encipherment + X509v3 Extended Key Usage: + TLS Web Client Authentication, E-mail Protection + Signature Algorithm: ecdsa-with-SHA256 + 30:45:02:20:73:08:4a:18:d1:ad:81:f6:5c:59:27:da:36:9a: + cd:fb:4e:97:5a:58:b3:61:fe:b0:ec:7e:76:ca:0c:5a:d3:c1: + 02:21:00:a5:05:b4:f5:2f:d3:bf:71:d4:0c:fb:bf:a0:64:0b: + cd:bb:18:ef:df:92:bc:5c:cc:6c:74:82:c8:52:5a:f6:46 +-----BEGIN CERTIFICATE----- +MIICwjCCAmigAwIBAgIUPRL9oqgVY9hOP0iBRpKuZfMnf/IwCgYIKoZIzj0EAwIw +gZgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT +ZWF0dGxlMRAwDgYDVQQKDAdFbGlwdGljMRUwEwYDVQQLDAxFQ0MyNTZLMS1DTEkx +GDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 +b2xmc3NsLmNvbTAeFw0yMDEwMTUyMDEzNDlaFw0zMDEwMTMyMDEzNDlaMIGYMQsw +CQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRs +ZTEQMA4GA1UECgwHRWxpcHRpYzEVMBMGA1UECwwMRUNDMjU2SzEtQ0xJMRgwFgYD +VQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz +bC5jb20wVjAQBgcqhkjOPQIBBgUrgQQACgNCAATXDQvxDiKI/vvV5eEJpD6QdrMp +y9kTYLfqiILXjLbbIdyTD+lYu8XyosL1IzbF1eskpiTb7gKwBTGmMx/NeYIQo4GQ +MIGNMAkGA1UdEwQCMAAwEQYJYIZIAYb4QgEBBAQDAgWgMB0GA1UdDgQWBBREathx +batiGCECJyOQvx13tnlLdzAfBgNVHSMEGDAWgBREathxbatiGCECJyOQvx13tnlL +dzAOBgNVHQ8BAf8EBAMCBeAwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwME +MAoGCCqGSM49BAMCA0gAMEUCIHMIShjRrYH2XFkn2jaazftOl1pYs2H+sOx+dsoM +WtPBAiEApQW09S/Tv3HUDPu/oGQLzbsY79+SvFzMbHSCyFJa9kY= +-----END CERTIFICATE----- diff --git a/certs/ecc/genecc.sh b/certs/ecc/genecc.sh index 025072b38..752440e5f 100755 --- a/certs/ecc/genecc.sh +++ b/certs/ecc/genecc.sh @@ -88,6 +88,39 @@ rm ./certs/client-ecc384-req.pem rm ./certs/client-ecc384-key.par +# Generate ECC Kerberos Keys +if [ -f ./certs/ecc/secp256k1-key.pem ]; then + openssl ecparam -name secp256k1 -genkey -noout -out ./certs/ecc/secp256k1-key.pem + openssl ec -in ./certs/ecc/secp256k1-key.pem -inform PEM -out ./certs/ecc/secp256k1-key.der -outform DER +fi +# Create self-signed ECC Kerberos certificates +openssl req -config ./certs/ecc/wolfssl.cnf -sha256 -new -key ./certs/ecc/secp256k1-key.pem -out ./certs/ecc/server-secp256k1-req.pem -subj "/C=US/ST=Washington/L=Seattle/O=Eliptic/OU=ECC256K1-SRV/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" +openssl x509 -req -in ./certs/ecc/server-secp256k1-req.pem -days 3650 -extfile ./certs/ecc/wolfssl.cnf -extensions server_cert -signkey ./certs/ecc/secp256k1-key.pem -text -out ./certs/ecc/server-secp256k1-cert.pem +openssl x509 -inform pem -in ./certs/ecc/server-secp256k1-cert.pem -outform der -out ./certs/ecc/server-secp256k1-cert.der +rm ./certs/ecc/server-secp256k1-req.pem + +openssl req -config ./certs/ecc/wolfssl.cnf -sha256 -new -key ./certs/ecc/secp256k1-key.pem -out ./certs/ecc/client-secp256k1-req.pem -subj "/C=US/ST=Washington/L=Seattle/O=Eliptic/OU=ECC256K1-CLI/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" +openssl x509 -req -in ./certs/ecc/client-secp256k1-req.pem -days 3650 -extfile ./certs/ecc/wolfssl.cnf -extensions usr_cert -signkey ./certs/ecc/secp256k1-key.pem -text -out ./certs/ecc/client-secp256k1-cert.pem +openssl x509 -inform pem -in ./certs/ecc/client-secp256k1-cert.pem -outform der -out ./certs/ecc/client-secp256k1-cert.der +rm ./certs/ecc/client-secp256k1-req.pem + +# Generate ECC Brainpool Keys +if [ -f ./certs/ecc/bp256r1-key.pem ]; then + openssl ecparam -name brainpoolP256r1 -genkey -noout -out ./certs/ecc/bp256r1-key.pem + openssl ec -in ./certs/ecc/bp256r1-key.pem -inform PEM -out ./certs/ecc/bp256r1-key.der -outform DER +fi +# Create self-signed ECC Brainpool certificates +openssl req -config ./certs/ecc/wolfssl.cnf -sha256 -new -key ./certs/ecc/bp256r1-key.pem -out ./certs/ecc/server-bp256r1-req.pem -subj "/C=US/ST=Washington/L=Seattle/O=Eliptic/OU=ECC256BPR1-SRV/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" +openssl x509 -req -in ./certs/ecc/server-bp256r1-req.pem -days 3650 -extfile ./certs/ecc/wolfssl.cnf -extensions server_cert -signkey ./certs/ecc/bp256r1-key.pem -text -out ./certs/ecc/server-bp256r1-cert.pem +openssl x509 -inform pem -in ./certs/ecc/server-bp256r1-cert.pem -outform der -out ./certs/ecc/server-bp256r1-cert.der +rm ./certs/ecc/server-bp256r1-req.pem + +openssl req -config ./certs/ecc/wolfssl.cnf -sha256 -new -key ./certs/ecc/bp256r1-key.pem -out ./certs/ecc/client-bp256r1-req.pem -subj "/C=US/ST=Washington/L=Seattle/O=Eliptic/OU=ECC256BPR1-CLI/CN=www.wolfssl.com/emailAddress=info@wolfssl.com/" +openssl x509 -req -in ./certs/ecc/client-bp256r1-req.pem -days 3650 -extfile ./certs/ecc/wolfssl.cnf -extensions usr_cert -signkey ./certs/ecc/bp256r1-key.pem -text -out ./certs/ecc/client-bp256r1-cert.pem +openssl x509 -inform pem -in ./certs/ecc/client-bp256r1-cert.pem -outform der -out ./certs/ecc/client-bp256r1-cert.der +rm ./certs/ecc/client-bp256r1-req.pem + + # Also manually need to: # 1. Copy ./certs/server-ecc.der into ./certs/test/server-cert-ecc-badsig.der `cp ./certs/server-ecc.der ./certs/test/server-cert-ecc-badsig.der` # 2. Modify last byte so its invalidates signature in ./certs/test/server-cert-ecc-badsig.der diff --git a/certs/ecc/include.am b/certs/ecc/include.am index b9897c1c2..c5a4f858a 100644 --- a/certs/ecc/include.am +++ b/certs/ecc/include.am @@ -6,3 +6,21 @@ EXTRA_DIST += \ certs/ecc/genecc.sh \ certs/ecc/wolfssl.cnf \ certs/ecc/wolfssl_384.cnf + +# Koblitz Curves +EXTRA_DIST += \ + certs/ecc/secp256k1-key.der \ + certs/ecc/secp256k1-key.pem \ + certs/ecc/client-secp256k1-cert.der \ + certs/ecc/client-secp256k1-cert.pem \ + certs/ecc/server-secp256k1-cert.der \ + certs/ecc/server-secp256k1-cert.pem + +# Brainpool Curves +EXTRA_DIST += \ + certs/ecc/bp256r1-key.der \ + certs/ecc/bp256r1-key.pem \ + certs/ecc/client-bp256r1-cert.der \ + certs/ecc/client-bp256r1-cert.pem \ + certs/ecc/server-bp256r1-cert.der \ + certs/ecc/server-bp256r1-cert.pem diff --git a/certs/ecc/secp256k1-key.der b/certs/ecc/secp256k1-key.der new file mode 100644 index 000000000..6a80d8bdf Binary files /dev/null and b/certs/ecc/secp256k1-key.der differ diff --git a/certs/ecc/secp256k1-key.pem b/certs/ecc/secp256k1-key.pem new file mode 100644 index 000000000..be4b4889a --- /dev/null +++ b/certs/ecc/secp256k1-key.pem @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHQCAQEEILlFjaVww/Q8MLWZOcmS3ZCx3VCJWWoNXxRYRA3e4IApoAcGBSuBBAAK +oUQDQgAE1w0L8Q4iiP771eXhCaQ+kHazKcvZE2C36oiC14y22yHckw/pWLvF8qLC +9SM2xdXrJKYk2+4CsAUxpjMfzXmCEA== +-----END EC PRIVATE KEY----- diff --git a/certs/ecc/server-bp256r1-cert.der b/certs/ecc/server-bp256r1-cert.der new file mode 100644 index 000000000..2115e0572 Binary files /dev/null and b/certs/ecc/server-bp256r1-cert.der differ diff --git a/certs/ecc/server-bp256r1-cert.pem b/certs/ecc/server-bp256r1-cert.pem new file mode 100644 index 000000000..217d21c55 --- /dev/null +++ b/certs/ecc/server-bp256r1-cert.pem @@ -0,0 +1,63 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 2f:f8:fa:8b:cf:ec:8f:2c:bc:40:fb:95:a0:3e:04:db:dd:c5:7f:08 + Signature Algorithm: ecdsa-with-SHA256 + Issuer: C = US, ST = Washington, L = Seattle, O = Eliptic, OU = ECC256BPR1-SRV, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Validity + Not Before: Oct 15 20:13:55 2020 GMT + Not After : Oct 13 20:13:55 2030 GMT + Subject: C = US, ST = Washington, L = Seattle, O = Eliptic, OU = ECC256BPR1-SRV, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Subject Public Key Info: + Public Key Algorithm: id-ecPublicKey + Public-Key: (256 bit) + pub: + 04:2e:ef:27:cb:57:3a:dc:62:25:b6:b5:42:5c:ee: + 29:56:e3:a8:ce:86:6e:44:52:23:15:c8:43:c0:62: + 10:16:1e:4a:cb:88:d0:75:e0:38:6b:80:84:64:9f: + 70:aa:d8:bb:33:90:c1:db:81:46:ae:e9:81:c9:03: + 69:b5:ce:ad:eb + ASN1 OID: brainpoolP256r1 + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Cert Type: + SSL Server + X509v3 Subject Key Identifier: + B4:1B:3B:4F:65:F2:BF:9E:8A:8F:E3:33:96:44:1F:67:EA:B3:34:D5 + X509v3 Authority Key Identifier: + keyid:B4:1B:3B:4F:65:F2:BF:9E:8A:8F:E3:33:96:44:1F:67:EA:B3:34:D5 + DirName:/C=US/ST=Washington/L=Seattle/O=Eliptic/OU=ECC256BPR1-SRV/CN=www.wolfssl.com/emailAddress=info@wolfssl.com + serial:2F:F8:FA:8B:CF:EC:8F:2C:BC:40:FB:95:A0:3E:04:DB:DD:C5:7F:08 + + X509v3 Key Usage: critical + Digital Signature, Key Encipherment, Key Agreement + X509v3 Extended Key Usage: + TLS Web Server Authentication + Signature Algorithm: ecdsa-with-SHA256 + 30:45:02:21:00:81:37:b3:f7:a7:e7:9d:1b:62:3f:25:20:02: + 45:93:45:5c:91:23:1b:8b:bc:09:0c:f7:ef:51:29:a4:90:ec: + 91:02:20:74:dd:26:c3:eb:24:e1:33:ce:b4:c6:f8:5f:9f:99: + 6d:2b:9a:ee:ac:33:d8:08:29:19:3c:00:f1:83:de:a6:af +-----BEGIN CERTIFICATE----- +MIIDfjCCAySgAwIBAgIUL/j6i8/sjyy8QPuVoD4E293FfwgwCgYIKoZIzj0EAwIw +gZoxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT +ZWF0dGxlMRAwDgYDVQQKDAdFbGlwdGljMRcwFQYDVQQLDA5FQ0MyNTZCUFIxLVNS +VjEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZv +QHdvbGZzc2wuY29tMB4XDTIwMTAxNTIwMTM1NVoXDTMwMTAxMzIwMTM1NVowgZox +CzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0 +dGxlMRAwDgYDVQQKDAdFbGlwdGljMRcwFQYDVQQLDA5FQ0MyNTZCUFIxLVNSVjEY +MBYGA1UEAwwPd3d3LndvbGZzc2wuY29tMR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdv +bGZzc2wuY29tMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABC7vJ8tXOtxiJba1 +QlzuKVbjqM6GbkRSIxXIQ8BiEBYeSsuI0HXgOGuAhGSfcKrYuzOQwduBRq7pgckD +abXOreujggFDMIIBPzAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIGQDAdBgNV +HQ4EFgQUtBs7T2Xyv56Kj+MzlkQfZ+qzNNUwgdoGA1UdIwSB0jCBz4AUtBs7T2Xy +v56Kj+MzlkQfZ+qzNNWhgaCkgZ0wgZoxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApX +YXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRAwDgYDVQQKDAdFbGlwdGljMRcw +FQYDVQQLDA5FQ0MyNTZCUFIxLVNSVjEYMBYGA1UEAwwPd3d3LndvbGZzc2wuY29t +MR8wHQYJKoZIhvcNAQkBFhBpbmZvQHdvbGZzc2wuY29tghQv+PqLz+yPLLxA+5Wg +PgTb3cV/CDAOBgNVHQ8BAf8EBAMCA6gwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCgYI +KoZIzj0EAwIDSAAwRQIhAIE3s/en550bYj8lIAJFk0VckSMbi7wJDPfvUSmkkOyR +AiB03SbD6yThM860xvhfn5ltK5rurDPYCCkZPADxg96mrw== +-----END CERTIFICATE----- diff --git a/certs/ecc/server-secp256k1-cert.der b/certs/ecc/server-secp256k1-cert.der new file mode 100644 index 000000000..19f9ec7e8 Binary files /dev/null and b/certs/ecc/server-secp256k1-cert.der differ diff --git a/certs/ecc/server-secp256k1-cert.pem b/certs/ecc/server-secp256k1-cert.pem new file mode 100644 index 000000000..bc8d1952f --- /dev/null +++ b/certs/ecc/server-secp256k1-cert.pem @@ -0,0 +1,63 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: + 60:d5:b7:78:ff:06:14:3b:1e:c5:ba:8b:dd:5e:67:b2:16:aa:b2:c7 + Signature Algorithm: ecdsa-with-SHA256 + Issuer: C = US, ST = Washington, L = Seattle, O = Eliptic, OU = ECC256K1-SRV, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Validity + Not Before: Oct 15 20:13:46 2020 GMT + Not After : Oct 13 20:13:46 2030 GMT + Subject: C = US, ST = Washington, L = Seattle, O = Eliptic, OU = ECC256K1-SRV, CN = www.wolfssl.com, emailAddress = info@wolfssl.com + Subject Public Key Info: + Public Key Algorithm: id-ecPublicKey + Public-Key: (256 bit) + pub: + 04:d7:0d:0b:f1:0e:22:88:fe:fb:d5:e5:e1:09:a4: + 3e:90:76:b3:29:cb:d9:13:60:b7:ea:88:82:d7:8c: + b6:db:21:dc:93:0f:e9:58:bb:c5:f2:a2:c2:f5:23: + 36:c5:d5:eb:24:a6:24:db:ee:02:b0:05:31:a6:33: + 1f:cd:79:82:10 + ASN1 OID: secp256k1 + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Cert Type: + SSL Server + X509v3 Subject Key Identifier: + 44:6A:D8:71:6D:AB:62:18:21:02:27:23:90:BF:1D:77:B6:79:4B:77 + X509v3 Authority Key Identifier: + keyid:44:6A:D8:71:6D:AB:62:18:21:02:27:23:90:BF:1D:77:B6:79:4B:77 + DirName:/C=US/ST=Washington/L=Seattle/O=Eliptic/OU=ECC256K1-SRV/CN=www.wolfssl.com/emailAddress=info@wolfssl.com + serial:60:D5:B7:78:FF:06:14:3B:1E:C5:BA:8B:DD:5E:67:B2:16:AA:B2:C7 + + X509v3 Key Usage: critical + Digital Signature, Key Encipherment, Key Agreement + X509v3 Extended Key Usage: + TLS Web Server Authentication + Signature Algorithm: ecdsa-with-SHA256 + 30:44:02:20:01:71:b5:5f:e4:5b:b7:95:b4:59:9a:b0:dc:ef: + 64:01:76:ef:04:07:d8:b4:44:e5:db:86:e4:05:8c:c1:22:19: + 02:20:3e:93:fb:30:f9:4c:89:39:35:df:b3:79:d5:29:bb:2b: + 08:84:8a:f8:55:7c:f9:68:d6:2c:11:28:af:a9:33:0f +-----BEGIN CERTIFICATE----- +MIIDczCCAxqgAwIBAgIUYNW3eP8GFDsexbqL3V5nshaqsscwCgYIKoZIzj0EAwIw +gZgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdT +ZWF0dGxlMRAwDgYDVQQKDAdFbGlwdGljMRUwEwYDVQQLDAxFQ0MyNTZLMS1TUlYx +GDAWBgNVBAMMD3d3dy53b2xmc3NsLmNvbTEfMB0GCSqGSIb3DQEJARYQaW5mb0B3 +b2xmc3NsLmNvbTAeFw0yMDEwMTUyMDEzNDZaFw0zMDEwMTMyMDEzNDZaMIGYMQsw +CQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRs +ZTEQMA4GA1UECgwHRWxpcHRpYzEVMBMGA1UECwwMRUNDMjU2SzEtU1JWMRgwFgYD +VQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG9w0BCQEWEGluZm9Ad29sZnNz +bC5jb20wVjAQBgcqhkjOPQIBBgUrgQQACgNCAATXDQvxDiKI/vvV5eEJpD6QdrMp +y9kTYLfqiILXjLbbIdyTD+lYu8XyosL1IzbF1eskpiTb7gKwBTGmMx/NeYIQo4IB +QTCCAT0wCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBkAwHQYDVR0OBBYEFERq +2HFtq2IYIQInI5C/HXe2eUt3MIHYBgNVHSMEgdAwgc2AFERq2HFtq2IYIQInI5C/ +HXe2eUt3oYGepIGbMIGYMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2FzaGluZ3Rv +bjEQMA4GA1UEBwwHU2VhdHRsZTEQMA4GA1UECgwHRWxpcHRpYzEVMBMGA1UECwwM +RUNDMjU2SzEtU1JWMRgwFgYDVQQDDA93d3cud29sZnNzbC5jb20xHzAdBgkqhkiG +9w0BCQEWEGluZm9Ad29sZnNzbC5jb22CFGDVt3j/BhQ7HsW6i91eZ7IWqrLHMA4G +A1UdDwEB/wQEAwIDqDATBgNVHSUEDDAKBggrBgEFBQcDATAKBggqhkjOPQQDAgNH +ADBEAiABcbVf5Fu3lbRZmrDc72QBdu8EB9i0ROXbhuQFjMEiGQIgPpP7MPlMiTk1 +37N51Sm7KwiEivhVfPlo1iwRKK+pMw8= +-----END CERTIFICATE----- diff --git a/configure.ac b/configure.ac index e832a8768..8f277be6f 100644 --- a/configure.ac +++ b/configure.ac @@ -1880,6 +1880,16 @@ then fi +# ECC Minimum Key Size +ENABLED_ECCMINSZ=224 +AC_ARG_WITH([eccminsz], + [AS_HELP_STRING([--with-eccminsz=BITS],[Sets the ECC minimum key size (default: 224 bits)])], + [ + ENABLED_ECCMINSZ=$withval + AM_CFLAGS="$AM_CFLAGS -DECC_MIN_KEY_SZ=$withval" + ] +) + # Compressed Key AC_ARG_ENABLE([compkey], [AS_HELP_STRING([--enable-compkey],[Enable compressed keys support (default: disabled)])], @@ -6042,6 +6052,7 @@ echo " * DH: $ENABLED_DH" echo " * DH Default Parameters: $ENABLED_DHDEFAULTPARAMS" echo " * ECC: $ENABLED_ECC" echo " * ECC Custom Curves $ENABLED_ECCCUSTCURVES" +echo " * ECC Minimum Bits $ENABLED_ECCMINSZ" echo " * CURVE25519: $ENABLED_CURVE25519" echo " * ED25519: $ENABLED_ED25519" echo " * CURVE448: $ENABLED_CURVE448" diff --git a/src/internal.c b/src/internal.c index 1ed9448d2..414477d06 100644 --- a/src/internal.c +++ b/src/internal.c @@ -4278,11 +4278,12 @@ int EccMakeKey(WOLFSSL* ssl, ecc_key* key, ecc_key* peer) #endif /* get key size */ - if (peer == NULL) { + if (peer == NULL || peer->dp == NULL) { keySz = ssl->eccTempKeySz; } else { keySz = peer->dp->size; + ecc_curve = peer->dp->id; } /* get curve type */ @@ -11513,6 +11514,10 @@ int ProcessPeerCerts(WOLFSSL* ssl, byte* input, word32* inOutIdx, ret = ECC_KEY_SIZE_E; WOLFSSL_MSG("Peer ECC key is too small"); } + + /* populate curve oid - if missing */ + if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0) + ssl->ecdhCurveOID = args->dCert->pkCurveOID; break; } #endif /* HAVE_ECC */ @@ -11563,6 +11568,10 @@ int ProcessPeerCerts(WOLFSSL* ssl, byte* input, word32* inOutIdx, ret = ECC_KEY_SIZE_E; WOLFSSL_MSG("Peer ECC key is too small"); } + + /* populate curve oid - if missing */ + if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0) + ssl->ecdhCurveOID = ECC_X25519_OID; break; } #endif /* HAVE_ED25519 */ @@ -11612,6 +11621,10 @@ int ProcessPeerCerts(WOLFSSL* ssl, byte* input, word32* inOutIdx, ret = ECC_KEY_SIZE_E; WOLFSSL_MSG("Peer ECC key is too small"); } + + /* populate curve oid - if missing */ + if (ssl->options.side == WOLFSSL_CLIENT_END && ssl->ecdhCurveOID == 0) + ssl->ecdhCurveOID = ECC_X448_OID; break; } #endif /* HAVE_ED448 */ @@ -21101,7 +21114,7 @@ exit_dpk: int ret = ECC_CURVE_ERROR; switch (tlsCurveId) { - #if defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160 #ifndef NO_ECC_SECP case WOLFSSL_ECC_SECP160R1: return ECC_SECP160R1_OID; #endif /* !NO_ECC_SECP */ @@ -21112,7 +21125,7 @@ exit_dpk: case WOLFSSL_ECC_SECP160K1: return ECC_SECP160K1_OID; #endif /* HAVE_ECC_KOBLITZ */ #endif - #if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192 #ifndef NO_ECC_SECP case WOLFSSL_ECC_SECP192R1: return ECC_SECP192R1_OID; #endif /* !NO_ECC_SECP */ @@ -21120,7 +21133,7 @@ exit_dpk: case WOLFSSL_ECC_SECP192K1: return ECC_SECP192K1_OID; #endif /* HAVE_ECC_KOBLITZ */ #endif - #if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224 #ifndef NO_ECC_SECP case WOLFSSL_ECC_SECP224R1: return ECC_SECP224R1_OID; #endif /* !NO_ECC_SECP */ @@ -21128,10 +21141,10 @@ exit_dpk: case WOLFSSL_ECC_SECP224K1: return ECC_SECP224K1_OID; #endif /* HAVE_ECC_KOBLITZ */ #endif - #ifdef HAVE_CURVE25519 + #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256 case WOLFSSL_ECC_X25519: return ECC_X25519_OID; #endif - #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES) + #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256 #ifndef NO_ECC_SECP case WOLFSSL_ECC_SECP256R1: return ECC_SECP256R1_OID; #endif /* !NO_ECC_SECP */ @@ -21142,10 +21155,10 @@ exit_dpk: case WOLFSSL_ECC_BRAINPOOLP256R1: return ECC_BRAINPOOLP256R1_OID; #endif /* HAVE_ECC_BRAINPOOL */ #endif - #ifdef HAVE_CURVE448 + #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448 case WOLFSSL_ECC_X448: return ECC_X448_OID; #endif - #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384 #ifndef NO_ECC_SECP case WOLFSSL_ECC_SECP384R1: return ECC_SECP384R1_OID; #endif /* !NO_ECC_SECP */ @@ -21153,12 +21166,12 @@ exit_dpk: case WOLFSSL_ECC_BRAINPOOLP384R1: return ECC_BRAINPOOLP384R1_OID; #endif /* HAVE_ECC_BRAINPOOL */ #endif - #if defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512 #ifdef HAVE_ECC_BRAINPOOL case WOLFSSL_ECC_BRAINPOOLP512R1: return ECC_BRAINPOOLP512R1_OID; #endif /* HAVE_ECC_BRAINPOOL */ #endif - #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521 #ifndef NO_ECC_SECP case WOLFSSL_ECC_SECP521R1: return ECC_SECP521R1_OID; #endif /* !NO_ECC_SECP */ @@ -24750,7 +24763,7 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, /* returns the WOLFSSL_* version of the curve from the OID sum */ word16 GetCurveByOID(int oidSum) { switch(oidSum) { - #if defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160 #ifndef NO_ECC_SECP case ECC_SECP160R1_OID: return WOLFSSL_ECC_SECP160R1; @@ -24764,7 +24777,7 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, return WOLFSSL_ECC_SECP160K1; #endif /* HAVE_ECC_KOBLITZ */ #endif - #if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192 #ifndef NO_ECC_SECP case ECC_SECP192R1_OID: return WOLFSSL_ECC_SECP192R1; @@ -24774,7 +24787,7 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, return WOLFSSL_ECC_SECP192K1; #endif /* HAVE_ECC_KOBLITZ */ #endif - #if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224 #ifndef NO_ECC_SECP case ECC_SECP224R1_OID: return WOLFSSL_ECC_SECP224R1; @@ -24784,7 +24797,7 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, return WOLFSSL_ECC_SECP224K1; #endif /* HAVE_ECC_KOBLITZ */ #endif - #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES) + #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256 #ifndef NO_ECC_SECP case ECC_SECP256R1_OID: return WOLFSSL_ECC_SECP256R1; @@ -24798,7 +24811,7 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, return WOLFSSL_ECC_BRAINPOOLP256R1; #endif /* HAVE_ECC_BRAINPOOL */ #endif - #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384 #ifndef NO_ECC_SECP case ECC_SECP384R1_OID: return WOLFSSL_ECC_SECP384R1; @@ -24808,13 +24821,13 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, return WOLFSSL_ECC_BRAINPOOLP384R1; #endif /* HAVE_ECC_BRAINPOOL */ #endif - #if defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512 #ifdef HAVE_ECC_BRAINPOOL case ECC_BRAINPOOLP512R1_OID: return WOLFSSL_ECC_BRAINPOOLP512R1; #endif /* HAVE_ECC_BRAINPOOL */ #endif - #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521 #ifndef NO_ECC_SECP case ECC_SECP521R1_OID: return WOLFSSL_ECC_SECP521R1; @@ -29385,6 +29398,13 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx, ssl->arrays->preMasterSz = private_key->dp->size; ssl->peerEccKeyPresent = 1; + + #if defined(WOLFSSL_TLS13) || defined(HAVE_FFDHE) + /* client_hello may have sent FFEDH2048, which sets namedGroup, + but that is not being used, so clear it */ + /* resolves issue with server side wolfSSL_get_curve_name */ + ssl->namedGroup = 0; + #endif #endif /* HAVE_ECC */ break; diff --git a/src/ssl.c b/src/ssl.c index 18963faa1..d4141c440 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -10153,12 +10153,13 @@ int wolfSSL_use_certificate_chain_file_format(WOLFSSL* ssl, const char* file, #ifdef HAVE_ECC -/* Set Temp CTX EC-DHE size in octets, should be 20 - 66 for 160 - 521 bit */ +/* Set Temp CTX EC-DHE size in octets, can be 14 - 66 (112 - 521 bit) */ int wolfSSL_CTX_SetTmpEC_DHE_Sz(WOLFSSL_CTX* ctx, word16 sz) { if (ctx == NULL) return BAD_FUNC_ARG; + /* if 0 then get from loaded private key */ if (sz == 0) { /* applies only to ECDSA */ if (ctx->privateKeyType != ecc_dsa_sa_algo) @@ -10182,10 +10183,14 @@ int wolfSSL_CTX_SetTmpEC_DHE_Sz(WOLFSSL_CTX* ctx, word16 sz) } -/* Set Temp SSL EC-DHE size in octets, should be 20 - 66 for 160 - 521 bit */ +/* Set Temp SSL EC-DHE size in octets, can be 14 - 66 (112 - 521 bit) */ int wolfSSL_SetTmpEC_DHE_Sz(WOLFSSL* ssl, word16 sz) { - if (ssl == NULL || sz < ECC_MINSIZE || sz > ECC_MAXSIZE) + if (ssl == NULL) + return BAD_FUNC_ARG; + + /* check size */ + if (sz < ECC_MINSIZE || sz > ECC_MAXSIZE) return BAD_FUNC_ARG; ssl->eccTempKeySz = sz; diff --git a/src/tls.c b/src/tls.c index 811d280bc..fa7c71113 100644 --- a/src/tls.c +++ b/src/tls.c @@ -4340,7 +4340,7 @@ int TLSX_ValidateSupportedCurves(WOLFSSL* ssl, byte first, byte second) { /* find supported curve */ switch (curve->name) { #ifdef HAVE_ECC - #if defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160 #ifndef NO_ECC_SECP case WOLFSSL_ECC_SECP160R1: pkOid = oid = ECC_SECP160R1_OID; @@ -4359,8 +4359,8 @@ int TLSX_ValidateSupportedCurves(WOLFSSL* ssl, byte first, byte second) { octets = 20; break; #endif /* HAVE_ECC_KOBLITZ */ - #endif - #if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES) + #endif + #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192 #ifndef NO_ECC_SECP case WOLFSSL_ECC_SECP192R1: pkOid = oid = ECC_SECP192R1_OID; @@ -4374,7 +4374,7 @@ int TLSX_ValidateSupportedCurves(WOLFSSL* ssl, byte first, byte second) { break; #endif /* HAVE_ECC_KOBLITZ */ #endif - #if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224 #ifndef NO_ECC_SECP case WOLFSSL_ECC_SECP224R1: pkOid = oid = ECC_SECP224R1_OID; @@ -4388,7 +4388,7 @@ int TLSX_ValidateSupportedCurves(WOLFSSL* ssl, byte first, byte second) { break; #endif /* HAVE_ECC_KOBLITZ */ #endif - #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES) + #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256 #ifndef NO_ECC_SECP case WOLFSSL_ECC_SECP256R1: pkOid = oid = ECC_SECP256R1_OID; @@ -4397,7 +4397,7 @@ int TLSX_ValidateSupportedCurves(WOLFSSL* ssl, byte first, byte second) { #endif /* !NO_ECC_SECP */ #endif /* !NO_ECC256 || HAVE_ALL_CURVES */ #endif - #if defined(HAVE_CURVE25519) || defined(HAVE_ED25519) + #if (defined(HAVE_CURVE25519) || defined(HAVE_ED25519)) && ECC_MIN_KEY_SZ <= 256 case WOLFSSL_ECC_X25519: oid = ECC_X25519_OID; #ifdef HAVE_ED25519 @@ -4409,7 +4409,7 @@ int TLSX_ValidateSupportedCurves(WOLFSSL* ssl, byte first, byte second) { break; #endif /* HAVE_CURVE25519 */ #ifdef HAVE_ECC - #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES) + #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256 #ifdef HAVE_ECC_KOBLITZ case WOLFSSL_ECC_SECP256K1: pkOid = oid = ECC_SECP256K1_OID; @@ -4423,20 +4423,7 @@ int TLSX_ValidateSupportedCurves(WOLFSSL* ssl, byte first, byte second) { break; #endif /* HAVE_ECC_BRAINPOOL */ #endif -#endif - #if defined(HAVE_CURVE448) || defined(HAVE_ED448) - case WOLFSSL_ECC_X448: - oid = ECC_X448_OID; - #ifdef HAVE_ED448 - pkOid = ECC_ED448_OID; - #else - pkOid = ECC_X448_OID; - #endif - octets = 57; - break; - #endif /* HAVE_CURVE448 */ -#ifdef HAVE_ECC - #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384 #ifndef NO_ECC_SECP case WOLFSSL_ECC_SECP384R1: pkOid = oid = ECC_SECP384R1_OID; @@ -4450,7 +4437,20 @@ int TLSX_ValidateSupportedCurves(WOLFSSL* ssl, byte first, byte second) { break; #endif /* HAVE_ECC_BRAINPOOL */ #endif - #if defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES) +#endif + #if (defined(HAVE_CURVE448) || defined(HAVE_ED448)) && ECC_MIN_KEY_SZ <= 448 + case WOLFSSL_ECC_X448: + oid = ECC_X448_OID; + #ifdef HAVE_ED448 + pkOid = ECC_ED448_OID; + #else + pkOid = ECC_X448_OID; + #endif + octets = 57; + break; + #endif /* HAVE_CURVE448 */ +#ifdef HAVE_ECC + #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512 #ifdef HAVE_ECC_BRAINPOOL case WOLFSSL_ECC_BRAINPOOLP512R1: pkOid = oid = ECC_BRAINPOOLP512R1_OID; @@ -4458,7 +4458,7 @@ int TLSX_ValidateSupportedCurves(WOLFSSL* ssl, byte first, byte second) { break; #endif /* HAVE_ECC_BRAINPOOL */ #endif - #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521 #ifndef NO_ECC_SECP case WOLFSSL_ECC_SECP521R1: pkOid = oid = ECC_SECP521R1_OID; @@ -6919,7 +6919,7 @@ static int TLSX_KeyShare_GenEccKey(WOLFSSL *ssl, KeyShareEntry* kse) /* TODO: [TLS13] The key sizes should come from wolfcrypt. */ /* Translate named group to a curve id. */ switch (kse->group) { - #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES) + #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256 #ifndef NO_ECC_SECP case WOLFSSL_ECC_SECP256R1: curveId = ECC_SECP256R1; @@ -6928,7 +6928,7 @@ static int TLSX_KeyShare_GenEccKey(WOLFSSL *ssl, KeyShareEntry* kse) break; #endif /* !NO_ECC_SECP */ #endif - #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384 #ifndef NO_ECC_SECP case WOLFSSL_ECC_SECP384R1: curveId = ECC_SECP384R1; @@ -6937,7 +6937,7 @@ static int TLSX_KeyShare_GenEccKey(WOLFSSL *ssl, KeyShareEntry* kse) break; #endif /* !NO_ECC_SECP */ #endif - #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521 #ifndef NO_ECC_SECP case WOLFSSL_ECC_SECP521R1: curveId = ECC_SECP521R1; @@ -6946,7 +6946,7 @@ static int TLSX_KeyShare_GenEccKey(WOLFSSL *ssl, KeyShareEntry* kse) break; #endif /* !NO_ECC_SECP */ #endif - #ifdef HAVE_X448 + #if defined(HAVE_X448) && ECC_MIN_KEY_SZ <= 448 case WOLFSSL_ECC_X448: curveId = ECC_X448; dataSize = keySize = 56; @@ -7477,28 +7477,28 @@ static int TLSX_KeyShare_ProcessEcc(WOLFSSL* ssl, KeyShareEntry* keyShareEntry) /* find supported curve */ switch (keyShareEntry->group) { - #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES) + #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256 #ifndef NO_ECC_SECP case WOLFSSL_ECC_SECP256R1: curveId = ECC_SECP256R1; break; #endif /* !NO_ECC_SECP */ #endif - #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384 #ifndef NO_ECC_SECP case WOLFSSL_ECC_SECP384R1: curveId = ECC_SECP384R1; break; #endif /* !NO_ECC_SECP */ #endif - #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521 #ifndef NO_ECC_SECP case WOLFSSL_ECC_SECP521R1: curveId = ECC_SECP521R1; break; #endif /* !NO_ECC_SECP */ #endif - #ifdef HAVE_X448 + #if defined(HAVE_X448) && ECC_MIN_KEY_SZ <= 448 case WOLFSSL_ECC_X448: curveId = ECC_X448; break; @@ -7973,27 +7973,27 @@ static int TLSX_KeyShare_IsSupported(int namedGroup) case WOLFSSL_FFDHE_8192: break; #endif - #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES) + #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256 #ifndef NO_ECC_SECP case WOLFSSL_ECC_SECP256R1: break; #endif /* !NO_ECC_SECP */ #endif - #ifdef HAVE_CURVE25519 + #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256 case WOLFSSL_ECC_X25519: break; #endif - #ifdef HAVE_CURVE448 + #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448 case WOLFSSL_ECC_X448: break; #endif - #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384 #ifndef NO_ECC_SECP case WOLFSSL_ECC_SECP384R1: break; #endif /* !NO_ECC_SECP */ #endif - #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521 #ifndef NO_ECC_SECP case WOLFSSL_ECC_SECP521R1: break; @@ -8020,29 +8020,29 @@ static int TLSX_KeyShare_GroupRank(WOLFSSL* ssl, int group) if (ssl->numGroups == 0) { #if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES) - #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES) + #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256 #ifndef NO_ECC_SECP ssl->group[ssl->numGroups++] = WOLFSSL_ECC_SECP256R1; #endif #endif #endif #ifndef HAVE_FIPS - #if defined(HAVE_CURVE25519) + #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256 ssl->group[ssl->numGroups++] = WOLFSSL_ECC_X25519; #endif #endif #ifndef HAVE_FIPS - #if defined(HAVE_CURVE448) + #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448 ssl->group[ssl->numGroups++] = WOLFSSL_ECC_X448; #endif #endif #if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES) - #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384 #ifndef NO_ECC_SECP ssl->group[ssl->numGroups++] = WOLFSSL_ECC_SECP384R1; #endif #endif - #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521 #ifndef NO_ECC_SECP ssl->group[ssl->numGroups++] = WOLFSSL_ECC_SECP521R1; #endif @@ -9847,21 +9847,21 @@ static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions) #if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES) /* list in order by strength, since not all servers choose by strength */ - #if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521 #ifndef NO_ECC_SECP ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP521R1, ssl->heap); if (ret != WOLFSSL_SUCCESS) return ret; #endif #endif - #if defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512 #ifdef HAVE_ECC_BRAINPOOL ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_BRAINPOOLP512R1, ssl->heap); if (ret != WOLFSSL_SUCCESS) return ret; #endif #endif - #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384 #ifndef NO_ECC_SECP ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP384R1, ssl->heap); @@ -9876,7 +9876,7 @@ static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions) #endif /* HAVE_ECC && HAVE_SUPPORTED_CURVES */ #ifndef HAVE_FIPS - #if defined(HAVE_CURVE448) + #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448 ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_X448, ssl->heap); if (ret != WOLFSSL_SUCCESS) return ret; @@ -9884,7 +9884,7 @@ static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions) #endif /* HAVE_FIPS */ #if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES) - #if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES) + #if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256 #ifndef NO_ECC_SECP ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP256R1, ssl->heap); @@ -9904,7 +9904,7 @@ static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions) #endif /* HAVE_ECC && HAVE_SUPPORTED_CURVES */ #ifndef HAVE_FIPS - #if defined(HAVE_CURVE25519) + #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256 ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_X25519, ssl->heap); if (ret != WOLFSSL_SUCCESS) return ret; @@ -9912,7 +9912,7 @@ static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions) #endif /* HAVE_FIPS */ #if defined(HAVE_ECC) && defined(HAVE_SUPPORTED_CURVES) - #if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224 #ifndef NO_ECC_SECP ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP224R1, ssl->heap); @@ -9926,7 +9926,7 @@ static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions) #endif #ifndef HAVE_FIPS - #if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192 #ifndef NO_ECC_SECP ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP192R1, ssl->heap); @@ -9938,7 +9938,7 @@ static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions) if (ret != WOLFSSL_SUCCESS) return ret; #endif #endif - #if defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES) + #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160 #ifndef NO_ECC_SECP ret = TLSX_UseSupportedCurve(extensions, WOLFSSL_ECC_SECP160R1, ssl->heap); @@ -9958,7 +9958,7 @@ static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions) #endif /* HAVE_FIPS */ #endif /* HAVE_ECC && HAVE_SUPPORTED_CURVES */ - /* Add FFDHE supported groups. */ + /* Add FFDHE supported groups. */ #ifdef HAVE_FFDHE_8192 if (8192/8 >= ssl->options.minDhKeySz && 8192/8 <= ssl->options.maxDhKeySz) { @@ -10180,17 +10180,17 @@ int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer) #endif { #if defined(HAVE_ECC) && (!defined(NO_ECC256) || \ - defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) + defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 256 namedGroup = WOLFSSL_ECC_SECP256R1; - #elif defined(HAVE_CURVE25519) + #elif defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256 namedGroup = WOLFSSL_ECC_X25519; - #elif defined(HAVE_CURVE448) + #elif defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448 namedGroup = WOLFSSL_ECC_X448; #elif defined(HAVE_ECC) && (!defined(NO_ECC384) || \ - defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) + defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 384 namedGroup = WOLFSSL_ECC_SECP384R1; #elif defined(HAVE_ECC) && (!defined(NO_ECC521) || \ - defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) + defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 521 namedGroup = WOLFSSL_ECC_SECP521R1; #elif defined(HAVE_FFDHE_2048) namedGroup = WOLFSSL_FFDHE_2048; diff --git a/tests/api.c b/tests/api.c index f3cc198a1..36c418d8e 100644 --- a/tests/api.c +++ b/tests/api.c @@ -56,71 +56,55 @@ #ifndef ECC_PRIV_KEY_BUF #define ECC_PRIV_KEY_BUF 66 /* For non user defined curves. */ #endif - #ifdef HAVE_ALL_CURVES - /* ecc key sizes: 14, 16, 20, 24, 28, 30, 32, 40, 48, 64*/ - #ifndef KEY14 - #define KEY14 14 - #endif - #if !defined(KEY16) - #define KEY16 16 - #endif - #if !defined(KEY20) - #define KEY20 20 - #endif - #if !defined(KEY24) - #define KEY24 24 - #endif - #if !defined(KEY28) - #define KEY28 28 - #endif - #if !defined(KEY30) - #define KEY30 30 - #endif - #if !defined(KEY32) - #define KEY32 32 - #endif - #if !defined(KEY40) - #define KEY40 40 - #endif - #if !defined(KEY48) - #define KEY48 48 - #endif - #if !defined(KEY64) - #define KEY64 64 - #endif + /* ecc key sizes: 14, 16, 20, 24, 28, 30, 32, 40, 48, 64 */ + /* logic to choose right key ECC size */ + #if (defined(HAVE_ECC112) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 112 + #define KEY14 14 #else - /* ecc key sizes: 14, 16, 20, 24, 28, 30, 32, 40, 48, 64*/ - #ifndef KEY14 - #define KEY14 32 - #endif - #if !defined(KEY16) - #define KEY16 32 - #endif - #if !defined(KEY20) - #define KEY20 32 - #endif - #if !defined(KEY24) - #define KEY24 32 - #endif - #if !defined(KEY28) - #define KEY28 32 - #endif - #if !defined(KEY30) - #define KEY30 32 - #endif - #if !defined(KEY32) - #define KEY32 32 - #endif - #if !defined(KEY40) - #define KEY40 32 - #endif - #if !defined(KEY48) - #define KEY48 32 - #endif - #if !defined(KEY64) - #define KEY64 32 - #endif + #define KEY14 32 #endif + #if (defined(HAVE_ECC128) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 128 + #define KEY16 16 + #else + #define KEY16 32 + #endif + #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160 + #define KEY20 20 + #else + #define KEY20 32 + #endif + #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192 + #define KEY24 24 + #else + #define KEY24 32 + #endif + #if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES) + #define KEY28 28 + #else + #define KEY28 32 + #endif + #if defined(HAVE_ECC239) || defined(HAVE_ALL_CURVES) + #define KEY30 30 + #else + #define KEY30 32 + #endif + #define KEY32 32 + #if defined(HAVE_ECC320) || defined(HAVE_ALL_CURVES) + #define KEY40 40 + #else + #define KEY40 32 + #endif + #if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES) + #define KEY48 48 + #else + #define KEY48 32 + #endif + #if defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES) + #define KEY64 64 + #else + #define KEY64 32 + #endif + #if !defined(HAVE_COMP_KEY) #if !defined(NOCOMP) #define NOCOMP 0 diff --git a/tests/include.am b/tests/include.am index f6d2cd600..6e763c9ee 100644 --- a/tests/include.am +++ b/tests/include.am @@ -49,5 +49,6 @@ EXTRA_DIST += tests/test.conf \ tests/test-altchains.conf \ tests/test-trustpeer.conf \ tests/test-dhprime.conf \ - tests/test-p521.conf + tests/test-p521.conf \ + tests/test-ecc-cust-curves.conf DISTCLEANFILES+= tests/.libs/unit.test diff --git a/tests/suites.c b/tests/suites.c index 288283333..f2d797af2 100644 --- a/tests/suites.c +++ b/tests/suites.c @@ -882,8 +882,8 @@ int SuiteTest(int argc, char** argv) goto exit; } #endif -#if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && \ - defined(WOLFSSL_SHA512) +#if defined(HAVE_ECC) && defined(WOLFSSL_SHA512) && \ + (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) /* add P-521 certificate cipher suite tests */ strcpy(argv0[1], "tests/test-p521.conf"); printf("starting P-521 extra cipher suite tests\n"); @@ -894,6 +894,18 @@ int SuiteTest(int argc, char** argv) goto exit; } #endif +#if defined(HAVE_ECC) && !defined(NO_SHA256) && defined(WOLFSSL_CUSTOM_CURVES) && \ + defined(HAVE_ECC_KOBLITZ) && defined(HAVE_ECC_BRAINPOOL) + /* TLS non-NIST curves (Koblitz / Brainpool) */ + strcpy(argv0[1], "tests/test-ecc-cust-curves.conf"); + printf("starting TLS test of non-NIST curves (Koblitz / Brainpool)\n"); + test_harness(&args); + if (args.return_code != 0) { + printf("error from script %d\n", args.return_code); + args.return_code = EXIT_FAILURE; + goto exit; + } +#endif #ifdef WOLFSSL_DTLS /* add dtls extra suites */ strcpy(argv0[1], "tests/test-dtls.conf"); diff --git a/tests/test-ecc-cust-curves.conf b/tests/test-ecc-cust-curves.conf new file mode 100644 index 000000000..697d96796 --- /dev/null +++ b/tests/test-ecc-cust-curves.conf @@ -0,0 +1,181 @@ +# ----- secp256k1 ------ +# server TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 +-v 3 +-l ECDHE-ECDSA-AES128-GCM-SHA256 +-c ./certs/ecc/server-secp256k1-cert.pem +-k ./certs/ecc/secp256k1-key.pem +-d + +# client TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 +-v 3 +-l ECDHE-ECDSA-AES128-GCM-SHA256 +-A ./certs/ecc/server-secp256k1-cert.pem +-x +-C + +# server TLSv1.2 ECDH-ECDSA-AES128-GCM-SHA256 (static) +-v 3 +-l ECDH-ECDSA-AES128-GCM-SHA256 +-c ./certs/ecc/server-secp256k1-cert.pem +-k ./certs/ecc/secp256k1-key.pem +-d + +# client TLSv1.2 ECDH-ECDSA-AES128-GCM-SHA256 (static) +-v 3 +-l ECDH-ECDSA-AES128-GCM-SHA256 +-A ./certs/ecc/server-secp256k1-cert.pem +-x +-C + +# server TLSv1.3 TLS13-AES128-GCM-SHA256 +-v 4 +-l TLS13-AES128-GCM-SHA256 +-c ./certs/ecc/server-secp256k1-cert.pem +-k ./certs/ecc/secp256k1-key.pem +-d + +# client TLSv1.3 TLS13-AES128-GCM-SHA256 +-v 4 +-l TLS13-AES128-GCM-SHA256 +-A ./certs/ecc/server-secp256k1-cert.pem +-x +-C + +# server TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 (mutual auth) +-v 3 +-l ECDHE-ECDSA-AES128-GCM-SHA256 +-c ./certs/ecc/server-secp256k1-cert.pem +-k ./certs/ecc/secp256k1-key.pem +-A ./certs/ecc/client-secp256k1-cert.pem +-V + +# client TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 (mutal auth) +-v 3 +-l ECDHE-ECDSA-AES128-GCM-SHA256 +-c ./certs/ecc/client-secp256k1-cert.pem +-k ./certs/ecc/secp256k1-key.pem +-A ./certs/ecc/server-secp256k1-cert.pem +-C + +# server TLSv1.2 ECDH-ECDSA-AES128-GCM-SHA256 (static - mutual auth) +-v 3 +-l ECDH-ECDSA-AES128-GCM-SHA256 +-c ./certs/ecc/server-secp256k1-cert.pem +-k ./certs/ecc/secp256k1-key.pem +-A ./certs/ecc/client-secp256k1-cert.pem +-V + +# client TLSv1.2 ECDH-ECDSA-AES128-GCM-SHA256 (static - mutal auth) +-v 3 +-l ECDH-ECDSA-AES128-GCM-SHA256 +-c ./certs/ecc/client-secp256k1-cert.pem +-k ./certs/ecc/secp256k1-key.pem +-A ./certs/ecc/server-secp256k1-cert.pem +-C + +# server TLSv1.3 TLS13-AES128-GCM-SHA256 (mutal auth) +-v 4 +-l TLS13-AES128-GCM-SHA256 +-c ./certs/ecc/server-secp256k1-cert.pem +-k ./certs/ecc/secp256k1-key.pem +-A ./certs/ecc/client-secp256k1-cert.pem +-V + +# client TLSv1.3 TLS13-AES128-GCM-SHA256 (mutal auth) +-v 4 +-l TLS13-AES128-GCM-SHA256 +-c ./certs/ecc/client-secp256k1-cert.pem +-k ./certs/ecc/secp256k1-key.pem +-A ./certs/ecc/server-secp256k1-cert.pem +-C + +# ----- bp256r1 ------ +# server TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 +-v 3 +-l ECDHE-ECDSA-AES128-GCM-SHA256 +-c ./certs/ecc/server-bp256r1-cert.pem +-k ./certs/ecc/bp256r1-key.pem +-d + +# client TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 +-v 3 +-l ECDHE-ECDSA-AES128-GCM-SHA256 +-A ./certs/ecc/server-bp256r1-cert.pem +-x +-C + +# server TLSv1.2 ECDH-ECDSA-AES128-GCM-SHA256 (static) +-v 3 +-l ECDH-ECDSA-AES128-GCM-SHA256 +-c ./certs/ecc/server-bp256r1-cert.pem +-k ./certs/ecc/bp256r1-key.pem +-d + +# client TLSv1.2 ECDH-ECDSA-AES128-GCM-SHA256 (static) +-v 3 +-l ECDH-ECDSA-AES128-GCM-SHA256 +-A ./certs/ecc/server-bp256r1-cert.pem +-x +-C + +# server TLSv1.3 TLS13-AES128-GCM-SHA256 +-v 4 +-l TLS13-AES128-GCM-SHA256 +-c ./certs/ecc/server-bp256r1-cert.pem +-k ./certs/ecc/bp256r1-key.pem +-d + +# client TLSv1.3 TLS13-AES128-GCM-SHA256 +-v 4 +-l TLS13-AES128-GCM-SHA256 +-A ./certs/ecc/server-bp256r1-cert.pem +-x +-C + +# server TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 (mutual auth) +-v 3 +-l ECDHE-ECDSA-AES128-GCM-SHA256 +-c ./certs/ecc/server-bp256r1-cert.pem +-k ./certs/ecc/bp256r1-key.pem +-A ./certs/ecc/client-bp256r1-cert.pem +-V + +# client TLSv1.2 ECDHE-ECDSA-AES128-GCM-SHA256 (mutal auth) +-v 3 +-l ECDHE-ECDSA-AES128-GCM-SHA256 +-c ./certs/ecc/client-bp256r1-cert.pem +-k ./certs/ecc/bp256r1-key.pem +-A ./certs/ecc/server-bp256r1-cert.pem +-C + +# server TLSv1.2 ECDH-ECDSA-AES128-GCM-SHA256 (static - mutual auth) +-v 3 +-l ECDH-ECDSA-AES128-GCM-SHA256 +-c ./certs/ecc/server-bp256r1-cert.pem +-k ./certs/ecc/bp256r1-key.pem +-A ./certs/ecc/client-bp256r1-cert.pem +-V + +# client TLSv1.2 ECDH-ECDSA-AES128-GCM-SHA256 (static - mutal auth) +-v 3 +-l ECDH-ECDSA-AES128-GCM-SHA256 +-c ./certs/ecc/client-bp256r1-cert.pem +-k ./certs/ecc/bp256r1-key.pem +-A ./certs/ecc/server-bp256r1-cert.pem +-C + +# server TLSv1.3 TLS13-AES128-GCM-SHA256 (mutal auth) +-v 4 +-l TLS13-AES128-GCM-SHA256 +-c ./certs/ecc/server-bp256r1-cert.pem +-k ./certs/ecc/bp256r1-key.pem +-A ./certs/ecc/client-bp256r1-cert.pem +-V + +# client TLSv1.3 TLS13-AES128-GCM-SHA256 (mutal auth) +-v 4 +-l TLS13-AES128-GCM-SHA256 +-c ./certs/ecc/client-bp256r1-cert.pem +-k ./certs/ecc/bp256r1-key.pem +-A ./certs/ecc/server-bp256r1-cert.pem +-C diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index 7cac4b1c2..3f4376415 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -75,6 +75,7 @@ ECC Curve Types: ECC Curve Sizes: * ECC_USER_CURVES: Allows custom combination of key sizes below * HAVE_ALL_CURVES: Enable all key sizes (on unless ECC_USER_CURVES is defined) + * ECC_MIN_KEY_SZ: Minimum supported ECC key size * HAVE_ECC112: 112 bit key * HAVE_ECC128: 128 bit key * HAVE_ECC160: 160 bit key @@ -179,37 +180,37 @@ enum { */ /* 256-bit curve on by default whether user curves or not */ -#if defined(HAVE_ECC112) || defined(HAVE_ALL_CURVES) +#if (defined(HAVE_ECC112) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 112 #define ECC112 #endif -#if defined(HAVE_ECC128) || defined(HAVE_ALL_CURVES) +#if (defined(HAVE_ECC128) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 128 #define ECC128 #endif -#if defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES) +#if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160 #define ECC160 #endif -#if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES) +#if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192 #define ECC192 #endif -#if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES) +#if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224 #define ECC224 #endif -#if defined(HAVE_ECC239) || defined(HAVE_ALL_CURVES) +#if (defined(HAVE_ECC239) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 239 #define ECC239 #endif -#if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES) +#if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256 #define ECC256 #endif -#if defined(HAVE_ECC320) || defined(HAVE_ALL_CURVES) +#if (defined(HAVE_ECC320) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 320 #define ECC320 #endif -#if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES) +#if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384 #define ECC384 #endif -#if defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES) +#if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512 #define ECC512 #endif -#if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES) +#if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521 #define ECC521 #endif diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 566c3adc2..652df9d76 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -21868,43 +21868,43 @@ static int ecc_test(void) return -9900; #endif -#if defined(HAVE_ECC112) || defined(HAVE_ALL_CURVES) +#if (defined(HAVE_ECC112) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 112 ret = ecc_test_curve(&rng, 14); if (ret < 0) { goto done; } #endif /* HAVE_ECC112 */ -#if defined(HAVE_ECC128) || defined(HAVE_ALL_CURVES) +#if (defined(HAVE_ECC128) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 128 ret = ecc_test_curve(&rng, 16); if (ret < 0) { goto done; } #endif /* HAVE_ECC128 */ -#if defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES) +#if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 160 ret = ecc_test_curve(&rng, 20); if (ret < 0) { goto done; } #endif /* HAVE_ECC160 */ -#if defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES) +#if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 192 ret = ecc_test_curve(&rng, 24); if (ret < 0) { goto done; } #endif /* HAVE_ECC192 */ -#if defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES) +#if (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 224 ret = ecc_test_curve(&rng, 28); if (ret < 0) { goto done; } #endif /* HAVE_ECC224 */ -#if defined(HAVE_ECC239) || defined(HAVE_ALL_CURVES) +#if (defined(HAVE_ECC239) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 239 ret = ecc_test_curve(&rng, 30); if (ret < 0) { goto done; } #endif /* HAVE_ECC239 */ -#if !defined(NO_ECC256) || defined(HAVE_ALL_CURVES) +#if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256 ret = ecc_test_curve(&rng, 32); if (ret < 0) { goto done; @@ -21921,25 +21921,25 @@ static int ecc_test(void) goto done; } #endif /* !NO_ECC256 */ -#if defined(HAVE_ECC320) || defined(HAVE_ALL_CURVES) +#if (defined(HAVE_ECC320) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 320 ret = ecc_test_curve(&rng, 40); if (ret < 0) { goto done; } #endif /* HAVE_ECC320 */ -#if defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES) +#if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384 ret = ecc_test_curve(&rng, 48); if (ret < 0) { goto done; } #endif /* HAVE_ECC384 */ -#if defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES) +#if (defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 512 ret = ecc_test_curve(&rng, 64); if (ret < 0) { goto done; } #endif /* HAVE_ECC512 */ -#if defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES) +#if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521 ret = ecc_test_curve(&rng, 66); if (ret < 0) { goto done; diff --git a/wolfssl/test.h b/wolfssl/test.h index f9b56657e..a781a4e08 100644 --- a/wolfssl/test.h +++ b/wolfssl/test.h @@ -302,12 +302,16 @@ #if !defined(NO_FILESYSTEM) && defined(WOLFSSL_MAX_STRENGTH) #define DEFAULT_MIN_RSAKEY_BITS 2048 #else + #ifndef DEFAULT_MIN_RSAKEY_BITS #define DEFAULT_MIN_RSAKEY_BITS 1024 + #endif #endif #if !defined(NO_FILESYSTEM) && defined(WOLFSSL_MAX_STRENGTH) #define DEFAULT_MIN_ECCKEY_BITS 256 #else + #ifndef DEFAULT_MIN_ECCKEY_BITS #define DEFAULT_MIN_ECCKEY_BITS 224 + #endif #endif /* all certs relative to wolfSSL home directory now */ diff --git a/wolfssl/wolfcrypt/ecc.h b/wolfssl/wolfcrypt/ecc.h index 15936abae..08b7148b1 100644 --- a/wolfssl/wolfcrypt/ecc.h +++ b/wolfssl/wolfcrypt/ecc.h @@ -125,7 +125,7 @@ enum { ECC_MAXNAME = 16, /* MAX CURVE NAME LENGTH */ SIG_HEADER_SZ = 7, /* ECC signature header size (30 81 87 02 42 [R] 02 42 [S]) */ ECC_BUFSIZE = 256, /* for exported keys temp buffer */ - ECC_MINSIZE = 20, /* MIN Private Key size */ + ECC_MINSIZE = ECC_MIN_KEY_SZ/8, /* MIN Private Key size */ ECC_MAXSIZE = 66, /* MAX Private Key size */ ECC_MAXSIZE_GEN = 74, /* MAX Buffer size required when generating ECC keys*/ ECC_MAX_OID_LEN = 16, diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index ad6204f2c..6c405794b 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -1750,6 +1750,21 @@ extern void uITRON4_free(void *p) ; #endif #endif +/* The minimum allowed ECC key size */ +/* Note: 224-bits is equivelant to 2048-bit RSA */ +#ifndef ECC_MIN_KEY_SZ + #ifdef WOLFSSL_MIN_ECC_BITS + #define ECC_MIN_KEY_SZ WOLFSSL_MIN_ECC_BITS + #else + #if defined(HAVE_FIPS) && defined(HAVE_FIPS_VERSION) && HAVE_FIPS_VERSION >= 2 + /* FIPSv2 and ready (for now) includes 192-bit support */ + #define ECC_MIN_KEY_SZ 192 + #else + #define ECC_MIN_KEY_SZ 224 + #endif + #endif +#endif + /* ECC Configs */ #ifdef HAVE_ECC /* By default enable Sign, Verify, DHE, Key Import and Key Export unless explicitly disabled */