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
builtins_mdObject_Destroy(NSSCKMDObject * mdObject,NSSCKFWObject * fwObject,NSSCKMDSession * mdSession,NSSCKFWSession * fwSession,NSSCKMDToken * mdToken,NSSCKFWToken * fwToken,NSSCKMDInstance * mdInstance,NSSCKFWInstance * fwInstance)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
builtins_mdObject_IsTokenObject(NSSCKMDObject * mdObject,NSSCKFWObject * fwObject,NSSCKMDSession * mdSession,NSSCKFWSession * fwSession,NSSCKMDToken * mdToken,NSSCKFWToken * fwToken,NSSCKMDInstance * mdInstance,NSSCKFWInstance * fwInstance)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
builtins_mdObject_GetAttributeCount(NSSCKMDObject * mdObject,NSSCKFWObject * fwObject,NSSCKMDSession * mdSession,NSSCKFWSession * fwSession,NSSCKMDToken * mdToken,NSSCKFWToken * fwToken,NSSCKMDInstance * mdInstance,NSSCKFWInstance * fwInstance,CK_RV * pError)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
builtins_mdObject_GetAttributeTypes(NSSCKMDObject * mdObject,NSSCKFWObject * fwObject,NSSCKMDSession * mdSession,NSSCKFWSession * fwSession,NSSCKMDToken * mdToken,NSSCKFWToken * fwToken,NSSCKMDInstance * mdInstance,NSSCKFWInstance * fwInstance,CK_ATTRIBUTE_TYPE_PTR typeArray,CK_ULONG ulCount)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
builtins_mdObject_GetAttributeSize(NSSCKMDObject * mdObject,NSSCKFWObject * fwObject,NSSCKMDSession * mdSession,NSSCKFWSession * fwSession,NSSCKMDToken * mdToken,NSSCKFWToken * fwToken,NSSCKMDInstance * mdInstance,NSSCKFWInstance * fwInstance,CK_ATTRIBUTE_TYPE attribute,CK_RV * pError)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
builtins_mdObject_GetAttribute(NSSCKMDObject * mdObject,NSSCKFWObject * fwObject,NSSCKMDSession * mdSession,NSSCKFWSession * fwSession,NSSCKMDToken * mdToken,NSSCKFWToken * fwToken,NSSCKMDInstance * mdInstance,NSSCKFWInstance * fwInstance,CK_ATTRIBUTE_TYPE attribute,CK_RV * pError)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
builtins_mdObject_GetObjectSize(NSSCKMDObject * mdObject,NSSCKFWObject * fwObject,NSSCKMDSession * mdSession,NSSCKFWSession * fwSession,NSSCKMDToken * mdToken,NSSCKFWToken * fwToken,NSSCKMDInstance * mdInstance,NSSCKFWInstance * fwInstance,CK_RV * pError)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 *
nss_builtins_CreateMDObject(NSSArena * arena,builtinsInternalObject * io,CK_RV * pError)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 }
207