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