|
Packit |
40b132 |
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
Packit |
40b132 |
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
Packit |
40b132 |
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
Packit |
40b132 |
|
|
Packit |
40b132 |
#include "builtins.h"
|
|
Packit |
40b132 |
|
|
Packit |
40b132 |
/*
|
|
Packit |
40b132 |
* builtins/object.c
|
|
Packit |
40b132 |
*
|
|
Packit |
40b132 |
* This file implements the NSSCKMDObject object for the
|
|
Packit |
40b132 |
* "builtin objects" cryptoki module.
|
|
Packit |
40b132 |
*/
|
|
Packit |
40b132 |
|
|
Packit |
40b132 |
/*
|
|
Packit |
40b132 |
* Finalize - unneeded
|
|
Packit |
40b132 |
* Destroy - CKR_SESSION_READ_ONLY
|
|
Packit |
40b132 |
* IsTokenObject - CK_TRUE
|
|
Packit |
40b132 |
* GetAttributeCount
|
|
Packit |
40b132 |
* GetAttributeTypes
|
|
Packit |
40b132 |
* GetAttributeSize
|
|
Packit |
40b132 |
* GetAttribute
|
|
Packit |
40b132 |
* SetAttribute - unneeded
|
|
Packit |
40b132 |
* GetObjectSize
|
|
Packit |
40b132 |
*/
|
|
Packit |
40b132 |
|
|
Packit |
40b132 |
static CK_RV
|
|
Packit |
40b132 |
builtins_mdObject_Destroy
|
|
Packit |
40b132 |
(
|
|
Packit |
40b132 |
NSSCKMDObject *mdObject,
|
|
Packit |
40b132 |
NSSCKFWObject *fwObject,
|
|
Packit |
40b132 |
NSSCKMDSession *mdSession,
|
|
Packit |
40b132 |
NSSCKFWSession *fwSession,
|
|
Packit |
40b132 |
NSSCKMDToken *mdToken,
|
|
Packit |
40b132 |
NSSCKFWToken *fwToken,
|
|
Packit |
40b132 |
NSSCKMDInstance *mdInstance,
|
|
Packit |
40b132 |
NSSCKFWInstance *fwInstance
|
|
Packit |
40b132 |
)
|
|
Packit |
40b132 |
{
|
|
Packit |
40b132 |
return CKR_SESSION_READ_ONLY;
|
|
Packit |
40b132 |
}
|
|
Packit |
40b132 |
|
|
Packit |
40b132 |
static CK_BBOOL
|
|
Packit |
40b132 |
builtins_mdObject_IsTokenObject
|
|
Packit |
40b132 |
(
|
|
Packit |
40b132 |
NSSCKMDObject *mdObject,
|
|
Packit |
40b132 |
NSSCKFWObject *fwObject,
|
|
Packit |
40b132 |
NSSCKMDSession *mdSession,
|
|
Packit |
40b132 |
NSSCKFWSession *fwSession,
|
|
Packit |
40b132 |
NSSCKMDToken *mdToken,
|
|
Packit |
40b132 |
NSSCKFWToken *fwToken,
|
|
Packit |
40b132 |
NSSCKMDInstance *mdInstance,
|
|
Packit |
40b132 |
NSSCKFWInstance *fwInstance
|
|
Packit |
40b132 |
)
|
|
Packit |
40b132 |
{
|
|
Packit |
40b132 |
return CK_TRUE;
|
|
Packit |
40b132 |
}
|
|
Packit |
40b132 |
|
|
Packit |
40b132 |
static CK_ULONG
|
|
Packit |
40b132 |
builtins_mdObject_GetAttributeCount
|
|
Packit |
40b132 |
(
|
|
Packit |
40b132 |
NSSCKMDObject *mdObject,
|
|
Packit |
40b132 |
NSSCKFWObject *fwObject,
|
|
Packit |
40b132 |
NSSCKMDSession *mdSession,
|
|
Packit |
40b132 |
NSSCKFWSession *fwSession,
|
|
Packit |
40b132 |
NSSCKMDToken *mdToken,
|
|
Packit |
40b132 |
NSSCKFWToken *fwToken,
|
|
Packit |
40b132 |
NSSCKMDInstance *mdInstance,
|
|
Packit |
40b132 |
NSSCKFWInstance *fwInstance,
|
|
Packit |
40b132 |
CK_RV *pError
|
|
Packit |
40b132 |
)
|
|
Packit |
40b132 |
{
|
|
Packit |
40b132 |
builtinsInternalObject *io = (builtinsInternalObject *)mdObject->etc;
|
|
Packit |
40b132 |
return io->n;
|
|
Packit |
40b132 |
}
|
|
Packit |
40b132 |
|
|
Packit |
40b132 |
static CK_RV
|
|
Packit |
40b132 |
builtins_mdObject_GetAttributeTypes
|
|
Packit |
40b132 |
(
|
|
Packit |
40b132 |
NSSCKMDObject *mdObject,
|
|
Packit |
40b132 |
NSSCKFWObject *fwObject,
|
|
Packit |
40b132 |
NSSCKMDSession *mdSession,
|
|
Packit |
40b132 |
NSSCKFWSession *fwSession,
|
|
Packit |
40b132 |
NSSCKMDToken *mdToken,
|
|
Packit |
40b132 |
NSSCKFWToken *fwToken,
|
|
Packit |
40b132 |
NSSCKMDInstance *mdInstance,
|
|
Packit |
40b132 |
NSSCKFWInstance *fwInstance,
|
|
Packit |
40b132 |
CK_ATTRIBUTE_TYPE_PTR typeArray,
|
|
Packit |
40b132 |
CK_ULONG ulCount
|
|
Packit |
40b132 |
)
|
|
Packit |
40b132 |
{
|
|
Packit |
40b132 |
builtinsInternalObject *io = (builtinsInternalObject *)mdObject->etc;
|
|
Packit |
40b132 |
CK_ULONG i;
|
|
Packit |
40b132 |
|
|
Packit |
40b132 |
if( io->n != ulCount ) {
|
|
Packit |
40b132 |
return CKR_BUFFER_TOO_SMALL;
|
|
Packit |
40b132 |
}
|
|
Packit |
40b132 |
|
|
Packit |
40b132 |
for( i = 0; i < io->n; i++ ) {
|
|
Packit |
40b132 |
typeArray[i] = io->types[i];
|
|
Packit |
40b132 |
}
|
|
Packit |
40b132 |
|
|
Packit |
40b132 |
return CKR_OK;
|
|
Packit |
40b132 |
}
|
|
Packit |
40b132 |
|
|
Packit |
40b132 |
static CK_ULONG
|
|
Packit |
40b132 |
builtins_mdObject_GetAttributeSize
|
|
Packit |
40b132 |
(
|
|
Packit |
40b132 |
NSSCKMDObject *mdObject,
|
|
Packit |
40b132 |
NSSCKFWObject *fwObject,
|
|
Packit |
40b132 |
NSSCKMDSession *mdSession,
|
|
Packit |
40b132 |
NSSCKFWSession *fwSession,
|
|
Packit |
40b132 |
NSSCKMDToken *mdToken,
|
|
Packit |
40b132 |
NSSCKFWToken *fwToken,
|
|
Packit |
40b132 |
NSSCKMDInstance *mdInstance,
|
|
Packit |
40b132 |
NSSCKFWInstance *fwInstance,
|
|
Packit |
40b132 |
CK_ATTRIBUTE_TYPE attribute,
|
|
Packit |
40b132 |
CK_RV *pError
|
|
Packit |
40b132 |
)
|
|
Packit |
40b132 |
{
|
|
Packit |
40b132 |
builtinsInternalObject *io = (builtinsInternalObject *)mdObject->etc;
|
|
Packit |
40b132 |
CK_ULONG i;
|
|
Packit |
40b132 |
|
|
Packit |
40b132 |
for( i = 0; i < io->n; i++ ) {
|
|
Packit |
40b132 |
if( attribute == io->types[i] ) {
|
|
Packit |
40b132 |
return (CK_ULONG)(io->items[i].size);
|
|
Packit |
40b132 |
}
|
|
Packit |
40b132 |
}
|
|
Packit |
40b132 |
|
|
Packit |
40b132 |
*pError = CKR_ATTRIBUTE_TYPE_INVALID;
|
|
Packit |
40b132 |
return 0;
|
|
Packit |
40b132 |
}
|
|
Packit |
40b132 |
|
|
Packit |
40b132 |
static NSSCKFWItem
|
|
Packit |
40b132 |
builtins_mdObject_GetAttribute
|
|
Packit |
40b132 |
(
|
|
Packit |
40b132 |
NSSCKMDObject *mdObject,
|
|
Packit |
40b132 |
NSSCKFWObject *fwObject,
|
|
Packit |
40b132 |
NSSCKMDSession *mdSession,
|
|
Packit |
40b132 |
NSSCKFWSession *fwSession,
|
|
Packit |
40b132 |
NSSCKMDToken *mdToken,
|
|
Packit |
40b132 |
NSSCKFWToken *fwToken,
|
|
Packit |
40b132 |
NSSCKMDInstance *mdInstance,
|
|
Packit |
40b132 |
NSSCKFWInstance *fwInstance,
|
|
Packit |
40b132 |
CK_ATTRIBUTE_TYPE attribute,
|
|
Packit |
40b132 |
CK_RV *pError
|
|
Packit |
40b132 |
)
|
|
Packit |
40b132 |
{
|
|
Packit |
40b132 |
NSSCKFWItem mdItem;
|
|
Packit |
40b132 |
builtinsInternalObject *io = (builtinsInternalObject *)mdObject->etc;
|
|
Packit |
40b132 |
CK_ULONG i;
|
|
Packit |
40b132 |
|
|
Packit |
40b132 |
mdItem.needsFreeing = PR_FALSE;
|
|
Packit |
40b132 |
mdItem.item = (NSSItem*) NULL;
|
|
Packit |
40b132 |
|
|
Packit |
40b132 |
for( i = 0; i < io->n; i++ ) {
|
|
Packit |
40b132 |
if( attribute == io->types[i] ) {
|
|
Packit |
40b132 |
mdItem.item = (NSSItem*) &io->items[i];
|
|
Packit |
40b132 |
return mdItem;
|
|
Packit |
40b132 |
}
|
|
Packit |
40b132 |
}
|
|
Packit |
40b132 |
|
|
Packit |
40b132 |
*pError = CKR_ATTRIBUTE_TYPE_INVALID;
|
|
Packit |
40b132 |
return mdItem;
|
|
Packit |
40b132 |
}
|
|
Packit |
40b132 |
|
|
Packit |
40b132 |
static CK_ULONG
|
|
Packit |
40b132 |
builtins_mdObject_GetObjectSize
|
|
Packit |
40b132 |
(
|
|
Packit |
40b132 |
NSSCKMDObject *mdObject,
|
|
Packit |
40b132 |
NSSCKFWObject *fwObject,
|
|
Packit |
40b132 |
NSSCKMDSession *mdSession,
|
|
Packit |
40b132 |
NSSCKFWSession *fwSession,
|
|
Packit |
40b132 |
NSSCKMDToken *mdToken,
|
|
Packit |
40b132 |
NSSCKFWToken *fwToken,
|
|
Packit |
40b132 |
NSSCKMDInstance *mdInstance,
|
|
Packit |
40b132 |
NSSCKFWInstance *fwInstance,
|
|
Packit |
40b132 |
CK_RV *pError
|
|
Packit |
40b132 |
)
|
|
Packit |
40b132 |
{
|
|
Packit |
40b132 |
builtinsInternalObject *io = (builtinsInternalObject *)mdObject->etc;
|
|
Packit |
40b132 |
CK_ULONG i;
|
|
Packit |
40b132 |
CK_ULONG rv = sizeof(CK_ULONG);
|
|
Packit |
40b132 |
|
|
Packit |
40b132 |
for( i = 0; i < io->n; i++ ) {
|
|
Packit |
40b132 |
rv += sizeof(CK_ATTRIBUTE_TYPE) + sizeof(NSSItem) + io->items[i].size;
|
|
Packit |
40b132 |
}
|
|
Packit |
40b132 |
|
|
Packit |
40b132 |
return rv;
|
|
Packit |
40b132 |
}
|
|
Packit |
40b132 |
|
|
Packit |
40b132 |
static const NSSCKMDObject
|
|
Packit |
40b132 |
builtins_prototype_mdObject = {
|
|
Packit |
40b132 |
(void *)NULL, /* etc */
|
|
Packit |
40b132 |
NULL, /* Finalize */
|
|
Packit |
40b132 |
builtins_mdObject_Destroy,
|
|
Packit |
40b132 |
builtins_mdObject_IsTokenObject,
|
|
Packit |
40b132 |
builtins_mdObject_GetAttributeCount,
|
|
Packit |
40b132 |
builtins_mdObject_GetAttributeTypes,
|
|
Packit |
40b132 |
builtins_mdObject_GetAttributeSize,
|
|
Packit |
40b132 |
builtins_mdObject_GetAttribute,
|
|
Packit |
40b132 |
NULL, /* FreeAttribute */
|
|
Packit |
40b132 |
NULL, /* SetAttribute */
|
|
Packit |
40b132 |
builtins_mdObject_GetObjectSize,
|
|
Packit |
40b132 |
(void *)NULL /* null terminator */
|
|
Packit |
40b132 |
};
|
|
Packit |
40b132 |
|
|
Packit |
40b132 |
NSS_IMPLEMENT NSSCKMDObject *
|
|
Packit |
40b132 |
nss_builtins_CreateMDObject
|
|
Packit |
40b132 |
(
|
|
Packit |
40b132 |
NSSArena *arena,
|
|
Packit |
40b132 |
builtinsInternalObject *io,
|
|
Packit |
40b132 |
CK_RV *pError
|
|
Packit |
40b132 |
)
|
|
Packit |
40b132 |
{
|
|
Packit |
40b132 |
if ( (void*)NULL == io->mdObject.etc) {
|
|
Packit |
40b132 |
(void) nsslibc_memcpy(&io->mdObject,&builtins_prototype_mdObject,
|
|
Packit |
40b132 |
sizeof(builtins_prototype_mdObject));
|
|
Packit |
40b132 |
io->mdObject.etc = (void *)io;
|
|
Packit |
40b132 |
}
|
|
Packit |
40b132 |
|
|
Packit |
40b132 |
return &io->mdObject;
|
|
Packit |
40b132 |
}
|