Loading ssl/s3_lib.c +20 −8 Original line number Original line Diff line number Diff line Loading @@ -3395,20 +3395,32 @@ long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) case SSL_CTRL_GET_TLSEXT_TICKET_KEYS: case SSL_CTRL_GET_TLSEXT_TICKET_KEYS: { { unsigned char *keys = parg; unsigned char *keys = parg; long tlsext_tick_keylen = (sizeof(ctx->tlsext_tick_key_name) + sizeof(ctx->tlsext_tick_hmac_key) + (ctx->tlsext_tick_aes_key)); if (!keys) if (!keys) return 48; return tlsext_tick_keylen; if (larg != 48) { if (larg != tlsext_tick_keylen) { SSLerr(SSL_F_SSL3_CTX_CTRL, SSL_R_INVALID_TICKET_KEYS_LENGTH); SSLerr(SSL_F_SSL3_CTX_CTRL, SSL_R_INVALID_TICKET_KEYS_LENGTH); return 0; return 0; } } if (cmd == SSL_CTRL_SET_TLSEXT_TICKET_KEYS) { if (cmd == SSL_CTRL_SET_TLSEXT_TICKET_KEYS) { memcpy(ctx->tlsext_tick_key_name, keys, 16); memcpy(ctx->tlsext_tick_key_name, keys, memcpy(ctx->tlsext_tick_hmac_key, keys + 16, 16); sizeof(ctx->tlsext_tick_key_name)); memcpy(ctx->tlsext_tick_aes_key, keys + 32, 16); memcpy(ctx->tlsext_tick_hmac_key, keys + sizeof(ctx->tlsext_tick_key_name), sizeof(ctx->tlsext_tick_hmac_key)); memcpy(ctx->tlsext_tick_aes_key, keys + sizeof(ctx->tlsext_tick_key_name) + sizeof(ctx->tlsext_tick_hmac_key), sizeof(ctx->tlsext_tick_aes_key)); } else { } else { memcpy(keys, ctx->tlsext_tick_key_name, 16); memcpy(keys, ctx->tlsext_tick_key_name, memcpy(keys + 16, ctx->tlsext_tick_hmac_key, 16); sizeof(ctx->tlsext_tick_key_name)); memcpy(keys + 32, ctx->tlsext_tick_aes_key, 16); memcpy(keys + sizeof(ctx->tlsext_tick_key_name), ctx->tlsext_tick_hmac_key, sizeof(ctx->tlsext_tick_hmac_key)); memcpy(keys + sizeof(ctx->tlsext_tick_key_name) + sizeof(ctx->tlsext_tick_hmac_key), ctx->tlsext_tick_aes_key, sizeof(ctx->tlsext_tick_aes_key)); } } return 1; return 1; } } Loading ssl/ssl_lib.c +4 −4 Original line number Original line Diff line number Diff line Loading @@ -2461,10 +2461,10 @@ SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth) ret->max_send_fragment = SSL3_RT_MAX_PLAIN_LENGTH; ret->max_send_fragment = SSL3_RT_MAX_PLAIN_LENGTH; ret->split_send_fragment = SSL3_RT_MAX_PLAIN_LENGTH; ret->split_send_fragment = SSL3_RT_MAX_PLAIN_LENGTH; /* Setup RFC4507 ticket keys */ /* Setup RFC5077 ticket keys */ if ((RAND_bytes(ret->tlsext_tick_key_name, 16) <= 0) if ((RAND_bytes(ret->tlsext_tick_key_name, sizeof(ret->tlsext_tick_key_name)) <= 0) || (RAND_bytes(ret->tlsext_tick_hmac_key, 16) <= 0) || (RAND_bytes(ret->tlsext_tick_hmac_key, sizeof(ret->tlsext_tick_hmac_key)) <= 0) || (RAND_bytes(ret->tlsext_tick_aes_key, 16) <= 0)) || (RAND_bytes(ret->tlsext_tick_aes_key, sizeof(ret->tlsext_tick_aes_key)) <= 0)) ret->options |= SSL_OP_NO_TICKET; ret->options |= SSL_OP_NO_TICKET; #ifndef OPENSSL_NO_SRP #ifndef OPENSSL_NO_SRP Loading ssl/statem/statem_srvr.c +4 −2 Original line number Original line Diff line number Diff line Loading @@ -3051,10 +3051,12 @@ int tls_construct_new_session_ticket(SSL *s) if (!EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, if (!EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, tctx->tlsext_tick_aes_key, iv)) tctx->tlsext_tick_aes_key, iv)) goto err; goto err; if (!HMAC_Init_ex(hctx, tctx->tlsext_tick_hmac_key, 16, if (!HMAC_Init_ex(hctx, tctx->tlsext_tick_hmac_key, sizeof(tctx->tlsext_tick_hmac_key), EVP_sha256(), NULL)) EVP_sha256(), NULL)) goto err; goto err; memcpy(key_name, tctx->tlsext_tick_key_name, 16); memcpy(key_name, tctx->tlsext_tick_key_name, sizeof(tctx->tlsext_tick_key_name)); } } /* /* Loading ssl/t1_lib.c +5 −3 Original line number Original line Diff line number Diff line Loading @@ -3129,15 +3129,17 @@ static int tls_decrypt_ticket(SSL *s, const unsigned char *etick, renew_ticket = 1; renew_ticket = 1; } else { } else { /* Check key name matches */ /* Check key name matches */ if (memcmp(etick, tctx->tlsext_tick_key_name, 16)) { if (memcmp(etick, tctx->tlsext_tick_key_name, sizeof(tctx->tlsext_tick_key_name)) != 0) { ret = 2; ret = 2; goto err; goto err; } } if (HMAC_Init_ex(hctx, tctx->tlsext_tick_hmac_key, 16, if (HMAC_Init_ex(hctx, tctx->tlsext_tick_hmac_key, sizeof(tctx->tlsext_tick_hmac_key), EVP_sha256(), NULL) <= 0 EVP_sha256(), NULL) <= 0 || EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, || EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, tctx->tlsext_tick_aes_key, tctx->tlsext_tick_aes_key, etick + 16) <= 0) { etick + sizeof(tctx->tlsext_tick_key_name)) <= 0) { goto err; goto err; } } } } Loading Loading
ssl/s3_lib.c +20 −8 Original line number Original line Diff line number Diff line Loading @@ -3395,20 +3395,32 @@ long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) case SSL_CTRL_GET_TLSEXT_TICKET_KEYS: case SSL_CTRL_GET_TLSEXT_TICKET_KEYS: { { unsigned char *keys = parg; unsigned char *keys = parg; long tlsext_tick_keylen = (sizeof(ctx->tlsext_tick_key_name) + sizeof(ctx->tlsext_tick_hmac_key) + (ctx->tlsext_tick_aes_key)); if (!keys) if (!keys) return 48; return tlsext_tick_keylen; if (larg != 48) { if (larg != tlsext_tick_keylen) { SSLerr(SSL_F_SSL3_CTX_CTRL, SSL_R_INVALID_TICKET_KEYS_LENGTH); SSLerr(SSL_F_SSL3_CTX_CTRL, SSL_R_INVALID_TICKET_KEYS_LENGTH); return 0; return 0; } } if (cmd == SSL_CTRL_SET_TLSEXT_TICKET_KEYS) { if (cmd == SSL_CTRL_SET_TLSEXT_TICKET_KEYS) { memcpy(ctx->tlsext_tick_key_name, keys, 16); memcpy(ctx->tlsext_tick_key_name, keys, memcpy(ctx->tlsext_tick_hmac_key, keys + 16, 16); sizeof(ctx->tlsext_tick_key_name)); memcpy(ctx->tlsext_tick_aes_key, keys + 32, 16); memcpy(ctx->tlsext_tick_hmac_key, keys + sizeof(ctx->tlsext_tick_key_name), sizeof(ctx->tlsext_tick_hmac_key)); memcpy(ctx->tlsext_tick_aes_key, keys + sizeof(ctx->tlsext_tick_key_name) + sizeof(ctx->tlsext_tick_hmac_key), sizeof(ctx->tlsext_tick_aes_key)); } else { } else { memcpy(keys, ctx->tlsext_tick_key_name, 16); memcpy(keys, ctx->tlsext_tick_key_name, memcpy(keys + 16, ctx->tlsext_tick_hmac_key, 16); sizeof(ctx->tlsext_tick_key_name)); memcpy(keys + 32, ctx->tlsext_tick_aes_key, 16); memcpy(keys + sizeof(ctx->tlsext_tick_key_name), ctx->tlsext_tick_hmac_key, sizeof(ctx->tlsext_tick_hmac_key)); memcpy(keys + sizeof(ctx->tlsext_tick_key_name) + sizeof(ctx->tlsext_tick_hmac_key), ctx->tlsext_tick_aes_key, sizeof(ctx->tlsext_tick_aes_key)); } } return 1; return 1; } } Loading
ssl/ssl_lib.c +4 −4 Original line number Original line Diff line number Diff line Loading @@ -2461,10 +2461,10 @@ SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth) ret->max_send_fragment = SSL3_RT_MAX_PLAIN_LENGTH; ret->max_send_fragment = SSL3_RT_MAX_PLAIN_LENGTH; ret->split_send_fragment = SSL3_RT_MAX_PLAIN_LENGTH; ret->split_send_fragment = SSL3_RT_MAX_PLAIN_LENGTH; /* Setup RFC4507 ticket keys */ /* Setup RFC5077 ticket keys */ if ((RAND_bytes(ret->tlsext_tick_key_name, 16) <= 0) if ((RAND_bytes(ret->tlsext_tick_key_name, sizeof(ret->tlsext_tick_key_name)) <= 0) || (RAND_bytes(ret->tlsext_tick_hmac_key, 16) <= 0) || (RAND_bytes(ret->tlsext_tick_hmac_key, sizeof(ret->tlsext_tick_hmac_key)) <= 0) || (RAND_bytes(ret->tlsext_tick_aes_key, 16) <= 0)) || (RAND_bytes(ret->tlsext_tick_aes_key, sizeof(ret->tlsext_tick_aes_key)) <= 0)) ret->options |= SSL_OP_NO_TICKET; ret->options |= SSL_OP_NO_TICKET; #ifndef OPENSSL_NO_SRP #ifndef OPENSSL_NO_SRP Loading
ssl/statem/statem_srvr.c +4 −2 Original line number Original line Diff line number Diff line Loading @@ -3051,10 +3051,12 @@ int tls_construct_new_session_ticket(SSL *s) if (!EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, if (!EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, tctx->tlsext_tick_aes_key, iv)) tctx->tlsext_tick_aes_key, iv)) goto err; goto err; if (!HMAC_Init_ex(hctx, tctx->tlsext_tick_hmac_key, 16, if (!HMAC_Init_ex(hctx, tctx->tlsext_tick_hmac_key, sizeof(tctx->tlsext_tick_hmac_key), EVP_sha256(), NULL)) EVP_sha256(), NULL)) goto err; goto err; memcpy(key_name, tctx->tlsext_tick_key_name, 16); memcpy(key_name, tctx->tlsext_tick_key_name, sizeof(tctx->tlsext_tick_key_name)); } } /* /* Loading
ssl/t1_lib.c +5 −3 Original line number Original line Diff line number Diff line Loading @@ -3129,15 +3129,17 @@ static int tls_decrypt_ticket(SSL *s, const unsigned char *etick, renew_ticket = 1; renew_ticket = 1; } else { } else { /* Check key name matches */ /* Check key name matches */ if (memcmp(etick, tctx->tlsext_tick_key_name, 16)) { if (memcmp(etick, tctx->tlsext_tick_key_name, sizeof(tctx->tlsext_tick_key_name)) != 0) { ret = 2; ret = 2; goto err; goto err; } } if (HMAC_Init_ex(hctx, tctx->tlsext_tick_hmac_key, 16, if (HMAC_Init_ex(hctx, tctx->tlsext_tick_hmac_key, sizeof(tctx->tlsext_tick_hmac_key), EVP_sha256(), NULL) <= 0 EVP_sha256(), NULL) <= 0 || EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, || EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, tctx->tlsext_tick_aes_key, tctx->tlsext_tick_aes_key, etick + 16) <= 0) { etick + sizeof(tctx->tlsext_tick_key_name)) <= 0) { goto err; goto err; } } } } Loading