[PR3597] Advance to the next state variant when reusing messages.
[openssl.git] / ssl / s3_lib.c
index a4fa1ea4de25de1c75028e53c2405afa7181d8c1..d670ff0ec00ca71824742033abc89cccc7523ff1 100644 (file)
@@ -3033,6 +3033,127 @@ OPENSSL_GLOBAL const SSL_CIPHER ssl3_ciphers[]={
        256,
        },
 
+#ifndef OPENSSL_NO_CAMELLIA
+       { /* Cipher C072 */
+       1,
+       TLS1_TXT_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256,
+       TLS1_CK_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256,
+       SSL_kECDHE,
+       SSL_aECDSA,
+       SSL_CAMELLIA128,
+       SSL_SHA256,
+       SSL_TLSV1_2,
+       SSL_NOT_EXP|SSL_HIGH,
+       SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256,
+       128,
+       128
+       },
+
+       { /* Cipher C073 */
+       1,
+       TLS1_TXT_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384,
+       TLS1_CK_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384,
+       SSL_kECDHE,
+       SSL_aECDSA,
+       SSL_CAMELLIA256,
+       SSL_SHA384,
+       SSL_TLSV1_2,
+       SSL_NOT_EXP|SSL_HIGH,
+       SSL_HANDSHAKE_MAC_SHA384|TLS1_PRF_SHA384,
+       256,
+       256
+       },
+
+       { /* Cipher C074 */
+       1,
+       TLS1_TXT_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256,
+       TLS1_CK_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256,
+       SSL_kECDHe,
+       SSL_aECDH,
+       SSL_CAMELLIA128,
+       SSL_SHA256,
+       SSL_TLSV1_2,
+       SSL_NOT_EXP|SSL_HIGH,
+       SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256,
+       128,
+       128
+       },
+
+       { /* Cipher C075 */
+       1,
+       TLS1_TXT_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384,
+       TLS1_CK_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384,
+       SSL_kECDHe,
+       SSL_aECDH,
+       SSL_CAMELLIA256,
+       SSL_SHA384,
+       SSL_TLSV1_2,
+       SSL_NOT_EXP|SSL_HIGH,
+       SSL_HANDSHAKE_MAC_SHA384|TLS1_PRF_SHA384,
+       256,
+       256
+       },
+
+       { /* Cipher C076 */
+       1,
+       TLS1_TXT_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256,
+       TLS1_CK_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256,
+       SSL_kECDHE,
+       SSL_aRSA,
+       SSL_CAMELLIA128,
+       SSL_SHA256,
+       SSL_TLSV1_2,
+       SSL_NOT_EXP|SSL_HIGH,
+       SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256,
+       128,
+       128
+       },
+
+       { /* Cipher C077 */
+       1,
+       TLS1_TXT_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384,
+       TLS1_CK_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384,
+       SSL_kECDHE,
+       SSL_aRSA,
+       SSL_CAMELLIA256,
+       SSL_SHA384,
+       SSL_TLSV1_2,
+       SSL_NOT_EXP|SSL_HIGH,
+       SSL_HANDSHAKE_MAC_SHA384|TLS1_PRF_SHA384,
+       256,
+       256
+       },
+
+       { /* Cipher C078 */
+       1,
+       TLS1_TXT_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256,
+       TLS1_CK_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256,
+       SSL_kECDHr,
+       SSL_aECDH,
+       SSL_CAMELLIA128,
+       SSL_SHA256,
+       SSL_TLSV1_2,
+       SSL_NOT_EXP|SSL_HIGH,
+       SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256,
+       128,
+       128
+       },
+
+       { /* Cipher C079 */
+       1,
+       TLS1_TXT_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384,
+       TLS1_CK_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384,
+       SSL_kECDHr,
+       SSL_aECDH,
+       SSL_CAMELLIA256,
+       SSL_SHA384,
+       SSL_TLSV1_2,
+       SSL_NOT_EXP|SSL_HIGH,
+       SSL_HANDSHAKE_MAC_SHA384|TLS1_PRF_SHA384,
+       256,
+       256
+       },
+#endif  /* OPENSSL_NO_CAMELLIA */
 #endif /* OPENSSL_NO_ECDH */
 
 
@@ -3223,10 +3344,6 @@ void ssl3_free(SSL *s)
 
 #ifndef OPENSSL_NO_SRP
        SSL_SRP_CTX_free(s);
-#endif
-#ifndef OPENSSL_NO_TLSEXT
-       if (s->s3->serverinfo_client_tlsext_custom_types != NULL)
-               OPENSSL_free(s->s3->serverinfo_client_tlsext_custom_types);
 #endif
        OPENSSL_cleanse(s->s3,sizeof *s->s3);
        OPENSSL_free(s->s3);
@@ -3272,12 +3389,6 @@ void ssl3_clear(SSL *s)
                }
 #endif
 #ifndef OPENSSL_NO_TLSEXT
-       if (s->s3->serverinfo_client_tlsext_custom_types != NULL)
-               {
-               OPENSSL_free(s->s3->serverinfo_client_tlsext_custom_types);
-               s->s3->serverinfo_client_tlsext_custom_types = NULL;
-               }
-       s->s3->serverinfo_client_tlsext_custom_types_count = 0;
 #ifndef OPENSSL_NO_EC
        s->s3->is_probably_safari = 0;
 #endif /* !OPENSSL_NO_EC */
@@ -3813,6 +3924,33 @@ long ssl3_ctrl(SSL *s, int cmd, long larg, void *parg)
                return (int)sess->tlsext_ecpointformatlist_length;
                }
 #endif
+
+       case SSL_CTRL_CHECK_PROTO_VERSION:
+               /* For library-internal use; checks that the current protocol
+                * is the highest enabled version (according to s->ctx->method,
+                * as version negotiation may have changed s->method). */
+               if (s->version == s->ctx->method->version)
+                       return 1;
+               /* Apparently we're using a version-flexible SSL_METHOD
+                * (not at its highest protocol version). */
+               if (s->ctx->method->version == SSLv23_method()->version)
+                       {
+#if TLS_MAX_VERSION != TLS1_2_VERSION
+#  error Code needs update for SSLv23_method() support beyond TLS1_2_VERSION.
+#endif
+                       if (!(s->options & SSL_OP_NO_TLSv1_2))
+                               return s->version == TLS1_2_VERSION;
+                       if (!(s->options & SSL_OP_NO_TLSv1_1))
+                               return s->version == TLS1_1_VERSION;
+                       if (!(s->options & SSL_OP_NO_TLSv1))
+                               return s->version == TLS1_VERSION;
+                       if (!(s->options & SSL_OP_NO_SSLv3))
+                               return s->version == SSL3_VERSION;
+                       if (!(s->options & SSL_OP_NO_SSLv2))
+                               return s->version == SSL2_VERSION;
+                       }
+               return 0; /* Unexpected state; fail closed. */
+
        default:
                break;
                }
@@ -4733,4 +4871,3 @@ long ssl_get_algorithm2(SSL *s)
                return SSL_HANDSHAKE_MAC_SHA256 | TLS1_PRF_SHA256;
        return alg2;
        }
-