allow ECDSA+SHA384 signature algorithm in SUITEB128ONLY mode
[openssl.git] / ssl / t1_enc.c
index a28bb7d2296768d7e8f2f5e7c86c006e233b9273..0fe39dc387bcd67ddba649cd7c80b4e6d0815414 100644 (file)
@@ -361,7 +361,7 @@ int tls1_change_cipher_state(SSL *s, int which)
        {
         int i;
         for (i=0; i<s->s3->tmp.key_block_length; i++)
-               printf("%02x", key_block[i]);  printf("\n");
+               printf("%02x", s->s3->tmp.key_block[i]);  printf("\n");
         }
 #endif /* KSSL_DEBUG */
 
@@ -556,6 +556,30 @@ printf("which = %04X\nmac key=",which);
                EVP_CIPHER_CTX_ctrl(dd,EVP_CTRL_AEAD_SET_MAC_KEY,
                                *mac_secret_size,mac_secret);
 
+#ifdef OPENSSL_SSL_TRACE_CRYPTO
+       if (s->msg_callback)
+               {
+               int wh = which & SSL3_CC_WRITE ? TLS1_RT_CRYPTO_WRITE : 0;
+               if (*mac_secret_size)
+                       s->msg_callback(2, s->version, wh | TLS1_RT_CRYPTO_MAC,
+                                               mac_secret, *mac_secret_size,
+                                               s, s->msg_callback_arg);
+               if (c->key_len)
+                       s->msg_callback(2, s->version, wh | TLS1_RT_CRYPTO_KEY,
+                                               key, c->key_len,
+                                               s, s->msg_callback_arg);
+               if (k)
+                       {
+                       if (EVP_CIPHER_mode(c) == EVP_CIPH_GCM_MODE)
+                               wh |= TLS1_RT_CRYPTO_FIXED_IV;
+                       else
+                               wh |= TLS1_RT_CRYPTO_IV;
+                       s->msg_callback(2, s->version, wh, iv, k,
+                                               s, s->msg_callback_arg);
+                       }
+               }
+#endif
+
 #ifdef TLS_DEBUG
 printf("which = %04X\nkey=",which);
 { int z; for (z=0; z<EVP_CIPHER_key_length(c); z++) printf("%02X%c",key[z],((z+1)%16)?' ':'\n'); }
@@ -825,7 +849,10 @@ int tls1_enc(SSL *s, int send)
                                }
                        }
                
-               if (EVP_Cipher(ds,rec->data,rec->input,l) < 0)
+               i = EVP_Cipher(ds,rec->data,rec->input,l);
+               if ((EVP_CIPHER_flags(ds->cipher)&EVP_CIPH_FLAG_CUSTOM_CIPHER)
+                                               ?(i<0)
+                                               :(i==0))
                        return -1;      /* AEAD can fail to verify MAC */
                if (EVP_CIPHER_mode(enc) == EVP_CIPH_GCM_MODE && !send)
                        {
@@ -886,6 +913,8 @@ int tls1_enc(SSL *s, int send)
                        if (s->version >= TLS1_1_VERSION
                                && EVP_CIPHER_CTX_mode(ds) == EVP_CIPH_CBC_MODE)
                                {
+                               if (bs > (int)rec->length)
+                                       return -1;
                                rec->data += bs;    /* skip the explicit IV */
                                rec->input += bs;
                                rec->length -= bs;
@@ -1113,22 +1142,41 @@ int tls1_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p,
        BIO_dump_fp(stderr, (char *)s->session->master_key, SSL3_MASTER_SECRET_SIZE);
 #endif
 
+#ifdef OPENSSL_SSL_TRACE_CRYPTO
+       if (s->msg_callback)
+               {
+               s->msg_callback(2, s->version, TLS1_RT_CRYPTO_PREMASTER,
+                                               p, len, s, s->msg_callback_arg);
+               s->msg_callback(2, s->version, TLS1_RT_CRYPTO_CLIENT_RANDOM,
+                                       s->s3->client_random, SSL3_RANDOM_SIZE,
+                                               s, s->msg_callback_arg);
+               s->msg_callback(2, s->version, TLS1_RT_CRYPTO_SERVER_RANDOM,
+                                       s->s3->server_random, SSL3_RANDOM_SIZE,
+                                       s, s->msg_callback_arg);
+               s->msg_callback(2, s->version, TLS1_RT_CRYPTO_MASTER,
+                                       s->session->master_key,
+                                       SSL3_MASTER_SECRET_SIZE,
+                                       s, s->msg_callback_arg);
+               }
+#endif
+
 #ifdef KSSL_DEBUG
        printf ("tls1_generate_master_secret() complete\n");
 #endif /* KSSL_DEBUG */
        return(SSL3_MASTER_SECRET_SIZE);
        }
 
-int tls1_export_keying_material(SSL *s, unsigned char *out, unsigned int olen, 
-         const char *label, unsigned int llen, const unsigned char *context, 
-         unsigned int contextlen, int use_context)
+int tls1_export_keying_material(SSL *s, unsigned char *out, size_t olen,
+        const char *label, size_t llen, const unsigned char *context,
+        size_t contextlen, int use_context)
        {
        unsigned char *buff;
-       unsigned char *val;
-       unsigned int vallen, currentvalpos, rv;
+       unsigned char *val = NULL;
+       size_t vallen, currentvalpos;
+       int rv;
 
 #ifdef KSSL_DEBUG
-       printf ("tls1_export_keying_material(%p, %p,%d, %s,%d, %p,%d)\n", s, out,olen, label,llen, p,plen);
+       printf ("tls1_export_keying_material(%p,%p,%d,%s,%d,%p,%d)\n", s, out, olen, label, llen, p, plen);
 #endif /* KSSL_DEBUG */
 
        buff = OPENSSL_malloc(olen);
@@ -1140,10 +1188,10 @@ int tls1_export_keying_material(SSL *s, unsigned char *out, unsigned int olen,
         * does not create a prohibited label.
         */
        vallen = llen + SSL3_RANDOM_SIZE * 2;
-        if (use_context) 
-                {
-                vallen +=  2 + contextlen;
-                }
+       if (use_context)
+               {
+               vallen += 2 + contextlen;
+               }
 
        val = OPENSSL_malloc(vallen);
        if (val == NULL) goto err2;
@@ -1155,17 +1203,17 @@ int tls1_export_keying_material(SSL *s, unsigned char *out, unsigned int olen,
        memcpy(val + currentvalpos, s->s3->server_random, SSL3_RANDOM_SIZE);
        currentvalpos += SSL3_RANDOM_SIZE;
 
-        if (use_context)
-                {
-                val[currentvalpos] = (contextlen << 8) & 0xff;
-                currentvalpos++;
-                val[currentvalpos] = contextlen & 0xff;
-                currentvalpos++;
-                if ((contextlen > 0) || (context != NULL)) 
-                        {
-                        memcpy(val + currentvalpos, context, contextlen);
-                        }
-                }
+       if (use_context)
+               {
+               val[currentvalpos] = (contextlen >> 8) & 0xff;
+               currentvalpos++;
+               val[currentvalpos] = contextlen & 0xff;
+               currentvalpos++;
+               if ((contextlen > 0) || (context != NULL))
+                       {
+                       memcpy(val + currentvalpos, context, contextlen);
+                       }
+               }
 
        /* disallow prohibited labels
         * note that SSL3_RANDOM_SIZE > max(prohibited label len) =
@@ -1181,19 +1229,18 @@ int tls1_export_keying_material(SSL *s, unsigned char *out, unsigned int olen,
        if (memcmp(val, TLS_MD_KEY_EXPANSION_CONST,
                 TLS_MD_KEY_EXPANSION_CONST_SIZE) == 0) goto err1;
 
-       tls1_PRF(s->s3->tmp.new_cipher->algorithm2,
-               val, vallen,
-               NULL, 0,
-               NULL, 0,
-               NULL, 0,
-               NULL, 0,
-               s->session->master_key,s->session->master_key_length,
-               out,buff,olen);
+       rv = tls1_PRF(s->s3->tmp.new_cipher->algorithm2,
+                     val, vallen,
+                     NULL, 0,
+                     NULL, 0,
+                     NULL, 0,
+                     NULL, 0,
+                     s->session->master_key,s->session->master_key_length,
+                     out,buff,olen);
 
 #ifdef KSSL_DEBUG
        printf ("tls1_export_keying_material() complete\n");
 #endif /* KSSL_DEBUG */
-       rv = olen;
        goto ret;
 err1:
        SSLerr(SSL_F_TLS1_EXPORT_KEYING_MATERIAL, SSL_R_TLS_ILLEGAL_EXPORTER_LABEL);
@@ -1242,9 +1289,6 @@ int tls1_alert_code(int code)
        case SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE: return(TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE);
        case SSL_AD_BAD_CERTIFICATE_HASH_VALUE: return(TLS1_AD_BAD_CERTIFICATE_HASH_VALUE);
        case SSL_AD_UNKNOWN_PSK_IDENTITY:return(TLS1_AD_UNKNOWN_PSK_IDENTITY);
-#ifndef OPENSSL_NO_SRP
-       case SSL_AD_MISSING_SRP_USERNAME:return(TLS1_AD_MISSING_SRP_USERNAME);
-#endif
 #if 0 /* not appropriate for TLS, not used for DTLS */
        case DTLS1_AD_MISSING_HANDSHAKE_MESSAGE: return 
                                          (DTLS1_AD_MISSING_HANDSHAKE_MESSAGE);
@@ -1252,27 +1296,3 @@ int tls1_alert_code(int code)
        default:                        return(-1);
                }
        }
-
-int SSL_tls1_key_exporter(SSL *s, unsigned char *label, int label_len,
-                           unsigned char *context, int context_len,
-                           unsigned char *out, int olen)
-       {
-       unsigned char *tmp;
-       int rv;
-
-       tmp = OPENSSL_malloc(olen);
-
-       if (!tmp)
-               return 0;
-       
-       rv = tls1_PRF(ssl_get_algorithm2(s),
-                        label, label_len,
-                        s->s3->client_random,SSL3_RANDOM_SIZE,
-                        s->s3->server_random,SSL3_RANDOM_SIZE,
-                        context, context_len, NULL, 0,
-                        s->session->master_key, s->session->master_key_length,
-                        out, tmp, olen);
-
-       OPENSSL_free(tmp);
-       return rv;
-       }