OLD | NEW |
1 /* This Source Code Form is subject to the terms of the Mozilla Public | 1 /* This Source Code Form is subject to the terms of the Mozilla Public |
2 * License, v. 2.0. If a copy of the MPL was not distributed with this | 2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
4 /* | 4 /* |
5 * This file implements PKCS 11 on top of our existing security modules | 5 * This file implements PKCS 11 on top of our existing security modules |
6 * | 6 * |
7 * For more information about PKCS 11 See PKCS 11 Token Inteface Standard. | 7 * For more information about PKCS 11 See PKCS 11 Token Inteface Standard. |
8 * This implementation has two slots: | 8 * This implementation has two slots: |
9 * slot 1 is our generic crypto support. It does not require login. | 9 * slot 1 is our generic crypto support. It does not require login. |
10 * It supports Public Key ops, and all they bulk ciphers and hashes. | 10 * It supports Public Key ops, and all they bulk ciphers and hashes. |
(...skipping 2229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2240 | 2240 |
2241 case CKM_SSL3_MD5_MAC: | 2241 case CKM_SSL3_MD5_MAC: |
2242 crv = sftk_doSSLMACInit(context,SEC_OID_MD5,key, | 2242 crv = sftk_doSSLMACInit(context,SEC_OID_MD5,key, |
2243 *(CK_ULONG *)pMechanism->pParameter); | 2243 *(CK_ULONG *)pMechanism->pParameter); |
2244 break; | 2244 break; |
2245 case CKM_SSL3_SHA1_MAC: | 2245 case CKM_SSL3_SHA1_MAC: |
2246 crv = sftk_doSSLMACInit(context,SEC_OID_SHA1,key, | 2246 crv = sftk_doSSLMACInit(context,SEC_OID_SHA1,key, |
2247 *(CK_ULONG *)pMechanism->pParameter); | 2247 *(CK_ULONG *)pMechanism->pParameter); |
2248 break; | 2248 break; |
2249 case CKM_TLS_PRF_GENERAL: | 2249 case CKM_TLS_PRF_GENERAL: |
2250 » crv = sftk_TLSPRFInit(context, key, key_type); | 2250 » crv = sftk_TLSPRFInit(context, key, key_type, HASH_AlgNULL); |
| 2251 » break; |
| 2252 case CKM_NSS_TLS_PRF_GENERAL_SHA256: |
| 2253 » crv = sftk_TLSPRFInit(context, key, key_type, HASH_AlgSHA256); |
2251 break; | 2254 break; |
2252 | 2255 |
2253 case CKM_NSS_HMAC_CONSTANT_TIME: { | 2256 case CKM_NSS_HMAC_CONSTANT_TIME: { |
2254 sftk_MACConstantTimeCtx *ctx = | 2257 sftk_MACConstantTimeCtx *ctx = |
2255 sftk_HMACConstantTime_New(pMechanism,key); | 2258 sftk_HMACConstantTime_New(pMechanism,key); |
2256 CK_ULONG *intpointer; | 2259 CK_ULONG *intpointer; |
2257 | 2260 |
2258 if (ctx == NULL) { | 2261 if (ctx == NULL) { |
2259 crv = CKR_ARGUMENTS_BAD; | 2262 crv = CKR_ARGUMENTS_BAD; |
2260 break; | 2263 break; |
(...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2796 | 2799 |
2797 case CKM_SSL3_MD5_MAC: | 2800 case CKM_SSL3_MD5_MAC: |
2798 crv = sftk_doSSLMACInit(context,SEC_OID_MD5,key, | 2801 crv = sftk_doSSLMACInit(context,SEC_OID_MD5,key, |
2799 *(CK_ULONG *)pMechanism->pParameter); | 2802 *(CK_ULONG *)pMechanism->pParameter); |
2800 break; | 2803 break; |
2801 case CKM_SSL3_SHA1_MAC: | 2804 case CKM_SSL3_SHA1_MAC: |
2802 crv = sftk_doSSLMACInit(context,SEC_OID_SHA1,key, | 2805 crv = sftk_doSSLMACInit(context,SEC_OID_SHA1,key, |
2803 *(CK_ULONG *)pMechanism->pParameter); | 2806 *(CK_ULONG *)pMechanism->pParameter); |
2804 break; | 2807 break; |
2805 case CKM_TLS_PRF_GENERAL: | 2808 case CKM_TLS_PRF_GENERAL: |
2806 » crv = sftk_TLSPRFInit(context, key, key_type); | 2809 » crv = sftk_TLSPRFInit(context, key, key_type, HASH_AlgNULL); |
| 2810 » break; |
| 2811 case CKM_NSS_TLS_PRF_GENERAL_SHA256: |
| 2812 » crv = sftk_TLSPRFInit(context, key, key_type, HASH_AlgSHA256); |
2807 break; | 2813 break; |
2808 | 2814 |
2809 default: | 2815 default: |
2810 crv = CKR_MECHANISM_INVALID; | 2816 crv = CKR_MECHANISM_INVALID; |
2811 break; | 2817 break; |
2812 } | 2818 } |
2813 | 2819 |
2814 if (crv != CKR_OK) { | 2820 if (crv != CKR_OK) { |
2815 if (info) PORT_Free(info); | 2821 if (info) PORT_Free(info); |
2816 sftk_FreeContext(context); | 2822 sftk_FreeContext(context); |
(...skipping 2647 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5464 CK_ULONG macSize; | 5470 CK_ULONG macSize; |
5465 CK_ULONG tmpKeySize; | 5471 CK_ULONG tmpKeySize; |
5466 CK_ULONG IVSize; | 5472 CK_ULONG IVSize; |
5467 CK_ULONG keySize = 0; | 5473 CK_ULONG keySize = 0; |
5468 CK_RV crv = CKR_OK; | 5474 CK_RV crv = CKR_OK; |
5469 CK_BBOOL cktrue = CK_TRUE; | 5475 CK_BBOOL cktrue = CK_TRUE; |
5470 CK_KEY_TYPE keyType = CKK_GENERIC_SECRET; | 5476 CK_KEY_TYPE keyType = CKK_GENERIC_SECRET; |
5471 CK_OBJECT_CLASS classType = CKO_SECRET_KEY; | 5477 CK_OBJECT_CLASS classType = CKO_SECRET_KEY; |
5472 CK_KEY_DERIVATION_STRING_DATA *stringPtr; | 5478 CK_KEY_DERIVATION_STRING_DATA *stringPtr; |
5473 PRBool isTLS = PR_FALSE; | 5479 PRBool isTLS = PR_FALSE; |
| 5480 PRBool isSHA256 = PR_FALSE; |
5474 PRBool isDH = PR_FALSE; | 5481 PRBool isDH = PR_FALSE; |
5475 SECStatus rv; | 5482 SECStatus rv; |
5476 int i; | 5483 int i; |
5477 unsigned int outLen; | 5484 unsigned int outLen; |
5478 unsigned char sha_out[SHA1_LENGTH]; | 5485 unsigned char sha_out[SHA1_LENGTH]; |
5479 unsigned char key_block[NUM_MIXERS * MD5_LENGTH]; | 5486 unsigned char key_block[NUM_MIXERS * MD5_LENGTH]; |
5480 unsigned char key_block2[MD5_LENGTH]; | 5487 unsigned char key_block2[MD5_LENGTH]; |
5481 PRBool isFIPS; | 5488 PRBool isFIPS; |
5482 HASH_HashType hashType; | 5489 HASH_HashType hashType; |
5483 PRBool extractValue = PR_TRUE; | 5490 PRBool extractValue = PR_TRUE; |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5563 sftk_FreeObject(key); | 5570 sftk_FreeObject(key); |
5564 sftk_FreeObject(sourceKey); | 5571 sftk_FreeObject(sourceKey); |
5565 return CKR_KEY_HANDLE_INVALID; | 5572 return CKR_KEY_HANDLE_INVALID; |
5566 } | 5573 } |
5567 } | 5574 } |
5568 | 5575 |
5569 switch (pMechanism->mechanism) { | 5576 switch (pMechanism->mechanism) { |
5570 /* | 5577 /* |
5571 * generate the master secret | 5578 * generate the master secret |
5572 */ | 5579 */ |
| 5580 case CKM_NSS_TLS_MASTER_KEY_DERIVE_SHA256: |
| 5581 case CKM_NSS_TLS_MASTER_KEY_DERIVE_DH_SHA256: |
| 5582 isSHA256 = PR_TRUE; |
| 5583 /* fall thru */ |
5573 case CKM_TLS_MASTER_KEY_DERIVE: | 5584 case CKM_TLS_MASTER_KEY_DERIVE: |
5574 case CKM_TLS_MASTER_KEY_DERIVE_DH: | 5585 case CKM_TLS_MASTER_KEY_DERIVE_DH: |
5575 isTLS = PR_TRUE; | 5586 isTLS = PR_TRUE; |
5576 /* fall thru */ | 5587 /* fall thru */ |
5577 case CKM_SSL3_MASTER_KEY_DERIVE: | 5588 case CKM_SSL3_MASTER_KEY_DERIVE: |
5578 case CKM_SSL3_MASTER_KEY_DERIVE_DH: | 5589 case CKM_SSL3_MASTER_KEY_DERIVE_DH: |
5579 { | 5590 { |
5580 CK_SSL3_MASTER_KEY_DERIVE_PARAMS *ssl3_master; | 5591 CK_SSL3_MASTER_KEY_DERIVE_PARAMS *ssl3_master; |
5581 SSL3RSAPreMasterSecret * rsa_pms; | 5592 SSL3RSAPreMasterSecret * rsa_pms; |
5582 unsigned char crsrdata[SSL3_RANDOM_LENGTH * 2]; | 5593 unsigned char crsrdata[SSL3_RANDOM_LENGTH * 2]; |
5583 | 5594 |
5584 if ((pMechanism->mechanism == CKM_SSL3_MASTER_KEY_DERIVE_DH) || | 5595 if ((pMechanism->mechanism == CKM_SSL3_MASTER_KEY_DERIVE_DH) || |
5585 (pMechanism->mechanism == CKM_TLS_MASTER_KEY_DERIVE_DH)) | 5596 (pMechanism->mechanism == CKM_TLS_MASTER_KEY_DERIVE_DH) || |
| 5597 (pMechanism->mechanism == CKM_NSS_TLS_MASTER_KEY_DERIVE_DH_SHA256)) |
5586 isDH = PR_TRUE; | 5598 isDH = PR_TRUE; |
5587 | 5599 |
5588 /* first do the consistancy checks */ | 5600 /* first do the consistancy checks */ |
5589 if (!isDH && (att->attrib.ulValueLen != SSL3_PMS_LENGTH)) { | 5601 if (!isDH && (att->attrib.ulValueLen != SSL3_PMS_LENGTH)) { |
5590 crv = CKR_KEY_TYPE_INCONSISTENT; | 5602 crv = CKR_KEY_TYPE_INCONSISTENT; |
5591 break; | 5603 break; |
5592 } | 5604 } |
5593 att2 = sftk_FindAttribute(sourceKey,CKA_KEY_TYPE); | 5605 att2 = sftk_FindAttribute(sourceKey,CKA_KEY_TYPE); |
5594 if ((att2 == NULL) || (*(CK_KEY_TYPE *)att2->attrib.pValue != | 5606 if ((att2 == NULL) || (*(CK_KEY_TYPE *)att2->attrib.pValue != |
5595 CKK_GENERIC_SECRET)) { | 5607 CKK_GENERIC_SECRET)) { |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5643 SECItem master = { siBuffer, NULL, 0 }; | 5655 SECItem master = { siBuffer, NULL, 0 }; |
5644 SECItem pms = { siBuffer, NULL, 0 }; | 5656 SECItem pms = { siBuffer, NULL, 0 }; |
5645 | 5657 |
5646 crsr.data = crsrdata; | 5658 crsr.data = crsrdata; |
5647 crsr.len = sizeof crsrdata; | 5659 crsr.len = sizeof crsrdata; |
5648 master.data = key_block; | 5660 master.data = key_block; |
5649 master.len = SSL3_MASTER_SECRET_LENGTH; | 5661 master.len = SSL3_MASTER_SECRET_LENGTH; |
5650 pms.data = (unsigned char*)att->attrib.pValue; | 5662 pms.data = (unsigned char*)att->attrib.pValue; |
5651 pms.len = att->attrib.ulValueLen; | 5663 pms.len = att->attrib.ulValueLen; |
5652 | 5664 |
5653 » status = TLS_PRF(&pms, "master secret", &crsr, &master, isFIPS); | 5665 » if (isSHA256) { |
| 5666 » » status = TLS_P_hash(HASH_AlgSHA256, &pms, "master secret", |
| 5667 » » » » &crsr, &master, isFIPS); |
| 5668 » } else { |
| 5669 » » status = TLS_PRF(&pms, "master secret", &crsr, &master, isFIPS); |
| 5670 » } |
5654 if (status != SECSuccess) { | 5671 if (status != SECSuccess) { |
5655 crv = CKR_FUNCTION_FAILED; | 5672 crv = CKR_FUNCTION_FAILED; |
5656 break; | 5673 break; |
5657 } | 5674 } |
5658 } else { | 5675 } else { |
5659 /* now allocate the hash contexts */ | 5676 /* now allocate the hash contexts */ |
5660 md5 = MD5_NewContext(); | 5677 md5 = MD5_NewContext(); |
5661 if (md5 == NULL) { | 5678 if (md5 == NULL) { |
5662 crv = CKR_HOST_MEMORY; | 5679 crv = CKR_HOST_MEMORY; |
5663 break; | 5680 break; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5702 if (crv != CKR_OK) break; | 5719 if (crv != CKR_OK) break; |
5703 crv = sftk_forceAttribute(key,CKA_VERIFY,&cktrue,sizeof(CK_BBOOL)); | 5720 crv = sftk_forceAttribute(key,CKA_VERIFY,&cktrue,sizeof(CK_BBOOL)); |
5704 if (crv != CKR_OK) break; | 5721 if (crv != CKR_OK) break; |
5705 /* While we're here, we might as well force this, too. */ | 5722 /* While we're here, we might as well force this, too. */ |
5706 crv = sftk_forceAttribute(key,CKA_DERIVE,&cktrue,sizeof(CK_BBOOL)); | 5723 crv = sftk_forceAttribute(key,CKA_DERIVE,&cktrue,sizeof(CK_BBOOL)); |
5707 if (crv != CKR_OK) break; | 5724 if (crv != CKR_OK) break; |
5708 } | 5725 } |
5709 break; | 5726 break; |
5710 } | 5727 } |
5711 | 5728 |
| 5729 case CKM_NSS_TLS_KEY_AND_MAC_DERIVE_SHA256: |
| 5730 isSHA256 = PR_TRUE; |
| 5731 /* fall thru */ |
5712 case CKM_TLS_KEY_AND_MAC_DERIVE: | 5732 case CKM_TLS_KEY_AND_MAC_DERIVE: |
5713 isTLS = PR_TRUE; | 5733 isTLS = PR_TRUE; |
5714 /* fall thru */ | 5734 /* fall thru */ |
5715 case CKM_SSL3_KEY_AND_MAC_DERIVE: | 5735 case CKM_SSL3_KEY_AND_MAC_DERIVE: |
5716 { | 5736 { |
5717 CK_SSL3_KEY_MAT_PARAMS *ssl3_keys; | 5737 CK_SSL3_KEY_MAT_PARAMS *ssl3_keys; |
5718 CK_SSL3_KEY_MAT_OUT * ssl3_keys_out; | 5738 CK_SSL3_KEY_MAT_OUT * ssl3_keys_out; |
5719 CK_ULONG effKeySize; | 5739 CK_ULONG effKeySize; |
5720 unsigned int block_needed; | 5740 unsigned int block_needed; |
5721 unsigned char srcrdata[SSL3_RANDOM_LENGTH * 2]; | 5741 unsigned char srcrdata[SSL3_RANDOM_LENGTH * 2]; |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5793 SECItem keyblk = { siBuffer, NULL, 0 }; | 5813 SECItem keyblk = { siBuffer, NULL, 0 }; |
5794 SECItem master = { siBuffer, NULL, 0 }; | 5814 SECItem master = { siBuffer, NULL, 0 }; |
5795 | 5815 |
5796 srcr.data = srcrdata; | 5816 srcr.data = srcrdata; |
5797 srcr.len = sizeof srcrdata; | 5817 srcr.len = sizeof srcrdata; |
5798 keyblk.data = key_block; | 5818 keyblk.data = key_block; |
5799 keyblk.len = block_needed; | 5819 keyblk.len = block_needed; |
5800 master.data = (unsigned char*)att->attrib.pValue; | 5820 master.data = (unsigned char*)att->attrib.pValue; |
5801 master.len = att->attrib.ulValueLen; | 5821 master.len = att->attrib.ulValueLen; |
5802 | 5822 |
5803 » status = TLS_PRF(&master, "key expansion", &srcr, &keyblk, | 5823 » if (isSHA256) { |
5804 » » » isFIPS); | 5824 » » status = TLS_P_hash(HASH_AlgSHA256, &master, "key expansion", |
| 5825 » » » » &srcr, &keyblk, isFIPS); |
| 5826 » } else { |
| 5827 » » status = TLS_PRF(&master, "key expansion", &srcr, &keyblk, |
| 5828 » » » » isFIPS); |
| 5829 » } |
5805 if (status != SECSuccess) { | 5830 if (status != SECSuccess) { |
5806 goto key_and_mac_derive_fail; | 5831 goto key_and_mac_derive_fail; |
5807 } | 5832 } |
5808 } else { | 5833 } else { |
5809 unsigned int block_bytes = 0; | 5834 unsigned int block_bytes = 0; |
5810 /* key_block = | 5835 /* key_block = |
5811 * MD5(master_secret + SHA('A' + master_secret + | 5836 * MD5(master_secret + SHA('A' + master_secret + |
5812 * ServerHello.random + ClientHello.random)) + | 5837 * ServerHello.random + ClientHello.random)) + |
5813 * MD5(master_secret + SHA('BB' + master_secret + | 5838 * MD5(master_secret + SHA('BB' + master_secret + |
5814 * ServerHello.random + ClientHello.random)) + | 5839 * ServerHello.random + ClientHello.random)) + |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5951 ** MD5(ServerHello.random + ClientHello.random); | 5976 ** MD5(ServerHello.random + ClientHello.random); |
5952 */ | 5977 */ |
5953 MD5_Begin(md5); | 5978 MD5_Begin(md5); |
5954 MD5_Update(md5, srcrdata, sizeof srcrdata); | 5979 MD5_Update(md5, srcrdata, sizeof srcrdata); |
5955 MD5_End(md5, key_block2, &outLen, MD5_LENGTH); | 5980 MD5_End(md5, key_block2, &outLen, MD5_LENGTH); |
5956 PORT_Memcpy(ssl3_keys_out->pIVServer, key_block2, IVSize); | 5981 PORT_Memcpy(ssl3_keys_out->pIVServer, key_block2, IVSize); |
5957 | 5982 |
5958 } else { | 5983 } else { |
5959 | 5984 |
5960 /* | 5985 /* |
5961 » » ** Generate TLS Export write keys and IVs. | 5986 » » ** Generate TLS 1.0 Export write keys and IVs. |
5962 */ | 5987 */ |
5963 SECStatus status; | 5988 SECStatus status; |
5964 SECItem secret = { siBuffer, NULL, 0 }; | 5989 SECItem secret = { siBuffer, NULL, 0 }; |
5965 SECItem crsr = { siBuffer, NULL, 0 }; | 5990 SECItem crsr = { siBuffer, NULL, 0 }; |
5966 SECItem keyblk = { siBuffer, NULL, 0 }; | 5991 SECItem keyblk = { siBuffer, NULL, 0 }; |
5967 | 5992 |
5968 /* | 5993 /* |
5969 ** client_write_key[CipherSpec.key_material] | 5994 ** client_write_key[CipherSpec.key_material] |
5970 ** final_client_write_key = PRF(client_write_key, | 5995 ** final_client_write_key = PRF(client_write_key, |
5971 ** "client write key", | 5996 ** "client write key", |
(...skipping 950 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6922 att = sftk_FindAttribute(key,CKA_VALUE); | 6947 att = sftk_FindAttribute(key,CKA_VALUE); |
6923 sftk_FreeObject(key); | 6948 sftk_FreeObject(key); |
6924 if (!att) { | 6949 if (!att) { |
6925 return CKR_KEY_HANDLE_INVALID; | 6950 return CKR_KEY_HANDLE_INVALID; |
6926 } | 6951 } |
6927 crv = NSC_DigestUpdate(hSession,(CK_BYTE_PTR)att->attrib.pValue, | 6952 crv = NSC_DigestUpdate(hSession,(CK_BYTE_PTR)att->attrib.pValue, |
6928 att->attrib.ulValueLen); | 6953 att->attrib.ulValueLen); |
6929 sftk_FreeAttribute(att); | 6954 sftk_FreeAttribute(att); |
6930 return crv; | 6955 return crv; |
6931 } | 6956 } |
OLD | NEW |