Files
odkitee/serialization/serialization_base.h
2020-07-24 12:03:58 -07:00

119 lines
4.4 KiB
C

/*
* Copyright 2019 Google LLC. All Rights Reserved. This file and proprietary
* source code may only be used and distributed under the Widevine Master
* License Agreement.
*/
#ifndef ODKITEE_SERIALIZATION_BASE_H_
#define ODKITEE_SERIALIZATION_BASE_H_
#include <stddef.h>
#include <stdint.h>
#include "OEMCryptoCENC.h"
#include "message.h"
#include "shared_memory_interface.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef char* c_str;
/*
* In the OEMCrypto API, the lengths of variable length buffers can be
* of various types: base types of size_t or uint32_t and [in] values
* or [in/out] pointers. The LengthType struct is used to pass
* lengths in a consistent way to the primitives that take lengths as
* arguments.
*/
typedef enum {
LENGTH_TYPE_SIZE_T,
LENGTH_TYPE_UINT32_T,
LENGTH_TYPE_SIZE_T_POINTER,
LENGTH_TYPE_UINT32_T_POINTER,
LENGTH_TYPE_SIZE_T_DOUBLE_POINTER,
LENGTH_TYPE_UINT32_T_DOUBLE_POINTER
} LengthTypeTag;
typedef struct {
LengthTypeTag tag;
union {
size_t size_t_value;
uint32_t uint32_t_value;
const size_t* size_t_pointer;
const uint32_t* uint32_t_pointer;
size_t** size_t_double_pointer;
uint32_t** uint32_t_double_pointer;
} type;
} LengthType;
LengthType LengthFromSizeT(size_t length);
LengthType LengthFromUint32T(uint32_t length);
LengthType LengthFromSizeTPointer(const size_t* length);
LengthType LengthFromUint32TPointer(const uint32_t* length);
LengthType LengthFromSizeTDoublePointer(size_t** length);
LengthType LengthFromUint32TDoublePointer(uint32_t** length);
size_t LengthAsSizeT(LengthType length_type);
bool LengthIsNull(LengthType length_type);
void ODK_Pack_bool(Message* message, const bool* value);
void ODK_Pack_size_t(Message* message, const size_t* value);
void ODK_Pack_c_str(Message* message, const char* value);
void ODK_Pack_uint8_t(Message* message, const uint8_t* value);
void ODK_Pack_uint16_t(Message* message, const uint16_t* value);
void ODK_Pack_uint32_t(Message* message, const uint32_t* value);
void ODK_Pack_uint64_t(Message* message, const uint64_t* value);
bool ODK_PackBoolValue(Message* message, bool value);
bool ODK_PackIsNull(Message* message, const void* value);
void ODK_PackAlloc(Message* message, const void* address);
void ODK_PackMemory(Message* message, const uint8_t* addr,
LengthType length);
void ODK_PackArray(Message* message, const uint8_t* addr, size_t length);
typedef void (*ObjPacker)(Message* message, const uint8_t* obj);
void ODK_PackObjArray(Message* message, const uint8_t* address,
LengthType length, size_t size, ObjPacker packer);
void ODK_PackEOM(Message* message); /* end of message */
void ODK_PackSharedInputBuffer(Message* message, uint16_t index,
const uint8_t* address, const LengthType);
void ODK_PackSharedOutputBuffer(Message* message, const uint8_t* address,
LengthType length);
void ODK_Unpack_bool(Message* message, bool* value);
void ODK_Unpack_size_t(Message* message, size_t* value);
void ODK_Unpack_c_str(Message* message, char** value);
void ODK_Unpack_uint8_t(Message* message, uint8_t* value);
void ODK_Unpack_uint16_t(Message* message, uint16_t* value);
void ODK_Unpack_uint32_t(Message* message, uint32_t* value);
void ODK_Unpack_uint64_t(Message* message, uint64_t* value);
bool ODK_UnpackBoolValue(Message* message);
bool ODK_UnpackIsNull(Message* message);
uint8_t* ODK_UnpackAlloc(Message* message, size_t size);
uint8_t* ODK_UnpackAllocBuffer(Message* message, LengthType length,
size_t size);
void ODK_UnpackArray(Message* message, uint8_t* addr, size_t length);
typedef void (*ObjUnpacker)(Message* message, uint8_t* obj);
void ODK_UnpackObjArray(Message* message, uint8_t** address,
LengthType length, size_t size,
ObjUnpacker unpacker);
void ODK_UnpackPointerToMemory(Message* message, uint8_t** addr);
uint8_t* ODK_UnpackSharedBuffer(Message* message, uint16_t index,
LengthType length);
void ODK_UnpackSharedInputBuffer(Message* message, uint16_t index,
uint8_t** address, LengthType length);
void ODK_UnpackSharedOutputBuffer(Message* message, uint16_t index,
uint8_t** address, LengthType length);
void ODK_UnpackEOM(Message* message);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // ODKITEE_SERIALIZATION_BASE_H_