12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* This Source Code Form is subject to the terms of the Mozilla Public 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * License, v. 2.0. If a copy of the MPL was not distributed with this 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ssl.h" 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sslimpl.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sslproto.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char * 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ssl_GetCompressionMethodName(SSLCompressionMethod compression) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (compression) { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ssl_compression_null: 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "NULL"; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef NSS_ENABLE_ZLIB 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ssl_compression_deflate: 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "DEFLATE"; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "???"; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SECStatus 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSL_GetChannelInfo(PRFileDesc *fd, SSLChannelInfo *info, PRUintn len) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sslSocket * ss; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLChannelInfo inf; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sslSessionID * sid; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!info || len < sizeof inf.length) { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PORT_SetError(SEC_ERROR_INVALID_ARGS); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SECFailure; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ss = ssl_FindSocket(fd); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ss) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSL_DBG(("%d: SSL[%d]: bad socket in SSL_GetChannelInfo", 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSL_GETPID(), fd)); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SECFailure; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(&inf, 0, sizeof inf); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.length = PR_MIN(sizeof inf, len); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (ss->opt.useSecurity && ss->enoughFirstHsDone) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sid = ss->sec.ci.sid; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.protocolVersion = ss->version; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.authKeyBits = ss->sec.authKeyBits; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.keaKeyBits = ss->sec.keaKeyBits; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ss->version < SSL_LIBRARY_VERSION_3_0) { /* SSL2 */ 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.cipherSuite = ss->sec.cipherType | 0xff00; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.compressionMethod = ssl_compression_null; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.compressionMethodName = "N/A"; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ss->ssl3.initialized) { /* SSL3 and TLS */ 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_GetSpecReadLock(ss); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* XXX The cipher suite should be in the specs and this 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * function should get it from cwSpec rather than from the "hs". 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * See bug 275744 comment 69 and bug 766137. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.cipherSuite = ss->ssl3.hs.cipher_suite; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.compressionMethod = ss->ssl3.cwSpec->compression_method; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_ReleaseSpecReadLock(ss); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.compressionMethodName = 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_GetCompressionMethodName(inf.compressionMethod); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sid) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.creationTime = sid->creationTime; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.lastAccessTime = sid->lastAccessTime; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.expirationTime = sid->expirationTime; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ss->version < SSL_LIBRARY_VERSION_3_0) { /* SSL2 */ 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.sessionIDLength = SSL2_SESSIONID_BYTES; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(inf.sessionID, sid->u.ssl2.sessionID, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSL2_SESSIONID_BYTES); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int sidLen = sid->u.ssl3.sessionIDLength; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sidLen = PR_MIN(sidLen, sizeof inf.sessionID); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.sessionIDLength = sidLen; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(inf.sessionID, sid->u.ssl3.sessionID, sidLen); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(info, &inf, inf.length); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SECSuccess; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CS(x) x, #x 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CK(x) x | 0xff00, #x 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define S_DSA "DSA", ssl_auth_dsa 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define S_RSA "RSA", ssl_auth_rsa 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define S_KEA "KEA", ssl_auth_kea 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define S_ECDSA "ECDSA", ssl_auth_ecdsa 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define K_DHE "DHE", kt_dh 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define K_RSA "RSA", kt_rsa 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define K_KEA "KEA", kt_kea 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define K_ECDH "ECDH", kt_ecdh 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define K_ECDHE "ECDHE", kt_ecdh 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define C_SEED "SEED", calg_seed 1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define C_CAMELLIA "CAMELLIA", calg_camellia 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define C_AES "AES", calg_aes 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define C_RC4 "RC4", calg_rc4 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define C_RC2 "RC2", calg_rc2 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define C_DES "DES", calg_des 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define C_3DES "3DES", calg_3des 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define C_NULL "NULL", calg_null 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define C_SJ "SKIPJACK", calg_sj 1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define C_AESGCM "AES-GCM", calg_aes_gcm 113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#define C_CHACHA20 "CHACHA20POLY1305", calg_chacha20 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define B_256 256, 256, 256 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define B_128 128, 128, 128 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define B_3DES 192, 156, 112 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define B_SJ 96, 80, 80 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define B_DES 64, 56, 56 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define B_56 128, 56, 56 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define B_40 128, 40, 40 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define B_0 0, 0, 0 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define M_AEAD_128 "AEAD", ssl_mac_aead, 128 125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define M_SHA256 "SHA256", ssl_hmac_sha256, 256 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define M_SHA "SHA1", ssl_mac_sha, 160 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define M_MD5 "MD5", ssl_mac_md5, 128 1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define M_NULL "NULL", ssl_mac_null, 0 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const SSLCipherSuiteInfo suiteInfo[] = { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* <------ Cipher suite --------------------> <auth> <KEA> <bulk cipher> <MAC> <FIPS> */ 1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles){0,CS(TLS_RSA_WITH_AES_128_GCM_SHA256), S_RSA, K_RSA, C_AESGCM, B_128, M_AEAD_128, 1, 0, 0, }, 1333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA), S_RSA, K_DHE, C_CAMELLIA, B_256, M_SHA, 0, 0, 0, }, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA), S_DSA, K_DHE, C_CAMELLIA, B_256, M_SHA, 0, 0, 0, }, 136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles){0,CS(TLS_DHE_RSA_WITH_AES_256_CBC_SHA256), S_RSA, K_DHE, C_AES, B_256, M_SHA256, 1, 0, 0, }, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_DHE_RSA_WITH_AES_256_CBC_SHA), S_RSA, K_DHE, C_AES, B_256, M_SHA, 1, 0, 0, }, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_DHE_DSS_WITH_AES_256_CBC_SHA), S_DSA, K_DHE, C_AES, B_256, M_SHA, 1, 0, 0, }, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_RSA_WITH_CAMELLIA_256_CBC_SHA), S_RSA, K_RSA, C_CAMELLIA, B_256, M_SHA, 0, 0, 0, }, 140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles){0,CS(TLS_RSA_WITH_AES_256_CBC_SHA256), S_RSA, K_RSA, C_AES, B_256, M_SHA256, 1, 0, 0, }, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_RSA_WITH_AES_256_CBC_SHA), S_RSA, K_RSA, C_AES, B_256, M_SHA, 1, 0, 0, }, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA), S_RSA, K_DHE, C_CAMELLIA, B_128, M_SHA, 0, 0, 0, }, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA), S_DSA, K_DHE, C_CAMELLIA, B_128, M_SHA, 0, 0, 0, }, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_DHE_DSS_WITH_RC4_128_SHA), S_DSA, K_DHE, C_RC4, B_128, M_SHA, 0, 0, 0, }, 146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles){0,CS(TLS_DHE_RSA_WITH_AES_128_CBC_SHA256), S_RSA, K_DHE, C_AES, B_128, M_SHA256, 1, 0, 0, }, 1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles){0,CS(TLS_DHE_RSA_WITH_AES_128_GCM_SHA256), S_RSA, K_DHE, C_AESGCM, B_128, M_AEAD_128, 1, 0, 0, }, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_DHE_RSA_WITH_AES_128_CBC_SHA), S_RSA, K_DHE, C_AES, B_128, M_SHA, 1, 0, 0, }, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_DHE_DSS_WITH_AES_128_CBC_SHA), S_DSA, K_DHE, C_AES, B_128, M_SHA, 1, 0, 0, }, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_RSA_WITH_SEED_CBC_SHA), S_RSA, K_RSA, C_SEED,B_128, M_SHA, 1, 0, 0, }, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_RSA_WITH_CAMELLIA_128_CBC_SHA), S_RSA, K_RSA, C_CAMELLIA, B_128, M_SHA, 0, 0, 0, }, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(SSL_RSA_WITH_RC4_128_SHA), S_RSA, K_RSA, C_RC4, B_128, M_SHA, 0, 0, 0, }, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(SSL_RSA_WITH_RC4_128_MD5), S_RSA, K_RSA, C_RC4, B_128, M_MD5, 0, 0, 0, }, 154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles){0,CS(TLS_RSA_WITH_AES_128_CBC_SHA256), S_RSA, K_RSA, C_AES, B_128, M_SHA256, 1, 0, 0, }, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_RSA_WITH_AES_128_CBC_SHA), S_RSA, K_RSA, C_AES, B_128, M_SHA, 1, 0, 0, }, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA), S_RSA, K_DHE, C_3DES,B_3DES,M_SHA, 1, 0, 0, }, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA), S_DSA, K_DHE, C_3DES,B_3DES,M_SHA, 1, 0, 0, }, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA), S_RSA, K_RSA, C_3DES,B_3DES,M_SHA, 1, 0, 1, }, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(SSL_RSA_WITH_3DES_EDE_CBC_SHA), S_RSA, K_RSA, C_3DES,B_3DES,M_SHA, 1, 0, 0, }, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(SSL_DHE_RSA_WITH_DES_CBC_SHA), S_RSA, K_DHE, C_DES, B_DES, M_SHA, 0, 0, 0, }, 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(SSL_DHE_DSS_WITH_DES_CBC_SHA), S_DSA, K_DHE, C_DES, B_DES, M_SHA, 0, 0, 0, }, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(SSL_RSA_FIPS_WITH_DES_CBC_SHA), S_RSA, K_RSA, C_DES, B_DES, M_SHA, 0, 0, 1, }, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(SSL_RSA_WITH_DES_CBC_SHA), S_RSA, K_RSA, C_DES, B_DES, M_SHA, 0, 0, 0, }, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_RSA_EXPORT1024_WITH_RC4_56_SHA), S_RSA, K_RSA, C_RC4, B_56, M_SHA, 0, 1, 0, }, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA), S_RSA, K_RSA, C_DES, B_DES, M_SHA, 0, 1, 0, }, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(SSL_RSA_EXPORT_WITH_RC4_40_MD5), S_RSA, K_RSA, C_RC4, B_40, M_MD5, 0, 1, 0, }, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5), S_RSA, K_RSA, C_RC2, B_40, M_MD5, 0, 1, 0, }, 171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles){0,CS(TLS_RSA_WITH_NULL_SHA256), S_RSA, K_RSA, C_NULL,B_0, M_SHA256, 0, 1, 0, }, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(SSL_RSA_WITH_NULL_SHA), S_RSA, K_RSA, C_NULL,B_0, M_SHA, 0, 1, 0, }, 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(SSL_RSA_WITH_NULL_MD5), S_RSA, K_RSA, C_NULL,B_0, M_MD5, 0, 1, 0, }, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef NSS_ENABLE_ECC 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ECC cipher suites */ 1773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles){0,CS(TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256), S_RSA, K_ECDHE, C_AESGCM, B_128, M_AEAD_128, 1, 0, 0, }, 1783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles){0,CS(TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256), S_ECDSA, K_ECDHE, C_AESGCM, B_128, M_AEAD_128, 1, 0, 0, }, 1793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDH_ECDSA_WITH_NULL_SHA), S_ECDSA, K_ECDH, C_NULL, B_0, M_SHA, 0, 0, 0, }, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDH_ECDSA_WITH_RC4_128_SHA), S_ECDSA, K_ECDH, C_RC4, B_128, M_SHA, 0, 0, 0, }, 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA), S_ECDSA, K_ECDH, C_3DES, B_3DES, M_SHA, 1, 0, 0, }, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA), S_ECDSA, K_ECDH, C_AES, B_128, M_SHA, 1, 0, 0, }, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA), S_ECDSA, K_ECDH, C_AES, B_256, M_SHA, 1, 0, 0, }, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDHE_ECDSA_WITH_NULL_SHA), S_ECDSA, K_ECDHE, C_NULL, B_0, M_SHA, 0, 0, 0, }, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDHE_ECDSA_WITH_RC4_128_SHA), S_ECDSA, K_ECDHE, C_RC4, B_128, M_SHA, 0, 0, 0, }, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA), S_ECDSA, K_ECDHE, C_3DES, B_3DES, M_SHA, 1, 0, 0, }, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA), S_ECDSA, K_ECDHE, C_AES, B_128, M_SHA, 1, 0, 0, }, 190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles){0,CS(TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256), S_ECDSA, K_ECDHE, C_AES, B_128, M_SHA256, 1, 0, 0, }, 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA), S_ECDSA, K_ECDHE, C_AES, B_256, M_SHA, 1, 0, 0, }, 192d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles){0,CS(TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305),S_ECDSA,K_ECDHE,C_CHACHA20,B_256,M_AEAD_128,0, 0, 0, }, 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDH_RSA_WITH_NULL_SHA), S_RSA, K_ECDH, C_NULL, B_0, M_SHA, 0, 0, 0, }, 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDH_RSA_WITH_RC4_128_SHA), S_RSA, K_ECDH, C_RC4, B_128, M_SHA, 0, 0, 0, }, 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA), S_RSA, K_ECDH, C_3DES, B_3DES, M_SHA, 1, 0, 0, }, 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDH_RSA_WITH_AES_128_CBC_SHA), S_RSA, K_ECDH, C_AES, B_128, M_SHA, 1, 0, 0, }, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDH_RSA_WITH_AES_256_CBC_SHA), S_RSA, K_ECDH, C_AES, B_256, M_SHA, 1, 0, 0, }, 199d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles){0,CS(TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305), S_RSA,K_ECDHE,C_CHACHA20,B_256,M_AEAD_128, 0, 0, 0, }, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDHE_RSA_WITH_NULL_SHA), S_RSA, K_ECDHE, C_NULL, B_0, M_SHA, 0, 0, 0, }, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDHE_RSA_WITH_RC4_128_SHA), S_RSA, K_ECDHE, C_RC4, B_128, M_SHA, 0, 0, 0, }, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA), S_RSA, K_ECDHE, C_3DES, B_3DES, M_SHA, 1, 0, 0, }, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA), S_RSA, K_ECDHE, C_AES, B_128, M_SHA, 1, 0, 0, }, 205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles){0,CS(TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256), S_RSA, K_ECDHE, C_AES, B_128, M_SHA256, 1, 0, 0, }, 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA), S_RSA, K_ECDHE, C_AES, B_256, M_SHA, 1, 0, 0, }, 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* NSS_ENABLE_ECC */ 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* SSL 2 table */ 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CK(SSL_CK_RC4_128_WITH_MD5), S_RSA, K_RSA, C_RC4, B_128, M_MD5, 0, 0, 0, }, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CK(SSL_CK_RC2_128_CBC_WITH_MD5), S_RSA, K_RSA, C_RC2, B_128, M_MD5, 0, 0, 0, }, 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CK(SSL_CK_DES_192_EDE3_CBC_WITH_MD5), S_RSA, K_RSA, C_3DES,B_3DES,M_MD5, 0, 0, 0, }, 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CK(SSL_CK_DES_64_CBC_WITH_MD5), S_RSA, K_RSA, C_DES, B_DES, M_MD5, 0, 0, 0, }, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CK(SSL_CK_RC4_128_EXPORT40_WITH_MD5), S_RSA, K_RSA, C_RC4, B_40, M_MD5, 0, 1, 0, }, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CK(SSL_CK_RC2_128_CBC_EXPORT40_WITH_MD5), S_RSA, K_RSA, C_RC2, B_40, M_MD5, 0, 1, 0, } 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NUM_SUITEINFOS ((sizeof suiteInfo) / (sizeof suiteInfo[0])) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SECStatus SSL_GetCipherSuiteInfo(PRUint16 cipherSuite, 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLCipherSuiteInfo *info, PRUintn len) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int i; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len = PR_MIN(len, sizeof suiteInfo[0]); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!info || len < sizeof suiteInfo[0].length) { 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PORT_SetError(SEC_ERROR_INVALID_ARGS); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SECFailure; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < NUM_SUITEINFOS; i++) { 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (suiteInfo[i].cipherSuite == cipherSuite) { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(info, &suiteInfo[i], len); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->length = len; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SECSuccess; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PORT_SetError(SEC_ERROR_INVALID_ARGS); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SECFailure; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This function might be a candidate to be public. 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Disables all export ciphers in the default set of enabled ciphers. 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SECStatus 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSL_DisableDefaultExportCipherSuites(void) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SSLCipherSuiteInfo * pInfo = suiteInfo; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int i; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SECStatus rv; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < NUM_SUITEINFOS; ++i, ++pInfo) { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pInfo->isExportable) { 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = SSL_CipherPrefSetDefault(pInfo->cipherSuite, PR_FALSE); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PORT_Assert(rv == SECSuccess); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SECSuccess; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This function might be a candidate to be public, 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * except that it takes an sslSocket pointer as an argument. 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A Public version would take a PRFileDesc pointer. 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Disables all export ciphers in the default set of enabled ciphers. 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SECStatus 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSL_DisableExportCipherSuites(PRFileDesc * fd) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SSLCipherSuiteInfo * pInfo = suiteInfo; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int i; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SECStatus rv; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < NUM_SUITEINFOS; ++i, ++pInfo) { 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pInfo->isExportable) { 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = SSL_CipherPrefSet(fd, pInfo->cipherSuite, PR_FALSE); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PORT_Assert(rv == SECSuccess); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SECSuccess; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Tells us if the named suite is exportable 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * returns false for unknown suites. 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PRBool 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSL_IsExportCipherSuite(PRUint16 cipherSuite) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int i; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < NUM_SUITEINFOS; i++) { 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (suiteInfo[i].cipherSuite == cipherSuite) { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (PRBool)(suiteInfo[i].isExportable); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PR_FALSE; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SECItem* 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSL_GetNegotiatedHostInfo(PRFileDesc *fd) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SECItem *sniName = NULL; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sslSocket *ss; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *name = NULL; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ss = ssl_FindSocket(fd); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ss) { 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSL_DBG(("%d: SSL[%d]: bad socket in SSL_GetNegotiatedHostInfo", 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSL_GETPID(), fd)); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ss->sec.isServer) { 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ss->version > SSL_LIBRARY_VERSION_3_0 && 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ss->ssl3.initialized) { /* TLS */ 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SECItem *crsName; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_GetSpecReadLock(ss); /*********************************/ 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crsName = &ss->ssl3.cwSpec->srvVirtName; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (crsName->data) { 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sniName = SECITEM_DupItem(crsName); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_ReleaseSpecReadLock(ss); /*----------------------------*/ 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sniName; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = SSL_RevealURL(fd); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name) { 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sniName = PORT_ZNew(SECItem); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!sniName) { 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PORT_Free(name); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sniName->data = (void*)name; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sniName->len = PORT_Strlen(name); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sniName; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SECStatus 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSL_ExportKeyingMaterial(PRFileDesc *fd, 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *label, unsigned int labelLen, 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRBool hasContext, 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unsigned char *context, unsigned int contextLen, 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char *out, unsigned int outLen) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sslSocket *ss; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char *val = NULL; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int valLen, i; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SECStatus rv = SECFailure; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ss = ssl_FindSocket(fd); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ss) { 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSL_DBG(("%d: SSL[%d]: bad socket in ExportKeyingMaterial", 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSL_GETPID(), fd)); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SECFailure; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_GetRecvBufLock(ss); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_GetSSL3HandshakeLock(ss); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ss->version < SSL_LIBRARY_VERSION_3_1_TLS) { 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PORT_SetError(SSL_ERROR_FEATURE_NOT_SUPPORTED_FOR_VERSION); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_ReleaseSSL3HandshakeLock(ss); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_ReleaseRecvBufLock(ss); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SECFailure; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* construct PRF arguments */ 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) valLen = SSL3_RANDOM_LENGTH * 2; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (hasContext) { 369a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) valLen += 2 /* PRUint16 length */ + contextLen; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = PORT_Alloc(valLen); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!val) { 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_ReleaseSSL3HandshakeLock(ss); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_ReleaseRecvBufLock(ss); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SECFailure; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i = 0; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PORT_Memcpy(val + i, &ss->ssl3.hs.client_random.rand, SSL3_RANDOM_LENGTH); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i += SSL3_RANDOM_LENGTH; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PORT_Memcpy(val + i, &ss->ssl3.hs.server_random.rand, SSL3_RANDOM_LENGTH); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i += SSL3_RANDOM_LENGTH; 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (hasContext) { 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val[i++] = contextLen >> 8; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val[i++] = contextLen; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PORT_Memcpy(val + i, context, contextLen); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i += contextLen; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PORT_Assert(i == valLen); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Allow TLS keying material to be exported sooner, when the master 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * secret is available and we have sent ChangeCipherSpec. 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_GetSpecReadLock(ss); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ss->ssl3.cwSpec->master_secret && !ss->ssl3.cwSpec->msItem.len) { 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PORT_SetError(SSL_ERROR_HANDSHAKE_NOT_COMPLETED); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = SECFailure; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = ssl3_TLSPRFWithMasterSecret(ss->ssl3.cwSpec, label, labelLen, val, 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) valLen, out, outLen); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_ReleaseSpecReadLock(ss); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_ReleaseSSL3HandshakeLock(ss); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_ReleaseRecvBufLock(ss); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PORT_ZFree(val, valLen); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rv; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 410