return -2;
}
-static int pkey_gost_ec_ctrl_str_256(EVP_PKEY_CTX *ctx,
+static int pkey_gost_ec_ctrl_str_common(EVP_PKEY_CTX *ctx,
const char *type, const char *value)
{
- int param_nid = 0;
+ if (0 == strcmp(type, ukm_ctrl_string)) {
+ unsigned char ukm_buf[32], *tmp = NULL;
+ long len = 0;
+ tmp = OPENSSL_hexstr2buf(value, &len);
+ if (tmp == NULL)
+ return 0;
+
+ if (len > 32) {
+ OPENSSL_free(tmp);
+ GOSTerr(GOST_F_PKEY_GOST_EC_CTRL_STR_COMMON, GOST_R_CTRL_CALL_FAILED);
+ return 0;
+ }
+ memcpy(ukm_buf, tmp, len);
+ return pkey_gost_ctrl(ctx, EVP_PKEY_CTRL_SET_IV, len, ukm_buf);
+ }
+ return -2;
+}
+
+static int pkey_gost_ec_ctrl_str_256(EVP_PKEY_CTX *ctx,
+ const char *type, const char *value)
+{
if (strcmp(type, param_ctrl_string) == 0) {
+ int param_nid = 0;
+
if (!value) {
return 0;
}
default:
return 0;
}
- } else if ((strlen(value) == 3)
- && (toupper((unsigned char)value[0]) == 'T')
- && (toupper((unsigned char)value[1]) == 'C')) {
+ } else if ((strlen(value) == 3)
+ && (toupper((unsigned char)value[0]) == 'T')
+ && (toupper((unsigned char)value[1]) == 'C')) {
switch (toupper((unsigned char)value[2])) {
case 'A':
param_nid = NID_id_tc26_gost_3410_2012_256_paramSetA;
return pkey_gost_ctrl(ctx, EVP_PKEY_CTRL_GOST_PARAMSET,
param_nid, NULL);
}
- return -2;
+
+ return pkey_gost_ec_ctrl_str_common(ctx, type, value);
}
static int pkey_gost_ec_ctrl_str_512(EVP_PKEY_CTX *ctx,
int param_nid = NID_undef;
if (strcmp(type, param_ctrl_string))
- return -2;
+ return pkey_gost_ec_ctrl_str_common(ctx, type, value);
if (!value)
return 0;
case EVP_PKEY_CTRL_DIGESTINIT:
{
EVP_MD_CTX *mctx = p2;
- struct gost_mac_key *key;
if (!data->key_set) {
+ struct gost_mac_key *key;
EVP_PKEY *pkey = EVP_PKEY_CTX_get0_pkey(ctx);
if (!pkey) {
GOSTerr(GOST_F_PKEY_GOST_MAC_CTRL,
case EVP_PKEY_CTRL_DIGESTINIT:
{
EVP_MD_CTX *mctx = p2;
- struct gost_mac_key *key;
if (!data->key_set) {
+ struct gost_mac_key *key;
EVP_PKEY *pkey = EVP_PKEY_CTX_get0_pkey(ctx);
if (!pkey) {
GOSTerr(GOST_F_PKEY_GOST_OMAC_CTRL,