16d49e1aeSJan Lentfer /* 26d49e1aeSJan Lentfer * TLSv1 Record Protocol 3*3ff40c12SJohn Marino * Copyright (c) 2006-2011, Jouni Malinen <j@w1.fi> 46d49e1aeSJan Lentfer * 5*3ff40c12SJohn Marino * This software may be distributed under the terms of the BSD license. 6*3ff40c12SJohn Marino * See README for more details. 76d49e1aeSJan Lentfer */ 86d49e1aeSJan Lentfer 96d49e1aeSJan Lentfer #ifndef TLSV1_RECORD_H 106d49e1aeSJan Lentfer #define TLSV1_RECORD_H 116d49e1aeSJan Lentfer 12*3ff40c12SJohn Marino #include "crypto/crypto.h" 136d49e1aeSJan Lentfer 14*3ff40c12SJohn Marino #define TLS_MAX_WRITE_MAC_SECRET_LEN 32 156d49e1aeSJan Lentfer #define TLS_MAX_WRITE_KEY_LEN 32 166d49e1aeSJan Lentfer #define TLS_MAX_IV_LEN 16 176d49e1aeSJan Lentfer #define TLS_MAX_KEY_BLOCK_LEN (2 * (TLS_MAX_WRITE_MAC_SECRET_LEN + \ 186d49e1aeSJan Lentfer TLS_MAX_WRITE_KEY_LEN + TLS_MAX_IV_LEN)) 196d49e1aeSJan Lentfer 206d49e1aeSJan Lentfer #define TLS_SEQ_NUM_LEN 8 216d49e1aeSJan Lentfer #define TLS_RECORD_HEADER_LEN 5 226d49e1aeSJan Lentfer 236d49e1aeSJan Lentfer /* ContentType */ 246d49e1aeSJan Lentfer enum { 256d49e1aeSJan Lentfer TLS_CONTENT_TYPE_CHANGE_CIPHER_SPEC = 20, 266d49e1aeSJan Lentfer TLS_CONTENT_TYPE_ALERT = 21, 276d49e1aeSJan Lentfer TLS_CONTENT_TYPE_HANDSHAKE = 22, 286d49e1aeSJan Lentfer TLS_CONTENT_TYPE_APPLICATION_DATA = 23 296d49e1aeSJan Lentfer }; 306d49e1aeSJan Lentfer 316d49e1aeSJan Lentfer struct tlsv1_record_layer { 32*3ff40c12SJohn Marino u16 tls_version; 33*3ff40c12SJohn Marino 346d49e1aeSJan Lentfer u8 write_mac_secret[TLS_MAX_WRITE_MAC_SECRET_LEN]; 356d49e1aeSJan Lentfer u8 read_mac_secret[TLS_MAX_WRITE_MAC_SECRET_LEN]; 366d49e1aeSJan Lentfer u8 write_key[TLS_MAX_WRITE_KEY_LEN]; 376d49e1aeSJan Lentfer u8 read_key[TLS_MAX_WRITE_KEY_LEN]; 386d49e1aeSJan Lentfer u8 write_iv[TLS_MAX_IV_LEN]; 396d49e1aeSJan Lentfer u8 read_iv[TLS_MAX_IV_LEN]; 406d49e1aeSJan Lentfer 416d49e1aeSJan Lentfer size_t hash_size; 426d49e1aeSJan Lentfer size_t key_material_len; 436d49e1aeSJan Lentfer size_t iv_size; /* also block_size */ 446d49e1aeSJan Lentfer 456d49e1aeSJan Lentfer enum crypto_hash_alg hash_alg; 466d49e1aeSJan Lentfer enum crypto_cipher_alg cipher_alg; 476d49e1aeSJan Lentfer 486d49e1aeSJan Lentfer u8 write_seq_num[TLS_SEQ_NUM_LEN]; 496d49e1aeSJan Lentfer u8 read_seq_num[TLS_SEQ_NUM_LEN]; 506d49e1aeSJan Lentfer 516d49e1aeSJan Lentfer u16 cipher_suite; 526d49e1aeSJan Lentfer u16 write_cipher_suite; 536d49e1aeSJan Lentfer u16 read_cipher_suite; 546d49e1aeSJan Lentfer 556d49e1aeSJan Lentfer struct crypto_cipher *write_cbc; 566d49e1aeSJan Lentfer struct crypto_cipher *read_cbc; 576d49e1aeSJan Lentfer }; 586d49e1aeSJan Lentfer 596d49e1aeSJan Lentfer 606d49e1aeSJan Lentfer int tlsv1_record_set_cipher_suite(struct tlsv1_record_layer *rl, 616d49e1aeSJan Lentfer u16 cipher_suite); 626d49e1aeSJan Lentfer int tlsv1_record_change_write_cipher(struct tlsv1_record_layer *rl); 636d49e1aeSJan Lentfer int tlsv1_record_change_read_cipher(struct tlsv1_record_layer *rl); 646d49e1aeSJan Lentfer int tlsv1_record_send(struct tlsv1_record_layer *rl, u8 content_type, u8 *buf, 65*3ff40c12SJohn Marino size_t buf_size, const u8 *payload, size_t payload_len, 66*3ff40c12SJohn Marino size_t *out_len); 676d49e1aeSJan Lentfer int tlsv1_record_receive(struct tlsv1_record_layer *rl, 686d49e1aeSJan Lentfer const u8 *in_data, size_t in_len, 696d49e1aeSJan Lentfer u8 *out_data, size_t *out_len, u8 *alert); 706d49e1aeSJan Lentfer 716d49e1aeSJan Lentfer #endif /* TLSV1_RECORD_H */ 72