bobject.c (5140B)
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 }