//
// Created by xajhu on 2021/7/2 0002.
//

#ifndef DAEMON_AGENT_CRYPTO_CRYPTO_H
#define DAEMON_AGENT_CRYPTO_CRYPTO_H
#ifdef __cplusplus
extern "C" {
#endif

typedef enum {
    DES3_ECB_PKCS7PADDING = 0,
    DES3_CBC_PKCS7PADDING,
    DES3_OFB_PKCS7PADDING,
    AES128_ECB_PKCS7PADDING,
    AES128_ECB_PKCS7PADDING_SHA1PRNG,
    AES128_CBC_PKCS7PADDING,
    AES128_OFB_PKCS7PADDING,
    AES192_ECB_PKCS7PADDING,
    AES192_CBC_PKCS7PADDING,
    AES192_OFB_PKCS7PADDING,
    AES256_ECB_PKCS7PADDING,
    AES256_CBC_PKCS7PADDING,
    AES256_OFB_PKCS7PADDING,
} AES_TYPE;

typedef enum {
    CRYPTO_AES_ENCRYPT = 0,
    CRYPTO_AES_DECRYPT,
    CRYPTO_BASE64_ENCODE,
    CRYPTO_BASE64_DECODE,
    CRYPTO_MD5_FILE,
} CRYPTO_TYPE;

typedef enum {
    HASH_TYPE_MD5    = 0,
    HASH_TYPE_SHA1   = 1,
    HASH_TYPE_SHA256 = 2,
} HASH_TYPE;

typedef void (*on_evp_crypto)(CRYPTO_TYPE          type,
                              const unsigned char *pData,
                              unsigned int         iSize,
                              const unsigned char *pSrcData,
                              int                  iError);

//*****************************************************
// AES
//*****************************************************
int symmetric_encrypto(AES_TYPE        algorithmType,
                       unsigned char  *pInBuf,
                       unsigned int    inSize,
                       unsigned char **pOutBuf,
                       int            *pOutSize,
                       const char     *pKey);
int symmetric_decrypto(AES_TYPE        algorithmType,
                       unsigned char  *pInBuf,
                       unsigned int    inSize,
                       unsigned char **pOutBuf,
                       int            *pOutSize,
                       const char     *pKey);
//*****************************************************
//  BASE64
//*****************************************************
#if 0
const char *base64_encode(unsigned char *pSrc, unsigned int sLen);
unsigned char * base64_decode(const char *pBase64);
#endif
const char    *base64_encode(unsigned char *pSrc, unsigned int sLen);
unsigned char *base64_decode(const char *pBase64, unsigned int *pOutSize);

//*****************************************************
//  MD5
//*****************************************************
int hash_digest_file(HASH_TYPE hashType, const char *pFileName, char **pHashValue);
int hash_digest_mem(HASH_TYPE            hashType,
                    const unsigned char *pBuf,
                    unsigned int         iBufLen,
                    unsigned char      **pHashValue,
                    unsigned int        *pOutSize);

//*****************************************************
//  Async Engine
//*****************************************************
int evp_add_crypto_task(CRYPTO_TYPE    type,
                        unsigned char *pInBuf,
                        unsigned int   iSize,
                        unsigned char *pOutBuf,
                        char          *pKey,
                        on_evp_crypto  onEvpCryptCb);

void evp_system_init(void);

#ifdef __cplusplus
}
#endif
#endif    //DAEMON_AGENT_CRYPTO_CRYPTO_H