| 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 |