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 struct pkcs11_client; 26 struct pkcs11_session; 27 28 /* 29 * serialargs_init() - Initialize with a new input buffer 30 * @args: serializing state 31 * @in: input buffer 32 * @size: size of the input buffer 33 */ 34 void serialargs_init(struct serialargs *args, void *in, size_t size); 35 36 /* 37 * serialargs_get() - copy out a chunk of data and advance 38 * @args: serializing state 39 * @out: output buffer 40 * @sz: number of bytes to copy to output buffer 41 * 42 * Returns PKCS11_CKR_OK on success or PKCS11_CKR_ARGUMENTS_BAD on failure. 43 */ 44 enum pkcs11_rc serialargs_get(struct serialargs *args, void *out, size_t sz); 45 46 /* 47 * serialargs_get_u32() - copy out a uint32_t and advance 48 * @args: serializing state 49 * @out: output buffer 50 * 51 * Returns PKCS11_CKR_OK on success or PKCS11_CKR_ARGUMENTS_BAD on failure. 52 */ 53 static inline enum pkcs11_rc serialargs_get_u32(struct serialargs *args, 54 uint32_t *out) 55 { 56 return serialargs_get(args, out, sizeof(*out)); 57 } 58 59 /* 60 * serialargs_get_ptr() - get a pointer to a chunk of data and advance 61 * @args: serializing state 62 * @out: Pointer to the data retrieved in *@out 63 * @size: Number of bytes to advance 64 * 65 * Returns PKCS11_CKR_OK on success or PKCS11_CKR_ARGUMENTS_BAD on failure. 66 */ 67 enum pkcs11_rc serialargs_get_ptr(struct serialargs *args, void **out, 68 size_t size); 69 70 /* 71 * serialargs_alloc_get_one_attribute() - allocate and extract one attribute 72 * @args: serializing state 73 * @out: Pointer to the allocated and extracted attribute in *@out 74 * 75 * Returns PKCS11_CKR_OK on success or an error code from enum pkcs11_rc on 76 * failure. 77 */ 78 enum pkcs11_rc 79 serialargs_alloc_get_one_attribute(struct serialargs *args, 80 struct pkcs11_attribute_head **out); 81 82 /* 83 * serialargs_alloc_get_attributes() - allocate and extract an object 84 * @args: serializing state 85 * @out: Pointer to the allocated and extracted object in *@out 86 * 87 * Returns PKCS11_CKR_OK on success or an error code from enum pkcs11_rc on 88 * failure. 89 */ 90 enum pkcs11_rc serialargs_alloc_get_attributes(struct serialargs *args, 91 struct pkcs11_object_head **out); 92 93 /* 94 * serialargs_alloc_and_get() - allocate and extract data 95 * @args: serializing state 96 * @out: Pointer to the allocated and extracted data in *@out 97 * @size: Number of bytes to extract 98 * 99 * Returns PKCS11_CKR_OK on success or an error code from enum pkcs11_rc on 100 * failure. 101 */ 102 enum pkcs11_rc serialargs_alloc_and_get(struct serialargs *args, 103 void **out, size_t size); 104 105 /* 106 * serialargs_remaining_bytes() - check for remaining bytes 107 * @args: serializing state 108 * 109 * Returns true if there are remaining bytes in @args or false if all bytes 110 * are consumed. 111 */ 112 bool serialargs_remaining_bytes(struct serialargs *args); 113 114 /* 115 * serialargs_get_session_from_handle() - extract and verify session 116 * @args: serializing state 117 * @client: client state 118 * @sess: The retrieved session handle is available in *@sess 119 * 120 * Returns PKCS11_CKR_OK on success or an error code from enum pkcs11_rc on 121 * failure. 122 */ 123 enum pkcs11_rc serialargs_get_session_from_handle(struct serialargs *args, 124 struct pkcs11_client *client, 125 struct pkcs11_session **sess); 126 127 /* 128 * serialize() - append data into a serialized buffer 129 * @bstart: points to start of a buffer or NULL, *@bstart is updated 130 * with the new buffer if changed 131 * @blen: size of the *@bstart buffer, updated when data is added 132 * @data: data to appen to the buffer 133 * @len: size of the @data buffer 134 * 135 * Returns PKCS11_CKR_OK on success or an error code from enum pkcs11_rc on 136 * failure. 137 */ 138 enum pkcs11_rc serialize(char **bstart, size_t *blen, void *data, size_t len); 139 140 #endif /*PKCS11_TA_SERIALIZER_H*/ 141