[tls] Clean up change cipher spec record handling

Define and use data structures and constants for the (single-byte)
change cipher spec records.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2023-03-30 16:57:12 +01:00
parent 09e8a15408
commit 2c6a15d2a3
2 changed files with 18 additions and 4 deletions

View File

@@ -52,6 +52,9 @@ struct tls_header {
/** Change cipher content type */ /** Change cipher content type */
#define TLS_TYPE_CHANGE_CIPHER 20 #define TLS_TYPE_CHANGE_CIPHER 20
/** Change cipher spec magic byte */
#define TLS_CHANGE_CIPHER_SPEC 1
/** Alert content type */ /** Alert content type */
#define TLS_TYPE_ALERT 21 #define TLS_TYPE_ALERT 21

View File

@@ -1682,9 +1682,14 @@ static int tls_send_certificate_verify ( struct tls_connection *tls ) {
* @ret rc Return status code * @ret rc Return status code
*/ */
static int tls_send_change_cipher ( struct tls_connection *tls ) { static int tls_send_change_cipher ( struct tls_connection *tls ) {
static const uint8_t change_cipher[1] = { 1 }; static const struct {
uint8_t spec;
} __attribute__ (( packed )) change_cipher = {
.spec = TLS_CHANGE_CIPHER_SPEC,
};
return tls_send_plaintext ( tls, TLS_TYPE_CHANGE_CIPHER, return tls_send_plaintext ( tls, TLS_TYPE_CHANGE_CIPHER,
change_cipher, sizeof ( change_cipher ) ); &change_cipher, sizeof ( change_cipher ) );
} }
/** /**
@@ -1737,14 +1742,20 @@ static int tls_send_finished ( struct tls_connection *tls ) {
*/ */
static int tls_new_change_cipher ( struct tls_connection *tls, static int tls_new_change_cipher ( struct tls_connection *tls,
const void *data, size_t len ) { const void *data, size_t len ) {
const struct {
uint8_t spec;
} __attribute__ (( packed )) *change_cipher = data;
int rc; int rc;
if ( ( len != 1 ) || ( *( ( uint8_t * ) data ) != 1 ) ) { /* Sanity check */
if ( ( sizeof ( *change_cipher ) != len ) ||
( change_cipher->spec != TLS_CHANGE_CIPHER_SPEC ) ) {
DBGC ( tls, "TLS %p received invalid Change Cipher\n", tls ); DBGC ( tls, "TLS %p received invalid Change Cipher\n", tls );
DBGC_HD ( tls, data, len ); DBGC_HD ( tls, change_cipher, len );
return -EINVAL_CHANGE_CIPHER; return -EINVAL_CHANGE_CIPHER;
} }
/* Change receive cipher spec */
if ( ( rc = tls_change_cipher ( tls, &tls->rx_cipherspec_pending, if ( ( rc = tls_change_cipher ( tls, &tls->rx_cipherspec_pending,
&tls->rx_cipherspec ) ) != 0 ) { &tls->rx_cipherspec ) ) != 0 ) {
DBGC ( tls, "TLS %p could not activate RX cipher: %s\n", DBGC ( tls, "TLS %p could not activate RX cipher: %s\n",