#include <libecc/curves/curves.h>
int ec_get_curve_params_by_name(const u8 *ec_name, u8 ec_name_len,
const ec_str_params **ec_s_params)
{
const ec_str_params *params;
u8 comp_len, name_len;
u32 len;
const ec_mapping *map;
const u8 *name;
unsigned int i;
int ret, check;
MUST_HAVE((ec_name != NULL), ret, err);
MUST_HAVE((ec_s_params != NULL), ret, err);
MUST_HAVE(((ec_name_len > 2) && (ec_name_len <= MAX_CURVE_NAME_LEN)), ret, err);
ret = local_strnlen((const char *)ec_name, ec_name_len, &len); EG(ret, err);
comp_len = (u8)len;
MUST_HAVE(((comp_len + 1) == ec_name_len), ret, err);
ret = -1;
for (i = 0; i < EC_CURVES_NUM; i++) {
map = &ec_maps[i];
params = map->params;
MUST_HAVE((params != NULL), ret, err);
MUST_HAVE((params->name != NULL), ret, err);
MUST_HAVE((params->name->buf != NULL), ret, err);
name = params->name->buf;
name_len = params->name->buflen;
if (name_len != ec_name_len) {
continue;
}
if ((!are_str_equal((const char *)ec_name, (const char *)name, &check)) && check) {
(*ec_s_params) = params;
ret = 0;
break;
}
}
err:
return ret;
}
int ec_get_curve_params_by_type(ec_curve_type ec_type,
const ec_str_params **ec_s_params)
{
const ec_str_params *params;
const ec_mapping *map;
const u8 *name;
u32 len;
u8 name_len;
unsigned int i;
int ret;
MUST_HAVE((ec_s_params != NULL), ret, err);
ret = -1;
for (i = 0; i < EC_CURVES_NUM; i++) {
map = &ec_maps[i];
params = map->params;
MUST_HAVE((params != NULL), ret, err);
if (ec_type == map->type) {
MUST_HAVE((params->name != NULL), ret, err);
MUST_HAVE((params->name->buf != NULL), ret, err);
name = params->name->buf;
ret = local_strlen((const char *)name, &len); EG(ret, err);
MUST_HAVE(len < 256, ret, err);
name_len = (u8)len;
MUST_HAVE((params->name->buflen == (name_len + 1)), ret, err);
(*ec_s_params) = params;
ret = 0;
break;
}
}
err:
return ret;
}
int ec_get_curve_type_by_name(const u8 *ec_name, u8 ec_name_len,
ec_curve_type *ec_type)
{
const ec_str_params *params;
u32 len;
u8 name_len, comp_len;
const ec_mapping *map;
const u8 *name;
unsigned int i;
int ret, check;
MUST_HAVE(((ec_name_len > 2) && (ec_name_len <= MAX_CURVE_NAME_LEN)), ret, err);
MUST_HAVE((ec_type != NULL), ret, err);
MUST_HAVE((ec_name != NULL), ret, err);
ret = local_strnlen((const char *)ec_name, ec_name_len, &len); EG(ret, err);
MUST_HAVE(len < 256, ret, err);
comp_len = (u8)len;
MUST_HAVE(((comp_len + 1) == ec_name_len), ret, err);
ret = -1;
for (i = 0; i < EC_CURVES_NUM; i++) {
map = &ec_maps[i];
params = map->params;
MUST_HAVE((params != NULL), ret, err);
MUST_HAVE((params->name != NULL), ret, err);
MUST_HAVE((params->name->buf != NULL), ret, err);
name = params->name->buf;
name_len = params->name->buflen;
if (name_len != ec_name_len) {
continue;
}
if((!are_str_equal((const char *)ec_name, (const char *)name, &check)) && check) {
(*ec_type) = map->type;
ret = 0;
break;
}
}
err:
return ret;
}
int ec_get_curve_name_by_type(const ec_curve_type ec_type, u8 *out, u8 outlen)
{
const ec_str_params *by_type;
const u8 *name;
u8 name_len;
int ret;
MUST_HAVE((out != NULL), ret, err);
ret = ec_get_curve_params_by_type(ec_type, &by_type); EG(ret, err);
MUST_HAVE((by_type != NULL), ret, err);
MUST_HAVE((by_type->name != NULL), ret, err);
MUST_HAVE((by_type->name->buf != NULL), ret, err);
name_len = by_type->name->buflen;
name = by_type->name->buf;
MUST_HAVE((name_len <= outlen), ret, err);
ret = local_memcpy(out, name, name_len);
err:
return ret;
}
int ec_check_curve_type_and_name(const ec_curve_type ec_type,
const u8 *ec_name, u8 ec_name_len)
{
const ec_str_params *by_type;
const u8 *name;
u8 name_len;
int ret, check;
MUST_HAVE((ec_name != NULL), ret, err);
MUST_HAVE(((ec_name_len > 2) && (ec_name_len <= MAX_CURVE_NAME_LEN)), ret, err);
ret = ec_get_curve_params_by_type(ec_type, &by_type); EG(ret, err);
MUST_HAVE((by_type != NULL), ret, err);
MUST_HAVE((by_type->name != NULL), ret, err);
MUST_HAVE((by_type->name->buf != NULL), ret, err);
name = by_type->name->buf;
name_len = by_type->name->buflen;
MUST_HAVE((name_len == ec_name_len), ret, err);
if ((!are_str_equal((const char *)ec_name, (const char *)name, &check)) && (!check)) {
ret = -1;
}
err:
return ret;
}