Files
openGauss-server/src/bin/pg_probackup/common_cipher.h
2024-09-03 18:49:29 +08:00

89 lines
3.3 KiB
C

#ifndef COMMON_CIPHER_H
#define COMMON_CIPHER_H
#include <pthread.h>
#include <dlfcn.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include "utils/aes.h"
#ifdef __cplusplus
extern "C" {
#endif
#define MAX_CRYPTO_MODULE_LEN 8192
#define CRYPTO_BLOCK_SIZE 16
#define MAX_ENCRYPT_LEN (MAX_CRYPTO_MODULE_LEN - CRYPTO_BLOCK_SIZE) /*加密算法补pad模式为强补,最多可以补16字节,所以最大加密长度少16字节,则密文最长8192、保证读取时可以整块密文读入*/
#define MAX_PROVIDER_NAME_LEN 128
#define MAX_ERRMSG_LEN 256
#define MAX_IV_LEN 16
#define MAX_HMAC_LEN 32
typedef enum {
MODULE_AES_128_CBC = 0,
MODULE_AES_128_CTR,
MODULE_AES_128_GCM,
MODULE_AES_256_CBC,
MODULE_AES_256_CTR,
MODULE_AES_256_GCM,
MODULE_SM4_CBC,
MODULE_SM4_CTR,
MODULE_HMAC_SHA256,
MODULE_HMAC_SM3,
MODULE_DETERMINISTIC_KEY,
MODULE_ALGO_MAX = 1024
} ModuleSymmKeyAlgo;
typedef enum {
MODULE_SHA256 = 0,
MODULE_SM3,
MODULE_DIGEST_MAX = 1024
} ModuleDigestAlgo;
typedef enum {
KEY_TYPE_INVALID,
KEY_TYPE_PLAINTEXT,
KEY_TYPE_CIPHERTEXT,
KEY_TYPE_NAMEORIDX,
KEY_TYPE_MAX
} KeyType;
typedef struct {
char provider_name[MAX_PROVIDER_NAME_LEN];
KeyType key_type;
int supported_symm[MODULE_ALGO_MAX]; // 不支持算法填入0或者支持算法填入1
int supported_digest[MODULE_DIGEST_MAX]; // 不支持算法填入0或者支持算法填入1
} SupportedFeature;
typedef int (*crypto_encrypt_decrypt_type)(void *ctx, int enc, unsigned char *data, size_t data_size, unsigned char *iv, size_t iv_size, unsigned char *result, size_t *result_size, unsigned char *tag);
typedef int (*crypto_create_symm_key_type)(void *sess, ModuleSymmKeyAlgo algo, unsigned char *key_id, size_t *key_id_size);
typedef int (*crypto_get_errmsg_type)(void *sess, char *errmsg);
typedef int (*crypto_ctx_init_type)(void *sess, void **ctx, ModuleSymmKeyAlgo algo, int enc, unsigned char *key_id, size_t key_id_size);
typedef int (*crypto_hmac_init_type)(void *sess, void **ctx, ModuleSymmKeyAlgo algo, unsigned char *key_id, size_t key_id_size);
typedef int (*crypto_hmac_type)(void *ctx, unsigned char * data, size_t data_size, unsigned char *result, size_t *result_size);
extern crypto_create_symm_key_type crypto_create_symm_key_use;
extern crypto_encrypt_decrypt_type crypto_encrypt_decrypt_use;
extern crypto_get_errmsg_type crypto_get_errmsg_use;
extern crypto_ctx_init_type crypto_ctx_init_use;
extern crypto_hmac_init_type crypto_hmac_init_use;
extern crypto_hmac_type crypto_hmac_use;
extern int transform_type(const char* type);
extern int getHmacType(ModuleSymmKeyAlgo algo);
extern bool load_crypto_module_lib();
extern void unload_crypto_module();
extern void initCryptoModule(char* crypto_module_params, const char* encrypt_mode);
extern void initCryptoSession(void** crypto_module_session);
extern void releaseCryptoSession(void* crypto_module_session);
extern void releaseCryptoCtx(void* crypto_module_keyctx);
extern void clearCrypto(void* crypto_module_session, void* crypto_module_keyctx, void* crypto_hmac_keyctx);
extern void CryptoModuleParamsCheck(bool gen_key, char* params, const char* module_encrypt_mode, const char* module_encrypt_key, const char* module_encrypt_salt);
#ifdef __cplusplus
}
#endif
#endif /*COMMON_CIPHER_H*/