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
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4
5 #include "ckcapi.h"
6
7 /*
8 * ckcapi/ctoken.c
9 *
10 * This file implements the NSSCKMDToken object for the
11 * "nss to capi" cryptoki module.
12 */
13
14 static NSSUTF8 *
ckcapi_mdToken_GetLabel(NSSCKMDToken * mdToken,NSSCKFWToken * fwToken,NSSCKMDInstance * mdInstance,NSSCKFWInstance * fwInstance,CK_RV * pError)15 ckcapi_mdToken_GetLabel(
16 NSSCKMDToken *mdToken,
17 NSSCKFWToken *fwToken,
18 NSSCKMDInstance *mdInstance,
19 NSSCKFWInstance *fwInstance,
20 CK_RV *pError)
21 {
22 return (NSSUTF8 *)nss_ckcapi_TokenLabel;
23 }
24
25 static NSSUTF8 *
ckcapi_mdToken_GetManufacturerID(NSSCKMDToken * mdToken,NSSCKFWToken * fwToken,NSSCKMDInstance * mdInstance,NSSCKFWInstance * fwInstance,CK_RV * pError)26 ckcapi_mdToken_GetManufacturerID(
27 NSSCKMDToken *mdToken,
28 NSSCKFWToken *fwToken,
29 NSSCKMDInstance *mdInstance,
30 NSSCKFWInstance *fwInstance,
31 CK_RV *pError)
32 {
33 return (NSSUTF8 *)nss_ckcapi_ManufacturerID;
34 }
35
36 static NSSUTF8 *
ckcapi_mdToken_GetModel(NSSCKMDToken * mdToken,NSSCKFWToken * fwToken,NSSCKMDInstance * mdInstance,NSSCKFWInstance * fwInstance,CK_RV * pError)37 ckcapi_mdToken_GetModel(
38 NSSCKMDToken *mdToken,
39 NSSCKFWToken *fwToken,
40 NSSCKMDInstance *mdInstance,
41 NSSCKFWInstance *fwInstance,
42 CK_RV *pError)
43 {
44 return (NSSUTF8 *)nss_ckcapi_TokenModel;
45 }
46
47 static NSSUTF8 *
ckcapi_mdToken_GetSerialNumber(NSSCKMDToken * mdToken,NSSCKFWToken * fwToken,NSSCKMDInstance * mdInstance,NSSCKFWInstance * fwInstance,CK_RV * pError)48 ckcapi_mdToken_GetSerialNumber(
49 NSSCKMDToken *mdToken,
50 NSSCKFWToken *fwToken,
51 NSSCKMDInstance *mdInstance,
52 NSSCKFWInstance *fwInstance,
53 CK_RV *pError)
54 {
55 return (NSSUTF8 *)nss_ckcapi_TokenSerialNumber;
56 }
57
58 static CK_BBOOL
ckcapi_mdToken_GetIsWriteProtected(NSSCKMDToken * mdToken,NSSCKFWToken * fwToken,NSSCKMDInstance * mdInstance,NSSCKFWInstance * fwInstance)59 ckcapi_mdToken_GetIsWriteProtected(
60 NSSCKMDToken *mdToken,
61 NSSCKFWToken *fwToken,
62 NSSCKMDInstance *mdInstance,
63 NSSCKFWInstance *fwInstance)
64 {
65 return CK_FALSE;
66 }
67
68 /* fake out Mozilla so we don't try to initialize the token */
69 static CK_BBOOL
ckcapi_mdToken_GetUserPinInitialized(NSSCKMDToken * mdToken,NSSCKFWToken * fwToken,NSSCKMDInstance * mdInstance,NSSCKFWInstance * fwInstance)70 ckcapi_mdToken_GetUserPinInitialized(
71 NSSCKMDToken *mdToken,
72 NSSCKFWToken *fwToken,
73 NSSCKMDInstance *mdInstance,
74 NSSCKFWInstance *fwInstance)
75 {
76 return CK_TRUE;
77 }
78
79 static CK_VERSION
ckcapi_mdToken_GetHardwareVersion(NSSCKMDToken * mdToken,NSSCKFWToken * fwToken,NSSCKMDInstance * mdInstance,NSSCKFWInstance * fwInstance)80 ckcapi_mdToken_GetHardwareVersion(
81 NSSCKMDToken *mdToken,
82 NSSCKFWToken *fwToken,
83 NSSCKMDInstance *mdInstance,
84 NSSCKFWInstance *fwInstance)
85 {
86 return nss_ckcapi_HardwareVersion;
87 }
88
89 static CK_VERSION
ckcapi_mdToken_GetFirmwareVersion(NSSCKMDToken * mdToken,NSSCKFWToken * fwToken,NSSCKMDInstance * mdInstance,NSSCKFWInstance * fwInstance)90 ckcapi_mdToken_GetFirmwareVersion(
91 NSSCKMDToken *mdToken,
92 NSSCKFWToken *fwToken,
93 NSSCKMDInstance *mdInstance,
94 NSSCKFWInstance *fwInstance)
95 {
96 return nss_ckcapi_FirmwareVersion;
97 }
98
99 static NSSCKMDSession *
ckcapi_mdToken_OpenSession(NSSCKMDToken * mdToken,NSSCKFWToken * fwToken,NSSCKMDInstance * mdInstance,NSSCKFWInstance * fwInstance,NSSCKFWSession * fwSession,CK_BBOOL rw,CK_RV * pError)100 ckcapi_mdToken_OpenSession(
101 NSSCKMDToken *mdToken,
102 NSSCKFWToken *fwToken,
103 NSSCKMDInstance *mdInstance,
104 NSSCKFWInstance *fwInstance,
105 NSSCKFWSession *fwSession,
106 CK_BBOOL rw,
107 CK_RV *pError)
108 {
109 return nss_ckcapi_CreateSession(fwSession, pError);
110 }
111
112 static CK_ULONG
ckcapi_mdToken_GetMechanismCount(NSSCKMDToken * mdToken,NSSCKFWToken * fwToken,NSSCKMDInstance * mdInstance,NSSCKFWInstance * fwInstance)113 ckcapi_mdToken_GetMechanismCount(
114 NSSCKMDToken *mdToken,
115 NSSCKFWToken *fwToken,
116 NSSCKMDInstance *mdInstance,
117 NSSCKFWInstance *fwInstance)
118 {
119 return (CK_ULONG)1;
120 }
121
122 static CK_RV
ckcapi_mdToken_GetMechanismTypes(NSSCKMDToken * mdToken,NSSCKFWToken * fwToken,NSSCKMDInstance * mdInstance,NSSCKFWInstance * fwInstance,CK_MECHANISM_TYPE types[])123 ckcapi_mdToken_GetMechanismTypes(
124 NSSCKMDToken *mdToken,
125 NSSCKFWToken *fwToken,
126 NSSCKMDInstance *mdInstance,
127 NSSCKFWInstance *fwInstance,
128 CK_MECHANISM_TYPE types[])
129 {
130 types[0] = CKM_RSA_PKCS;
131 return CKR_OK;
132 }
133
134 static NSSCKMDMechanism *
ckcapi_mdToken_GetMechanism(NSSCKMDToken * mdToken,NSSCKFWToken * fwToken,NSSCKMDInstance * mdInstance,NSSCKFWInstance * fwInstance,CK_MECHANISM_TYPE which,CK_RV * pError)135 ckcapi_mdToken_GetMechanism(
136 NSSCKMDToken *mdToken,
137 NSSCKFWToken *fwToken,
138 NSSCKMDInstance *mdInstance,
139 NSSCKFWInstance *fwInstance,
140 CK_MECHANISM_TYPE which,
141 CK_RV *pError)
142 {
143 if (which != CKM_RSA_PKCS) {
144 *pError = CKR_MECHANISM_INVALID;
145 return (NSSCKMDMechanism *)NULL;
146 }
147 return (NSSCKMDMechanism *)&nss_ckcapi_mdMechanismRSA;
148 }
149
150 NSS_IMPLEMENT_DATA const NSSCKMDToken
151 nss_ckcapi_mdToken = {
152 (void *)NULL, /* etc */
153 NULL, /* Setup */
154 NULL, /* Invalidate */
155 NULL, /* InitToken -- default errs */
156 ckcapi_mdToken_GetLabel,
157 ckcapi_mdToken_GetManufacturerID,
158 ckcapi_mdToken_GetModel,
159 ckcapi_mdToken_GetSerialNumber,
160 NULL, /* GetHasRNG -- default is false */
161 ckcapi_mdToken_GetIsWriteProtected,
162 NULL, /* GetLoginRequired -- default is false */
163 ckcapi_mdToken_GetUserPinInitialized,
164 NULL, /* GetRestoreKeyNotNeeded -- irrelevant */
165 NULL, /* GetHasClockOnToken -- default is false */
166 NULL, /* GetHasProtectedAuthenticationPath -- default is false */
167 NULL, /* GetSupportsDualCryptoOperations -- default is false */
168 NULL, /* GetMaxSessionCount -- default is CK_UNAVAILABLE_INFORMATION */
169 NULL, /* GetMaxRwSessionCount -- default is CK_UNAVAILABLE_INFORMATION */
170 NULL, /* GetMaxPinLen -- irrelevant */
171 NULL, /* GetMinPinLen -- irrelevant */
172 NULL, /* GetTotalPublicMemory -- default is CK_UNAVAILABLE_INFORMATION */
173 NULL, /* GetFreePublicMemory -- default is CK_UNAVAILABLE_INFORMATION */
174 NULL, /* GetTotalPrivateMemory -- default is CK_UNAVAILABLE_INFORMATION */
175 NULL, /* GetFreePrivateMemory -- default is CK_UNAVAILABLE_INFORMATION */
176 ckcapi_mdToken_GetHardwareVersion,
177 ckcapi_mdToken_GetFirmwareVersion,
178 NULL, /* GetUTCTime -- no clock */
179 ckcapi_mdToken_OpenSession,
180 ckcapi_mdToken_GetMechanismCount,
181 ckcapi_mdToken_GetMechanismTypes,
182 ckcapi_mdToken_GetMechanism,
183 (void *)NULL /* null terminator */
184 };
185