__owur size_t tls13_final_finish_mac(SSL_CONNECTION *s, const char *str, size_t slen,
unsigned char *p);
__owur int tls13_store_handshake_traffic_hash(SSL_CONNECTION *s);
+__owur int tls13_store_server_finished_hash(SSL_CONNECTION *s);
__owur int tls13_change_cipher_state(SSL_CONNECTION *s, int which);
__owur int tls13_update_key(SSL_CONNECTION *s, int send);
__owur int tls13_hkdf_expand(SSL_CONNECTION *s,
/* SSLfatal() already called */
return MSG_PROCESS_ERROR;
}
+ if (!tls13_store_server_finished_hash(s)) {
+ /* SSLfatal() already called */
+ return MSG_PROCESS_ERROR;
+ }
if (!ssl->method->ssl3_enc->change_cipher_state(s,
SSL3_CC_APPLICATION | SSL3_CHANGE_CIPHER_CLIENT_READ)) {
/* SSLfatal() already called */
if (!ssl->method->ssl3_enc->generate_master_secret(s,
s->master_secret, s->handshake_secret, 0,
&dummy)
+ || !tls13_store_server_finished_hash(s)
|| !ssl->method->ssl3_enc->change_cipher_state(s,
SSL3_CC_APPLICATION | SSL3_CHANGE_CIPHER_SERVER_WRITE))
/* SSLfatal() already called */
return 1;
}
-int tls13_store_handshake_traffic_hash(SSL_CONNECTION *s)
+static int tls13_store_hash(SSL_CONNECTION *s, unsigned char *hash, size_t len)
{
size_t hashlen;
if (!ssl3_digest_cached_records(s, 1)
- || !ssl_handshake_hash(s, s->handshake_traffic_hash,
- sizeof(s->handshake_traffic_hash), &hashlen)) {
+ || !ssl_handshake_hash(s, hash, len, &hashlen)) {
/* SSLfatal() already called */;
return 0;
}
return 1;
}
+int tls13_store_handshake_traffic_hash(SSL_CONNECTION *s)
+{
+ return tls13_store_hash(s, s->handshake_traffic_hash,
+ sizeof(s->handshake_traffic_hash));
+}
+
+int tls13_store_server_finished_hash(SSL_CONNECTION *s)
+{
+ return tls13_store_hash(s, s->server_finished_hash,
+ sizeof(s->server_finished_hash));
+}
+
int tls13_change_cipher_state(SSL_CONNECTION *s, int which)
{
/* ASCII: "c e traffic", in hex for EBCDIC compatibility */
}
}
- /*
- * Save the hash of handshakes up to now for use when we calculate the
- * client application traffic secret
- */
- if (label == server_application_traffic)
- memcpy(s->server_finished_hash, hashval, hashlen);
-
if (label == client_application_traffic) {
/*
* We also create the resumption master secret, but this time use the