/** * Copyright(c) 2011 Trusted Logic. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name Trusted Logic nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef __PKCS11_INTERNAL_H__ #define __PKCS11_INTERNAL_H__ #define CRYPTOKI_EXPORTS #include "cryptoki.h" #include "service_system_protocol.h" #include "lib_object.h" #include "lib_mutex.h" #include "tee_client_api.h" #include <stdlib.h> #include <string.h> /** * The magic word. */ #define PKCS11_SESSION_MAGIC ( (uint32_t)0x45EF683B ) /** * Computes required size to fit in a 4-bytes aligned buffer (at the end) * If the size is a multiple of 4, just returns the size * Otherwise, return the size so that the (end of the buffer)+1 is 4-bytes aligned. */ #define PKCS11_GET_SIZE_WITH_ALIGNMENT(a) (uint32_t)(((uint32_t)a+3) & ~3) /** * The System Service UUID used by the library */ extern const TEEC_UUID SERVICE_UUID; /** * g_sContext: the global TEEC context used by the library */ extern TEEC_Context g_sContext; void stubMutexLock(void); void stubMutexUnlock(void); TEEC_Result stubInitializeContext(void); void stubFinalizeContext(void); /** Whether the cryptoki library is initialized or not */ extern bool g_bCryptokiInitialized; CK_RV ckInternalTeeErrorToCKError(TEEC_Result nError); #define PKCS11_PRIMARY_SESSION_TAG 1 #define PKCS11_SECONDARY_SESSION_TAG 2 typedef struct { /* * Magic word, must be set to {PKCS11_SESSION_MAGIC}. */ uint32_t nMagicWord; /* nSessionTag must be set to {PKCS11_PRIMARY_SESSION_TAG} for primary session * to {PKCS11_SECONDARY_SESSION_TAG} for secondary session */ uint32_t nSessionTag; }PKCS11_SESSION_CONTEXT_HEADER, * PPKCS11_SESSION_CONTEXT_HEADER; /** * The PKCS11 Primary session context */ typedef struct { /* sHeader must be the first field of this structure */ PKCS11_SESSION_CONTEXT_HEADER sHeader; /* TEEC session used for this cryptoki primary session. Each primary session has its own TEEC session */ TEEC_Session sSession; uint32_t hCryptoSession; /* Mutex to protect the table of secondary sessions */ LIB_MUTEX sSecondarySessionTableMutex; /* Table of secondary sessions */ LIB_OBJECT_TABLE_HANDLE16 sSecondarySessionTable; } PKCS11_PRIMARY_SESSION_CONTEXT, * PPKCS11_PRIMARY_SESSION_CONTEXT; /** * The PKCS11 Secondary session context */ typedef struct { /* sHeader must be the first field of this structure */ PKCS11_SESSION_CONTEXT_HEADER sHeader; /* Secondary session handle as returned by pkcs11 */ uint32_t hSecondaryCryptoSession; /* A node of the table of secondary sessions */ LIB_OBJECT_NODE_HANDLE16 sSecondarySessionNode; /* pointer to the primary session */ PKCS11_PRIMARY_SESSION_CONTEXT* pPrimarySession; } PKCS11_SECONDARY_SESSION_CONTEXT, *PPKCS11_SECONDARY_SESSION_CONTEXT; bool ckInternalSessionIsOpenedEx(S_HANDLE hSession, bool* pBoolIsPrimarySession); #endif /* __PKCS11_INTERNAL_H__ */