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

156 lines
4.0 KiB
C++
Executable File

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "common_utils.h"
#include "common_err.h"
#include "common_algo.h"
/*去掉字符串头和尾的空格*/
static char* remove_space(char *input)
{
int header = 0;
int end = 0;
int inputlen = 0;
const char filter = ' ';
char *tmp = NULL;
if (input == NULL || input[0] == '\0') {
return NULL;
}
inputlen = strlen(input);
/*去头部空格*/
while(input[header++] == filter && header < inputlen) {
/*do nothing*/
}
end = inputlen - 1;
/*去尾部空格*/
while(input[end--] == filter && end >= (header - 1)) {
/*do nothing*/
}
tmp = (char*)malloc(inputlen + 1);
memset(tmp,0x0,inputlen + 1);
/*初始位置为header - 1,长度为(end + 1)- (header -1) + 1*/
memcpy(tmp, input + header - 1, end - header + 3);
return tmp;
}
static int set_module_params(char* k, char* v, ModuleParams *moduleparams)
{
if (IS_MODULE_TYPE(k)) {
if (moduleparams->moduletype != MODULE_INVALID_TYPE) {
return CRYPTO_MOD_TYPE_REPEATED_ERR;
}
moduleparams->moduletype = GET_MODULE_TYPE(v);
if (moduleparams->moduletype == MODULE_INVALID_TYPE) {
return CRYPTO_MOD_TYPE_INVALID_ERR;
}
} else if (IS_MODULE_LIB_PATH(k)) {
if (moduleparams->libpath[0] != '\0') {
return CRYPTO_MOD_LIBPATH_REPEATED_ERR;
}
if (v[0] == '\0' || strlen(v) >= MODULE_MAX_PATH_LEN) {
return CRYPTO_MOD_LIBPATH_INVALID_ERR;
} else {
memcpy(moduleparams->libpath, v, strlen(v));
}
} else if(IS_MODULE_CONFIG_FILE_PATH(k)) {
if (moduleparams->cfgfilepath[0] != '\0') {
return CRYPTO_MOD_CFG_PATH_REPEATED_ERR;
}
if (v[0] == '\0' || strlen(v) >= MODULE_MAX_PATH_LEN) {
return CRYPTO_MOD_CFG_PATH_INVALID_ERR;
} else {
memcpy(moduleparams->cfgfilepath, v, strlen(v));
}
} else {
return CRYPTO_MOD_UNKNOWN_PARAM_ERR;
}
return CRYPT_MOD_OK;
}
static int check_module_params(ModuleParams *moduleparams)
{
if (moduleparams->libpath[0] == '\0') {
return CRYPTO_MOD_LIBPATH_INVALID_ERR;
}
switch (moduleparams->moduletype) {
case MODULE_GDAC_CARD_TYPE:
/*光电安辰密码卡不需要配置文件*/
if (moduleparams->cfgfilepath[0] != '\0') {
return CRYPTO_MOD_PARAM_TOO_MANY_ERR;
}
break;
case MODULE_JNTA_KMS_TYPE:
/*江南天安的配置文件,需要设置为环境变量使用"TASS_GHVSM_CFG_PATH",在后面加载时自己临时设置使用*/
if (moduleparams->cfgfilepath[0] == '\0') {
return CRYPTO_MOD_CFG_PATH_INVALID_ERR;
}
break;
case MODULE_SWXA_KMS_TYPE:
/*三未信安kms使用带配置文件路径名称的接口*/
if (moduleparams->cfgfilepath[0] == '\0') {
return CRYPTO_MOD_CFG_PATH_INVALID_ERR;
}
break;
default:
return CRYPTO_MOD_TYPE_INVALID_ERR;
}
return CRYPT_MOD_OK;
}
int parse_module_params(char *paramsstring, ModuleParams *moduleparams)
{
char *p = NULL;
char *saveptr1 = NULL;
const char *split1 = ",";
const char *split2 = "=";
int ret = 0;
p = strtok_r(paramsstring, split1, &saveptr1);
while (p != NULL) {
char *q = NULL;
char *saveptr2 = NULL;
char *tmp_p = NULL;
char *tmp_ptr2 = NULL;
q = strtok_r(p, split2, &saveptr2);
tmp_p = remove_space(p);
tmp_ptr2 = remove_space(saveptr2);
ret = set_module_params(tmp_p, tmp_ptr2, moduleparams);
if (ret != CRYPT_MOD_OK) {
free(tmp_p);
free(tmp_ptr2);
return ret;
}
free(tmp_p);
free(tmp_ptr2);
q = NULL;
p = strtok_r(NULL, split1, &saveptr1);
}
return check_module_params(moduleparams);
}