﻿#pragma once
#include "otx/OTXBase.hpp"
#define MIN(x, y) (x>y? y: x)

using namespace std;
extern "C" {
	OTX_API int base64_encode(unsigned char* inParams, uint32_t inLen, char* outBuffer, unsigned int outBufferSize);
	OTX_API int base64_decode(const char* inParams, uint32_t inLen, unsigned char* outBuffer, unsigned int outBufferSize);
	
	OTX_API unsigned short crc16_ibm(unsigned char* inParams, unsigned int inLen);

	OTX_API int radix_hex2Array(const char* hex, int hexLen, uint8_t* outBuffer, int outBufferSize);//TODO Hex字符串转ByteFiled
	OTX_API int radix_array2Hex(uint8_t* inParams, int inLen, char* outBuffer, int outBufferSize);//TODO ByteFiled转Hex字符串
	OTX_API int radix_array2Uint32(uint8_t* inParams, int inLen);
	OTX_API int radix_hex2Integer(char* hex, int radix);
	OTX_API int radix_string2Integer(char* inParams, int radix);
	OTX_API int radix_int2ByteArray(uint32_t val, uint8_t* outBuffer, int outBufferSize);
	OTX_API int radix_decimalStringToHex(char* inParams, char* outBuffer, int outBufferSize);//TODO 十进制字符串转Hex字符串

	OTX_API int appendBytefield(uint8_t* inParams_1, int inLen_1, uint8_t* inParams_2, int inLen_2, uint8_t* outBuffer, int outBufferSize);
	
	OTX_API int sha256(unsigned char* inParams, unsigned int inLen, uint8_t* outBuffer, uint32_t outBufferSize);
	OTX_API int des_cbc_pkcs5_encrypt(uint8_t* clearText, int inLen, char* key, char* outBuffer, unsigned int outBufferSize);
	OTX_API int des_cbc_pkcs5_decrypt(uint8_t* cipherText, int inLen, char* key, char* outBuffer, unsigned int outBufferSize);
	
	OTX_API int aes_cipher(unsigned char* input, int inLen, unsigned char* key, unsigned char* outBuffer);
	OTX_API int seedToKey(uint8_t* binSeed, int seedLen, uint8_t* binMask, int maskLen, uint8_t* outBuffer, int ourBufferSize);
	OTX_API int ver_calc(int iType, uint8_t* inParams, int inLen, char* outBuffer, int outBufferSize);
	OTX_API int sendCAData(uint8_t* binGetPKI, int iLen, uint8_t bKeyId, uint8_t* outBuffer, int outBufferSize);

	OTX_API int ext_printf(char* outBuffer, unsigned int outBufferSize, char* format, ...);
	OTX_API int ext_strcmp(char* str1, char* str2);
	OTX_API int ext_strncmp(char* str1, char* str2, int maxCount);
	OTX_API int ext_replace(const char* src, const char* strOld, const char* strNew, char* outBuffer, unsigned int outBufferSize);

	OTX_API bool ecdsa_signature(string msg, string key, string& signature);

	OTX_API int getUUID(char* outBuffer, int outBufferSize);

	OTX_API int pow_calc(int base, int exponent, char* outBuffer, int outBufferSize);

	OTX_API int utf8toGbk(char* src, char* outBuffer, int outBufferSize);
}
int parse_cert_p12(char* p12Path, char* passwd, char* pemBuffer, char* keyBuffer);