1*6d49e1aeSJan Lentfer /* 2*6d49e1aeSJan Lentfer * TLSv1 server (RFC 2246) 3*6d49e1aeSJan Lentfer * Copyright (c) 2006-2007, Jouni Malinen <j@w1.fi> 4*6d49e1aeSJan Lentfer * 5*6d49e1aeSJan Lentfer * This program is free software; you can redistribute it and/or modify 6*6d49e1aeSJan Lentfer * it under the terms of the GNU General Public License version 2 as 7*6d49e1aeSJan Lentfer * published by the Free Software Foundation. 8*6d49e1aeSJan Lentfer * 9*6d49e1aeSJan Lentfer * Alternatively, this software may be distributed under the terms of BSD 10*6d49e1aeSJan Lentfer * license. 11*6d49e1aeSJan Lentfer * 12*6d49e1aeSJan Lentfer * See README and COPYING for more details. 13*6d49e1aeSJan Lentfer */ 14*6d49e1aeSJan Lentfer 15*6d49e1aeSJan Lentfer #include "includes.h" 16*6d49e1aeSJan Lentfer 17*6d49e1aeSJan Lentfer #include "common.h" 18*6d49e1aeSJan Lentfer #include "sha1.h" 19*6d49e1aeSJan Lentfer #include "tls.h" 20*6d49e1aeSJan Lentfer #include "tlsv1_common.h" 21*6d49e1aeSJan Lentfer #include "tlsv1_record.h" 22*6d49e1aeSJan Lentfer #include "tlsv1_server.h" 23*6d49e1aeSJan Lentfer #include "tlsv1_server_i.h" 24*6d49e1aeSJan Lentfer 25*6d49e1aeSJan Lentfer /* TODO: 26*6d49e1aeSJan Lentfer * Support for a message fragmented across several records (RFC 2246, 6.2.1) 27*6d49e1aeSJan Lentfer */ 28*6d49e1aeSJan Lentfer 29*6d49e1aeSJan Lentfer 30*6d49e1aeSJan Lentfer void tlsv1_server_alert(struct tlsv1_server *conn, u8 level, u8 description) 31*6d49e1aeSJan Lentfer { 32*6d49e1aeSJan Lentfer conn->alert_level = level; 33*6d49e1aeSJan Lentfer conn->alert_description = description; 34*6d49e1aeSJan Lentfer } 35*6d49e1aeSJan Lentfer 36*6d49e1aeSJan Lentfer 37*6d49e1aeSJan Lentfer int tlsv1_server_derive_keys(struct tlsv1_server *conn, 38*6d49e1aeSJan Lentfer const u8 *pre_master_secret, 39*6d49e1aeSJan Lentfer size_t pre_master_secret_len) 40*6d49e1aeSJan Lentfer { 41*6d49e1aeSJan Lentfer u8 seed[2 * TLS_RANDOM_LEN]; 42*6d49e1aeSJan Lentfer u8 key_block[TLS_MAX_KEY_BLOCK_LEN]; 43*6d49e1aeSJan Lentfer u8 *pos; 44*6d49e1aeSJan Lentfer size_t key_block_len; 45*6d49e1aeSJan Lentfer 46*6d49e1aeSJan Lentfer if (pre_master_secret) { 47*6d49e1aeSJan Lentfer wpa_hexdump_key(MSG_MSGDUMP, "TLSv1: pre_master_secret", 48*6d49e1aeSJan Lentfer pre_master_secret, pre_master_secret_len); 49*6d49e1aeSJan Lentfer os_memcpy(seed, conn->client_random, TLS_RANDOM_LEN); 50*6d49e1aeSJan Lentfer os_memcpy(seed + TLS_RANDOM_LEN, conn->server_random, 51*6d49e1aeSJan Lentfer TLS_RANDOM_LEN); 52*6d49e1aeSJan Lentfer if (tls_prf(pre_master_secret, pre_master_secret_len, 53*6d49e1aeSJan Lentfer "master secret", seed, 2 * TLS_RANDOM_LEN, 54*6d49e1aeSJan Lentfer conn->master_secret, TLS_MASTER_SECRET_LEN)) { 55*6d49e1aeSJan Lentfer wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive " 56*6d49e1aeSJan Lentfer "master_secret"); 57*6d49e1aeSJan Lentfer return -1; 58*6d49e1aeSJan Lentfer } 59*6d49e1aeSJan Lentfer wpa_hexdump_key(MSG_MSGDUMP, "TLSv1: master_secret", 60*6d49e1aeSJan Lentfer conn->master_secret, TLS_MASTER_SECRET_LEN); 61*6d49e1aeSJan Lentfer } 62*6d49e1aeSJan Lentfer 63*6d49e1aeSJan Lentfer os_memcpy(seed, conn->server_random, TLS_RANDOM_LEN); 64*6d49e1aeSJan Lentfer os_memcpy(seed + TLS_RANDOM_LEN, conn->client_random, TLS_RANDOM_LEN); 65*6d49e1aeSJan Lentfer key_block_len = 2 * (conn->rl.hash_size + conn->rl.key_material_len + 66*6d49e1aeSJan Lentfer conn->rl.iv_size); 67*6d49e1aeSJan Lentfer if (tls_prf(conn->master_secret, TLS_MASTER_SECRET_LEN, 68*6d49e1aeSJan Lentfer "key expansion", seed, 2 * TLS_RANDOM_LEN, 69*6d49e1aeSJan Lentfer key_block, key_block_len)) { 70*6d49e1aeSJan Lentfer wpa_printf(MSG_DEBUG, "TLSv1: Failed to derive key_block"); 71*6d49e1aeSJan Lentfer return -1; 72*6d49e1aeSJan Lentfer } 73*6d49e1aeSJan Lentfer wpa_hexdump_key(MSG_MSGDUMP, "TLSv1: key_block", 74*6d49e1aeSJan Lentfer key_block, key_block_len); 75*6d49e1aeSJan Lentfer 76*6d49e1aeSJan Lentfer pos = key_block; 77*6d49e1aeSJan Lentfer 78*6d49e1aeSJan Lentfer /* client_write_MAC_secret */ 79*6d49e1aeSJan Lentfer os_memcpy(conn->rl.read_mac_secret, pos, conn->rl.hash_size); 80*6d49e1aeSJan Lentfer pos += conn->rl.hash_size; 81*6d49e1aeSJan Lentfer /* server_write_MAC_secret */ 82*6d49e1aeSJan Lentfer os_memcpy(conn->rl.write_mac_secret, pos, conn->rl.hash_size); 83*6d49e1aeSJan Lentfer pos += conn->rl.hash_size; 84*6d49e1aeSJan Lentfer 85*6d49e1aeSJan Lentfer /* client_write_key */ 86*6d49e1aeSJan Lentfer os_memcpy(conn->rl.read_key, pos, conn->rl.key_material_len); 87*6d49e1aeSJan Lentfer pos += conn->rl.key_material_len; 88*6d49e1aeSJan Lentfer /* server_write_key */ 89*6d49e1aeSJan Lentfer os_memcpy(conn->rl.write_key, pos, conn->rl.key_material_len); 90*6d49e1aeSJan Lentfer pos += conn->rl.key_material_len; 91*6d49e1aeSJan Lentfer 92*6d49e1aeSJan Lentfer /* client_write_IV */ 93*6d49e1aeSJan Lentfer os_memcpy(conn->rl.read_iv, pos, conn->rl.iv_size); 94*6d49e1aeSJan Lentfer pos += conn->rl.iv_size; 95*6d49e1aeSJan Lentfer /* server_write_IV */ 96*6d49e1aeSJan Lentfer os_memcpy(conn->rl.write_iv, pos, conn->rl.iv_size); 97*6d49e1aeSJan Lentfer pos += conn->rl.iv_size; 98*6d49e1aeSJan Lentfer 99*6d49e1aeSJan Lentfer return 0; 100*6d49e1aeSJan Lentfer } 101*6d49e1aeSJan Lentfer 102*6d49e1aeSJan Lentfer 103*6d49e1aeSJan Lentfer /** 104*6d49e1aeSJan Lentfer * tlsv1_server_handshake - Process TLS handshake 105*6d49e1aeSJan Lentfer * @conn: TLSv1 server connection data from tlsv1_server_init() 106*6d49e1aeSJan Lentfer * @in_data: Input data from TLS peer 107*6d49e1aeSJan Lentfer * @in_len: Input data length 108*6d49e1aeSJan Lentfer * @out_len: Length of the output buffer. 109*6d49e1aeSJan Lentfer * Returns: Pointer to output data, %NULL on failure 110*6d49e1aeSJan Lentfer */ 111*6d49e1aeSJan Lentfer u8 * tlsv1_server_handshake(struct tlsv1_server *conn, 112*6d49e1aeSJan Lentfer const u8 *in_data, size_t in_len, 113*6d49e1aeSJan Lentfer size_t *out_len) 114*6d49e1aeSJan Lentfer { 115*6d49e1aeSJan Lentfer const u8 *pos, *end; 116*6d49e1aeSJan Lentfer u8 *msg = NULL, *in_msg, *in_pos, *in_end, alert, ct; 117*6d49e1aeSJan Lentfer size_t in_msg_len; 118*6d49e1aeSJan Lentfer 119*6d49e1aeSJan Lentfer if (in_data == NULL || in_len == 0) { 120*6d49e1aeSJan Lentfer wpa_printf(MSG_DEBUG, "TLSv1: No input data to server"); 121*6d49e1aeSJan Lentfer return NULL; 122*6d49e1aeSJan Lentfer } 123*6d49e1aeSJan Lentfer 124*6d49e1aeSJan Lentfer pos = in_data; 125*6d49e1aeSJan Lentfer end = in_data + in_len; 126*6d49e1aeSJan Lentfer in_msg = os_malloc(in_len); 127*6d49e1aeSJan Lentfer if (in_msg == NULL) 128*6d49e1aeSJan Lentfer return NULL; 129*6d49e1aeSJan Lentfer 130*6d49e1aeSJan Lentfer /* Each received packet may include multiple records */ 131*6d49e1aeSJan Lentfer while (pos < end) { 132*6d49e1aeSJan Lentfer in_msg_len = in_len; 133*6d49e1aeSJan Lentfer if (tlsv1_record_receive(&conn->rl, pos, end - pos, 134*6d49e1aeSJan Lentfer in_msg, &in_msg_len, &alert)) { 135*6d49e1aeSJan Lentfer wpa_printf(MSG_DEBUG, "TLSv1: Processing received " 136*6d49e1aeSJan Lentfer "record failed"); 137*6d49e1aeSJan Lentfer tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, alert); 138*6d49e1aeSJan Lentfer goto failed; 139*6d49e1aeSJan Lentfer } 140*6d49e1aeSJan Lentfer ct = pos[0]; 141*6d49e1aeSJan Lentfer 142*6d49e1aeSJan Lentfer in_pos = in_msg; 143*6d49e1aeSJan Lentfer in_end = in_msg + in_msg_len; 144*6d49e1aeSJan Lentfer 145*6d49e1aeSJan Lentfer /* Each received record may include multiple messages of the 146*6d49e1aeSJan Lentfer * same ContentType. */ 147*6d49e1aeSJan Lentfer while (in_pos < in_end) { 148*6d49e1aeSJan Lentfer in_msg_len = in_end - in_pos; 149*6d49e1aeSJan Lentfer if (tlsv1_server_process_handshake(conn, ct, in_pos, 150*6d49e1aeSJan Lentfer &in_msg_len) < 0) 151*6d49e1aeSJan Lentfer goto failed; 152*6d49e1aeSJan Lentfer in_pos += in_msg_len; 153*6d49e1aeSJan Lentfer } 154*6d49e1aeSJan Lentfer 155*6d49e1aeSJan Lentfer pos += TLS_RECORD_HEADER_LEN + WPA_GET_BE16(pos + 3); 156*6d49e1aeSJan Lentfer } 157*6d49e1aeSJan Lentfer 158*6d49e1aeSJan Lentfer os_free(in_msg); 159*6d49e1aeSJan Lentfer in_msg = NULL; 160*6d49e1aeSJan Lentfer 161*6d49e1aeSJan Lentfer msg = tlsv1_server_handshake_write(conn, out_len); 162*6d49e1aeSJan Lentfer 163*6d49e1aeSJan Lentfer failed: 164*6d49e1aeSJan Lentfer os_free(in_msg); 165*6d49e1aeSJan Lentfer if (conn->alert_level) { 166*6d49e1aeSJan Lentfer if (conn->state == FAILED) { 167*6d49e1aeSJan Lentfer /* Avoid alert loops */ 168*6d49e1aeSJan Lentfer wpa_printf(MSG_DEBUG, "TLSv1: Drop alert loop"); 169*6d49e1aeSJan Lentfer os_free(msg); 170*6d49e1aeSJan Lentfer return NULL; 171*6d49e1aeSJan Lentfer } 172*6d49e1aeSJan Lentfer conn->state = FAILED; 173*6d49e1aeSJan Lentfer os_free(msg); 174*6d49e1aeSJan Lentfer msg = tlsv1_server_send_alert(conn, conn->alert_level, 175*6d49e1aeSJan Lentfer conn->alert_description, 176*6d49e1aeSJan Lentfer out_len); 177*6d49e1aeSJan Lentfer } 178*6d49e1aeSJan Lentfer 179*6d49e1aeSJan Lentfer return msg; 180*6d49e1aeSJan Lentfer } 181*6d49e1aeSJan Lentfer 182*6d49e1aeSJan Lentfer 183*6d49e1aeSJan Lentfer /** 184*6d49e1aeSJan Lentfer * tlsv1_server_encrypt - Encrypt data into TLS tunnel 185*6d49e1aeSJan Lentfer * @conn: TLSv1 server connection data from tlsv1_server_init() 186*6d49e1aeSJan Lentfer * @in_data: Pointer to plaintext data to be encrypted 187*6d49e1aeSJan Lentfer * @in_len: Input buffer length 188*6d49e1aeSJan Lentfer * @out_data: Pointer to output buffer (encrypted TLS data) 189*6d49e1aeSJan Lentfer * @out_len: Maximum out_data length 190*6d49e1aeSJan Lentfer * Returns: Number of bytes written to out_data, -1 on failure 191*6d49e1aeSJan Lentfer * 192*6d49e1aeSJan Lentfer * This function is used after TLS handshake has been completed successfully to 193*6d49e1aeSJan Lentfer * send data in the encrypted tunnel. 194*6d49e1aeSJan Lentfer */ 195*6d49e1aeSJan Lentfer int tlsv1_server_encrypt(struct tlsv1_server *conn, 196*6d49e1aeSJan Lentfer const u8 *in_data, size_t in_len, 197*6d49e1aeSJan Lentfer u8 *out_data, size_t out_len) 198*6d49e1aeSJan Lentfer { 199*6d49e1aeSJan Lentfer size_t rlen; 200*6d49e1aeSJan Lentfer 201*6d49e1aeSJan Lentfer wpa_hexdump_key(MSG_MSGDUMP, "TLSv1: Plaintext AppData", 202*6d49e1aeSJan Lentfer in_data, in_len); 203*6d49e1aeSJan Lentfer 204*6d49e1aeSJan Lentfer os_memcpy(out_data + TLS_RECORD_HEADER_LEN, in_data, in_len); 205*6d49e1aeSJan Lentfer 206*6d49e1aeSJan Lentfer if (tlsv1_record_send(&conn->rl, TLS_CONTENT_TYPE_APPLICATION_DATA, 207*6d49e1aeSJan Lentfer out_data, out_len, in_len, &rlen) < 0) { 208*6d49e1aeSJan Lentfer wpa_printf(MSG_DEBUG, "TLSv1: Failed to create a record"); 209*6d49e1aeSJan Lentfer tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 210*6d49e1aeSJan Lentfer TLS_ALERT_INTERNAL_ERROR); 211*6d49e1aeSJan Lentfer return -1; 212*6d49e1aeSJan Lentfer } 213*6d49e1aeSJan Lentfer 214*6d49e1aeSJan Lentfer return rlen; 215*6d49e1aeSJan Lentfer } 216*6d49e1aeSJan Lentfer 217*6d49e1aeSJan Lentfer 218*6d49e1aeSJan Lentfer /** 219*6d49e1aeSJan Lentfer * tlsv1_server_decrypt - Decrypt data from TLS tunnel 220*6d49e1aeSJan Lentfer * @conn: TLSv1 server connection data from tlsv1_server_init() 221*6d49e1aeSJan Lentfer * @in_data: Pointer to input buffer (encrypted TLS data) 222*6d49e1aeSJan Lentfer * @in_len: Input buffer length 223*6d49e1aeSJan Lentfer * @out_data: Pointer to output buffer (decrypted data from TLS tunnel) 224*6d49e1aeSJan Lentfer * @out_len: Maximum out_data length 225*6d49e1aeSJan Lentfer * Returns: Number of bytes written to out_data, -1 on failure 226*6d49e1aeSJan Lentfer * 227*6d49e1aeSJan Lentfer * This function is used after TLS handshake has been completed successfully to 228*6d49e1aeSJan Lentfer * receive data from the encrypted tunnel. 229*6d49e1aeSJan Lentfer */ 230*6d49e1aeSJan Lentfer int tlsv1_server_decrypt(struct tlsv1_server *conn, 231*6d49e1aeSJan Lentfer const u8 *in_data, size_t in_len, 232*6d49e1aeSJan Lentfer u8 *out_data, size_t out_len) 233*6d49e1aeSJan Lentfer { 234*6d49e1aeSJan Lentfer const u8 *in_end, *pos; 235*6d49e1aeSJan Lentfer int res; 236*6d49e1aeSJan Lentfer u8 alert, *out_end, *out_pos; 237*6d49e1aeSJan Lentfer size_t olen; 238*6d49e1aeSJan Lentfer 239*6d49e1aeSJan Lentfer pos = in_data; 240*6d49e1aeSJan Lentfer in_end = in_data + in_len; 241*6d49e1aeSJan Lentfer out_pos = out_data; 242*6d49e1aeSJan Lentfer out_end = out_data + out_len; 243*6d49e1aeSJan Lentfer 244*6d49e1aeSJan Lentfer while (pos < in_end) { 245*6d49e1aeSJan Lentfer if (pos[0] != TLS_CONTENT_TYPE_APPLICATION_DATA) { 246*6d49e1aeSJan Lentfer wpa_printf(MSG_DEBUG, "TLSv1: Unexpected content type " 247*6d49e1aeSJan Lentfer "0x%x", pos[0]); 248*6d49e1aeSJan Lentfer tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 249*6d49e1aeSJan Lentfer TLS_ALERT_UNEXPECTED_MESSAGE); 250*6d49e1aeSJan Lentfer return -1; 251*6d49e1aeSJan Lentfer } 252*6d49e1aeSJan Lentfer 253*6d49e1aeSJan Lentfer olen = out_end - out_pos; 254*6d49e1aeSJan Lentfer res = tlsv1_record_receive(&conn->rl, pos, in_end - pos, 255*6d49e1aeSJan Lentfer out_pos, &olen, &alert); 256*6d49e1aeSJan Lentfer if (res < 0) { 257*6d49e1aeSJan Lentfer wpa_printf(MSG_DEBUG, "TLSv1: Record layer processing " 258*6d49e1aeSJan Lentfer "failed"); 259*6d49e1aeSJan Lentfer tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, alert); 260*6d49e1aeSJan Lentfer return -1; 261*6d49e1aeSJan Lentfer } 262*6d49e1aeSJan Lentfer out_pos += olen; 263*6d49e1aeSJan Lentfer if (out_pos > out_end) { 264*6d49e1aeSJan Lentfer wpa_printf(MSG_DEBUG, "TLSv1: Buffer not large enough " 265*6d49e1aeSJan Lentfer "for processing the received record"); 266*6d49e1aeSJan Lentfer tlsv1_server_alert(conn, TLS_ALERT_LEVEL_FATAL, 267*6d49e1aeSJan Lentfer TLS_ALERT_INTERNAL_ERROR); 268*6d49e1aeSJan Lentfer return -1; 269*6d49e1aeSJan Lentfer } 270*6d49e1aeSJan Lentfer 271*6d49e1aeSJan Lentfer pos += TLS_RECORD_HEADER_LEN + WPA_GET_BE16(pos + 3); 272*6d49e1aeSJan Lentfer } 273*6d49e1aeSJan Lentfer 274*6d49e1aeSJan Lentfer return out_pos - out_data; 275*6d49e1aeSJan Lentfer } 276*6d49e1aeSJan Lentfer 277*6d49e1aeSJan Lentfer 278*6d49e1aeSJan Lentfer /** 279*6d49e1aeSJan Lentfer * tlsv1_server_global_init - Initialize TLSv1 server 280*6d49e1aeSJan Lentfer * Returns: 0 on success, -1 on failure 281*6d49e1aeSJan Lentfer * 282*6d49e1aeSJan Lentfer * This function must be called before using any other TLSv1 server functions. 283*6d49e1aeSJan Lentfer */ 284*6d49e1aeSJan Lentfer int tlsv1_server_global_init(void) 285*6d49e1aeSJan Lentfer { 286*6d49e1aeSJan Lentfer return crypto_global_init(); 287*6d49e1aeSJan Lentfer } 288*6d49e1aeSJan Lentfer 289*6d49e1aeSJan Lentfer 290*6d49e1aeSJan Lentfer /** 291*6d49e1aeSJan Lentfer * tlsv1_server_global_deinit - Deinitialize TLSv1 server 292*6d49e1aeSJan Lentfer * 293*6d49e1aeSJan Lentfer * This function can be used to deinitialize the TLSv1 server that was 294*6d49e1aeSJan Lentfer * initialized by calling tlsv1_server_global_init(). No TLSv1 server functions 295*6d49e1aeSJan Lentfer * can be called after this before calling tlsv1_server_global_init() again. 296*6d49e1aeSJan Lentfer */ 297*6d49e1aeSJan Lentfer void tlsv1_server_global_deinit(void) 298*6d49e1aeSJan Lentfer { 299*6d49e1aeSJan Lentfer crypto_global_deinit(); 300*6d49e1aeSJan Lentfer } 301*6d49e1aeSJan Lentfer 302*6d49e1aeSJan Lentfer 303*6d49e1aeSJan Lentfer /** 304*6d49e1aeSJan Lentfer * tlsv1_server_init - Initialize TLSv1 server connection 305*6d49e1aeSJan Lentfer * @cred: Pointer to server credentials from tlsv1_server_cred_alloc() 306*6d49e1aeSJan Lentfer * Returns: Pointer to TLSv1 server connection data or %NULL on failure 307*6d49e1aeSJan Lentfer */ 308*6d49e1aeSJan Lentfer struct tlsv1_server * tlsv1_server_init(struct tlsv1_credentials *cred) 309*6d49e1aeSJan Lentfer { 310*6d49e1aeSJan Lentfer struct tlsv1_server *conn; 311*6d49e1aeSJan Lentfer size_t count; 312*6d49e1aeSJan Lentfer u16 *suites; 313*6d49e1aeSJan Lentfer 314*6d49e1aeSJan Lentfer conn = os_zalloc(sizeof(*conn)); 315*6d49e1aeSJan Lentfer if (conn == NULL) 316*6d49e1aeSJan Lentfer return NULL; 317*6d49e1aeSJan Lentfer 318*6d49e1aeSJan Lentfer conn->cred = cred; 319*6d49e1aeSJan Lentfer 320*6d49e1aeSJan Lentfer conn->state = CLIENT_HELLO; 321*6d49e1aeSJan Lentfer 322*6d49e1aeSJan Lentfer if (tls_verify_hash_init(&conn->verify) < 0) { 323*6d49e1aeSJan Lentfer wpa_printf(MSG_DEBUG, "TLSv1: Failed to initialize verify " 324*6d49e1aeSJan Lentfer "hash"); 325*6d49e1aeSJan Lentfer os_free(conn); 326*6d49e1aeSJan Lentfer return NULL; 327*6d49e1aeSJan Lentfer } 328*6d49e1aeSJan Lentfer 329*6d49e1aeSJan Lentfer count = 0; 330*6d49e1aeSJan Lentfer suites = conn->cipher_suites; 331*6d49e1aeSJan Lentfer #ifndef CONFIG_CRYPTO_INTERNAL 332*6d49e1aeSJan Lentfer suites[count++] = TLS_RSA_WITH_AES_256_CBC_SHA; 333*6d49e1aeSJan Lentfer #endif /* CONFIG_CRYPTO_INTERNAL */ 334*6d49e1aeSJan Lentfer suites[count++] = TLS_RSA_WITH_AES_128_CBC_SHA; 335*6d49e1aeSJan Lentfer suites[count++] = TLS_RSA_WITH_3DES_EDE_CBC_SHA; 336*6d49e1aeSJan Lentfer suites[count++] = TLS_RSA_WITH_RC4_128_SHA; 337*6d49e1aeSJan Lentfer suites[count++] = TLS_RSA_WITH_RC4_128_MD5; 338*6d49e1aeSJan Lentfer conn->num_cipher_suites = count; 339*6d49e1aeSJan Lentfer 340*6d49e1aeSJan Lentfer return conn; 341*6d49e1aeSJan Lentfer } 342*6d49e1aeSJan Lentfer 343*6d49e1aeSJan Lentfer 344*6d49e1aeSJan Lentfer static void tlsv1_server_clear_data(struct tlsv1_server *conn) 345*6d49e1aeSJan Lentfer { 346*6d49e1aeSJan Lentfer tlsv1_record_set_cipher_suite(&conn->rl, TLS_NULL_WITH_NULL_NULL); 347*6d49e1aeSJan Lentfer tlsv1_record_change_write_cipher(&conn->rl); 348*6d49e1aeSJan Lentfer tlsv1_record_change_read_cipher(&conn->rl); 349*6d49e1aeSJan Lentfer tls_verify_hash_free(&conn->verify); 350*6d49e1aeSJan Lentfer 351*6d49e1aeSJan Lentfer crypto_public_key_free(conn->client_rsa_key); 352*6d49e1aeSJan Lentfer conn->client_rsa_key = NULL; 353*6d49e1aeSJan Lentfer 354*6d49e1aeSJan Lentfer os_free(conn->session_ticket); 355*6d49e1aeSJan Lentfer conn->session_ticket = NULL; 356*6d49e1aeSJan Lentfer conn->session_ticket_len = 0; 357*6d49e1aeSJan Lentfer conn->use_session_ticket = 0; 358*6d49e1aeSJan Lentfer 359*6d49e1aeSJan Lentfer os_free(conn->dh_secret); 360*6d49e1aeSJan Lentfer conn->dh_secret = NULL; 361*6d49e1aeSJan Lentfer conn->dh_secret_len = 0; 362*6d49e1aeSJan Lentfer } 363*6d49e1aeSJan Lentfer 364*6d49e1aeSJan Lentfer 365*6d49e1aeSJan Lentfer /** 366*6d49e1aeSJan Lentfer * tlsv1_server_deinit - Deinitialize TLSv1 server connection 367*6d49e1aeSJan Lentfer * @conn: TLSv1 server connection data from tlsv1_server_init() 368*6d49e1aeSJan Lentfer */ 369*6d49e1aeSJan Lentfer void tlsv1_server_deinit(struct tlsv1_server *conn) 370*6d49e1aeSJan Lentfer { 371*6d49e1aeSJan Lentfer tlsv1_server_clear_data(conn); 372*6d49e1aeSJan Lentfer os_free(conn); 373*6d49e1aeSJan Lentfer } 374*6d49e1aeSJan Lentfer 375*6d49e1aeSJan Lentfer 376*6d49e1aeSJan Lentfer /** 377*6d49e1aeSJan Lentfer * tlsv1_server_established - Check whether connection has been established 378*6d49e1aeSJan Lentfer * @conn: TLSv1 server connection data from tlsv1_server_init() 379*6d49e1aeSJan Lentfer * Returns: 1 if connection is established, 0 if not 380*6d49e1aeSJan Lentfer */ 381*6d49e1aeSJan Lentfer int tlsv1_server_established(struct tlsv1_server *conn) 382*6d49e1aeSJan Lentfer { 383*6d49e1aeSJan Lentfer return conn->state == ESTABLISHED; 384*6d49e1aeSJan Lentfer } 385*6d49e1aeSJan Lentfer 386*6d49e1aeSJan Lentfer 387*6d49e1aeSJan Lentfer /** 388*6d49e1aeSJan Lentfer * tlsv1_server_prf - Use TLS-PRF to derive keying material 389*6d49e1aeSJan Lentfer * @conn: TLSv1 server connection data from tlsv1_server_init() 390*6d49e1aeSJan Lentfer * @label: Label (e.g., description of the key) for PRF 391*6d49e1aeSJan Lentfer * @server_random_first: seed is 0 = client_random|server_random, 392*6d49e1aeSJan Lentfer * 1 = server_random|client_random 393*6d49e1aeSJan Lentfer * @out: Buffer for output data from TLS-PRF 394*6d49e1aeSJan Lentfer * @out_len: Length of the output buffer 395*6d49e1aeSJan Lentfer * Returns: 0 on success, -1 on failure 396*6d49e1aeSJan Lentfer */ 397*6d49e1aeSJan Lentfer int tlsv1_server_prf(struct tlsv1_server *conn, const char *label, 398*6d49e1aeSJan Lentfer int server_random_first, u8 *out, size_t out_len) 399*6d49e1aeSJan Lentfer { 400*6d49e1aeSJan Lentfer u8 seed[2 * TLS_RANDOM_LEN]; 401*6d49e1aeSJan Lentfer 402*6d49e1aeSJan Lentfer if (conn->state != ESTABLISHED) 403*6d49e1aeSJan Lentfer return -1; 404*6d49e1aeSJan Lentfer 405*6d49e1aeSJan Lentfer if (server_random_first) { 406*6d49e1aeSJan Lentfer os_memcpy(seed, conn->server_random, TLS_RANDOM_LEN); 407*6d49e1aeSJan Lentfer os_memcpy(seed + TLS_RANDOM_LEN, conn->client_random, 408*6d49e1aeSJan Lentfer TLS_RANDOM_LEN); 409*6d49e1aeSJan Lentfer } else { 410*6d49e1aeSJan Lentfer os_memcpy(seed, conn->client_random, TLS_RANDOM_LEN); 411*6d49e1aeSJan Lentfer os_memcpy(seed + TLS_RANDOM_LEN, conn->server_random, 412*6d49e1aeSJan Lentfer TLS_RANDOM_LEN); 413*6d49e1aeSJan Lentfer } 414*6d49e1aeSJan Lentfer 415*6d49e1aeSJan Lentfer return tls_prf(conn->master_secret, TLS_MASTER_SECRET_LEN, 416*6d49e1aeSJan Lentfer label, seed, 2 * TLS_RANDOM_LEN, out, out_len); 417*6d49e1aeSJan Lentfer } 418*6d49e1aeSJan Lentfer 419*6d49e1aeSJan Lentfer 420*6d49e1aeSJan Lentfer /** 421*6d49e1aeSJan Lentfer * tlsv1_server_get_cipher - Get current cipher name 422*6d49e1aeSJan Lentfer * @conn: TLSv1 server connection data from tlsv1_server_init() 423*6d49e1aeSJan Lentfer * @buf: Buffer for the cipher name 424*6d49e1aeSJan Lentfer * @buflen: buf size 425*6d49e1aeSJan Lentfer * Returns: 0 on success, -1 on failure 426*6d49e1aeSJan Lentfer * 427*6d49e1aeSJan Lentfer * Get the name of the currently used cipher. 428*6d49e1aeSJan Lentfer */ 429*6d49e1aeSJan Lentfer int tlsv1_server_get_cipher(struct tlsv1_server *conn, char *buf, 430*6d49e1aeSJan Lentfer size_t buflen) 431*6d49e1aeSJan Lentfer { 432*6d49e1aeSJan Lentfer char *cipher; 433*6d49e1aeSJan Lentfer 434*6d49e1aeSJan Lentfer switch (conn->rl.cipher_suite) { 435*6d49e1aeSJan Lentfer case TLS_RSA_WITH_RC4_128_MD5: 436*6d49e1aeSJan Lentfer cipher = "RC4-MD5"; 437*6d49e1aeSJan Lentfer break; 438*6d49e1aeSJan Lentfer case TLS_RSA_WITH_RC4_128_SHA: 439*6d49e1aeSJan Lentfer cipher = "RC4-SHA"; 440*6d49e1aeSJan Lentfer break; 441*6d49e1aeSJan Lentfer case TLS_RSA_WITH_DES_CBC_SHA: 442*6d49e1aeSJan Lentfer cipher = "DES-CBC-SHA"; 443*6d49e1aeSJan Lentfer break; 444*6d49e1aeSJan Lentfer case TLS_RSA_WITH_3DES_EDE_CBC_SHA: 445*6d49e1aeSJan Lentfer cipher = "DES-CBC3-SHA"; 446*6d49e1aeSJan Lentfer break; 447*6d49e1aeSJan Lentfer case TLS_DH_anon_WITH_AES_128_CBC_SHA: 448*6d49e1aeSJan Lentfer cipher = "ADH-AES-128-SHA"; 449*6d49e1aeSJan Lentfer break; 450*6d49e1aeSJan Lentfer case TLS_RSA_WITH_AES_256_CBC_SHA: 451*6d49e1aeSJan Lentfer cipher = "AES-256-SHA"; 452*6d49e1aeSJan Lentfer break; 453*6d49e1aeSJan Lentfer case TLS_RSA_WITH_AES_128_CBC_SHA: 454*6d49e1aeSJan Lentfer cipher = "AES-128-SHA"; 455*6d49e1aeSJan Lentfer break; 456*6d49e1aeSJan Lentfer default: 457*6d49e1aeSJan Lentfer return -1; 458*6d49e1aeSJan Lentfer } 459*6d49e1aeSJan Lentfer 460*6d49e1aeSJan Lentfer if (os_strlcpy(buf, cipher, buflen) >= buflen) 461*6d49e1aeSJan Lentfer return -1; 462*6d49e1aeSJan Lentfer return 0; 463*6d49e1aeSJan Lentfer } 464*6d49e1aeSJan Lentfer 465*6d49e1aeSJan Lentfer 466*6d49e1aeSJan Lentfer /** 467*6d49e1aeSJan Lentfer * tlsv1_server_shutdown - Shutdown TLS connection 468*6d49e1aeSJan Lentfer * @conn: TLSv1 server connection data from tlsv1_server_init() 469*6d49e1aeSJan Lentfer * Returns: 0 on success, -1 on failure 470*6d49e1aeSJan Lentfer */ 471*6d49e1aeSJan Lentfer int tlsv1_server_shutdown(struct tlsv1_server *conn) 472*6d49e1aeSJan Lentfer { 473*6d49e1aeSJan Lentfer conn->state = CLIENT_HELLO; 474*6d49e1aeSJan Lentfer 475*6d49e1aeSJan Lentfer if (tls_verify_hash_init(&conn->verify) < 0) { 476*6d49e1aeSJan Lentfer wpa_printf(MSG_DEBUG, "TLSv1: Failed to re-initialize verify " 477*6d49e1aeSJan Lentfer "hash"); 478*6d49e1aeSJan Lentfer return -1; 479*6d49e1aeSJan Lentfer } 480*6d49e1aeSJan Lentfer 481*6d49e1aeSJan Lentfer tlsv1_server_clear_data(conn); 482*6d49e1aeSJan Lentfer 483*6d49e1aeSJan Lentfer return 0; 484*6d49e1aeSJan Lentfer } 485*6d49e1aeSJan Lentfer 486*6d49e1aeSJan Lentfer 487*6d49e1aeSJan Lentfer /** 488*6d49e1aeSJan Lentfer * tlsv1_server_resumed - Was session resumption used 489*6d49e1aeSJan Lentfer * @conn: TLSv1 server connection data from tlsv1_server_init() 490*6d49e1aeSJan Lentfer * Returns: 1 if current session used session resumption, 0 if not 491*6d49e1aeSJan Lentfer */ 492*6d49e1aeSJan Lentfer int tlsv1_server_resumed(struct tlsv1_server *conn) 493*6d49e1aeSJan Lentfer { 494*6d49e1aeSJan Lentfer return 0; 495*6d49e1aeSJan Lentfer } 496*6d49e1aeSJan Lentfer 497*6d49e1aeSJan Lentfer 498*6d49e1aeSJan Lentfer /** 499*6d49e1aeSJan Lentfer * tlsv1_server_get_keys - Get master key and random data from TLS connection 500*6d49e1aeSJan Lentfer * @conn: TLSv1 server connection data from tlsv1_server_init() 501*6d49e1aeSJan Lentfer * @keys: Structure of key/random data (filled on success) 502*6d49e1aeSJan Lentfer * Returns: 0 on success, -1 on failure 503*6d49e1aeSJan Lentfer */ 504*6d49e1aeSJan Lentfer int tlsv1_server_get_keys(struct tlsv1_server *conn, struct tls_keys *keys) 505*6d49e1aeSJan Lentfer { 506*6d49e1aeSJan Lentfer os_memset(keys, 0, sizeof(*keys)); 507*6d49e1aeSJan Lentfer if (conn->state == CLIENT_HELLO) 508*6d49e1aeSJan Lentfer return -1; 509*6d49e1aeSJan Lentfer 510*6d49e1aeSJan Lentfer keys->client_random = conn->client_random; 511*6d49e1aeSJan Lentfer keys->client_random_len = TLS_RANDOM_LEN; 512*6d49e1aeSJan Lentfer 513*6d49e1aeSJan Lentfer if (conn->state != SERVER_HELLO) { 514*6d49e1aeSJan Lentfer keys->server_random = conn->server_random; 515*6d49e1aeSJan Lentfer keys->server_random_len = TLS_RANDOM_LEN; 516*6d49e1aeSJan Lentfer keys->master_key = conn->master_secret; 517*6d49e1aeSJan Lentfer keys->master_key_len = TLS_MASTER_SECRET_LEN; 518*6d49e1aeSJan Lentfer } 519*6d49e1aeSJan Lentfer 520*6d49e1aeSJan Lentfer return 0; 521*6d49e1aeSJan Lentfer } 522*6d49e1aeSJan Lentfer 523*6d49e1aeSJan Lentfer 524*6d49e1aeSJan Lentfer /** 525*6d49e1aeSJan Lentfer * tlsv1_server_get_keyblock_size - Get TLS key_block size 526*6d49e1aeSJan Lentfer * @conn: TLSv1 server connection data from tlsv1_server_init() 527*6d49e1aeSJan Lentfer * Returns: Size of the key_block for the negotiated cipher suite or -1 on 528*6d49e1aeSJan Lentfer * failure 529*6d49e1aeSJan Lentfer */ 530*6d49e1aeSJan Lentfer int tlsv1_server_get_keyblock_size(struct tlsv1_server *conn) 531*6d49e1aeSJan Lentfer { 532*6d49e1aeSJan Lentfer if (conn->state == CLIENT_HELLO || conn->state == SERVER_HELLO) 533*6d49e1aeSJan Lentfer return -1; 534*6d49e1aeSJan Lentfer 535*6d49e1aeSJan Lentfer return 2 * (conn->rl.hash_size + conn->rl.key_material_len + 536*6d49e1aeSJan Lentfer conn->rl.iv_size); 537*6d49e1aeSJan Lentfer } 538*6d49e1aeSJan Lentfer 539*6d49e1aeSJan Lentfer 540*6d49e1aeSJan Lentfer /** 541*6d49e1aeSJan Lentfer * tlsv1_server_set_cipher_list - Configure acceptable cipher suites 542*6d49e1aeSJan Lentfer * @conn: TLSv1 server connection data from tlsv1_server_init() 543*6d49e1aeSJan Lentfer * @ciphers: Zero (TLS_CIPHER_NONE) terminated list of allowed ciphers 544*6d49e1aeSJan Lentfer * (TLS_CIPHER_*). 545*6d49e1aeSJan Lentfer * Returns: 0 on success, -1 on failure 546*6d49e1aeSJan Lentfer */ 547*6d49e1aeSJan Lentfer int tlsv1_server_set_cipher_list(struct tlsv1_server *conn, u8 *ciphers) 548*6d49e1aeSJan Lentfer { 549*6d49e1aeSJan Lentfer #ifdef EAP_FAST 550*6d49e1aeSJan Lentfer size_t count; 551*6d49e1aeSJan Lentfer u16 *suites; 552*6d49e1aeSJan Lentfer 553*6d49e1aeSJan Lentfer /* TODO: implement proper configuration of cipher suites */ 554*6d49e1aeSJan Lentfer if (ciphers[0] == TLS_CIPHER_ANON_DH_AES128_SHA) { 555*6d49e1aeSJan Lentfer count = 0; 556*6d49e1aeSJan Lentfer suites = conn->cipher_suites; 557*6d49e1aeSJan Lentfer #ifndef CONFIG_CRYPTO_INTERNAL 558*6d49e1aeSJan Lentfer suites[count++] = TLS_RSA_WITH_AES_256_CBC_SHA; 559*6d49e1aeSJan Lentfer #endif /* CONFIG_CRYPTO_INTERNAL */ 560*6d49e1aeSJan Lentfer suites[count++] = TLS_RSA_WITH_AES_128_CBC_SHA; 561*6d49e1aeSJan Lentfer suites[count++] = TLS_RSA_WITH_3DES_EDE_CBC_SHA; 562*6d49e1aeSJan Lentfer suites[count++] = TLS_RSA_WITH_RC4_128_SHA; 563*6d49e1aeSJan Lentfer suites[count++] = TLS_RSA_WITH_RC4_128_MD5; 564*6d49e1aeSJan Lentfer #ifndef CONFIG_CRYPTO_INTERNAL 565*6d49e1aeSJan Lentfer suites[count++] = TLS_DH_anon_WITH_AES_256_CBC_SHA; 566*6d49e1aeSJan Lentfer #endif /* CONFIG_CRYPTO_INTERNAL */ 567*6d49e1aeSJan Lentfer suites[count++] = TLS_DH_anon_WITH_AES_128_CBC_SHA; 568*6d49e1aeSJan Lentfer suites[count++] = TLS_DH_anon_WITH_3DES_EDE_CBC_SHA; 569*6d49e1aeSJan Lentfer suites[count++] = TLS_DH_anon_WITH_RC4_128_MD5; 570*6d49e1aeSJan Lentfer suites[count++] = TLS_DH_anon_WITH_DES_CBC_SHA; 571*6d49e1aeSJan Lentfer conn->num_cipher_suites = count; 572*6d49e1aeSJan Lentfer } 573*6d49e1aeSJan Lentfer 574*6d49e1aeSJan Lentfer return 0; 575*6d49e1aeSJan Lentfer #else /* EAP_FAST */ 576*6d49e1aeSJan Lentfer return -1; 577*6d49e1aeSJan Lentfer #endif /* EAP_FAST */ 578*6d49e1aeSJan Lentfer } 579*6d49e1aeSJan Lentfer 580*6d49e1aeSJan Lentfer 581*6d49e1aeSJan Lentfer int tlsv1_server_set_verify(struct tlsv1_server *conn, int verify_peer) 582*6d49e1aeSJan Lentfer { 583*6d49e1aeSJan Lentfer conn->verify_peer = verify_peer; 584*6d49e1aeSJan Lentfer return 0; 585*6d49e1aeSJan Lentfer } 586*6d49e1aeSJan Lentfer 587*6d49e1aeSJan Lentfer 588*6d49e1aeSJan Lentfer void tlsv1_server_set_session_ticket_cb(struct tlsv1_server *conn, 589*6d49e1aeSJan Lentfer tlsv1_server_session_ticket_cb cb, 590*6d49e1aeSJan Lentfer void *ctx) 591*6d49e1aeSJan Lentfer { 592*6d49e1aeSJan Lentfer wpa_printf(MSG_DEBUG, "TLSv1: SessionTicket callback set %p (ctx %p)", 593*6d49e1aeSJan Lentfer cb, ctx); 594*6d49e1aeSJan Lentfer conn->session_ticket_cb = cb; 595*6d49e1aeSJan Lentfer conn->session_ticket_cb_ctx = ctx; 596*6d49e1aeSJan Lentfer } 597