139beb93cSSam Leffler /* 239beb93cSSam Leffler * TLSv1 Record Protocol 3*f05cddf9SRui Paulo * Copyright (c) 2006-2011, Jouni Malinen <j@w1.fi> 439beb93cSSam Leffler * 5*f05cddf9SRui Paulo * This software may be distributed under the terms of the BSD license. 6*f05cddf9SRui Paulo * See README for more details. 739beb93cSSam Leffler */ 839beb93cSSam Leffler 939beb93cSSam Leffler #ifndef TLSV1_RECORD_H 1039beb93cSSam Leffler #define TLSV1_RECORD_H 1139beb93cSSam Leffler 12e28a4053SRui Paulo #include "crypto/crypto.h" 1339beb93cSSam Leffler 14*f05cddf9SRui Paulo #define TLS_MAX_WRITE_MAC_SECRET_LEN 32 1539beb93cSSam Leffler #define TLS_MAX_WRITE_KEY_LEN 32 1639beb93cSSam Leffler #define TLS_MAX_IV_LEN 16 1739beb93cSSam Leffler #define TLS_MAX_KEY_BLOCK_LEN (2 * (TLS_MAX_WRITE_MAC_SECRET_LEN + \ 1839beb93cSSam Leffler TLS_MAX_WRITE_KEY_LEN + TLS_MAX_IV_LEN)) 1939beb93cSSam Leffler 2039beb93cSSam Leffler #define TLS_SEQ_NUM_LEN 8 2139beb93cSSam Leffler #define TLS_RECORD_HEADER_LEN 5 2239beb93cSSam Leffler 2339beb93cSSam Leffler /* ContentType */ 2439beb93cSSam Leffler enum { 2539beb93cSSam Leffler TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC = 20, 2639beb93cSSam Leffler TLS_CONTENT_TYPE_ALERT = 21, 2739beb93cSSam Leffler TLS_CONTENT_TYPE_HANDSHAKE = 22, 2839beb93cSSam Leffler TLS_CONTENT_TYPE_APPLICATION_DATA = 23 2939beb93cSSam Leffler }; 3039beb93cSSam Leffler 3139beb93cSSam Leffler struct tlsv1_record_layer { 32*f05cddf9SRui Paulo u16 tls_version; 33*f05cddf9SRui Paulo 3439beb93cSSam Leffler u8 write_mac_secret[TLS_MAX_WRITE_MAC_SECRET_LEN]; 3539beb93cSSam Leffler u8 read_mac_secret[TLS_MAX_WRITE_MAC_SECRET_LEN]; 3639beb93cSSam Leffler u8 write_key[TLS_MAX_WRITE_KEY_LEN]; 3739beb93cSSam Leffler u8 read_key[TLS_MAX_WRITE_KEY_LEN]; 3839beb93cSSam Leffler u8 write_iv[TLS_MAX_IV_LEN]; 3939beb93cSSam Leffler u8 read_iv[TLS_MAX_IV_LEN]; 4039beb93cSSam Leffler 4139beb93cSSam Leffler size_t hash_size; 4239beb93cSSam Leffler size_t key_material_len; 4339beb93cSSam Leffler size_t iv_size; /* also block_size */ 4439beb93cSSam Leffler 4539beb93cSSam Leffler enum crypto_hash_alg hash_alg; 4639beb93cSSam Leffler enum crypto_cipher_alg cipher_alg; 4739beb93cSSam Leffler 4839beb93cSSam Leffler u8 write_seq_num[TLS_SEQ_NUM_LEN]; 4939beb93cSSam Leffler u8 read_seq_num[TLS_SEQ_NUM_LEN]; 5039beb93cSSam Leffler 5139beb93cSSam Leffler u16 cipher_suite; 5239beb93cSSam Leffler u16 write_cipher_suite; 5339beb93cSSam Leffler u16 read_cipher_suite; 5439beb93cSSam Leffler 5539beb93cSSam Leffler struct crypto_cipher *write_cbc; 5639beb93cSSam Leffler struct crypto_cipher *read_cbc; 5739beb93cSSam Leffler }; 5839beb93cSSam Leffler 5939beb93cSSam Leffler 6039beb93cSSam Leffler int tlsv1_record_set_cipher_suite(struct tlsv1_record_layer *rl, 6139beb93cSSam Leffler u16 cipher_suite); 6239beb93cSSam Leffler int tlsv1_record_change_write_cipher(struct tlsv1_record_layer *rl); 6339beb93cSSam Leffler int tlsv1_record_change_read_cipher(struct tlsv1_record_layer *rl); 6439beb93cSSam Leffler int tlsv1_record_send(struct tlsv1_record_layer *rl, u8 content_type, u8 *buf, 65*f05cddf9SRui Paulo size_t buf_size, const u8 *payload, size_t payload_len, 66*f05cddf9SRui Paulo size_t *out_len); 6739beb93cSSam Leffler int tlsv1_record_receive(struct tlsv1_record_layer *rl, 6839beb93cSSam Leffler const u8 *in_data, size_t in_len, 6939beb93cSSam Leffler u8 *out_data, size_t *out_len, u8 *alert); 7039beb93cSSam Leffler 7139beb93cSSam Leffler #endif /* TLSV1_RECORD_H */ 72