|
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 "ckdbm.h" |
|
6 |
|
7 static CK_RV |
|
8 nss_dbm_mdToken_Setup |
|
9 ( |
|
10 NSSCKMDToken *mdToken, |
|
11 NSSCKFWToken *fwToken, |
|
12 NSSCKMDInstance *mdInstance, |
|
13 NSSCKFWInstance *fwInstance |
|
14 ) |
|
15 { |
|
16 nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc; |
|
17 CK_RV rv = CKR_OK; |
|
18 |
|
19 token->arena = NSSCKFWToken_GetArena(fwToken, &rv); |
|
20 token->session_db = nss_dbm_db_open(token->arena, fwInstance, (char *)NULL, |
|
21 O_RDWR|O_CREAT, &rv); |
|
22 if( (nss_dbm_db_t *)NULL == token->session_db ) { |
|
23 return rv; |
|
24 } |
|
25 |
|
26 /* Add a label record if there isn't one? */ |
|
27 |
|
28 return CKR_OK; |
|
29 } |
|
30 |
|
31 static void |
|
32 nss_dbm_mdToken_Invalidate |
|
33 ( |
|
34 NSSCKMDToken *mdToken, |
|
35 NSSCKFWToken *fwToken, |
|
36 NSSCKMDInstance *mdInstance, |
|
37 NSSCKFWInstance *fwInstance |
|
38 ) |
|
39 { |
|
40 nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc; |
|
41 |
|
42 if( (nss_dbm_db_t *)NULL != token->session_db ) { |
|
43 nss_dbm_db_close(token->session_db); |
|
44 token->session_db = (nss_dbm_db_t *)NULL; |
|
45 } |
|
46 } |
|
47 |
|
48 static CK_RV |
|
49 nss_dbm_mdToken_InitToken |
|
50 ( |
|
51 NSSCKMDToken *mdToken, |
|
52 NSSCKFWToken *fwToken, |
|
53 NSSCKMDInstance *mdInstance, |
|
54 NSSCKFWInstance *fwInstance, |
|
55 NSSItem *pin, |
|
56 NSSUTF8 *label |
|
57 ) |
|
58 { |
|
59 nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc; |
|
60 nss_dbm_instance_t *instance = (nss_dbm_instance_t *)mdInstance->etc; |
|
61 CK_RV rv; |
|
62 |
|
63 /* Wipe the session object data */ |
|
64 |
|
65 if( (nss_dbm_db_t *)NULL != token->session_db ) { |
|
66 nss_dbm_db_close(token->session_db); |
|
67 } |
|
68 |
|
69 token->session_db = nss_dbm_db_open(token->arena, fwInstance, (char *)NULL, |
|
70 O_RDWR|O_CREAT, &rv); |
|
71 if( (nss_dbm_db_t *)NULL == token->session_db ) { |
|
72 return rv; |
|
73 } |
|
74 |
|
75 /* Wipe the token object data */ |
|
76 |
|
77 if( token->slot->flags & O_RDWR ) { |
|
78 if( (nss_dbm_db_t *)NULL != token->slot->token_db ) { |
|
79 nss_dbm_db_close(token->slot->token_db); |
|
80 } |
|
81 |
|
82 token->slot->token_db = nss_dbm_db_open(instance->arena, fwInstance, |
|
83 token->slot->filename, |
|
84 token->slot->flags | O_CREAT | O_TRUNC, |
|
85 &rv); |
|
86 if( (nss_dbm_db_t *)NULL == token->slot->token_db ) { |
|
87 return rv; |
|
88 } |
|
89 |
|
90 /* PIN is irrelevant */ |
|
91 |
|
92 rv = nss_dbm_db_set_label(token->slot->token_db, label); |
|
93 if( CKR_OK != rv ) { |
|
94 return rv; |
|
95 } |
|
96 } |
|
97 |
|
98 return CKR_OK; |
|
99 } |
|
100 |
|
101 static NSSUTF8 * |
|
102 nss_dbm_mdToken_GetLabel |
|
103 ( |
|
104 NSSCKMDToken *mdToken, |
|
105 NSSCKFWToken *fwToken, |
|
106 NSSCKMDInstance *mdInstance, |
|
107 NSSCKFWInstance *fwInstance, |
|
108 CK_RV *pError |
|
109 ) |
|
110 { |
|
111 nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc; |
|
112 |
|
113 if( (NSSUTF8 *)NULL == token->label ) { |
|
114 token->label = nss_dbm_db_get_label(token->slot->token_db, token->arena, pError); |
|
115 } |
|
116 |
|
117 /* If no label has been set, return *something* */ |
|
118 if( (NSSUTF8 *)NULL == token->label ) { |
|
119 return token->slot->filename; |
|
120 } |
|
121 |
|
122 return token->label; |
|
123 } |
|
124 |
|
125 static NSSUTF8 * |
|
126 nss_dbm_mdToken_GetManufacturerID |
|
127 ( |
|
128 NSSCKMDToken *mdToken, |
|
129 NSSCKFWToken *fwToken, |
|
130 NSSCKMDInstance *mdInstance, |
|
131 NSSCKFWInstance *fwInstance, |
|
132 CK_RV *pError |
|
133 ) |
|
134 { |
|
135 return "mozilla.org NSS"; |
|
136 } |
|
137 |
|
138 static NSSUTF8 * |
|
139 nss_dbm_mdToken_GetModel |
|
140 ( |
|
141 NSSCKMDToken *mdToken, |
|
142 NSSCKFWToken *fwToken, |
|
143 NSSCKMDInstance *mdInstance, |
|
144 NSSCKFWInstance *fwInstance, |
|
145 CK_RV *pError |
|
146 ) |
|
147 { |
|
148 return "dbm"; |
|
149 } |
|
150 |
|
151 /* GetSerialNumber is irrelevant */ |
|
152 /* GetHasRNG defaults to CK_FALSE */ |
|
153 |
|
154 static CK_BBOOL |
|
155 nss_dbm_mdToken_GetIsWriteProtected |
|
156 ( |
|
157 NSSCKMDToken *mdToken, |
|
158 NSSCKFWToken *fwToken, |
|
159 NSSCKMDInstance *mdInstance, |
|
160 NSSCKFWInstance *fwInstance |
|
161 ) |
|
162 { |
|
163 nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc; |
|
164 |
|
165 if( token->slot->flags & O_RDWR ) { |
|
166 return CK_FALSE; |
|
167 } else { |
|
168 return CK_TRUE; |
|
169 } |
|
170 } |
|
171 |
|
172 /* GetLoginRequired defaults to CK_FALSE */ |
|
173 /* GetUserPinInitialized defaults to CK_FALSE */ |
|
174 /* GetRestoreKeyNotNeeded is irrelevant */ |
|
175 /* GetHasClockOnToken defaults to CK_FALSE */ |
|
176 /* GetHasProtectedAuthenticationPath defaults to CK_FALSE */ |
|
177 /* GetSupportsDualCryptoOperations is irrelevant */ |
|
178 |
|
179 static CK_ULONG |
|
180 nss_dbm_mdToken_effectively_infinite |
|
181 ( |
|
182 NSSCKMDToken *mdToken, |
|
183 NSSCKFWToken *fwToken, |
|
184 NSSCKMDInstance *mdInstance, |
|
185 NSSCKFWInstance *fwInstance |
|
186 ) |
|
187 { |
|
188 return CK_EFFECTIVELY_INFINITE; |
|
189 } |
|
190 |
|
191 static CK_VERSION |
|
192 nss_dbm_mdToken_GetHardwareVersion |
|
193 ( |
|
194 NSSCKMDToken *mdToken, |
|
195 NSSCKFWToken *fwToken, |
|
196 NSSCKMDInstance *mdInstance, |
|
197 NSSCKFWInstance *fwInstance |
|
198 ) |
|
199 { |
|
200 nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc; |
|
201 return nss_dbm_db_get_format_version(token->slot->token_db); |
|
202 } |
|
203 |
|
204 /* GetFirmwareVersion is irrelevant */ |
|
205 /* GetUTCTime is irrelevant */ |
|
206 |
|
207 static NSSCKMDSession * |
|
208 nss_dbm_mdToken_OpenSession |
|
209 ( |
|
210 NSSCKMDToken *mdToken, |
|
211 NSSCKFWToken *fwToken, |
|
212 NSSCKMDInstance *mdInstance, |
|
213 NSSCKFWInstance *fwInstance, |
|
214 NSSCKFWSession *fwSession, |
|
215 CK_BBOOL rw, |
|
216 CK_RV *pError |
|
217 ) |
|
218 { |
|
219 nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc; |
|
220 return nss_dbm_mdSession_factory(token, fwSession, fwInstance, rw, pError); |
|
221 } |
|
222 |
|
223 /* GetMechanismCount defaults to zero */ |
|
224 /* GetMechanismTypes is irrelevant */ |
|
225 /* GetMechanism is irrelevant */ |
|
226 |
|
227 NSS_IMPLEMENT NSSCKMDToken * |
|
228 nss_dbm_mdToken_factory |
|
229 ( |
|
230 nss_dbm_slot_t *slot, |
|
231 CK_RV *pError |
|
232 ) |
|
233 { |
|
234 nss_dbm_token_t *token; |
|
235 NSSCKMDToken *rv; |
|
236 |
|
237 token = nss_ZNEW(slot->instance->arena, nss_dbm_token_t); |
|
238 if( (nss_dbm_token_t *)NULL == token ) { |
|
239 *pError = CKR_HOST_MEMORY; |
|
240 return (NSSCKMDToken *)NULL; |
|
241 } |
|
242 |
|
243 rv = nss_ZNEW(slot->instance->arena, NSSCKMDToken); |
|
244 if( (NSSCKMDToken *)NULL == rv ) { |
|
245 *pError = CKR_HOST_MEMORY; |
|
246 return (NSSCKMDToken *)NULL; |
|
247 } |
|
248 |
|
249 token->slot = slot; |
|
250 |
|
251 rv->etc = (void *)token; |
|
252 rv->Setup = nss_dbm_mdToken_Setup; |
|
253 rv->Invalidate = nss_dbm_mdToken_Invalidate; |
|
254 rv->InitToken = nss_dbm_mdToken_InitToken; |
|
255 rv->GetLabel = nss_dbm_mdToken_GetLabel; |
|
256 rv->GetManufacturerID = nss_dbm_mdToken_GetManufacturerID; |
|
257 rv->GetModel = nss_dbm_mdToken_GetModel; |
|
258 /* GetSerialNumber is irrelevant */ |
|
259 /* GetHasRNG defaults to CK_FALSE */ |
|
260 rv->GetIsWriteProtected = nss_dbm_mdToken_GetIsWriteProtected; |
|
261 /* GetLoginRequired defaults to CK_FALSE */ |
|
262 /* GetUserPinInitialized defaults to CK_FALSE */ |
|
263 /* GetRestoreKeyNotNeeded is irrelevant */ |
|
264 /* GetHasClockOnToken defaults to CK_FALSE */ |
|
265 /* GetHasProtectedAuthenticationPath defaults to CK_FALSE */ |
|
266 /* GetSupportsDualCryptoOperations is irrelevant */ |
|
267 rv->GetMaxSessionCount = nss_dbm_mdToken_effectively_infinite; |
|
268 rv->GetMaxRwSessionCount = nss_dbm_mdToken_effectively_infinite; |
|
269 /* GetMaxPinLen is irrelevant */ |
|
270 /* GetMinPinLen is irrelevant */ |
|
271 /* GetTotalPublicMemory defaults to CK_UNAVAILABLE_INFORMATION */ |
|
272 /* GetFreePublicMemory defaults to CK_UNAVAILABLE_INFORMATION */ |
|
273 /* GetTotalPrivateMemory defaults to CK_UNAVAILABLE_INFORMATION */ |
|
274 /* GetFreePrivateMemory defaults to CK_UNAVAILABLE_INFORMATION */ |
|
275 rv->GetHardwareVersion = nss_dbm_mdToken_GetHardwareVersion; |
|
276 /* GetFirmwareVersion is irrelevant */ |
|
277 /* GetUTCTime is irrelevant */ |
|
278 rv->OpenSession = nss_dbm_mdToken_OpenSession; |
|
279 rv->null = NULL; |
|
280 |
|
281 return rv; |
|
282 } |