security/nss/lib/ckfw/dbm/token.c

branch
TOR_BUG_9701
changeset 15
b8a032363ba2
equal deleted inserted replaced
-1:000000000000 0:a8dc4bd36337
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 }

mercurial