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