From a170631811d6596887328f25132e236d89050842 Mon Sep 17 00:00:00 2001 From: Daiki Ueno Date: Sat, 2 Sep 2023 09:29:53 +0900 Subject: [PATCH 1/2] pkcs11-json: Update git submodule Signed-off-by: Daiki Ueno --- subprojects/pkcs11-json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/pkcs11-json b/subprojects/pkcs11-json index e5393487..404c0232 160000 --- a/subprojects/pkcs11-json +++ b/subprojects/pkcs11-json @@ -1 +1 @@ -Subproject commit e5393487bf2d665440e2ebaa74c674974acb23b7 +Subproject commit 404c0232523d1cb0d219b25210d8ebbfde3486c7 From ef2a9db71197fcd1b1d7d766cbc3cd0081be4f06 Mon Sep 17 00:00:00 2001 From: Daiki Ueno Date: Sat, 2 Sep 2023 10:11:09 +0900 Subject: [PATCH 2/2] proxy: Generate wrappers with script Signed-off-by: Daiki Ueno --- .gitignore | 1 + p11-kit/Makefile.am | 23 +- p11-kit/gen-wrappers.py | 32 +- p11-kit/meson.build | 12 + p11-kit/proxy.c | 1517 +------------------------ p11-kit/templates/proxy-excludes.list | 14 + p11-kit/templates/proxy-wrappers.py | 100 ++ 7 files changed, 175 insertions(+), 1524 deletions(-) create mode 100644 p11-kit/templates/proxy-excludes.list create mode 100644 p11-kit/templates/proxy-wrappers.py diff --git a/.gitignore b/.gitignore index bf1f51bb..f63f6891 100644 --- a/.gitignore +++ b/.gitignore @@ -102,6 +102,7 @@ frob-* /p11-kit/p11-kit-1.pc /p11-kit/pkcs11.conf.example /p11-kit/p11-kit-server.service +/p11-kit/proxy-generated.h /p11-kit/virtual-*-generated.h /p11-kit/virtual-fixed-wrappers.h /p11-kit/virtual-fixed-closures.h diff --git a/p11-kit/Makefile.am b/p11-kit/Makefile.am index 4e940603..8926fcb7 100644 --- a/p11-kit/Makefile.am +++ b/p11-kit/Makefile.am @@ -35,14 +35,11 @@ VIRTUAL_GENERATED = \ p11-kit/virtual-base-generated.h \ $(NULL) -BUILT_SOURCES += $(VIRTUAL_GENERATED) \ - $(NULL) +BUILT_SOURCES += $(VIRTUAL_GENERATED) p11-kit/virtual.c: $(VIRTUAL_GENERATED) -CLEANFILES += \ - $(VIRTUAL_GENERATED) \ - $(NULL) +CLEANFILES += $(VIRTUAL_GENERATED) p11-kit/virtual-ffi-generated.h: Makefile p11-kit/gen-wrappers.py subprojects/pkcs11-json/pkcs11.json $(AM_V_GEN)$(PYTHON) $(srcdir)/p11-kit/gen-wrappers.py \ @@ -107,6 +104,22 @@ else libp11_kit_la_LDFLAGS += -export-symbols-regex '^C_GetFunctionList|^C_GetInterface|^p11_kit_' endif +PROXY_GENERATED = \ + p11-kit/proxy-generated.h \ + $(NULL) + +BUILT_SOURCES += $(PROXY_GENERATED) + +p11-kit/proxy.c: $(PROXY_GENERATED) + +CLEANFILES += $(PROXY_GENERATED) + +p11-kit/proxy-generated.h: Makefile p11-kit/gen-wrappers.py subprojects/pkcs11-json/pkcs11.json + $(AM_V_GEN)$(PYTHON) $(srcdir)/p11-kit/gen-wrappers.py \ + --template $(srcdir)/p11-kit/templates/proxy-wrappers.py \ + --excludes $(srcdir)/p11-kit/templates/proxy-excludes.list \ + --infile $(srcdir)/subprojects/pkcs11-json/pkcs11.json --outfile $@ + libp11_kit_la_SOURCES = \ p11-kit/proxy.c p11-kit/proxy.h p11-kit/proxy-init.c \ p11-kit/rpc-server.c \ diff --git a/p11-kit/gen-wrappers.py b/p11-kit/gen-wrappers.py index 23943668..5bb47ec1 100755 --- a/p11-kit/gen-wrappers.py +++ b/p11-kit/gen-wrappers.py @@ -9,6 +9,13 @@ import sys INDENT = " " +X_EXCLUDES = [ + "C_GetFunctionList", + "C_GetFunctionStatus", + "C_CancelFunction", + "C_GetInterfaceList", + "C_GetInterface", +] def emit_wrapper_function(function, templates, concat_lines=False): @@ -45,11 +52,30 @@ def emit_wrapper_function(function, templates, concat_lines=False): for index, argument in enumerate(function["arguments"]) ]) - function_body_template = templates["function_body"] - if function["version"] >= 3: + has_slot_id = next((argument for argument in function["arguments"] if argument["type"] == "CK_SLOT_ID"), None) + has_session_handle = next((argument for argument in function["arguments"] if argument["type"] == "CK_SESSION_HANDLE"), None) + assert not (has_slot_id and has_session_handle) + + function_body_template = templates.get("function_body") + if function_body_template and function["version"] >= 3: function_body_template = templates.get("function_body_v3", function_body_template) + if has_slot_id: + template = templates.get("function_body_with_slot") + if template is not None: + function_body_template = templates.get( + "function_body_with_slot_v3", + template, + ) + elif has_session_handle: + template = templates.get("function_body_with_session") + if template is not None: + function_body_template = templates.get( + "function_body_with_session_v3", + template, + ) + return function_body_template.format( indent=INDENT, function_name=function_name, @@ -126,7 +152,7 @@ def emit_wrapper_entry(function, templates, suffix=None): templates, renames.get(function["name"]), ) - for function in functions if function["name"] not in excludes + for function in functions if function["name"] not in X_EXCLUDES ]) entries = separator.join([ INDENT + emit_wrapper_entry( diff --git a/p11-kit/meson.build b/p11-kit/meson.build index a7f33210..3548690c 100644 --- a/p11-kit/meson.build +++ b/p11-kit/meson.build @@ -103,6 +103,18 @@ libp11_kit_sources = [ 'util.c' ] +libp11_kit_sources += custom_target('generate proxy-generated.h', + input: pkcs11_json, + output: 'proxy-generated.h', + command: [ + python, + meson.current_source_dir() / 'gen-wrappers.py', + '--template', meson.current_source_dir() / 'templates' / 'proxy-wrappers.py', + '--excludes', meson.current_source_dir() / 'templates' / 'proxy-excludes.list', + '--infile', '@INPUT@', + '--outfile', '@OUTPUT@', + ]) + libp11_kit_symbol_map = meson.current_source_dir() / 'libp11-kit.map' libp11_kit_ldflags = cc.get_supported_link_arguments([ '-Wl,--version-script,' + libp11_kit_symbol_map diff --git a/p11-kit/proxy.c b/p11-kit/proxy.c index 5eb48f54..354e0dea 100644 --- a/p11-kit/proxy.c +++ b/p11-kit/proxy.c @@ -542,85 +542,6 @@ proxy_C_GetSlotList (CK_X_FUNCTION_LIST *self, return rv; } -static CK_RV -proxy_C_GetSlotInfo (CK_X_FUNCTION_LIST *self, - CK_SLOT_ID id, - CK_SLOT_INFO_PTR info) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_slot_to_real (state->px, &id, &map); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_GetSlotInfo) (id, info); -} - -static CK_RV -proxy_C_GetTokenInfo (CK_X_FUNCTION_LIST *self, - CK_SLOT_ID id, - CK_TOKEN_INFO_PTR info) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_slot_to_real (state->px, &id, &map); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_GetTokenInfo) (id, info); -} - -static CK_RV -proxy_C_GetMechanismList (CK_X_FUNCTION_LIST *self, - CK_SLOT_ID id, - CK_MECHANISM_TYPE_PTR mechanism_list, - CK_ULONG_PTR count) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_slot_to_real (state->px, &id, &map); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_GetMechanismList) (id, mechanism_list, count); -} - -static CK_RV -proxy_C_GetMechanismInfo (CK_X_FUNCTION_LIST *self, - CK_SLOT_ID id, - CK_MECHANISM_TYPE type, - CK_MECHANISM_INFO_PTR info) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_slot_to_real (state->px, &id, &map); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_GetMechanismInfo) (id, type, info); -} - -static CK_RV -proxy_C_InitToken (CK_X_FUNCTION_LIST *self, - CK_SLOT_ID id, - CK_UTF8CHAR_PTR pin, - CK_ULONG pin_len, - CK_UTF8CHAR_PTR label) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_slot_to_real (state->px, &id, &map); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_InitToken) (id, pin, pin_len, label); -} - static CK_RV proxy_C_WaitForSlotEvent (CK_X_FUNCTION_LIST *self, CK_FLAGS flags, @@ -805,1443 +726,7 @@ proxy_C_GetSessionInfo (CK_X_FUNCTION_LIST *self, return rv; } -static CK_RV -proxy_C_InitPIN (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_UTF8CHAR_PTR pin, - CK_ULONG pin_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - - return (map.funcs->C_InitPIN) (handle, pin, pin_len); -} - -static CK_RV -proxy_C_SetPIN (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_UTF8CHAR_PTR old_pin, - CK_ULONG old_pin_len, - CK_UTF8CHAR_PTR new_pin, - CK_ULONG new_pin_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - - return (map.funcs->C_SetPIN) (handle, old_pin, old_pin_len, new_pin, new_pin_len); -} - -static CK_RV -proxy_C_GetOperationState (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_BYTE_PTR operation_state, - CK_ULONG_PTR operation_state_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_GetOperationState) (handle, operation_state, operation_state_len); -} - -static CK_RV -proxy_C_SetOperationState (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_BYTE_PTR operation_state, - CK_ULONG operation_state_len, - CK_OBJECT_HANDLE encryption_key, - CK_OBJECT_HANDLE authentication_key) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_SetOperationState) (handle, operation_state, operation_state_len, encryption_key, authentication_key); -} - -static CK_RV -proxy_C_Login (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_USER_TYPE user_type, - CK_UTF8CHAR_PTR pin, - CK_ULONG pin_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - - return (map.funcs->C_Login) (handle, user_type, pin, pin_len); -} - -static CK_RV -proxy_C_Logout (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_Logout) (handle); -} - -static CK_RV -proxy_C_CreateObject (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_ATTRIBUTE_PTR template, - CK_ULONG count, - CK_OBJECT_HANDLE_PTR new_object) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - - return (map.funcs->C_CreateObject) (handle, template, count, new_object); -} - -static CK_RV -proxy_C_CopyObject (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_OBJECT_HANDLE object, - CK_ATTRIBUTE_PTR template, - CK_ULONG count, - CK_OBJECT_HANDLE_PTR new_object) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_CopyObject) (handle, object, template, count, new_object); -} - -static CK_RV -proxy_C_DestroyObject (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_OBJECT_HANDLE object) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_DestroyObject) (handle, object); -} - -static CK_RV -proxy_C_GetObjectSize (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_OBJECT_HANDLE object, - CK_ULONG_PTR size) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_GetObjectSize) (handle, object, size); -} - -static CK_RV -proxy_C_GetAttributeValue (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_OBJECT_HANDLE object, - CK_ATTRIBUTE_PTR template, - CK_ULONG count) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_GetAttributeValue) (handle, object, template, count); -} - -static CK_RV -proxy_C_SetAttributeValue (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_OBJECT_HANDLE object, - CK_ATTRIBUTE_PTR template, - CK_ULONG count) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_SetAttributeValue) (handle, object, template, count); -} - -static CK_RV -proxy_C_FindObjectsInit (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_ATTRIBUTE_PTR template, - CK_ULONG count) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_FindObjectsInit) (handle, template, count); -} - -static CK_RV -proxy_C_FindObjects (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_OBJECT_HANDLE_PTR objects, - CK_ULONG max_count, - CK_ULONG_PTR count) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_FindObjects) (handle, objects, max_count, count); -} - -static CK_RV -proxy_C_FindObjectsFinal (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_FindObjectsFinal) (handle); -} - -static CK_RV -proxy_C_EncryptInit (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_MECHANISM_PTR mechanism, - CK_OBJECT_HANDLE key) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_EncryptInit) (handle, mechanism, key); -} - -static CK_RV -proxy_C_Encrypt (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_BYTE_PTR input, - CK_ULONG input_len, - CK_BYTE_PTR encrypted_data, - CK_ULONG_PTR encrypted_data_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_Encrypt) (handle, input, input_len, encrypted_data, encrypted_data_len); -} - -static CK_RV -proxy_C_EncryptUpdate (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_BYTE_PTR part, - CK_ULONG part_len, - CK_BYTE_PTR encrypted_part, - CK_ULONG_PTR encrypted_part_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_EncryptUpdate) (handle, part, part_len, encrypted_part, encrypted_part_len); -} - -static CK_RV -proxy_C_EncryptFinal (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_BYTE_PTR last_part, - CK_ULONG_PTR last_part_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_EncryptFinal) (handle, last_part, last_part_len); -} - -static CK_RV -proxy_C_DecryptInit (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_MECHANISM_PTR mechanism, - CK_OBJECT_HANDLE key) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_DecryptInit) (handle, mechanism, key); -} - -static CK_RV -proxy_C_Decrypt (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_BYTE_PTR enc_data, - CK_ULONG enc_data_len, - CK_BYTE_PTR output, - CK_ULONG_PTR output_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_Decrypt) (handle, enc_data, enc_data_len, output, output_len); -} - -static CK_RV -proxy_C_DecryptUpdate (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_BYTE_PTR enc_part, - CK_ULONG enc_part_len, - CK_BYTE_PTR part, - CK_ULONG_PTR part_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_DecryptUpdate) (handle, enc_part, enc_part_len, part, part_len); -} - -static CK_RV -proxy_C_DecryptFinal (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_BYTE_PTR last_part, - CK_ULONG_PTR last_part_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_DecryptFinal) (handle, last_part, last_part_len); -} - -static CK_RV -proxy_C_DigestInit (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_MECHANISM_PTR mechanism) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_DigestInit) (handle, mechanism); -} - -static CK_RV -proxy_C_Digest (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_BYTE_PTR input, - CK_ULONG input_len, - CK_BYTE_PTR digest, - CK_ULONG_PTR digest_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_Digest) (handle, input, input_len, digest, digest_len); -} - -static CK_RV -proxy_C_DigestUpdate (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_BYTE_PTR part, - CK_ULONG part_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_DigestUpdate) (handle, part, part_len); -} - -static CK_RV -proxy_C_DigestKey (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_OBJECT_HANDLE key) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_DigestKey) (handle, key); -} - -static CK_RV -proxy_C_DigestFinal (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_BYTE_PTR digest, - CK_ULONG_PTR digest_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_DigestFinal) (handle, digest, digest_len); -} - -static CK_RV -proxy_C_SignInit (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_MECHANISM_PTR mechanism, - CK_OBJECT_HANDLE key) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_SignInit) (handle, mechanism, key); -} - -static CK_RV -proxy_C_Sign (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_BYTE_PTR input, - CK_ULONG input_len, - CK_BYTE_PTR signature, - CK_ULONG_PTR signature_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_Sign) (handle, input, input_len, signature, signature_len); -} - -static CK_RV -proxy_C_SignUpdate (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_BYTE_PTR part, - CK_ULONG part_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_SignUpdate) (handle, part, part_len); -} - -static CK_RV -proxy_C_SignFinal (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_BYTE_PTR signature, - CK_ULONG_PTR signature_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_SignFinal) (handle, signature, signature_len); -} - -static CK_RV -proxy_C_SignRecoverInit (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_MECHANISM_PTR mechanism, - CK_OBJECT_HANDLE key) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_SignRecoverInit) (handle, mechanism, key); -} - -static CK_RV -proxy_C_SignRecover (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_BYTE_PTR input, - CK_ULONG input_len, - CK_BYTE_PTR signature, - CK_ULONG_PTR signature_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_SignRecover) (handle, input, input_len, signature, signature_len); -} - -static CK_RV -proxy_C_VerifyInit (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_MECHANISM_PTR mechanism, - CK_OBJECT_HANDLE key) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_VerifyInit) (handle, mechanism, key); -} - -static CK_RV -proxy_C_Verify (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_BYTE_PTR input, - CK_ULONG input_len, - CK_BYTE_PTR signature, - CK_ULONG signature_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_Verify) (handle, input, input_len, signature, signature_len); -} - -static CK_RV -proxy_C_VerifyUpdate (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_BYTE_PTR part, - CK_ULONG part_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_VerifyUpdate) (handle, part, part_len); -} - -static CK_RV -proxy_C_VerifyFinal (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_BYTE_PTR signature, - CK_ULONG signature_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_VerifyFinal) (handle, signature, signature_len); -} - -static CK_RV -proxy_C_VerifyRecoverInit (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_MECHANISM_PTR mechanism, - CK_OBJECT_HANDLE key) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_VerifyRecoverInit) (handle, mechanism, key); -} - -static CK_RV -proxy_C_VerifyRecover (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_BYTE_PTR signature, - CK_ULONG signature_len, - CK_BYTE_PTR output, - CK_ULONG_PTR output_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_VerifyRecover) (handle, signature, signature_len, output, output_len); -} - -static CK_RV -proxy_C_DigestEncryptUpdate (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_BYTE_PTR part, - CK_ULONG part_len, - CK_BYTE_PTR enc_part, - CK_ULONG_PTR enc_part_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_DigestEncryptUpdate) (handle, part, part_len, enc_part, enc_part_len); -} - -static CK_RV -proxy_C_DecryptDigestUpdate (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_BYTE_PTR enc_part, - CK_ULONG enc_part_len, - CK_BYTE_PTR part, - CK_ULONG_PTR part_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_DecryptDigestUpdate) (handle, enc_part, enc_part_len, part, part_len); -} - -static CK_RV -proxy_C_SignEncryptUpdate (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_BYTE_PTR part, - CK_ULONG part_len, - CK_BYTE_PTR enc_part, - CK_ULONG_PTR enc_part_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_SignEncryptUpdate) (handle, part, part_len, enc_part, enc_part_len); -} - -static CK_RV -proxy_C_DecryptVerifyUpdate (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_BYTE_PTR enc_part, - CK_ULONG enc_part_len, - CK_BYTE_PTR part, - CK_ULONG_PTR part_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_DecryptVerifyUpdate) (handle, enc_part, enc_part_len, part, part_len); -} - -static CK_RV -proxy_C_GenerateKey (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_MECHANISM_PTR mechanism, - CK_ATTRIBUTE_PTR template, - CK_ULONG count, - CK_OBJECT_HANDLE_PTR key) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_GenerateKey) (handle, mechanism, template, count, key); -} - -static CK_RV -proxy_C_GenerateKeyPair (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_MECHANISM_PTR mechanism, - CK_ATTRIBUTE_PTR pub_template, - CK_ULONG pub_count, - CK_ATTRIBUTE_PTR priv_template, - CK_ULONG priv_count, - CK_OBJECT_HANDLE_PTR pub_key, - CK_OBJECT_HANDLE_PTR priv_key) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_GenerateKeyPair) (handle, mechanism, pub_template, pub_count, priv_template, priv_count, pub_key, priv_key); -} - -static CK_RV -proxy_C_WrapKey (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_MECHANISM_PTR mechanism, - CK_OBJECT_HANDLE wrapping_key, - CK_OBJECT_HANDLE key, - CK_BYTE_PTR wrapped_key, - CK_ULONG_PTR wrapped_key_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_WrapKey) (handle, mechanism, wrapping_key, key, wrapped_key, wrapped_key_len); -} - -static CK_RV -proxy_C_UnwrapKey (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_MECHANISM_PTR mechanism, - CK_OBJECT_HANDLE unwrapping_key, - CK_BYTE_PTR wrapped_key, - CK_ULONG wrapped_key_len, - CK_ATTRIBUTE_PTR template, - CK_ULONG count, - CK_OBJECT_HANDLE_PTR key) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_UnwrapKey) (handle, mechanism, unwrapping_key, wrapped_key, wrapped_key_len, template, count, key); -} - -static CK_RV -proxy_C_DeriveKey (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_MECHANISM_PTR mechanism, - CK_OBJECT_HANDLE base_key, - CK_ATTRIBUTE_PTR template, - CK_ULONG count, - CK_OBJECT_HANDLE_PTR key) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_DeriveKey) (handle, mechanism, base_key, template, count, key); -} - -static CK_RV -proxy_C_SeedRandom (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_BYTE_PTR seed, - CK_ULONG seed_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_SeedRandom) (handle, seed, seed_len); -} - -static CK_RV -proxy_C_GenerateRandom (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE handle, - CK_BYTE_PTR random_data, - CK_ULONG random_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &handle, &map, NULL); - if (rv != CKR_OK) - return rv; - return (map.funcs->C_GenerateRandom) (handle, random_data, random_len); -} - -static CK_RV -proxy_C_LoginUser (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE session, - CK_USER_TYPE user_type, - CK_UTF8CHAR_PTR pin, - CK_ULONG pin_len, - CK_UTF8CHAR_PTR username, - CK_ULONG username_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &session, &map, NULL); - if (rv != CKR_OK) - return rv; - if (map.funcs->version.major < 3) - return CKR_FUNCTION_NOT_SUPPORTED; - return (((CK_FUNCTION_LIST_3_0_PTR)map.funcs)->C_LoginUser) (session, user_type, pin, - pin_len, username, username_len); -} - -static CK_RV -proxy_C_SessionCancel (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE session, - CK_FLAGS flags) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &session, &map, NULL); - if (rv != CKR_OK) - return rv; - if (map.funcs->version.major < 3) - return CKR_FUNCTION_NOT_SUPPORTED; - return (((CK_FUNCTION_LIST_3_0_PTR)map.funcs)->C_SessionCancel) (session, flags); -} - -static CK_RV -proxy_C_MessageEncryptInit (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE session, - CK_MECHANISM_PTR mechanism, - CK_OBJECT_HANDLE key) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &session, &map, NULL); - if (rv != CKR_OK) - return rv; - if (map.funcs->version.major < 3) - return CKR_FUNCTION_NOT_SUPPORTED; - return (((CK_FUNCTION_LIST_3_0_PTR)map.funcs)->C_MessageEncryptInit) (session, mechanism, key); -} - -static CK_RV -proxy_C_EncryptMessage (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE session, - CK_VOID_PTR parameter, - CK_ULONG parameter_len, - CK_BYTE_PTR associated_data, - CK_ULONG associated_data_len, - CK_BYTE_PTR plaintext, - CK_ULONG plaintext_len, - CK_BYTE_PTR ciphertext, - CK_ULONG_PTR ciphertext_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &session, &map, NULL); - if (rv != CKR_OK) - return rv; - if (map.funcs->version.major < 3) - return CKR_FUNCTION_NOT_SUPPORTED; - return (((CK_FUNCTION_LIST_3_0_PTR)map.funcs)->C_EncryptMessage) (session, parameter, - parameter_len, - associated_data, - associated_data_len, - plaintext, plaintext_len, - ciphertext, ciphertext_len); -} - -static CK_RV -proxy_C_EncryptMessageBegin (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE session, - CK_VOID_PTR parameter, - CK_ULONG parameter_len, - CK_BYTE_PTR associated_data, - CK_ULONG associated_data_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &session, &map, NULL); - if (rv != CKR_OK) - return rv; - if (map.funcs->version.major < 3) - return CKR_FUNCTION_NOT_SUPPORTED; - return (((CK_FUNCTION_LIST_3_0_PTR)map.funcs)->C_EncryptMessageBegin) (session, parameter, - parameter_len, - associated_data, - associated_data_len); -} - -static CK_RV -proxy_C_EncryptMessageNext (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE session, - CK_VOID_PTR parameter, - CK_ULONG parameter_len, - CK_BYTE_PTR plaintext_part, - CK_ULONG plaintext_part_len, - CK_BYTE_PTR ciphertext_part, - CK_ULONG_PTR ciphertext_part_len, - CK_FLAGS flags) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &session, &map, NULL); - if (rv != CKR_OK) - return rv; - if (map.funcs->version.major < 3) - return CKR_FUNCTION_NOT_SUPPORTED; - return (((CK_FUNCTION_LIST_3_0_PTR)map.funcs)->C_EncryptMessageNext) (session, parameter, - parameter_len, - plaintext_part, - plaintext_part_len, - ciphertext_part, - ciphertext_part_len, - flags); -} - -static CK_RV -proxy_C_MessageEncryptFinal (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE session) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &session, &map, NULL); - if (rv != CKR_OK) - return rv; - if (map.funcs->version.major < 3) - return CKR_FUNCTION_NOT_SUPPORTED; - return (((CK_FUNCTION_LIST_3_0_PTR)map.funcs)->C_MessageEncryptFinal) (session); -} - -static CK_RV -proxy_C_MessageDecryptInit (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE session, - CK_MECHANISM_PTR mechanism, - CK_OBJECT_HANDLE key) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &session, &map, NULL); - if (rv != CKR_OK) - return rv; - if (map.funcs->version.major < 3) - return CKR_FUNCTION_NOT_SUPPORTED; - return (((CK_FUNCTION_LIST_3_0_PTR)map.funcs)->C_MessageDecryptInit) (session, mechanism, key); -} - -static CK_RV -proxy_C_DecryptMessage (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE session, - CK_VOID_PTR parameter, - CK_ULONG parameter_len, - CK_BYTE_PTR associated_data, - CK_ULONG associated_data_len, - CK_BYTE_PTR ciphertext, - CK_ULONG ciphertext_len, - CK_BYTE_PTR plaintext, - CK_ULONG_PTR plaintext_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &session, &map, NULL); - if (rv != CKR_OK) - return rv; - if (map.funcs->version.major < 3) - return CKR_FUNCTION_NOT_SUPPORTED; - return (((CK_FUNCTION_LIST_3_0_PTR)map.funcs)->C_DecryptMessage) (session, parameter, - parameter_len, - associated_data, - associated_data_len, - ciphertext, ciphertext_len, - plaintext, plaintext_len); -} - -static CK_RV -proxy_C_DecryptMessageBegin (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE session, - CK_VOID_PTR parameter, - CK_ULONG parameter_len, - CK_BYTE_PTR associated_data, - CK_ULONG associated_data_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &session, &map, NULL); - if (rv != CKR_OK) - return rv; - if (map.funcs->version.major < 3) - return CKR_FUNCTION_NOT_SUPPORTED; - return (((CK_FUNCTION_LIST_3_0_PTR)map.funcs)->C_DecryptMessageBegin) (session, parameter, - parameter_len, - associated_data, - associated_data_len); -} - -static CK_RV -proxy_C_DecryptMessageNext (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE session, - CK_VOID_PTR parameter, - CK_ULONG parameter_len, - CK_BYTE_PTR ciphertext_part, - CK_ULONG ciphertext_part_len, - CK_BYTE_PTR plaintext_part, - CK_ULONG_PTR plaintext_part_len, - CK_FLAGS flags) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &session, &map, NULL); - if (rv != CKR_OK) - return rv; - if (map.funcs->version.major < 3) - return CKR_FUNCTION_NOT_SUPPORTED; - return (((CK_FUNCTION_LIST_3_0_PTR)map.funcs)->C_DecryptMessageNext) (session, parameter, - parameter_len, - ciphertext_part, - ciphertext_part_len, - plaintext_part, - plaintext_part_len, - flags); -} - -static CK_RV -proxy_C_MessageDecryptFinal (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE session) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &session, &map, NULL); - if (rv != CKR_OK) - return rv; - if (map.funcs->version.major < 3) - return CKR_FUNCTION_NOT_SUPPORTED; - return (((CK_FUNCTION_LIST_3_0_PTR)map.funcs)->C_MessageDecryptFinal) (session); -} - -static CK_RV -proxy_C_MessageSignInit (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE session, - CK_MECHANISM_PTR mechanism, - CK_OBJECT_HANDLE key) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &session, &map, NULL); - if (rv != CKR_OK) - return rv; - if (map.funcs->version.major < 3) - return CKR_FUNCTION_NOT_SUPPORTED; - return (((CK_FUNCTION_LIST_3_0_PTR)map.funcs)->C_MessageSignInit) (session, mechanism, key); -} - -static CK_RV -proxy_C_SignMessage (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE session, - CK_VOID_PTR parameter, - CK_ULONG parameter_len, - CK_BYTE_PTR data, - CK_ULONG data_len, - CK_BYTE_PTR signature, - CK_ULONG_PTR signature_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &session, &map, NULL); - if (rv != CKR_OK) - return rv; - if (map.funcs->version.major < 3) - return CKR_FUNCTION_NOT_SUPPORTED; - return (((CK_FUNCTION_LIST_3_0_PTR)map.funcs)->C_SignMessage) (session, parameter, - parameter_len, data, data_len, - signature, signature_len); -} - -static CK_RV -proxy_C_SignMessageBegin (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE session, - CK_VOID_PTR parameter, - CK_ULONG parameter_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &session, &map, NULL); - if (rv != CKR_OK) - return rv; - if (map.funcs->version.major < 3) - return CKR_FUNCTION_NOT_SUPPORTED; - return (((CK_FUNCTION_LIST_3_0_PTR)map.funcs)->C_SignMessageBegin) (session, parameter, - parameter_len); -} - -static CK_RV -proxy_C_SignMessageNext (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE session, - CK_VOID_PTR parameter, - CK_ULONG parameter_len, - CK_BYTE_PTR data, - CK_ULONG data_len, - CK_BYTE_PTR signature, - CK_ULONG_PTR signature_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &session, &map, NULL); - if (rv != CKR_OK) - return rv; - if (map.funcs->version.major < 3) - return CKR_FUNCTION_NOT_SUPPORTED; - return (((CK_FUNCTION_LIST_3_0_PTR)map.funcs)->C_SignMessageNext) (session, parameter, - parameter_len, data, - data_len, signature, - signature_len); -} - -static CK_RV -proxy_C_MessageSignFinal (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE session) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &session, &map, NULL); - if (rv != CKR_OK) - return rv; - if (map.funcs->version.major < 3) - return CKR_FUNCTION_NOT_SUPPORTED; - return (((CK_FUNCTION_LIST_3_0_PTR)map.funcs)->C_MessageSignFinal) (session); -} - -static CK_RV -proxy_C_MessageVerifyInit (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE session, - CK_MECHANISM_PTR mechanism, - CK_OBJECT_HANDLE key) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &session, &map, NULL); - if (rv != CKR_OK) - return rv; - if (map.funcs->version.major < 3) - return CKR_FUNCTION_NOT_SUPPORTED; - return (((CK_FUNCTION_LIST_3_0_PTR)map.funcs)->C_MessageVerifyInit) (session, mechanism, key); -} - -static CK_RV -proxy_C_VerifyMessage (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE session, - CK_VOID_PTR parameter, - CK_ULONG parameter_len, - CK_BYTE_PTR data, - CK_ULONG data_len, - CK_BYTE_PTR signature, - CK_ULONG signature_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &session, &map, NULL); - if (rv != CKR_OK) - return rv; - if (map.funcs->version.major < 3) - return CKR_FUNCTION_NOT_SUPPORTED; - return (((CK_FUNCTION_LIST_3_0_PTR)map.funcs)->C_VerifyMessage) (session, parameter, - parameter_len, data, - data_len, signature, - signature_len); -} - -static CK_RV -proxy_C_VerifyMessageBegin (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE session, - CK_VOID_PTR parameter, - CK_ULONG parameter_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &session, &map, NULL); - if (rv != CKR_OK) - return rv; - if (map.funcs->version.major < 3) - return CKR_FUNCTION_NOT_SUPPORTED; - return (((CK_FUNCTION_LIST_3_0_PTR)map.funcs)->C_VerifyMessageBegin) (session, parameter, - parameter_len); -} - -static CK_RV -proxy_C_VerifyMessageNext (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE session, - CK_VOID_PTR parameter, - CK_ULONG parameter_len, - CK_BYTE_PTR data, - CK_ULONG data_len, - CK_BYTE_PTR signature, - CK_ULONG signature_len) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &session, &map, NULL); - if (rv != CKR_OK) - return rv; - if (map.funcs->version.major < 3) - return CKR_FUNCTION_NOT_SUPPORTED; - return (((CK_FUNCTION_LIST_3_0_PTR)map.funcs)->C_VerifyMessageNext) (session, parameter, - parameter_len, data, - data_len, signature, - signature_len); -} - -static CK_RV -proxy_C_MessageVerifyFinal (CK_X_FUNCTION_LIST *self, - CK_SESSION_HANDLE session) -{ - State *state = (State *)self; - Mapping map; - CK_RV rv; - - rv = map_session_to_real (state->px, &session, &map, NULL); - if (rv != CKR_OK) - return rv; - if (map.funcs->version.major < 3) - return CKR_FUNCTION_NOT_SUPPORTED; - return (((CK_FUNCTION_LIST_3_0_PTR)map.funcs)->C_MessageVerifyFinal) (session); -} - -/* -------------------------------------------------------------------- - * MODULE ENTRY POINT - */ - -static CK_X_FUNCTION_LIST proxy_functions = { - { CRYPTOKI_VERSION_MAJOR, CRYPTOKI_VERSION_MINOR }, - proxy_C_Initialize, - proxy_C_Finalize, - proxy_C_GetInfo, - proxy_C_GetSlotList, - proxy_C_GetSlotInfo, - proxy_C_GetTokenInfo, - proxy_C_GetMechanismList, - proxy_C_GetMechanismInfo, - proxy_C_InitToken, - proxy_C_InitPIN, - proxy_C_SetPIN, - proxy_C_OpenSession, - proxy_C_CloseSession, - proxy_C_CloseAllSessions, - proxy_C_GetSessionInfo, - proxy_C_GetOperationState, - proxy_C_SetOperationState, - proxy_C_Login, - proxy_C_Logout, - proxy_C_CreateObject, - proxy_C_CopyObject, - proxy_C_DestroyObject, - proxy_C_GetObjectSize, - proxy_C_GetAttributeValue, - proxy_C_SetAttributeValue, - proxy_C_FindObjectsInit, - proxy_C_FindObjects, - proxy_C_FindObjectsFinal, - proxy_C_EncryptInit, - proxy_C_Encrypt, - proxy_C_EncryptUpdate, - proxy_C_EncryptFinal, - proxy_C_DecryptInit, - proxy_C_Decrypt, - proxy_C_DecryptUpdate, - proxy_C_DecryptFinal, - proxy_C_DigestInit, - proxy_C_Digest, - proxy_C_DigestUpdate, - proxy_C_DigestKey, - proxy_C_DigestFinal, - proxy_C_SignInit, - proxy_C_Sign, - proxy_C_SignUpdate, - proxy_C_SignFinal, - proxy_C_SignRecoverInit, - proxy_C_SignRecover, - proxy_C_VerifyInit, - proxy_C_Verify, - proxy_C_VerifyUpdate, - proxy_C_VerifyFinal, - proxy_C_VerifyRecoverInit, - proxy_C_VerifyRecover, - proxy_C_DigestEncryptUpdate, - proxy_C_DecryptDigestUpdate, - proxy_C_SignEncryptUpdate, - proxy_C_DecryptVerifyUpdate, - proxy_C_GenerateKey, - proxy_C_GenerateKeyPair, - proxy_C_WrapKey, - proxy_C_UnwrapKey, - proxy_C_DeriveKey, - proxy_C_SeedRandom, - proxy_C_GenerateRandom, - proxy_C_WaitForSlotEvent, - /* PKCS #11 3.0 */ - proxy_C_LoginUser, - proxy_C_SessionCancel, - proxy_C_MessageEncryptInit, - proxy_C_EncryptMessage, - proxy_C_EncryptMessageBegin, - proxy_C_EncryptMessageNext, - proxy_C_MessageEncryptFinal, - proxy_C_MessageDecryptInit, - proxy_C_DecryptMessage, - proxy_C_DecryptMessageBegin, - proxy_C_DecryptMessageNext, - proxy_C_MessageDecryptFinal, - proxy_C_MessageSignInit, - proxy_C_SignMessage, - proxy_C_SignMessageBegin, - proxy_C_SignMessageNext, - proxy_C_MessageSignFinal, - proxy_C_MessageVerifyInit, - proxy_C_VerifyMessage, - proxy_C_VerifyMessageBegin, - proxy_C_VerifyMessageNext, - proxy_C_MessageVerifyFinal -}; +#include "p11-kit/proxy-generated.h" static const char p11_interface_name[] = "PKCS 11"; diff --git a/p11-kit/templates/proxy-excludes.list b/p11-kit/templates/proxy-excludes.list new file mode 100644 index 00000000..65369162 --- /dev/null +++ b/p11-kit/templates/proxy-excludes.list @@ -0,0 +1,14 @@ +C_CancelFunction +C_CloseAllSessions +C_CloseSession +C_Finalize +C_GetFunctionList +C_GetFunctionStatus +C_GetInfo +C_GetInterface +C_GetInterfaceList +C_GetSessionInfo +C_GetSlotList +C_Initialize +C_OpenSession +C_WaitForSlotEvent diff --git a/p11-kit/templates/proxy-wrappers.py b/p11-kit/templates/proxy-wrappers.py new file mode 100644 index 00000000..90d943a4 --- /dev/null +++ b/p11-kit/templates/proxy-wrappers.py @@ -0,0 +1,100 @@ +{ + "function_name": "proxy_{function}", + "function_argument": "{argument_type} {argument_name}", + "call_lower": "return map.funcs->{function}", + "call_lower_v3": "return ((CK_FUNCTION_LIST_3_0_PTR)map.funcs)->{function}", + "call_lower_argument": "{argument_name}", + "function_body_with_slot": """\ +static CK_RV +{function_name} (CK_X_FUNCTION_LIST *self, +{arglist_indent}{arglist}) +{{ +{indent}State *state = (State *)self; +{indent}Mapping map; +{indent}CK_RV rv; + +{indent}rv = map_slot_to_real (state->px, &slotID, &map); +{indent}if (rv != CKR_OK) +{indent}{indent}return rv; +{indent}if (map.funcs->version.major < 3) +{indent}{indent}return CKR_FUNCTION_NOT_SUPPORTED; +{indent}{call_lower} ({call_lower_arglist}); +}} + """, + "function_body_with_slot_v3": """\ +static CK_RV +{function_name} (CK_X_FUNCTION_LIST *self, +{arglist_indent}{arglist}) +{{ +{indent}State *state = (State *)self; +{indent}Mapping map; +{indent}CK_RV rv; + +{indent}rv = map_slot_to_real (state->px, &slotID, &map); +{indent}if (rv != CKR_OK) +{indent}{indent}return rv; +{indent}{call_lower} ({call_lower_arglist}); +}} + """, + "function_body_with_session_v3": """\ +static CK_RV +{function_name} (CK_X_FUNCTION_LIST *self, +{arglist_indent}{arglist}) +{{ +{indent}State *state = (State *)self; +{indent}Mapping map; +{indent}CK_RV rv; + +{indent}rv = map_session_to_real (state->px, &session, &map, NULL); +{indent}if (rv != CKR_OK) +{indent}{indent}return rv; +{indent}if (map.funcs->version.major < 3) +{indent}{indent}return CKR_FUNCTION_NOT_SUPPORTED; +{indent}{call_lower} ({call_lower_arglist}); +}} + """, + "function_body_with_session": """\ +static CK_RV +{function_name} (CK_X_FUNCTION_LIST *self, +{arglist_indent}{arglist}) +{{ +{indent}State *state = (State *)self; +{indent}Mapping map; +{indent}CK_RV rv; + +{indent}rv = map_session_to_real (state->px, &session, &map, NULL); +{indent}if (rv != CKR_OK) +{indent}{indent}return rv; +{indent}{call_lower} ({call_lower_arglist}); +}} + """, + "function_body_with_session_v3": """\ +static CK_RV +{function_name} (CK_X_FUNCTION_LIST *self, +{arglist_indent}{arglist}) +{{ +{indent}State *state = (State *)self; +{indent}Mapping map; +{indent}CK_RV rv; + +{indent}rv = map_session_to_real (state->px, &session, &map, NULL); +{indent}if (rv != CKR_OK) +{indent}{indent}return rv; +{indent}if (map.funcs->version.major < 3) +{indent}{indent}return CKR_FUNCTION_NOT_SUPPORTED; +{indent}{call_lower} ({call_lower_arglist}); +}} + """, + "entry_argument": "", # unused + "entry": "{function_name}", + "outer": """ +/* DO NOT EDIT! GENERATED AUTOMATICALLY! */ + +{wrappers} + +CK_X_FUNCTION_LIST proxy_functions = {{ +{indent}{{ CRYPTOKI_VERSION_MAJOR, CRYPTOKI_VERSION_MINOR }}, /* version */ +{xentries} +}}; +""" +}