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 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
295 {CKM_DSA_PARAMETER_GEN, {DSA_MIN_P_BITS, DSA_MAX_P_BITS, | 295 {CKM_DSA_PARAMETER_GEN, {DSA_MIN_P_BITS, DSA_MAX_P_BITS, |
296 CKF_GENERATE}, PR_TRUE}, | 296 CKF_GENERATE}, PR_TRUE}, |
297 {CKM_DSA_SHA1, {DSA_MIN_P_BITS, DSA_MAX_P_BITS, | 297 {CKM_DSA_SHA1, {DSA_MIN_P_BITS, DSA_MAX_P_BITS, |
298 CKF_SN_VR}, PR_TRUE}, | 298 CKF_SN_VR}, PR_TRUE}, |
299 /* -------------------- Diffie Hellman Operations --------------------- */ | 299 /* -------------------- Diffie Hellman Operations --------------------- */ |
300 /* no diffie hellman yet */ | 300 /* no diffie hellman yet */ |
301 {CKM_DH_PKCS_KEY_PAIR_GEN, {DH_MIN_P_BITS, DH_MAX_P_BITS, | 301 {CKM_DH_PKCS_KEY_PAIR_GEN, {DH_MIN_P_BITS, DH_MAX_P_BITS, |
302 CKF_GENERATE_KEY_PAIR}, PR_TRUE}, | 302 CKF_GENERATE_KEY_PAIR}, PR_TRUE}, |
303 {CKM_DH_PKCS_DERIVE, {DH_MIN_P_BITS, DH_MAX_P_BITS, | 303 {CKM_DH_PKCS_DERIVE, {DH_MIN_P_BITS, DH_MAX_P_BITS, |
304 CKF_DERIVE}, PR_TRUE}, | 304 CKF_DERIVE}, PR_TRUE}, |
305 #ifdef NSS_ENABLE_ECC | 305 #ifndef NSS_DISABLE_ECC |
306 /* -------------------- Elliptic Curve Operations --------------------- */ | 306 /* -------------------- Elliptic Curve Operations --------------------- */ |
307 {CKM_EC_KEY_PAIR_GEN, {EC_MIN_KEY_BITS, EC_MAX_KEY_BITS, | 307 {CKM_EC_KEY_PAIR_GEN, {EC_MIN_KEY_BITS, EC_MAX_KEY_BITS, |
308 CKF_GENERATE_KEY_PAIR|CKF_EC_BPNU}, PR_TRUE}, | 308 CKF_GENERATE_KEY_PAIR|CKF_EC_BPNU}, PR_TRUE}, |
309 {CKM_ECDH1_DERIVE, {EC_MIN_KEY_BITS, EC_MAX_KEY_BITS, | 309 {CKM_ECDH1_DERIVE, {EC_MIN_KEY_BITS, EC_MAX_KEY_BITS, |
310 CKF_DERIVE|CKF_EC_BPNU}, PR_TRUE}, | 310 CKF_DERIVE|CKF_EC_BPNU}, PR_TRUE}, |
311 {CKM_ECDSA, {EC_MIN_KEY_BITS, EC_MAX_KEY_BITS, | 311 {CKM_ECDSA, {EC_MIN_KEY_BITS, EC_MAX_KEY_BITS, |
312 CKF_SN_VR|CKF_EC_BPNU}, PR_TRUE}, | 312 CKF_SN_VR|CKF_EC_BPNU}, PR_TRUE}, |
313 {CKM_ECDSA_SHA1, {EC_MIN_KEY_BITS, EC_MAX_KEY_BITS, | 313 {CKM_ECDSA_SHA1, {EC_MIN_KEY_BITS, EC_MAX_KEY_BITS, |
314 CKF_SN_VR|CKF_EC_BPNU}, PR_TRUE}, | 314 CKF_SN_VR|CKF_EC_BPNU}, PR_TRUE}, |
315 #endif /* NSS_ENABLE_ECC */ | 315 #endif /* NSS_DISABLE_ECC */ |
316 /* ------------------------- RC2 Operations --------------------------- */ | 316 /* ------------------------- RC2 Operations --------------------------- */ |
317 {CKM_RC2_KEY_GEN, {1, 128, CKF_GENERATE}, PR_TRUE}, | 317 {CKM_RC2_KEY_GEN, {1, 128, CKF_GENERATE}, PR_TRUE}, |
318 {CKM_RC2_ECB, {1, 128, CKF_EN_DE_WR_UN}, PR_TRUE}, | 318 {CKM_RC2_ECB, {1, 128, CKF_EN_DE_WR_UN}, PR_TRUE}, |
319 {CKM_RC2_CBC, {1, 128, CKF_EN_DE_WR_UN}, PR_TRUE}, | 319 {CKM_RC2_CBC, {1, 128, CKF_EN_DE_WR_UN}, PR_TRUE}, |
320 {CKM_RC2_MAC, {1, 128, CKF_SN_VR}, PR_TRUE}, | 320 {CKM_RC2_MAC, {1, 128, CKF_SN_VR}, PR_TRUE}, |
321 {CKM_RC2_MAC_GENERAL, {1, 128, CKF_SN_VR}, PR_TRUE}, | 321 {CKM_RC2_MAC_GENERAL, {1, 128, CKF_SN_VR}, PR_TRUE}, |
322 {CKM_RC2_CBC_PAD, {1, 128, CKF_EN_DE_WR_UN}, PR_TRUE}, | 322 {CKM_RC2_CBC_PAD, {1, 128, CKF_EN_DE_WR_UN}, PR_TRUE}, |
323 /* ------------------------- RC4 Operations --------------------------- */ | 323 /* ------------------------- RC4 Operations --------------------------- */ |
324 {CKM_RC4_KEY_GEN, {1, 256, CKF_GENERATE}, PR_FALSE}, | 324 {CKM_RC4_KEY_GEN, {1, 256, CKF_GENERATE}, PR_FALSE}, |
325 {CKM_RC4, {1, 256, CKF_EN_DE_WR_UN}, PR_FALSE}, | 325 {CKM_RC4, {1, 256, CKF_EN_DE_WR_UN}, PR_FALSE}, |
(...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
923 crv = sftk_ConstrainAttribute(object, CKA_VALUE, 2, DH_MAX_P_BITS, 0); | 923 crv = sftk_ConstrainAttribute(object, CKA_VALUE, 2, DH_MAX_P_BITS, 0); |
924 if (crv != CKR_OK) { | 924 if (crv != CKR_OK) { |
925 return crv; | 925 return crv; |
926 } | 926 } |
927 verify = CK_FALSE; | 927 verify = CK_FALSE; |
928 derive = CK_TRUE; | 928 derive = CK_TRUE; |
929 encrypt = CK_FALSE; | 929 encrypt = CK_FALSE; |
930 recover = CK_FALSE; | 930 recover = CK_FALSE; |
931 wrap = CK_FALSE; | 931 wrap = CK_FALSE; |
932 break; | 932 break; |
933 #ifdef NSS_ENABLE_ECC | 933 #ifndef NSS_DISABLE_ECC |
934 case CKK_EC: | 934 case CKK_EC: |
935 if ( !sftk_hasAttribute(object, CKA_EC_PARAMS)) { | 935 if ( !sftk_hasAttribute(object, CKA_EC_PARAMS)) { |
936 return CKR_TEMPLATE_INCOMPLETE; | 936 return CKR_TEMPLATE_INCOMPLETE; |
937 } | 937 } |
938 if ( !sftk_hasAttribute(object, CKA_EC_POINT)) { | 938 if ( !sftk_hasAttribute(object, CKA_EC_POINT)) { |
939 return CKR_TEMPLATE_INCOMPLETE; | 939 return CKR_TEMPLATE_INCOMPLETE; |
940 } | 940 } |
941 derive = CK_TRUE; /* for ECDH */ | 941 derive = CK_TRUE; /* for ECDH */ |
942 verify = CK_TRUE; /* for ECDSA */ | 942 verify = CK_TRUE; /* for ECDSA */ |
943 encrypt = CK_FALSE; | 943 encrypt = CK_FALSE; |
944 recover = CK_FALSE; | 944 recover = CK_FALSE; |
945 wrap = CK_FALSE; | 945 wrap = CK_FALSE; |
946 break; | 946 break; |
947 #endif /* NSS_ENABLE_ECC */ | 947 #endif /* NSS_DISABLE_ECC */ |
948 default: | 948 default: |
949 return CKR_ATTRIBUTE_VALUE_INVALID; | 949 return CKR_ATTRIBUTE_VALUE_INVALID; |
950 } | 950 } |
951 | 951 |
952 /* make sure the required fields exist */ | 952 /* make sure the required fields exist */ |
953 crv = sftk_defaultAttribute(object,CKA_SUBJECT,NULL,0); | 953 crv = sftk_defaultAttribute(object,CKA_SUBJECT,NULL,0); |
954 if (crv != CKR_OK) return crv; | 954 if (crv != CKR_OK) return crv; |
955 crv = sftk_defaultAttribute(object,CKA_ENCRYPT,&encrypt,sizeof(CK_BBOOL)); | 955 crv = sftk_defaultAttribute(object,CKA_ENCRYPT,&encrypt,sizeof(CK_BBOOL)); |
956 if (crv != CKR_OK) return crv; | 956 if (crv != CKR_OK) return crv; |
957 crv = sftk_defaultAttribute(object,CKA_VERIFY,&verify,sizeof(CK_BBOOL)); | 957 crv = sftk_defaultAttribute(object,CKA_VERIFY,&verify,sizeof(CK_BBOOL)); |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1084 if ( !sftk_hasAttribute(object, CKA_BASE)) { | 1084 if ( !sftk_hasAttribute(object, CKA_BASE)) { |
1085 return CKR_TEMPLATE_INCOMPLETE; | 1085 return CKR_TEMPLATE_INCOMPLETE; |
1086 } | 1086 } |
1087 if ( !sftk_hasAttribute(object, CKA_VALUE)) { | 1087 if ( !sftk_hasAttribute(object, CKA_VALUE)) { |
1088 return CKR_TEMPLATE_INCOMPLETE; | 1088 return CKR_TEMPLATE_INCOMPLETE; |
1089 } | 1089 } |
1090 encrypt = CK_FALSE; | 1090 encrypt = CK_FALSE; |
1091 recover = CK_FALSE; | 1091 recover = CK_FALSE; |
1092 wrap = CK_FALSE; | 1092 wrap = CK_FALSE; |
1093 break; | 1093 break; |
1094 #ifdef NSS_ENABLE_ECC | 1094 #ifndef NSS_DISABLE_ECC |
1095 case CKK_EC: | 1095 case CKK_EC: |
1096 if ( !sftk_hasAttribute(object, CKA_EC_PARAMS)) { | 1096 if ( !sftk_hasAttribute(object, CKA_EC_PARAMS)) { |
1097 return CKR_TEMPLATE_INCOMPLETE; | 1097 return CKR_TEMPLATE_INCOMPLETE; |
1098 } | 1098 } |
1099 if ( !sftk_hasAttribute(object, CKA_VALUE)) { | 1099 if ( !sftk_hasAttribute(object, CKA_VALUE)) { |
1100 return CKR_TEMPLATE_INCOMPLETE; | 1100 return CKR_TEMPLATE_INCOMPLETE; |
1101 } | 1101 } |
1102 encrypt = CK_FALSE; | 1102 encrypt = CK_FALSE; |
1103 sign = CK_TRUE; | 1103 sign = CK_TRUE; |
1104 recover = CK_FALSE; | 1104 recover = CK_FALSE; |
1105 wrap = CK_FALSE; | 1105 wrap = CK_FALSE; |
1106 break; | 1106 break; |
1107 #endif /* NSS_ENABLE_ECC */ | 1107 #endif /* NSS_DISABLE_ECC */ |
1108 case CKK_NSS_JPAKE_ROUND1: | 1108 case CKK_NSS_JPAKE_ROUND1: |
1109 if (!sftk_hasAttribute(object, CKA_PRIME) || | 1109 if (!sftk_hasAttribute(object, CKA_PRIME) || |
1110 !sftk_hasAttribute(object, CKA_SUBPRIME) || | 1110 !sftk_hasAttribute(object, CKA_SUBPRIME) || |
1111 !sftk_hasAttribute(object, CKA_BASE)) { | 1111 !sftk_hasAttribute(object, CKA_BASE)) { |
1112 return CKR_TEMPLATE_INCOMPLETE; | 1112 return CKR_TEMPLATE_INCOMPLETE; |
1113 } | 1113 } |
1114 /* fall through */ | 1114 /* fall through */ |
1115 case CKK_NSS_JPAKE_ROUND2: | 1115 case CKK_NSS_JPAKE_ROUND2: |
1116 /* CKA_NSS_JPAKE_SIGNERID and CKA_NSS_JPAKE_PEERID are checked in | 1116 /* CKA_NSS_JPAKE_SIGNERID and CKA_NSS_JPAKE_PEERID are checked in |
1117 the J-PAKE code. */ | 1117 the J-PAKE code. */ |
(...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1704 pubKey->keyType = NSSLOWKEYDHKey; | 1704 pubKey->keyType = NSSLOWKEYDHKey; |
1705 crv = sftk_Attribute2SSecItem(arena,&pubKey->u.dh.prime, | 1705 crv = sftk_Attribute2SSecItem(arena,&pubKey->u.dh.prime, |
1706 object,CKA_PRIME); | 1706 object,CKA_PRIME); |
1707 if (crv != CKR_OK) break; | 1707 if (crv != CKR_OK) break; |
1708 crv = sftk_Attribute2SSecItem(arena,&pubKey->u.dh.base, | 1708 crv = sftk_Attribute2SSecItem(arena,&pubKey->u.dh.base, |
1709 object,CKA_BASE); | 1709 object,CKA_BASE); |
1710 if (crv != CKR_OK) break; | 1710 if (crv != CKR_OK) break; |
1711 crv = sftk_Attribute2SSecItem(arena,&pubKey->u.dh.publicValue, | 1711 crv = sftk_Attribute2SSecItem(arena,&pubKey->u.dh.publicValue, |
1712 object,CKA_VALUE); | 1712 object,CKA_VALUE); |
1713 break; | 1713 break; |
1714 #ifdef NSS_ENABLE_ECC | 1714 #ifndef NSS_DISABLE_ECC |
1715 case CKK_EC: | 1715 case CKK_EC: |
1716 pubKey->keyType = NSSLOWKEYECKey; | 1716 pubKey->keyType = NSSLOWKEYECKey; |
1717 crv = sftk_Attribute2SSecItem(arena, | 1717 crv = sftk_Attribute2SSecItem(arena, |
1718 &pubKey->u.ec.ecParams.DEREncoding, | 1718 &pubKey->u.ec.ecParams.DEREncoding, |
1719 object,CKA_EC_PARAMS); | 1719 object,CKA_EC_PARAMS); |
1720 if (crv != CKR_OK) break; | 1720 if (crv != CKR_OK) break; |
1721 | 1721 |
1722 /* Fill out the rest of the ecParams structure | 1722 /* Fill out the rest of the ecParams structure |
1723 * based on the encoded params | 1723 * based on the encoded params |
1724 */ | 1724 */ |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1764 crv = CKR_ATTRIBUTE_VALUE_INVALID; | 1764 crv = CKR_ATTRIBUTE_VALUE_INVALID; |
1765 break; | 1765 break; |
1766 } | 1766 } |
1767 /* replace our previous with the decoded key */ | 1767 /* replace our previous with the decoded key */ |
1768 pubKey->u.ec.publicValue = publicValue; | 1768 pubKey->u.ec.publicValue = publicValue; |
1769 break; | 1769 break; |
1770 } | 1770 } |
1771 crv = CKR_ATTRIBUTE_VALUE_INVALID; | 1771 crv = CKR_ATTRIBUTE_VALUE_INVALID; |
1772 } | 1772 } |
1773 break; | 1773 break; |
1774 #endif /* NSS_ENABLE_ECC */ | 1774 #endif /* NSS_DISABLE_ECC */ |
1775 default: | 1775 default: |
1776 crv = CKR_KEY_TYPE_INCONSISTENT; | 1776 crv = CKR_KEY_TYPE_INCONSISTENT; |
1777 break; | 1777 break; |
1778 } | 1778 } |
1779 *crvp = crv; | 1779 *crvp = crv; |
1780 if (crv != CKR_OK) { | 1780 if (crv != CKR_OK) { |
1781 PORT_FreeArena(arena,PR_FALSE); | 1781 PORT_FreeArena(arena,PR_FALSE); |
1782 return NULL; | 1782 return NULL; |
1783 } | 1783 } |
1784 | 1784 |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1873 SFTK_SET_ITEM_TEMPLATE(itemTemplate, itemTemplateCount, | 1873 SFTK_SET_ITEM_TEMPLATE(itemTemplate, itemTemplateCount, |
1874 &privKey->u.dh.base, CKA_BASE); | 1874 &privKey->u.dh.base, CKA_BASE); |
1875 itemTemplateCount++; | 1875 itemTemplateCount++; |
1876 SFTK_SET_ITEM_TEMPLATE(itemTemplate, itemTemplateCount, | 1876 SFTK_SET_ITEM_TEMPLATE(itemTemplate, itemTemplateCount, |
1877 &privKey->u.dh.privateValue, CKA_VALUE); | 1877 &privKey->u.dh.privateValue, CKA_VALUE); |
1878 itemTemplateCount++; | 1878 itemTemplateCount++; |
1879 /* privKey was zero'd so public value is already set to NULL, 0 | 1879 /* privKey was zero'd so public value is already set to NULL, 0 |
1880 * if we don't set it explicitly */ | 1880 * if we don't set it explicitly */ |
1881 break; | 1881 break; |
1882 | 1882 |
1883 #ifdef NSS_ENABLE_ECC | 1883 #ifndef NSS_DISABLE_ECC |
1884 case CKK_EC: | 1884 case CKK_EC: |
1885 privKey->keyType = NSSLOWKEYECKey; | 1885 privKey->keyType = NSSLOWKEYECKey; |
1886 crv = sftk_Attribute2SSecItem(arena, | 1886 crv = sftk_Attribute2SSecItem(arena, |
1887 &privKey->u.ec.ecParams.DEREncoding, | 1887 &privKey->u.ec.ecParams.DEREncoding, |
1888 object,CKA_EC_PARAMS); | 1888 object,CKA_EC_PARAMS); |
1889 if (crv != CKR_OK) break; | 1889 if (crv != CKR_OK) break; |
1890 | 1890 |
1891 /* Fill out the rest of the ecParams structure | 1891 /* Fill out the rest of the ecParams structure |
1892 * based on the encoded params | 1892 * based on the encoded params |
1893 */ | 1893 */ |
(...skipping 21 matching lines...) Expand all Loading... |
1915 * Android as gcc 4.6 has a bug when targeting arm (but not | 1915 * Android as gcc 4.6 has a bug when targeting arm (but not |
1916 * thumb). The bug has been fixed in gcc 4.7. | 1916 * thumb). The bug has been fixed in gcc 4.7. |
1917 * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56561 | 1917 * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56561 |
1918 */ | 1918 */ |
1919 #if defined (__arm__) && !defined(__thumb__) && defined (__GNUC__) | 1919 #if defined (__arm__) && !defined(__thumb__) && defined (__GNUC__) |
1920 *crvp = CKR_HOST_MEMORY; | 1920 *crvp = CKR_HOST_MEMORY; |
1921 break; | 1921 break; |
1922 #endif | 1922 #endif |
1923 } | 1923 } |
1924 break; | 1924 break; |
1925 #endif /* NSS_ENABLE_ECC */ | 1925 #endif /* NSS_DISABLE_ECC */ |
1926 | 1926 |
1927 default: | 1927 default: |
1928 crv = CKR_KEY_TYPE_INCONSISTENT; | 1928 crv = CKR_KEY_TYPE_INCONSISTENT; |
1929 break; | 1929 break; |
1930 } | 1930 } |
1931 if (crv == CKR_OK && itemTemplateCount != 0) { | 1931 if (crv == CKR_OK && itemTemplateCount != 0) { |
1932 PORT_Assert(itemTemplateCount > 0); | 1932 PORT_Assert(itemTemplateCount > 0); |
1933 PORT_Assert(itemTemplateCount <= SFTK_MAX_ITEM_TEMPLATE); | 1933 PORT_Assert(itemTemplateCount <= SFTK_MAX_ITEM_TEMPLATE); |
1934 crv = sftk_MultipleAttribute2SecItem(arena, object, itemTemplate, | 1934 crv = sftk_MultipleAttribute2SecItem(arena, object, itemTemplate, |
1935 itemTemplateCount); | 1935 itemTemplateCount); |
(...skipping 2789 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4725 | 4725 |
4726 | 4726 |
4727 CK_RV NSC_WaitForSlotEvent(CK_FLAGS flags, CK_SLOT_ID_PTR pSlot, | 4727 CK_RV NSC_WaitForSlotEvent(CK_FLAGS flags, CK_SLOT_ID_PTR pSlot, |
4728 CK_VOID_PTR pReserved) | 4728 CK_VOID_PTR pReserved) |
4729 { | 4729 { |
4730 CHECK_FORK(); | 4730 CHECK_FORK(); |
4731 | 4731 |
4732 return CKR_FUNCTION_NOT_SUPPORTED; | 4732 return CKR_FUNCTION_NOT_SUPPORTED; |
4733 } | 4733 } |
4734 | 4734 |
OLD | NEW |