diff --git a/libckteec/src/pkcs11_api.c b/libckteec/src/pkcs11_api.c index 85c712a6..d9684570 100644 --- a/libckteec/src/pkcs11_api.c +++ b/libckteec/src/pkcs11_api.c @@ -4,8 +4,11 @@ */ #include +#include #include +#include "invoke_ta.h" + static const CK_FUNCTION_LIST libckteec_function_list = { .version = { .major = CK_PKCS11_VERSION_MAJOR, @@ -81,12 +84,17 @@ static const CK_FUNCTION_LIST libckteec_function_list = { .C_WaitForSlotEvent = NULL, }; +static bool lib_initiated(void) +{ + return ckteec_invoke_initiated(); +} + CK_RV C_Initialize(CK_VOID_PTR pInitArgs) { /* Argument currently unused as per the PKCS#11 specification */ (void)pInitArgs; - return CKR_FUNCTION_NOT_SUPPORTED; + return ckteec_invoke_init(); } CK_RV C_Finalize(CK_VOID_PTR pReserved) @@ -94,13 +102,16 @@ CK_RV C_Finalize(CK_VOID_PTR pReserved) /* Argument currently unused as per the PKCS#11 specification */ (void)pReserved; - return CKR_FUNCTION_NOT_SUPPORTED; + return ckteec_invoke_terminate(); } CK_RV C_GetInfo(CK_INFO_PTR pInfo) { (void)pInfo; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -123,6 +134,9 @@ CK_RV C_GetSlotList(CK_BBOOL tokenPresent, (void)pSlotList; (void)pulCount; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -132,6 +146,9 @@ CK_RV C_GetSlotInfo(CK_SLOT_ID slotID, (void)slotID; (void)pInfo; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -145,6 +162,9 @@ CK_RV C_InitToken(CK_SLOT_ID slotID, (void)ulPinLen; (void)pLabel; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -154,6 +174,9 @@ CK_RV C_GetTokenInfo(CK_SLOT_ID slotID, (void)slotID; (void)pInfo; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -165,6 +188,9 @@ CK_RV C_GetMechanismList(CK_SLOT_ID slotID, (void)pMechanismList; (void)pulCount; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -176,6 +202,9 @@ CK_RV C_GetMechanismInfo(CK_SLOT_ID slotID, (void)type; (void)pInfo; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -191,6 +220,9 @@ CK_RV C_OpenSession(CK_SLOT_ID slotID, (void)Notify; (void)phSession; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -198,6 +230,9 @@ CK_RV C_CloseSession(CK_SESSION_HANDLE hSession) { (void)hSession; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -205,6 +240,9 @@ CK_RV C_CloseAllSessions(CK_SLOT_ID slotID) { (void)slotID; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -214,6 +252,9 @@ CK_RV C_GetSessionInfo(CK_SESSION_HANDLE hSession, (void)hSession; (void)pInfo; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -225,6 +266,9 @@ CK_RV C_InitPIN(CK_SESSION_HANDLE hSession, (void)pPin; (void)ulPinLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -240,6 +284,9 @@ CK_RV C_SetPIN(CK_SESSION_HANDLE hSession, (void)pNewPin; (void)ulNewLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -254,6 +301,9 @@ CK_RV C_Login(CK_SESSION_HANDLE hSession, (void)pPin; (void)ulPinLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -261,6 +311,9 @@ CK_RV C_Logout(CK_SESSION_HANDLE hSession) { (void)hSession; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -272,6 +325,9 @@ CK_RV C_GetOperationState(CK_SESSION_HANDLE hSession, (void)pOperationState; (void)pulOperationStateLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -287,6 +343,9 @@ CK_RV C_SetOperationState(CK_SESSION_HANDLE hSession, (void)hEncryptionKey; (void)hAuthenticationKey; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -300,6 +359,9 @@ CK_RV C_CreateObject(CK_SESSION_HANDLE hSession, (void)ulCount; (void)phObject; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -315,6 +377,9 @@ CK_RV C_CopyObject(CK_SESSION_HANDLE hSession, (void)ulCount; (void)phNewObject; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -324,6 +389,9 @@ CK_RV C_DestroyObject(CK_SESSION_HANDLE hSession, (void)hSession; (void)hObject; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -335,6 +403,9 @@ CK_RV C_GetObjectSize(CK_SESSION_HANDLE hSession, (void)hObject; (void)pulSize; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -348,6 +419,9 @@ CK_RV C_GetAttributeValue(CK_SESSION_HANDLE hSession, (void)pTemplate; (void)ulCount; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -361,6 +435,9 @@ CK_RV C_SetAttributeValue(CK_SESSION_HANDLE hSession, (void)pTemplate; (void)ulCount; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -372,6 +449,9 @@ CK_RV C_FindObjectsInit(CK_SESSION_HANDLE hSession, (void)pTemplate; (void)ulCount; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -386,6 +466,9 @@ CK_RV C_FindObjects(CK_SESSION_HANDLE hSession, (void)ulMaxObjectCount; (void)pulObjectCount; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -393,6 +476,9 @@ CK_RV C_FindObjectsFinal(CK_SESSION_HANDLE hSession) { (void)hSession; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -404,6 +490,9 @@ CK_RV C_EncryptInit(CK_SESSION_HANDLE hSession, (void)pMechanism; (void)hKey; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -419,6 +508,9 @@ CK_RV C_Encrypt(CK_SESSION_HANDLE hSession, (void)pEncryptedData; (void)pulEncryptedDataLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -434,6 +526,9 @@ CK_RV C_EncryptUpdate(CK_SESSION_HANDLE hSession, (void)pEncryptedData; (void)pulEncryptedDataLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -445,6 +540,9 @@ CK_RV C_EncryptFinal(CK_SESSION_HANDLE hSession, (void)pLastEncryptedPart; (void)pulLastEncryptedPartLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -456,6 +554,9 @@ CK_RV C_DecryptInit(CK_SESSION_HANDLE hSession, (void)pMechanism; (void)hKey; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -471,6 +572,9 @@ CK_RV C_Decrypt(CK_SESSION_HANDLE hSession, (void)pData; (void)pulDataLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -486,6 +590,9 @@ CK_RV C_DecryptUpdate(CK_SESSION_HANDLE hSession, (void)pPart; (void)pulPartLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -497,6 +604,9 @@ CK_RV C_DecryptFinal(CK_SESSION_HANDLE hSession, (void)pLastPart; (void)pulLastPartLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -506,6 +616,9 @@ CK_RV C_DigestInit(CK_SESSION_HANDLE hSession, (void)hSession; (void)pMechanism; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -521,6 +634,9 @@ CK_RV C_Digest(CK_SESSION_HANDLE hSession, (void)pDigest; (void)pulDigestLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -532,6 +648,9 @@ CK_RV C_DigestUpdate(CK_SESSION_HANDLE hSession, (void)pPart; (void)ulPartLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -541,6 +660,9 @@ CK_RV C_DigestKey(CK_SESSION_HANDLE hSession, (void)hSession; (void)hKey; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -552,6 +674,9 @@ CK_RV C_DigestFinal(CK_SESSION_HANDLE hSession, (void)pDigest; (void)pulDigestLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -563,6 +688,9 @@ CK_RV C_SignInit(CK_SESSION_HANDLE hSession, (void)pMechanism; (void)hKey; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -578,6 +706,9 @@ CK_RV C_Sign(CK_SESSION_HANDLE hSession, (void)pSignature; (void)pulSignatureLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -589,6 +720,9 @@ CK_RV C_SignUpdate(CK_SESSION_HANDLE hSession, (void)pPart; (void)ulPartLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -600,6 +734,9 @@ CK_RV C_SignFinal(CK_SESSION_HANDLE hSession, (void)pSignature; (void)pulSignatureLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -611,6 +748,9 @@ CK_RV C_SignRecoverInit(CK_SESSION_HANDLE hSession, (void)pMechanism; (void)hKey; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -626,6 +766,9 @@ CK_RV C_SignRecover(CK_SESSION_HANDLE hSession, (void)pSignature; (void)pulSignatureLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -637,6 +780,9 @@ CK_RV C_VerifyInit(CK_SESSION_HANDLE hSession, (void)pMechanism; (void)hKey; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -652,6 +798,9 @@ CK_RV C_Verify(CK_SESSION_HANDLE hSession, (void)pSignature; (void)ulSignatureLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -663,6 +812,9 @@ CK_RV C_VerifyUpdate(CK_SESSION_HANDLE hSession, (void)pPart; (void)ulPartLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -674,6 +826,9 @@ CK_RV C_VerifyFinal(CK_SESSION_HANDLE hSession, (void)pSignature; (void)ulSignatureLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -685,6 +840,9 @@ CK_RV C_VerifyRecoverInit(CK_SESSION_HANDLE hSession, (void)pMechanism; (void)hKey; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -700,6 +858,9 @@ CK_RV C_VerifyRecover(CK_SESSION_HANDLE hSession, (void)pData; (void)pulDataLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -715,6 +876,9 @@ CK_RV C_DigestEncryptUpdate(CK_SESSION_HANDLE hSession, (void)pEncryptedPart; (void)pulEncryptedPartLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -730,6 +894,9 @@ CK_RV C_DecryptDigestUpdate(CK_SESSION_HANDLE hSession, (void)pPart; (void)pulPartLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -745,6 +912,9 @@ CK_RV C_SignEncryptUpdate(CK_SESSION_HANDLE hSession, (void)pEncryptedPart; (void)pulEncryptedPartLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -760,6 +930,9 @@ CK_RV C_DecryptVerifyUpdate(CK_SESSION_HANDLE hSession, (void)pPart; (void)pulPartLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -775,6 +948,9 @@ CK_RV C_GenerateKey(CK_SESSION_HANDLE hSession, (void)ulCount; (void)phKey; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -796,6 +972,9 @@ CK_RV C_GenerateKeyPair(CK_SESSION_HANDLE hSession, (void)phPublicKey; (void)phPrivateKey; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -813,6 +992,9 @@ CK_RV C_WrapKey(CK_SESSION_HANDLE hSession, (void)pWrappedKey; (void)pulWrappedKeyLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -834,6 +1016,9 @@ CK_RV C_UnwrapKey(CK_SESSION_HANDLE hSession, (void)ulCount; (void)phKey; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -851,6 +1036,9 @@ CK_RV C_DeriveKey(CK_SESSION_HANDLE hSession, (void)ulCount; (void)phKey; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -862,6 +1050,9 @@ CK_RV C_SeedRandom(CK_SESSION_HANDLE hSession, (void)pSeed; (void)ulSeedLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -873,6 +1064,9 @@ CK_RV C_GenerateRandom(CK_SESSION_HANDLE hSession, (void)pRandomData; (void)ulRandomLen; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -880,6 +1074,9 @@ CK_RV C_GetFunctionStatus(CK_SESSION_HANDLE hSession) { (void)hSession; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -887,6 +1084,9 @@ CK_RV C_CancelFunction(CK_SESSION_HANDLE hSession) { (void)hSession; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; } @@ -898,5 +1098,8 @@ CK_RV C_WaitForSlotEvent(CK_FLAGS flags, (void)slotID; (void)pReserved; + if (!lib_initiated()) + return CKR_CRYPTOKI_NOT_INITIALIZED; + return CKR_FUNCTION_NOT_SUPPORTED; }