]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
TLS: Add support for SHA256-based cipher suites from RFC 5246
authorJouni Malinen <j@w1.fi>
Sun, 27 Nov 2011 20:33:54 +0000 (22:33 +0200)
committerJouni Malinen <j@w1.fi>
Sun, 27 Nov 2011 20:33:54 +0000 (22:33 +0200)
Signed-hostap: Jouni Malinen <j@w1.fi>

src/tls/tlsv1_client.c
src/tls/tlsv1_common.c
src/tls/tlsv1_common.h
src/tls/tlsv1_record.c

index 3b6ff3e2f7a04008df5d7bef9133eddf1c7669ac..d0da5883591efc2b4f239010f131dbffe8aaadb8 100644 (file)
@@ -466,8 +466,10 @@ struct tlsv1_client * tlsv1_client_init(void)
        count = 0;
        suites = conn->cipher_suites;
 #ifndef CONFIG_CRYPTO_INTERNAL
+       suites[count++] = TLS_RSA_WITH_AES_256_CBC_SHA256;
        suites[count++] = TLS_RSA_WITH_AES_256_CBC_SHA;
 #endif /* CONFIG_CRYPTO_INTERNAL */
+       suites[count++] = TLS_RSA_WITH_AES_128_CBC_SHA256;
        suites[count++] = TLS_RSA_WITH_AES_128_CBC_SHA;
        suites[count++] = TLS_RSA_WITH_3DES_EDE_CBC_SHA;
        suites[count++] = TLS_RSA_WITH_RC4_128_SHA;
@@ -571,15 +573,24 @@ int tlsv1_client_get_cipher(struct tlsv1_client *conn, char *buf,
        case TLS_RSA_WITH_3DES_EDE_CBC_SHA:
                cipher = "DES-CBC3-SHA";
                break;
+       case TLS_DH_anon_WITH_AES_128_CBC_SHA256:
+               cipher = "ADH-AES-128-SHA256";
+               break;
        case TLS_DH_anon_WITH_AES_128_CBC_SHA:
                cipher = "ADH-AES-128-SHA";
                break;
        case TLS_RSA_WITH_AES_256_CBC_SHA:
                cipher = "AES-256-SHA";
                break;
+       case TLS_RSA_WITH_AES_256_CBC_SHA256:
+               cipher = "AES-256-SHA256";
+               break;
        case TLS_RSA_WITH_AES_128_CBC_SHA:
                cipher = "AES-128-SHA";
                break;
+       case TLS_RSA_WITH_AES_128_CBC_SHA256:
+               cipher = "AES-128-SHA256";
+               break;
        default:
                return -1;
        }
@@ -731,8 +742,10 @@ int tlsv1_client_set_cipher_list(struct tlsv1_client *conn, u8 *ciphers)
                count = 0;
                suites = conn->cipher_suites;
 #ifndef CONFIG_CRYPTO_INTERNAL
+               suites[count++] = TLS_DH_anon_WITH_AES_256_CBC_SHA256;
                suites[count++] = TLS_DH_anon_WITH_AES_256_CBC_SHA;
 #endif /* CONFIG_CRYPTO_INTERNAL */
+               suites[count++] = TLS_DH_anon_WITH_AES_128_CBC_SHA256;
                suites[count++] = TLS_DH_anon_WITH_AES_128_CBC_SHA;
                suites[count++] = TLS_DH_anon_WITH_3DES_EDE_CBC_SHA;
                suites[count++] = TLS_DH_anon_WITH_RC4_128_MD5;
index 17fc8a18b996d9c0f181e5526c0f03746ec9fdc5..871359af7ae61ff3959e1fcbd33f0f2532903e60 100644 (file)
@@ -52,7 +52,15 @@ static const struct tls_cipher_suite tls_cipher_suites[] = {
        { TLS_RSA_WITH_AES_256_CBC_SHA, TLS_KEY_X_RSA, TLS_CIPHER_AES_256_CBC,
          TLS_HASH_SHA },
        { TLS_DH_anon_WITH_AES_256_CBC_SHA, TLS_KEY_X_DH_anon,
-         TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA }
+         TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA },
+       { TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_KEY_X_RSA,
+         TLS_CIPHER_AES_128_CBC, TLS_HASH_SHA256 },
+       { TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_KEY_X_RSA,
+         TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA256 },
+       { TLS_DH_anon_WITH_AES_128_CBC_SHA256, TLS_KEY_X_DH_anon,
+         TLS_CIPHER_AES_128_CBC, TLS_HASH_SHA256 },
+       { TLS_DH_anon_WITH_AES_256_CBC_SHA256, TLS_KEY_X_DH_anon,
+         TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA256 }
 };
 
 #define NUM_ELEMS(a) (sizeof(a) / sizeof((a)[0]))
index 168f6b4e59036f0e034f9ea78c807a51193b0ca9..027daa47fc052b1a9fd873943cf7dd2a7acf70f5 100644 (file)
@@ -93,6 +93,19 @@ enum {
 #define TLS_DHE_DSS_WITH_AES_256_CBC_SHA       0x0038 /* RFC 3268 */
 #define TLS_DHE_RSA_WITH_AES_256_CBC_SHA       0x0039 /* RFC 3268 */
 #define TLS_DH_anon_WITH_AES_256_CBC_SHA       0x003A /* RFC 3268 */
+#define TLS_RSA_WITH_NULL_SHA256               0x003B /* RFC 5246 */
+#define TLS_RSA_WITH_AES_128_CBC_SHA256                0x003C /* RFC 5246 */
+#define TLS_RSA_WITH_AES_256_CBC_SHA256                0x003D /* RFC 5246 */
+#define TLS_DH_DSS_WITH_AES_128_CBC_SHA256     0x003E /* RFC 5246 */
+#define TLS_DH_RSA_WITH_AES_128_CBC_SHA256     0x003F /* RFC 5246 */
+#define TLS_DHE_DSS_WITH_AES_128_CBC_SHA256    0x0040 /* RFC 5246 */
+#define TLS_DHE_RSA_WITH_AES_128_CBC_SHA256    0x0067 /* RFC 5246 */
+#define TLS_DH_DSS_WITH_AES_256_CBC_SHA256     0x0068 /* RFC 5246 */
+#define TLS_DH_RSA_WITH_AES_256_CBC_SHA256     0x0069 /* RFC 5246 */
+#define TLS_DHE_DSS_WITH_AES_256_CBC_SHA256    0x006A /* RFC 5246 */
+#define TLS_DHE_RSA_WITH_AES_256_CBC_SHA256    0x006B /* RFC 5246 */
+#define TLS_DH_anon_WITH_AES_128_CBC_SHA256    0x006C /* RFC 5246 */
+#define TLS_DH_anon_WITH_AES_256_CBC_SHA256    0x006D /* RFC 5246 */
 
 /* CompressionMethod */
 #define TLS_COMPRESSION_NULL 0
@@ -199,7 +212,8 @@ typedef enum {
 typedef enum {
        TLS_HASH_NULL,
        TLS_HASH_MD5,
-       TLS_HASH_SHA
+       TLS_HASH_SHA,
+       TLS_HASH_SHA256
 } tls_hash;
 
 struct tls_cipher_suite {
index 08beca2571d311fd6dead75bc6e6729675c26538..031455148e1ffb500aa782e06d8cf1ca224a965c 100644 (file)
@@ -17,6 +17,7 @@
 #include "common.h"
 #include "crypto/md5.h"
 #include "crypto/sha1.h"
+#include "crypto/sha256.h"
 #include "tlsv1_common.h"
 #include "tlsv1_record.h"
 
@@ -52,6 +53,9 @@ int tlsv1_record_set_cipher_suite(struct tlsv1_record_layer *rl,
        } else if (suite->hash == TLS_HASH_SHA) {
                rl->hash_alg = CRYPTO_HASH_ALG_HMAC_SHA1;
                rl->hash_size = SHA1_MAC_LEN;
+       } else if (suite->hash == TLS_HASH_SHA256) {
+               rl->hash_alg = CRYPTO_HASH_ALG_HMAC_SHA256;
+               rl->hash_size = SHA256_MAC_LEN;
        }
 
        data = tls_get_cipher_data(suite->cipher);