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