tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }