OLD | NEW |
| (Empty) |
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 "builtins.h" | |
6 | |
7 /* | |
8 * builtins/object.c | |
9 * | |
10 * This file implements the NSSCKMDObject object for the | |
11 * "builtin objects" cryptoki module. | |
12 */ | |
13 | |
14 /* | |
15 * Finalize - unneeded | |
16 * Destroy - CKR_SESSION_READ_ONLY | |
17 * IsTokenObject - CK_TRUE | |
18 * GetAttributeCount | |
19 * GetAttributeTypes | |
20 * GetAttributeSize | |
21 * GetAttribute | |
22 * SetAttribute - unneeded | |
23 * GetObjectSize | |
24 */ | |
25 | |
26 static CK_RV | |
27 builtins_mdObject_Destroy( | |
28 NSSCKMDObject *mdObject, | |
29 NSSCKFWObject *fwObject, | |
30 NSSCKMDSession *mdSession, | |
31 NSSCKFWSession *fwSession, | |
32 NSSCKMDToken *mdToken, | |
33 NSSCKFWToken *fwToken, | |
34 NSSCKMDInstance *mdInstance, | |
35 NSSCKFWInstance *fwInstance) | |
36 { | |
37 return CKR_SESSION_READ_ONLY; | |
38 } | |
39 | |
40 static CK_BBOOL | |
41 builtins_mdObject_IsTokenObject( | |
42 NSSCKMDObject *mdObject, | |
43 NSSCKFWObject *fwObject, | |
44 NSSCKMDSession *mdSession, | |
45 NSSCKFWSession *fwSession, | |
46 NSSCKMDToken *mdToken, | |
47 NSSCKFWToken *fwToken, | |
48 NSSCKMDInstance *mdInstance, | |
49 NSSCKFWInstance *fwInstance) | |
50 { | |
51 return CK_TRUE; | |
52 } | |
53 | |
54 static CK_ULONG | |
55 builtins_mdObject_GetAttributeCount( | |
56 NSSCKMDObject *mdObject, | |
57 NSSCKFWObject *fwObject, | |
58 NSSCKMDSession *mdSession, | |
59 NSSCKFWSession *fwSession, | |
60 NSSCKMDToken *mdToken, | |
61 NSSCKFWToken *fwToken, | |
62 NSSCKMDInstance *mdInstance, | |
63 NSSCKFWInstance *fwInstance, | |
64 CK_RV *pError) | |
65 { | |
66 builtinsInternalObject *io = (builtinsInternalObject *)mdObject->etc; | |
67 return io->n; | |
68 } | |
69 | |
70 static CK_RV | |
71 builtins_mdObject_GetAttributeTypes( | |
72 NSSCKMDObject *mdObject, | |
73 NSSCKFWObject *fwObject, | |
74 NSSCKMDSession *mdSession, | |
75 NSSCKFWSession *fwSession, | |
76 NSSCKMDToken *mdToken, | |
77 NSSCKFWToken *fwToken, | |
78 NSSCKMDInstance *mdInstance, | |
79 NSSCKFWInstance *fwInstance, | |
80 CK_ATTRIBUTE_TYPE_PTR typeArray, | |
81 CK_ULONG ulCount) | |
82 { | |
83 builtinsInternalObject *io = (builtinsInternalObject *)mdObject->etc; | |
84 CK_ULONG i; | |
85 | |
86 if (io->n != ulCount) { | |
87 return CKR_BUFFER_TOO_SMALL; | |
88 } | |
89 | |
90 for (i = 0; i < io->n; i++) { | |
91 typeArray[i] = io->types[i]; | |
92 } | |
93 | |
94 return CKR_OK; | |
95 } | |
96 | |
97 static CK_ULONG | |
98 builtins_mdObject_GetAttributeSize( | |
99 NSSCKMDObject *mdObject, | |
100 NSSCKFWObject *fwObject, | |
101 NSSCKMDSession *mdSession, | |
102 NSSCKFWSession *fwSession, | |
103 NSSCKMDToken *mdToken, | |
104 NSSCKFWToken *fwToken, | |
105 NSSCKMDInstance *mdInstance, | |
106 NSSCKFWInstance *fwInstance, | |
107 CK_ATTRIBUTE_TYPE attribute, | |
108 CK_RV *pError) | |
109 { | |
110 builtinsInternalObject *io = (builtinsInternalObject *)mdObject->etc; | |
111 CK_ULONG i; | |
112 | |
113 for (i = 0; i < io->n; i++) { | |
114 if (attribute == io->types[i]) { | |
115 return (CK_ULONG)(io->items[i].size); | |
116 } | |
117 } | |
118 | |
119 *pError = CKR_ATTRIBUTE_TYPE_INVALID; | |
120 return 0; | |
121 } | |
122 | |
123 static NSSCKFWItem | |
124 builtins_mdObject_GetAttribute( | |
125 NSSCKMDObject *mdObject, | |
126 NSSCKFWObject *fwObject, | |
127 NSSCKMDSession *mdSession, | |
128 NSSCKFWSession *fwSession, | |
129 NSSCKMDToken *mdToken, | |
130 NSSCKFWToken *fwToken, | |
131 NSSCKMDInstance *mdInstance, | |
132 NSSCKFWInstance *fwInstance, | |
133 CK_ATTRIBUTE_TYPE attribute, | |
134 CK_RV *pError) | |
135 { | |
136 NSSCKFWItem mdItem; | |
137 builtinsInternalObject *io = (builtinsInternalObject *)mdObject->etc; | |
138 CK_ULONG i; | |
139 | |
140 mdItem.needsFreeing = PR_FALSE; | |
141 mdItem.item = (NSSItem *)NULL; | |
142 | |
143 for (i = 0; i < io->n; i++) { | |
144 if (attribute == io->types[i]) { | |
145 mdItem.item = (NSSItem *)&io->items[i]; | |
146 return mdItem; | |
147 } | |
148 } | |
149 | |
150 *pError = CKR_ATTRIBUTE_TYPE_INVALID; | |
151 return mdItem; | |
152 } | |
153 | |
154 static CK_ULONG | |
155 builtins_mdObject_GetObjectSize( | |
156 NSSCKMDObject *mdObject, | |
157 NSSCKFWObject *fwObject, | |
158 NSSCKMDSession *mdSession, | |
159 NSSCKFWSession *fwSession, | |
160 NSSCKMDToken *mdToken, | |
161 NSSCKFWToken *fwToken, | |
162 NSSCKMDInstance *mdInstance, | |
163 NSSCKFWInstance *fwInstance, | |
164 CK_RV *pError) | |
165 { | |
166 builtinsInternalObject *io = (builtinsInternalObject *)mdObject->etc; | |
167 CK_ULONG i; | |
168 CK_ULONG rv = sizeof(CK_ULONG); | |
169 | |
170 for (i = 0; i < io->n; i++) { | |
171 rv += sizeof(CK_ATTRIBUTE_TYPE) + sizeof(NSSItem) + io->items[i].size; | |
172 } | |
173 | |
174 return rv; | |
175 } | |
176 | |
177 static const NSSCKMDObject | |
178 builtins_prototype_mdObject = { | |
179 (void *)NULL, /* etc */ | |
180 NULL, /* Finalize */ | |
181 builtins_mdObject_Destroy, | |
182 builtins_mdObject_IsTokenObject, | |
183 builtins_mdObject_GetAttributeCount, | |
184 builtins_mdObject_GetAttributeTypes, | |
185 builtins_mdObject_GetAttributeSize, | |
186 builtins_mdObject_GetAttribute, | |
187 NULL, /* FreeAttribute */ | |
188 NULL, /* SetAttribute */ | |
189 builtins_mdObject_GetObjectSize, | |
190 (void *)NULL /* null terminator */ | |
191 }; | |
192 | |
193 NSS_IMPLEMENT NSSCKMDObject * | |
194 nss_builtins_CreateMDObject( | |
195 NSSArena *arena, | |
196 builtinsInternalObject *io, | |
197 CK_RV *pError) | |
198 { | |
199 if ((void *)NULL == io->mdObject.etc) { | |
200 (void)nsslibc_memcpy(&io->mdObject, &builtins_prototype_mdObject, | |
201 sizeof(builtins_prototype_mdObject)); | |
202 io->mdObject.etc = (void *)io; | |
203 } | |
204 | |
205 return &io->mdObject; | |
206 } | |
OLD | NEW |