From 6616975f81eb545d0ba673d19e5798fb5c030b5b Mon Sep 17 00:00:00 2001 From: John Safranek Date: Mon, 21 Jan 2013 15:19:45 -0800 Subject: [PATCH] added AES-CCM-8 ECC cipher suites, and more test cases --- cyassl/internal.h | 10 ++++++-- src/internal.c | 36 ++++++++++++++++++++++++++++ src/keys.c | 32 +++++++++++++++++++++++++ src/ssl.c | 4 ++++ tests/suites.c | 12 +++++++++- tests/test-aesccm-ecc.conf | 48 ++++++++++++++++++++++++++++++++++++++ tests/test-aesccm.conf | 20 ++++++++++++++++ 7 files changed, 159 insertions(+), 3 deletions(-) create mode 100644 tests/test-aesccm-ecc.conf diff --git a/cyassl/internal.h b/cyassl/internal.h index ac3a9c9bc..a7d7bdad4 100644 --- a/cyassl/internal.h +++ b/cyassl/internal.h @@ -255,6 +255,10 @@ void c32to24(word32 in, word24 out); #define BUILD_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 #define BUILD_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 #endif + #if defined (HAVE_AESCCM) + #define BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8_SHA256 + #define BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8_SHA384 + #endif #endif #if !defined(NO_RC4) #define BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA @@ -387,8 +391,10 @@ enum { * also, in some of the other AES-CCM suites * there will be second byte number conflicts * with non-ECC AES-GCM */ - TLS_RSA_WITH_AES_128_CCM_8_SHA256 = 0xa0, - TLS_RSA_WITH_AES_256_CCM_8_SHA384 = 0xa1, + TLS_RSA_WITH_AES_128_CCM_8_SHA256 = 0xa0, + TLS_RSA_WITH_AES_256_CCM_8_SHA384 = 0xa1, + TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8_SHA256 = 0xac, /* Still TBD, made up */ + TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8_SHA384 = 0xad, /* Still TBD, made up */ TLS_RSA_WITH_CAMELLIA_128_CBC_SHA = 0x41, TLS_RSA_WITH_CAMELLIA_256_CBC_SHA = 0x84, diff --git a/src/internal.c b/src/internal.c index 6f2a9b047..f4c34a648 100644 --- a/src/internal.c +++ b/src/internal.c @@ -775,6 +775,20 @@ void InitSuites(Suites* suites, ProtocolVersion pv, byte haveRSA, byte havePSK, } #endif +#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8_SHA256 + if (tls1_2 && haveECDSAsig && haveDH) { + suites->suites[idx++] = ECC_BYTE; + suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8_SHA256; + } +#endif + +#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8_SHA384 + if (tls1_2 && haveECDSAsig && haveDH) { + suites->suites[idx++] = ECC_BYTE; + suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8_SHA384; + } +#endif + #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8_SHA256 if (tls1_2 && haveRSA) { suites->suites[idx++] = ECC_BYTE; @@ -5267,6 +5281,14 @@ const char* const cipher_names[] = "AES256-CCM-8-SHA384", #endif +#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8_SHA256 + "ECDHE-ECDSA-AES128-CCM-8-SHA256", +#endif + +#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8_SHA384 + "ECDHE-ECDSA-AES256-CCM-8-SHA384", +#endif + #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA "ECDHE-RSA-AES128-SHA", #endif @@ -5527,6 +5549,14 @@ int cipher_name_idx[] = TLS_RSA_WITH_AES_256_CCM_8_SHA384, #endif +#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8_SHA256 + TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8_SHA256, +#endif + +#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8_SHA384 + TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8_SHA384, +#endif + #ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, #endif @@ -7556,6 +7586,12 @@ int SetCipherList(Suites* s, const char* list) return 1; break; + case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8_SHA256 : + case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8_SHA384 : + if (requirement == REQUIRES_ECC_DSA) + return 1; + break; + default: CYASSL_MSG("Unsupported cipher suite, CipherRequires ECC"); return 0; diff --git a/src/keys.c b/src/keys.c index 7d0d2d680..fab88ed39 100644 --- a/src/keys.c +++ b/src/keys.c @@ -451,6 +451,38 @@ int SetCipherSpecs(CYASSL* ssl) break; #endif + +#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8_SHA256 + case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8_SHA256 : + ssl->specs.bulk_cipher_algorithm = aes_ccm; + ssl->specs.cipher_type = aead; + ssl->specs.mac_algorithm = sha256_mac; + ssl->specs.kea = ecc_diffie_hellman_kea; + ssl->specs.sig_algo = ecc_dsa_sa_algo; + ssl->specs.hash_size = SHA256_DIGEST_SIZE; + ssl->specs.pad_size = PAD_SHA; + ssl->specs.static_ecdh = 1; + ssl->specs.key_size = AES_128_KEY_SIZE; + ssl->specs.block_size = AES_BLOCK_SIZE; + ssl->specs.iv_size = AEAD_IMP_IV_SZ; + break; +#endif + +#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8_SHA384 + case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8_SHA384 : + ssl->specs.bulk_cipher_algorithm = aes_ccm; + ssl->specs.cipher_type = aead; + ssl->specs.mac_algorithm = sha384_mac; + ssl->specs.kea = ecc_diffie_hellman_kea; + ssl->specs.sig_algo = ecc_dsa_sa_algo; + ssl->specs.hash_size = SHA384_DIGEST_SIZE; + ssl->specs.pad_size = PAD_SHA; + ssl->specs.static_ecdh = 1; + ssl->specs.key_size = AES_256_KEY_SIZE; + ssl->specs.block_size = AES_BLOCK_SIZE; + ssl->specs.iv_size = AEAD_IMP_IV_SZ; + break; +#endif #endif /* HAVE_ECC */ #ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8_SHA256 diff --git a/src/ssl.c b/src/ssl.c index 62d267928..97ef9682f 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -5434,6 +5434,10 @@ int CyaSSL_set_compression(CYASSL* ssl) return "TLS_RSA_WITH_AES_128_CCM_8_SHA256"; case TLS_RSA_WITH_AES_256_CCM_8_SHA384 : return "TLS_RSA_WITH_AES_256_CCM_8_SHA384"; + case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8_SHA256 : + return "TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8_SHA256"; + case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8_SHA384 : + return "TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8_SHA384"; default: return "NONE"; diff --git a/tests/suites.c b/tests/suites.c index 87ac369e8..aa2160304 100644 --- a/tests/suites.c +++ b/tests/suites.c @@ -373,12 +373,22 @@ int SuiteTest(void) #if defined(HAVE_AESCCM) /* add aesccm extra suites */ strcpy(argv0[1], "tests/test-aesccm.conf"); - printf("starting aesccm extra cipher suite tests\n"); + printf("starting aesccm cipher suite tests\n"); test_harness(&args); if (args.return_code != 0) { printf("error from script %d\n", args.return_code); exit(EXIT_FAILURE); } + #ifdef HAVE_ECC + /* add aesccm ecc extra suites */ + strcpy(argv0[1], "tests/test-aesccm-ecc.conf"); + printf("starting aesccm ecc cipher suite tests\n"); + test_harness(&args); + if (args.return_code != 0) { + printf("error from script %d\n", args.return_code); + exit(EXIT_FAILURE); + } + #endif #endif #ifdef HAVE_CAMELLIA diff --git a/tests/test-aesccm-ecc.conf b/tests/test-aesccm-ecc.conf new file mode 100644 index 000000000..8cfcb9846 --- /dev/null +++ b/tests/test-aesccm-ecc.conf @@ -0,0 +1,48 @@ +# server TLSv1.2 ECDHE-ECDSA-AES128-CCM-8-SHA256 +-v 3 +-l ECDHE-ECDSA-AES128-CCM-8-SHA256 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client TLSv1.2 ECDHE-ECDSA-AES128-CCM-8-SHA256 +-v 3 +-l ECDHE-ECDSA-AES128-CCM-8-SHA256 +-A ./certs/server-ecc.pem + +# server TLSv1.2 ECDHE-ECDSA-AES256-CCM-8-SHA384 +-v 3 +-l ECDHE-ECDSA-AES256-CCM-8-SHA384 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem + +# client TLSv1.2 ECDHE-ECDSA-AES256-CCM-8-SHA384 +-v 3 +-l ECDHE-ECDSA-AES256-CCM-8-SHA384 +-A ./certs/server-ecc.pem + +# server TLSv1.2 ECDHE-ECDSA-AES128-CCM-8-SHA256 NON-BLOCKING +-v 3 +-l ECDHE-ECDSA-AES128-CCM-8-SHA256 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem +-N + +# client TLSv1.2 ECDHE-ECDSA-AES128-CCM-8-SHA256 NON-BLOCKING +-v 3 +-l ECDHE-ECDSA-AES128-CCM-8-SHA256 +-A ./certs/server-ecc.pem +-N + +# server TLSv1.2 ECDHE-ECDSA-AES256-CCM-8-SHA384 NON-BLOCKING +-v 3 +-l ECDHE-ECDSA-AES256-CCM-8-SHA384 +-c ./certs/server-ecc.pem +-k ./certs/ecc-key.pem +-N + +# client TLSv1.2 ECDHE-ECDSA-AES256-CCM-8-SHA384 NON-BLOCKING +-v 3 +-l ECDHE-ECDSA-AES256-CCM-8-SHA384 +-A ./certs/server-ecc.pem +-N + diff --git a/tests/test-aesccm.conf b/tests/test-aesccm.conf index eba2a9ea7..a86643120 100644 --- a/tests/test-aesccm.conf +++ b/tests/test-aesccm.conf @@ -14,3 +14,23 @@ -v 3 -l AES256-CCM-8-SHA384 +# server TLSv1.2 AES128-CCM-8-SHA256 NON-BLOCKING +-v 3 +-l AES128-CCM-8-SHA256 +-N + +# client TLSv1.2 AES128-CCM-8-SHA256 NON-BLOCKING +-v 3 +-l AES128-CCM-8-SHA256 +-N + +# server TLSv1.2 AES256-CCM-8-SHA384 NON-BLOCKING +-v 3 +-l AES256-CCM-8-SHA384 +-N + +# client TLSv1.2 AES256-CCM-8-SHA384 NON-BLOCKING +-v 3 +-l AES256-CCM-8-SHA384 +-N +