| 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 |