1*6d49e1aeSJan Lentfer /* 2*6d49e1aeSJan Lentfer * TLSv1 common routines 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 "x509v3.h" 19*6d49e1aeSJan Lentfer #include "tlsv1_common.h" 20*6d49e1aeSJan Lentfer 21*6d49e1aeSJan Lentfer 22*6d49e1aeSJan Lentfer /* 23*6d49e1aeSJan Lentfer * TODO: 24*6d49e1aeSJan Lentfer * RFC 2246 Section 9: Mandatory to implement TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA 25*6d49e1aeSJan Lentfer * Add support for commonly used cipher suites; don't bother with exportable 26*6d49e1aeSJan Lentfer * suites. 27*6d49e1aeSJan Lentfer */ 28*6d49e1aeSJan Lentfer 29*6d49e1aeSJan Lentfer static const struct tls_cipher_suite tls_cipher_suites[] = { 30*6d49e1aeSJan Lentfer { TLS_NULL_WITH_NULL_NULL, TLS_KEY_X_NULL, TLS_CIPHER_NULL, 31*6d49e1aeSJan Lentfer TLS_HASH_NULL }, 32*6d49e1aeSJan Lentfer { TLS_RSA_WITH_RC4_128_MD5, TLS_KEY_X_RSA, TLS_CIPHER_RC4_128, 33*6d49e1aeSJan Lentfer TLS_HASH_MD5 }, 34*6d49e1aeSJan Lentfer { TLS_RSA_WITH_RC4_128_SHA, TLS_KEY_X_RSA, TLS_CIPHER_RC4_128, 35*6d49e1aeSJan Lentfer TLS_HASH_SHA }, 36*6d49e1aeSJan Lentfer { TLS_RSA_WITH_DES_CBC_SHA, TLS_KEY_X_RSA, TLS_CIPHER_DES_CBC, 37*6d49e1aeSJan Lentfer TLS_HASH_SHA }, 38*6d49e1aeSJan Lentfer { TLS_RSA_WITH_3DES_EDE_CBC_SHA, TLS_KEY_X_RSA, 39*6d49e1aeSJan Lentfer TLS_CIPHER_3DES_EDE_CBC, TLS_HASH_SHA }, 40*6d49e1aeSJan Lentfer { TLS_DH_anon_WITH_RC4_128_MD5, TLS_KEY_X_DH_anon, 41*6d49e1aeSJan Lentfer TLS_CIPHER_RC4_128, TLS_HASH_MD5 }, 42*6d49e1aeSJan Lentfer { TLS_DH_anon_WITH_DES_CBC_SHA, TLS_KEY_X_DH_anon, 43*6d49e1aeSJan Lentfer TLS_CIPHER_DES_CBC, TLS_HASH_SHA }, 44*6d49e1aeSJan Lentfer { TLS_DH_anon_WITH_3DES_EDE_CBC_SHA, TLS_KEY_X_DH_anon, 45*6d49e1aeSJan Lentfer TLS_CIPHER_3DES_EDE_CBC, TLS_HASH_SHA }, 46*6d49e1aeSJan Lentfer { TLS_RSA_WITH_AES_128_CBC_SHA, TLS_KEY_X_RSA, TLS_CIPHER_AES_128_CBC, 47*6d49e1aeSJan Lentfer TLS_HASH_SHA }, 48*6d49e1aeSJan Lentfer { TLS_DH_anon_WITH_AES_128_CBC_SHA, TLS_KEY_X_DH_anon, 49*6d49e1aeSJan Lentfer TLS_CIPHER_AES_128_CBC, TLS_HASH_SHA }, 50*6d49e1aeSJan Lentfer { TLS_RSA_WITH_AES_256_CBC_SHA, TLS_KEY_X_RSA, TLS_CIPHER_AES_256_CBC, 51*6d49e1aeSJan Lentfer TLS_HASH_SHA }, 52*6d49e1aeSJan Lentfer { TLS_DH_anon_WITH_AES_256_CBC_SHA, TLS_KEY_X_DH_anon, 53*6d49e1aeSJan Lentfer TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA } 54*6d49e1aeSJan Lentfer }; 55*6d49e1aeSJan Lentfer 56*6d49e1aeSJan Lentfer #define NUM_ELEMS(a) (sizeof(a) / sizeof((a)[0])) 57*6d49e1aeSJan Lentfer #define NUM_TLS_CIPHER_SUITES NUM_ELEMS(tls_cipher_suites) 58*6d49e1aeSJan Lentfer 59*6d49e1aeSJan Lentfer 60*6d49e1aeSJan Lentfer static const struct tls_cipher_data tls_ciphers[] = { 61*6d49e1aeSJan Lentfer { TLS_CIPHER_NULL, TLS_CIPHER_STREAM, 0, 0, 0, 62*6d49e1aeSJan Lentfer CRYPTO_CIPHER_NULL }, 63*6d49e1aeSJan Lentfer { TLS_CIPHER_IDEA_CBC, TLS_CIPHER_BLOCK, 16, 16, 8, 64*6d49e1aeSJan Lentfer CRYPTO_CIPHER_NULL }, 65*6d49e1aeSJan Lentfer { TLS_CIPHER_RC2_CBC_40, TLS_CIPHER_BLOCK, 5, 16, 0, 66*6d49e1aeSJan Lentfer CRYPTO_CIPHER_ALG_RC2 }, 67*6d49e1aeSJan Lentfer { TLS_CIPHER_RC4_40, TLS_CIPHER_STREAM, 5, 16, 0, 68*6d49e1aeSJan Lentfer CRYPTO_CIPHER_ALG_RC4 }, 69*6d49e1aeSJan Lentfer { TLS_CIPHER_RC4_128, TLS_CIPHER_STREAM, 16, 16, 0, 70*6d49e1aeSJan Lentfer CRYPTO_CIPHER_ALG_RC4 }, 71*6d49e1aeSJan Lentfer { TLS_CIPHER_DES40_CBC, TLS_CIPHER_BLOCK, 5, 8, 8, 72*6d49e1aeSJan Lentfer CRYPTO_CIPHER_ALG_DES }, 73*6d49e1aeSJan Lentfer { TLS_CIPHER_DES_CBC, TLS_CIPHER_BLOCK, 8, 8, 8, 74*6d49e1aeSJan Lentfer CRYPTO_CIPHER_ALG_DES }, 75*6d49e1aeSJan Lentfer { TLS_CIPHER_3DES_EDE_CBC, TLS_CIPHER_BLOCK, 24, 24, 8, 76*6d49e1aeSJan Lentfer CRYPTO_CIPHER_ALG_3DES }, 77*6d49e1aeSJan Lentfer { TLS_CIPHER_AES_128_CBC, TLS_CIPHER_BLOCK, 16, 16, 16, 78*6d49e1aeSJan Lentfer CRYPTO_CIPHER_ALG_AES }, 79*6d49e1aeSJan Lentfer { TLS_CIPHER_AES_256_CBC, TLS_CIPHER_BLOCK, 32, 32, 16, 80*6d49e1aeSJan Lentfer CRYPTO_CIPHER_ALG_AES } 81*6d49e1aeSJan Lentfer }; 82*6d49e1aeSJan Lentfer 83*6d49e1aeSJan Lentfer #define NUM_TLS_CIPHER_DATA NUM_ELEMS(tls_ciphers) 84*6d49e1aeSJan Lentfer 85*6d49e1aeSJan Lentfer 86*6d49e1aeSJan Lentfer /** 87*6d49e1aeSJan Lentfer * tls_get_cipher_suite - Get TLS cipher suite 88*6d49e1aeSJan Lentfer * @suite: Cipher suite identifier 89*6d49e1aeSJan Lentfer * Returns: Pointer to the cipher data or %NULL if not found 90*6d49e1aeSJan Lentfer */ 91*6d49e1aeSJan Lentfer const struct tls_cipher_suite * tls_get_cipher_suite(u16 suite) 92*6d49e1aeSJan Lentfer { 93*6d49e1aeSJan Lentfer size_t i; 94*6d49e1aeSJan Lentfer for (i = 0; i < NUM_TLS_CIPHER_SUITES; i++) 95*6d49e1aeSJan Lentfer if (tls_cipher_suites[i].suite == suite) 96*6d49e1aeSJan Lentfer return &tls_cipher_suites[i]; 97*6d49e1aeSJan Lentfer return NULL; 98*6d49e1aeSJan Lentfer } 99*6d49e1aeSJan Lentfer 100*6d49e1aeSJan Lentfer 101*6d49e1aeSJan Lentfer const struct tls_cipher_data * tls_get_cipher_data(tls_cipher cipher) 102*6d49e1aeSJan Lentfer { 103*6d49e1aeSJan Lentfer size_t i; 104*6d49e1aeSJan Lentfer for (i = 0; i < NUM_TLS_CIPHER_DATA; i++) 105*6d49e1aeSJan Lentfer if (tls_ciphers[i].cipher == cipher) 106*6d49e1aeSJan Lentfer return &tls_ciphers[i]; 107*6d49e1aeSJan Lentfer return NULL; 108*6d49e1aeSJan Lentfer } 109*6d49e1aeSJan Lentfer 110*6d49e1aeSJan Lentfer 111*6d49e1aeSJan Lentfer int tls_server_key_exchange_allowed(tls_cipher cipher) 112*6d49e1aeSJan Lentfer { 113*6d49e1aeSJan Lentfer const struct tls_cipher_suite *suite; 114*6d49e1aeSJan Lentfer 115*6d49e1aeSJan Lentfer /* RFC 2246, Section 7.4.3 */ 116*6d49e1aeSJan Lentfer suite = tls_get_cipher_suite(cipher); 117*6d49e1aeSJan Lentfer if (suite == NULL) 118*6d49e1aeSJan Lentfer return 0; 119*6d49e1aeSJan Lentfer 120*6d49e1aeSJan Lentfer switch (suite->key_exchange) { 121*6d49e1aeSJan Lentfer case TLS_KEY_X_DHE_DSS: 122*6d49e1aeSJan Lentfer case TLS_KEY_X_DHE_DSS_EXPORT: 123*6d49e1aeSJan Lentfer case TLS_KEY_X_DHE_RSA: 124*6d49e1aeSJan Lentfer case TLS_KEY_X_DHE_RSA_EXPORT: 125*6d49e1aeSJan Lentfer case TLS_KEY_X_DH_anon_EXPORT: 126*6d49e1aeSJan Lentfer case TLS_KEY_X_DH_anon: 127*6d49e1aeSJan Lentfer return 1; 128*6d49e1aeSJan Lentfer case TLS_KEY_X_RSA_EXPORT: 129*6d49e1aeSJan Lentfer return 1 /* FIX: public key len > 512 bits */; 130*6d49e1aeSJan Lentfer default: 131*6d49e1aeSJan Lentfer return 0; 132*6d49e1aeSJan Lentfer } 133*6d49e1aeSJan Lentfer } 134*6d49e1aeSJan Lentfer 135*6d49e1aeSJan Lentfer 136*6d49e1aeSJan Lentfer /** 137*6d49e1aeSJan Lentfer * tls_parse_cert - Parse DER encoded X.509 certificate and get public key 138*6d49e1aeSJan Lentfer * @buf: ASN.1 DER encoded certificate 139*6d49e1aeSJan Lentfer * @len: Length of the buffer 140*6d49e1aeSJan Lentfer * @pk: Buffer for returning the allocated public key 141*6d49e1aeSJan Lentfer * Returns: 0 on success, -1 on failure 142*6d49e1aeSJan Lentfer * 143*6d49e1aeSJan Lentfer * This functions parses an ASN.1 DER encoded X.509 certificate and retrieves 144*6d49e1aeSJan Lentfer * the public key from it. The caller is responsible for freeing the public key 145*6d49e1aeSJan Lentfer * by calling crypto_public_key_free(). 146*6d49e1aeSJan Lentfer */ 147*6d49e1aeSJan Lentfer int tls_parse_cert(const u8 *buf, size_t len, struct crypto_public_key **pk) 148*6d49e1aeSJan Lentfer { 149*6d49e1aeSJan Lentfer struct x509_certificate *cert; 150*6d49e1aeSJan Lentfer 151*6d49e1aeSJan Lentfer wpa_hexdump(MSG_MSGDUMP, "TLSv1: Parse ASN.1 DER certificate", 152*6d49e1aeSJan Lentfer buf, len); 153*6d49e1aeSJan Lentfer 154*6d49e1aeSJan Lentfer *pk = crypto_public_key_from_cert(buf, len); 155*6d49e1aeSJan Lentfer if (*pk) 156*6d49e1aeSJan Lentfer return 0; 157*6d49e1aeSJan Lentfer 158*6d49e1aeSJan Lentfer cert = x509_certificate_parse(buf, len); 159*6d49e1aeSJan Lentfer if (cert == NULL) { 160*6d49e1aeSJan Lentfer wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse X.509 " 161*6d49e1aeSJan Lentfer "certificate"); 162*6d49e1aeSJan Lentfer return -1; 163*6d49e1aeSJan Lentfer } 164*6d49e1aeSJan Lentfer 165*6d49e1aeSJan Lentfer /* TODO 166*6d49e1aeSJan Lentfer * verify key usage (must allow encryption) 167*6d49e1aeSJan Lentfer * 168*6d49e1aeSJan Lentfer * All certificate profiles, key and cryptographic formats are 169*6d49e1aeSJan Lentfer * defined by the IETF PKIX working group [PKIX]. When a key 170*6d49e1aeSJan Lentfer * usage extension is present, the digitalSignature bit must be 171*6d49e1aeSJan Lentfer * set for the key to be eligible for signing, as described 172*6d49e1aeSJan Lentfer * above, and the keyEncipherment bit must be present to allow 173*6d49e1aeSJan Lentfer * encryption, as described above. The keyAgreement bit must be 174*6d49e1aeSJan Lentfer * set on Diffie-Hellman certificates. (PKIX: RFC 3280) 175*6d49e1aeSJan Lentfer */ 176*6d49e1aeSJan Lentfer 177*6d49e1aeSJan Lentfer *pk = crypto_public_key_import(cert->public_key, cert->public_key_len); 178*6d49e1aeSJan Lentfer x509_certificate_free(cert); 179*6d49e1aeSJan Lentfer 180*6d49e1aeSJan Lentfer if (*pk == NULL) { 181*6d49e1aeSJan Lentfer wpa_printf(MSG_ERROR, "TLSv1: Failed to import " 182*6d49e1aeSJan Lentfer "server public key"); 183*6d49e1aeSJan Lentfer return -1; 184*6d49e1aeSJan Lentfer } 185*6d49e1aeSJan Lentfer 186*6d49e1aeSJan Lentfer return 0; 187*6d49e1aeSJan Lentfer } 188*6d49e1aeSJan Lentfer 189*6d49e1aeSJan Lentfer 190*6d49e1aeSJan Lentfer int tls_verify_hash_init(struct tls_verify_hash *verify) 191*6d49e1aeSJan Lentfer { 192*6d49e1aeSJan Lentfer tls_verify_hash_free(verify); 193*6d49e1aeSJan Lentfer verify->md5_client = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0); 194*6d49e1aeSJan Lentfer verify->md5_server = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0); 195*6d49e1aeSJan Lentfer verify->md5_cert = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0); 196*6d49e1aeSJan Lentfer verify->sha1_client = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0); 197*6d49e1aeSJan Lentfer verify->sha1_server = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0); 198*6d49e1aeSJan Lentfer verify->sha1_cert = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0); 199*6d49e1aeSJan Lentfer if (verify->md5_client == NULL || verify->md5_server == NULL || 200*6d49e1aeSJan Lentfer verify->md5_cert == NULL || verify->sha1_client == NULL || 201*6d49e1aeSJan Lentfer verify->sha1_server == NULL || verify->sha1_cert == NULL) { 202*6d49e1aeSJan Lentfer tls_verify_hash_free(verify); 203*6d49e1aeSJan Lentfer return -1; 204*6d49e1aeSJan Lentfer } 205*6d49e1aeSJan Lentfer return 0; 206*6d49e1aeSJan Lentfer } 207*6d49e1aeSJan Lentfer 208*6d49e1aeSJan Lentfer 209*6d49e1aeSJan Lentfer void tls_verify_hash_add(struct tls_verify_hash *verify, const u8 *buf, 210*6d49e1aeSJan Lentfer size_t len) 211*6d49e1aeSJan Lentfer { 212*6d49e1aeSJan Lentfer if (verify->md5_client && verify->sha1_client) { 213*6d49e1aeSJan Lentfer crypto_hash_update(verify->md5_client, buf, len); 214*6d49e1aeSJan Lentfer crypto_hash_update(verify->sha1_client, buf, len); 215*6d49e1aeSJan Lentfer } 216*6d49e1aeSJan Lentfer if (verify->md5_server && verify->sha1_server) { 217*6d49e1aeSJan Lentfer crypto_hash_update(verify->md5_server, buf, len); 218*6d49e1aeSJan Lentfer crypto_hash_update(verify->sha1_server, buf, len); 219*6d49e1aeSJan Lentfer } 220*6d49e1aeSJan Lentfer if (verify->md5_cert && verify->sha1_cert) { 221*6d49e1aeSJan Lentfer crypto_hash_update(verify->md5_cert, buf, len); 222*6d49e1aeSJan Lentfer crypto_hash_update(verify->sha1_cert, buf, len); 223*6d49e1aeSJan Lentfer } 224*6d49e1aeSJan Lentfer } 225*6d49e1aeSJan Lentfer 226*6d49e1aeSJan Lentfer 227*6d49e1aeSJan Lentfer void tls_verify_hash_free(struct tls_verify_hash *verify) 228*6d49e1aeSJan Lentfer { 229*6d49e1aeSJan Lentfer crypto_hash_finish(verify->md5_client, NULL, NULL); 230*6d49e1aeSJan Lentfer crypto_hash_finish(verify->md5_server, NULL, NULL); 231*6d49e1aeSJan Lentfer crypto_hash_finish(verify->md5_cert, NULL, NULL); 232*6d49e1aeSJan Lentfer crypto_hash_finish(verify->sha1_client, NULL, NULL); 233*6d49e1aeSJan Lentfer crypto_hash_finish(verify->sha1_server, NULL, NULL); 234*6d49e1aeSJan Lentfer crypto_hash_finish(verify->sha1_cert, NULL, NULL); 235*6d49e1aeSJan Lentfer verify->md5_client = NULL; 236*6d49e1aeSJan Lentfer verify->md5_server = NULL; 237*6d49e1aeSJan Lentfer verify->md5_cert = NULL; 238*6d49e1aeSJan Lentfer verify->sha1_client = NULL; 239*6d49e1aeSJan Lentfer verify->sha1_server = NULL; 240*6d49e1aeSJan Lentfer verify->sha1_cert = NULL; 241*6d49e1aeSJan Lentfer } 242