Skip to content

Commit

Permalink
Interface: Move complex macro code to .pre file
Browse files Browse the repository at this point in the history
Heavy macro code moved to interface.pre
and interface.gen.c is generated via `make generate-code`

Signed-off-by: Simo Sorce <simo@redhat.com>
  • Loading branch information
simo5 committed Jan 5, 2023
1 parent 5a6d22d commit abd0080
Show file tree
Hide file tree
Showing 4 changed files with 918 additions and 165 deletions.
4 changes: 4 additions & 0 deletions src/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,10 @@ pkcs11_la_SOURCES = \
provider.exports \
$(NULL)

EXTRA_DIST = \
interface.gen.c \
$(NULL)

pkcs11_la_CFLAGS = $(AM_CFLAGS) $(OPENSSL_CFLAGS) -Wall -Werror
pkcs11_la_LIBADD = $(OPENSSL_LIBS)

Expand Down
166 changes: 1 addition & 165 deletions src/interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,171 +59,7 @@ struct p11prov_interface {
CK_C_GetInterface GetInterface;
};

#define IMPL_CALL_PROLOG(name) \
P11PROV_INTERFACE *intf = p11prov_ctx_get_interface(ctx); \
CK_RV ret; \
P11PROV_debug("Calling C_" #name)
#define IMPL_CALL_EPILOG(name) \
if (ret != CKR_OK) { \
P11PROV_raise(ctx, ret, "Error returned by C_" #name); \
} \
return ret
#define IMPL_INTERFACE_FN_1_ARG(name, t1, a1) \
CK_RV p11prov_##name(P11PROV_CTX *ctx, t1 a1) \
{ \
IMPL_CALL_PROLOG(name); \
ret = intf->name(a1); \
IMPL_CALL_EPILOG(name); \
}
#define IMPL_INTERFACE_FN_2_ARG(name, t1, a1, t2, a2) \
CK_RV p11prov_##name(P11PROV_CTX *ctx, t1 a1, t2 a2) \
{ \
IMPL_CALL_PROLOG(name); \
ret = intf->name(a1, a2); \
IMPL_CALL_EPILOG(name); \
}
#define IMPL_INTERFACE_FN_3_ARG(name, t1, a1, t2, a2, t3, a3) \
CK_RV p11prov_##name(P11PROV_CTX *ctx, t1 a1, t2 a2, t3 a3) \
{ \
IMPL_CALL_PROLOG(name); \
ret = intf->name(a1, a2, a3); \
IMPL_CALL_EPILOG(name); \
}
#define IMPL_INTERFACE_FN_4_ARG(name, t1, a1, t2, a2, t3, a3, t4, a4) \
CK_RV p11prov_##name(P11PROV_CTX *ctx, t1 a1, t2 a2, t3 a3, t4 a4) \
{ \
IMPL_CALL_PROLOG(name); \
ret = intf->name(a1, a2, a3, a4); \
IMPL_CALL_EPILOG(name); \
}
#define IMPL_INTERFACE_FN_5_ARG(name, t1, a1, t2, a2, t3, a3, t4, a4, t5, a5) \
CK_RV p11prov_##name(P11PROV_CTX *ctx, t1 a1, t2 a2, t3 a3, t4 a4, t5 a5) \
{ \
IMPL_CALL_PROLOG(name); \
ret = intf->name(a1, a2, a3, a4, a5); \
IMPL_CALL_EPILOG(name); \
}
#define IMPL_INTERFACE_FN_6_ARG(name, t1, a1, t2, a2, t3, a3, t4, a4, t5, a5, \
t6, a6) \
CK_RV p11prov_##name(P11PROV_CTX *ctx, t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, \
t6 a6) \
{ \
IMPL_CALL_PROLOG(name); \
ret = intf->name(a1, a2, a3, a4, a5, a6); \
IMPL_CALL_EPILOG(name); \
}
#define IMPL_INTERFACE_FN_8_ARG(name, t1, a1, t2, a2, t3, a3, t4, a4, t5, a5, \
t6, a6, t7, a7, t8, a8) \
CK_RV p11prov_##name(P11PROV_CTX *ctx, t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, \
t6 a6, t7 a7, t8 a8) \
{ \
IMPL_CALL_PROLOG(name); \
ret = intf->name(a1, a2, a3, a4, a5, a6, a7, a8); \
IMPL_CALL_EPILOG(name); \
}

IMPL_INTERFACE_FN_1_ARG(Initialize, CK_VOID_PTR, pInitArgs);
IMPL_INTERFACE_FN_1_ARG(Finalize, CK_VOID_PTR, pReserved);
IMPL_INTERFACE_FN_1_ARG(GetInfo, CK_INFO_PTR, pInfo);
IMPL_INTERFACE_FN_4_ARG(GetInterface, CK_UTF8CHAR_PTR, pInterfaceName,
CK_VERSION_PTR, pVersion, CK_INTERFACE_PTR_PTR,
ppInterface, CK_FLAGS, flags);
IMPL_INTERFACE_FN_1_ARG(GetFunctionList, CK_FUNCTION_LIST_PTR_PTR,
ppFunctionList);
IMPL_INTERFACE_FN_3_ARG(GetSlotList, CK_BBOOL, tokenPresent, CK_SLOT_ID_PTR,
pSlotList, CK_ULONG_PTR, pulCount);
IMPL_INTERFACE_FN_2_ARG(GetSlotInfo, CK_SLOT_ID, slotID, CK_SLOT_INFO_PTR,
pInfo);
IMPL_INTERFACE_FN_2_ARG(GetTokenInfo, CK_SLOT_ID, slotID, CK_TOKEN_INFO_PTR,
pInfo);
IMPL_INTERFACE_FN_3_ARG(GetMechanismList, CK_SLOT_ID, slotID,
CK_MECHANISM_TYPE_PTR, pMechanismList, CK_ULONG_PTR,
pulCount);

IMPL_INTERFACE_FN_3_ARG(GetMechanismInfo, CK_SLOT_ID, slotID, CK_MECHANISM_TYPE,
type, CK_MECHANISM_INFO_PTR, pInfo);
IMPL_INTERFACE_FN_5_ARG(OpenSession, CK_SLOT_ID, slotID, CK_FLAGS, flags,
CK_VOID_PTR, pApplication, CK_NOTIFY, Notify,
CK_SESSION_HANDLE_PTR, phSession);
IMPL_INTERFACE_FN_1_ARG(CloseSession, CK_SESSION_HANDLE, hSession);
IMPL_INTERFACE_FN_2_ARG(GetSessionInfo, CK_SESSION_HANDLE, hSession,
CK_SESSION_INFO_PTR, pInfo);
IMPL_INTERFACE_FN_3_ARG(GetOperationState, CK_SESSION_HANDLE, hSession,
CK_BYTE_PTR, pOperationState, CK_ULONG_PTR,
pulOperationStateLen);
IMPL_INTERFACE_FN_5_ARG(SetOperationState, CK_SESSION_HANDLE, hSession,
CK_BYTE_PTR, pOperationState, CK_ULONG,
ulOperationStateLen, CK_OBJECT_HANDLE, hEncryptionKey,
CK_OBJECT_HANDLE, hAuthenticationKey);
IMPL_INTERFACE_FN_4_ARG(Login, CK_SESSION_HANDLE, hSession, CK_USER_TYPE,
userType, CK_UTF8CHAR_PTR, pPin, CK_ULONG, ulPinLen);
IMPL_INTERFACE_FN_4_ARG(CreateObject, CK_SESSION_HANDLE, hSession,
CK_ATTRIBUTE_PTR, pTemplate, CK_ULONG, ulCount,
CK_OBJECT_HANDLE_PTR, phObject);
IMPL_INTERFACE_FN_5_ARG(CopyObject, CK_SESSION_HANDLE, hSession,
CK_OBJECT_HANDLE, hObject, CK_ATTRIBUTE_PTR, pTemplate,
CK_ULONG, ulCount, CK_OBJECT_HANDLE_PTR, phNewObject);
IMPL_INTERFACE_FN_2_ARG(DestroyObject, CK_SESSION_HANDLE, hSession,
CK_OBJECT_HANDLE, hObject);
IMPL_INTERFACE_FN_4_ARG(GetAttributeValue, CK_SESSION_HANDLE, hSession,
CK_OBJECT_HANDLE, hObject, CK_ATTRIBUTE_PTR, pTemplate,
CK_ULONG, ulCount);
IMPL_INTERFACE_FN_4_ARG(SetAttributeValue, CK_SESSION_HANDLE, hSession,
CK_OBJECT_HANDLE, hObject, CK_ATTRIBUTE_PTR, pTemplate,
CK_ULONG, ulCount);
IMPL_INTERFACE_FN_3_ARG(FindObjectsInit, CK_SESSION_HANDLE, hSession,
CK_ATTRIBUTE_PTR, pTemplate, CK_ULONG, ulCount);
IMPL_INTERFACE_FN_4_ARG(FindObjects, CK_SESSION_HANDLE, hSession,
CK_OBJECT_HANDLE_PTR, phObject, CK_ULONG,
ulMaxObjectCount, CK_ULONG_PTR, pulObjectCount);
IMPL_INTERFACE_FN_1_ARG(FindObjectsFinal, CK_SESSION_HANDLE, hSession);

IMPL_INTERFACE_FN_3_ARG(EncryptInit, CK_SESSION_HANDLE, hSession,
CK_MECHANISM_PTR, pMechanism, CK_OBJECT_HANDLE, hKey);
IMPL_INTERFACE_FN_5_ARG(Encrypt, CK_SESSION_HANDLE, hSession, CK_BYTE_PTR,
pData, CK_ULONG, ulDataLen, CK_BYTE_PTR, pEncryptedData,
CK_ULONG_PTR, pulEncryptedDataLen);
IMPL_INTERFACE_FN_3_ARG(DecryptInit, CK_SESSION_HANDLE, hSession,
CK_MECHANISM_PTR, pMechanism, CK_OBJECT_HANDLE, hKey);
IMPL_INTERFACE_FN_5_ARG(Decrypt, CK_SESSION_HANDLE, hSession, CK_BYTE_PTR,
pEncryptedData, CK_ULONG, ulEncryptedDataLen,
CK_BYTE_PTR, pData, CK_ULONG_PTR, pulDataLen);
IMPL_INTERFACE_FN_2_ARG(DigestInit, CK_SESSION_HANDLE, hSession,
CK_MECHANISM_PTR, pMechanism);
IMPL_INTERFACE_FN_3_ARG(DigestUpdate, CK_SESSION_HANDLE, hSession, CK_BYTE_PTR,
pPart, CK_ULONG, ulPartLen);
IMPL_INTERFACE_FN_3_ARG(DigestFinal, CK_SESSION_HANDLE, hSession, CK_BYTE_PTR,
pDigest, CK_ULONG_PTR, pulDigestLen);
IMPL_INTERFACE_FN_3_ARG(SignInit, CK_SESSION_HANDLE, hSession, CK_MECHANISM_PTR,
pMechanism, CK_OBJECT_HANDLE, hKey);
IMPL_INTERFACE_FN_5_ARG(Sign, CK_SESSION_HANDLE, hSession, CK_BYTE_PTR, pData,
CK_ULONG, ulDataLen, CK_BYTE_PTR, pSignature,
CK_ULONG_PTR, pulSignatureLen);
IMPL_INTERFACE_FN_3_ARG(SignUpdate, CK_SESSION_HANDLE, hSession, CK_BYTE_PTR,
pPart, CK_ULONG, ulPartLen);
IMPL_INTERFACE_FN_3_ARG(SignFinal, CK_SESSION_HANDLE, hSession, CK_BYTE_PTR,
pSignature, CK_ULONG_PTR, pulSignatureLen);
IMPL_INTERFACE_FN_3_ARG(VerifyInit, CK_SESSION_HANDLE, hSession,
CK_MECHANISM_PTR, pMechanism, CK_OBJECT_HANDLE, hKey);
IMPL_INTERFACE_FN_5_ARG(Verify, CK_SESSION_HANDLE, hSession, CK_BYTE_PTR, pData,
CK_ULONG, ulDataLen, CK_BYTE_PTR, pSignature, CK_ULONG,
ulSignatureLen);
IMPL_INTERFACE_FN_3_ARG(VerifyUpdate, CK_SESSION_HANDLE, hSession, CK_BYTE_PTR,
pPart, CK_ULONG, ulPartLen);
IMPL_INTERFACE_FN_3_ARG(VerifyFinal, CK_SESSION_HANDLE, hSession, CK_BYTE_PTR,
pSignature, CK_ULONG, ulSignatureLen);
IMPL_INTERFACE_FN_8_ARG(GenerateKeyPair, CK_SESSION_HANDLE, hSession,
CK_MECHANISM_PTR, pMechanism, CK_ATTRIBUTE_PTR,
pPublicKeyTemplate, CK_ULONG, ulPublicKeyAttributeCount,
CK_ATTRIBUTE_PTR, pPrivateKeyTemplate, CK_ULONG,
ulPrivateKeyAttributeCount, CK_OBJECT_HANDLE_PTR,
phPublicKey, CK_OBJECT_HANDLE_PTR, phPrivateKey);
IMPL_INTERFACE_FN_6_ARG(DeriveKey, CK_SESSION_HANDLE, hSession,
CK_MECHANISM_PTR, pMechanism, CK_OBJECT_HANDLE,
hBaseKey, CK_ATTRIBUTE_PTR, pTemplate, CK_ULONG,
ulAttributeCount, CK_OBJECT_HANDLE_PTR, phKey);
IMPL_INTERFACE_FN_3_ARG(GenerateRandom, CK_SESSION_HANDLE, hSession,
CK_BYTE_PTR, RandomData, CK_ULONG, ulRandomLen);
#include "interface.gen.c"

static CK_RV p11prov_NO_GetInterface(CK_UTF8CHAR_PTR pInterfaceName,
CK_VERSION_PTR pVersion,
Expand Down
Loading

0 comments on commit abd0080

Please sign in to comment.