CK_OBJECT_HANDLE PKCS11_PAL_FindObject()

in components/pkcs11_pal/source/core_pkcs11_pal.c [230:279]


CK_OBJECT_HANDLE PKCS11_PAL_FindObject( CK_BYTE_PTR pxLabel,
                                        CK_ULONG usLength )
{
    CK_OBJECT_HANDLE xHandle = eInvalidHandle;
    char * pcFileName = NULL;
    CK_BYTE_PTR pxObject = NULL;
    CK_BBOOL xIsPrivate = ( CK_BBOOL ) CK_TRUE;
    CK_ULONG ulObjectLength = sizeof( CK_BYTE );
    CK_RV xResult = CKR_OK;
    initialize_nvs_partition();

    /* Translate from the PKCS#11 label to local storage file name. */
    prvLabelToFilenameHandle( pxLabel,
                              &pcFileName,
                              &xHandle );

    if( pcFileName != NULL )
    {
        ESP_LOGD( TAG, "Finding file %s", pcFileName );
        nvs_handle handle;
        esp_err_t err = nvs_open_from_partition(NVS_PART_NAME, NAMESPACE, NVS_READONLY, &handle);
        if (err != ESP_OK) {
            /* This can happen if namespace doesn't exist yet, so no files stored */
            ESP_LOGD(TAG, "failed nvs open %d", err);
            return eInvalidHandle;
        }

        size_t required_size = 0;
        err = nvs_get_blob(handle, pcFileName, NULL, &required_size);
        if (err != ESP_OK || required_size == 0) {
            ESP_LOGE(TAG, "failed nvs get file size %d %d", err, required_size);
            xHandle = eInvalidHandle;
        }
        nvs_close(handle);
    }
    if( xHandle != eInvalidHandle )
    {
        xResult = PKCS11_PAL_GetObjectValue( xHandle, &pxObject, &ulObjectLength, &xIsPrivate );

        /* Zeroed out object means it has been destroyed. */
        if( ( xResult != CKR_OK ) || ( pxObject[ 0 ] == 0x00 ) )
        {
            xHandle = eInvalidHandle;
        }

        PKCS11_PAL_GetObjectValueCleanup( pxObject, ulObjectLength );
    }

    return xHandle;
}