- Added support for the SHA256 ciphersuites of AES and Camellia

diff --git a/library/ssl_cli.c b/library/ssl_cli.c
index 977684e..6f9206f 100644
--- a/library/ssl_cli.c
+++ b/library/ssl_cli.c
@@ -448,8 +448,12 @@
         ssl->session->ciphersuite != SSL_EDH_RSA_DES_168_SHA &&
         ssl->session->ciphersuite != SSL_EDH_RSA_AES_128_SHA &&
         ssl->session->ciphersuite != SSL_EDH_RSA_AES_256_SHA &&
+        ssl->session->ciphersuite != SSL_EDH_RSA_AES_128_SHA256 &&
+        ssl->session->ciphersuite != SSL_EDH_RSA_AES_256_SHA256 &&
         ssl->session->ciphersuite != SSL_EDH_RSA_CAMELLIA_128_SHA &&
-        ssl->session->ciphersuite != SSL_EDH_RSA_CAMELLIA_256_SHA)
+        ssl->session->ciphersuite != SSL_EDH_RSA_CAMELLIA_256_SHA &&
+        ssl->session->ciphersuite != SSL_EDH_RSA_CAMELLIA_128_SHA256 &&
+        ssl->session->ciphersuite != SSL_EDH_RSA_CAMELLIA_256_SHA256 )
     {
         SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
         ssl->state++;
@@ -777,8 +781,12 @@
         ssl->session->ciphersuite == SSL_EDH_RSA_DES_168_SHA ||
         ssl->session->ciphersuite == SSL_EDH_RSA_AES_128_SHA ||
         ssl->session->ciphersuite == SSL_EDH_RSA_AES_256_SHA ||
+        ssl->session->ciphersuite == SSL_EDH_RSA_AES_128_SHA256 ||
+        ssl->session->ciphersuite == SSL_EDH_RSA_AES_256_SHA256 ||
         ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_128_SHA ||
-        ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_256_SHA)
+        ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_256_SHA ||
+        ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_128_SHA256 ||
+        ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_256_SHA256 )
     {
 #if !defined(POLARSSL_DHM_C)
         SSL_DEBUG_MSG( 1, ( "support for dhm in not available" ) );
diff --git a/library/ssl_srv.c b/library/ssl_srv.c
index 67fe130..2d8b0b8 100644
--- a/library/ssl_srv.c
+++ b/library/ssl_srv.c
@@ -552,8 +552,12 @@
         ssl->session->ciphersuite != SSL_EDH_RSA_DES_168_SHA &&
         ssl->session->ciphersuite != SSL_EDH_RSA_AES_128_SHA &&
         ssl->session->ciphersuite != SSL_EDH_RSA_AES_256_SHA &&
+        ssl->session->ciphersuite != SSL_EDH_RSA_AES_128_SHA256 &&
+        ssl->session->ciphersuite != SSL_EDH_RSA_AES_256_SHA256 &&
         ssl->session->ciphersuite != SSL_EDH_RSA_CAMELLIA_128_SHA &&
-        ssl->session->ciphersuite != SSL_EDH_RSA_CAMELLIA_256_SHA)
+        ssl->session->ciphersuite != SSL_EDH_RSA_CAMELLIA_256_SHA &&
+        ssl->session->ciphersuite != SSL_EDH_RSA_CAMELLIA_128_SHA256 &&
+        ssl->session->ciphersuite != SSL_EDH_RSA_CAMELLIA_256_SHA256 )
     {
         SSL_DEBUG_MSG( 2, ( "<= skip write server key exchange" ) );
         ssl->state++;
@@ -761,8 +765,12 @@
         ssl->session->ciphersuite == SSL_EDH_RSA_DES_168_SHA ||
         ssl->session->ciphersuite == SSL_EDH_RSA_AES_128_SHA ||
         ssl->session->ciphersuite == SSL_EDH_RSA_AES_256_SHA ||
+        ssl->session->ciphersuite == SSL_EDH_RSA_AES_128_SHA256 ||
+        ssl->session->ciphersuite == SSL_EDH_RSA_AES_256_SHA256 ||
         ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_128_SHA ||
-        ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_256_SHA)
+        ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_256_SHA ||
+        ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_128_SHA256 ||
+        ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_256_SHA256 )
     {
 #if !defined(POLARSSL_DHM_C)
         SSL_DEBUG_MSG( 1, ( "support for dhm is not available" ) );
diff --git a/library/ssl_tls.c b/library/ssl_tls.c
index b5c89a9..e697f4e 100644
--- a/library/ssl_tls.c
+++ b/library/ssl_tls.c
@@ -323,6 +323,20 @@
             ssl->keylen = 32; ssl->minlen = 32;
             ssl->ivlen  = 16; ssl->maclen = 20;
             break;
+
+#if defined(POLARSSL_SHA2_C)
+        case SSL_RSA_AES_128_SHA256:
+        case SSL_EDH_RSA_AES_128_SHA256:
+            ssl->keylen = 16; ssl->minlen = 32;
+            ssl->ivlen  = 16; ssl->maclen = 32;
+            break;
+
+        case SSL_RSA_AES_256_SHA256:
+        case SSL_EDH_RSA_AES_256_SHA256:
+            ssl->keylen = 32; ssl->minlen = 32;
+            ssl->ivlen  = 16; ssl->maclen = 32;
+            break;
+#endif
 #endif
 
 #if defined(POLARSSL_CAMELLIA_C)
@@ -337,6 +351,20 @@
             ssl->keylen = 32; ssl->minlen = 32;
             ssl->ivlen  = 16; ssl->maclen = 20;
             break;
+
+#if defined(POLARSSL_SHA2_C)
+        case SSL_RSA_CAMELLIA_128_SHA256:
+        case SSL_EDH_RSA_CAMELLIA_128_SHA256:
+            ssl->keylen = 16; ssl->minlen = 32;
+            ssl->ivlen  = 16; ssl->maclen = 32;
+            break;
+
+        case SSL_RSA_CAMELLIA_256_SHA256:
+        case SSL_EDH_RSA_CAMELLIA_256_SHA256:
+            ssl->keylen = 32; ssl->minlen = 32;
+            ssl->ivlen  = 16; ssl->maclen = 32;
+            break;
+#endif
 #endif
 
 #if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES)
@@ -430,12 +458,20 @@
 #if defined(POLARSSL_AES_C)
         case SSL_RSA_AES_128_SHA:
         case SSL_EDH_RSA_AES_128_SHA:
+#if defined(POLARSSL_SHA2_C)
+        case SSL_RSA_AES_128_SHA256:
+        case SSL_EDH_RSA_AES_128_SHA256:
+#endif
             aes_setkey_enc( (aes_context *) ssl->ctx_enc, key1, 128 );
             aes_setkey_dec( (aes_context *) ssl->ctx_dec, key2, 128 );
             break;
 
         case SSL_RSA_AES_256_SHA:
         case SSL_EDH_RSA_AES_256_SHA:
+#if defined(POLARSSL_SHA2_C)
+        case SSL_RSA_AES_256_SHA256:
+        case SSL_EDH_RSA_AES_256_SHA256:
+#endif
             aes_setkey_enc( (aes_context *) ssl->ctx_enc, key1, 256 );
             aes_setkey_dec( (aes_context *) ssl->ctx_dec, key2, 256 );
             break;
@@ -444,12 +480,20 @@
 #if defined(POLARSSL_CAMELLIA_C)
         case SSL_RSA_CAMELLIA_128_SHA:
         case SSL_EDH_RSA_CAMELLIA_128_SHA:
+#if defined(POLARSSL_SHA2_C)
+        case SSL_RSA_CAMELLIA_128_SHA256:
+        case SSL_EDH_RSA_CAMELLIA_128_SHA256:
+#endif
             camellia_setkey_enc( (camellia_context *) ssl->ctx_enc, key1, 128 );
             camellia_setkey_dec( (camellia_context *) ssl->ctx_dec, key2, 128 );
             break;
 
         case SSL_RSA_CAMELLIA_256_SHA:
         case SSL_EDH_RSA_CAMELLIA_256_SHA:
+#if defined(POLARSSL_SHA2_C)
+        case SSL_RSA_CAMELLIA_256_SHA256:
+        case SSL_EDH_RSA_CAMELLIA_256_SHA256:
+#endif
             camellia_setkey_enc( (camellia_context *) ssl->ctx_enc, key1, 256 );
             camellia_setkey_dec( (camellia_context *) ssl->ctx_dec, key2, 256 );
             break;
@@ -755,7 +799,11 @@
         if ( ssl->session->ciphersuite == SSL_RSA_AES_128_SHA ||
              ssl->session->ciphersuite == SSL_EDH_RSA_AES_128_SHA ||
              ssl->session->ciphersuite == SSL_RSA_AES_256_SHA ||
-             ssl->session->ciphersuite == SSL_EDH_RSA_AES_256_SHA)
+             ssl->session->ciphersuite == SSL_EDH_RSA_AES_256_SHA ||
+             ssl->session->ciphersuite == SSL_RSA_AES_128_SHA256 ||
+             ssl->session->ciphersuite == SSL_EDH_RSA_AES_128_SHA256 ||
+             ssl->session->ciphersuite == SSL_RSA_AES_256_SHA256 ||
+             ssl->session->ciphersuite == SSL_EDH_RSA_AES_256_SHA256 )
         {
                     aes_crypt_cbc( (aes_context *) ssl->ctx_enc,
                         AES_ENCRYPT, enc_msglen,
@@ -768,7 +816,11 @@
         if ( ssl->session->ciphersuite == SSL_RSA_CAMELLIA_128_SHA ||
              ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_128_SHA ||
              ssl->session->ciphersuite == SSL_RSA_CAMELLIA_256_SHA ||
-             ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_256_SHA)
+             ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_256_SHA ||
+             ssl->session->ciphersuite == SSL_RSA_CAMELLIA_128_SHA256 ||
+             ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_128_SHA256 ||
+             ssl->session->ciphersuite == SSL_RSA_CAMELLIA_256_SHA256 ||
+             ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_256_SHA256 )
         {
                     camellia_crypt_cbc( (camellia_context *) ssl->ctx_enc,
                         CAMELLIA_ENCRYPT, enc_msglen,
@@ -885,7 +937,11 @@
         if ( ssl->session->ciphersuite == SSL_RSA_AES_128_SHA ||
              ssl->session->ciphersuite == SSL_EDH_RSA_AES_128_SHA ||
              ssl->session->ciphersuite == SSL_RSA_AES_256_SHA ||
-             ssl->session->ciphersuite == SSL_EDH_RSA_AES_256_SHA)
+             ssl->session->ciphersuite == SSL_EDH_RSA_AES_256_SHA ||
+             ssl->session->ciphersuite == SSL_RSA_AES_128_SHA256 ||
+             ssl->session->ciphersuite == SSL_EDH_RSA_AES_128_SHA256 ||
+             ssl->session->ciphersuite == SSL_RSA_AES_256_SHA256 ||
+             ssl->session->ciphersuite == SSL_EDH_RSA_AES_256_SHA256 )
         {
                     aes_crypt_cbc( (aes_context *) ssl->ctx_dec,
                        AES_DECRYPT, dec_msglen,
@@ -898,7 +954,11 @@
         if ( ssl->session->ciphersuite == SSL_RSA_CAMELLIA_128_SHA ||
              ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_128_SHA ||
              ssl->session->ciphersuite == SSL_RSA_CAMELLIA_256_SHA ||
-             ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_256_SHA)
+             ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_256_SHA ||
+             ssl->session->ciphersuite == SSL_RSA_CAMELLIA_128_SHA256 ||
+             ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_128_SHA256 ||
+             ssl->session->ciphersuite == SSL_RSA_CAMELLIA_256_SHA256 ||
+             ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_256_SHA256 )
         {
                     camellia_crypt_cbc( (camellia_context *) ssl->ctx_dec,
                        CAMELLIA_DECRYPT, dec_msglen,
@@ -2212,6 +2272,20 @@
 
         case SSL_EDH_RSA_AES_256_SHA:
             return( "SSL-EDH-RSA-AES-256-SHA" );
+
+#if defined(POLARSSL_SHA2_C)
+        case SSL_RSA_AES_128_SHA256:
+            return( "SSL-RSA-AES-128-SHA256" );
+
+        case SSL_EDH_RSA_AES_128_SHA256:
+            return( "SSL-EDH-RSA-AES-128-SHA256" );
+
+        case SSL_RSA_AES_256_SHA256:
+            return( "SSL-RSA-AES-256-SHA256" );
+
+        case SSL_EDH_RSA_AES_256_SHA256:
+            return( "SSL-EDH-RSA-AES-256-SHA256" );
+#endif
 #endif
 
 #if defined(POLARSSL_CAMELLIA_C)
@@ -2226,6 +2300,20 @@
 
         case SSL_EDH_RSA_CAMELLIA_256_SHA:
             return( "SSL-EDH-RSA-CAMELLIA-256-SHA" );
+
+#if defined(POLARSSL_SHA2_C)
+        case SSL_RSA_CAMELLIA_128_SHA256:
+            return( "SSL-RSA-CAMELLIA-128-SHA256" );
+
+        case SSL_EDH_RSA_CAMELLIA_128_SHA256:
+            return( "SSL-EDH-RSA-CAMELLIA-128-SHA256" );
+
+        case SSL_RSA_CAMELLIA_256_SHA256:
+            return( "SSL-RSA-CAMELLIA-256-SHA256" );
+
+        case SSL_EDH_RSA_CAMELLIA_256_SHA256:
+            return( "SSL-EDH-RSA-CAMELLIA-256-SHA256" );
+#endif
 #endif
 
 #if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES)
@@ -2278,6 +2366,17 @@
         return( SSL_RSA_AES_256_SHA );
     if (0 == strcasecmp(ciphersuite_name, "SSL-EDH-RSA-AES-256-SHA"))
         return( SSL_EDH_RSA_AES_256_SHA );
+
+#if defined(POLARSSL_SHA2_C)
+    if (0 == strcasecmp(ciphersuite_name, "SSL-RSA-AES-128-SHA256"))
+        return( SSL_RSA_AES_128_SHA256 );
+    if (0 == strcasecmp(ciphersuite_name, "SSL-EDH-RSA-AES-128-SHA256"))
+        return( SSL_EDH_RSA_AES_128_SHA256 );
+    if (0 == strcasecmp(ciphersuite_name, "SSL-RSA-AES-256-SHA256"))
+        return( SSL_RSA_AES_256_SHA256 );
+    if (0 == strcasecmp(ciphersuite_name, "SSL-EDH-RSA-AES-256-SHA256"))
+        return( SSL_EDH_RSA_AES_256_SHA256 );
+#endif
 #endif
 
 #if defined(POLARSSL_CAMELLIA_C)
@@ -2289,6 +2388,17 @@
         return( SSL_RSA_CAMELLIA_256_SHA );
     if (0 == strcasecmp(ciphersuite_name, "SSL-EDH-RSA-CAMELLIA-256-SHA"))
         return( SSL_EDH_RSA_CAMELLIA_256_SHA );
+
+#if defined(POLARSSL_SHA2_C)
+    if (0 == strcasecmp(ciphersuite_name, "SSL-RSA-CAMELLIA-128-SHA256"))
+        return( SSL_RSA_CAMELLIA_128_SHA256 );
+    if (0 == strcasecmp(ciphersuite_name, "SSL-EDH-RSA-CAMELLIA-128-SHA256"))
+        return( SSL_EDH_RSA_CAMELLIA_128_SHA256 );
+    if (0 == strcasecmp(ciphersuite_name, "SSL-RSA-CAMELLIA-256-SHA256"))
+        return( SSL_RSA_CAMELLIA_256_SHA256 );
+    if (0 == strcasecmp(ciphersuite_name, "SSL-EDH-RSA-CAMELLIA-256-SHA256"))
+        return( SSL_EDH_RSA_CAMELLIA_256_SHA256 );
+#endif
 #endif
 
 #if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES)
@@ -2343,12 +2453,20 @@
 {
 #if defined(POLARSSL_DHM_C)
 #if defined(POLARSSL_AES_C)
-    SSL_EDH_RSA_AES_128_SHA,
+#if defined(POLARSSL_SHA2_C)
+    SSL_EDH_RSA_AES_256_SHA256,
+    SSL_EDH_RSA_AES_128_SHA256,
+#endif /* POLARSSL_SHA2_C */
     SSL_EDH_RSA_AES_256_SHA,
+    SSL_EDH_RSA_AES_128_SHA,
 #endif
 #if defined(POLARSSL_CAMELLIA_C)
-    SSL_EDH_RSA_CAMELLIA_128_SHA,
+#if defined(POLARSSL_SHA2_C)
+    SSL_EDH_RSA_CAMELLIA_256_SHA256,
+    SSL_EDH_RSA_CAMELLIA_128_SHA256,
+#endif /* POLARSSL_SHA2_C */
     SSL_EDH_RSA_CAMELLIA_256_SHA,
+    SSL_EDH_RSA_CAMELLIA_128_SHA,
 #endif
 #if defined(POLARSSL_DES_C)
     SSL_EDH_RSA_DES_168_SHA,
@@ -2356,15 +2474,27 @@
 #endif
 
 #if defined(POLARSSL_AES_C)
+#if defined(POLARSSL_SHA2_C)
+    SSL_RSA_AES_256_SHA256,
+#endif /* POLARSSL_SHA2_C */
     SSL_RSA_AES_256_SHA,
 #endif
 #if defined(POLARSSL_CAMELLIA_C)
+#if defined(POLARSSL_SHA2_C)
+    SSL_RSA_CAMELLIA_256_SHA256,
+#endif /* POLARSSL_SHA2_C */
     SSL_RSA_CAMELLIA_256_SHA,
 #endif
 #if defined(POLARSSL_AES_C)
+#if defined(POLARSSL_SHA2_C)
+    SSL_RSA_AES_128_SHA256,
+#endif /* POLARSSL_SHA2_C */
     SSL_RSA_AES_128_SHA,
 #endif
 #if defined(POLARSSL_CAMELLIA_C)
+#if defined(POLARSSL_SHA2_C)
+    SSL_RSA_CAMELLIA_128_SHA256,
+#endif /* POLARSSL_SHA2_C */
     SSL_RSA_CAMELLIA_128_SHA,
 #endif
 #if defined(POLARSSL_DES_C)