1*6d49e1aeSJan Lentfer /* 2*6d49e1aeSJan Lentfer * TLSv1 common definitions 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 #ifndef TLSV1_COMMON_H 16*6d49e1aeSJan Lentfer #define TLSV1_COMMON_H 17*6d49e1aeSJan Lentfer 18*6d49e1aeSJan Lentfer #include "crypto.h" 19*6d49e1aeSJan Lentfer 20*6d49e1aeSJan Lentfer #define TLS_VERSION 0x0301 /* TLSv1 */ 21*6d49e1aeSJan Lentfer #define TLS_RANDOM_LEN 32 22*6d49e1aeSJan Lentfer #define TLS_PRE_MASTER_SECRET_LEN 48 23*6d49e1aeSJan Lentfer #define TLS_MASTER_SECRET_LEN 48 24*6d49e1aeSJan Lentfer #define TLS_SESSION_ID_MAX_LEN 32 25*6d49e1aeSJan Lentfer #define TLS_VERIFY_DATA_LEN 12 26*6d49e1aeSJan Lentfer 27*6d49e1aeSJan Lentfer /* HandshakeType */ 28*6d49e1aeSJan Lentfer enum { 29*6d49e1aeSJan Lentfer TLS_HANDSHAKE_TYPE_HELLO_REQUEST = 0, 30*6d49e1aeSJan Lentfer TLS_HANDSHAKE_TYPE_CLIENT_HELLO = 1, 31*6d49e1aeSJan Lentfer TLS_HANDSHAKE_TYPE_SERVER_HELLO = 2, 32*6d49e1aeSJan Lentfer TLS_HANDSHAKE_TYPE_NEW_SESSION_TICKET = 4 /* RFC 4507 */, 33*6d49e1aeSJan Lentfer TLS_HANDSHAKE_TYPE_CERTIFICATE = 11, 34*6d49e1aeSJan Lentfer TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE = 12, 35*6d49e1aeSJan Lentfer TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST = 13, 36*6d49e1aeSJan Lentfer TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE = 14, 37*6d49e1aeSJan Lentfer TLS_HANDSHAKE_TYPE_CERTIFICATE_VERIFY = 15, 38*6d49e1aeSJan Lentfer TLS_HANDSHAKE_TYPE_CLIENT_KEY_EXCHANGE = 16, 39*6d49e1aeSJan Lentfer TLS_HANDSHAKE_TYPE_FINISHED = 20, 40*6d49e1aeSJan Lentfer TLS_HANDSHAKE_TYPE_CERTIFICATE_URL = 21 /* RFC 4366 */, 41*6d49e1aeSJan Lentfer TLS_HANDSHAKE_TYPE_CERTIFICATE_STATUS = 22 /* RFC 4366 */ 42*6d49e1aeSJan Lentfer }; 43*6d49e1aeSJan Lentfer 44*6d49e1aeSJan Lentfer /* CipherSuite */ 45*6d49e1aeSJan Lentfer #define TLS_NULL_WITH_NULL_NULL 0x0000 /* RFC 2246 */ 46*6d49e1aeSJan Lentfer #define TLS_RSA_WITH_NULL_MD5 0x0001 /* RFC 2246 */ 47*6d49e1aeSJan Lentfer #define TLS_RSA_WITH_NULL_SHA 0x0002 /* RFC 2246 */ 48*6d49e1aeSJan Lentfer #define TLS_RSA_EXPORT_WITH_RC4_40_MD5 0x0003 /* RFC 2246 */ 49*6d49e1aeSJan Lentfer #define TLS_RSA_WITH_RC4_128_MD5 0x0004 /* RFC 2246 */ 50*6d49e1aeSJan Lentfer #define TLS_RSA_WITH_RC4_128_SHA 0x0005 /* RFC 2246 */ 51*6d49e1aeSJan Lentfer #define TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 0x0006 /* RFC 2246 */ 52*6d49e1aeSJan Lentfer #define TLS_RSA_WITH_IDEA_CBC_SHA 0x0007 /* RFC 2246 */ 53*6d49e1aeSJan Lentfer #define TLS_RSA_EXPORT_WITH_DES40_CBC_SHA 0x0008 /* RFC 2246 */ 54*6d49e1aeSJan Lentfer #define TLS_RSA_WITH_DES_CBC_SHA 0x0009 /* RFC 2246 */ 55*6d49e1aeSJan Lentfer #define TLS_RSA_WITH_3DES_EDE_CBC_SHA 0x000A /* RFC 2246 */ 56*6d49e1aeSJan Lentfer #define TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA 0x000B /* RFC 2246 */ 57*6d49e1aeSJan Lentfer #define TLS_DH_DSS_WITH_DES_CBC_SHA 0x000C /* RFC 2246 */ 58*6d49e1aeSJan Lentfer #define TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA 0x000D /* RFC 2246 */ 59*6d49e1aeSJan Lentfer #define TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA 0x000E /* RFC 2246 */ 60*6d49e1aeSJan Lentfer #define TLS_DH_RSA_WITH_DES_CBC_SHA 0x000F /* RFC 2246 */ 61*6d49e1aeSJan Lentfer #define TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA 0x0010 /* RFC 2246 */ 62*6d49e1aeSJan Lentfer #define TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA 0x0011 /* RFC 2246 */ 63*6d49e1aeSJan Lentfer #define TLS_DHE_DSS_WITH_DES_CBC_SHA 0x0012 /* RFC 2246 */ 64*6d49e1aeSJan Lentfer #define TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA 0x0013 /* RFC 2246 */ 65*6d49e1aeSJan Lentfer #define TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA 0x0014 /* RFC 2246 */ 66*6d49e1aeSJan Lentfer #define TLS_DHE_RSA_WITH_DES_CBC_SHA 0x0015 /* RFC 2246 */ 67*6d49e1aeSJan Lentfer #define TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA 0x0016 /* RFC 2246 */ 68*6d49e1aeSJan Lentfer #define TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 0x0017 /* RFC 2246 */ 69*6d49e1aeSJan Lentfer #define TLS_DH_anon_WITH_RC4_128_MD5 0x0018 /* RFC 2246 */ 70*6d49e1aeSJan Lentfer #define TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA 0x0019 /* RFC 2246 */ 71*6d49e1aeSJan Lentfer #define TLS_DH_anon_WITH_DES_CBC_SHA 0x001A /* RFC 2246 */ 72*6d49e1aeSJan Lentfer #define TLS_DH_anon_WITH_3DES_EDE_CBC_SHA 0x001B /* RFC 2246 */ 73*6d49e1aeSJan Lentfer #define TLS_RSA_WITH_AES_128_CBC_SHA 0x002F /* RFC 3268 */ 74*6d49e1aeSJan Lentfer #define TLS_DH_DSS_WITH_AES_128_CBC_SHA 0x0030 /* RFC 3268 */ 75*6d49e1aeSJan Lentfer #define TLS_DH_RSA_WITH_AES_128_CBC_SHA 0x0031 /* RFC 3268 */ 76*6d49e1aeSJan Lentfer #define TLS_DHE_DSS_WITH_AES_128_CBC_SHA 0x0032 /* RFC 3268 */ 77*6d49e1aeSJan Lentfer #define TLS_DHE_RSA_WITH_AES_128_CBC_SHA 0x0033 /* RFC 3268 */ 78*6d49e1aeSJan Lentfer #define TLS_DH_anon_WITH_AES_128_CBC_SHA 0x0034 /* RFC 3268 */ 79*6d49e1aeSJan Lentfer #define TLS_RSA_WITH_AES_256_CBC_SHA 0x0035 /* RFC 3268 */ 80*6d49e1aeSJan Lentfer #define TLS_DH_DSS_WITH_AES_256_CBC_SHA 0x0036 /* RFC 3268 */ 81*6d49e1aeSJan Lentfer #define TLS_DH_RSA_WITH_AES_256_CBC_SHA 0x0037 /* RFC 3268 */ 82*6d49e1aeSJan Lentfer #define TLS_DHE_DSS_WITH_AES_256_CBC_SHA 0x0038 /* RFC 3268 */ 83*6d49e1aeSJan Lentfer #define TLS_DHE_RSA_WITH_AES_256_CBC_SHA 0x0039 /* RFC 3268 */ 84*6d49e1aeSJan Lentfer #define TLS_DH_anon_WITH_AES_256_CBC_SHA 0x003A /* RFC 3268 */ 85*6d49e1aeSJan Lentfer 86*6d49e1aeSJan Lentfer /* CompressionMethod */ 87*6d49e1aeSJan Lentfer #define TLS_COMPRESSION_NULL 0 88*6d49e1aeSJan Lentfer 89*6d49e1aeSJan Lentfer /* AlertLevel */ 90*6d49e1aeSJan Lentfer #define TLS_ALERT_LEVEL_WARNING 1 91*6d49e1aeSJan Lentfer #define TLS_ALERT_LEVEL_FATAL 2 92*6d49e1aeSJan Lentfer 93*6d49e1aeSJan Lentfer /* AlertDescription */ 94*6d49e1aeSJan Lentfer #define TLS_ALERT_CLOSE_NOTIFY 0 95*6d49e1aeSJan Lentfer #define TLS_ALERT_UNEXPECTED_MESSAGE 10 96*6d49e1aeSJan Lentfer #define TLS_ALERT_BAD_RECORD_MAC 20 97*6d49e1aeSJan Lentfer #define TLS_ALERT_DECRYPTION_FAILED 21 98*6d49e1aeSJan Lentfer #define TLS_ALERT_RECORD_OVERFLOW 22 99*6d49e1aeSJan Lentfer #define TLS_ALERT_DECOMPRESSION_FAILURE 30 100*6d49e1aeSJan Lentfer #define TLS_ALERT_HANDSHAKE_FAILURE 40 101*6d49e1aeSJan Lentfer #define TLS_ALERT_BAD_CERTIFICATE 42 102*6d49e1aeSJan Lentfer #define TLS_ALERT_UNSUPPORTED_CERTIFICATE 43 103*6d49e1aeSJan Lentfer #define TLS_ALERT_CERTIFICATE_REVOKED 44 104*6d49e1aeSJan Lentfer #define TLS_ALERT_CERTIFICATE_EXPIRED 45 105*6d49e1aeSJan Lentfer #define TLS_ALERT_CERTIFICATE_UNKNOWN 46 106*6d49e1aeSJan Lentfer #define TLS_ALERT_ILLEGAL_PARAMETER 47 107*6d49e1aeSJan Lentfer #define TLS_ALERT_UNKNOWN_CA 48 108*6d49e1aeSJan Lentfer #define TLS_ALERT_ACCESS_DENIED 49 109*6d49e1aeSJan Lentfer #define TLS_ALERT_DECODE_ERROR 50 110*6d49e1aeSJan Lentfer #define TLS_ALERT_DECRYPT_ERROR 51 111*6d49e1aeSJan Lentfer #define TLS_ALERT_EXPORT_RESTRICTION 60 112*6d49e1aeSJan Lentfer #define TLS_ALERT_PROTOCOL_VERSION 70 113*6d49e1aeSJan Lentfer #define TLS_ALERT_INSUFFICIENT_SECURITY 71 114*6d49e1aeSJan Lentfer #define TLS_ALERT_INTERNAL_ERROR 80 115*6d49e1aeSJan Lentfer #define TLS_ALERT_USER_CANCELED 90 116*6d49e1aeSJan Lentfer #define TLS_ALERT_NO_RENEGOTIATION 100 117*6d49e1aeSJan Lentfer #define TLS_ALERT_UNSUPPORTED_EXTENSION 110 /* RFC 4366 */ 118*6d49e1aeSJan Lentfer #define TLS_ALERT_CERTIFICATE_UNOBTAINABLE 111 /* RFC 4366 */ 119*6d49e1aeSJan Lentfer #define TLS_ALERT_UNRECOGNIZED_NAME 112 /* RFC 4366 */ 120*6d49e1aeSJan Lentfer #define TLS_ALERT_BAD_CERTIFICATE_STATUS_RESPONSE 113 /* RFC 4366 */ 121*6d49e1aeSJan Lentfer #define TLS_ALERT_BAD_CERTIFICATE_HASH_VALUE 114 /* RFC 4366 */ 122*6d49e1aeSJan Lentfer 123*6d49e1aeSJan Lentfer /* ChangeCipherSpec */ 124*6d49e1aeSJan Lentfer enum { 125*6d49e1aeSJan Lentfer TLS_CHANGE_CIPHER_SPEC = 1 126*6d49e1aeSJan Lentfer }; 127*6d49e1aeSJan Lentfer 128*6d49e1aeSJan Lentfer /* TLS Extensions */ 129*6d49e1aeSJan Lentfer #define TLS_EXT_SERVER_NAME 0 /* RFC 4366 */ 130*6d49e1aeSJan Lentfer #define TLS_EXT_MAX_FRAGMENT_LENGTH 1 /* RFC 4366 */ 131*6d49e1aeSJan Lentfer #define TLS_EXT_CLIENT_CERTIFICATE_URL 2 /* RFC 4366 */ 132*6d49e1aeSJan Lentfer #define TLS_EXT_TRUSTED_CA_KEYS 3 /* RFC 4366 */ 133*6d49e1aeSJan Lentfer #define TLS_EXT_TRUNCATED_HMAC 4 /* RFC 4366 */ 134*6d49e1aeSJan Lentfer #define TLS_EXT_STATUS_REQUEST 5 /* RFC 4366 */ 135*6d49e1aeSJan Lentfer #define TLS_EXT_SESSION_TICKET 35 /* RFC 4507 */ 136*6d49e1aeSJan Lentfer 137*6d49e1aeSJan Lentfer #define TLS_EXT_PAC_OPAQUE TLS_EXT_SESSION_TICKET /* EAP-FAST terminology */ 138*6d49e1aeSJan Lentfer 139*6d49e1aeSJan Lentfer 140*6d49e1aeSJan Lentfer typedef enum { 141*6d49e1aeSJan Lentfer TLS_KEY_X_NULL, 142*6d49e1aeSJan Lentfer TLS_KEY_X_RSA, 143*6d49e1aeSJan Lentfer TLS_KEY_X_RSA_EXPORT, 144*6d49e1aeSJan Lentfer TLS_KEY_X_DH_DSS_EXPORT, 145*6d49e1aeSJan Lentfer TLS_KEY_X_DH_DSS, 146*6d49e1aeSJan Lentfer TLS_KEY_X_DH_RSA_EXPORT, 147*6d49e1aeSJan Lentfer TLS_KEY_X_DH_RSA, 148*6d49e1aeSJan Lentfer TLS_KEY_X_DHE_DSS_EXPORT, 149*6d49e1aeSJan Lentfer TLS_KEY_X_DHE_DSS, 150*6d49e1aeSJan Lentfer TLS_KEY_X_DHE_RSA_EXPORT, 151*6d49e1aeSJan Lentfer TLS_KEY_X_DHE_RSA, 152*6d49e1aeSJan Lentfer TLS_KEY_X_DH_anon_EXPORT, 153*6d49e1aeSJan Lentfer TLS_KEY_X_DH_anon 154*6d49e1aeSJan Lentfer } tls_key_exchange; 155*6d49e1aeSJan Lentfer 156*6d49e1aeSJan Lentfer typedef enum { 157*6d49e1aeSJan Lentfer TLS_CIPHER_NULL, 158*6d49e1aeSJan Lentfer TLS_CIPHER_RC4_40, 159*6d49e1aeSJan Lentfer TLS_CIPHER_RC4_128, 160*6d49e1aeSJan Lentfer TLS_CIPHER_RC2_CBC_40, 161*6d49e1aeSJan Lentfer TLS_CIPHER_IDEA_CBC, 162*6d49e1aeSJan Lentfer TLS_CIPHER_DES40_CBC, 163*6d49e1aeSJan Lentfer TLS_CIPHER_DES_CBC, 164*6d49e1aeSJan Lentfer TLS_CIPHER_3DES_EDE_CBC, 165*6d49e1aeSJan Lentfer TLS_CIPHER_AES_128_CBC, 166*6d49e1aeSJan Lentfer TLS_CIPHER_AES_256_CBC 167*6d49e1aeSJan Lentfer } tls_cipher; 168*6d49e1aeSJan Lentfer 169*6d49e1aeSJan Lentfer typedef enum { 170*6d49e1aeSJan Lentfer TLS_HASH_NULL, 171*6d49e1aeSJan Lentfer TLS_HASH_MD5, 172*6d49e1aeSJan Lentfer TLS_HASH_SHA 173*6d49e1aeSJan Lentfer } tls_hash; 174*6d49e1aeSJan Lentfer 175*6d49e1aeSJan Lentfer struct tls_cipher_suite { 176*6d49e1aeSJan Lentfer u16 suite; 177*6d49e1aeSJan Lentfer tls_key_exchange key_exchange; 178*6d49e1aeSJan Lentfer tls_cipher cipher; 179*6d49e1aeSJan Lentfer tls_hash hash; 180*6d49e1aeSJan Lentfer }; 181*6d49e1aeSJan Lentfer 182*6d49e1aeSJan Lentfer typedef enum { 183*6d49e1aeSJan Lentfer TLS_CIPHER_STREAM, 184*6d49e1aeSJan Lentfer TLS_CIPHER_BLOCK 185*6d49e1aeSJan Lentfer } tls_cipher_type; 186*6d49e1aeSJan Lentfer 187*6d49e1aeSJan Lentfer struct tls_cipher_data { 188*6d49e1aeSJan Lentfer tls_cipher cipher; 189*6d49e1aeSJan Lentfer tls_cipher_type type; 190*6d49e1aeSJan Lentfer size_t key_material; 191*6d49e1aeSJan Lentfer size_t expanded_key_material; 192*6d49e1aeSJan Lentfer size_t block_size; /* also iv_size */ 193*6d49e1aeSJan Lentfer enum crypto_cipher_alg alg; 194*6d49e1aeSJan Lentfer }; 195*6d49e1aeSJan Lentfer 196*6d49e1aeSJan Lentfer 197*6d49e1aeSJan Lentfer struct tls_verify_hash { 198*6d49e1aeSJan Lentfer struct crypto_hash *md5_client; 199*6d49e1aeSJan Lentfer struct crypto_hash *sha1_client; 200*6d49e1aeSJan Lentfer struct crypto_hash *md5_server; 201*6d49e1aeSJan Lentfer struct crypto_hash *sha1_server; 202*6d49e1aeSJan Lentfer struct crypto_hash *md5_cert; 203*6d49e1aeSJan Lentfer struct crypto_hash *sha1_cert; 204*6d49e1aeSJan Lentfer }; 205*6d49e1aeSJan Lentfer 206*6d49e1aeSJan Lentfer 207*6d49e1aeSJan Lentfer const struct tls_cipher_suite * tls_get_cipher_suite(u16 suite); 208*6d49e1aeSJan Lentfer const struct tls_cipher_data * tls_get_cipher_data(tls_cipher cipher); 209*6d49e1aeSJan Lentfer int tls_server_key_exchange_allowed(tls_cipher cipher); 210*6d49e1aeSJan Lentfer int tls_parse_cert(const u8 *buf, size_t len, struct crypto_public_key **pk); 211*6d49e1aeSJan Lentfer int tls_verify_hash_init(struct tls_verify_hash *verify); 212*6d49e1aeSJan Lentfer void tls_verify_hash_add(struct tls_verify_hash *verify, const u8 *buf, 213*6d49e1aeSJan Lentfer size_t len); 214*6d49e1aeSJan Lentfer void tls_verify_hash_free(struct tls_verify_hash *verify); 215*6d49e1aeSJan Lentfer 216*6d49e1aeSJan Lentfer #endif /* TLSV1_COMMON_H */ 217