139beb93cSSam Leffler /* 239beb93cSSam Leffler * TLSv1 common definitions 339beb93cSSam Leffler * Copyright (c) 2006-2007, Jouni Malinen <j@w1.fi> 439beb93cSSam Leffler * 539beb93cSSam Leffler * This program is free software; you can redistribute it and/or modify 639beb93cSSam Leffler * it under the terms of the GNU General Public License version 2 as 739beb93cSSam Leffler * published by the Free Software Foundation. 839beb93cSSam Leffler * 939beb93cSSam Leffler * Alternatively, this software may be distributed under the terms of BSD 1039beb93cSSam Leffler * license. 1139beb93cSSam Leffler * 1239beb93cSSam Leffler * See README and COPYING for more details. 1339beb93cSSam Leffler */ 1439beb93cSSam Leffler 1539beb93cSSam Leffler #ifndef TLSV1_COMMON_H 1639beb93cSSam Leffler #define TLSV1_COMMON_H 1739beb93cSSam Leffler 1839beb93cSSam Leffler #include "crypto.h" 1939beb93cSSam Leffler 2039beb93cSSam Leffler #define TLS_VERSION 0x0301 /* TLSv1 */ 2139beb93cSSam Leffler #define TLS_RANDOM_LEN 32 2239beb93cSSam Leffler #define TLS_PRE_MASTER_SECRET_LEN 48 2339beb93cSSam Leffler #define TLS_MASTER_SECRET_LEN 48 2439beb93cSSam Leffler #define TLS_SESSION_ID_MAX_LEN 32 2539beb93cSSam Leffler #define TLS_VERIFY_DATA_LEN 12 2639beb93cSSam Leffler 2739beb93cSSam Leffler /* HandshakeType */ 2839beb93cSSam Leffler enum { 2939beb93cSSam Leffler TLS_HANDSHAKE_TYPE_HELLO_REQUEST = 0, 3039beb93cSSam Leffler TLS_HANDSHAKE_TYPE_CLIENT_HELLO = 1, 3139beb93cSSam Leffler TLS_HANDSHAKE_TYPE_SERVER_HELLO = 2, 3239beb93cSSam Leffler TLS_HANDSHAKE_TYPE_NEW_SESSION_TICKET = 4 /* RFC 4507 */, 3339beb93cSSam Leffler TLS_HANDSHAKE_TYPE_CERTIFICATE = 11, 3439beb93cSSam Leffler TLS_HANDSHAKE_TYPE_SERVER_KEY_EXCHANGE = 12, 3539beb93cSSam Leffler TLS_HANDSHAKE_TYPE_CERTIFICATE_REQUEST = 13, 3639beb93cSSam Leffler TLS_HANDSHAKE_TYPE_SERVER_HELLO_DONE = 14, 3739beb93cSSam Leffler TLS_HANDSHAKE_TYPE_CERTIFICATE_VERIFY = 15, 3839beb93cSSam Leffler TLS_HANDSHAKE_TYPE_CLIENT_KEY_EXCHANGE = 16, 3939beb93cSSam Leffler TLS_HANDSHAKE_TYPE_FINISHED = 20, 4039beb93cSSam Leffler TLS_HANDSHAKE_TYPE_CERTIFICATE_URL = 21 /* RFC 4366 */, 4139beb93cSSam Leffler TLS_HANDSHAKE_TYPE_CERTIFICATE_STATUS = 22 /* RFC 4366 */ 4239beb93cSSam Leffler }; 4339beb93cSSam Leffler 4439beb93cSSam Leffler /* CipherSuite */ 4539beb93cSSam Leffler #define TLS_NULL_WITH_NULL_NULL 0x0000 /* RFC 2246 */ 4639beb93cSSam Leffler #define TLS_RSA_WITH_NULL_MD5 0x0001 /* RFC 2246 */ 4739beb93cSSam Leffler #define TLS_RSA_WITH_NULL_SHA 0x0002 /* RFC 2246 */ 4839beb93cSSam Leffler #define TLS_RSA_EXPORT_WITH_RC4_40_MD5 0x0003 /* RFC 2246 */ 4939beb93cSSam Leffler #define TLS_RSA_WITH_RC4_128_MD5 0x0004 /* RFC 2246 */ 5039beb93cSSam Leffler #define TLS_RSA_WITH_RC4_128_SHA 0x0005 /* RFC 2246 */ 5139beb93cSSam Leffler #define TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 0x0006 /* RFC 2246 */ 5239beb93cSSam Leffler #define TLS_RSA_WITH_IDEA_CBC_SHA 0x0007 /* RFC 2246 */ 5339beb93cSSam Leffler #define TLS_RSA_EXPORT_WITH_DES40_CBC_SHA 0x0008 /* RFC 2246 */ 5439beb93cSSam Leffler #define TLS_RSA_WITH_DES_CBC_SHA 0x0009 /* RFC 2246 */ 5539beb93cSSam Leffler #define TLS_RSA_WITH_3DES_EDE_CBC_SHA 0x000A /* RFC 2246 */ 5639beb93cSSam Leffler #define TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA 0x000B /* RFC 2246 */ 5739beb93cSSam Leffler #define TLS_DH_DSS_WITH_DES_CBC_SHA 0x000C /* RFC 2246 */ 5839beb93cSSam Leffler #define TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA 0x000D /* RFC 2246 */ 5939beb93cSSam Leffler #define TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA 0x000E /* RFC 2246 */ 6039beb93cSSam Leffler #define TLS_DH_RSA_WITH_DES_CBC_SHA 0x000F /* RFC 2246 */ 6139beb93cSSam Leffler #define TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA 0x0010 /* RFC 2246 */ 6239beb93cSSam Leffler #define TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA 0x0011 /* RFC 2246 */ 6339beb93cSSam Leffler #define TLS_DHE_DSS_WITH_DES_CBC_SHA 0x0012 /* RFC 2246 */ 6439beb93cSSam Leffler #define TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA 0x0013 /* RFC 2246 */ 6539beb93cSSam Leffler #define TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA 0x0014 /* RFC 2246 */ 6639beb93cSSam Leffler #define TLS_DHE_RSA_WITH_DES_CBC_SHA 0x0015 /* RFC 2246 */ 6739beb93cSSam Leffler #define TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA 0x0016 /* RFC 2246 */ 6839beb93cSSam Leffler #define TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 0x0017 /* RFC 2246 */ 6939beb93cSSam Leffler #define TLS_DH_anon_WITH_RC4_128_MD5 0x0018 /* RFC 2246 */ 7039beb93cSSam Leffler #define TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA 0x0019 /* RFC 2246 */ 7139beb93cSSam Leffler #define TLS_DH_anon_WITH_DES_CBC_SHA 0x001A /* RFC 2246 */ 7239beb93cSSam Leffler #define TLS_DH_anon_WITH_3DES_EDE_CBC_SHA 0x001B /* RFC 2246 */ 7339beb93cSSam Leffler #define TLS_RSA_WITH_AES_128_CBC_SHA 0x002F /* RFC 3268 */ 7439beb93cSSam Leffler #define TLS_DH_DSS_WITH_AES_128_CBC_SHA 0x0030 /* RFC 3268 */ 7539beb93cSSam Leffler #define TLS_DH_RSA_WITH_AES_128_CBC_SHA 0x0031 /* RFC 3268 */ 7639beb93cSSam Leffler #define TLS_DHE_DSS_WITH_AES_128_CBC_SHA 0x0032 /* RFC 3268 */ 7739beb93cSSam Leffler #define TLS_DHE_RSA_WITH_AES_128_CBC_SHA 0x0033 /* RFC 3268 */ 7839beb93cSSam Leffler #define TLS_DH_anon_WITH_AES_128_CBC_SHA 0x0034 /* RFC 3268 */ 7939beb93cSSam Leffler #define TLS_RSA_WITH_AES_256_CBC_SHA 0x0035 /* RFC 3268 */ 8039beb93cSSam Leffler #define TLS_DH_DSS_WITH_AES_256_CBC_SHA 0x0036 /* RFC 3268 */ 8139beb93cSSam Leffler #define TLS_DH_RSA_WITH_AES_256_CBC_SHA 0x0037 /* RFC 3268 */ 8239beb93cSSam Leffler #define TLS_DHE_DSS_WITH_AES_256_CBC_SHA 0x0038 /* RFC 3268 */ 8339beb93cSSam Leffler #define TLS_DHE_RSA_WITH_AES_256_CBC_SHA 0x0039 /* RFC 3268 */ 8439beb93cSSam Leffler #define TLS_DH_anon_WITH_AES_256_CBC_SHA 0x003A /* RFC 3268 */ 8539beb93cSSam Leffler 8639beb93cSSam Leffler /* CompressionMethod */ 8739beb93cSSam Leffler #define TLS_COMPRESSION_NULL 0 8839beb93cSSam Leffler 8939beb93cSSam Leffler /* AlertLevel */ 9039beb93cSSam Leffler #define TLS_ALERT_LEVEL_WARNING 1 9139beb93cSSam Leffler #define TLS_ALERT_LEVEL_FATAL 2 9239beb93cSSam Leffler 9339beb93cSSam Leffler /* AlertDescription */ 9439beb93cSSam Leffler #define TLS_ALERT_CLOSE_NOTIFY 0 9539beb93cSSam Leffler #define TLS_ALERT_UNEXPECTED_MESSAGE 10 9639beb93cSSam Leffler #define TLS_ALERT_BAD_RECORD_MAC 20 9739beb93cSSam Leffler #define TLS_ALERT_DECRYPTION_FAILED 21 9839beb93cSSam Leffler #define TLS_ALERT_RECORD_OVERFLOW 22 9939beb93cSSam Leffler #define TLS_ALERT_DECOMPRESSION_FAILURE 30 10039beb93cSSam Leffler #define TLS_ALERT_HANDSHAKE_FAILURE 40 10139beb93cSSam Leffler #define TLS_ALERT_BAD_CERTIFICATE 42 10239beb93cSSam Leffler #define TLS_ALERT_UNSUPPORTED_CERTIFICATE 43 10339beb93cSSam Leffler #define TLS_ALERT_CERTIFICATE_REVOKED 44 10439beb93cSSam Leffler #define TLS_ALERT_CERTIFICATE_EXPIRED 45 10539beb93cSSam Leffler #define TLS_ALERT_CERTIFICATE_UNKNOWN 46 10639beb93cSSam Leffler #define TLS_ALERT_ILLEGAL_PARAMETER 47 10739beb93cSSam Leffler #define TLS_ALERT_UNKNOWN_CA 48 10839beb93cSSam Leffler #define TLS_ALERT_ACCESS_DENIED 49 10939beb93cSSam Leffler #define TLS_ALERT_DECODE_ERROR 50 11039beb93cSSam Leffler #define TLS_ALERT_DECRYPT_ERROR 51 11139beb93cSSam Leffler #define TLS_ALERT_EXPORT_RESTRICTION 60 11239beb93cSSam Leffler #define TLS_ALERT_PROTOCOL_VERSION 70 11339beb93cSSam Leffler #define TLS_ALERT_INSUFFICIENT_SECURITY 71 11439beb93cSSam Leffler #define TLS_ALERT_INTERNAL_ERROR 80 11539beb93cSSam Leffler #define TLS_ALERT_USER_CANCELED 90 11639beb93cSSam Leffler #define TLS_ALERT_NO_RENEGOTIATION 100 11739beb93cSSam Leffler #define TLS_ALERT_UNSUPPORTED_EXTENSION 110 /* RFC 4366 */ 11839beb93cSSam Leffler #define TLS_ALERT_CERTIFICATE_UNOBTAINABLE 111 /* RFC 4366 */ 11939beb93cSSam Leffler #define TLS_ALERT_UNRECOGNIZED_NAME 112 /* RFC 4366 */ 12039beb93cSSam Leffler #define TLS_ALERT_BAD_CERTIFICATE_STATUS_RESPONSE 113 /* RFC 4366 */ 12139beb93cSSam Leffler #define TLS_ALERT_BAD_CERTIFICATE_HASH_VALUE 114 /* RFC 4366 */ 12239beb93cSSam Leffler 12339beb93cSSam Leffler /* ChangeCipherSpec */ 12439beb93cSSam Leffler enum { 12539beb93cSSam Leffler TLS_CHANGE_CIPHER_SPEC = 1 12639beb93cSSam Leffler }; 12739beb93cSSam Leffler 12839beb93cSSam Leffler /* TLS Extensions */ 12939beb93cSSam Leffler #define TLS_EXT_SERVER_NAME 0 /* RFC 4366 */ 13039beb93cSSam Leffler #define TLS_EXT_MAX_FRAGMENT_LENGTH 1 /* RFC 4366 */ 13139beb93cSSam Leffler #define TLS_EXT_CLIENT_CERTIFICATE_URL 2 /* RFC 4366 */ 13239beb93cSSam Leffler #define TLS_EXT_TRUSTED_CA_KEYS 3 /* RFC 4366 */ 13339beb93cSSam Leffler #define TLS_EXT_TRUNCATED_HMAC 4 /* RFC 4366 */ 13439beb93cSSam Leffler #define TLS_EXT_STATUS_REQUEST 5 /* RFC 4366 */ 13539beb93cSSam Leffler #define TLS_EXT_SESSION_TICKET 35 /* RFC 4507 */ 13639beb93cSSam Leffler 13739beb93cSSam Leffler #define TLS_EXT_PAC_OPAQUE TLS_EXT_SESSION_TICKET /* EAP-FAST terminology */ 13839beb93cSSam Leffler 13939beb93cSSam Leffler 14039beb93cSSam Leffler typedef enum { 14139beb93cSSam Leffler TLS_KEY_X_NULL, 14239beb93cSSam Leffler TLS_KEY_X_RSA, 14339beb93cSSam Leffler TLS_KEY_X_RSA_EXPORT, 14439beb93cSSam Leffler TLS_KEY_X_DH_DSS_EXPORT, 14539beb93cSSam Leffler TLS_KEY_X_DH_DSS, 14639beb93cSSam Leffler TLS_KEY_X_DH_RSA_EXPORT, 14739beb93cSSam Leffler TLS_KEY_X_DH_RSA, 14839beb93cSSam Leffler TLS_KEY_X_DHE_DSS_EXPORT, 14939beb93cSSam Leffler TLS_KEY_X_DHE_DSS, 15039beb93cSSam Leffler TLS_KEY_X_DHE_RSA_EXPORT, 15139beb93cSSam Leffler TLS_KEY_X_DHE_RSA, 15239beb93cSSam Leffler TLS_KEY_X_DH_anon_EXPORT, 15339beb93cSSam Leffler TLS_KEY_X_DH_anon 15439beb93cSSam Leffler } tls_key_exchange; 15539beb93cSSam Leffler 15639beb93cSSam Leffler typedef enum { 15739beb93cSSam Leffler TLS_CIPHER_NULL, 15839beb93cSSam Leffler TLS_CIPHER_RC4_40, 15939beb93cSSam Leffler TLS_CIPHER_RC4_128, 16039beb93cSSam Leffler TLS_CIPHER_RC2_CBC_40, 16139beb93cSSam Leffler TLS_CIPHER_IDEA_CBC, 16239beb93cSSam Leffler TLS_CIPHER_DES40_CBC, 16339beb93cSSam Leffler TLS_CIPHER_DES_CBC, 16439beb93cSSam Leffler TLS_CIPHER_3DES_EDE_CBC, 16539beb93cSSam Leffler TLS_CIPHER_AES_128_CBC, 16639beb93cSSam Leffler TLS_CIPHER_AES_256_CBC 16739beb93cSSam Leffler } tls_cipher; 16839beb93cSSam Leffler 16939beb93cSSam Leffler typedef enum { 17039beb93cSSam Leffler TLS_HASH_NULL, 17139beb93cSSam Leffler TLS_HASH_MD5, 17239beb93cSSam Leffler TLS_HASH_SHA 17339beb93cSSam Leffler } tls_hash; 17439beb93cSSam Leffler 17539beb93cSSam Leffler struct tls_cipher_suite { 17639beb93cSSam Leffler u16 suite; 17739beb93cSSam Leffler tls_key_exchange key_exchange; 17839beb93cSSam Leffler tls_cipher cipher; 17939beb93cSSam Leffler tls_hash hash; 18039beb93cSSam Leffler }; 18139beb93cSSam Leffler 18239beb93cSSam Leffler typedef enum { 18339beb93cSSam Leffler TLS_CIPHER_STREAM, 18439beb93cSSam Leffler TLS_CIPHER_BLOCK 18539beb93cSSam Leffler } tls_cipher_type; 18639beb93cSSam Leffler 18739beb93cSSam Leffler struct tls_cipher_data { 18839beb93cSSam Leffler tls_cipher cipher; 18939beb93cSSam Leffler tls_cipher_type type; 19039beb93cSSam Leffler size_t key_material; 19139beb93cSSam Leffler size_t expanded_key_material; 19239beb93cSSam Leffler size_t block_size; /* also iv_size */ 19339beb93cSSam Leffler enum crypto_cipher_alg alg; 19439beb93cSSam Leffler }; 19539beb93cSSam Leffler 19639beb93cSSam Leffler 19739beb93cSSam Leffler struct tls_verify_hash { 19839beb93cSSam Leffler struct crypto_hash *md5_client; 19939beb93cSSam Leffler struct crypto_hash *sha1_client; 20039beb93cSSam Leffler struct crypto_hash *md5_server; 20139beb93cSSam Leffler struct crypto_hash *sha1_server; 20239beb93cSSam Leffler struct crypto_hash *md5_cert; 20339beb93cSSam Leffler struct crypto_hash *sha1_cert; 20439beb93cSSam Leffler }; 20539beb93cSSam Leffler 20639beb93cSSam Leffler 20739beb93cSSam Leffler const struct tls_cipher_suite * tls_get_cipher_suite(u16 suite); 20839beb93cSSam Leffler const struct tls_cipher_data * tls_get_cipher_data(tls_cipher cipher); 20939beb93cSSam Leffler int tls_server_key_exchange_allowed(tls_cipher cipher); 21039beb93cSSam Leffler int tls_parse_cert(const u8 *buf, size_t len, struct crypto_public_key **pk); 21139beb93cSSam Leffler int tls_verify_hash_init(struct tls_verify_hash *verify); 21239beb93cSSam Leffler void tls_verify_hash_add(struct tls_verify_hash *verify, const u8 *buf, 21339beb93cSSam Leffler size_t len); 21439beb93cSSam Leffler void tls_verify_hash_free(struct tls_verify_hash *verify); 21539beb93cSSam Leffler 21639beb93cSSam Leffler #endif /* TLSV1_COMMON_H */ 217