From 39f8b09f5bf07e98bee3e51f134b47258db31910 Mon Sep 17 00:00:00 2001 From: Tom Cosgrove Date: Wed, 29 May 2024 12:26:53 +0100 Subject: [PATCH] Add PSA crypto sim serialisation functions needed for the remaining PSA hash APIs Signed-off-by: Tom Cosgrove --- .../psasim/src/psa_sim_serialise.c | 75 +++++++++++++--- .../psasim/src/psa_sim_serialise.h | 82 ++++++++++++++--- .../psasim/src/psa_sim_serialise.pl | 87 ++++++++++++++++--- 3 files changed, 211 insertions(+), 33 deletions(-) diff --git a/tests/psa-client-server/psasim/src/psa_sim_serialise.c b/tests/psa-client-server/psasim/src/psa_sim_serialise.c index 264509cdf1..78ae9d65d7 100644 --- a/tests/psa-client-server/psasim/src/psa_sim_serialise.c +++ b/tests/psa-client-server/psasim/src/psa_sim_serialise.c @@ -130,7 +130,9 @@ 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) +int psasim_serialise_unsigned_int(uint8_t **pos, + size_t *remaining, + unsigned int value) { if (*remaining < sizeof(value)) { return 0; @@ -142,7 +144,9 @@ int psasim_serialise_unsigned_int(uint8_t **pos, size_t *remaining, unsigned int return 1; } -int psasim_deserialise_unsigned_int(uint8_t **pos, size_t *remaining, unsigned int *value) +int psasim_deserialise_unsigned_int(uint8_t **pos, + size_t *remaining, + unsigned int *value) { if (*remaining < sizeof(*value)) { return 0; @@ -161,7 +165,9 @@ size_t psasim_serialise_int_needs(int value) return sizeof(value); } -int psasim_serialise_int(uint8_t **pos, size_t *remaining, int value) +int psasim_serialise_int(uint8_t **pos, + size_t *remaining, + int value) { if (*remaining < sizeof(value)) { return 0; @@ -173,7 +179,9 @@ int psasim_serialise_int(uint8_t **pos, size_t *remaining, int value) return 1; } -int psasim_deserialise_int(uint8_t **pos, size_t *remaining, int *value) +int psasim_deserialise_int(uint8_t **pos, + size_t *remaining, + int *value) { if (*remaining < sizeof(*value)) { return 0; @@ -192,7 +200,9 @@ 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) +int psasim_serialise_size_t(uint8_t **pos, + size_t *remaining, + size_t value) { if (*remaining < sizeof(value)) { return 0; @@ -204,7 +214,9 @@ int psasim_serialise_size_t(uint8_t **pos, size_t *remaining, size_t value) return 1; } -int psasim_deserialise_size_t(uint8_t **pos, size_t *remaining, size_t *value) +int psasim_deserialise_size_t(uint8_t **pos, + size_t *remaining, + size_t *value) { if (*remaining < sizeof(*value)) { return 0; @@ -325,12 +337,16 @@ 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) +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) +int psasim_deserialise_psa_status_t(uint8_t **pos, + size_t *remaining, + psa_status_t *value) { return psasim_deserialise_int(pos, remaining, value); } @@ -340,12 +356,51 @@ 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) +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) +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_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; +} diff --git a/tests/psa-client-server/psasim/src/psa_sim_serialise.h b/tests/psa-client-server/psasim/src/psa_sim_serialise.h index 9cca7d8c65..d5eaccf482 100644 --- a/tests/psa-client-server/psasim/src/psa_sim_serialise.h +++ b/tests/psa-client-server/psasim/src/psa_sim_serialise.h @@ -113,7 +113,9 @@ size_t psasim_serialise_unsigned_int_needs(unsigned int value); * * \return \c 1 on success ("okay"), \c 0 on error. */ -int psasim_serialise_unsigned_int(uint8_t **pos, size_t *remaining, unsigned int value); +int psasim_serialise_unsigned_int(uint8_t **pos, + size_t *remaining, + unsigned int value); /** Deserialise an `unsigned int` from a buffer. * @@ -126,7 +128,9 @@ int psasim_serialise_unsigned_int(uint8_t **pos, size_t *remaining, unsigned int * * \return \c 1 on success ("okay"), \c 0 on error. */ -int psasim_deserialise_unsigned_int(uint8_t **pos, size_t *remaining, unsigned int *value); +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`. @@ -151,7 +155,9 @@ size_t psasim_serialise_int_needs(int value); * * \return \c 1 on success ("okay"), \c 0 on error. */ -int psasim_serialise_int(uint8_t **pos, size_t *remaining, int value); +int psasim_serialise_int(uint8_t **pos, + size_t *remaining, + int value); /** Deserialise an `int` from a buffer. * @@ -164,7 +170,9 @@ int psasim_serialise_int(uint8_t **pos, size_t *remaining, int value); * * \return \c 1 on success ("okay"), \c 0 on error. */ -int psasim_deserialise_int(uint8_t **pos, size_t *remaining, int *value); +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`. @@ -189,7 +197,9 @@ size_t psasim_serialise_size_t_needs(size_t value); * * \return \c 1 on success ("okay"), \c 0 on error. */ -int psasim_serialise_size_t(uint8_t **pos, size_t *remaining, size_t value); +int psasim_serialise_size_t(uint8_t **pos, + size_t *remaining, + size_t value); /** Deserialise a `size_t` from a buffer. * @@ -202,7 +212,9 @@ int psasim_serialise_size_t(uint8_t **pos, size_t *remaining, size_t value); * * \return \c 1 on success ("okay"), \c 0 on error. */ -int psasim_deserialise_size_t(uint8_t **pos, size_t *remaining, size_t *value); +int psasim_deserialise_size_t(uint8_t **pos, + size_t *remaining, + size_t *value); /** Return how much space is needed by \c psasim_serialise_buffer() * to serialise a buffer: a (`uint8_t *`, `size_t`) pair. @@ -294,7 +306,9 @@ size_t psasim_serialise_psa_status_t_needs(psa_status_t value); * * \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); +int psasim_serialise_psa_status_t(uint8_t **pos, + size_t *remaining, + psa_status_t value); /** Deserialise a `psa_status_t` from a buffer. * @@ -307,7 +321,9 @@ int psasim_serialise_psa_status_t(uint8_t **pos, size_t *remaining, psa_status_t * * \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); +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`. @@ -332,7 +348,9 @@ size_t psasim_serialise_psa_algorithm_t_needs(psa_algorithm_t value); * * \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); +int psasim_serialise_psa_algorithm_t(uint8_t **pos, + size_t *remaining, + psa_algorithm_t value); /** Deserialise a `psa_algorithm_t` from a buffer. * @@ -345,4 +363,48 @@ int psasim_serialise_psa_algorithm_t(uint8_t **pos, size_t *remaining, psa_algor * * \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); +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_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); diff --git a/tests/psa-client-server/psasim/src/psa_sim_serialise.pl b/tests/psa-client-server/psasim/src/psa_sim_serialise.pl index 2a6c3885b7..b89d058516 100644 --- a/tests/psa-client-server/psasim/src/psa_sim_serialise.pl +++ b/tests/psa-client-server/psasim/src/psa_sim_serialise.pl @@ -32,7 +32,10 @@ die($usage) unless $which eq "c" || $which eq "h"; # deserialisation functions written manually (like those for the "buffer" type # are). # -my @types = qw(unsigned-int int size_t buffer psa_status_t psa_algorithm_t); +my @types = qw(unsigned-int int size_t + buffer + psa_status_t psa_algorithm_t + psa_hash_operation_t); grep(s/-/ /g, @types); # IS-A: Some data types are typedef'd; we serialise them as the other type @@ -110,7 +113,7 @@ sub declare_serialise my $type_d = $type; $type_d =~ s/ /_/g; - return < $#code; + + # Find where the ( is + my $idx = index($code[$i], "("); + die("can't find (") if $idx < 0; + + my $indent = " " x ($idx + 1); + $code[$i + 1] =~ s/^\s+/$indent/; + $code[$i + 2] =~ s/^\s+/$indent/; + + return join("\n", @code) . "\n"; +}