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