// SPDX-License-Identifier: BSD-2-Clause /* * Copyright (c) 2017-2020, Linaro Limited */ #include #include #include #include #include "ck_helpers.h" #include "local_utils.h" #include "serializer.h" CK_RV init_serial_object(struct serializer *obj) { struct pkcs11_object_head head = { 0 }; memset(obj, 0, sizeof(*obj)); return serialize_buffer(obj, &head, sizeof(head)); } void finalize_serial_object(struct serializer *obj) { struct pkcs11_object_head head = { 0 }; head.attrs_size = obj->size - sizeof(head); head.attrs_count = obj->item_count; memcpy(obj->buffer, &head, sizeof(head)); } void release_serial_object(struct serializer *obj) { free(obj->buffer); obj->buffer = NULL; } /** * serialize - append data in a serialized buffer * * Serialize data in provided buffer. * Ensure 64byte alignment of appended data in the buffer. */ static CK_RV serialize(char **bstart, size_t *blen, void *data, size_t len) { size_t nlen = *blen + len; char *buf = realloc(*bstart, nlen); if (!buf) return CKR_HOST_MEMORY; memcpy(buf + *blen, data, len); *blen = nlen; *bstart = buf; return CKR_OK; } CK_RV serialize_buffer(struct serializer *obj, void *data, size_t size) { return serialize(&obj->buffer, &obj->size, data, size); } CK_RV serialize_32b(struct serializer *obj, uint32_t data) { return serialize_buffer(obj, &data, sizeof(data)); } CK_RV serialize_ck_ulong(struct serializer *obj, CK_ULONG data) { uint32_t data32 = data; return serialize_buffer(obj, &data32, sizeof(data32)); }