xref: /optee_os/ta/pkcs11/src/serializer.h (revision bd62f6a3abfc4f45cb1ee8b5f28971f63e413a96)
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