xref: /optee_os/ta/pkcs11/src/serializer.c (revision 7c76743463bc33bcc058f7d8f745fb04fcfc95ee)
1 // SPDX-License-Identifier: BSD-2-Clause
2 /*
3  * Copyright (c) 2017-2020, Linaro Limited
4  */
5 
6 #include <pkcs11_ta.h>
7 #include <stdbool.h>
8 #include <stdint.h>
9 #include <tee_internal_api.h>
10 #include <trace.h>
11 
12 #include "serializer.h"
13 
14 /*
15  * Util routines for serializes unformatted arguments in a client memref
16  */
17 void serialargs_init(struct serialargs *args, void *in, size_t size)
18 {
19 	args->start = in;
20 	args->next = in;
21 	args->size = size;
22 }
23 
24 uint32_t serialargs_get(struct serialargs *args, void *out, size_t size)
25 {
26 	if (args->next + size > args->start + args->size) {
27 		EMSG("arg too short: full %zd, remain %zd, expect %zd",
28 		     args->size, args->size - (args->next - args->start), size);
29 		return PKCS11_CKR_ARGUMENTS_BAD;
30 	}
31 
32 	TEE_MemMove(out, args->next, size);
33 
34 	args->next += size;
35 
36 	return PKCS11_CKR_OK;
37 }
38 
39 uint32_t serialargs_alloc_and_get(struct serialargs *args,
40 				  void **out, size_t size)
41 {
42 	void *ptr = NULL;
43 
44 	if (!size) {
45 		*out = NULL;
46 		return PKCS11_CKR_OK;
47 	}
48 
49 	if (args->next + size > args->start + args->size) {
50 		EMSG("arg too short: full %zd, remain %zd, expect %zd",
51 		     args->size, args->size - (args->next - args->start), size);
52 		return PKCS11_CKR_ARGUMENTS_BAD;
53 	}
54 
55 	ptr = TEE_Malloc(size, TEE_MALLOC_FILL_ZERO);
56 	if (!ptr)
57 		return PKCS11_CKR_DEVICE_MEMORY;
58 
59 	TEE_MemMove(ptr, args->next, size);
60 
61 	args->next += size;
62 	*out = ptr;
63 
64 	return PKCS11_CKR_OK;
65 }
66 
67 uint32_t serialargs_get_ptr(struct serialargs *args, void **out, size_t size)
68 {
69 	void *ptr = args->next;
70 
71 	if (!size) {
72 		*out = NULL;
73 		return PKCS11_CKR_OK;
74 	}
75 
76 	if (args->next + size > args->start + args->size) {
77 		EMSG("arg too short: full %zd, remain %zd, expect %zd",
78 		     args->size, args->size - (args->next - args->start), size);
79 		return PKCS11_CKR_ARGUMENTS_BAD;
80 	}
81 
82 	args->next += size;
83 	*out = ptr;
84 
85 	return PKCS11_CKR_OK;
86 }
87 
88 bool serialargs_remaining_bytes(struct serialargs *args)
89 {
90 	return args->next < args->start + args->size;
91 }
92