1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/security/nss/lib/ckfw/builtins/bobject.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,222 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +#include "builtins.h" 1.9 + 1.10 +/* 1.11 + * builtins/object.c 1.12 + * 1.13 + * This file implements the NSSCKMDObject object for the 1.14 + * "builtin objects" cryptoki module. 1.15 + */ 1.16 + 1.17 +/* 1.18 + * Finalize - unneeded 1.19 + * Destroy - CKR_SESSION_READ_ONLY 1.20 + * IsTokenObject - CK_TRUE 1.21 + * GetAttributeCount 1.22 + * GetAttributeTypes 1.23 + * GetAttributeSize 1.24 + * GetAttribute 1.25 + * SetAttribute - unneeded 1.26 + * GetObjectSize 1.27 + */ 1.28 + 1.29 +static CK_RV 1.30 +builtins_mdObject_Destroy 1.31 +( 1.32 + NSSCKMDObject *mdObject, 1.33 + NSSCKFWObject *fwObject, 1.34 + NSSCKMDSession *mdSession, 1.35 + NSSCKFWSession *fwSession, 1.36 + NSSCKMDToken *mdToken, 1.37 + NSSCKFWToken *fwToken, 1.38 + NSSCKMDInstance *mdInstance, 1.39 + NSSCKFWInstance *fwInstance 1.40 +) 1.41 +{ 1.42 + return CKR_SESSION_READ_ONLY; 1.43 +} 1.44 + 1.45 +static CK_BBOOL 1.46 +builtins_mdObject_IsTokenObject 1.47 +( 1.48 + NSSCKMDObject *mdObject, 1.49 + NSSCKFWObject *fwObject, 1.50 + NSSCKMDSession *mdSession, 1.51 + NSSCKFWSession *fwSession, 1.52 + NSSCKMDToken *mdToken, 1.53 + NSSCKFWToken *fwToken, 1.54 + NSSCKMDInstance *mdInstance, 1.55 + NSSCKFWInstance *fwInstance 1.56 +) 1.57 +{ 1.58 + return CK_TRUE; 1.59 +} 1.60 + 1.61 +static CK_ULONG 1.62 +builtins_mdObject_GetAttributeCount 1.63 +( 1.64 + NSSCKMDObject *mdObject, 1.65 + NSSCKFWObject *fwObject, 1.66 + NSSCKMDSession *mdSession, 1.67 + NSSCKFWSession *fwSession, 1.68 + NSSCKMDToken *mdToken, 1.69 + NSSCKFWToken *fwToken, 1.70 + NSSCKMDInstance *mdInstance, 1.71 + NSSCKFWInstance *fwInstance, 1.72 + CK_RV *pError 1.73 +) 1.74 +{ 1.75 + builtinsInternalObject *io = (builtinsInternalObject *)mdObject->etc; 1.76 + return io->n; 1.77 +} 1.78 + 1.79 +static CK_RV 1.80 +builtins_mdObject_GetAttributeTypes 1.81 +( 1.82 + NSSCKMDObject *mdObject, 1.83 + NSSCKFWObject *fwObject, 1.84 + NSSCKMDSession *mdSession, 1.85 + NSSCKFWSession *fwSession, 1.86 + NSSCKMDToken *mdToken, 1.87 + NSSCKFWToken *fwToken, 1.88 + NSSCKMDInstance *mdInstance, 1.89 + NSSCKFWInstance *fwInstance, 1.90 + CK_ATTRIBUTE_TYPE_PTR typeArray, 1.91 + CK_ULONG ulCount 1.92 +) 1.93 +{ 1.94 + builtinsInternalObject *io = (builtinsInternalObject *)mdObject->etc; 1.95 + CK_ULONG i; 1.96 + 1.97 + if( io->n != ulCount ) { 1.98 + return CKR_BUFFER_TOO_SMALL; 1.99 + } 1.100 + 1.101 + for( i = 0; i < io->n; i++ ) { 1.102 + typeArray[i] = io->types[i]; 1.103 + } 1.104 + 1.105 + return CKR_OK; 1.106 +} 1.107 + 1.108 +static CK_ULONG 1.109 +builtins_mdObject_GetAttributeSize 1.110 +( 1.111 + NSSCKMDObject *mdObject, 1.112 + NSSCKFWObject *fwObject, 1.113 + NSSCKMDSession *mdSession, 1.114 + NSSCKFWSession *fwSession, 1.115 + NSSCKMDToken *mdToken, 1.116 + NSSCKFWToken *fwToken, 1.117 + NSSCKMDInstance *mdInstance, 1.118 + NSSCKFWInstance *fwInstance, 1.119 + CK_ATTRIBUTE_TYPE attribute, 1.120 + CK_RV *pError 1.121 +) 1.122 +{ 1.123 + builtinsInternalObject *io = (builtinsInternalObject *)mdObject->etc; 1.124 + CK_ULONG i; 1.125 + 1.126 + for( i = 0; i < io->n; i++ ) { 1.127 + if( attribute == io->types[i] ) { 1.128 + return (CK_ULONG)(io->items[i].size); 1.129 + } 1.130 + } 1.131 + 1.132 + *pError = CKR_ATTRIBUTE_TYPE_INVALID; 1.133 + return 0; 1.134 +} 1.135 + 1.136 +static NSSCKFWItem 1.137 +builtins_mdObject_GetAttribute 1.138 +( 1.139 + NSSCKMDObject *mdObject, 1.140 + NSSCKFWObject *fwObject, 1.141 + NSSCKMDSession *mdSession, 1.142 + NSSCKFWSession *fwSession, 1.143 + NSSCKMDToken *mdToken, 1.144 + NSSCKFWToken *fwToken, 1.145 + NSSCKMDInstance *mdInstance, 1.146 + NSSCKFWInstance *fwInstance, 1.147 + CK_ATTRIBUTE_TYPE attribute, 1.148 + CK_RV *pError 1.149 +) 1.150 +{ 1.151 + NSSCKFWItem mdItem; 1.152 + builtinsInternalObject *io = (builtinsInternalObject *)mdObject->etc; 1.153 + CK_ULONG i; 1.154 + 1.155 + mdItem.needsFreeing = PR_FALSE; 1.156 + mdItem.item = (NSSItem*) NULL; 1.157 + 1.158 + for( i = 0; i < io->n; i++ ) { 1.159 + if( attribute == io->types[i] ) { 1.160 + mdItem.item = (NSSItem*) &io->items[i]; 1.161 + return mdItem; 1.162 + } 1.163 + } 1.164 + 1.165 + *pError = CKR_ATTRIBUTE_TYPE_INVALID; 1.166 + return mdItem; 1.167 +} 1.168 + 1.169 +static CK_ULONG 1.170 +builtins_mdObject_GetObjectSize 1.171 +( 1.172 + NSSCKMDObject *mdObject, 1.173 + NSSCKFWObject *fwObject, 1.174 + NSSCKMDSession *mdSession, 1.175 + NSSCKFWSession *fwSession, 1.176 + NSSCKMDToken *mdToken, 1.177 + NSSCKFWToken *fwToken, 1.178 + NSSCKMDInstance *mdInstance, 1.179 + NSSCKFWInstance *fwInstance, 1.180 + CK_RV *pError 1.181 +) 1.182 +{ 1.183 + builtinsInternalObject *io = (builtinsInternalObject *)mdObject->etc; 1.184 + CK_ULONG i; 1.185 + CK_ULONG rv = sizeof(CK_ULONG); 1.186 + 1.187 + for( i = 0; i < io->n; i++ ) { 1.188 + rv += sizeof(CK_ATTRIBUTE_TYPE) + sizeof(NSSItem) + io->items[i].size; 1.189 + } 1.190 + 1.191 + return rv; 1.192 +} 1.193 + 1.194 +static const NSSCKMDObject 1.195 +builtins_prototype_mdObject = { 1.196 + (void *)NULL, /* etc */ 1.197 + NULL, /* Finalize */ 1.198 + builtins_mdObject_Destroy, 1.199 + builtins_mdObject_IsTokenObject, 1.200 + builtins_mdObject_GetAttributeCount, 1.201 + builtins_mdObject_GetAttributeTypes, 1.202 + builtins_mdObject_GetAttributeSize, 1.203 + builtins_mdObject_GetAttribute, 1.204 + NULL, /* FreeAttribute */ 1.205 + NULL, /* SetAttribute */ 1.206 + builtins_mdObject_GetObjectSize, 1.207 + (void *)NULL /* null terminator */ 1.208 +}; 1.209 + 1.210 +NSS_IMPLEMENT NSSCKMDObject * 1.211 +nss_builtins_CreateMDObject 1.212 +( 1.213 + NSSArena *arena, 1.214 + builtinsInternalObject *io, 1.215 + CK_RV *pError 1.216 +) 1.217 +{ 1.218 + if ( (void*)NULL == io->mdObject.etc) { 1.219 + (void) nsslibc_memcpy(&io->mdObject,&builtins_prototype_mdObject, 1.220 + sizeof(builtins_prototype_mdObject)); 1.221 + io->mdObject.etc = (void *)io; 1.222 + } 1.223 + 1.224 + return &io->mdObject; 1.225 +}