Merge pull request #276 from gilles-peskine-arm/psasim-generate-wrappers-dynamically

psasim: generate wrappers dynamically
diff --git a/psasim/.gitignore b/psasim/.gitignore
index 4065abf..2e29941 100644
--- a/psasim/.gitignore
+++ b/psasim/.gitignore
@@ -1,12 +1,20 @@
-bin/*
-*.o
+# Intermediate generated files
+/include/psa_manifest/manifest.h
+/include/psa_manifest/pid.h
+/include/psa_manifest/sid.h
+/src/psa_functions_codes.h
+/src/psa_sim_crypto_client.c
+/src/psa_sim_crypto_server.c
+/src/psa_sim_serialise.c
+/src/psa_sim_serialise.h
+
+# Build products
+/test/psa_manifest/*
+/test/client
+/test/partition
 *.so
-test/psa_ff_bootstrap.c
-test/psa_manifest/*
-test/client
-test/partition
-cscope.out
-*.orig
+*psa_ff_bootstrap_*
+
+# Local files from editors and indexing tools
 *.swp
 *.DS_Store
-*psa_ff_bootstrap_*
diff --git a/psasim/Makefile b/psasim/Makefile
index 45fcbed..8bb9849 100644
--- a/psasim/Makefile
+++ b/psasim/Makefile
@@ -20,9 +20,22 @@
 COMMON_INCLUDE := -I./include -I$(MBEDTLS_PATH)/include \
 	$(TF_PSA_CRYPTO_LIBRARY_PUBLIC_INCLUDE)
 
-GENERATED_H_FILES =	include/psa_manifest/manifest.h \
-					include/psa_manifest/pid.h \
-					include/psa_manifest/sid.h
+GENERATED_MANIFEST_H_FILES = \
+	include/psa_manifest/manifest.h \
+	include/psa_manifest/pid.h \
+	include/psa_manifest/sid.h
+
+GENERATED_WRAPPER_H_FILES = \
+	src/psa_sim_serialise.h \
+	src/psa_functions_codes.h
+
+GENERATED_H_FILES = $(GENERATED_MANIFEST_H_FILES) $(GENERATED_WRAPPER_H_FILES)
+
+GENERATED_C_FILES = \
+	src/psa_sim_serialise.c \
+	src/psa_sim_crypto_client.c src/psa_sim_crypto_server.c
+
+PSASIM_GENERATED_FILES = $(GENERATED_H_FILES) $(PARTITION_SERVER_BOOTSTRAP) $(GENERATED_C_FILES)
 
 LIBPSACLIENT_SRC = src/psa_ff_client.c \
 		 		src/psa_sim_crypto_client.c \
@@ -45,6 +58,8 @@
 
 all:
 
+generated_files: $(PSASIM_GENERATED_FILES)
+
 test/seedfile:
 	dd if=/dev/urandom of=./test/seedfile bs=64 count=1
 
@@ -64,9 +79,20 @@
 test/psa_server: $(PSA_SERVER_SRC) $(GENERATED_H_FILES)
 	$(CC) $(COMMON_INCLUDE) $(CFLAGS) $(PSA_SERVER_SRC) $(SERVER_LIBS) $(LDFLAGS) -o $@
 
-$(PARTITION_SERVER_BOOTSTRAP) $(GENERATED_H_FILES): src/manifest.json src/server.c
+$(PARTITION_SERVER_BOOTSTRAP) $(GENERATED_MANIFEST_H_FILES): src/manifest.json src/server.c
 	tools/psa_autogen.py src/manifest.json
 
+src/psa_sim_serialise.h: src/psa_sim_serialise.pl
+	cd src && ./psa_sim_serialise.pl h >$(@F)
+
+src/psa_sim_serialise.c: src/psa_sim_serialise.pl
+	cd src && ./psa_sim_serialise.pl c >$(@F)
+
+src/psa_functions_codes.h src/psa_sim_crypto_client.c src/psa_sim_crypto_server.c: $(TF_PSA_CRYPTO_PATH)/include/psa/crypto.h
+src/psa_functions_codes.h src/psa_sim_crypto_client.c src/psa_sim_crypto_server.c: $(TF_PSA_CRYPTO_PATH)/include/psa/crypto_extra.h
+src/psa_functions_codes.h src/psa_sim_crypto_client.c src/psa_sim_crypto_server.c: src/psa_sim_generate.pl
+	cd $(TF_PSA_CRYPTO_PATH) && $(abspath src/psa_sim_generate.pl)
+
 # Build MbedTLS libraries (crypto, x509 and tls) and copy them locally to
 # build client/server applications.
 #
@@ -87,3 +113,6 @@
 	rm -rf client_libs server_libs
 	rm -f test/psa_service_* test/psa_notify_* test/*.log
 	rm -f test/seedfile
+
+neat: clean
+	rm -f $(PSASIM_GENERATED_FILES)
diff --git a/psasim/README.md b/psasim/README.md
index db49ae9..e148a2c 100644
--- a/psasim/README.md
+++ b/psasim/README.md
@@ -4,6 +4,7 @@
 In practical terms it means that this allow to build PSASIM with Mbed TLS sources and get 2 Linux applications, a client and a server, which are connected through Linux's shared memeory, and in which the client relies on the server to perform all PSA Crypto operations.
 
 The goal of PSASIM is _not_ to provide a ready-to-use solution for anyone looking to implement the pure crypto client structure (see [Limitations](#limitations) for details), but to provide an example of TF-PSA-Crypto RPC (Remote Procedure Call) implementation using Mbed TLS.
+
 ## Limitations
 
 In the current implementation:
@@ -13,30 +14,33 @@
 - Shared memory is the only communication medium allowed. Others can be implemented (ex: net sockets), but in terms of simulation speed shared memory proved to be the fastest.
 - Server is not secure at all: keys and operation structs are stored on the RAM, so they can easily be dumped.
 
-## Testing
+## Building
 
-Please refer to `tests/scripts/components-psasim.sh` for guidance on how to build & test PSASIM:
+### Build tooling
+
+Building PSASIM requires the following tools:
+
+* GNU make.
+* A C compiler.
+* Perl.
+* The JSON package for Perl (`cpain -i JSON` or `apt install libjson-perl`).
+
+### Build instructions
+
+The build instructions are in `framework/psasim/Makefile`, with the assistance of `scripts/crypto-common.make` in TF-PSA-Crypto. The main targets are:
+
+* `client_libs`: builds object files to be linked with a client. The client code is expected to include TF-PSA-Crypto with `MBEDTLS_PSA_CRYPTO_CLIENT` enabled and `MBEDTLS_PSA_CRYPTO_C` disabled, with no local cryptographic primitives.
+* `test/psa_server`: builds a server, including the crypto partition. This requires TF-PSA-Crypto compiled with the PSA core (`MBEDTLS_PSA_CRYPTO_C`) and cryptographic primitives.
+
+Note in particular that the client and the server require different builds of `libtfpsacrypto`, since they must have different configurations.
+
+Note that at the time of writing, building PSASIM only officially works from an Mbed TLS tree. It might not work from a standalone TF-PSA-Crypto tree.
+
+Some C files are generated from JSON data and from parsing TF-PSA-Crypto header files, using the scripts `src/psa_sim_generate.pl` and `src/psa_sim_serialise.pl`. They are not committed into version control, but rather generated during the build of the client or the server, according to the instructions in the makefile.
+
+### Testing
+
+Please refer to [`tests/scripts/components-psasim.sh` in Mbed TLS](https://github.com/Mbed-TLS/mbedtls/blob/development/tests/scripts/components-psasim.sh) and the `helper_psasim_xxx` auxiliary functions in [`framework/scripts/all-helpers.sh`](../scripts/all-helpers.sh) for guidance on how to build & test PSASIM:
 
 - `component_test_psasim()`: builds the server and a couple of test clients which are used to evaluate some basic PSA Crypto API commands.
 - `component_test_suite_with_psasim()`: builds the server and _all_ the usual test suites (those found under the `<mbedtls-root>/tests/suites/*` folder) which are used by the CI and runs them. A small subset of test suites (`test_suite_constant_time_hmac`,`test_suite_lmots`,`test_suite_lms`) are being skipped, for CI turnover time optimization. They can be run locally if required.
-
-## How to update automatically generated files
-
-A significant portion of the intermediate code of PSASIM is auto-generated using Perl. In particular:
-
-- `psa_sim_serialise.[c|h]`:
-    - Generated by `psa_sim_serialise.pl`.
-    - These files provide the serialisation/deserialisation support that is required to pass functions' parameters between client and server.
-- `psa_sim_crypto_[client|server].c` and `psa_functions_codes.h`:
-    - Generated by `psa_sim_generate.pl`.
-    - `psa_sim_crypto_[client|server].c` provide interfaces for PSA Crypto APIs on client and server sides, while `psa_functions_codes.h` simply enumerates all PSA Crypto APIs.
-
-These files need to be regenerated whenever some PSA Crypto API is added/deleted/modified. The procedure is as follows:
-
-- `psa_sim_serialise.[c|h]`:
-    - go to `<mbedtls-root>/tests/psa-client-server/psasim/src/`
-    - run `./psa_sim_serialise.pl h > psa_sim_serialise.h`
-    - run `./psa_sim_serialise.pl c > psa_sim_serialise.c`
-- `psa_sim_crypto_[client|server].c` and `psa_functions_codes.h`:
-    - go to Mbed TLS' root folder
-    - run `./tests/psa-client-server/psasim/src/psa_sim_generate.pl`
diff --git a/psasim/src/psa_functions_codes.h b/psasim/src/psa_functions_codes.h
deleted file mode 100644
index 74746b6..0000000
--- a/psasim/src/psa_functions_codes.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/* THIS FILE WAS AUTO-GENERATED BY psa_sim_generate.pl. DO NOT EDIT!! */
-
-/*
- *  Copyright The Mbed TLS Contributors
- *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
- */
-
-#ifndef _PSA_FUNCTIONS_CODES_H_
-#define  _PSA_FUNCTIONS_CODES_H_
-
-enum {
-    /* Start here to avoid overlap with PSA_IPC_CONNECT, PSA_IPC_DISCONNECT
-     * and VERSION_REQUEST */
-    PSA_CRYPTO_INIT = 100,
-    PSA_AEAD_ABORT,
-    PSA_AEAD_DECRYPT,
-    PSA_AEAD_DECRYPT_SETUP,
-    PSA_AEAD_ENCRYPT,
-    PSA_AEAD_ENCRYPT_SETUP,
-    PSA_AEAD_FINISH,
-    PSA_AEAD_GENERATE_NONCE,
-    PSA_AEAD_SET_LENGTHS,
-    PSA_AEAD_SET_NONCE,
-    PSA_AEAD_UPDATE,
-    PSA_AEAD_UPDATE_AD,
-    PSA_AEAD_VERIFY,
-    PSA_ASYMMETRIC_DECRYPT,
-    PSA_ASYMMETRIC_ENCRYPT,
-    PSA_CAN_DO_HASH,
-    PSA_CIPHER_ABORT,
-    PSA_CIPHER_DECRYPT,
-    PSA_CIPHER_DECRYPT_SETUP,
-    PSA_CIPHER_ENCRYPT,
-    PSA_CIPHER_ENCRYPT_SETUP,
-    PSA_CIPHER_FINISH,
-    PSA_CIPHER_GENERATE_IV,
-    PSA_CIPHER_SET_IV,
-    PSA_CIPHER_UPDATE,
-    PSA_COPY_KEY,
-    PSA_DESTROY_KEY,
-    PSA_EXPORT_KEY,
-    PSA_EXPORT_PUBLIC_KEY,
-    PSA_EXPORT_PUBLIC_KEY_IOP_ABORT,
-    PSA_EXPORT_PUBLIC_KEY_IOP_COMPLETE,
-    PSA_EXPORT_PUBLIC_KEY_IOP_GET_NUM_OPS,
-    PSA_EXPORT_PUBLIC_KEY_IOP_SETUP,
-    PSA_GENERATE_KEY,
-    PSA_GENERATE_KEY_CUSTOM,
-    PSA_GENERATE_KEY_IOP_ABORT,
-    PSA_GENERATE_KEY_IOP_COMPLETE,
-    PSA_GENERATE_KEY_IOP_GET_NUM_OPS,
-    PSA_GENERATE_KEY_IOP_SETUP,
-    PSA_GENERATE_RANDOM,
-    PSA_GET_KEY_ATTRIBUTES,
-    PSA_HASH_ABORT,
-    PSA_HASH_CLONE,
-    PSA_HASH_COMPARE,
-    PSA_HASH_COMPUTE,
-    PSA_HASH_FINISH,
-    PSA_HASH_SETUP,
-    PSA_HASH_UPDATE,
-    PSA_HASH_VERIFY,
-    PSA_IMPORT_KEY,
-    PSA_INTERRUPTIBLE_GET_MAX_OPS,
-    PSA_INTERRUPTIBLE_SET_MAX_OPS,
-    PSA_KEY_AGREEMENT,
-    PSA_KEY_AGREEMENT_IOP_ABORT,
-    PSA_KEY_AGREEMENT_IOP_COMPLETE,
-    PSA_KEY_AGREEMENT_IOP_GET_NUM_OPS,
-    PSA_KEY_AGREEMENT_IOP_SETUP,
-    PSA_KEY_DERIVATION_ABORT,
-    PSA_KEY_DERIVATION_GET_CAPACITY,
-    PSA_KEY_DERIVATION_INPUT_BYTES,
-    PSA_KEY_DERIVATION_INPUT_INTEGER,
-    PSA_KEY_DERIVATION_INPUT_KEY,
-    PSA_KEY_DERIVATION_KEY_AGREEMENT,
-    PSA_KEY_DERIVATION_OUTPUT_BYTES,
-    PSA_KEY_DERIVATION_OUTPUT_KEY,
-    PSA_KEY_DERIVATION_OUTPUT_KEY_CUSTOM,
-    PSA_KEY_DERIVATION_SET_CAPACITY,
-    PSA_KEY_DERIVATION_SETUP,
-    PSA_MAC_ABORT,
-    PSA_MAC_COMPUTE,
-    PSA_MAC_SIGN_FINISH,
-    PSA_MAC_SIGN_SETUP,
-    PSA_MAC_UPDATE,
-    PSA_MAC_VERIFY,
-    PSA_MAC_VERIFY_FINISH,
-    PSA_MAC_VERIFY_SETUP,
-    PSA_PURGE_KEY,
-    PSA_RAW_KEY_AGREEMENT,
-    PSA_RESET_KEY_ATTRIBUTES,
-    PSA_SIGN_HASH,
-    PSA_SIGN_HASH_ABORT,
-    PSA_SIGN_HASH_COMPLETE,
-    PSA_SIGN_HASH_GET_NUM_OPS,
-    PSA_SIGN_HASH_START,
-    PSA_SIGN_MESSAGE,
-    PSA_VERIFY_HASH,
-    PSA_VERIFY_HASH_ABORT,
-    PSA_VERIFY_HASH_COMPLETE,
-    PSA_VERIFY_HASH_GET_NUM_OPS,
-    PSA_VERIFY_HASH_START,
-    PSA_VERIFY_MESSAGE,
-};
-
-#endif /*  _PSA_FUNCTIONS_CODES_H_ */
diff --git a/psasim/src/psa_sim_crypto_client.c b/psasim/src/psa_sim_crypto_client.c
deleted file mode 100644
index 9051f20..0000000
--- a/psasim/src/psa_sim_crypto_client.c
+++ /dev/null
@@ -1,7906 +0,0 @@
-/* THIS FILE WAS AUTO-GENERATED BY psa_sim_generate.pl. DO NOT EDIT!! */
-
-/* client calls */
-
-/*
- *  Copyright The Mbed TLS Contributors
- *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
- */
-
-#include <stdio.h>
-#include <unistd.h>
-
-/* Includes from psasim */
-#include <client.h>
-#include <util.h>
-#include "psa_manifest/sid.h"
-#include "psa_functions_codes.h"
-#include "psa_sim_serialise.h"
-
-/* Includes from mbedtls */
-#include "mbedtls/version.h"
-#include "psa/crypto.h"
-
-#define CLIENT_PRINT(fmt, ...) \
-    INFO("Client: " fmt, ##__VA_ARGS__)
-
-static psa_handle_t handle = -1;
-
-#if defined(MBEDTLS_PSA_CRYPTO_C)
-#error "Error: MBEDTLS_PSA_CRYPTO_C must be disabled on client build"
-#endif
-
-int psa_crypto_call(int function,
-                    uint8_t *in_params, size_t in_params_len,
-                    uint8_t **out_params, size_t *out_params_len)
-{
-    // psa_outvec outvecs[1];
-    if (handle < 0) {
-        fprintf(stderr, "NOT CONNECTED\n");
-        exit(1);
-    }
-
-    psa_invec invec;
-    invec.base = in_params;
-    invec.len = in_params_len;
-
-    size_t max_receive = 24576;
-    uint8_t *receive = malloc(max_receive);
-    if (receive == NULL) {
-        fprintf(stderr, "FAILED to allocate %u bytes\n", (unsigned) max_receive);
-        exit(1);
-    }
-
-    size_t actual_received = 0;
-
-    psa_outvec outvecs[2];
-    outvecs[0].base = &actual_received;
-    outvecs[0].len = sizeof(actual_received);
-    outvecs[1].base = receive;
-    outvecs[1].len = max_receive;
-
-    psa_status_t status = psa_call(handle, function, &invec, 1, outvecs, 2);
-    if (status != PSA_SUCCESS) {
-        free(receive);
-        return 0;
-    }
-
-    *out_params = receive;
-    *out_params_len = actual_received;
-
-    return 1;   // success
-}
-
-psa_status_t psa_crypto_init(void)
-{
-    const char *mbedtls_version;
-    uint8_t *result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    mbedtls_version = mbedtls_version_get_string_full();
-    CLIENT_PRINT("%s", mbedtls_version);
-
-    CLIENT_PRINT("My PID: %d", getpid());
-
-    CLIENT_PRINT("PSA version: %u", psa_version(PSA_SID_CRYPTO_SID));
-    handle = psa_connect(PSA_SID_CRYPTO_SID, 1);
-
-    if (handle < 0) {
-        CLIENT_PRINT("Couldn't connect %d", handle);
-        return PSA_ERROR_COMMUNICATION_FAILURE;
-    }
-
-    int ok = psa_crypto_call(PSA_CRYPTO_INIT, NULL, 0, &result, &result_length);
-    CLIENT_PRINT("PSA_CRYPTO_INIT returned: %d", ok);
-
-    if (!ok) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(&rpos, &rremain, &status);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(result);
-
-    return status;
-}
-
-void mbedtls_psa_crypto_free(void)
-{
-    /* Do not try to close a connection that was never started.*/
-    if (handle == -1) {
-        return;
-    }
-
-    CLIENT_PRINT("Closing handle");
-    psa_close(handle);
-    handle = -1;
-}
-
-
-psa_status_t psa_aead_abort(
-    psa_aead_operation_t *operation
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_aead_operation_t_needs(*operation);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_aead_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_AEAD_ABORT,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_AEAD_ABORT server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_aead_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_aead_decrypt(
-    mbedtls_svc_key_id_t key,
-    psa_algorithm_t alg,
-    const uint8_t *nonce, size_t  nonce_length,
-    const uint8_t *additional_data, size_t  additional_data_length,
-    const uint8_t *ciphertext, size_t  ciphertext_length,
-    uint8_t *plaintext, size_t  plaintext_size,
-    size_t *plaintext_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key) +
-        psasim_serialise_psa_algorithm_t_needs(alg) +
-        psasim_serialise_buffer_needs(nonce, nonce_length) +
-        psasim_serialise_buffer_needs(additional_data, additional_data_length) +
-        psasim_serialise_buffer_needs(ciphertext, ciphertext_length) +
-        psasim_serialise_buffer_needs(plaintext, plaintext_size) +
-        psasim_serialise_size_t_needs(*plaintext_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        nonce, nonce_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        additional_data, additional_data_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        ciphertext, ciphertext_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        plaintext, plaintext_size);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *plaintext_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_AEAD_DECRYPT,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_AEAD_DECRYPT server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        plaintext, plaintext_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        plaintext_length);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_aead_decrypt_setup(
-    psa_aead_operation_t *operation,
-    mbedtls_svc_key_id_t key,
-    psa_algorithm_t alg
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_aead_operation_t_needs(*operation) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key) +
-        psasim_serialise_psa_algorithm_t_needs(alg);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_aead_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_AEAD_DECRYPT_SETUP,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_AEAD_DECRYPT_SETUP server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_aead_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_aead_encrypt(
-    mbedtls_svc_key_id_t key,
-    psa_algorithm_t alg,
-    const uint8_t *nonce, size_t  nonce_length,
-    const uint8_t *additional_data, size_t  additional_data_length,
-    const uint8_t *plaintext, size_t  plaintext_length,
-    uint8_t *ciphertext, size_t  ciphertext_size,
-    size_t *ciphertext_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key) +
-        psasim_serialise_psa_algorithm_t_needs(alg) +
-        psasim_serialise_buffer_needs(nonce, nonce_length) +
-        psasim_serialise_buffer_needs(additional_data, additional_data_length) +
-        psasim_serialise_buffer_needs(plaintext, plaintext_length) +
-        psasim_serialise_buffer_needs(ciphertext, ciphertext_size) +
-        psasim_serialise_size_t_needs(*ciphertext_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        nonce, nonce_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        additional_data, additional_data_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        plaintext, plaintext_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        ciphertext, ciphertext_size);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *ciphertext_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_AEAD_ENCRYPT,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_AEAD_ENCRYPT server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        ciphertext, ciphertext_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        ciphertext_length);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_aead_encrypt_setup(
-    psa_aead_operation_t *operation,
-    mbedtls_svc_key_id_t key,
-    psa_algorithm_t alg
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_aead_operation_t_needs(*operation) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key) +
-        psasim_serialise_psa_algorithm_t_needs(alg);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_aead_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_AEAD_ENCRYPT_SETUP,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_AEAD_ENCRYPT_SETUP server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_aead_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_aead_finish(
-    psa_aead_operation_t *operation,
-    uint8_t *ciphertext, size_t  ciphertext_size,
-    size_t *ciphertext_length,
-    uint8_t *tag, size_t  tag_size,
-    size_t *tag_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_aead_operation_t_needs(*operation) +
-        psasim_serialise_buffer_needs(ciphertext, ciphertext_size) +
-        psasim_serialise_size_t_needs(*ciphertext_length) +
-        psasim_serialise_buffer_needs(tag, tag_size) +
-        psasim_serialise_size_t_needs(*tag_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_aead_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        ciphertext, ciphertext_size);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *ciphertext_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        tag, tag_size);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *tag_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_AEAD_FINISH,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_AEAD_FINISH server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_aead_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        ciphertext, ciphertext_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        ciphertext_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        tag, tag_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        tag_length);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_aead_generate_nonce(
-    psa_aead_operation_t *operation,
-    uint8_t *nonce, size_t  nonce_size,
-    size_t *nonce_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_aead_operation_t_needs(*operation) +
-        psasim_serialise_buffer_needs(nonce, nonce_size) +
-        psasim_serialise_size_t_needs(*nonce_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_aead_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        nonce, nonce_size);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *nonce_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_AEAD_GENERATE_NONCE,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_AEAD_GENERATE_NONCE server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_aead_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        nonce, nonce_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        nonce_length);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_aead_set_lengths(
-    psa_aead_operation_t *operation,
-    size_t ad_length,
-    size_t plaintext_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_aead_operation_t_needs(*operation) +
-        psasim_serialise_size_t_needs(ad_length) +
-        psasim_serialise_size_t_needs(plaintext_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_aead_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        ad_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        plaintext_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_AEAD_SET_LENGTHS,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_AEAD_SET_LENGTHS server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_aead_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_aead_set_nonce(
-    psa_aead_operation_t *operation,
-    const uint8_t *nonce, size_t  nonce_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_aead_operation_t_needs(*operation) +
-        psasim_serialise_buffer_needs(nonce, nonce_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_aead_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        nonce, nonce_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_AEAD_SET_NONCE,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_AEAD_SET_NONCE server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_aead_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_aead_update(
-    psa_aead_operation_t *operation,
-    const uint8_t *input, size_t  input_length,
-    uint8_t *output, size_t  output_size,
-    size_t *output_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_aead_operation_t_needs(*operation) +
-        psasim_serialise_buffer_needs(input, input_length) +
-        psasim_serialise_buffer_needs(output, output_size) +
-        psasim_serialise_size_t_needs(*output_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_aead_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        input, input_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_AEAD_UPDATE,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_AEAD_UPDATE server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_aead_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_aead_update_ad(
-    psa_aead_operation_t *operation,
-    const uint8_t *input, size_t  input_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_aead_operation_t_needs(*operation) +
-        psasim_serialise_buffer_needs(input, input_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_aead_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        input, input_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_AEAD_UPDATE_AD,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_AEAD_UPDATE_AD server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_aead_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_aead_verify(
-    psa_aead_operation_t *operation,
-    uint8_t *plaintext, size_t  plaintext_size,
-    size_t *plaintext_length,
-    const uint8_t *tag, size_t  tag_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_aead_operation_t_needs(*operation) +
-        psasim_serialise_buffer_needs(plaintext, plaintext_size) +
-        psasim_serialise_size_t_needs(*plaintext_length) +
-        psasim_serialise_buffer_needs(tag, tag_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_aead_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        plaintext, plaintext_size);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *plaintext_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        tag, tag_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_AEAD_VERIFY,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_AEAD_VERIFY server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_aead_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        plaintext, plaintext_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        plaintext_length);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_asymmetric_decrypt(
-    mbedtls_svc_key_id_t key,
-    psa_algorithm_t alg,
-    const uint8_t *input, size_t  input_length,
-    const uint8_t *salt, size_t  salt_length,
-    uint8_t *output, size_t  output_size,
-    size_t *output_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key) +
-        psasim_serialise_psa_algorithm_t_needs(alg) +
-        psasim_serialise_buffer_needs(input, input_length) +
-        psasim_serialise_buffer_needs(salt, salt_length) +
-        psasim_serialise_buffer_needs(output, output_size) +
-        psasim_serialise_size_t_needs(*output_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        input, input_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        salt, salt_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_ASYMMETRIC_DECRYPT,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_ASYMMETRIC_DECRYPT server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_asymmetric_encrypt(
-    mbedtls_svc_key_id_t key,
-    psa_algorithm_t alg,
-    const uint8_t *input, size_t  input_length,
-    const uint8_t *salt, size_t  salt_length,
-    uint8_t *output, size_t  output_size,
-    size_t *output_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key) +
-        psasim_serialise_psa_algorithm_t_needs(alg) +
-        psasim_serialise_buffer_needs(input, input_length) +
-        psasim_serialise_buffer_needs(salt, salt_length) +
-        psasim_serialise_buffer_needs(output, output_size) +
-        psasim_serialise_size_t_needs(*output_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        input, input_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        salt, salt_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_ASYMMETRIC_ENCRYPT,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_ASYMMETRIC_ENCRYPT server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-int psa_can_do_hash(
-    psa_algorithm_t hash_alg
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    int value = 0;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_algorithm_t_needs(hash_alg);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        hash_alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_CAN_DO_HASH,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_CAN_DO_HASH server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_int(
-        &rpos, &rremain,
-        &value);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return value;
-}
-
-
-psa_status_t psa_cipher_abort(
-    psa_cipher_operation_t *operation
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_cipher_operation_t_needs(*operation);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_cipher_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_CIPHER_ABORT,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_CIPHER_ABORT server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_cipher_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_cipher_decrypt(
-    mbedtls_svc_key_id_t key,
-    psa_algorithm_t alg,
-    const uint8_t *input, size_t  input_length,
-    uint8_t *output, size_t  output_size,
-    size_t *output_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key) +
-        psasim_serialise_psa_algorithm_t_needs(alg) +
-        psasim_serialise_buffer_needs(input, input_length) +
-        psasim_serialise_buffer_needs(output, output_size) +
-        psasim_serialise_size_t_needs(*output_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        input, input_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_CIPHER_DECRYPT,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_CIPHER_DECRYPT server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_cipher_decrypt_setup(
-    psa_cipher_operation_t *operation,
-    mbedtls_svc_key_id_t key,
-    psa_algorithm_t alg
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_cipher_operation_t_needs(*operation) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key) +
-        psasim_serialise_psa_algorithm_t_needs(alg);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_cipher_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_CIPHER_DECRYPT_SETUP,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_CIPHER_DECRYPT_SETUP server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_cipher_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_cipher_encrypt(
-    mbedtls_svc_key_id_t key,
-    psa_algorithm_t alg,
-    const uint8_t *input, size_t  input_length,
-    uint8_t *output, size_t  output_size,
-    size_t *output_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key) +
-        psasim_serialise_psa_algorithm_t_needs(alg) +
-        psasim_serialise_buffer_needs(input, input_length) +
-        psasim_serialise_buffer_needs(output, output_size) +
-        psasim_serialise_size_t_needs(*output_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        input, input_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_CIPHER_ENCRYPT,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_CIPHER_ENCRYPT server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_cipher_encrypt_setup(
-    psa_cipher_operation_t *operation,
-    mbedtls_svc_key_id_t key,
-    psa_algorithm_t alg
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_cipher_operation_t_needs(*operation) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key) +
-        psasim_serialise_psa_algorithm_t_needs(alg);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_cipher_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_CIPHER_ENCRYPT_SETUP,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_CIPHER_ENCRYPT_SETUP server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_cipher_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_cipher_finish(
-    psa_cipher_operation_t *operation,
-    uint8_t *output, size_t  output_size,
-    size_t *output_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_cipher_operation_t_needs(*operation) +
-        psasim_serialise_buffer_needs(output, output_size) +
-        psasim_serialise_size_t_needs(*output_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_cipher_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_CIPHER_FINISH,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_CIPHER_FINISH server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_cipher_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_cipher_generate_iv(
-    psa_cipher_operation_t *operation,
-    uint8_t *iv, size_t  iv_size,
-    size_t *iv_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_cipher_operation_t_needs(*operation) +
-        psasim_serialise_buffer_needs(iv, iv_size) +
-        psasim_serialise_size_t_needs(*iv_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_cipher_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        iv, iv_size);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *iv_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_CIPHER_GENERATE_IV,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_CIPHER_GENERATE_IV server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_cipher_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        iv, iv_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        iv_length);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_cipher_set_iv(
-    psa_cipher_operation_t *operation,
-    const uint8_t *iv, size_t  iv_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_cipher_operation_t_needs(*operation) +
-        psasim_serialise_buffer_needs(iv, iv_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_cipher_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        iv, iv_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_CIPHER_SET_IV,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_CIPHER_SET_IV server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_cipher_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_cipher_update(
-    psa_cipher_operation_t *operation,
-    const uint8_t *input, size_t  input_length,
-    uint8_t *output, size_t  output_size,
-    size_t *output_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_cipher_operation_t_needs(*operation) +
-        psasim_serialise_buffer_needs(input, input_length) +
-        psasim_serialise_buffer_needs(output, output_size) +
-        psasim_serialise_size_t_needs(*output_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_cipher_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        input, input_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_CIPHER_UPDATE,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_CIPHER_UPDATE server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_cipher_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_copy_key(
-    mbedtls_svc_key_id_t source_key,
-    const psa_key_attributes_t *attributes,
-    mbedtls_svc_key_id_t *target_key
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(source_key) +
-        psasim_serialise_psa_key_attributes_t_needs(*attributes) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(*target_key);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        source_key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_attributes_t(
-        &pos, &remaining,
-        *attributes);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        *target_key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_COPY_KEY,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_COPY_KEY server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &rpos, &rremain,
-        target_key);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_destroy_key(
-    mbedtls_svc_key_id_t key
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_DESTROY_KEY,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_DESTROY_KEY server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_export_key(
-    mbedtls_svc_key_id_t key,
-    uint8_t *data, size_t  data_size,
-    size_t *data_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key) +
-        psasim_serialise_buffer_needs(data, data_size) +
-        psasim_serialise_size_t_needs(*data_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        data, data_size);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *data_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_EXPORT_KEY,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_EXPORT_KEY server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        data, data_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        data_length);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_export_public_key(
-    mbedtls_svc_key_id_t key,
-    uint8_t *data, size_t  data_size,
-    size_t *data_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key) +
-        psasim_serialise_buffer_needs(data, data_size) +
-        psasim_serialise_size_t_needs(*data_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        data, data_size);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *data_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_EXPORT_PUBLIC_KEY,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_EXPORT_PUBLIC_KEY server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        data, data_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        data_length);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_export_public_key_iop_abort(
-    psa_export_public_key_iop_t *operation
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_export_public_key_iop_t_needs(*operation);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_export_public_key_iop_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_EXPORT_PUBLIC_KEY_IOP_ABORT,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_EXPORT_PUBLIC_KEY_IOP_ABORT server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_export_public_key_iop_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_export_public_key_iop_complete(
-    psa_export_public_key_iop_t *operation,
-    uint8_t *data, size_t  data_size,
-    size_t *data_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_export_public_key_iop_t_needs(*operation) +
-        psasim_serialise_buffer_needs(data, data_size) +
-        psasim_serialise_size_t_needs(*data_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_export_public_key_iop_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        data, data_size);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *data_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_EXPORT_PUBLIC_KEY_IOP_COMPLETE,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_EXPORT_PUBLIC_KEY_IOP_COMPLETE server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_export_public_key_iop_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        data, data_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        data_length);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-uint32_t psa_export_public_key_iop_get_num_ops(
-    psa_export_public_key_iop_t *operation
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    uint32_t value = 0;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_export_public_key_iop_t_needs(*operation);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        value = 0;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_export_public_key_iop_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_EXPORT_PUBLIC_KEY_IOP_GET_NUM_OPS,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_EXPORT_PUBLIC_KEY_IOP_GET_NUM_OPS server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_uint32_t(
-        &rpos, &rremain,
-        &value);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_export_public_key_iop_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return value;
-}
-
-
-psa_status_t psa_export_public_key_iop_setup(
-    psa_export_public_key_iop_t *operation,
-    mbedtls_svc_key_id_t key
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_export_public_key_iop_t_needs(*operation) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_export_public_key_iop_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_EXPORT_PUBLIC_KEY_IOP_SETUP,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_EXPORT_PUBLIC_KEY_IOP_SETUP server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_export_public_key_iop_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_generate_key(
-    const psa_key_attributes_t *attributes,
-    mbedtls_svc_key_id_t *key
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_key_attributes_t_needs(*attributes) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(*key);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_attributes_t(
-        &pos, &remaining,
-        *attributes);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        *key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_GENERATE_KEY,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_GENERATE_KEY server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &rpos, &rremain,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_generate_key_custom(
-    const psa_key_attributes_t *attributes,
-    const psa_custom_key_parameters_t *custom,
-    const uint8_t *custom_data, size_t  custom_data_length,
-    mbedtls_svc_key_id_t *key
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_key_attributes_t_needs(*attributes) +
-        psasim_serialise_psa_custom_key_parameters_t_needs(*custom) +
-        psasim_serialise_buffer_needs(custom_data, custom_data_length) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(*key);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_attributes_t(
-        &pos, &remaining,
-        *attributes);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_custom_key_parameters_t(
-        &pos, &remaining,
-        *custom);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        custom_data, custom_data_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        *key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_GENERATE_KEY_CUSTOM,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_GENERATE_KEY_CUSTOM server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &rpos, &rremain,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_generate_key_iop_abort(
-    psa_generate_key_iop_t *operation
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_generate_key_iop_t_needs(*operation);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_generate_key_iop_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_GENERATE_KEY_IOP_ABORT,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_GENERATE_KEY_IOP_ABORT server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_generate_key_iop_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_generate_key_iop_complete(
-    psa_generate_key_iop_t *operation,
-    mbedtls_svc_key_id_t *key
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_generate_key_iop_t_needs(*operation) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(*key);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_generate_key_iop_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        *key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_GENERATE_KEY_IOP_COMPLETE,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_GENERATE_KEY_IOP_COMPLETE server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_generate_key_iop_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &rpos, &rremain,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-uint32_t psa_generate_key_iop_get_num_ops(
-    psa_generate_key_iop_t *operation
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    uint32_t value = 0;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_generate_key_iop_t_needs(*operation);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        value = 0;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_generate_key_iop_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_GENERATE_KEY_IOP_GET_NUM_OPS,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_GENERATE_KEY_IOP_GET_NUM_OPS server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_uint32_t(
-        &rpos, &rremain,
-        &value);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_generate_key_iop_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return value;
-}
-
-
-psa_status_t psa_generate_key_iop_setup(
-    psa_generate_key_iop_t *operation,
-    const psa_key_attributes_t *attributes
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_generate_key_iop_t_needs(*operation) +
-        psasim_serialise_psa_key_attributes_t_needs(*attributes);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_generate_key_iop_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_attributes_t(
-        &pos, &remaining,
-        *attributes);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_GENERATE_KEY_IOP_SETUP,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_GENERATE_KEY_IOP_SETUP server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_generate_key_iop_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_generate_random(
-    uint8_t *output, size_t  output_size
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_buffer_needs(output, output_size);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_GENERATE_RANDOM,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_GENERATE_RANDOM server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_get_key_attributes(
-    mbedtls_svc_key_id_t key,
-    psa_key_attributes_t *attributes
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key) +
-        psasim_serialise_psa_key_attributes_t_needs(*attributes);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_attributes_t(
-        &pos, &remaining,
-        *attributes);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_GET_KEY_ATTRIBUTES,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_GET_KEY_ATTRIBUTES server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_attributes_t(
-        &rpos, &rremain,
-        attributes);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_hash_abort(
-    psa_hash_operation_t *operation
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_hash_operation_t_needs(*operation);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_hash_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_HASH_ABORT,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_HASH_ABORT server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_hash_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_hash_clone(
-    const psa_hash_operation_t *source_operation,
-    psa_hash_operation_t *target_operation
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_hash_operation_t_needs(*source_operation) +
-        psasim_serialise_psa_hash_operation_t_needs(*target_operation);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_hash_operation_t(
-        &pos, &remaining,
-        *source_operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_hash_operation_t(
-        &pos, &remaining,
-        *target_operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_HASH_CLONE,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_HASH_CLONE server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_hash_operation_t(
-        &rpos, &rremain,
-        target_operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_hash_compare(
-    psa_algorithm_t alg,
-    const uint8_t *input, size_t  input_length,
-    const uint8_t *hash, size_t  hash_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_algorithm_t_needs(alg) +
-        psasim_serialise_buffer_needs(input, input_length) +
-        psasim_serialise_buffer_needs(hash, hash_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        input, input_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        hash, hash_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_HASH_COMPARE,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_HASH_COMPARE server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_hash_compute(
-    psa_algorithm_t alg,
-    const uint8_t *input, size_t  input_length,
-    uint8_t *hash, size_t  hash_size,
-    size_t *hash_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_algorithm_t_needs(alg) +
-        psasim_serialise_buffer_needs(input, input_length) +
-        psasim_serialise_buffer_needs(hash, hash_size) +
-        psasim_serialise_size_t_needs(*hash_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        input, input_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        hash, hash_size);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *hash_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_HASH_COMPUTE,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_HASH_COMPUTE server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        hash, hash_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        hash_length);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_hash_finish(
-    psa_hash_operation_t *operation,
-    uint8_t *hash, size_t  hash_size,
-    size_t *hash_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_hash_operation_t_needs(*operation) +
-        psasim_serialise_buffer_needs(hash, hash_size) +
-        psasim_serialise_size_t_needs(*hash_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_hash_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        hash, hash_size);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *hash_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_HASH_FINISH,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_HASH_FINISH server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_hash_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        hash, hash_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        hash_length);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_hash_setup(
-    psa_hash_operation_t *operation,
-    psa_algorithm_t alg
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_hash_operation_t_needs(*operation) +
-        psasim_serialise_psa_algorithm_t_needs(alg);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_hash_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_HASH_SETUP,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_HASH_SETUP server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_hash_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_hash_update(
-    psa_hash_operation_t *operation,
-    const uint8_t *input, size_t  input_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_hash_operation_t_needs(*operation) +
-        psasim_serialise_buffer_needs(input, input_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_hash_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        input, input_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_HASH_UPDATE,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_HASH_UPDATE server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_hash_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_hash_verify(
-    psa_hash_operation_t *operation,
-    const uint8_t *hash, size_t  hash_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_hash_operation_t_needs(*operation) +
-        psasim_serialise_buffer_needs(hash, hash_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_hash_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        hash, hash_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_HASH_VERIFY,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_HASH_VERIFY server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_hash_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_import_key(
-    const psa_key_attributes_t *attributes,
-    const uint8_t *data, size_t  data_length,
-    mbedtls_svc_key_id_t *key
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_key_attributes_t_needs(*attributes) +
-        psasim_serialise_buffer_needs(data, data_length) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(*key);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_attributes_t(
-        &pos, &remaining,
-        *attributes);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        data, data_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        *key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_IMPORT_KEY,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_IMPORT_KEY server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &rpos, &rremain,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-uint32_t psa_interruptible_get_max_ops(
-    void
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    uint32_t value = 0;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        0;
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        value = 0;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_INTERRUPTIBLE_GET_MAX_OPS,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_INTERRUPTIBLE_GET_MAX_OPS server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_uint32_t(
-        &rpos, &rremain,
-        &value);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return value;
-}
-
-
-void psa_interruptible_set_max_ops(
-    uint32_t max_ops
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_uint32_t_needs(max_ops);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_uint32_t(
-        &pos, &remaining,
-        max_ops);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_INTERRUPTIBLE_SET_MAX_OPS,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_INTERRUPTIBLE_SET_MAX_OPS server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-}
-
-
-psa_status_t psa_key_agreement(
-    mbedtls_svc_key_id_t private_key,
-    const uint8_t *peer_key, size_t  peer_key_length,
-    psa_algorithm_t alg,
-    const psa_key_attributes_t *attributes,
-    mbedtls_svc_key_id_t *key
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(private_key) +
-        psasim_serialise_buffer_needs(peer_key, peer_key_length) +
-        psasim_serialise_psa_algorithm_t_needs(alg) +
-        psasim_serialise_psa_key_attributes_t_needs(*attributes) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(*key);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        private_key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        peer_key, peer_key_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_attributes_t(
-        &pos, &remaining,
-        *attributes);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        *key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_KEY_AGREEMENT,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_KEY_AGREEMENT server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &rpos, &rremain,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_key_agreement_iop_abort(
-    psa_key_agreement_iop_t *operation
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_key_agreement_iop_t_needs(*operation);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_agreement_iop_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_KEY_AGREEMENT_IOP_ABORT,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_KEY_AGREEMENT_IOP_ABORT server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_agreement_iop_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_key_agreement_iop_complete(
-    psa_key_agreement_iop_t *operation,
-    mbedtls_svc_key_id_t *key
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_key_agreement_iop_t_needs(*operation) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(*key);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_agreement_iop_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        *key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_KEY_AGREEMENT_IOP_COMPLETE,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_KEY_AGREEMENT_IOP_COMPLETE server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_agreement_iop_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &rpos, &rremain,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-uint32_t psa_key_agreement_iop_get_num_ops(
-    psa_key_agreement_iop_t *operation
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    uint32_t value = 0;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_key_agreement_iop_t_needs(*operation);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        value = 0;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_agreement_iop_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_KEY_AGREEMENT_IOP_GET_NUM_OPS,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_KEY_AGREEMENT_IOP_GET_NUM_OPS server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_uint32_t(
-        &rpos, &rremain,
-        &value);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_agreement_iop_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return value;
-}
-
-
-psa_status_t psa_key_agreement_iop_setup(
-    psa_key_agreement_iop_t *operation,
-    mbedtls_svc_key_id_t private_key,
-    const uint8_t *peer_key, size_t  peer_key_length,
-    psa_algorithm_t alg,
-    const psa_key_attributes_t *attributes
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_key_agreement_iop_t_needs(*operation) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(private_key) +
-        psasim_serialise_buffer_needs(peer_key, peer_key_length) +
-        psasim_serialise_psa_algorithm_t_needs(alg) +
-        psasim_serialise_psa_key_attributes_t_needs(*attributes);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_agreement_iop_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        private_key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        peer_key, peer_key_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_attributes_t(
-        &pos, &remaining,
-        *attributes);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_KEY_AGREEMENT_IOP_SETUP,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_KEY_AGREEMENT_IOP_SETUP server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_agreement_iop_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_key_derivation_abort(
-    psa_key_derivation_operation_t *operation
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_key_derivation_operation_t_needs(*operation);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_derivation_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_KEY_DERIVATION_ABORT,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_KEY_DERIVATION_ABORT server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_derivation_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_key_derivation_get_capacity(
-    const psa_key_derivation_operation_t *operation,
-    size_t *capacity
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_key_derivation_operation_t_needs(*operation) +
-        psasim_serialise_size_t_needs(*capacity);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_derivation_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *capacity);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_KEY_DERIVATION_GET_CAPACITY,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_KEY_DERIVATION_GET_CAPACITY server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        capacity);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_key_derivation_input_bytes(
-    psa_key_derivation_operation_t *operation,
-    psa_key_derivation_step_t step,
-    const uint8_t *data, size_t  data_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_key_derivation_operation_t_needs(*operation) +
-        psasim_serialise_psa_key_derivation_step_t_needs(step) +
-        psasim_serialise_buffer_needs(data, data_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_derivation_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_derivation_step_t(
-        &pos, &remaining,
-        step);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        data, data_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_KEY_DERIVATION_INPUT_BYTES,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_KEY_DERIVATION_INPUT_BYTES server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_derivation_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_key_derivation_input_integer(
-    psa_key_derivation_operation_t *operation,
-    psa_key_derivation_step_t step,
-    uint64_t value
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_key_derivation_operation_t_needs(*operation) +
-        psasim_serialise_psa_key_derivation_step_t_needs(step) +
-        psasim_serialise_uint64_t_needs(value);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_derivation_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_derivation_step_t(
-        &pos, &remaining,
-        step);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_uint64_t(
-        &pos, &remaining,
-        value);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_KEY_DERIVATION_INPUT_INTEGER,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_KEY_DERIVATION_INPUT_INTEGER server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_derivation_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_key_derivation_input_key(
-    psa_key_derivation_operation_t *operation,
-    psa_key_derivation_step_t step,
-    mbedtls_svc_key_id_t key
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_key_derivation_operation_t_needs(*operation) +
-        psasim_serialise_psa_key_derivation_step_t_needs(step) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_derivation_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_derivation_step_t(
-        &pos, &remaining,
-        step);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_KEY_DERIVATION_INPUT_KEY,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_KEY_DERIVATION_INPUT_KEY server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_derivation_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_key_derivation_key_agreement(
-    psa_key_derivation_operation_t *operation,
-    psa_key_derivation_step_t step,
-    mbedtls_svc_key_id_t private_key,
-    const uint8_t *peer_key, size_t  peer_key_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_key_derivation_operation_t_needs(*operation) +
-        psasim_serialise_psa_key_derivation_step_t_needs(step) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(private_key) +
-        psasim_serialise_buffer_needs(peer_key, peer_key_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_derivation_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_derivation_step_t(
-        &pos, &remaining,
-        step);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        private_key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        peer_key, peer_key_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_KEY_DERIVATION_KEY_AGREEMENT,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_KEY_DERIVATION_KEY_AGREEMENT server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_derivation_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_key_derivation_output_bytes(
-    psa_key_derivation_operation_t *operation,
-    uint8_t *output, size_t  output_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_key_derivation_operation_t_needs(*operation) +
-        psasim_serialise_buffer_needs(output, output_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_derivation_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        output, output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_KEY_DERIVATION_OUTPUT_BYTES,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_KEY_DERIVATION_OUTPUT_BYTES server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_derivation_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        output, output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_key_derivation_output_key(
-    const psa_key_attributes_t *attributes,
-    psa_key_derivation_operation_t *operation,
-    mbedtls_svc_key_id_t *key
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_key_attributes_t_needs(*attributes) +
-        psasim_serialise_psa_key_derivation_operation_t_needs(*operation) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(*key);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_attributes_t(
-        &pos, &remaining,
-        *attributes);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_derivation_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        *key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_KEY_DERIVATION_OUTPUT_KEY,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_KEY_DERIVATION_OUTPUT_KEY server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_derivation_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &rpos, &rremain,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_key_derivation_output_key_custom(
-    const psa_key_attributes_t *attributes,
-    psa_key_derivation_operation_t *operation,
-    const psa_custom_key_parameters_t *custom,
-    const uint8_t *custom_data, size_t  custom_data_length,
-    mbedtls_svc_key_id_t *key
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_key_attributes_t_needs(*attributes) +
-        psasim_serialise_psa_key_derivation_operation_t_needs(*operation) +
-        psasim_serialise_psa_custom_key_parameters_t_needs(*custom) +
-        psasim_serialise_buffer_needs(custom_data, custom_data_length) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(*key);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_attributes_t(
-        &pos, &remaining,
-        *attributes);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_derivation_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_custom_key_parameters_t(
-        &pos, &remaining,
-        *custom);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        custom_data, custom_data_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        *key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_KEY_DERIVATION_OUTPUT_KEY_CUSTOM,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_KEY_DERIVATION_OUTPUT_KEY_CUSTOM server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_derivation_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &rpos, &rremain,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_key_derivation_set_capacity(
-    psa_key_derivation_operation_t *operation,
-    size_t capacity
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_key_derivation_operation_t_needs(*operation) +
-        psasim_serialise_size_t_needs(capacity);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_derivation_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        capacity);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_KEY_DERIVATION_SET_CAPACITY,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_KEY_DERIVATION_SET_CAPACITY server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_derivation_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_key_derivation_setup(
-    psa_key_derivation_operation_t *operation,
-    psa_algorithm_t alg
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_key_derivation_operation_t_needs(*operation) +
-        psasim_serialise_psa_algorithm_t_needs(alg);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_derivation_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_KEY_DERIVATION_SETUP,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_KEY_DERIVATION_SETUP server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_derivation_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_mac_abort(
-    psa_mac_operation_t *operation
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_mac_operation_t_needs(*operation);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_mac_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_MAC_ABORT,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_MAC_ABORT server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_mac_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_mac_compute(
-    mbedtls_svc_key_id_t key,
-    psa_algorithm_t alg,
-    const uint8_t *input, size_t  input_length,
-    uint8_t *mac, size_t  mac_size,
-    size_t *mac_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key) +
-        psasim_serialise_psa_algorithm_t_needs(alg) +
-        psasim_serialise_buffer_needs(input, input_length) +
-        psasim_serialise_buffer_needs(mac, mac_size) +
-        psasim_serialise_size_t_needs(*mac_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        input, input_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        mac, mac_size);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *mac_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_MAC_COMPUTE,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_MAC_COMPUTE server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        mac, mac_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        mac_length);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_mac_sign_finish(
-    psa_mac_operation_t *operation,
-    uint8_t *mac, size_t  mac_size,
-    size_t *mac_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_mac_operation_t_needs(*operation) +
-        psasim_serialise_buffer_needs(mac, mac_size) +
-        psasim_serialise_size_t_needs(*mac_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_mac_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        mac, mac_size);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *mac_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_MAC_SIGN_FINISH,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_MAC_SIGN_FINISH server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_mac_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        mac, mac_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        mac_length);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_mac_sign_setup(
-    psa_mac_operation_t *operation,
-    mbedtls_svc_key_id_t key,
-    psa_algorithm_t alg
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_mac_operation_t_needs(*operation) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key) +
-        psasim_serialise_psa_algorithm_t_needs(alg);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_mac_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_MAC_SIGN_SETUP,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_MAC_SIGN_SETUP server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_mac_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_mac_update(
-    psa_mac_operation_t *operation,
-    const uint8_t *input, size_t  input_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_mac_operation_t_needs(*operation) +
-        psasim_serialise_buffer_needs(input, input_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_mac_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        input, input_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_MAC_UPDATE,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_MAC_UPDATE server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_mac_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_mac_verify(
-    mbedtls_svc_key_id_t key,
-    psa_algorithm_t alg,
-    const uint8_t *input, size_t  input_length,
-    const uint8_t *mac, size_t  mac_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key) +
-        psasim_serialise_psa_algorithm_t_needs(alg) +
-        psasim_serialise_buffer_needs(input, input_length) +
-        psasim_serialise_buffer_needs(mac, mac_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        input, input_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        mac, mac_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_MAC_VERIFY,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_MAC_VERIFY server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_mac_verify_finish(
-    psa_mac_operation_t *operation,
-    const uint8_t *mac, size_t  mac_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_mac_operation_t_needs(*operation) +
-        psasim_serialise_buffer_needs(mac, mac_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_mac_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        mac, mac_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_MAC_VERIFY_FINISH,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_MAC_VERIFY_FINISH server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_mac_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_mac_verify_setup(
-    psa_mac_operation_t *operation,
-    mbedtls_svc_key_id_t key,
-    psa_algorithm_t alg
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_mac_operation_t_needs(*operation) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key) +
-        psasim_serialise_psa_algorithm_t_needs(alg);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_mac_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_MAC_VERIFY_SETUP,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_MAC_VERIFY_SETUP server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_mac_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_purge_key(
-    mbedtls_svc_key_id_t key
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_PURGE_KEY,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_PURGE_KEY server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_raw_key_agreement(
-    psa_algorithm_t alg,
-    mbedtls_svc_key_id_t private_key,
-    const uint8_t *peer_key, size_t  peer_key_length,
-    uint8_t *output, size_t  output_size,
-    size_t *output_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_algorithm_t_needs(alg) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(private_key) +
-        psasim_serialise_buffer_needs(peer_key, peer_key_length) +
-        psasim_serialise_buffer_needs(output, output_size) +
-        psasim_serialise_size_t_needs(*output_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        private_key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        peer_key, peer_key_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_RAW_KEY_AGREEMENT,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_RAW_KEY_AGREEMENT server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-void psa_reset_key_attributes(
-    psa_key_attributes_t *attributes
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_key_attributes_t_needs(*attributes);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_key_attributes_t(
-        &pos, &remaining,
-        *attributes);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_RESET_KEY_ATTRIBUTES,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_RESET_KEY_ATTRIBUTES server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_attributes_t(
-        &rpos, &rremain,
-        attributes);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-}
-
-
-psa_status_t psa_sign_hash(
-    mbedtls_svc_key_id_t key,
-    psa_algorithm_t alg,
-    const uint8_t *hash, size_t  hash_length,
-    uint8_t *signature, size_t  signature_size,
-    size_t *signature_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key) +
-        psasim_serialise_psa_algorithm_t_needs(alg) +
-        psasim_serialise_buffer_needs(hash, hash_length) +
-        psasim_serialise_buffer_needs(signature, signature_size) +
-        psasim_serialise_size_t_needs(*signature_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        hash, hash_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        signature, signature_size);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *signature_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_SIGN_HASH,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_SIGN_HASH server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        signature, signature_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        signature_length);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_sign_hash_abort(
-    psa_sign_hash_interruptible_operation_t *operation
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_sign_hash_interruptible_operation_t_needs(*operation);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_sign_hash_interruptible_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_SIGN_HASH_ABORT,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_SIGN_HASH_ABORT server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_sign_hash_interruptible_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_sign_hash_complete(
-    psa_sign_hash_interruptible_operation_t *operation,
-    uint8_t *signature, size_t  signature_size,
-    size_t *signature_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_sign_hash_interruptible_operation_t_needs(*operation) +
-        psasim_serialise_buffer_needs(signature, signature_size) +
-        psasim_serialise_size_t_needs(*signature_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_sign_hash_interruptible_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        signature, signature_size);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *signature_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_SIGN_HASH_COMPLETE,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_SIGN_HASH_COMPLETE server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_sign_hash_interruptible_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        signature, signature_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        signature_length);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-uint32_t psa_sign_hash_get_num_ops(
-    const psa_sign_hash_interruptible_operation_t *operation
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    uint32_t value = 0;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_sign_hash_interruptible_operation_t_needs(*operation);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        value = 0;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_sign_hash_interruptible_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_SIGN_HASH_GET_NUM_OPS,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_SIGN_HASH_GET_NUM_OPS server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_uint32_t(
-        &rpos, &rremain,
-        &value);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return value;
-}
-
-
-psa_status_t psa_sign_hash_start(
-    psa_sign_hash_interruptible_operation_t *operation,
-    mbedtls_svc_key_id_t key,
-    psa_algorithm_t alg,
-    const uint8_t *hash, size_t  hash_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_sign_hash_interruptible_operation_t_needs(*operation) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key) +
-        psasim_serialise_psa_algorithm_t_needs(alg) +
-        psasim_serialise_buffer_needs(hash, hash_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_sign_hash_interruptible_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        hash, hash_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_SIGN_HASH_START,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_SIGN_HASH_START server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_sign_hash_interruptible_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_sign_message(
-    mbedtls_svc_key_id_t key,
-    psa_algorithm_t alg,
-    const uint8_t *input, size_t  input_length,
-    uint8_t *signature, size_t  signature_size,
-    size_t *signature_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key) +
-        psasim_serialise_psa_algorithm_t_needs(alg) +
-        psasim_serialise_buffer_needs(input, input_length) +
-        psasim_serialise_buffer_needs(signature, signature_size) +
-        psasim_serialise_size_t_needs(*signature_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        input, input_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        signature, signature_size);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_size_t(
-        &pos, &remaining,
-        *signature_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_SIGN_MESSAGE,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_SIGN_MESSAGE server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_return_buffer(
-        &rpos, &rremain,
-        signature, signature_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &rpos, &rremain,
-        signature_length);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_verify_hash(
-    mbedtls_svc_key_id_t key,
-    psa_algorithm_t alg,
-    const uint8_t *hash, size_t  hash_length,
-    const uint8_t *signature, size_t  signature_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key) +
-        psasim_serialise_psa_algorithm_t_needs(alg) +
-        psasim_serialise_buffer_needs(hash, hash_length) +
-        psasim_serialise_buffer_needs(signature, signature_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        hash, hash_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        signature, signature_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_VERIFY_HASH,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_VERIFY_HASH server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_verify_hash_abort(
-    psa_verify_hash_interruptible_operation_t *operation
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_verify_hash_interruptible_operation_t_needs(*operation);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_verify_hash_interruptible_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_VERIFY_HASH_ABORT,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_VERIFY_HASH_ABORT server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_verify_hash_interruptible_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_verify_hash_complete(
-    psa_verify_hash_interruptible_operation_t *operation
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_verify_hash_interruptible_operation_t_needs(*operation);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_verify_hash_interruptible_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_VERIFY_HASH_COMPLETE,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_VERIFY_HASH_COMPLETE server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_verify_hash_interruptible_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-uint32_t psa_verify_hash_get_num_ops(
-    const psa_verify_hash_interruptible_operation_t *operation
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    uint32_t value = 0;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_verify_hash_interruptible_operation_t_needs(*operation);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        value = 0;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_verify_hash_interruptible_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_VERIFY_HASH_GET_NUM_OPS,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_VERIFY_HASH_GET_NUM_OPS server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_uint32_t(
-        &rpos, &rremain,
-        &value);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return value;
-}
-
-
-psa_status_t psa_verify_hash_start(
-    psa_verify_hash_interruptible_operation_t *operation,
-    mbedtls_svc_key_id_t key,
-    psa_algorithm_t alg,
-    const uint8_t *hash, size_t  hash_length,
-    const uint8_t *signature, size_t  signature_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_verify_hash_interruptible_operation_t_needs(*operation) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key) +
-        psasim_serialise_psa_algorithm_t_needs(alg) +
-        psasim_serialise_buffer_needs(hash, hash_length) +
-        psasim_serialise_buffer_needs(signature, signature_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_verify_hash_interruptible_operation_t(
-        &pos, &remaining,
-        *operation);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        hash, hash_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        signature, signature_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_VERIFY_HASH_START,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_VERIFY_HASH_START server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_verify_hash_interruptible_operation_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
-
-
-psa_status_t psa_verify_message(
-    mbedtls_svc_key_id_t key,
-    psa_algorithm_t alg,
-    const uint8_t *input, size_t  input_length,
-    const uint8_t *signature, size_t  signature_length
-    )
-{
-    uint8_t *ser_params = NULL;
-    uint8_t *ser_result = NULL;
-    size_t result_length;
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    size_t needed =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key) +
-        psasim_serialise_psa_algorithm_t_needs(alg) +
-        psasim_serialise_buffer_needs(input, input_length) +
-        psasim_serialise_buffer_needs(signature, signature_length);
-
-    ser_params = malloc(needed);
-    if (ser_params == NULL) {
-        status = PSA_ERROR_INSUFFICIENT_MEMORY;
-        goto fail;
-    }
-
-    uint8_t *pos = ser_params;
-    size_t remaining = needed;
-    int ok;
-    ok = psasim_serialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_psa_algorithm_t(
-        &pos, &remaining,
-        alg);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        input, input_length);
-    if (!ok) {
-        goto fail;
-    }
-    ok = psasim_serialise_buffer(
-        &pos, &remaining,
-        signature, signature_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psa_crypto_call(PSA_VERIFY_MESSAGE,
-                         ser_params, (size_t) (pos - ser_params), &ser_result, &result_length);
-    if (!ok) {
-        printf("PSA_VERIFY_MESSAGE server call failed\n");
-        goto fail;
-    }
-
-    uint8_t *rpos = ser_result;
-    size_t rremain = result_length;
-
-    ok = psasim_deserialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_status_t(
-        &rpos, &rremain,
-        &status);
-    if (!ok) {
-        goto fail;
-    }
-
-fail:
-    free(ser_params);
-    free(ser_result);
-
-    return status;
-}
diff --git a/psasim/src/psa_sim_crypto_server.c b/psasim/src/psa_sim_crypto_server.c
deleted file mode 100644
index bd121c5..0000000
--- a/psasim/src/psa_sim_crypto_server.c
+++ /dev/null
@@ -1,9226 +0,0 @@
-/* THIS FILE WAS AUTO-GENERATED BY psa_sim_generate.pl. DO NOT EDIT!! */
-
-/* server implementations */
-
-/*
- *  Copyright The Mbed TLS Contributors
- *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <psa/crypto.h>
-
-#include "psa_functions_codes.h"
-#include "psa_sim_serialise.h"
-
-#include "service.h"
-
-#if !defined(MBEDTLS_PSA_CRYPTO_C)
-#error "Error: MBEDTLS_PSA_CRYPTO_C must be enabled on server build"
-#endif
-
-#if defined(MBEDTLS_TEST_HOOKS)
-void (*mbedtls_test_hook_error_add)(int, int, const char *, int);
-#endif
-
-// Returns 1 for success, 0 for failure
-int psa_crypto_init_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-
-    uint8_t *result = NULL;
-    int ok;
-
-    // Now we call the actual target function
-
-    status = psa_crypto_init(
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_aead_abort_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_aead_operation_t *operation;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_aead_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_aead_abort(
-        operation
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_aead_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_aead_operation_t(
-        &rpos, &rremain,
-        operation, 1);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_aead_decrypt_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    mbedtls_svc_key_id_t key;
-    psa_algorithm_t alg;
-    uint8_t *nonce = NULL;
-    size_t nonce_length;
-    uint8_t *additional_data = NULL;
-    size_t additional_data_length;
-    uint8_t *ciphertext = NULL;
-    size_t ciphertext_length;
-    uint8_t *plaintext = NULL;
-    size_t plaintext_size;
-    size_t plaintext_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &nonce, &nonce_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &additional_data, &additional_data_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &ciphertext, &ciphertext_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &plaintext, &plaintext_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &plaintext_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_aead_decrypt(
-        key,
-        alg,
-        nonce, nonce_length,
-        additional_data, additional_data_length,
-        ciphertext, ciphertext_length,
-        plaintext, plaintext_size,
-        &plaintext_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_buffer_needs(plaintext, plaintext_size) +
-        psasim_serialise_size_t_needs(plaintext_length);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        plaintext, plaintext_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        plaintext_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(nonce);
-    free(additional_data);
-    free(ciphertext);
-    free(plaintext);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(nonce);
-    free(additional_data);
-    free(ciphertext);
-    free(plaintext);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_aead_decrypt_setup_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_aead_operation_t *operation;
-    mbedtls_svc_key_id_t key;
-    psa_algorithm_t alg;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_aead_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_aead_decrypt_setup(
-        operation,
-        key,
-        alg
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_aead_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_aead_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_aead_encrypt_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    mbedtls_svc_key_id_t key;
-    psa_algorithm_t alg;
-    uint8_t *nonce = NULL;
-    size_t nonce_length;
-    uint8_t *additional_data = NULL;
-    size_t additional_data_length;
-    uint8_t *plaintext = NULL;
-    size_t plaintext_length;
-    uint8_t *ciphertext = NULL;
-    size_t ciphertext_size;
-    size_t ciphertext_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &nonce, &nonce_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &additional_data, &additional_data_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &plaintext, &plaintext_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &ciphertext, &ciphertext_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &ciphertext_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_aead_encrypt(
-        key,
-        alg,
-        nonce, nonce_length,
-        additional_data, additional_data_length,
-        plaintext, plaintext_length,
-        ciphertext, ciphertext_size,
-        &ciphertext_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_buffer_needs(ciphertext, ciphertext_size) +
-        psasim_serialise_size_t_needs(ciphertext_length);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        ciphertext, ciphertext_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        ciphertext_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(nonce);
-    free(additional_data);
-    free(plaintext);
-    free(ciphertext);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(nonce);
-    free(additional_data);
-    free(plaintext);
-    free(ciphertext);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_aead_encrypt_setup_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_aead_operation_t *operation;
-    mbedtls_svc_key_id_t key;
-    psa_algorithm_t alg;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_aead_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_aead_encrypt_setup(
-        operation,
-        key,
-        alg
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_aead_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_aead_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_aead_finish_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_aead_operation_t *operation;
-    uint8_t *ciphertext = NULL;
-    size_t ciphertext_size;
-    size_t ciphertext_length;
-    uint8_t *tag = NULL;
-    size_t tag_size;
-    size_t tag_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_aead_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &ciphertext, &ciphertext_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &ciphertext_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &tag, &tag_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &tag_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_aead_finish(
-        operation,
-        ciphertext, ciphertext_size,
-        &ciphertext_length,
-        tag, tag_size,
-        &tag_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_aead_operation_t_needs(operation) +
-        psasim_serialise_buffer_needs(ciphertext, ciphertext_size) +
-        psasim_serialise_size_t_needs(ciphertext_length) +
-        psasim_serialise_buffer_needs(tag, tag_size) +
-        psasim_serialise_size_t_needs(tag_length);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_aead_operation_t(
-        &rpos, &rremain,
-        operation, 1);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        ciphertext, ciphertext_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        ciphertext_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        tag, tag_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        tag_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(ciphertext);
-    free(tag);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(ciphertext);
-    free(tag);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_aead_generate_nonce_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_aead_operation_t *operation;
-    uint8_t *nonce = NULL;
-    size_t nonce_size;
-    size_t nonce_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_aead_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &nonce, &nonce_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &nonce_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_aead_generate_nonce(
-        operation,
-        nonce, nonce_size,
-        &nonce_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_aead_operation_t_needs(operation) +
-        psasim_serialise_buffer_needs(nonce, nonce_size) +
-        psasim_serialise_size_t_needs(nonce_length);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_aead_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        nonce, nonce_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        nonce_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(nonce);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(nonce);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_aead_set_lengths_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_aead_operation_t *operation;
-    size_t ad_length;
-    size_t plaintext_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_aead_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &ad_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &plaintext_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_aead_set_lengths(
-        operation,
-        ad_length,
-        plaintext_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_aead_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_aead_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_aead_set_nonce_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_aead_operation_t *operation;
-    uint8_t *nonce = NULL;
-    size_t nonce_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_aead_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &nonce, &nonce_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_aead_set_nonce(
-        operation,
-        nonce, nonce_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_aead_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_aead_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(nonce);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(nonce);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_aead_update_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_aead_operation_t *operation;
-    uint8_t *input = NULL;
-    size_t input_length;
-    uint8_t *output = NULL;
-    size_t output_size;
-    size_t output_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_aead_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &input, &input_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &output, &output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_aead_update(
-        operation,
-        input, input_length,
-        output, output_size,
-        &output_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_aead_operation_t_needs(operation) +
-        psasim_serialise_buffer_needs(output, output_size) +
-        psasim_serialise_size_t_needs(output_length);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_aead_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(input);
-    free(output);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(input);
-    free(output);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_aead_update_ad_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_aead_operation_t *operation;
-    uint8_t *input = NULL;
-    size_t input_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_aead_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &input, &input_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_aead_update_ad(
-        operation,
-        input, input_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_aead_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_aead_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(input);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(input);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_aead_verify_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_aead_operation_t *operation;
-    uint8_t *plaintext = NULL;
-    size_t plaintext_size;
-    size_t plaintext_length;
-    uint8_t *tag = NULL;
-    size_t tag_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_aead_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &plaintext, &plaintext_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &plaintext_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &tag, &tag_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_aead_verify(
-        operation,
-        plaintext, plaintext_size,
-        &plaintext_length,
-        tag, tag_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_aead_operation_t_needs(operation) +
-        psasim_serialise_buffer_needs(plaintext, plaintext_size) +
-        psasim_serialise_size_t_needs(plaintext_length);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_aead_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        plaintext, plaintext_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        plaintext_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(plaintext);
-    free(tag);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(plaintext);
-    free(tag);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_asymmetric_decrypt_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    mbedtls_svc_key_id_t key;
-    psa_algorithm_t alg;
-    uint8_t *input = NULL;
-    size_t input_length;
-    uint8_t *salt = NULL;
-    size_t salt_length;
-    uint8_t *output = NULL;
-    size_t output_size;
-    size_t output_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &input, &input_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &salt, &salt_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &output, &output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_asymmetric_decrypt(
-        key,
-        alg,
-        input, input_length,
-        salt, salt_length,
-        output, output_size,
-        &output_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_buffer_needs(output, output_size) +
-        psasim_serialise_size_t_needs(output_length);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(input);
-    free(salt);
-    free(output);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(input);
-    free(salt);
-    free(output);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_asymmetric_encrypt_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    mbedtls_svc_key_id_t key;
-    psa_algorithm_t alg;
-    uint8_t *input = NULL;
-    size_t input_length;
-    uint8_t *salt = NULL;
-    size_t salt_length;
-    uint8_t *output = NULL;
-    size_t output_size;
-    size_t output_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &input, &input_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &salt, &salt_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &output, &output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_asymmetric_encrypt(
-        key,
-        alg,
-        input, input_length,
-        salt, salt_length,
-        output, output_size,
-        &output_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_buffer_needs(output, output_size) +
-        psasim_serialise_size_t_needs(output_length);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(input);
-    free(salt);
-    free(output);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(input);
-    free(salt);
-    free(output);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_can_do_hash_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    int value = 0;
-    psa_algorithm_t hash_alg;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &hash_alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    value = psa_can_do_hash(
-        hash_alg
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_int_needs(value);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_int(
-        &rpos, &rremain,
-        value);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_cipher_abort_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_cipher_operation_t *operation;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_cipher_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_cipher_abort(
-        operation
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_cipher_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_cipher_operation_t(
-        &rpos, &rremain,
-        operation, 1);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_cipher_decrypt_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    mbedtls_svc_key_id_t key;
-    psa_algorithm_t alg;
-    uint8_t *input = NULL;
-    size_t input_length;
-    uint8_t *output = NULL;
-    size_t output_size;
-    size_t output_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &input, &input_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &output, &output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_cipher_decrypt(
-        key,
-        alg,
-        input, input_length,
-        output, output_size,
-        &output_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_buffer_needs(output, output_size) +
-        psasim_serialise_size_t_needs(output_length);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(input);
-    free(output);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(input);
-    free(output);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_cipher_decrypt_setup_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_cipher_operation_t *operation;
-    mbedtls_svc_key_id_t key;
-    psa_algorithm_t alg;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_cipher_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_cipher_decrypt_setup(
-        operation,
-        key,
-        alg
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_cipher_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_cipher_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_cipher_encrypt_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    mbedtls_svc_key_id_t key;
-    psa_algorithm_t alg;
-    uint8_t *input = NULL;
-    size_t input_length;
-    uint8_t *output = NULL;
-    size_t output_size;
-    size_t output_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &input, &input_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &output, &output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_cipher_encrypt(
-        key,
-        alg,
-        input, input_length,
-        output, output_size,
-        &output_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_buffer_needs(output, output_size) +
-        psasim_serialise_size_t_needs(output_length);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(input);
-    free(output);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(input);
-    free(output);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_cipher_encrypt_setup_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_cipher_operation_t *operation;
-    mbedtls_svc_key_id_t key;
-    psa_algorithm_t alg;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_cipher_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_cipher_encrypt_setup(
-        operation,
-        key,
-        alg
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_cipher_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_cipher_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_cipher_finish_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_cipher_operation_t *operation;
-    uint8_t *output = NULL;
-    size_t output_size;
-    size_t output_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_cipher_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &output, &output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_cipher_finish(
-        operation,
-        output, output_size,
-        &output_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_cipher_operation_t_needs(operation) +
-        psasim_serialise_buffer_needs(output, output_size) +
-        psasim_serialise_size_t_needs(output_length);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_cipher_operation_t(
-        &rpos, &rremain,
-        operation, 1);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(output);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(output);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_cipher_generate_iv_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_cipher_operation_t *operation;
-    uint8_t *iv = NULL;
-    size_t iv_size;
-    size_t iv_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_cipher_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &iv, &iv_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &iv_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_cipher_generate_iv(
-        operation,
-        iv, iv_size,
-        &iv_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_cipher_operation_t_needs(operation) +
-        psasim_serialise_buffer_needs(iv, iv_size) +
-        psasim_serialise_size_t_needs(iv_length);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_cipher_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        iv, iv_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        iv_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(iv);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(iv);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_cipher_set_iv_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_cipher_operation_t *operation;
-    uint8_t *iv = NULL;
-    size_t iv_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_cipher_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &iv, &iv_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_cipher_set_iv(
-        operation,
-        iv, iv_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_cipher_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_cipher_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(iv);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(iv);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_cipher_update_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_cipher_operation_t *operation;
-    uint8_t *input = NULL;
-    size_t input_length;
-    uint8_t *output = NULL;
-    size_t output_size;
-    size_t output_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_cipher_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &input, &input_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &output, &output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_cipher_update(
-        operation,
-        input, input_length,
-        output, output_size,
-        &output_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_cipher_operation_t_needs(operation) +
-        psasim_serialise_buffer_needs(output, output_size) +
-        psasim_serialise_size_t_needs(output_length);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_cipher_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(input);
-    free(output);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(input);
-    free(output);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_copy_key_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    mbedtls_svc_key_id_t source_key;
-    psa_key_attributes_t attributes;
-    mbedtls_svc_key_id_t target_key;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &source_key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_attributes_t(
-        &pos, &remaining,
-        &attributes);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &target_key);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_copy_key(
-        source_key,
-        &attributes,
-        &target_key
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(target_key);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &rpos, &rremain,
-        target_key);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_destroy_key_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    mbedtls_svc_key_id_t key;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_destroy_key(
-        key
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_export_key_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    mbedtls_svc_key_id_t key;
-    uint8_t *data = NULL;
-    size_t data_size;
-    size_t data_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &data, &data_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &data_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_export_key(
-        key,
-        data, data_size,
-        &data_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_buffer_needs(data, data_size) +
-        psasim_serialise_size_t_needs(data_length);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        data, data_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        data_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(data);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(data);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_export_public_key_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    mbedtls_svc_key_id_t key;
-    uint8_t *data = NULL;
-    size_t data_size;
-    size_t data_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &data, &data_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &data_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_export_public_key(
-        key,
-        data, data_size,
-        &data_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_buffer_needs(data, data_size) +
-        psasim_serialise_size_t_needs(data_length);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        data, data_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        data_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(data);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(data);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_export_public_key_iop_abort_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_export_public_key_iop_t operation;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_export_public_key_iop_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_export_public_key_iop_abort(
-        &operation
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_psa_export_public_key_iop_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_export_public_key_iop_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_export_public_key_iop_complete_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_export_public_key_iop_t operation;
-    uint8_t *data = NULL;
-    size_t data_size;
-    size_t data_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_export_public_key_iop_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &data, &data_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &data_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_export_public_key_iop_complete(
-        &operation,
-        data, data_size,
-        &data_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_psa_export_public_key_iop_t_needs(operation) +
-        psasim_serialise_buffer_needs(data, data_size) +
-        psasim_serialise_size_t_needs(data_length);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_export_public_key_iop_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        data, data_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        data_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(data);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(data);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_export_public_key_iop_get_num_ops_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    uint32_t value = 0;
-    psa_export_public_key_iop_t operation;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_export_public_key_iop_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    value = psa_export_public_key_iop_get_num_ops(
-        &operation
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_uint32_t_needs(value) +
-        psasim_serialise_psa_export_public_key_iop_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_uint32_t(
-        &rpos, &rremain,
-        value);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_export_public_key_iop_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_export_public_key_iop_setup_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_export_public_key_iop_t operation;
-    mbedtls_svc_key_id_t key;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_export_public_key_iop_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_export_public_key_iop_setup(
-        &operation,
-        key
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_psa_export_public_key_iop_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_export_public_key_iop_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_generate_key_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_key_attributes_t attributes;
-    mbedtls_svc_key_id_t key;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_attributes_t(
-        &pos, &remaining,
-        &attributes);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_generate_key(
-        &attributes,
-        &key
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &rpos, &rremain,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_generate_key_custom_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_key_attributes_t attributes;
-    psa_custom_key_parameters_t custom;
-    uint8_t *custom_data = NULL;
-    size_t custom_data_length;
-    mbedtls_svc_key_id_t key;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_attributes_t(
-        &pos, &remaining,
-        &attributes);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_custom_key_parameters_t(
-        &pos, &remaining,
-        &custom);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &custom_data, &custom_data_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_generate_key_custom(
-        &attributes,
-        &custom,
-        custom_data, custom_data_length,
-        &key
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &rpos, &rremain,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(custom_data);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(custom_data);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_generate_key_iop_abort_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_generate_key_iop_t operation;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_generate_key_iop_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_generate_key_iop_abort(
-        &operation
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_psa_generate_key_iop_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_generate_key_iop_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_generate_key_iop_complete_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_generate_key_iop_t operation;
-    mbedtls_svc_key_id_t key;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_generate_key_iop_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_generate_key_iop_complete(
-        &operation,
-        &key
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_psa_generate_key_iop_t_needs(operation) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_generate_key_iop_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &rpos, &rremain,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_generate_key_iop_get_num_ops_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    uint32_t value = 0;
-    psa_generate_key_iop_t operation;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_generate_key_iop_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    value = psa_generate_key_iop_get_num_ops(
-        &operation
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_uint32_t_needs(value) +
-        psasim_serialise_psa_generate_key_iop_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_uint32_t(
-        &rpos, &rremain,
-        value);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_generate_key_iop_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_generate_key_iop_setup_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_generate_key_iop_t operation;
-    psa_key_attributes_t attributes;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_generate_key_iop_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_attributes_t(
-        &pos, &remaining,
-        &attributes);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_generate_key_iop_setup(
-        &operation,
-        &attributes
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_psa_generate_key_iop_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_generate_key_iop_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_generate_random_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    uint8_t *output = NULL;
-    size_t output_size;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &output, &output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_generate_random(
-        output, output_size
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_buffer_needs(output, output_size);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(output);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(output);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_get_key_attributes_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    mbedtls_svc_key_id_t key;
-    psa_key_attributes_t attributes;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_attributes_t(
-        &pos, &remaining,
-        &attributes);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_get_key_attributes(
-        key,
-        &attributes
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_psa_key_attributes_t_needs(attributes);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_key_attributes_t(
-        &rpos, &rremain,
-        attributes);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_hash_abort_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_hash_operation_t *operation;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_hash_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_hash_abort(
-        operation
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_hash_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_hash_operation_t(
-        &rpos, &rremain,
-        operation, 1);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_hash_clone_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_hash_operation_t *source_operation;
-    psa_hash_operation_t *target_operation;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_hash_operation_t(
-        &pos, &remaining,
-        &source_operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_hash_operation_t(
-        &pos, &remaining,
-        &target_operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_hash_clone(
-        source_operation,
-        target_operation
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_hash_operation_t_needs(target_operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_hash_operation_t(
-        &rpos, &rremain,
-        target_operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_hash_compare_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_algorithm_t alg;
-    uint8_t *input = NULL;
-    size_t input_length;
-    uint8_t *hash = NULL;
-    size_t hash_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &input, &input_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &hash, &hash_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_hash_compare(
-        alg,
-        input, input_length,
-        hash, hash_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(input);
-    free(hash);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(input);
-    free(hash);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_hash_compute_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_algorithm_t alg;
-    uint8_t *input = NULL;
-    size_t input_length;
-    uint8_t *hash = NULL;
-    size_t hash_size;
-    size_t hash_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &input, &input_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &hash, &hash_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &hash_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_hash_compute(
-        alg,
-        input, input_length,
-        hash, hash_size,
-        &hash_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_buffer_needs(hash, hash_size) +
-        psasim_serialise_size_t_needs(hash_length);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        hash, hash_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        hash_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(input);
-    free(hash);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(input);
-    free(hash);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_hash_finish_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_hash_operation_t *operation;
-    uint8_t *hash = NULL;
-    size_t hash_size;
-    size_t hash_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_hash_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &hash, &hash_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &hash_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_hash_finish(
-        operation,
-        hash, hash_size,
-        &hash_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_hash_operation_t_needs(operation) +
-        psasim_serialise_buffer_needs(hash, hash_size) +
-        psasim_serialise_size_t_needs(hash_length);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_hash_operation_t(
-        &rpos, &rremain,
-        operation, 1);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        hash, hash_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        hash_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(hash);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(hash);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_hash_setup_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_hash_operation_t *operation;
-    psa_algorithm_t alg;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_hash_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_hash_setup(
-        operation,
-        alg
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_hash_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_hash_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_hash_update_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_hash_operation_t *operation;
-    uint8_t *input = NULL;
-    size_t input_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_hash_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &input, &input_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_hash_update(
-        operation,
-        input, input_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_hash_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_hash_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(input);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(input);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_hash_verify_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_hash_operation_t *operation;
-    uint8_t *hash = NULL;
-    size_t hash_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_hash_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &hash, &hash_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_hash_verify(
-        operation,
-        hash, hash_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_hash_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_hash_operation_t(
-        &rpos, &rremain,
-        operation, 1);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(hash);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(hash);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_import_key_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_key_attributes_t attributes;
-    uint8_t *data = NULL;
-    size_t data_length;
-    mbedtls_svc_key_id_t key;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_attributes_t(
-        &pos, &remaining,
-        &attributes);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &data, &data_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_import_key(
-        &attributes,
-        data, data_length,
-        &key
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &rpos, &rremain,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(data);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(data);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_interruptible_get_max_ops_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    uint32_t value = 0;
-
-    uint8_t *result = NULL;
-    int ok;
-
-    // Now we call the actual target function
-
-    value = psa_interruptible_get_max_ops(
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_uint32_t_needs(value);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_uint32_t(
-        &rpos, &rremain,
-        value);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_interruptible_set_max_ops_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    uint32_t max_ops;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_uint32_t(
-        &pos, &remaining,
-        &max_ops);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    psa_interruptible_set_max_ops(
-        max_ops
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs();
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_key_agreement_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    mbedtls_svc_key_id_t private_key;
-    uint8_t *peer_key = NULL;
-    size_t peer_key_length;
-    psa_algorithm_t alg;
-    psa_key_attributes_t attributes;
-    mbedtls_svc_key_id_t key;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &private_key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &peer_key, &peer_key_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_attributes_t(
-        &pos, &remaining,
-        &attributes);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_key_agreement(
-        private_key,
-        peer_key, peer_key_length,
-        alg,
-        &attributes,
-        &key
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &rpos, &rremain,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(peer_key);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(peer_key);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_key_agreement_iop_abort_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_key_agreement_iop_t operation;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_agreement_iop_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_key_agreement_iop_abort(
-        &operation
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_psa_key_agreement_iop_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_key_agreement_iop_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_key_agreement_iop_complete_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_key_agreement_iop_t operation;
-    mbedtls_svc_key_id_t key;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_agreement_iop_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_key_agreement_iop_complete(
-        &operation,
-        &key
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_psa_key_agreement_iop_t_needs(operation) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_key_agreement_iop_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &rpos, &rremain,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_key_agreement_iop_get_num_ops_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    uint32_t value = 0;
-    psa_key_agreement_iop_t operation;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_agreement_iop_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    value = psa_key_agreement_iop_get_num_ops(
-        &operation
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_uint32_t_needs(value) +
-        psasim_serialise_psa_key_agreement_iop_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_uint32_t(
-        &rpos, &rremain,
-        value);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_key_agreement_iop_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_key_agreement_iop_setup_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_key_agreement_iop_t operation;
-    mbedtls_svc_key_id_t private_key;
-    uint8_t *peer_key = NULL;
-    size_t peer_key_length;
-    psa_algorithm_t alg;
-    psa_key_attributes_t attributes;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_agreement_iop_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &private_key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &peer_key, &peer_key_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_attributes_t(
-        &pos, &remaining,
-        &attributes);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_key_agreement_iop_setup(
-        &operation,
-        private_key,
-        peer_key, peer_key_length,
-        alg,
-        &attributes
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_psa_key_agreement_iop_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_key_agreement_iop_t(
-        &rpos, &rremain,
-        operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(peer_key);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(peer_key);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_key_derivation_abort_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_key_derivation_operation_t *operation;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_key_derivation_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_key_derivation_abort(
-        operation
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_key_derivation_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_key_derivation_operation_t(
-        &rpos, &rremain,
-        operation, 1);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_key_derivation_get_capacity_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_key_derivation_operation_t *operation;
-    size_t capacity;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_key_derivation_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &capacity);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_key_derivation_get_capacity(
-        operation,
-        &capacity
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_size_t_needs(capacity);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        capacity);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_key_derivation_input_bytes_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_key_derivation_operation_t *operation;
-    psa_key_derivation_step_t step;
-    uint8_t *data = NULL;
-    size_t data_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_key_derivation_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_derivation_step_t(
-        &pos, &remaining,
-        &step);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &data, &data_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_key_derivation_input_bytes(
-        operation,
-        step,
-        data, data_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_key_derivation_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_key_derivation_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(data);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(data);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_key_derivation_input_integer_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_key_derivation_operation_t *operation;
-    psa_key_derivation_step_t step;
-    uint64_t value;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_key_derivation_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_derivation_step_t(
-        &pos, &remaining,
-        &step);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_uint64_t(
-        &pos, &remaining,
-        &value);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_key_derivation_input_integer(
-        operation,
-        step,
-        value
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_key_derivation_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_key_derivation_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_key_derivation_input_key_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_key_derivation_operation_t *operation;
-    psa_key_derivation_step_t step;
-    mbedtls_svc_key_id_t key;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_key_derivation_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_derivation_step_t(
-        &pos, &remaining,
-        &step);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_key_derivation_input_key(
-        operation,
-        step,
-        key
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_key_derivation_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_key_derivation_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_key_derivation_key_agreement_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_key_derivation_operation_t *operation;
-    psa_key_derivation_step_t step;
-    mbedtls_svc_key_id_t private_key;
-    uint8_t *peer_key = NULL;
-    size_t peer_key_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_key_derivation_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_derivation_step_t(
-        &pos, &remaining,
-        &step);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &private_key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &peer_key, &peer_key_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_key_derivation_key_agreement(
-        operation,
-        step,
-        private_key,
-        peer_key, peer_key_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_key_derivation_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_key_derivation_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(peer_key);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(peer_key);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_key_derivation_output_bytes_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_key_derivation_operation_t *operation;
-    uint8_t *output = NULL;
-    size_t output_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_key_derivation_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &output, &output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_key_derivation_output_bytes(
-        operation,
-        output, output_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_key_derivation_operation_t_needs(operation) +
-        psasim_serialise_buffer_needs(output, output_length);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_key_derivation_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        output, output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(output);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(output);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_key_derivation_output_key_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_key_attributes_t attributes;
-    psa_key_derivation_operation_t *operation;
-    mbedtls_svc_key_id_t key;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_attributes_t(
-        &pos, &remaining,
-        &attributes);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_key_derivation_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_key_derivation_output_key(
-        &attributes,
-        operation,
-        &key
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_key_derivation_operation_t_needs(operation) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_key_derivation_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &rpos, &rremain,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_key_derivation_output_key_custom_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_key_attributes_t attributes;
-    psa_key_derivation_operation_t *operation;
-    psa_custom_key_parameters_t custom;
-    uint8_t *custom_data = NULL;
-    size_t custom_data_length;
-    mbedtls_svc_key_id_t key;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_attributes_t(
-        &pos, &remaining,
-        &attributes);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_key_derivation_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_custom_key_parameters_t(
-        &pos, &remaining,
-        &custom);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &custom_data, &custom_data_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_key_derivation_output_key_custom(
-        &attributes,
-        operation,
-        &custom,
-        custom_data, custom_data_length,
-        &key
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_key_derivation_operation_t_needs(operation) +
-        psasim_serialise_mbedtls_svc_key_id_t_needs(key);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_key_derivation_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_mbedtls_svc_key_id_t(
-        &rpos, &rremain,
-        key);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(custom_data);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(custom_data);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_key_derivation_set_capacity_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_key_derivation_operation_t *operation;
-    size_t capacity;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_key_derivation_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &capacity);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_key_derivation_set_capacity(
-        operation,
-        capacity
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_key_derivation_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_key_derivation_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_key_derivation_setup_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_key_derivation_operation_t *operation;
-    psa_algorithm_t alg;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_key_derivation_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_key_derivation_setup(
-        operation,
-        alg
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_key_derivation_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_key_derivation_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_mac_abort_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_mac_operation_t *operation;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_mac_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_mac_abort(
-        operation
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_mac_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_mac_operation_t(
-        &rpos, &rremain,
-        operation, 1);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_mac_compute_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    mbedtls_svc_key_id_t key;
-    psa_algorithm_t alg;
-    uint8_t *input = NULL;
-    size_t input_length;
-    uint8_t *mac = NULL;
-    size_t mac_size;
-    size_t mac_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &input, &input_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &mac, &mac_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &mac_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_mac_compute(
-        key,
-        alg,
-        input, input_length,
-        mac, mac_size,
-        &mac_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_buffer_needs(mac, mac_size) +
-        psasim_serialise_size_t_needs(mac_length);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        mac, mac_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        mac_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(input);
-    free(mac);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(input);
-    free(mac);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_mac_sign_finish_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_mac_operation_t *operation;
-    uint8_t *mac = NULL;
-    size_t mac_size;
-    size_t mac_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_mac_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &mac, &mac_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &mac_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_mac_sign_finish(
-        operation,
-        mac, mac_size,
-        &mac_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_mac_operation_t_needs(operation) +
-        psasim_serialise_buffer_needs(mac, mac_size) +
-        psasim_serialise_size_t_needs(mac_length);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_mac_operation_t(
-        &rpos, &rremain,
-        operation, 1);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        mac, mac_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        mac_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(mac);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(mac);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_mac_sign_setup_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_mac_operation_t *operation;
-    mbedtls_svc_key_id_t key;
-    psa_algorithm_t alg;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_mac_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_mac_sign_setup(
-        operation,
-        key,
-        alg
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_mac_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_mac_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_mac_update_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_mac_operation_t *operation;
-    uint8_t *input = NULL;
-    size_t input_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_mac_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &input, &input_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_mac_update(
-        operation,
-        input, input_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_mac_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_mac_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(input);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(input);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_mac_verify_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    mbedtls_svc_key_id_t key;
-    psa_algorithm_t alg;
-    uint8_t *input = NULL;
-    size_t input_length;
-    uint8_t *mac = NULL;
-    size_t mac_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &input, &input_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &mac, &mac_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_mac_verify(
-        key,
-        alg,
-        input, input_length,
-        mac, mac_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(input);
-    free(mac);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(input);
-    free(mac);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_mac_verify_finish_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_mac_operation_t *operation;
-    uint8_t *mac = NULL;
-    size_t mac_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_mac_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &mac, &mac_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_mac_verify_finish(
-        operation,
-        mac, mac_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_mac_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_mac_operation_t(
-        &rpos, &rremain,
-        operation, 1);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(mac);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(mac);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_mac_verify_setup_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_mac_operation_t *operation;
-    mbedtls_svc_key_id_t key;
-    psa_algorithm_t alg;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_mac_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_mac_verify_setup(
-        operation,
-        key,
-        alg
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_mac_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_mac_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_purge_key_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    mbedtls_svc_key_id_t key;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_purge_key(
-        key
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_raw_key_agreement_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_algorithm_t alg;
-    mbedtls_svc_key_id_t private_key;
-    uint8_t *peer_key = NULL;
-    size_t peer_key_length;
-    uint8_t *output = NULL;
-    size_t output_size;
-    size_t output_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &private_key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &peer_key, &peer_key_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &output, &output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_raw_key_agreement(
-        alg,
-        private_key,
-        peer_key, peer_key_length,
-        output, output_size,
-        &output_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_buffer_needs(output, output_size) +
-        psasim_serialise_size_t_needs(output_length);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        output, output_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        output_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(peer_key);
-    free(output);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(peer_key);
-    free(output);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_reset_key_attributes_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_key_attributes_t attributes;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_key_attributes_t(
-        &pos, &remaining,
-        &attributes);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    psa_reset_key_attributes(
-        &attributes
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_key_attributes_t_needs(attributes);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_key_attributes_t(
-        &rpos, &rremain,
-        attributes);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_sign_hash_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    mbedtls_svc_key_id_t key;
-    psa_algorithm_t alg;
-    uint8_t *hash = NULL;
-    size_t hash_length;
-    uint8_t *signature = NULL;
-    size_t signature_size;
-    size_t signature_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &hash, &hash_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &signature, &signature_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &signature_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_sign_hash(
-        key,
-        alg,
-        hash, hash_length,
-        signature, signature_size,
-        &signature_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_buffer_needs(signature, signature_size) +
-        psasim_serialise_size_t_needs(signature_length);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        signature, signature_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        signature_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(hash);
-    free(signature);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(hash);
-    free(signature);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_sign_hash_abort_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_sign_hash_interruptible_operation_t *operation;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_sign_hash_interruptible_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_sign_hash_abort(
-        operation
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_sign_hash_interruptible_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_sign_hash_interruptible_operation_t(
-        &rpos, &rremain,
-        operation, 1);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_sign_hash_complete_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_sign_hash_interruptible_operation_t *operation;
-    uint8_t *signature = NULL;
-    size_t signature_size;
-    size_t signature_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_sign_hash_interruptible_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &signature, &signature_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &signature_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_sign_hash_complete(
-        operation,
-        signature, signature_size,
-        &signature_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_sign_hash_interruptible_operation_t_needs(operation) +
-        psasim_serialise_buffer_needs(signature, signature_size) +
-        psasim_serialise_size_t_needs(signature_length);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_sign_hash_interruptible_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        signature, signature_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        signature_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(signature);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(signature);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_sign_hash_get_num_ops_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    uint32_t value = 0;
-    psa_sign_hash_interruptible_operation_t *operation;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_sign_hash_interruptible_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    value = psa_sign_hash_get_num_ops(
-        operation
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_uint32_t_needs(value);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_uint32_t(
-        &rpos, &rremain,
-        value);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_sign_hash_start_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_sign_hash_interruptible_operation_t *operation;
-    mbedtls_svc_key_id_t key;
-    psa_algorithm_t alg;
-    uint8_t *hash = NULL;
-    size_t hash_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_sign_hash_interruptible_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &hash, &hash_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_sign_hash_start(
-        operation,
-        key,
-        alg,
-        hash, hash_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_sign_hash_interruptible_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_sign_hash_interruptible_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(hash);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(hash);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_sign_message_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    mbedtls_svc_key_id_t key;
-    psa_algorithm_t alg;
-    uint8_t *input = NULL;
-    size_t input_length;
-    uint8_t *signature = NULL;
-    size_t signature_size;
-    size_t signature_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &input, &input_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &signature, &signature_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_size_t(
-        &pos, &remaining,
-        &signature_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_sign_message(
-        key,
-        alg,
-        input, input_length,
-        signature, signature_size,
-        &signature_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_serialise_buffer_needs(signature, signature_size) +
-        psasim_serialise_size_t_needs(signature_length);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_buffer(
-        &rpos, &rremain,
-        signature, signature_size);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_size_t(
-        &rpos, &rremain,
-        signature_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(input);
-    free(signature);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(input);
-    free(signature);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_verify_hash_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    mbedtls_svc_key_id_t key;
-    psa_algorithm_t alg;
-    uint8_t *hash = NULL;
-    size_t hash_length;
-    uint8_t *signature = NULL;
-    size_t signature_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &hash, &hash_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &signature, &signature_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_verify_hash(
-        key,
-        alg,
-        hash, hash_length,
-        signature, signature_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(hash);
-    free(signature);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(hash);
-    free(signature);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_verify_hash_abort_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_verify_hash_interruptible_operation_t *operation;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_verify_hash_interruptible_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_verify_hash_abort(
-        operation
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_verify_hash_interruptible_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_verify_hash_interruptible_operation_t(
-        &rpos, &rremain,
-        operation, 1);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_verify_hash_complete_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_verify_hash_interruptible_operation_t *operation;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_verify_hash_interruptible_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_verify_hash_complete(
-        operation
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_verify_hash_interruptible_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_verify_hash_interruptible_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_verify_hash_get_num_ops_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    uint32_t value = 0;
-    psa_verify_hash_interruptible_operation_t *operation;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_verify_hash_interruptible_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    value = psa_verify_hash_get_num_ops(
-        operation
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_uint32_t_needs(value);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_uint32_t(
-        &rpos, &rremain,
-        value);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_verify_hash_start_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    psa_verify_hash_interruptible_operation_t *operation;
-    mbedtls_svc_key_id_t key;
-    psa_algorithm_t alg;
-    uint8_t *hash = NULL;
-    size_t hash_length;
-    uint8_t *signature = NULL;
-    size_t signature_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_deserialise_psa_verify_hash_interruptible_operation_t(
-        &pos, &remaining,
-        &operation);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &hash, &hash_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &signature, &signature_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_verify_hash_start(
-        operation,
-        key,
-        alg,
-        hash, hash_length,
-        signature, signature_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status) +
-        psasim_server_serialise_psa_verify_hash_interruptible_operation_t_needs(operation);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_server_serialise_psa_verify_hash_interruptible_operation_t(
-        &rpos, &rremain,
-        operation, 0);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(hash);
-    free(signature);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(hash);
-    free(signature);
-
-    return 0;       // This shouldn't happen!
-}
-
-// Returns 1 for success, 0 for failure
-int psa_verify_message_wrapper(
-    uint8_t *in_params, size_t in_params_len,
-    uint8_t **out_params, size_t *out_params_len)
-{
-    psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
-    mbedtls_svc_key_id_t key;
-    psa_algorithm_t alg;
-    uint8_t *input = NULL;
-    size_t input_length;
-    uint8_t *signature = NULL;
-    size_t signature_length;
-
-    uint8_t *pos = in_params;
-    size_t remaining = in_params_len;
-    uint8_t *result = NULL;
-    int ok;
-
-    ok = psasim_deserialise_begin(&pos, &remaining);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_mbedtls_svc_key_id_t(
-        &pos, &remaining,
-        &key);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_psa_algorithm_t(
-        &pos, &remaining,
-        &alg);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &input, &input_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_deserialise_buffer(
-        &pos, &remaining,
-        &signature, &signature_length);
-    if (!ok) {
-        goto fail;
-    }
-
-    // Now we call the actual target function
-
-    status = psa_verify_message(
-        key,
-        alg,
-        input, input_length,
-        signature, signature_length
-        );
-
-    // NOTE: Should really check there is no overflow as we go along.
-    size_t result_size =
-        psasim_serialise_begin_needs() +
-        psasim_serialise_psa_status_t_needs(status);
-
-    result = malloc(result_size);
-    if (result == NULL) {
-        goto fail;
-    }
-
-    uint8_t *rpos = result;
-    size_t rremain = result_size;
-
-    ok = psasim_serialise_begin(&rpos, &rremain);
-    if (!ok) {
-        goto fail;
-    }
-
-    ok = psasim_serialise_psa_status_t(
-        &rpos, &rremain,
-        status);
-    if (!ok) {
-        goto fail;
-    }
-
-    *out_params = result;
-    *out_params_len = result_size;
-
-    free(input);
-    free(signature);
-
-    return 1;   // success
-
-fail:
-    free(result);
-
-    free(input);
-    free(signature);
-
-    return 0;       // This shouldn't happen!
-}
-
-psa_status_t psa_crypto_call(psa_msg_t msg)
-{
-    int ok = 0;
-
-    int func = msg.type;
-
-    /* We only expect a single input buffer, with everything serialised in it */
-    if (msg.in_size[1] != 0 || msg.in_size[2] != 0 || msg.in_size[3] != 0) {
-        return PSA_ERROR_INVALID_ARGUMENT;
-    }
-
-    /* We expect exactly 2 output buffers, one for size, the other for data */
-    if (msg.out_size[0] != sizeof(size_t) || msg.out_size[1] == 0 ||
-        msg.out_size[2] != 0 || msg.out_size[3] != 0) {
-        return PSA_ERROR_INVALID_ARGUMENT;
-    }
-
-    uint8_t *in_params = NULL;
-    size_t in_params_len = 0;
-    uint8_t *out_params = NULL;
-    size_t out_params_len = 0;
-
-    in_params_len = msg.in_size[0];
-    in_params = malloc(in_params_len);
-    if (in_params == NULL) {
-        return PSA_ERROR_INSUFFICIENT_MEMORY;
-    }
-
-    /* Read the bytes from the client */
-    size_t actual = psa_read(msg.handle, 0, in_params, in_params_len);
-    if (actual != in_params_len) {
-        free(in_params);
-        return PSA_ERROR_CORRUPTION_DETECTED;
-    }
-
-    switch (func) {
-        case PSA_CRYPTO_INIT:
-            ok = psa_crypto_init_wrapper(in_params, in_params_len,
-                                         &out_params, &out_params_len);
-            break;
-        case PSA_AEAD_ABORT:
-            ok = psa_aead_abort_wrapper(in_params, in_params_len,
-                                        &out_params, &out_params_len);
-            break;
-        case PSA_AEAD_DECRYPT:
-            ok = psa_aead_decrypt_wrapper(in_params, in_params_len,
-                                          &out_params, &out_params_len);
-            break;
-        case PSA_AEAD_DECRYPT_SETUP:
-            ok = psa_aead_decrypt_setup_wrapper(in_params, in_params_len,
-                                                &out_params, &out_params_len);
-            break;
-        case PSA_AEAD_ENCRYPT:
-            ok = psa_aead_encrypt_wrapper(in_params, in_params_len,
-                                          &out_params, &out_params_len);
-            break;
-        case PSA_AEAD_ENCRYPT_SETUP:
-            ok = psa_aead_encrypt_setup_wrapper(in_params, in_params_len,
-                                                &out_params, &out_params_len);
-            break;
-        case PSA_AEAD_FINISH:
-            ok = psa_aead_finish_wrapper(in_params, in_params_len,
-                                         &out_params, &out_params_len);
-            break;
-        case PSA_AEAD_GENERATE_NONCE:
-            ok = psa_aead_generate_nonce_wrapper(in_params, in_params_len,
-                                                 &out_params, &out_params_len);
-            break;
-        case PSA_AEAD_SET_LENGTHS:
-            ok = psa_aead_set_lengths_wrapper(in_params, in_params_len,
-                                              &out_params, &out_params_len);
-            break;
-        case PSA_AEAD_SET_NONCE:
-            ok = psa_aead_set_nonce_wrapper(in_params, in_params_len,
-                                            &out_params, &out_params_len);
-            break;
-        case PSA_AEAD_UPDATE:
-            ok = psa_aead_update_wrapper(in_params, in_params_len,
-                                         &out_params, &out_params_len);
-            break;
-        case PSA_AEAD_UPDATE_AD:
-            ok = psa_aead_update_ad_wrapper(in_params, in_params_len,
-                                            &out_params, &out_params_len);
-            break;
-        case PSA_AEAD_VERIFY:
-            ok = psa_aead_verify_wrapper(in_params, in_params_len,
-                                         &out_params, &out_params_len);
-            break;
-        case PSA_ASYMMETRIC_DECRYPT:
-            ok = psa_asymmetric_decrypt_wrapper(in_params, in_params_len,
-                                                &out_params, &out_params_len);
-            break;
-        case PSA_ASYMMETRIC_ENCRYPT:
-            ok = psa_asymmetric_encrypt_wrapper(in_params, in_params_len,
-                                                &out_params, &out_params_len);
-            break;
-        case PSA_CAN_DO_HASH:
-            ok = psa_can_do_hash_wrapper(in_params, in_params_len,
-                                         &out_params, &out_params_len);
-            break;
-        case PSA_CIPHER_ABORT:
-            ok = psa_cipher_abort_wrapper(in_params, in_params_len,
-                                          &out_params, &out_params_len);
-            break;
-        case PSA_CIPHER_DECRYPT:
-            ok = psa_cipher_decrypt_wrapper(in_params, in_params_len,
-                                            &out_params, &out_params_len);
-            break;
-        case PSA_CIPHER_DECRYPT_SETUP:
-            ok = psa_cipher_decrypt_setup_wrapper(in_params, in_params_len,
-                                                  &out_params, &out_params_len);
-            break;
-        case PSA_CIPHER_ENCRYPT:
-            ok = psa_cipher_encrypt_wrapper(in_params, in_params_len,
-                                            &out_params, &out_params_len);
-            break;
-        case PSA_CIPHER_ENCRYPT_SETUP:
-            ok = psa_cipher_encrypt_setup_wrapper(in_params, in_params_len,
-                                                  &out_params, &out_params_len);
-            break;
-        case PSA_CIPHER_FINISH:
-            ok = psa_cipher_finish_wrapper(in_params, in_params_len,
-                                           &out_params, &out_params_len);
-            break;
-        case PSA_CIPHER_GENERATE_IV:
-            ok = psa_cipher_generate_iv_wrapper(in_params, in_params_len,
-                                                &out_params, &out_params_len);
-            break;
-        case PSA_CIPHER_SET_IV:
-            ok = psa_cipher_set_iv_wrapper(in_params, in_params_len,
-                                           &out_params, &out_params_len);
-            break;
-        case PSA_CIPHER_UPDATE:
-            ok = psa_cipher_update_wrapper(in_params, in_params_len,
-                                           &out_params, &out_params_len);
-            break;
-        case PSA_COPY_KEY:
-            ok = psa_copy_key_wrapper(in_params, in_params_len,
-                                      &out_params, &out_params_len);
-            break;
-        case PSA_DESTROY_KEY:
-            ok = psa_destroy_key_wrapper(in_params, in_params_len,
-                                         &out_params, &out_params_len);
-            break;
-        case PSA_EXPORT_KEY:
-            ok = psa_export_key_wrapper(in_params, in_params_len,
-                                        &out_params, &out_params_len);
-            break;
-        case PSA_EXPORT_PUBLIC_KEY:
-            ok = psa_export_public_key_wrapper(in_params, in_params_len,
-                                               &out_params, &out_params_len);
-            break;
-        case PSA_EXPORT_PUBLIC_KEY_IOP_ABORT:
-            ok = psa_export_public_key_iop_abort_wrapper(in_params, in_params_len,
-                                                         &out_params, &out_params_len);
-            break;
-        case PSA_EXPORT_PUBLIC_KEY_IOP_COMPLETE:
-            ok = psa_export_public_key_iop_complete_wrapper(in_params, in_params_len,
-                                                            &out_params, &out_params_len);
-            break;
-        case PSA_EXPORT_PUBLIC_KEY_IOP_GET_NUM_OPS:
-            ok = psa_export_public_key_iop_get_num_ops_wrapper(in_params, in_params_len,
-                                                               &out_params, &out_params_len);
-            break;
-        case PSA_EXPORT_PUBLIC_KEY_IOP_SETUP:
-            ok = psa_export_public_key_iop_setup_wrapper(in_params, in_params_len,
-                                                         &out_params, &out_params_len);
-            break;
-        case PSA_GENERATE_KEY:
-            ok = psa_generate_key_wrapper(in_params, in_params_len,
-                                          &out_params, &out_params_len);
-            break;
-        case PSA_GENERATE_KEY_CUSTOM:
-            ok = psa_generate_key_custom_wrapper(in_params, in_params_len,
-                                                 &out_params, &out_params_len);
-            break;
-        case PSA_GENERATE_KEY_IOP_ABORT:
-            ok = psa_generate_key_iop_abort_wrapper(in_params, in_params_len,
-                                                    &out_params, &out_params_len);
-            break;
-        case PSA_GENERATE_KEY_IOP_COMPLETE:
-            ok = psa_generate_key_iop_complete_wrapper(in_params, in_params_len,
-                                                       &out_params, &out_params_len);
-            break;
-        case PSA_GENERATE_KEY_IOP_GET_NUM_OPS:
-            ok = psa_generate_key_iop_get_num_ops_wrapper(in_params, in_params_len,
-                                                          &out_params, &out_params_len);
-            break;
-        case PSA_GENERATE_KEY_IOP_SETUP:
-            ok = psa_generate_key_iop_setup_wrapper(in_params, in_params_len,
-                                                    &out_params, &out_params_len);
-            break;
-        case PSA_GENERATE_RANDOM:
-            ok = psa_generate_random_wrapper(in_params, in_params_len,
-                                             &out_params, &out_params_len);
-            break;
-        case PSA_GET_KEY_ATTRIBUTES:
-            ok = psa_get_key_attributes_wrapper(in_params, in_params_len,
-                                                &out_params, &out_params_len);
-            break;
-        case PSA_HASH_ABORT:
-            ok = psa_hash_abort_wrapper(in_params, in_params_len,
-                                        &out_params, &out_params_len);
-            break;
-        case PSA_HASH_CLONE:
-            ok = psa_hash_clone_wrapper(in_params, in_params_len,
-                                        &out_params, &out_params_len);
-            break;
-        case PSA_HASH_COMPARE:
-            ok = psa_hash_compare_wrapper(in_params, in_params_len,
-                                          &out_params, &out_params_len);
-            break;
-        case PSA_HASH_COMPUTE:
-            ok = psa_hash_compute_wrapper(in_params, in_params_len,
-                                          &out_params, &out_params_len);
-            break;
-        case PSA_HASH_FINISH:
-            ok = psa_hash_finish_wrapper(in_params, in_params_len,
-                                         &out_params, &out_params_len);
-            break;
-        case PSA_HASH_SETUP:
-            ok = psa_hash_setup_wrapper(in_params, in_params_len,
-                                        &out_params, &out_params_len);
-            break;
-        case PSA_HASH_UPDATE:
-            ok = psa_hash_update_wrapper(in_params, in_params_len,
-                                         &out_params, &out_params_len);
-            break;
-        case PSA_HASH_VERIFY:
-            ok = psa_hash_verify_wrapper(in_params, in_params_len,
-                                         &out_params, &out_params_len);
-            break;
-        case PSA_IMPORT_KEY:
-            ok = psa_import_key_wrapper(in_params, in_params_len,
-                                        &out_params, &out_params_len);
-            break;
-        case PSA_INTERRUPTIBLE_GET_MAX_OPS:
-            ok = psa_interruptible_get_max_ops_wrapper(in_params, in_params_len,
-                                                       &out_params, &out_params_len);
-            break;
-        case PSA_INTERRUPTIBLE_SET_MAX_OPS:
-            ok = psa_interruptible_set_max_ops_wrapper(in_params, in_params_len,
-                                                       &out_params, &out_params_len);
-            break;
-        case PSA_KEY_AGREEMENT:
-            ok = psa_key_agreement_wrapper(in_params, in_params_len,
-                                           &out_params, &out_params_len);
-            break;
-        case PSA_KEY_AGREEMENT_IOP_ABORT:
-            ok = psa_key_agreement_iop_abort_wrapper(in_params, in_params_len,
-                                                     &out_params, &out_params_len);
-            break;
-        case PSA_KEY_AGREEMENT_IOP_COMPLETE:
-            ok = psa_key_agreement_iop_complete_wrapper(in_params, in_params_len,
-                                                        &out_params, &out_params_len);
-            break;
-        case PSA_KEY_AGREEMENT_IOP_GET_NUM_OPS:
-            ok = psa_key_agreement_iop_get_num_ops_wrapper(in_params, in_params_len,
-                                                           &out_params, &out_params_len);
-            break;
-        case PSA_KEY_AGREEMENT_IOP_SETUP:
-            ok = psa_key_agreement_iop_setup_wrapper(in_params, in_params_len,
-                                                     &out_params, &out_params_len);
-            break;
-        case PSA_KEY_DERIVATION_ABORT:
-            ok = psa_key_derivation_abort_wrapper(in_params, in_params_len,
-                                                  &out_params, &out_params_len);
-            break;
-        case PSA_KEY_DERIVATION_GET_CAPACITY:
-            ok = psa_key_derivation_get_capacity_wrapper(in_params, in_params_len,
-                                                         &out_params, &out_params_len);
-            break;
-        case PSA_KEY_DERIVATION_INPUT_BYTES:
-            ok = psa_key_derivation_input_bytes_wrapper(in_params, in_params_len,
-                                                        &out_params, &out_params_len);
-            break;
-        case PSA_KEY_DERIVATION_INPUT_INTEGER:
-            ok = psa_key_derivation_input_integer_wrapper(in_params, in_params_len,
-                                                          &out_params, &out_params_len);
-            break;
-        case PSA_KEY_DERIVATION_INPUT_KEY:
-            ok = psa_key_derivation_input_key_wrapper(in_params, in_params_len,
-                                                      &out_params, &out_params_len);
-            break;
-        case PSA_KEY_DERIVATION_KEY_AGREEMENT:
-            ok = psa_key_derivation_key_agreement_wrapper(in_params, in_params_len,
-                                                          &out_params, &out_params_len);
-            break;
-        case PSA_KEY_DERIVATION_OUTPUT_BYTES:
-            ok = psa_key_derivation_output_bytes_wrapper(in_params, in_params_len,
-                                                         &out_params, &out_params_len);
-            break;
-        case PSA_KEY_DERIVATION_OUTPUT_KEY:
-            ok = psa_key_derivation_output_key_wrapper(in_params, in_params_len,
-                                                       &out_params, &out_params_len);
-            break;
-        case PSA_KEY_DERIVATION_OUTPUT_KEY_CUSTOM:
-            ok = psa_key_derivation_output_key_custom_wrapper(in_params, in_params_len,
-                                                              &out_params, &out_params_len);
-            break;
-        case PSA_KEY_DERIVATION_SET_CAPACITY:
-            ok = psa_key_derivation_set_capacity_wrapper(in_params, in_params_len,
-                                                         &out_params, &out_params_len);
-            break;
-        case PSA_KEY_DERIVATION_SETUP:
-            ok = psa_key_derivation_setup_wrapper(in_params, in_params_len,
-                                                  &out_params, &out_params_len);
-            break;
-        case PSA_MAC_ABORT:
-            ok = psa_mac_abort_wrapper(in_params, in_params_len,
-                                       &out_params, &out_params_len);
-            break;
-        case PSA_MAC_COMPUTE:
-            ok = psa_mac_compute_wrapper(in_params, in_params_len,
-                                         &out_params, &out_params_len);
-            break;
-        case PSA_MAC_SIGN_FINISH:
-            ok = psa_mac_sign_finish_wrapper(in_params, in_params_len,
-                                             &out_params, &out_params_len);
-            break;
-        case PSA_MAC_SIGN_SETUP:
-            ok = psa_mac_sign_setup_wrapper(in_params, in_params_len,
-                                            &out_params, &out_params_len);
-            break;
-        case PSA_MAC_UPDATE:
-            ok = psa_mac_update_wrapper(in_params, in_params_len,
-                                        &out_params, &out_params_len);
-            break;
-        case PSA_MAC_VERIFY:
-            ok = psa_mac_verify_wrapper(in_params, in_params_len,
-                                        &out_params, &out_params_len);
-            break;
-        case PSA_MAC_VERIFY_FINISH:
-            ok = psa_mac_verify_finish_wrapper(in_params, in_params_len,
-                                               &out_params, &out_params_len);
-            break;
-        case PSA_MAC_VERIFY_SETUP:
-            ok = psa_mac_verify_setup_wrapper(in_params, in_params_len,
-                                              &out_params, &out_params_len);
-            break;
-        case PSA_PURGE_KEY:
-            ok = psa_purge_key_wrapper(in_params, in_params_len,
-                                       &out_params, &out_params_len);
-            break;
-        case PSA_RAW_KEY_AGREEMENT:
-            ok = psa_raw_key_agreement_wrapper(in_params, in_params_len,
-                                               &out_params, &out_params_len);
-            break;
-        case PSA_RESET_KEY_ATTRIBUTES:
-            ok = psa_reset_key_attributes_wrapper(in_params, in_params_len,
-                                                  &out_params, &out_params_len);
-            break;
-        case PSA_SIGN_HASH:
-            ok = psa_sign_hash_wrapper(in_params, in_params_len,
-                                       &out_params, &out_params_len);
-            break;
-        case PSA_SIGN_HASH_ABORT:
-            ok = psa_sign_hash_abort_wrapper(in_params, in_params_len,
-                                             &out_params, &out_params_len);
-            break;
-        case PSA_SIGN_HASH_COMPLETE:
-            ok = psa_sign_hash_complete_wrapper(in_params, in_params_len,
-                                                &out_params, &out_params_len);
-            break;
-        case PSA_SIGN_HASH_GET_NUM_OPS:
-            ok = psa_sign_hash_get_num_ops_wrapper(in_params, in_params_len,
-                                                   &out_params, &out_params_len);
-            break;
-        case PSA_SIGN_HASH_START:
-            ok = psa_sign_hash_start_wrapper(in_params, in_params_len,
-                                             &out_params, &out_params_len);
-            break;
-        case PSA_SIGN_MESSAGE:
-            ok = psa_sign_message_wrapper(in_params, in_params_len,
-                                          &out_params, &out_params_len);
-            break;
-        case PSA_VERIFY_HASH:
-            ok = psa_verify_hash_wrapper(in_params, in_params_len,
-                                         &out_params, &out_params_len);
-            break;
-        case PSA_VERIFY_HASH_ABORT:
-            ok = psa_verify_hash_abort_wrapper(in_params, in_params_len,
-                                               &out_params, &out_params_len);
-            break;
-        case PSA_VERIFY_HASH_COMPLETE:
-            ok = psa_verify_hash_complete_wrapper(in_params, in_params_len,
-                                                  &out_params, &out_params_len);
-            break;
-        case PSA_VERIFY_HASH_GET_NUM_OPS:
-            ok = psa_verify_hash_get_num_ops_wrapper(in_params, in_params_len,
-                                                     &out_params, &out_params_len);
-            break;
-        case PSA_VERIFY_HASH_START:
-            ok = psa_verify_hash_start_wrapper(in_params, in_params_len,
-                                               &out_params, &out_params_len);
-            break;
-        case PSA_VERIFY_MESSAGE:
-            ok = psa_verify_message_wrapper(in_params, in_params_len,
-                                            &out_params, &out_params_len);
-            break;
-    }
-
-    free(in_params);
-
-    if (out_params_len > msg.out_size[1]) {
-        fprintf(stderr, "unable to write %zu bytes into buffer of %zu bytes\n",
-                out_params_len, msg.out_size[1]);
-        exit(1);
-    }
-
-    /* Write the exact amount of data we're returning */
-    psa_write(msg.handle, 0, &out_params_len, sizeof(out_params_len));
-
-    /* And write the data itself */
-    if (out_params_len) {
-        psa_write(msg.handle, 1, out_params, out_params_len);
-    }
-
-    free(out_params);
-
-    return ok ? PSA_SUCCESS : PSA_ERROR_GENERIC_ERROR;
-}
-
-void psa_crypto_close(void)
-{
-    psa_sim_serialize_reset();
-}
diff --git a/psasim/src/psa_sim_generate.pl b/psasim/src/psa_sim_generate.pl
index 0f4c86f..e993f4f 100755
--- a/psasim/src/psa_sim_generate.pl
+++ b/psasim/src/psa_sim_generate.pl
@@ -1052,7 +1052,7 @@
 
 sub get_functions
 {
-    my $header_dir = 'tf-psa-crypto/include';
+    my $header_dir = 'include';
     my $src = "";
     for my $header_file ('psa/crypto.h', 'psa/crypto_extra.h') {
         local *HEADER;
diff --git a/psasim/src/psa_sim_serialise.c b/psasim/src/psa_sim_serialise.c
deleted file mode 100644
index 0dde934..0000000
--- a/psasim/src/psa_sim_serialise.c
+++ /dev/null
@@ -1,1765 +0,0 @@
-/**
- * \file psa_sim_serialise.c
- *
- * \brief Rough-and-ready serialisation and deserialisation for the PSA Crypto simulator
- */
-
-/*
- *  Copyright The Mbed TLS Contributors
- *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
- */
-
-#include "psa_sim_serialise.h"
-#include "util.h"
-#include <stdlib.h>
-#include <string.h>
-
-/* Basic idea:
- *
- * All arguments to a function will be serialised into a single buffer to
- * be sent to the server with the PSA crypto function to be called.
- *
- * All returned data (the function's return value and any values returned
- * via `out` parameters) will similarly be serialised into a buffer to be
- * sent back to the client from the server.
- *
- * For each data type foo (e.g. int, size_t, psa_algorithm_t, but also "buffer"
- * where "buffer" is a (uint8_t *, size_t) pair, we have a pair of functions,
- * psasim_serialise_foo() and psasim_deserialise_foo().
- *
- * We also have psasim_serialise_foo_needs() functions, which return a
- * size_t giving the number of bytes that serialising that instance of that
- * type will need. This allows callers to size buffers for serialisation.
- *
- * Each serialised buffer starts with a version byte, bytes that indicate
- * the size of basic C types, and four bytes that indicate the endianness
- * (to avoid incompatibilities if we ever run this over a network - we are
- * not aiming for universality, just for correctness and simplicity).
- *
- * Most types are serialised as a fixed-size (per type) octet string, with
- * no type indication. This is acceptable as (a) this is for the test PSA crypto
- * simulator only, not production, and (b) these functions are called by
- * code that itself is written by script.
- *
- * We also want to keep serialised data reasonably compact as communication
- * between client and server goes in messages of less than 200 bytes each.
- *
- * Many serialisation functions can be created by a script; an exemplar Perl
- * script is included. It is not hooked into the build and so must be run
- * manually, but is expected to be replaced by a Python script in due course.
- * Types that can have their functions created by script include plain old C
- * data types (e.g. int), types typedef'd to those, and even structures that
- * don't contain pointers.
- */
-
-/* include/psa/crypto_platform.h:typedef uint32_t mbedtls_psa_client_handle_t;
- * but we don't get it on server builds, so redefine it here with a unique type name
- */
-typedef uint32_t psasim_client_handle_t;
-
-typedef struct psasim_operation_s {
-    psasim_client_handle_t handle;
-} psasim_operation_t;
-
-#define MAX_LIVE_HANDLES_PER_CLASS   100        /* this many slots */
-
-static psa_hash_operation_t hash_operations[
-    MAX_LIVE_HANDLES_PER_CLASS];
-static psasim_client_handle_t hash_operation_handles[
-    MAX_LIVE_HANDLES_PER_CLASS];
-static psasim_client_handle_t next_hash_operation_handle = 1;
-
-/* Get a free slot */
-static ssize_t allocate_hash_operation_slot(void)
-{
-    psasim_client_handle_t handle = next_hash_operation_handle++;
-    if (next_hash_operation_handle == 0) {      /* wrapped around */
-        FATAL("Hash operation handle wrapped");
-    }
-
-    for (ssize_t i = 0; i < MAX_LIVE_HANDLES_PER_CLASS; i++) {
-        if (hash_operation_handles[i] == 0) {
-            hash_operation_handles[i] = handle;
-            return i;
-        }
-    }
-
-    ERROR("All slots are currently used. Unable to allocate a new one.");
-
-    return -1;  /* all in use */
-}
-
-/* Find the slot given the handle */
-static ssize_t find_hash_slot_by_handle(psasim_client_handle_t handle)
-{
-    for (ssize_t i = 0; i < MAX_LIVE_HANDLES_PER_CLASS; i++) {
-        if (hash_operation_handles[i] == handle) {
-            return i;
-        }
-    }
-
-    ERROR("Unable to find slot by handle %u", handle);
-
-    return -1;  /* not found */
-}
-
-static psa_aead_operation_t aead_operations[
-    MAX_LIVE_HANDLES_PER_CLASS];
-static psasim_client_handle_t aead_operation_handles[
-    MAX_LIVE_HANDLES_PER_CLASS];
-static psasim_client_handle_t next_aead_operation_handle = 1;
-
-/* Get a free slot */
-static ssize_t allocate_aead_operation_slot(void)
-{
-    psasim_client_handle_t handle = next_aead_operation_handle++;
-    if (next_aead_operation_handle == 0) {      /* wrapped around */
-        FATAL("Aead operation handle wrapped");
-    }
-
-    for (ssize_t i = 0; i < MAX_LIVE_HANDLES_PER_CLASS; i++) {
-        if (aead_operation_handles[i] == 0) {
-            aead_operation_handles[i] = handle;
-            return i;
-        }
-    }
-
-    ERROR("All slots are currently used. Unable to allocate a new one.");
-
-    return -1;  /* all in use */
-}
-
-/* Find the slot given the handle */
-static ssize_t find_aead_slot_by_handle(psasim_client_handle_t handle)
-{
-    for (ssize_t i = 0; i < MAX_LIVE_HANDLES_PER_CLASS; i++) {
-        if (aead_operation_handles[i] == handle) {
-            return i;
-        }
-    }
-
-    ERROR("Unable to find slot by handle %u", handle);
-
-    return -1;  /* not found */
-}
-
-static psa_mac_operation_t mac_operations[
-    MAX_LIVE_HANDLES_PER_CLASS];
-static psasim_client_handle_t mac_operation_handles[
-    MAX_LIVE_HANDLES_PER_CLASS];
-static psasim_client_handle_t next_mac_operation_handle = 1;
-
-/* Get a free slot */
-static ssize_t allocate_mac_operation_slot(void)
-{
-    psasim_client_handle_t handle = next_mac_operation_handle++;
-    if (next_mac_operation_handle == 0) {      /* wrapped around */
-        FATAL("Mac operation handle wrapped");
-    }
-
-    for (ssize_t i = 0; i < MAX_LIVE_HANDLES_PER_CLASS; i++) {
-        if (mac_operation_handles[i] == 0) {
-            mac_operation_handles[i] = handle;
-            return i;
-        }
-    }
-
-    ERROR("All slots are currently used. Unable to allocate a new one.");
-
-    return -1;  /* all in use */
-}
-
-/* Find the slot given the handle */
-static ssize_t find_mac_slot_by_handle(psasim_client_handle_t handle)
-{
-    for (ssize_t i = 0; i < MAX_LIVE_HANDLES_PER_CLASS; i++) {
-        if (mac_operation_handles[i] == handle) {
-            return i;
-        }
-    }
-
-    ERROR("Unable to find slot by handle %u", handle);
-
-    return -1;  /* not found */
-}
-
-static psa_cipher_operation_t cipher_operations[
-    MAX_LIVE_HANDLES_PER_CLASS];
-static psasim_client_handle_t cipher_operation_handles[
-    MAX_LIVE_HANDLES_PER_CLASS];
-static psasim_client_handle_t next_cipher_operation_handle = 1;
-
-/* Get a free slot */
-static ssize_t allocate_cipher_operation_slot(void)
-{
-    psasim_client_handle_t handle = next_cipher_operation_handle++;
-    if (next_cipher_operation_handle == 0) {      /* wrapped around */
-        FATAL("Cipher operation handle wrapped");
-    }
-
-    for (ssize_t i = 0; i < MAX_LIVE_HANDLES_PER_CLASS; i++) {
-        if (cipher_operation_handles[i] == 0) {
-            cipher_operation_handles[i] = handle;
-            return i;
-        }
-    }
-
-    ERROR("All slots are currently used. Unable to allocate a new one.");
-
-    return -1;  /* all in use */
-}
-
-/* Find the slot given the handle */
-static ssize_t find_cipher_slot_by_handle(psasim_client_handle_t handle)
-{
-    for (ssize_t i = 0; i < MAX_LIVE_HANDLES_PER_CLASS; i++) {
-        if (cipher_operation_handles[i] == handle) {
-            return i;
-        }
-    }
-
-    ERROR("Unable to find slot by handle %u", handle);
-
-    return -1;  /* not found */
-}
-
-static psa_key_derivation_operation_t key_derivation_operations[
-    MAX_LIVE_HANDLES_PER_CLASS];
-static psasim_client_handle_t key_derivation_operation_handles[
-    MAX_LIVE_HANDLES_PER_CLASS];
-static psasim_client_handle_t next_key_derivation_operation_handle = 1;
-
-/* Get a free slot */
-static ssize_t allocate_key_derivation_operation_slot(void)
-{
-    psasim_client_handle_t handle = next_key_derivation_operation_handle++;
-    if (next_key_derivation_operation_handle == 0) {      /* wrapped around */
-        FATAL("Key_derivation operation handle wrapped");
-    }
-
-    for (ssize_t i = 0; i < MAX_LIVE_HANDLES_PER_CLASS; i++) {
-        if (key_derivation_operation_handles[i] == 0) {
-            key_derivation_operation_handles[i] = handle;
-            return i;
-        }
-    }
-
-    ERROR("All slots are currently used. Unable to allocate a new one.");
-
-    return -1;  /* all in use */
-}
-
-/* Find the slot given the handle */
-static ssize_t find_key_derivation_slot_by_handle(psasim_client_handle_t handle)
-{
-    for (ssize_t i = 0; i < MAX_LIVE_HANDLES_PER_CLASS; i++) {
-        if (key_derivation_operation_handles[i] == handle) {
-            return i;
-        }
-    }
-
-    ERROR("Unable to find slot by handle %u", handle);
-
-    return -1;  /* not found */
-}
-
-static psa_sign_hash_interruptible_operation_t sign_hash_interruptible_operations[
-    MAX_LIVE_HANDLES_PER_CLASS];
-static psasim_client_handle_t sign_hash_interruptible_operation_handles[
-    MAX_LIVE_HANDLES_PER_CLASS];
-static psasim_client_handle_t next_sign_hash_interruptible_operation_handle = 1;
-
-/* Get a free slot */
-static ssize_t allocate_sign_hash_interruptible_operation_slot(void)
-{
-    psasim_client_handle_t handle = next_sign_hash_interruptible_operation_handle++;
-    if (next_sign_hash_interruptible_operation_handle == 0) {      /* wrapped around */
-        FATAL("Sign_hash_interruptible operation handle wrapped");
-    }
-
-    for (ssize_t i = 0; i < MAX_LIVE_HANDLES_PER_CLASS; i++) {
-        if (sign_hash_interruptible_operation_handles[i] == 0) {
-            sign_hash_interruptible_operation_handles[i] = handle;
-            return i;
-        }
-    }
-
-    ERROR("All slots are currently used. Unable to allocate a new one.");
-
-    return -1;  /* all in use */
-}
-
-/* Find the slot given the handle */
-static ssize_t find_sign_hash_interruptible_slot_by_handle(psasim_client_handle_t handle)
-{
-    for (ssize_t i = 0; i < MAX_LIVE_HANDLES_PER_CLASS; i++) {
-        if (sign_hash_interruptible_operation_handles[i] == handle) {
-            return i;
-        }
-    }
-
-    ERROR("Unable to find slot by handle %u", handle);
-
-    return -1;  /* not found */
-}
-
-static psa_verify_hash_interruptible_operation_t verify_hash_interruptible_operations[
-    MAX_LIVE_HANDLES_PER_CLASS];
-static psasim_client_handle_t verify_hash_interruptible_operation_handles[
-    MAX_LIVE_HANDLES_PER_CLASS];
-static psasim_client_handle_t next_verify_hash_interruptible_operation_handle = 1;
-
-/* Get a free slot */
-static ssize_t allocate_verify_hash_interruptible_operation_slot(void)
-{
-    psasim_client_handle_t handle = next_verify_hash_interruptible_operation_handle++;
-    if (next_verify_hash_interruptible_operation_handle == 0) {      /* wrapped around */
-        FATAL("Verify_hash_interruptible operation handle wrapped");
-    }
-
-    for (ssize_t i = 0; i < MAX_LIVE_HANDLES_PER_CLASS; i++) {
-        if (verify_hash_interruptible_operation_handles[i] == 0) {
-            verify_hash_interruptible_operation_handles[i] = handle;
-            return i;
-        }
-    }
-
-    ERROR("All slots are currently used. Unable to allocate a new one.");
-
-    return -1;  /* all in use */
-}
-
-/* Find the slot given the handle */
-static ssize_t find_verify_hash_interruptible_slot_by_handle(psasim_client_handle_t handle)
-{
-    for (ssize_t i = 0; i < MAX_LIVE_HANDLES_PER_CLASS; i++) {
-        if (verify_hash_interruptible_operation_handles[i] == handle) {
-            return i;
-        }
-    }
-
-    ERROR("Unable to find slot by handle %u", handle);
-
-    return -1;  /* not found */
-}
-
-size_t psasim_serialise_begin_needs(void)
-{
-    /* The serialisation buffer will
-     * start with a byte of 0 to indicate version 0,
-     * then have 1 byte each for length of int, long, void *,
-     * then have 4 bytes to indicate endianness. */
-    return 4 + sizeof(uint32_t);
-}
-
-int psasim_serialise_begin(uint8_t **pos, size_t *remaining)
-{
-    uint32_t endian = 0x1234;
-
-    if (*remaining < 4 + sizeof(endian)) {
-        return 0;
-    }
-
-    *(*pos)++ = 0;      /* version */
-    *(*pos)++ = (uint8_t) sizeof(int);
-    *(*pos)++ = (uint8_t) sizeof(long);
-    *(*pos)++ = (uint8_t) sizeof(void *);
-
-    memcpy(*pos, &endian, sizeof(endian));
-
-    *pos += sizeof(endian);
-
-    return 1;
-}
-
-int psasim_deserialise_begin(uint8_t **pos, size_t *remaining)
-{
-    uint8_t version = 255;
-    uint8_t int_size = 0;
-    uint8_t long_size = 0;
-    uint8_t ptr_size = 0;
-    uint32_t endian;
-
-    if (*remaining < 4 + sizeof(endian)) {
-        return 0;
-    }
-
-    memcpy(&version, (*pos)++, sizeof(version));
-    if (version != 0) {
-        return 0;
-    }
-
-    memcpy(&int_size, (*pos)++, sizeof(int_size));
-    if (int_size != sizeof(int)) {
-        return 0;
-    }
-
-    memcpy(&long_size, (*pos)++, sizeof(long_size));
-    if (long_size != sizeof(long)) {
-        return 0;
-    }
-
-    memcpy(&ptr_size, (*pos)++, sizeof(ptr_size));
-    if (ptr_size != sizeof(void *)) {
-        return 0;
-    }
-
-    *remaining -= 4;
-
-    memcpy(&endian, *pos, sizeof(endian));
-    if (endian != 0x1234) {
-        return 0;
-    }
-
-    *pos += sizeof(endian);
-    *remaining -= sizeof(endian);
-
-    return 1;
-}
-
-size_t psasim_serialise_unsigned_int_needs(
-    unsigned int value)
-{
-    return sizeof(value);
-}
-
-int psasim_serialise_unsigned_int(uint8_t **pos,
-                                  size_t *remaining,
-                                  unsigned int value)
-{
-    if (*remaining < sizeof(value)) {
-        return 0;
-    }
-
-    memcpy(*pos, &value, sizeof(value));
-    *pos += sizeof(value);
-
-    return 1;
-}
-
-int psasim_deserialise_unsigned_int(uint8_t **pos,
-                                    size_t *remaining,
-                                    unsigned int *value)
-{
-    if (*remaining < sizeof(*value)) {
-        return 0;
-    }
-
-    memcpy(value, *pos, sizeof(*value));
-
-    *pos += sizeof(*value);
-    *remaining -= sizeof(*value);
-
-    return 1;
-}
-
-size_t psasim_serialise_int_needs(
-    int value)
-{
-    return sizeof(value);
-}
-
-int psasim_serialise_int(uint8_t **pos,
-                         size_t *remaining,
-                         int value)
-{
-    if (*remaining < sizeof(value)) {
-        return 0;
-    }
-
-    memcpy(*pos, &value, sizeof(value));
-    *pos += sizeof(value);
-
-    return 1;
-}
-
-int psasim_deserialise_int(uint8_t **pos,
-                           size_t *remaining,
-                           int *value)
-{
-    if (*remaining < sizeof(*value)) {
-        return 0;
-    }
-
-    memcpy(value, *pos, sizeof(*value));
-
-    *pos += sizeof(*value);
-    *remaining -= sizeof(*value);
-
-    return 1;
-}
-
-size_t psasim_serialise_size_t_needs(
-    size_t value)
-{
-    return sizeof(value);
-}
-
-int psasim_serialise_size_t(uint8_t **pos,
-                            size_t *remaining,
-                            size_t value)
-{
-    if (*remaining < sizeof(value)) {
-        return 0;
-    }
-
-    memcpy(*pos, &value, sizeof(value));
-    *pos += sizeof(value);
-
-    return 1;
-}
-
-int psasim_deserialise_size_t(uint8_t **pos,
-                              size_t *remaining,
-                              size_t *value)
-{
-    if (*remaining < sizeof(*value)) {
-        return 0;
-    }
-
-    memcpy(value, *pos, sizeof(*value));
-
-    *pos += sizeof(*value);
-    *remaining -= sizeof(*value);
-
-    return 1;
-}
-
-size_t psasim_serialise_uint16_t_needs(
-    uint16_t value)
-{
-    return sizeof(value);
-}
-
-int psasim_serialise_uint16_t(uint8_t **pos,
-                              size_t *remaining,
-                              uint16_t value)
-{
-    if (*remaining < sizeof(value)) {
-        return 0;
-    }
-
-    memcpy(*pos, &value, sizeof(value));
-    *pos += sizeof(value);
-
-    return 1;
-}
-
-int psasim_deserialise_uint16_t(uint8_t **pos,
-                                size_t *remaining,
-                                uint16_t *value)
-{
-    if (*remaining < sizeof(*value)) {
-        return 0;
-    }
-
-    memcpy(value, *pos, sizeof(*value));
-
-    *pos += sizeof(*value);
-    *remaining -= sizeof(*value);
-
-    return 1;
-}
-
-size_t psasim_serialise_uint32_t_needs(
-    uint32_t value)
-{
-    return sizeof(value);
-}
-
-int psasim_serialise_uint32_t(uint8_t **pos,
-                              size_t *remaining,
-                              uint32_t value)
-{
-    if (*remaining < sizeof(value)) {
-        return 0;
-    }
-
-    memcpy(*pos, &value, sizeof(value));
-    *pos += sizeof(value);
-
-    return 1;
-}
-
-int psasim_deserialise_uint32_t(uint8_t **pos,
-                                size_t *remaining,
-                                uint32_t *value)
-{
-    if (*remaining < sizeof(*value)) {
-        return 0;
-    }
-
-    memcpy(value, *pos, sizeof(*value));
-
-    *pos += sizeof(*value);
-    *remaining -= sizeof(*value);
-
-    return 1;
-}
-
-size_t psasim_serialise_uint64_t_needs(
-    uint64_t value)
-{
-    return sizeof(value);
-}
-
-int psasim_serialise_uint64_t(uint8_t **pos,
-                              size_t *remaining,
-                              uint64_t value)
-{
-    if (*remaining < sizeof(value)) {
-        return 0;
-    }
-
-    memcpy(*pos, &value, sizeof(value));
-    *pos += sizeof(value);
-
-    return 1;
-}
-
-int psasim_deserialise_uint64_t(uint8_t **pos,
-                                size_t *remaining,
-                                uint64_t *value)
-{
-    if (*remaining < sizeof(*value)) {
-        return 0;
-    }
-
-    memcpy(value, *pos, sizeof(*value));
-
-    *pos += sizeof(*value);
-    *remaining -= sizeof(*value);
-
-    return 1;
-}
-
-size_t psasim_serialise_buffer_needs(const uint8_t *buffer, size_t buffer_size)
-{
-    (void) buffer;
-    return sizeof(buffer_size) + buffer_size;
-}
-
-int psasim_serialise_buffer(uint8_t **pos,
-                            size_t *remaining,
-                            const uint8_t *buffer,
-                            size_t buffer_length)
-{
-    if (*remaining < sizeof(buffer_length) + buffer_length) {
-        return 0;
-    }
-
-    memcpy(*pos, &buffer_length, sizeof(buffer_length));
-    *pos += sizeof(buffer_length);
-
-    if (buffer_length > 0) {    // To be able to serialise (NULL, 0)
-        memcpy(*pos, buffer, buffer_length);
-        *pos += buffer_length;
-    }
-
-    return 1;
-}
-
-int psasim_deserialise_buffer(uint8_t **pos,
-                              size_t *remaining,
-                              uint8_t **buffer,
-                              size_t *buffer_length)
-{
-    if (*remaining < sizeof(*buffer_length)) {
-        return 0;
-    }
-
-    memcpy(buffer_length, *pos, sizeof(*buffer_length));
-
-    *pos += sizeof(buffer_length);
-    *remaining -= sizeof(buffer_length);
-
-    if (*buffer_length == 0) {          // Deserialise (NULL, 0)
-        *buffer = NULL;
-        return 1;
-    }
-
-    if (*remaining < *buffer_length) {
-        return 0;
-    }
-
-    uint8_t *data = malloc(*buffer_length);
-    if (data == NULL) {
-        return 0;
-    }
-
-    memcpy(data, *pos, *buffer_length);
-    *pos += *buffer_length;
-    *remaining -= *buffer_length;
-
-    *buffer = data;
-
-    return 1;
-}
-
-/* When the client is deserialising a buffer returned from the server, it needs
- * to use this function to deserialised the  returned buffer. It should use the
- * usual \c psasim_serialise_buffer() function to serialise the outbound
- * buffer. */
-int psasim_deserialise_return_buffer(uint8_t **pos,
-                                     size_t *remaining,
-                                     uint8_t *buffer,
-                                     size_t buffer_length)
-{
-    if (*remaining < sizeof(buffer_length)) {
-        return 0;
-    }
-
-    size_t length_check;
-
-    memcpy(&length_check, *pos, sizeof(buffer_length));
-
-    *pos += sizeof(buffer_length);
-    *remaining -= sizeof(buffer_length);
-
-    if (buffer_length != length_check) {        // Make sure we're sent back the same we sent to the server
-        return 0;
-    }
-
-    if (length_check == 0) {          // Deserialise (NULL, 0)
-        return 1;
-    }
-
-    if (*remaining < buffer_length) {
-        return 0;
-    }
-
-    memcpy(buffer, *pos, buffer_length);
-    *pos += buffer_length;
-    *remaining -= buffer_length;
-
-    return 1;
-}
-
-size_t psasim_serialise_psa_custom_key_parameters_t_needs(
-    psa_custom_key_parameters_t value)
-{
-    return sizeof(value);
-}
-
-int psasim_serialise_psa_custom_key_parameters_t(uint8_t **pos,
-                                                 size_t *remaining,
-                                                 psa_custom_key_parameters_t value)
-{
-    if (*remaining < sizeof(value)) {
-        return 0;
-    }
-
-    memcpy(*pos, &value, sizeof(value));
-    *pos += sizeof(value);
-
-    return 1;
-}
-
-int psasim_deserialise_psa_custom_key_parameters_t(uint8_t **pos,
-                                                   size_t *remaining,
-                                                   psa_custom_key_parameters_t *value)
-{
-    if (*remaining < sizeof(*value)) {
-        return 0;
-    }
-
-    memcpy(value, *pos, sizeof(*value));
-
-    *pos += sizeof(*value);
-    *remaining -= sizeof(*value);
-
-    return 1;
-}
-
-size_t psasim_serialise_psa_status_t_needs(
-    psa_status_t value)
-{
-    return psasim_serialise_int_needs(value);
-}
-
-int psasim_serialise_psa_status_t(uint8_t **pos,
-                                  size_t *remaining,
-                                  psa_status_t value)
-{
-    return psasim_serialise_int(pos, remaining, value);
-}
-
-int psasim_deserialise_psa_status_t(uint8_t **pos,
-                                    size_t *remaining,
-                                    psa_status_t *value)
-{
-    return psasim_deserialise_int(pos, remaining, value);
-}
-
-size_t psasim_serialise_psa_algorithm_t_needs(
-    psa_algorithm_t value)
-{
-    return psasim_serialise_unsigned_int_needs(value);
-}
-
-int psasim_serialise_psa_algorithm_t(uint8_t **pos,
-                                     size_t *remaining,
-                                     psa_algorithm_t value)
-{
-    return psasim_serialise_unsigned_int(pos, remaining, value);
-}
-
-int psasim_deserialise_psa_algorithm_t(uint8_t **pos,
-                                       size_t *remaining,
-                                       psa_algorithm_t *value)
-{
-    return psasim_deserialise_unsigned_int(pos, remaining, value);
-}
-
-size_t psasim_serialise_psa_key_derivation_step_t_needs(
-    psa_key_derivation_step_t value)
-{
-    return psasim_serialise_uint16_t_needs(value);
-}
-
-int psasim_serialise_psa_key_derivation_step_t(uint8_t **pos,
-                                               size_t *remaining,
-                                               psa_key_derivation_step_t value)
-{
-    return psasim_serialise_uint16_t(pos, remaining, value);
-}
-
-int psasim_deserialise_psa_key_derivation_step_t(uint8_t **pos,
-                                                 size_t *remaining,
-                                                 psa_key_derivation_step_t *value)
-{
-    return psasim_deserialise_uint16_t(pos, remaining, value);
-}
-
-size_t psasim_serialise_psa_hash_operation_t_needs(
-    psa_hash_operation_t value)
-{
-    return sizeof(value);
-}
-
-int psasim_serialise_psa_hash_operation_t(uint8_t **pos,
-                                          size_t *remaining,
-                                          psa_hash_operation_t value)
-{
-    if (*remaining < sizeof(value)) {
-        return 0;
-    }
-
-    memcpy(*pos, &value, sizeof(value));
-    *pos += sizeof(value);
-
-    return 1;
-}
-
-int psasim_deserialise_psa_hash_operation_t(uint8_t **pos,
-                                            size_t *remaining,
-                                            psa_hash_operation_t *value)
-{
-    if (*remaining < sizeof(*value)) {
-        return 0;
-    }
-
-    memcpy(value, *pos, sizeof(*value));
-
-    *pos += sizeof(*value);
-    *remaining -= sizeof(*value);
-
-    return 1;
-}
-
-size_t psasim_server_serialise_psa_hash_operation_t_needs(
-    psa_hash_operation_t *operation)
-{
-    (void) operation;
-
-    /* We will actually return a handle */
-    return sizeof(psasim_operation_t);
-}
-
-int psasim_server_serialise_psa_hash_operation_t(uint8_t **pos,
-                                                 size_t *remaining,
-                                                 psa_hash_operation_t *operation,
-                                                 int completed)
-{
-    psasim_operation_t client_operation;
-
-    if (*remaining < sizeof(client_operation)) {
-        return 0;
-    }
-
-    ssize_t slot = operation - hash_operations;
-
-    if (completed) {
-        memset(&hash_operations[slot],
-               0,
-               sizeof(psa_hash_operation_t));
-        hash_operation_handles[slot] = 0;
-    }
-
-    client_operation.handle = hash_operation_handles[slot];
-
-    memcpy(*pos, &client_operation, sizeof(client_operation));
-    *pos += sizeof(client_operation);
-
-    return 1;
-}
-
-int psasim_server_deserialise_psa_hash_operation_t(uint8_t **pos,
-                                                   size_t *remaining,
-                                                   psa_hash_operation_t **operation)
-{
-    psasim_operation_t client_operation;
-
-    if (*remaining < sizeof(psasim_operation_t)) {
-        return 0;
-    }
-
-    memcpy(&client_operation, *pos, sizeof(psasim_operation_t));
-    *pos += sizeof(psasim_operation_t);
-    *remaining -= sizeof(psasim_operation_t);
-
-    ssize_t slot;
-    if (client_operation.handle == 0) {         /* We need a new handle */
-        slot = allocate_hash_operation_slot();
-    } else {
-        slot = find_hash_slot_by_handle(client_operation.handle);
-    }
-
-    if (slot < 0) {
-        return 0;
-    }
-
-    *operation = &hash_operations[slot];
-
-    return 1;
-}
-
-size_t psasim_serialise_psa_aead_operation_t_needs(
-    psa_aead_operation_t value)
-{
-    return sizeof(value);
-}
-
-int psasim_serialise_psa_aead_operation_t(uint8_t **pos,
-                                          size_t *remaining,
-                                          psa_aead_operation_t value)
-{
-    if (*remaining < sizeof(value)) {
-        return 0;
-    }
-
-    memcpy(*pos, &value, sizeof(value));
-    *pos += sizeof(value);
-
-    return 1;
-}
-
-int psasim_deserialise_psa_aead_operation_t(uint8_t **pos,
-                                            size_t *remaining,
-                                            psa_aead_operation_t *value)
-{
-    if (*remaining < sizeof(*value)) {
-        return 0;
-    }
-
-    memcpy(value, *pos, sizeof(*value));
-
-    *pos += sizeof(*value);
-    *remaining -= sizeof(*value);
-
-    return 1;
-}
-
-size_t psasim_server_serialise_psa_aead_operation_t_needs(
-    psa_aead_operation_t *operation)
-{
-    (void) operation;
-
-    /* We will actually return a handle */
-    return sizeof(psasim_operation_t);
-}
-
-int psasim_server_serialise_psa_aead_operation_t(uint8_t **pos,
-                                                 size_t *remaining,
-                                                 psa_aead_operation_t *operation,
-                                                 int completed)
-{
-    psasim_operation_t client_operation;
-
-    if (*remaining < sizeof(client_operation)) {
-        return 0;
-    }
-
-    ssize_t slot = operation - aead_operations;
-
-    if (completed) {
-        memset(&aead_operations[slot],
-               0,
-               sizeof(psa_aead_operation_t));
-        aead_operation_handles[slot] = 0;
-    }
-
-    client_operation.handle = aead_operation_handles[slot];
-
-    memcpy(*pos, &client_operation, sizeof(client_operation));
-    *pos += sizeof(client_operation);
-
-    return 1;
-}
-
-int psasim_server_deserialise_psa_aead_operation_t(uint8_t **pos,
-                                                   size_t *remaining,
-                                                   psa_aead_operation_t **operation)
-{
-    psasim_operation_t client_operation;
-
-    if (*remaining < sizeof(psasim_operation_t)) {
-        return 0;
-    }
-
-    memcpy(&client_operation, *pos, sizeof(psasim_operation_t));
-    *pos += sizeof(psasim_operation_t);
-    *remaining -= sizeof(psasim_operation_t);
-
-    ssize_t slot;
-    if (client_operation.handle == 0) {         /* We need a new handle */
-        slot = allocate_aead_operation_slot();
-    } else {
-        slot = find_aead_slot_by_handle(client_operation.handle);
-    }
-
-    if (slot < 0) {
-        return 0;
-    }
-
-    *operation = &aead_operations[slot];
-
-    return 1;
-}
-
-size_t psasim_serialise_psa_key_attributes_t_needs(
-    psa_key_attributes_t value)
-{
-    return sizeof(value);
-}
-
-int psasim_serialise_psa_key_attributes_t(uint8_t **pos,
-                                          size_t *remaining,
-                                          psa_key_attributes_t value)
-{
-    if (*remaining < sizeof(value)) {
-        return 0;
-    }
-
-    memcpy(*pos, &value, sizeof(value));
-    *pos += sizeof(value);
-
-    return 1;
-}
-
-int psasim_deserialise_psa_key_attributes_t(uint8_t **pos,
-                                            size_t *remaining,
-                                            psa_key_attributes_t *value)
-{
-    if (*remaining < sizeof(*value)) {
-        return 0;
-    }
-
-    memcpy(value, *pos, sizeof(*value));
-
-    *pos += sizeof(*value);
-    *remaining -= sizeof(*value);
-
-    return 1;
-}
-
-size_t psasim_serialise_psa_mac_operation_t_needs(
-    psa_mac_operation_t value)
-{
-    return sizeof(value);
-}
-
-int psasim_serialise_psa_mac_operation_t(uint8_t **pos,
-                                         size_t *remaining,
-                                         psa_mac_operation_t value)
-{
-    if (*remaining < sizeof(value)) {
-        return 0;
-    }
-
-    memcpy(*pos, &value, sizeof(value));
-    *pos += sizeof(value);
-
-    return 1;
-}
-
-int psasim_deserialise_psa_mac_operation_t(uint8_t **pos,
-                                           size_t *remaining,
-                                           psa_mac_operation_t *value)
-{
-    if (*remaining < sizeof(*value)) {
-        return 0;
-    }
-
-    memcpy(value, *pos, sizeof(*value));
-
-    *pos += sizeof(*value);
-    *remaining -= sizeof(*value);
-
-    return 1;
-}
-
-size_t psasim_server_serialise_psa_mac_operation_t_needs(
-    psa_mac_operation_t *operation)
-{
-    (void) operation;
-
-    /* We will actually return a handle */
-    return sizeof(psasim_operation_t);
-}
-
-int psasim_server_serialise_psa_mac_operation_t(uint8_t **pos,
-                                                size_t *remaining,
-                                                psa_mac_operation_t *operation,
-                                                int completed)
-{
-    psasim_operation_t client_operation;
-
-    if (*remaining < sizeof(client_operation)) {
-        return 0;
-    }
-
-    ssize_t slot = operation - mac_operations;
-
-    if (completed) {
-        memset(&mac_operations[slot],
-               0,
-               sizeof(psa_mac_operation_t));
-        mac_operation_handles[slot] = 0;
-    }
-
-    client_operation.handle = mac_operation_handles[slot];
-
-    memcpy(*pos, &client_operation, sizeof(client_operation));
-    *pos += sizeof(client_operation);
-
-    return 1;
-}
-
-int psasim_server_deserialise_psa_mac_operation_t(uint8_t **pos,
-                                                  size_t *remaining,
-                                                  psa_mac_operation_t **operation)
-{
-    psasim_operation_t client_operation;
-
-    if (*remaining < sizeof(psasim_operation_t)) {
-        return 0;
-    }
-
-    memcpy(&client_operation, *pos, sizeof(psasim_operation_t));
-    *pos += sizeof(psasim_operation_t);
-    *remaining -= sizeof(psasim_operation_t);
-
-    ssize_t slot;
-    if (client_operation.handle == 0) {         /* We need a new handle */
-        slot = allocate_mac_operation_slot();
-    } else {
-        slot = find_mac_slot_by_handle(client_operation.handle);
-    }
-
-    if (slot < 0) {
-        return 0;
-    }
-
-    *operation = &mac_operations[slot];
-
-    return 1;
-}
-
-size_t psasim_serialise_psa_cipher_operation_t_needs(
-    psa_cipher_operation_t value)
-{
-    return sizeof(value);
-}
-
-int psasim_serialise_psa_cipher_operation_t(uint8_t **pos,
-                                            size_t *remaining,
-                                            psa_cipher_operation_t value)
-{
-    if (*remaining < sizeof(value)) {
-        return 0;
-    }
-
-    memcpy(*pos, &value, sizeof(value));
-    *pos += sizeof(value);
-
-    return 1;
-}
-
-int psasim_deserialise_psa_cipher_operation_t(uint8_t **pos,
-                                              size_t *remaining,
-                                              psa_cipher_operation_t *value)
-{
-    if (*remaining < sizeof(*value)) {
-        return 0;
-    }
-
-    memcpy(value, *pos, sizeof(*value));
-
-    *pos += sizeof(*value);
-    *remaining -= sizeof(*value);
-
-    return 1;
-}
-
-size_t psasim_server_serialise_psa_cipher_operation_t_needs(
-    psa_cipher_operation_t *operation)
-{
-    (void) operation;
-
-    /* We will actually return a handle */
-    return sizeof(psasim_operation_t);
-}
-
-int psasim_server_serialise_psa_cipher_operation_t(uint8_t **pos,
-                                                   size_t *remaining,
-                                                   psa_cipher_operation_t *operation,
-                                                   int completed)
-{
-    psasim_operation_t client_operation;
-
-    if (*remaining < sizeof(client_operation)) {
-        return 0;
-    }
-
-    ssize_t slot = operation - cipher_operations;
-
-    if (completed) {
-        memset(&cipher_operations[slot],
-               0,
-               sizeof(psa_cipher_operation_t));
-        cipher_operation_handles[slot] = 0;
-    }
-
-    client_operation.handle = cipher_operation_handles[slot];
-
-    memcpy(*pos, &client_operation, sizeof(client_operation));
-    *pos += sizeof(client_operation);
-
-    return 1;
-}
-
-int psasim_server_deserialise_psa_cipher_operation_t(uint8_t **pos,
-                                                     size_t *remaining,
-                                                     psa_cipher_operation_t **operation)
-{
-    psasim_operation_t client_operation;
-
-    if (*remaining < sizeof(psasim_operation_t)) {
-        return 0;
-    }
-
-    memcpy(&client_operation, *pos, sizeof(psasim_operation_t));
-    *pos += sizeof(psasim_operation_t);
-    *remaining -= sizeof(psasim_operation_t);
-
-    ssize_t slot;
-    if (client_operation.handle == 0) {         /* We need a new handle */
-        slot = allocate_cipher_operation_slot();
-    } else {
-        slot = find_cipher_slot_by_handle(client_operation.handle);
-    }
-
-    if (slot < 0) {
-        return 0;
-    }
-
-    *operation = &cipher_operations[slot];
-
-    return 1;
-}
-
-size_t psasim_serialise_psa_key_derivation_operation_t_needs(
-    psa_key_derivation_operation_t value)
-{
-    return sizeof(value);
-}
-
-int psasim_serialise_psa_key_derivation_operation_t(uint8_t **pos,
-                                                    size_t *remaining,
-                                                    psa_key_derivation_operation_t value)
-{
-    if (*remaining < sizeof(value)) {
-        return 0;
-    }
-
-    memcpy(*pos, &value, sizeof(value));
-    *pos += sizeof(value);
-
-    return 1;
-}
-
-int psasim_deserialise_psa_key_derivation_operation_t(uint8_t **pos,
-                                                      size_t *remaining,
-                                                      psa_key_derivation_operation_t *value)
-{
-    if (*remaining < sizeof(*value)) {
-        return 0;
-    }
-
-    memcpy(value, *pos, sizeof(*value));
-
-    *pos += sizeof(*value);
-    *remaining -= sizeof(*value);
-
-    return 1;
-}
-
-size_t psasim_server_serialise_psa_key_derivation_operation_t_needs(
-    psa_key_derivation_operation_t *operation)
-{
-    (void) operation;
-
-    /* We will actually return a handle */
-    return sizeof(psasim_operation_t);
-}
-
-int psasim_server_serialise_psa_key_derivation_operation_t(uint8_t **pos,
-                                                           size_t *remaining,
-                                                           psa_key_derivation_operation_t *operation,
-                                                           int completed)
-{
-    psasim_operation_t client_operation;
-
-    if (*remaining < sizeof(client_operation)) {
-        return 0;
-    }
-
-    ssize_t slot = operation - key_derivation_operations;
-
-    if (completed) {
-        memset(&key_derivation_operations[slot],
-               0,
-               sizeof(psa_key_derivation_operation_t));
-        key_derivation_operation_handles[slot] = 0;
-    }
-
-    client_operation.handle = key_derivation_operation_handles[slot];
-
-    memcpy(*pos, &client_operation, sizeof(client_operation));
-    *pos += sizeof(client_operation);
-
-    return 1;
-}
-
-int psasim_server_deserialise_psa_key_derivation_operation_t(uint8_t **pos,
-                                                             size_t *remaining,
-                                                             psa_key_derivation_operation_t **operation)
-{
-    psasim_operation_t client_operation;
-
-    if (*remaining < sizeof(psasim_operation_t)) {
-        return 0;
-    }
-
-    memcpy(&client_operation, *pos, sizeof(psasim_operation_t));
-    *pos += sizeof(psasim_operation_t);
-    *remaining -= sizeof(psasim_operation_t);
-
-    ssize_t slot;
-    if (client_operation.handle == 0) {         /* We need a new handle */
-        slot = allocate_key_derivation_operation_slot();
-    } else {
-        slot = find_key_derivation_slot_by_handle(client_operation.handle);
-    }
-
-    if (slot < 0) {
-        return 0;
-    }
-
-    *operation = &key_derivation_operations[slot];
-
-    return 1;
-}
-
-size_t psasim_serialise_psa_sign_hash_interruptible_operation_t_needs(
-    psa_sign_hash_interruptible_operation_t value)
-{
-    return sizeof(value);
-}
-
-int psasim_serialise_psa_sign_hash_interruptible_operation_t(uint8_t **pos,
-                                                             size_t *remaining,
-                                                             psa_sign_hash_interruptible_operation_t value)
-{
-    if (*remaining < sizeof(value)) {
-        return 0;
-    }
-
-    memcpy(*pos, &value, sizeof(value));
-    *pos += sizeof(value);
-
-    return 1;
-}
-
-int psasim_deserialise_psa_sign_hash_interruptible_operation_t(uint8_t **pos,
-                                                               size_t *remaining,
-                                                               psa_sign_hash_interruptible_operation_t *value)
-{
-    if (*remaining < sizeof(*value)) {
-        return 0;
-    }
-
-    memcpy(value, *pos, sizeof(*value));
-
-    *pos += sizeof(*value);
-    *remaining -= sizeof(*value);
-
-    return 1;
-}
-
-size_t psasim_server_serialise_psa_sign_hash_interruptible_operation_t_needs(
-    psa_sign_hash_interruptible_operation_t *operation)
-{
-    (void) operation;
-
-    /* We will actually return a handle */
-    return sizeof(psasim_operation_t);
-}
-
-int psasim_server_serialise_psa_sign_hash_interruptible_operation_t(uint8_t **pos,
-                                                                    size_t *remaining,
-                                                                    psa_sign_hash_interruptible_operation_t *operation,
-                                                                    int completed)
-{
-    psasim_operation_t client_operation;
-
-    if (*remaining < sizeof(client_operation)) {
-        return 0;
-    }
-
-    ssize_t slot = operation - sign_hash_interruptible_operations;
-
-    if (completed) {
-        memset(&sign_hash_interruptible_operations[slot],
-               0,
-               sizeof(psa_sign_hash_interruptible_operation_t));
-        sign_hash_interruptible_operation_handles[slot] = 0;
-    }
-
-    client_operation.handle = sign_hash_interruptible_operation_handles[slot];
-
-    memcpy(*pos, &client_operation, sizeof(client_operation));
-    *pos += sizeof(client_operation);
-
-    return 1;
-}
-
-int psasim_server_deserialise_psa_sign_hash_interruptible_operation_t(uint8_t **pos,
-                                                                      size_t *remaining,
-                                                                      psa_sign_hash_interruptible_operation_t **operation)
-{
-    psasim_operation_t client_operation;
-
-    if (*remaining < sizeof(psasim_operation_t)) {
-        return 0;
-    }
-
-    memcpy(&client_operation, *pos, sizeof(psasim_operation_t));
-    *pos += sizeof(psasim_operation_t);
-    *remaining -= sizeof(psasim_operation_t);
-
-    ssize_t slot;
-    if (client_operation.handle == 0) {         /* We need a new handle */
-        slot = allocate_sign_hash_interruptible_operation_slot();
-    } else {
-        slot = find_sign_hash_interruptible_slot_by_handle(client_operation.handle);
-    }
-
-    if (slot < 0) {
-        return 0;
-    }
-
-    *operation = &sign_hash_interruptible_operations[slot];
-
-    return 1;
-}
-
-size_t psasim_serialise_psa_verify_hash_interruptible_operation_t_needs(
-    psa_verify_hash_interruptible_operation_t value)
-{
-    return sizeof(value);
-}
-
-int psasim_serialise_psa_verify_hash_interruptible_operation_t(uint8_t **pos,
-                                                               size_t *remaining,
-                                                               psa_verify_hash_interruptible_operation_t value)
-{
-    if (*remaining < sizeof(value)) {
-        return 0;
-    }
-
-    memcpy(*pos, &value, sizeof(value));
-    *pos += sizeof(value);
-
-    return 1;
-}
-
-int psasim_deserialise_psa_verify_hash_interruptible_operation_t(uint8_t **pos,
-                                                                 size_t *remaining,
-                                                                 psa_verify_hash_interruptible_operation_t *value)
-{
-    if (*remaining < sizeof(*value)) {
-        return 0;
-    }
-
-    memcpy(value, *pos, sizeof(*value));
-
-    *pos += sizeof(*value);
-    *remaining -= sizeof(*value);
-
-    return 1;
-}
-
-size_t psasim_server_serialise_psa_verify_hash_interruptible_operation_t_needs(
-    psa_verify_hash_interruptible_operation_t *operation)
-{
-    (void) operation;
-
-    /* We will actually return a handle */
-    return sizeof(psasim_operation_t);
-}
-
-int psasim_server_serialise_psa_verify_hash_interruptible_operation_t(uint8_t **pos,
-                                                                      size_t *remaining,
-                                                                      psa_verify_hash_interruptible_operation_t *operation,
-                                                                      int completed)
-{
-    psasim_operation_t client_operation;
-
-    if (*remaining < sizeof(client_operation)) {
-        return 0;
-    }
-
-    ssize_t slot = operation - verify_hash_interruptible_operations;
-
-    if (completed) {
-        memset(&verify_hash_interruptible_operations[slot],
-               0,
-               sizeof(psa_verify_hash_interruptible_operation_t));
-        verify_hash_interruptible_operation_handles[slot] = 0;
-    }
-
-    client_operation.handle = verify_hash_interruptible_operation_handles[slot];
-
-    memcpy(*pos, &client_operation, sizeof(client_operation));
-    *pos += sizeof(client_operation);
-
-    return 1;
-}
-
-int psasim_server_deserialise_psa_verify_hash_interruptible_operation_t(uint8_t **pos,
-                                                                        size_t *remaining,
-                                                                        psa_verify_hash_interruptible_operation_t **operation)
-{
-    psasim_operation_t client_operation;
-
-    if (*remaining < sizeof(psasim_operation_t)) {
-        return 0;
-    }
-
-    memcpy(&client_operation, *pos, sizeof(psasim_operation_t));
-    *pos += sizeof(psasim_operation_t);
-    *remaining -= sizeof(psasim_operation_t);
-
-    ssize_t slot;
-    if (client_operation.handle == 0) {         /* We need a new handle */
-        slot = allocate_verify_hash_interruptible_operation_slot();
-    } else {
-        slot = find_verify_hash_interruptible_slot_by_handle(client_operation.handle);
-    }
-
-    if (slot < 0) {
-        return 0;
-    }
-
-    *operation = &verify_hash_interruptible_operations[slot];
-
-    return 1;
-}
-
-size_t psasim_serialise_mbedtls_svc_key_id_t_needs(
-    mbedtls_svc_key_id_t value)
-{
-    return sizeof(value);
-}
-
-int psasim_serialise_mbedtls_svc_key_id_t(uint8_t **pos,
-                                          size_t *remaining,
-                                          mbedtls_svc_key_id_t value)
-{
-    if (*remaining < sizeof(value)) {
-        return 0;
-    }
-
-    memcpy(*pos, &value, sizeof(value));
-    *pos += sizeof(value);
-
-    return 1;
-}
-
-int psasim_deserialise_mbedtls_svc_key_id_t(uint8_t **pos,
-                                            size_t *remaining,
-                                            mbedtls_svc_key_id_t *value)
-{
-    if (*remaining < sizeof(*value)) {
-        return 0;
-    }
-
-    memcpy(value, *pos, sizeof(*value));
-
-    *pos += sizeof(*value);
-    *remaining -= sizeof(*value);
-
-    return 1;
-}
-
-size_t psasim_serialise_psa_key_agreement_iop_t_needs(
-    psa_key_agreement_iop_t value)
-{
-    return sizeof(value);
-}
-
-int psasim_serialise_psa_key_agreement_iop_t(uint8_t **pos,
-                                             size_t *remaining,
-                                             psa_key_agreement_iop_t value)
-{
-    if (*remaining < sizeof(value)) {
-        return 0;
-    }
-
-    memcpy(*pos, &value, sizeof(value));
-    *pos += sizeof(value);
-
-    return 1;
-}
-
-int psasim_deserialise_psa_key_agreement_iop_t(uint8_t **pos,
-                                               size_t *remaining,
-                                               psa_key_agreement_iop_t *value)
-{
-    if (*remaining < sizeof(*value)) {
-        return 0;
-    }
-
-    memcpy(value, *pos, sizeof(*value));
-
-    *pos += sizeof(*value);
-    *remaining -= sizeof(*value);
-
-    return 1;
-}
-
-size_t psasim_serialise_psa_generate_key_iop_t_needs(
-    psa_generate_key_iop_t value)
-{
-    return sizeof(value);
-}
-
-int psasim_serialise_psa_generate_key_iop_t(uint8_t **pos,
-                                            size_t *remaining,
-                                            psa_generate_key_iop_t value)
-{
-    if (*remaining < sizeof(value)) {
-        return 0;
-    }
-
-    memcpy(*pos, &value, sizeof(value));
-    *pos += sizeof(value);
-
-    return 1;
-}
-
-int psasim_deserialise_psa_generate_key_iop_t(uint8_t **pos,
-                                              size_t *remaining,
-                                              psa_generate_key_iop_t *value)
-{
-    if (*remaining < sizeof(*value)) {
-        return 0;
-    }
-
-    memcpy(value, *pos, sizeof(*value));
-
-    *pos += sizeof(*value);
-    *remaining -= sizeof(*value);
-
-    return 1;
-}
-
-size_t psasim_serialise_psa_export_public_key_iop_t_needs(
-    psa_export_public_key_iop_t value)
-{
-    return sizeof(value);
-}
-
-int psasim_serialise_psa_export_public_key_iop_t(uint8_t **pos,
-                                                 size_t *remaining,
-                                                 psa_export_public_key_iop_t value)
-{
-    if (*remaining < sizeof(value)) {
-        return 0;
-    }
-
-    memcpy(*pos, &value, sizeof(value));
-    *pos += sizeof(value);
-
-    return 1;
-}
-
-int psasim_deserialise_psa_export_public_key_iop_t(uint8_t **pos,
-                                                   size_t *remaining,
-                                                   psa_export_public_key_iop_t *value)
-{
-    if (*remaining < sizeof(*value)) {
-        return 0;
-    }
-
-    memcpy(value, *pos, sizeof(*value));
-
-    *pos += sizeof(*value);
-    *remaining -= sizeof(*value);
-
-    return 1;
-}
-
-void psa_sim_serialize_reset(void)
-{
-    memset(hash_operation_handles, 0,
-           sizeof(hash_operation_handles));
-    memset(hash_operations, 0,
-           sizeof(hash_operations));
-    memset(aead_operation_handles, 0,
-           sizeof(aead_operation_handles));
-    memset(aead_operations, 0,
-           sizeof(aead_operations));
-    memset(mac_operation_handles, 0,
-           sizeof(mac_operation_handles));
-    memset(mac_operations, 0,
-           sizeof(mac_operations));
-    memset(cipher_operation_handles, 0,
-           sizeof(cipher_operation_handles));
-    memset(cipher_operations, 0,
-           sizeof(cipher_operations));
-    memset(key_derivation_operation_handles, 0,
-           sizeof(key_derivation_operation_handles));
-    memset(key_derivation_operations, 0,
-           sizeof(key_derivation_operations));
-    memset(sign_hash_interruptible_operation_handles, 0,
-           sizeof(sign_hash_interruptible_operation_handles));
-    memset(sign_hash_interruptible_operations, 0,
-           sizeof(sign_hash_interruptible_operations));
-    memset(verify_hash_interruptible_operation_handles, 0,
-           sizeof(verify_hash_interruptible_operation_handles));
-    memset(verify_hash_interruptible_operations, 0,
-           sizeof(verify_hash_interruptible_operations));
-}
diff --git a/psasim/src/psa_sim_serialise.h b/psasim/src/psa_sim_serialise.h
deleted file mode 100644
index 3b6f08e..0000000
--- a/psasim/src/psa_sim_serialise.h
+++ /dev/null
@@ -1,1432 +0,0 @@
-/**
- * \file psa_sim_serialise.h
- *
- * \brief Rough-and-ready serialisation and deserialisation for the PSA Crypto simulator
- */
-
-/*
- *  Copyright The Mbed TLS Contributors
- *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
- */
-
-#include <stdint.h>
-#include <stddef.h>
-
-#include "psa/crypto.h"
-#include "psa/crypto_types.h"
-#include "psa/crypto_values.h"
-
-/* Basic idea:
- *
- * All arguments to a function will be serialised into a single buffer to
- * be sent to the server with the PSA crypto function to be called.
- *
- * All returned data (the function's return value and any values returned
- * via `out` parameters) will similarly be serialised into a buffer to be
- * sent back to the client from the server.
- *
- * For each data type foo (e.g. int, size_t, psa_algorithm_t, but also "buffer"
- * where "buffer" is a (uint8_t *, size_t) pair, we have a pair of functions,
- * psasim_serialise_foo() and psasim_deserialise_foo().
- *
- * We also have psasim_serialise_foo_needs() functions, which return a
- * size_t giving the number of bytes that serialising that instance of that
- * type will need. This allows callers to size buffers for serialisation.
- *
- * Each serialised buffer starts with a version byte, bytes that indicate
- * the size of basic C types, and four bytes that indicate the endianness
- * (to avoid incompatibilities if we ever run this over a network - we are
- * not aiming for universality, just for correctness and simplicity).
- *
- * Most types are serialised as a fixed-size (per type) octet string, with
- * no type indication. This is acceptable as (a) this is for the test PSA crypto
- * simulator only, not production, and (b) these functions are called by
- * code that itself is written by script.
- *
- * We also want to keep serialised data reasonably compact as communication
- * between client and server goes in messages of less than 200 bytes each.
- *
- * Many serialisation functions can be created by a script; an exemplar Perl
- * script is included. It is not hooked into the build and so must be run
- * manually, but is expected to be replaced by a Python script in due course.
- * Types that can have their functions created by script include plain old C
- * data types (e.g. int), types typedef'd to those, and even structures that
- * don't contain pointers.
- */
-
-/** Reset all operation slots.
- *
- * Should be called when all clients have disconnected.
- */
-void psa_sim_serialize_reset(void);
-
-/** Return how much buffer space is needed by \c psasim_serialise_begin().
- *
- * \return                   The number of bytes needed in the buffer for
- *                           \c psasim_serialise_begin()'s output.
- */
-size_t psasim_serialise_begin_needs(void);
-
-/** Begin serialisation into a buffer.
- *
- *                           This must be the first serialisation API called
- *                           on a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error (likely
- *                           no space).
- */
-int psasim_serialise_begin(uint8_t **pos, size_t *remaining);
-
-/** Begin deserialisation of a buffer.
- *
- *                           This must be the first deserialisation API called
- *                           on a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_deserialise_begin(uint8_t **pos, size_t *remaining);
-
-/** Return how much buffer space is needed by \c psasim_serialise_unsigned_int()
- *  to serialise an `unsigned int`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_unsigned_int() to serialise
- *                           the given value.
- */
-size_t psasim_serialise_unsigned_int_needs(
-    unsigned int value);
-
-/** Serialise an `unsigned int` into a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_serialise_unsigned_int(uint8_t **pos,
-                                  size_t *remaining,
-                                  unsigned int value);
-
-/** Deserialise an `unsigned int` from a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to an `unsigned int` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_deserialise_unsigned_int(uint8_t **pos,
-                                    size_t *remaining,
-                                    unsigned int *value);
-
-/** Return how much buffer space is needed by \c psasim_serialise_int()
- *  to serialise an `int`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_int() to serialise
- *                           the given value.
- */
-size_t psasim_serialise_int_needs(
-    int value);
-
-/** Serialise an `int` into a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_serialise_int(uint8_t **pos,
-                         size_t *remaining,
-                         int value);
-
-/** Deserialise an `int` from a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to an `int` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_deserialise_int(uint8_t **pos,
-                           size_t *remaining,
-                           int *value);
-
-/** Return how much buffer space is needed by \c psasim_serialise_size_t()
- *  to serialise a `size_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_size_t() to serialise
- *                           the given value.
- */
-size_t psasim_serialise_size_t_needs(
-    size_t value);
-
-/** Serialise a `size_t` into a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_serialise_size_t(uint8_t **pos,
-                            size_t *remaining,
-                            size_t value);
-
-/** Deserialise a `size_t` from a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to a `size_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_deserialise_size_t(uint8_t **pos,
-                              size_t *remaining,
-                              size_t *value);
-
-/** Return how much buffer space is needed by \c psasim_serialise_uint16_t()
- *  to serialise an `uint16_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_uint16_t() to serialise
- *                           the given value.
- */
-size_t psasim_serialise_uint16_t_needs(
-    uint16_t value);
-
-/** Serialise an `uint16_t` into a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_serialise_uint16_t(uint8_t **pos,
-                              size_t *remaining,
-                              uint16_t value);
-
-/** Deserialise an `uint16_t` from a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to an `uint16_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_deserialise_uint16_t(uint8_t **pos,
-                                size_t *remaining,
-                                uint16_t *value);
-
-/** Return how much buffer space is needed by \c psasim_serialise_uint32_t()
- *  to serialise an `uint32_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_uint32_t() to serialise
- *                           the given value.
- */
-size_t psasim_serialise_uint32_t_needs(
-    uint32_t value);
-
-/** Serialise an `uint32_t` into a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_serialise_uint32_t(uint8_t **pos,
-                              size_t *remaining,
-                              uint32_t value);
-
-/** Deserialise an `uint32_t` from a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to an `uint32_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_deserialise_uint32_t(uint8_t **pos,
-                                size_t *remaining,
-                                uint32_t *value);
-
-/** Return how much buffer space is needed by \c psasim_serialise_uint64_t()
- *  to serialise an `uint64_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_uint64_t() to serialise
- *                           the given value.
- */
-size_t psasim_serialise_uint64_t_needs(
-    uint64_t value);
-
-/** Serialise an `uint64_t` into a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_serialise_uint64_t(uint8_t **pos,
-                              size_t *remaining,
-                              uint64_t value);
-
-/** Deserialise an `uint64_t` from a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to an `uint64_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_deserialise_uint64_t(uint8_t **pos,
-                                size_t *remaining,
-                                uint64_t *value);
-
-/** Return how much space is needed by \c psasim_serialise_buffer()
- *  to serialise a buffer: a (`uint8_t *`, `size_t`) pair.
- *
- * \param buffer             Pointer to the buffer to be serialised
- *                           (needed in case some serialisations are value-
- *                           dependent).
- * \param buffer_size        Number of bytes in the buffer to be serialised.
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_buffer() to serialise
- *                           the specified buffer.
- */
-size_t psasim_serialise_buffer_needs(const uint8_t *buffer, size_t buffer_size);
-
-/** Serialise a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param buffer             Pointer to the buffer to be serialised.
- * \param buffer_length      Number of bytes in the buffer to be serialised.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_serialise_buffer(uint8_t **pos, size_t *remaining,
-                            const uint8_t *buffer, size_t buffer_length);
-
-/** Deserialise a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the serialisation buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the serialisation buffer.
- * \param buffer             Pointer to a `uint8_t *` to receive the address
- *                           of a newly-allocated buffer, which the caller
- *                           must `free()`.
- * \param buffer_length      Pointer to a `size_t` to receive the number of
- *                           bytes in the deserialised buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_deserialise_buffer(uint8_t **pos, size_t *remaining,
-                              uint8_t **buffer, size_t *buffer_length);
-
-/** Deserialise a buffer returned from the server.
- *
- * When the client is deserialising a buffer returned from the server, it needs
- * to use this function to deserialised the  returned buffer. It should use the
- * usual \c psasim_serialise_buffer() function to serialise the outbound
- * buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the serialisation buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the serialisation buffer.
- * \param buffer             Pointer to a `uint8_t *` to receive the address
- *                           of a newly-allocated buffer, which the caller
- *                           must `free()`.
- * \param buffer_length      Pointer to a `size_t` to receive the number of
- *                           bytes in the deserialised buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_deserialise_return_buffer(uint8_t **pos, size_t *remaining,
-                                     uint8_t *buffer, size_t buffer_length);
-
-/** Return how much buffer space is needed by \c psasim_serialise_psa_custom_key_parameters_t()
- *  to serialise a `psa_custom_key_parameters_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_psa_custom_key_parameters_t() to serialise
- *                           the given value.
- */
-size_t psasim_serialise_psa_custom_key_parameters_t_needs(
-    psa_custom_key_parameters_t value);
-
-/** Serialise a `psa_custom_key_parameters_t` into a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_serialise_psa_custom_key_parameters_t(uint8_t **pos,
-                                                 size_t *remaining,
-                                                 psa_custom_key_parameters_t value);
-
-/** Deserialise a `psa_custom_key_parameters_t` from a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to a `psa_custom_key_parameters_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_deserialise_psa_custom_key_parameters_t(uint8_t **pos,
-                                                   size_t *remaining,
-                                                   psa_custom_key_parameters_t *value);
-
-/** Return how much buffer space is needed by \c psasim_serialise_psa_status_t()
- *  to serialise a `psa_status_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_psa_status_t() to serialise
- *                           the given value.
- */
-size_t psasim_serialise_psa_status_t_needs(
-    psa_status_t value);
-
-/** Serialise a `psa_status_t` into a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_serialise_psa_status_t(uint8_t **pos,
-                                  size_t *remaining,
-                                  psa_status_t value);
-
-/** Deserialise a `psa_status_t` from a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to a `psa_status_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_deserialise_psa_status_t(uint8_t **pos,
-                                    size_t *remaining,
-                                    psa_status_t *value);
-
-/** Return how much buffer space is needed by \c psasim_serialise_psa_algorithm_t()
- *  to serialise a `psa_algorithm_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_psa_algorithm_t() to serialise
- *                           the given value.
- */
-size_t psasim_serialise_psa_algorithm_t_needs(
-    psa_algorithm_t value);
-
-/** Serialise a `psa_algorithm_t` into a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_serialise_psa_algorithm_t(uint8_t **pos,
-                                     size_t *remaining,
-                                     psa_algorithm_t value);
-
-/** Deserialise a `psa_algorithm_t` from a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to a `psa_algorithm_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_deserialise_psa_algorithm_t(uint8_t **pos,
-                                       size_t *remaining,
-                                       psa_algorithm_t *value);
-
-/** Return how much buffer space is needed by \c psasim_serialise_psa_key_derivation_step_t()
- *  to serialise a `psa_key_derivation_step_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_psa_key_derivation_step_t() to serialise
- *                           the given value.
- */
-size_t psasim_serialise_psa_key_derivation_step_t_needs(
-    psa_key_derivation_step_t value);
-
-/** Serialise a `psa_key_derivation_step_t` into a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_serialise_psa_key_derivation_step_t(uint8_t **pos,
-                                               size_t *remaining,
-                                               psa_key_derivation_step_t value);
-
-/** Deserialise a `psa_key_derivation_step_t` from a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to a `psa_key_derivation_step_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_deserialise_psa_key_derivation_step_t(uint8_t **pos,
-                                                 size_t *remaining,
-                                                 psa_key_derivation_step_t *value);
-
-/** Return how much buffer space is needed by \c psasim_serialise_psa_hash_operation_t()
- *  to serialise a `psa_hash_operation_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_psa_hash_operation_t() to serialise
- *                           the given value.
- */
-size_t psasim_serialise_psa_hash_operation_t_needs(
-    psa_hash_operation_t value);
-
-/** Serialise a `psa_hash_operation_t` into a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_serialise_psa_hash_operation_t(uint8_t **pos,
-                                          size_t *remaining,
-                                          psa_hash_operation_t value);
-
-/** Deserialise a `psa_hash_operation_t` from a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to a `psa_hash_operation_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_deserialise_psa_hash_operation_t(uint8_t **pos,
-                                            size_t *remaining,
-                                            psa_hash_operation_t *value);
-
-/** Return how much buffer space is needed by \c psasim_server_serialise_psa_hash_operation_t()
- *  to serialise a `psa_hash_operation_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_psa_hash_operation_t() to serialise
- *                           the given value.
- */
-size_t psasim_server_serialise_psa_hash_operation_t_needs(
-    psa_hash_operation_t *value);
-
-/** Serialise a `psa_hash_operation_t` into a buffer on the server side.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- * \param completed          Non-zero if the operation is now completed (set by
- *                           finish and abort calls).
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_server_serialise_psa_hash_operation_t(uint8_t **pos,
-                                                 size_t *remaining,
-                                                 psa_hash_operation_t *value,
-                                                 int completed);
-
-/** Deserialise a `psa_hash_operation_t` from a buffer on the server side.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to a `psa_hash_operation_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_server_deserialise_psa_hash_operation_t(uint8_t **pos,
-                                                   size_t *remaining,
-                                                   psa_hash_operation_t **value);
-
-/** Return how much buffer space is needed by \c psasim_serialise_psa_aead_operation_t()
- *  to serialise a `psa_aead_operation_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_psa_aead_operation_t() to serialise
- *                           the given value.
- */
-size_t psasim_serialise_psa_aead_operation_t_needs(
-    psa_aead_operation_t value);
-
-/** Serialise a `psa_aead_operation_t` into a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_serialise_psa_aead_operation_t(uint8_t **pos,
-                                          size_t *remaining,
-                                          psa_aead_operation_t value);
-
-/** Deserialise a `psa_aead_operation_t` from a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to a `psa_aead_operation_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_deserialise_psa_aead_operation_t(uint8_t **pos,
-                                            size_t *remaining,
-                                            psa_aead_operation_t *value);
-
-/** Return how much buffer space is needed by \c psasim_server_serialise_psa_aead_operation_t()
- *  to serialise a `psa_aead_operation_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_psa_aead_operation_t() to serialise
- *                           the given value.
- */
-size_t psasim_server_serialise_psa_aead_operation_t_needs(
-    psa_aead_operation_t *value);
-
-/** Serialise a `psa_aead_operation_t` into a buffer on the server side.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- * \param completed          Non-zero if the operation is now completed (set by
- *                           finish and abort calls).
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_server_serialise_psa_aead_operation_t(uint8_t **pos,
-                                                 size_t *remaining,
-                                                 psa_aead_operation_t *value,
-                                                 int completed);
-
-/** Deserialise a `psa_aead_operation_t` from a buffer on the server side.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to a `psa_aead_operation_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_server_deserialise_psa_aead_operation_t(uint8_t **pos,
-                                                   size_t *remaining,
-                                                   psa_aead_operation_t **value);
-
-/** Return how much buffer space is needed by \c psasim_serialise_psa_key_attributes_t()
- *  to serialise a `psa_key_attributes_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_psa_key_attributes_t() to serialise
- *                           the given value.
- */
-size_t psasim_serialise_psa_key_attributes_t_needs(
-    psa_key_attributes_t value);
-
-/** Serialise a `psa_key_attributes_t` into a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_serialise_psa_key_attributes_t(uint8_t **pos,
-                                          size_t *remaining,
-                                          psa_key_attributes_t value);
-
-/** Deserialise a `psa_key_attributes_t` from a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to a `psa_key_attributes_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_deserialise_psa_key_attributes_t(uint8_t **pos,
-                                            size_t *remaining,
-                                            psa_key_attributes_t *value);
-
-/** Return how much buffer space is needed by \c psasim_serialise_psa_mac_operation_t()
- *  to serialise a `psa_mac_operation_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_psa_mac_operation_t() to serialise
- *                           the given value.
- */
-size_t psasim_serialise_psa_mac_operation_t_needs(
-    psa_mac_operation_t value);
-
-/** Serialise a `psa_mac_operation_t` into a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_serialise_psa_mac_operation_t(uint8_t **pos,
-                                         size_t *remaining,
-                                         psa_mac_operation_t value);
-
-/** Deserialise a `psa_mac_operation_t` from a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to a `psa_mac_operation_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_deserialise_psa_mac_operation_t(uint8_t **pos,
-                                           size_t *remaining,
-                                           psa_mac_operation_t *value);
-
-/** Return how much buffer space is needed by \c psasim_server_serialise_psa_mac_operation_t()
- *  to serialise a `psa_mac_operation_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_psa_mac_operation_t() to serialise
- *                           the given value.
- */
-size_t psasim_server_serialise_psa_mac_operation_t_needs(
-    psa_mac_operation_t *value);
-
-/** Serialise a `psa_mac_operation_t` into a buffer on the server side.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- * \param completed          Non-zero if the operation is now completed (set by
- *                           finish and abort calls).
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_server_serialise_psa_mac_operation_t(uint8_t **pos,
-                                                size_t *remaining,
-                                                psa_mac_operation_t *value,
-                                                int completed);
-
-/** Deserialise a `psa_mac_operation_t` from a buffer on the server side.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to a `psa_mac_operation_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_server_deserialise_psa_mac_operation_t(uint8_t **pos,
-                                                  size_t *remaining,
-                                                  psa_mac_operation_t **value);
-
-/** Return how much buffer space is needed by \c psasim_serialise_psa_cipher_operation_t()
- *  to serialise a `psa_cipher_operation_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_psa_cipher_operation_t() to serialise
- *                           the given value.
- */
-size_t psasim_serialise_psa_cipher_operation_t_needs(
-    psa_cipher_operation_t value);
-
-/** Serialise a `psa_cipher_operation_t` into a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_serialise_psa_cipher_operation_t(uint8_t **pos,
-                                            size_t *remaining,
-                                            psa_cipher_operation_t value);
-
-/** Deserialise a `psa_cipher_operation_t` from a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to a `psa_cipher_operation_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_deserialise_psa_cipher_operation_t(uint8_t **pos,
-                                              size_t *remaining,
-                                              psa_cipher_operation_t *value);
-
-/** Return how much buffer space is needed by \c psasim_server_serialise_psa_cipher_operation_t()
- *  to serialise a `psa_cipher_operation_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_psa_cipher_operation_t() to serialise
- *                           the given value.
- */
-size_t psasim_server_serialise_psa_cipher_operation_t_needs(
-    psa_cipher_operation_t *value);
-
-/** Serialise a `psa_cipher_operation_t` into a buffer on the server side.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- * \param completed          Non-zero if the operation is now completed (set by
- *                           finish and abort calls).
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_server_serialise_psa_cipher_operation_t(uint8_t **pos,
-                                                   size_t *remaining,
-                                                   psa_cipher_operation_t *value,
-                                                   int completed);
-
-/** Deserialise a `psa_cipher_operation_t` from a buffer on the server side.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to a `psa_cipher_operation_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_server_deserialise_psa_cipher_operation_t(uint8_t **pos,
-                                                     size_t *remaining,
-                                                     psa_cipher_operation_t **value);
-
-/** Return how much buffer space is needed by \c psasim_serialise_psa_key_derivation_operation_t()
- *  to serialise a `psa_key_derivation_operation_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_psa_key_derivation_operation_t() to serialise
- *                           the given value.
- */
-size_t psasim_serialise_psa_key_derivation_operation_t_needs(
-    psa_key_derivation_operation_t value);
-
-/** Serialise a `psa_key_derivation_operation_t` into a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_serialise_psa_key_derivation_operation_t(uint8_t **pos,
-                                                    size_t *remaining,
-                                                    psa_key_derivation_operation_t value);
-
-/** Deserialise a `psa_key_derivation_operation_t` from a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to a `psa_key_derivation_operation_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_deserialise_psa_key_derivation_operation_t(uint8_t **pos,
-                                                      size_t *remaining,
-                                                      psa_key_derivation_operation_t *value);
-
-/** Return how much buffer space is needed by \c psasim_server_serialise_psa_key_derivation_operation_t()
- *  to serialise a `psa_key_derivation_operation_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_psa_key_derivation_operation_t() to serialise
- *                           the given value.
- */
-size_t psasim_server_serialise_psa_key_derivation_operation_t_needs(
-    psa_key_derivation_operation_t *value);
-
-/** Serialise a `psa_key_derivation_operation_t` into a buffer on the server side.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- * \param completed          Non-zero if the operation is now completed (set by
- *                           finish and abort calls).
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_server_serialise_psa_key_derivation_operation_t(uint8_t **pos,
-                                                           size_t *remaining,
-                                                           psa_key_derivation_operation_t *value,
-                                                           int completed);
-
-/** Deserialise a `psa_key_derivation_operation_t` from a buffer on the server side.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to a `psa_key_derivation_operation_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_server_deserialise_psa_key_derivation_operation_t(uint8_t **pos,
-                                                             size_t *remaining,
-                                                             psa_key_derivation_operation_t **value);
-
-/** Return how much buffer space is needed by \c psasim_serialise_psa_sign_hash_interruptible_operation_t()
- *  to serialise a `psa_sign_hash_interruptible_operation_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_psa_sign_hash_interruptible_operation_t() to serialise
- *                           the given value.
- */
-size_t psasim_serialise_psa_sign_hash_interruptible_operation_t_needs(
-    psa_sign_hash_interruptible_operation_t value);
-
-/** Serialise a `psa_sign_hash_interruptible_operation_t` into a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_serialise_psa_sign_hash_interruptible_operation_t(uint8_t **pos,
-                                                             size_t *remaining,
-                                                             psa_sign_hash_interruptible_operation_t value);
-
-/** Deserialise a `psa_sign_hash_interruptible_operation_t` from a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to a `psa_sign_hash_interruptible_operation_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_deserialise_psa_sign_hash_interruptible_operation_t(uint8_t **pos,
-                                                               size_t *remaining,
-                                                               psa_sign_hash_interruptible_operation_t *value);
-
-/** Return how much buffer space is needed by \c psasim_server_serialise_psa_sign_hash_interruptible_operation_t()
- *  to serialise a `psa_sign_hash_interruptible_operation_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_psa_sign_hash_interruptible_operation_t() to serialise
- *                           the given value.
- */
-size_t psasim_server_serialise_psa_sign_hash_interruptible_operation_t_needs(
-    psa_sign_hash_interruptible_operation_t *value);
-
-/** Serialise a `psa_sign_hash_interruptible_operation_t` into a buffer on the server side.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- * \param completed          Non-zero if the operation is now completed (set by
- *                           finish and abort calls).
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_server_serialise_psa_sign_hash_interruptible_operation_t(uint8_t **pos,
-                                                                    size_t *remaining,
-                                                                    psa_sign_hash_interruptible_operation_t *value,
-                                                                    int completed);
-
-/** Deserialise a `psa_sign_hash_interruptible_operation_t` from a buffer on the server side.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to a `psa_sign_hash_interruptible_operation_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_server_deserialise_psa_sign_hash_interruptible_operation_t(uint8_t **pos,
-                                                                      size_t *remaining,
-                                                                      psa_sign_hash_interruptible_operation_t **value);
-
-/** Return how much buffer space is needed by \c psasim_serialise_psa_verify_hash_interruptible_operation_t()
- *  to serialise a `psa_verify_hash_interruptible_operation_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_psa_verify_hash_interruptible_operation_t() to serialise
- *                           the given value.
- */
-size_t psasim_serialise_psa_verify_hash_interruptible_operation_t_needs(
-    psa_verify_hash_interruptible_operation_t value);
-
-/** Serialise a `psa_verify_hash_interruptible_operation_t` into a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_serialise_psa_verify_hash_interruptible_operation_t(uint8_t **pos,
-                                                               size_t *remaining,
-                                                               psa_verify_hash_interruptible_operation_t value);
-
-/** Deserialise a `psa_verify_hash_interruptible_operation_t` from a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to a `psa_verify_hash_interruptible_operation_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_deserialise_psa_verify_hash_interruptible_operation_t(uint8_t **pos,
-                                                                 size_t *remaining,
-                                                                 psa_verify_hash_interruptible_operation_t *value);
-
-/** Return how much buffer space is needed by \c psasim_server_serialise_psa_verify_hash_interruptible_operation_t()
- *  to serialise a `psa_verify_hash_interruptible_operation_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_psa_verify_hash_interruptible_operation_t() to serialise
- *                           the given value.
- */
-size_t psasim_server_serialise_psa_verify_hash_interruptible_operation_t_needs(
-    psa_verify_hash_interruptible_operation_t *value);
-
-/** Serialise a `psa_verify_hash_interruptible_operation_t` into a buffer on the server side.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- * \param completed          Non-zero if the operation is now completed (set by
- *                           finish and abort calls).
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_server_serialise_psa_verify_hash_interruptible_operation_t(uint8_t **pos,
-                                                                      size_t *remaining,
-                                                                      psa_verify_hash_interruptible_operation_t *value,
-                                                                      int completed);
-
-/** Deserialise a `psa_verify_hash_interruptible_operation_t` from a buffer on the server side.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to a `psa_verify_hash_interruptible_operation_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_server_deserialise_psa_verify_hash_interruptible_operation_t(uint8_t **pos,
-                                                                        size_t *remaining,
-                                                                        psa_verify_hash_interruptible_operation_t **value);
-
-/** Return how much buffer space is needed by \c psasim_serialise_mbedtls_svc_key_id_t()
- *  to serialise a `mbedtls_svc_key_id_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_mbedtls_svc_key_id_t() to serialise
- *                           the given value.
- */
-size_t psasim_serialise_mbedtls_svc_key_id_t_needs(
-    mbedtls_svc_key_id_t value);
-
-/** Serialise a `mbedtls_svc_key_id_t` into a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_serialise_mbedtls_svc_key_id_t(uint8_t **pos,
-                                          size_t *remaining,
-                                          mbedtls_svc_key_id_t value);
-
-/** Deserialise a `mbedtls_svc_key_id_t` from a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to a `mbedtls_svc_key_id_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_deserialise_mbedtls_svc_key_id_t(uint8_t **pos,
-                                            size_t *remaining,
-                                            mbedtls_svc_key_id_t *value);
-
-/** Return how much buffer space is needed by \c psasim_serialise_psa_key_agreement_iop_t()
- *  to serialise a `psa_key_agreement_iop_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_psa_key_agreement_iop_t() to serialise
- *                           the given value.
- */
-size_t psasim_serialise_psa_key_agreement_iop_t_needs(
-    psa_key_agreement_iop_t value);
-
-/** Serialise a `psa_key_agreement_iop_t` into a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_serialise_psa_key_agreement_iop_t(uint8_t **pos,
-                                             size_t *remaining,
-                                             psa_key_agreement_iop_t value);
-
-/** Deserialise a `psa_key_agreement_iop_t` from a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to a `psa_key_agreement_iop_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_deserialise_psa_key_agreement_iop_t(uint8_t **pos,
-                                               size_t *remaining,
-                                               psa_key_agreement_iop_t *value);
-
-/** Return how much buffer space is needed by \c psasim_serialise_psa_generate_key_iop_t()
- *  to serialise a `psa_generate_key_iop_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_psa_generate_key_iop_t() to serialise
- *                           the given value.
- */
-size_t psasim_serialise_psa_generate_key_iop_t_needs(
-    psa_generate_key_iop_t value);
-
-/** Serialise a `psa_generate_key_iop_t` into a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_serialise_psa_generate_key_iop_t(uint8_t **pos,
-                                            size_t *remaining,
-                                            psa_generate_key_iop_t value);
-
-/** Deserialise a `psa_generate_key_iop_t` from a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to a `psa_generate_key_iop_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_deserialise_psa_generate_key_iop_t(uint8_t **pos,
-                                              size_t *remaining,
-                                              psa_generate_key_iop_t *value);
-
-/** Return how much buffer space is needed by \c psasim_serialise_psa_export_public_key_iop_t()
- *  to serialise a `psa_export_public_key_iop_t`.
- *
- * \param value              The value that will be serialised into the buffer
- *                           (needed in case some serialisations are value-
- *                           dependent).
- *
- * \return                   The number of bytes needed in the buffer by
- *                           \c psasim_serialise_psa_export_public_key_iop_t() to serialise
- *                           the given value.
- */
-size_t psasim_serialise_psa_export_public_key_iop_t_needs(
-    psa_export_public_key_iop_t value);
-
-/** Serialise a `psa_export_public_key_iop_t` into a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              The value to serialise into the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_serialise_psa_export_public_key_iop_t(uint8_t **pos,
-                                                 size_t *remaining,
-                                                 psa_export_public_key_iop_t value);
-
-/** Deserialise a `psa_export_public_key_iop_t` from a buffer.
- *
- * \param pos[in,out]        Pointer to a `uint8_t *` holding current position
- *                           in the buffer.
- * \param remaining[in,out]  Pointer to a `size_t` holding number of bytes
- *                           remaining in the buffer.
- * \param value              Pointer to a `psa_export_public_key_iop_t` to receive the value
- *                           deserialised from the buffer.
- *
- * \return                   \c 1 on success ("okay"), \c 0 on error.
- */
-int psasim_deserialise_psa_export_public_key_iop_t(uint8_t **pos,
-                                                   size_t *remaining,
-                                                   psa_export_public_key_iop_t *value);