%%% Copyright (c) 2019, Sunet. %%% See LICENSE for licensing information. %% The only RPC version we support. -define(RPC_VERSION, 0). -record(p11rpc_msg, { call_code = -1 :: integer(), % Length is 4 opt_len = -1 :: integer(), % Length is 4 data_len = -1 :: integer(), % Length is 4 options = <<>> :: binary(), % Length is opt_len data = <<>> :: binary(), % Length is data_len buffer = <<>> :: binary(), state = header :: header | opts | data | done }). -type p11rpc_msg() :: #p11rpc_msg{}. %% From p11-kit/rpc-message.h. -define(P11_RPC_CALL_ERROR, 0). -define(P11_RPC_CALL_C_Initialize, 1). -define(P11_RPC_CALL_C_Finalize, 2). -define(P11_RPC_CALL_C_GetInfo, 3). -define(P11_RPC_CALL_C_GetSlotList, 4). -define(P11_RPC_CALL_C_GetSlotInfo, 5). -define(P11_RPC_CALL_C_GetTokenInfo, 6). -define(P11_RPC_CALL_C_GetMechanismList, 7). -define(P11_RPC_CALL_C_GetMechanismInfo, 8). -define(P11_RPC_CALL_C_InitToken, 9). -define(P11_RPC_CALL_C_OpenSession, 10). -define(P11_RPC_CALL_C_CloseSession, 11). -define(P11_RPC_CALL_C_CloseAllSessions, 12). -define(P11_RPC_CALL_C_GetSessionInfo, 13). -define(P11_RPC_CALL_C_InitPIN, 14). -define(P11_RPC_CALL_C_SetPIN, 15). -define(P11_RPC_CALL_C_GetOperationState, 16). -define(P11_RPC_CALL_C_SetOperationState, 17). -define(P11_RPC_CALL_C_Login, 18). -define(P11_RPC_CALL_C_Logout, 19). -define(P11_RPC_CALL_C_CreateObject, 20). -define(P11_RPC_CALL_C_CopyObject, 21). -define(P11_RPC_CALL_C_DestroyObject, 22). -define(P11_RPC_CALL_C_GetObjectSize, 23). -define(P11_RPC_CALL_C_GetAttributeValue, 24). -define(P11_RPC_CALL_C_SetAttributeValue, 25). -define(P11_RPC_CALL_C_FindObjectsInit, 26). -define(P11_RPC_CALL_C_FindObjects, 27). -define(P11_RPC_CALL_C_FindObjectsFinal, 28). -define(P11_RPC_CALL_C_EncryptInit, 29). -define(P11_RPC_CALL_C_Encrypt, 30). -define(P11_RPC_CALL_C_EncryptUpdate, 31). -define(P11_RPC_CALL_C_EncryptFinal, 32). -define(P11_RPC_CALL_C_DecryptInit, 33). -define(P11_RPC_CALL_C_Decrypt, 34). -define(P11_RPC_CALL_C_DecryptUpdate, 35). -define(P11_RPC_CALL_C_DecryptFinal, 36). -define(P11_RPC_CALL_C_DigestInit, 37). -define(P11_RPC_CALL_C_Digest, 38). -define(P11_RPC_CALL_C_DigestUpdate, 39). -define(P11_RPC_CALL_C_DigestKey, 40). -define(P11_RPC_CALL_C_DigestFinal, 41). -define(P11_RPC_CALL_C_SignInit, 42). -define(P11_RPC_CALL_C_Sign, 43). -define(P11_RPC_CALL_C_SignUpdate, 44). -define(P11_RPC_CALL_C_SignFinal, 45). -define(P11_RPC_CALL_C_SignRecoverInit, 46). -define(P11_RPC_CALL_C_SignRecover, 47). -define(P11_RPC_CALL_C_VerifyInit, 48). -define(P11_RPC_CALL_C_Verify, 49). -define(P11_RPC_CALL_C_VerifyUpdate, 50). -define(P11_RPC_CALL_C_VerifyFinal, 51). -define(P11_RPC_CALL_C_VerifyRecoverInit, 52). -define(P11_RPC_CALL_C_VerifyRecover, 53). -define(P11_RPC_CALL_C_DigestEncryptUpdate, 54). -define(P11_RPC_CALL_C_DecryptDigestUpdate, 55). -define(P11_RPC_CALL_C_SignEncryptUpdate, 60). -define(P11_RPC_CALL_C_DecryptVerifyUpdate, 61). -define(P11_RPC_CALL_C_GenerateKey, 62). -define(P11_RPC_CALL_C_GenerateKeyPair, 63). -define(P11_RPC_CALL_C_WrapKey, 64). -define(P11_RPC_CALL_C_UnwrapKey, 65). -define(P11_RPC_CALL_C_DeriveKey, 66). -define(P11_RPC_CALL_C_SeedRandom, 67). -define(P11_RPC_CALL_C_GenerateRandom, 68). -define(P11_RPC_CALL_C_WaitForSlotEvent, 69). -define(P11_RPC_CALL_MAX, 70). %% Return values, some of them. From pcks11.h. -define(CKR_OK, 0). -define(CKR_GENERAL_ERROR, 5). -define(CKR_FUNCTION_FAILED, 6). -define(CKR_DEVICE_ERROR, 16#30). % 48 -define(CKR_SESSION_CLOSED, 16#B0). % 176 %% Argument descriptions. From p11-kit/rpc-message.h p11_rpc_calls[]. %% * a_ = prefix denotes array of _ %% * A = CK_ATTRIBUTE %% * f_ = prefix denotes buffer for _ %% * M = CK_MECHANISM %% * u = CK_ULONG %% * s = space padded string %% * v = CK_VERSION %% * y = CK_BYTE %% * z = null terminated string %% Needed for generating our own messages, like ERROR. %% They're being sent in the messages, after the request id. %% TOOD: Complete argument descrptions, at least for messages %% we generate. -define(REQIDS, [ % {name, request argdesc, response argdesc} {"ERROR", "", "u"}, {"C_Initialize", "ayyay", ""}, {"C_Finalize", "", ""}, {"C_GetInfo", "", "vsusv"}, {"C_GetSlotList", "TODO", "TODO"}, {"C_GetSlotInfo", "TODO", "TODO"}, {"C_GetTokenInfo", "TODO", "TODO"}, {"C_GetMechanismList", "TODO", "TODO"}, {"C_GetMechanismInfo", "TODO", "TODO"}, {"C_InitToken", "TODO", "TODO"}, {"C_OpenSession", "uu", "u"}, {"C_CloseSession", "u", ""}, {"C_CloseAllSessions", "TODO", "TODO"}, {"C_GetSessionInfo", "TODO", "TODO"}, {"C_InitPIN", "TODO", "TODO"}, {"C_SetPIN", "TODO", "TODO"}, {"C_GetOperationState", "TODO", "TODO"}, {"C_SetOperationState", "TODO", "TODO"}, {"C_Login", "uuay", ""}, {"C_Logout", "u", ""}, {"C_CreateObject", "TODO", "TODO"}, {"C_CopyObject", "TODO", "TODO"}, {"C_DestroyObject", "TODO", "TODO"}, {"C_GetObjectSize", "TODO", "TODO"}, {"C_GetAttributeValue", "TODO", "TODO"}, {"C_SetAttributeValue", "TODO", "TODO"}, {"C_FindObjectsInit", "TODO", "TODO"}, {"C_FindObjects", "TODO", "TODO"}, {"C_FindObjectsFinal", "TODO", "TODO"}, {"C_EncryptInit", "TODO", "TODO"}, {"C_Encrypt", "TODO", "TODO"}, {"C_EncryptUpdate", "TODO", "TODO"}, {"C_EncryptFinal", "TODO", "TODO"}, {"C_DecryptInit", "TODO", "TODO"}, {"C_Decrypt", "TODO", "TODO"}, {"C_DecryptUpdate", "TODO", "TODO"}, {"C_DecryptFinal", "TODO", "TODO"}, {"C_DigestInit", "TODO", "TODO"}, {"C_Digest", "TODO", "TODO"}, {"C_DigestUpdate", "TODO", "TODO"}, {"C_DigestKey", "TODO", "TODO"}, {"C_DigestFinal", "TODO", "TODO"}, {"C_SignInit", "TODO", "TODO"}, {"C_Sign", "TODO", "TODO"}, {"C_SignUpdate", "TODO", "TODO"}, {"C_SignFinal", "TODO", "TODO"}, {"C_SignRecoverInit", "TODO", "TODO"}, {"C_SignRecover", "TODO", "TODO"}, {"C_VerifyInit", "TODO", "TODO"}, {"C_Verify", "TODO", "TODO"}, {"C_VerifyUpdate", "TODO", "TODO"}, {"C_VerifyFinal", "TODO", "TODO"}, {"C_VerifyRecoverInit", "TODO", "TODO"}, {"C_VerifyRecover", "TODO", "TODO"}, {"C_DigestEncryptUpdate", "TODO", "TODO"}, {"C_DecryptDigestUpdate", "TODO", "TODO"}, {"C_SignEncryptUpdate", "TODO", "TODO"}, {"C_DecryptVerifyUpdate", "TODO", "TODO"}, {"C_GenerateKey", "TODO", "TODO"}, {"C_GenerateKeyPair", "TODO", "TODO"}, {"C_WrapKey", "TODO", "TODO"}, {"C_UnwrapKey", "TODO", "TODO"}, {"C_DeriveKey", "TODO", "TODO"}, {"C_SeedRandom", "TODO", "TODO"}, {"C_GenerateRandom", "TODO", "TODO"}, {"C_WaitForSlotEvent" "TODO", "TODO"} ]).