Files
openGauss-server/contrib/common_cipher/common_cipher.h
2024-08-27 17:26:39 +08:00

275 lines
7.4 KiB
C
Executable File

#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>
#ifdef __cplusplus
extern "C" {
#endif
#define MAX_PROVIDER_NAME_LEN 128
#define MAX_ERRMSG_LEN 256
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;
/** 初始化密码模块
*
* @param[in]
* load_info 密码模块相关信息(硬件设备口令,硬件设备、硬件库路径等),通过kv方式传入
*
* @param[out]
* supported_feature 返回当前密码模块支持的加密方式,参考上述结构体
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
* 示例:
* 用户设置GUC参数crypto_module_info = 'enable_crypto_module=on,module_third_msg=aaa'
* 传入接口时load_info = 'aaa'
*/
int crypto_module_init(char *load_info, SupportedFeature *supported_feature);
/** 会话中连接密码模块
*
* @param[in]
* key_info 密码相关信息(用户口令等信息),通过kv方式传入
*
* @param[out]
* sess 会话信息
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
* 示例:
* 用户设置GUC参数tde_key_info = 'keyType=third_kms, keyThirdMsg =bbb'
* 传入接口时key_info = 'bbb'
*/
int crypto_module_sess_init(char *key_info, void **sess);
/** 会话中断开连接密码模块
*
* @param[in]
* sess 会话信息
*
* @param[out]
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
void crypto_module_sess_exit(void *sess);
/** 创建密钥
*
* @param[in]
* sess 会话信息
* algo 密钥使用场景的算法
*
* @param[out]
* key_id 返回生成密钥/密钥ID/密钥密文
* key_id_size 返回生成内容长度
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_create_symm_key(void *sess, ModuleSymmKeyAlgo algo, unsigned char *key_id, size_t *key_id_size);
/** 密钥上下文初始化,后续进行加解密可直接使用上下文
*
* @param[in]
* sess 会话信息
* algo 加密算法
* enc 加密1、解密0
* key_id 密码信息
* key_id_size 密码信息长度
* @param[out]
* ctx 返回使用密钥信息
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_ctx_init(void *sess, void **ctx, ModuleSymmKeyAlgo algo, int enc, unsigned char *key_id, size_t key_id_size);
/** 获取数据加解密后的数据长度
*
* @param[in]
* ctx 加解密上下文信息
* enc 加密1、解密0
* data_size 返回加解密结果长度
* @return 返回数据长度
*
*/
int crypto_result_size(void *ctx, int enc, size_t data_size);
/** 密钥上下文清理
*
* @param[in]
* ctx 加解密上下文信息
* @param[out]
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
void crypto_ctx_clean(void *ctx);
/** 执行加解密
*
* @param[in]
* ctx 加解密上下文信息
* enc 加密1、解密0
* data 原数据信息
* data_size 原数据长度
* iv iv信息
* iv_size iv信息长度
* tag GCM模式的校验值
* @param[out]
* result 返回结果信息
* result_size 返回结果信息长度
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_encrypt_decrypt(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);
/** 计算摘要
*
* @param[in]
* sess 会话信息
* algo 摘要算法
* data 原数据信息
* data_size 原数据长度
* @param[out]
* result 返回结果信息
* result_size 返回结果信息长度
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_digest(void *sess, ModuleDigestAlgo algo, unsigned char * data, size_t data_size,unsigned char *result, size_t *result_size);
/** hmac初始化
*
* @param[in]
* sess 会话信息
* algo 摘要算法
* key_id 密码信息
* key_id_size 密码信息长度
* @param[out]
* ctx 返回密钥上下文
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_hmac_init(void *sess, void **ctx, ModuleSymmKeyAlgo algo, unsigned char *key_id, size_t key_id_size);
/** hmac清理
*
* @param[in]
* ctx 密钥上下文信息
*
* @param[out]
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
void crypto_hmac_clean(void *ctx);
/** 执行hmac计算
*
* @param[in]
* ctx 密钥上下文信息
* data 原数据信息
* data_size 原数据长度
* @param[out]
* result 返回结果信息
* result_size 返回结果信息长度
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_hmac(void *ctx, unsigned char * data, size_t data_size, unsigned char *result, size_t *result_size);
/** 生成随机数
*
* @param[in]
* sess 会话信息
* size 申请的随机信息长度
*
* @param[out]
* buffer 返回随机信息
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_gen_random(void *sess, char *buffer, size_t size);
/** 执行确定性加解密
*
* @param[in]
* sess 会话信息
* enc 加密1、解密0
* data 原数据信息
* data_size 原数据长度
* key_id 密钥信息
* key_id_size 密钥信息长度
* @param[out]
* result 返回结果信息
* result_size 返回结果信息长度
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_deterministic_enc_dec(void *sess, int enc, unsigned char *data, unsigned char *key_id, size_t key_id_size, size_t data_size, unsigned char *result, size_t *result_size);
/** 获取报错信息
*
* @param[in]
* sess 会话信息
* @param[out]
* errmsg 返回结果信息,最长256字节
*
* @return 成功返回CRYPT_MOD_OK,失败返回错误码
*
*/
int crypto_get_errmsg(void *sess, char *errmsg);
#ifdef __cplusplus
}
#endif
#endif /*COMMON_CIPHER_H*/