int len;
int rc;
+ /* Generate master secret */
+ tls_generate_master_secret ( tls );
+
+ /* Generate keys */
+ if ( ( rc = tls_generate_keys ( tls ) ) != 0 ) {
+ DBGC ( tls, "TLS %p could not generate keys: %s\n",
+ tls, strerror ( rc ) );
+ return rc;
+ }
+
/* Encrypt pre-master secret using server's public key */
memset ( &key_xchg, 0, sizeof ( key_xchg ) );
len = pubkey_encrypt ( pubkey, cipherspec->pubkey_ctx,
if ( ( rc = tls_select_cipher ( tls, hello_b->cipher_suite ) ) != 0 )
return rc;
- /* Reuse or generate master secret */
+ /* Check session ID */
if ( hello_a->session_id_len &&
( hello_a->session_id_len == tls->session_id_len ) &&
( memcmp ( session_id, tls->session_id,
/* Session ID match: reuse master secret */
DBGC ( tls, "TLS %p resuming session ID:\n", tls );
DBGC_HDA ( tls, 0, tls->session_id, tls->session_id_len );
+ if ( ( rc = tls_generate_keys ( tls ) ) != 0 )
+ return rc;
} else {
- /* Generate new master secret */
- tls_generate_master_secret ( tls );
-
/* Record new session ID, if present */
if ( hello_a->session_id_len &&
( hello_a->session_id_len <= sizeof ( tls->session_id ))){
}
}
- /* Generate keys */
- if ( ( rc = tls_generate_keys ( tls ) ) != 0 )
- return rc;
-
/* Handle secure renegotiation */
if ( tls->secure_renegotiation ) {