#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) {
}
end = inputlen - 1;
while(input[end--] == filter && end >= (header - 1)) {
}
tmp = (char*)malloc(inputlen + 1);
memset(tmp,0x0,inputlen + 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:
if (moduleparams->cfgfilepath[0] == '\0') {
return CRYPTO_MOD_CFG_PATH_INVALID_ERR;
}
break;
case MODULE_SWXA_KMS_TYPE:
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);
}