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