/* * 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 #include #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_