14f8a354fSEtienne Carriere /* SPDX-License-Identifier: BSD-2-Clause */ 24f8a354fSEtienne Carriere /* 34f8a354fSEtienne Carriere * Copyright (c) 2017-2020, Linaro Limited 44f8a354fSEtienne Carriere */ 54f8a354fSEtienne Carriere 64f8a354fSEtienne Carriere #ifndef PKCS11_TA_SERIALIZER_H 74f8a354fSEtienne Carriere #define PKCS11_TA_SERIALIZER_H 84f8a354fSEtienne Carriere 94daf39b3SJens Wiklander #include <pkcs11_ta.h> 104f8a354fSEtienne Carriere #include <stdbool.h> 11ee49d9f2SEtienne Carriere #include <stdint.h> 124f8a354fSEtienne Carriere 133158faf6SEtienne Carriere struct pkcs11_client; 143158faf6SEtienne Carriere struct pkcs11_session; 153158faf6SEtienne Carriere 164f8a354fSEtienne Carriere /* 174f8a354fSEtienne Carriere * Util routines for serializes unformated arguments in a client memref 184f8a354fSEtienne Carriere */ 194f8a354fSEtienne Carriere struct serialargs { 204f8a354fSEtienne Carriere char *start; 214f8a354fSEtienne Carriere char *next; 224f8a354fSEtienne Carriere size_t size; 234f8a354fSEtienne Carriere }; 244f8a354fSEtienne Carriere 25*bd62f6a3SEtienne Carriere /* 26*bd62f6a3SEtienne Carriere * serialargs_init() - Initialize with a new input buffer 27*bd62f6a3SEtienne Carriere * @args: serializing state 28*bd62f6a3SEtienne Carriere * @in: input buffer 29*bd62f6a3SEtienne Carriere * @size: size of the input buffer 30*bd62f6a3SEtienne Carriere */ 314f8a354fSEtienne Carriere void serialargs_init(struct serialargs *args, void *in, size_t size); 324f8a354fSEtienne Carriere 33*bd62f6a3SEtienne Carriere /* 34*bd62f6a3SEtienne Carriere * serialargs_get() - copy out a chunk of data and advance 35*bd62f6a3SEtienne Carriere * @args: serializing state 36*bd62f6a3SEtienne Carriere * @out: output buffer 37*bd62f6a3SEtienne Carriere * @sz: number of bytes to copy to output buffer 38*bd62f6a3SEtienne Carriere * 39*bd62f6a3SEtienne Carriere * Returns PKCS11_CKR_OK on success or PKCS11_CKR_ARGUMENTS_BAD on failure. 40*bd62f6a3SEtienne Carriere */ 414daf39b3SJens Wiklander enum pkcs11_rc serialargs_get(struct serialargs *args, void *out, size_t sz); 424f8a354fSEtienne Carriere 43*bd62f6a3SEtienne Carriere /* 44*bd62f6a3SEtienne Carriere * serialargs_get_u32() - copy out a uint32_t and advance 45*bd62f6a3SEtienne Carriere * @args: serializing state 46*bd62f6a3SEtienne Carriere * @out: output buffer 47*bd62f6a3SEtienne Carriere * 48*bd62f6a3SEtienne Carriere * Returns PKCS11_CKR_OK on success or PKCS11_CKR_ARGUMENTS_BAD on failure. 49*bd62f6a3SEtienne Carriere */ 50*bd62f6a3SEtienne Carriere static inline enum pkcs11_rc serialargs_get_u32(struct serialargs *args, 51*bd62f6a3SEtienne Carriere uint32_t *out) 52*bd62f6a3SEtienne Carriere { 53*bd62f6a3SEtienne Carriere return serialargs_get(args, out, sizeof(*out)); 54*bd62f6a3SEtienne Carriere } 55*bd62f6a3SEtienne Carriere 56*bd62f6a3SEtienne Carriere /* 57*bd62f6a3SEtienne Carriere * serialargs_get_ptr() - get a pointer to a chunk of data and advance 58*bd62f6a3SEtienne Carriere * @args: serializing state 59*bd62f6a3SEtienne Carriere * @out: Pointer to the data retrieved in *@out 60*bd62f6a3SEtienne Carriere * @size: Number of bytes to advance 61*bd62f6a3SEtienne Carriere * 62*bd62f6a3SEtienne Carriere * Returns PKCS11_CKR_OK on success or PKCS11_CKR_ARGUMENTS_BAD on failure. 63*bd62f6a3SEtienne Carriere */ 644daf39b3SJens Wiklander enum pkcs11_rc serialargs_get_ptr(struct serialargs *args, void **out, 654daf39b3SJens Wiklander size_t size); 664f8a354fSEtienne Carriere 67*bd62f6a3SEtienne Carriere /* 68*bd62f6a3SEtienne Carriere * serialargs_alloc_and_get() - allocate and extract data 69*bd62f6a3SEtienne Carriere * @args: serializing state 70*bd62f6a3SEtienne Carriere * @out: Pointer to the allocated and extracted data in *@out 71*bd62f6a3SEtienne Carriere * @size: Number of bytes to extract 72*bd62f6a3SEtienne Carriere * 73*bd62f6a3SEtienne Carriere * Returns PKCS11_CKR_OK on success or an error code from enum pkcs11_rc on 74*bd62f6a3SEtienne Carriere * failure. 75*bd62f6a3SEtienne Carriere */ 764daf39b3SJens Wiklander enum pkcs11_rc serialargs_alloc_and_get(struct serialargs *args, 774f8a354fSEtienne Carriere void **out, size_t size); 784f8a354fSEtienne Carriere 79*bd62f6a3SEtienne Carriere /* 80*bd62f6a3SEtienne Carriere * serialargs_remaining_bytes() - check for remaining bytes 81*bd62f6a3SEtienne Carriere * @args: serializing state 82*bd62f6a3SEtienne Carriere * 83*bd62f6a3SEtienne Carriere * Returns true if there are remaining bytes in @args or false if all bytes 84*bd62f6a3SEtienne Carriere * are consumed. 85*bd62f6a3SEtienne Carriere */ 864f8a354fSEtienne Carriere bool serialargs_remaining_bytes(struct serialargs *args); 874f8a354fSEtienne Carriere 88*bd62f6a3SEtienne Carriere /* 89*bd62f6a3SEtienne Carriere * serialargs_get_session_from_handle() - extract and verify session 90*bd62f6a3SEtienne Carriere * @args: serializing state 91*bd62f6a3SEtienne Carriere * @client: client state 92*bd62f6a3SEtienne Carriere * @sess: The retrieved session handle is available in *@sess 93*bd62f6a3SEtienne Carriere * 94*bd62f6a3SEtienne Carriere * Returns PKCS11_CKR_OK on success or an error code from enum pkcs11_rc on 95*bd62f6a3SEtienne Carriere * failure. 96*bd62f6a3SEtienne Carriere */ 973158faf6SEtienne Carriere enum pkcs11_rc serialargs_get_session_from_handle(struct serialargs *args, 983158faf6SEtienne Carriere struct pkcs11_client *client, 993158faf6SEtienne Carriere struct pkcs11_session **sess); 100*bd62f6a3SEtienne Carriere 101*bd62f6a3SEtienne Carriere /* 102*bd62f6a3SEtienne Carriere * serialize() - append data into a serialized buffer 103*bd62f6a3SEtienne Carriere * @bstart: points to start of a buffer or NULL, *@bstart is updated 104*bd62f6a3SEtienne Carriere * with the new buffer if changed 105*bd62f6a3SEtienne Carriere * @blen: size of the *@bstart buffer, updated when data is added 106*bd62f6a3SEtienne Carriere * @data: data to appen to the buffer 107*bd62f6a3SEtienne Carriere * @len: size of the @data buffer 108*bd62f6a3SEtienne Carriere * 109*bd62f6a3SEtienne Carriere * Returns PKCS11_CKR_OK on success or an error code from enum pkcs11_rc on 110*bd62f6a3SEtienne Carriere * failure. 111*bd62f6a3SEtienne Carriere */ 112*bd62f6a3SEtienne Carriere enum pkcs11_rc serialize(char **bstart, size_t *blen, void *data, size_t len); 113*bd62f6a3SEtienne Carriere 1144f8a354fSEtienne Carriere #endif /*PKCS11_TA_SERIALIZER_H*/ 115