sslinfo.c revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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/. */ 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* $Id: sslinfo.c,v 1.31 2012/08/03 23:54:31 wtc%google.com Exp $ */ 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ssl.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sslimpl.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sslproto.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char * 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ssl_GetCompressionMethodName(SSLCompressionMethod compression) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (compression) { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ssl_compression_null: 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "NULL"; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef NSS_ENABLE_ZLIB 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ssl_compression_deflate: 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "DEFLATE"; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "???"; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SECStatus 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSL_GetChannelInfo(PRFileDesc *fd, SSLChannelInfo *info, PRUintn len) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sslSocket * ss; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLChannelInfo inf; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sslSessionID * sid; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRBool enoughFirstHsDone = PR_FALSE; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!info || len < sizeof inf.length) { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PORT_SetError(SEC_ERROR_INVALID_ARGS); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SECFailure; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ss = ssl_FindSocket(fd); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ss) { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSL_DBG(("%d: SSL[%d]: bad socket in SSL_GetChannelInfo", 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSL_GETPID(), fd)); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SECFailure; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(&inf, 0, sizeof inf); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.length = PR_MIN(sizeof inf, len); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ss->firstHsDone) { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enoughFirstHsDone = PR_TRUE; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ss->version >= SSL_LIBRARY_VERSION_3_0 && 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl3_CanFalseStart(ss)) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enoughFirstHsDone = PR_TRUE; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ss->opt.useSecurity && enoughFirstHsDone) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sid = ss->sec.ci.sid; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.protocolVersion = ss->version; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.authKeyBits = ss->sec.authKeyBits; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.keaKeyBits = ss->sec.keaKeyBits; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ss->version < SSL_LIBRARY_VERSION_3_0) { /* SSL2 */ 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.cipherSuite = ss->sec.cipherType | 0xff00; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.compressionMethod = ssl_compression_null; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.compressionMethodName = "N/A"; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ss->ssl3.initialized) { /* SSL3 and TLS */ 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_GetSpecReadLock(ss); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* XXX The cipher suite should be in the specs and this 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * function should get it from cwSpec rather than from the "hs". 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * See bug 275744 comment 69 and bug 766137. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.cipherSuite = ss->ssl3.hs.cipher_suite; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.compressionMethod = ss->ssl3.cwSpec->compression_method; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_ReleaseSpecReadLock(ss); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.compressionMethodName = 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_GetCompressionMethodName(inf.compressionMethod); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sid) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.creationTime = sid->creationTime; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.lastAccessTime = sid->lastAccessTime; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.expirationTime = sid->expirationTime; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ss->version < SSL_LIBRARY_VERSION_3_0) { /* SSL2 */ 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.sessionIDLength = SSL2_SESSIONID_BYTES; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(inf.sessionID, sid->u.ssl2.sessionID, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSL2_SESSIONID_BYTES); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int sidLen = sid->u.ssl3.sessionIDLength; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sidLen = PR_MIN(sidLen, sizeof inf.sessionID); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inf.sessionIDLength = sidLen; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(inf.sessionID, sid->u.ssl3.sessionID, sidLen); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(info, &inf, inf.length); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SECSuccess; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CS(x) x, #x 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CK(x) x | 0xff00, #x 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define S_DSA "DSA", ssl_auth_dsa 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define S_RSA "RSA", ssl_auth_rsa 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define S_KEA "KEA", ssl_auth_kea 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define S_ECDSA "ECDSA", ssl_auth_ecdsa 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define K_DHE "DHE", kt_dh 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define K_RSA "RSA", kt_rsa 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define K_KEA "KEA", kt_kea 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define K_ECDH "ECDH", kt_ecdh 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define K_ECDHE "ECDHE", kt_ecdh 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define C_SEED "SEED", calg_seed 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define C_CAMELLIA "CAMELLIA", calg_camellia 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define C_AES "AES", calg_aes 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define C_RC4 "RC4", calg_rc4 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define C_RC2 "RC2", calg_rc2 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define C_DES "DES", calg_des 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define C_3DES "3DES", calg_3des 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define C_NULL "NULL", calg_null 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define C_SJ "SKIPJACK", calg_sj 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define B_256 256, 256, 256 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define B_128 128, 128, 128 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define B_3DES 192, 156, 112 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define B_SJ 96, 80, 80 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define B_DES 64, 56, 56 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define B_56 128, 56, 56 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define B_40 128, 40, 40 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define B_0 0, 0, 0 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define M_SHA "SHA1", ssl_mac_sha, 160 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define M_MD5 "MD5", ssl_mac_md5, 128 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const SSLCipherSuiteInfo suiteInfo[] = { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* <------ Cipher suite --------------------> <auth> <KEA> <bulk cipher> <MAC> <FIPS> */ 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (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, }, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (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, }, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (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, }, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (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, }, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_RSA_WITH_CAMELLIA_256_CBC_SHA), S_RSA, K_RSA, C_CAMELLIA, B_256, M_SHA, 0, 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, }, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (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, }, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (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, }, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_RSA_WITH_SEED_CBC_SHA), S_RSA, K_RSA, C_SEED,B_128, M_SHA, 1, 0, 0, }, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_RSA_WITH_CAMELLIA_128_CBC_SHA), S_RSA, K_RSA, C_CAMELLIA, B_128, M_SHA, 0, 0, 0, }, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(SSL_RSA_WITH_RC4_128_SHA), S_RSA, K_RSA, C_RC4, B_128, M_SHA, 0, 0, 0, }, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(SSL_RSA_WITH_RC4_128_MD5), S_RSA, K_RSA, C_RC4, B_128, M_MD5, 0, 0, 0, }, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_RSA_WITH_AES_128_CBC_SHA), S_RSA, K_RSA, C_AES, B_128, M_SHA, 1, 0, 0, }, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (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, }, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (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, }, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (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, }, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(SSL_RSA_WITH_3DES_EDE_CBC_SHA), S_RSA, K_RSA, C_3DES,B_3DES,M_SHA, 1, 0, 0, }, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(SSL_DHE_RSA_WITH_DES_CBC_SHA), S_RSA, K_DHE, C_DES, B_DES, M_SHA, 0, 0, 0, }, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(SSL_DHE_DSS_WITH_DES_CBC_SHA), S_DSA, K_DHE, C_DES, B_DES, M_SHA, 0, 0, 0, }, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(SSL_RSA_FIPS_WITH_DES_CBC_SHA), S_RSA, K_RSA, C_DES, B_DES, M_SHA, 0, 0, 1, }, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(SSL_RSA_WITH_DES_CBC_SHA), S_RSA, K_RSA, C_DES, B_DES, M_SHA, 0, 0, 0, }, 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_RSA_EXPORT1024_WITH_RC4_56_SHA), S_RSA, K_RSA, C_RC4, B_56, M_SHA, 0, 1, 0, }, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA), S_RSA, K_RSA, C_DES, B_DES, M_SHA, 0, 1, 0, }, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(SSL_RSA_EXPORT_WITH_RC4_40_MD5), S_RSA, K_RSA, C_RC4, B_40, M_MD5, 0, 1, 0, }, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (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, }, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(SSL_RSA_WITH_NULL_SHA), S_RSA, K_RSA, C_NULL,B_0, M_SHA, 0, 1, 0, }, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(SSL_RSA_WITH_NULL_MD5), S_RSA, K_RSA, C_NULL,B_0, M_MD5, 0, 1, 0, }, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef NSS_ENABLE_ECC 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* ECC cipher suites */ 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDH_ECDSA_WITH_NULL_SHA), S_ECDSA, K_ECDH, C_NULL, B_0, M_SHA, 0, 0, 0, }, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDH_ECDSA_WITH_RC4_128_SHA), S_ECDSA, K_ECDH, C_RC4, B_128, M_SHA, 0, 0, 0, }, 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (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, }, 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (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, }, 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (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, }, 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDHE_ECDSA_WITH_NULL_SHA), S_ECDSA, K_ECDHE, C_NULL, B_0, M_SHA, 0, 0, 0, }, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDHE_ECDSA_WITH_RC4_128_SHA), S_ECDSA, K_ECDHE, C_RC4, B_128, M_SHA, 0, 0, 0, }, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (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, }, 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (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, }, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (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, }, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDH_RSA_WITH_NULL_SHA), S_RSA, K_ECDH, C_NULL, B_0, M_SHA, 0, 0, 0, }, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDH_RSA_WITH_RC4_128_SHA), S_RSA, K_ECDH, C_RC4, B_128, M_SHA, 0, 0, 0, }, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (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, }, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (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, }, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (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, }, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDHE_RSA_WITH_NULL_SHA), S_RSA, K_ECDHE, C_NULL, B_0, M_SHA, 0, 0, 0, }, 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CS(TLS_ECDHE_RSA_WITH_RC4_128_SHA), S_RSA, K_ECDHE, C_RC4, B_128, M_SHA, 0, 0, 0, }, 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (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, }, 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (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, }, 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (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, }, 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* NSS_ENABLE_ECC */ 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* SSL 2 table */ 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CK(SSL_CK_RC4_128_WITH_MD5), S_RSA, K_RSA, C_RC4, B_128, M_MD5, 0, 0, 0, }, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CK(SSL_CK_RC2_128_CBC_WITH_MD5), S_RSA, K_RSA, C_RC2, B_128, M_MD5, 0, 0, 0, }, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (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, }, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CK(SSL_CK_DES_64_CBC_WITH_MD5), S_RSA, K_RSA, C_DES, B_DES, M_MD5, 0, 0, 0, }, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){0,CK(SSL_CK_RC4_128_EXPORT40_WITH_MD5), S_RSA, K_RSA, C_RC4, B_40, M_MD5, 0, 1, 0, }, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (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, } 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NUM_SUITEINFOS ((sizeof suiteInfo) / (sizeof suiteInfo[0])) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SECStatus SSL_GetCipherSuiteInfo(PRUint16 cipherSuite, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLCipherSuiteInfo *info, PRUintn len) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int i; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len = PR_MIN(len, sizeof suiteInfo[0]); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!info || len < sizeof suiteInfo[0].length) { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PORT_SetError(SEC_ERROR_INVALID_ARGS); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SECFailure; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < NUM_SUITEINFOS; i++) { 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (suiteInfo[i].cipherSuite == cipherSuite) { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(info, &suiteInfo[i], len); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info->length = len; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SECSuccess; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PORT_SetError(SEC_ERROR_INVALID_ARGS); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SECFailure; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This function might be a candidate to be public. 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Disables all export ciphers in the default set of enabled ciphers. 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SECStatus 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSL_DisableDefaultExportCipherSuites(void) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SSLCipherSuiteInfo * pInfo = suiteInfo; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int i; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SECStatus rv; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < NUM_SUITEINFOS; ++i, ++pInfo) { 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pInfo->isExportable) { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = SSL_CipherPrefSetDefault(pInfo->cipherSuite, PR_FALSE); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PORT_Assert(rv == SECSuccess); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SECSuccess; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* This function might be a candidate to be public, 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * except that it takes an sslSocket pointer as an argument. 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A Public version would take a PRFileDesc pointer. 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Disables all export ciphers in the default set of enabled ciphers. 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SECStatus 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSL_DisableExportCipherSuites(PRFileDesc * fd) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SSLCipherSuiteInfo * pInfo = suiteInfo; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int i; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SECStatus rv; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < NUM_SUITEINFOS; ++i, ++pInfo) { 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pInfo->isExportable) { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = SSL_CipherPrefSet(fd, pInfo->cipherSuite, PR_FALSE); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PORT_Assert(rv == SECSuccess); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SECSuccess; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Tells us if the named suite is exportable 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * returns false for unknown suites. 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PRBool 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSL_IsExportCipherSuite(PRUint16 cipherSuite) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int i; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < NUM_SUITEINFOS; i++) { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (suiteInfo[i].cipherSuite == cipherSuite) { 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (PRBool)(suiteInfo[i].isExportable); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PR_FALSE; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SECItem* 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSL_GetNegotiatedHostInfo(PRFileDesc *fd) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SECItem *sniName = NULL; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sslSocket *ss; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *name = NULL; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ss = ssl_FindSocket(fd); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ss) { 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSL_DBG(("%d: SSL[%d]: bad socket in SSL_GetNegotiatedHostInfo", 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSL_GETPID(), fd)); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ss->sec.isServer) { 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ss->version > SSL_LIBRARY_VERSION_3_0 && 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ss->ssl3.initialized) { /* TLS */ 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SECItem *crsName; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_GetSpecReadLock(ss); /*********************************/ 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) crsName = &ss->ssl3.cwSpec->srvVirtName; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (crsName->data) { 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sniName = SECITEM_DupItem(crsName); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_ReleaseSpecReadLock(ss); /*----------------------------*/ 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sniName; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = SSL_RevealURL(fd); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name) { 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sniName = PORT_ZNew(SECItem); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!sniName) { 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PORT_Free(name); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sniName->data = (void*)name; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sniName->len = PORT_Strlen(name); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return sniName; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SECStatus 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SSL_ExportKeyingMaterial(PRFileDesc *fd, 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *label, unsigned int labelLen, 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PRBool hasContext, 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unsigned char *context, unsigned int contextLen, 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char *out, unsigned int outLen) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sslSocket *ss; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned char *val = NULL; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int valLen, i; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SECStatus rv = SECFailure; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ss = ssl_FindSocket(fd); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ss) { 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSL_DBG(("%d: SSL[%d]: bad socket in ExportKeyingMaterial", 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSL_GETPID(), fd)); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SECFailure; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_GetRecvBufLock(ss); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_GetSSL3HandshakeLock(ss); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ss->version < SSL_LIBRARY_VERSION_3_1_TLS) { 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PORT_SetError(SSL_ERROR_FEATURE_NOT_SUPPORTED_FOR_VERSION); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_ReleaseSSL3HandshakeLock(ss); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_ReleaseRecvBufLock(ss); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SECFailure; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* construct PRF arguments */ 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) valLen = SSL3_RANDOM_LENGTH * 2; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (hasContext) { 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) valLen += 2 /* uint16 length */ + contextLen; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = PORT_Alloc(valLen); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!val) { 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_ReleaseSSL3HandshakeLock(ss); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_ReleaseRecvBufLock(ss); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SECFailure; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i = 0; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PORT_Memcpy(val + i, &ss->ssl3.hs.client_random.rand, SSL3_RANDOM_LENGTH); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i += SSL3_RANDOM_LENGTH; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PORT_Memcpy(val + i, &ss->ssl3.hs.server_random.rand, SSL3_RANDOM_LENGTH); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i += SSL3_RANDOM_LENGTH; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (hasContext) { 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val[i++] = contextLen >> 8; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val[i++] = contextLen; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PORT_Memcpy(val + i, context, contextLen); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i += contextLen; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PORT_Assert(i == valLen); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Allow TLS keying material to be exported sooner, when the master 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * secret is available and we have sent ChangeCipherSpec. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_GetSpecReadLock(ss); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ss->ssl3.cwSpec->master_secret && !ss->ssl3.cwSpec->msItem.len) { 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PORT_SetError(SSL_ERROR_HANDSHAKE_NOT_COMPLETED); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = SECFailure; 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = ssl3_TLSPRFWithMasterSecret(ss->ssl3.cwSpec, label, labelLen, val, 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) valLen, out, outLen); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_ReleaseSpecReadLock(ss); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_ReleaseSSL3HandshakeLock(ss); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssl_ReleaseRecvBufLock(ss); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PORT_ZFree(val, valLen); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rv; 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 399