#pragma once #ifdef __cplusplus extern "C" { #endif #include #include typedef char*(*CmixBufferAllocator)(size_t); typedef void(*CmixBufferDeallocator)(void*); typedef size_t(*CmixBufferMessageLength)(); struct CmixBufferImpl { CmixBufferAllocator allocate_cmix_buffer; CmixBufferDeallocator deallocate_cmix_buffer; CmixBufferMessageLength message_length; }; #define DEFINE_CIPHER(NAME, MESSAGE_SIZE)\ typedef char NAME ## Message[MESSAGE_SIZE];\ \ char* allocate_ ## NAME ## _cmix_buffer(size_t size){\ return (char*) calloc(size, sizeof(NAME ## Message));\ }\ \ void deallocate_ ## NAME ## _cmix_buffer(void* buffer) {\ free(buffer);\ }\ \ size_t NAME ## _message_length() {\ return sizeof(NAME ## Message);\ }\ \ struct CmixBufferImpl get_cmix_ ## NAME ## _buffer_implementation() {\ return (struct CmixBufferImpl) {\ allocate_ ## NAME ## _cmix_buffer,\ deallocate_ ## NAME ## _cmix_buffer,\ NAME ## _message_length\ };\ } DEFINE_CIPHER(Null, 0) DEFINE_CIPHER(Curve25519, 20); #undef DEFINE_CIPHER #ifdef __cplusplus } // extern "C" #endif