1 /* SPDX-License-Identifier: BSD-2-Clause */ 2 /* 3 * Copyright (c) 2017-2020, Linaro Limited 4 */ 5 6 #ifndef PKCS11_TA_SERIALIZER_H 7 #define PKCS11_TA_SERIALIZER_H 8 9 #include <pkcs11_ta.h> 10 #include <stdbool.h> 11 #include <stdint.h> 12 13 struct pkcs11_client; 14 struct pkcs11_session; 15 16 /* 17 * Util routines for serializes unformated arguments in a client memref 18 */ 19 struct serialargs { 20 char *start; 21 char *next; 22 size_t size; 23 }; 24 25 /* 26 * serialargs_init() - Initialize with a new input buffer 27 * @args: serializing state 28 * @in: input buffer 29 * @size: size of the input buffer 30 */ 31 void serialargs_init(struct serialargs *args, void *in, size_t size); 32 33 /* 34 * serialargs_get() - copy out a chunk of data and advance 35 * @args: serializing state 36 * @out: output buffer 37 * @sz: number of bytes to copy to output buffer 38 * 39 * Returns PKCS11_CKR_OK on success or PKCS11_CKR_ARGUMENTS_BAD on failure. 40 */ 41 enum pkcs11_rc serialargs_get(struct serialargs *args, void *out, size_t sz); 42 43 /* 44 * serialargs_get_u32() - copy out a uint32_t and advance 45 * @args: serializing state 46 * @out: output buffer 47 * 48 * Returns PKCS11_CKR_OK on success or PKCS11_CKR_ARGUMENTS_BAD on failure. 49 */ 50 static inline enum pkcs11_rc serialargs_get_u32(struct serialargs *args, 51 uint32_t *out) 52 { 53 return serialargs_get(args, out, sizeof(*out)); 54 } 55 56 /* 57 * serialargs_get_ptr() - get a pointer to a chunk of data and advance 58 * @args: serializing state 59 * @out: Pointer to the data retrieved in *@out 60 * @size: Number of bytes to advance 61 * 62 * Returns PKCS11_CKR_OK on success or PKCS11_CKR_ARGUMENTS_BAD on failure. 63 */ 64 enum pkcs11_rc serialargs_get_ptr(struct serialargs *args, void **out, 65 size_t size); 66 67 /* 68 * serialargs_alloc_and_get() - allocate and extract data 69 * @args: serializing state 70 * @out: Pointer to the allocated and extracted data in *@out 71 * @size: Number of bytes to extract 72 * 73 * Returns PKCS11_CKR_OK on success or an error code from enum pkcs11_rc on 74 * failure. 75 */ 76 enum pkcs11_rc serialargs_alloc_and_get(struct serialargs *args, 77 void **out, size_t size); 78 79 /* 80 * serialargs_remaining_bytes() - check for remaining bytes 81 * @args: serializing state 82 * 83 * Returns true if there are remaining bytes in @args or false if all bytes 84 * are consumed. 85 */ 86 bool serialargs_remaining_bytes(struct serialargs *args); 87 88 /* 89 * serialargs_get_session_from_handle() - extract and verify session 90 * @args: serializing state 91 * @client: client state 92 * @sess: The retrieved session handle is available in *@sess 93 * 94 * Returns PKCS11_CKR_OK on success or an error code from enum pkcs11_rc on 95 * failure. 96 */ 97 enum pkcs11_rc serialargs_get_session_from_handle(struct serialargs *args, 98 struct pkcs11_client *client, 99 struct pkcs11_session **sess); 100 101 /* 102 * serialize() - append data into a serialized buffer 103 * @bstart: points to start of a buffer or NULL, *@bstart is updated 104 * with the new buffer if changed 105 * @blen: size of the *@bstart buffer, updated when data is added 106 * @data: data to appen to the buffer 107 * @len: size of the @data buffer 108 * 109 * Returns PKCS11_CKR_OK on success or an error code from enum pkcs11_rc on 110 * failure. 111 */ 112 enum pkcs11_rc serialize(char **bstart, size_t *blen, void *data, size_t len); 113 114 #endif /*PKCS11_TA_SERIALIZER_H*/ 115