]> wagner.pp.ru Git - openssl-gost/engine.git/blobdiff - gost_ameth.c
Merge pull request #181 from vt-alt/issues/174
[openssl-gost/engine.git] / gost_ameth.c
index df595207fadc43d5f7e5a53aa7ac7bb639383a34..b73f9189dd0ce2bbfab343f41b0e8198058c2270 100644 (file)
@@ -67,11 +67,18 @@ static ASN1_STRING *encode_gost_algor_params(const EVP_PKEY *key)
     switch (EVP_PKEY_base_id(key)) {
     case NID_id_GostR3410_2012_256:
         pkey_param_nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(key_ptr));
-        gkp->hash_params = OBJ_nid2obj(NID_id_GostR3411_2012_256);
+       switch (pkey_param_nid) {
+           case NID_id_GostR3410_2001_TestParamSet:
+           case NID_id_GostR3410_2001_CryptoPro_A_ParamSet:
+           case NID_id_GostR3410_2001_CryptoPro_B_ParamSet:
+           case NID_id_GostR3410_2001_CryptoPro_C_ParamSet:
+           case NID_id_GostR3410_2001_CryptoPro_XchA_ParamSet:
+           case NID_id_GostR3410_2001_CryptoPro_XchB_ParamSet:
+               gkp->hash_params = OBJ_nid2obj(NID_id_GostR3411_2012_256);
+       }
         break;
     case NID_id_GostR3410_2012_512:
         pkey_param_nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(key_ptr));
-        gkp->hash_params = OBJ_nid2obj(NID_id_GostR3411_2012_512);
         break;
     case NID_id_GostR3410_2001:
         pkey_param_nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(key_ptr));
@@ -341,7 +348,7 @@ static int priv_decode_gost(EVP_PKEY *pk,
     const X509_ALGOR *palg = NULL;
     const ASN1_OBJECT *palg_obj = NULL;
     ASN1_INTEGER *priv_key = NULL;
-    int expected_key_len = 32;
+    int expected_key_len;
 
     if (!PKCS8_pkey_get0(&palg_obj, &pkey_buf, &priv_len, &palg, p8inf))
         return 0;
@@ -712,13 +719,13 @@ static int pub_encode_gost_ec(X509_PUBKEY *pub, const EVP_PKEY *pk)
     const EC_POINT *pub_key;
     BIGNUM *X = NULL, *Y = NULL, *order = NULL;
     const EC_KEY *ec = EVP_PKEY_get0((EVP_PKEY *)pk);
-    int ptype = V_ASN1_UNDEF;
+    int ptype = V_ASN1_SEQUENCE;
+    ASN1_STRING *params;
 
     algobj = OBJ_nid2obj(EVP_PKEY_base_id(pk));
 
-    ASN1_STRING *params = encode_gost_algor_params(pk);
+    params = encode_gost_algor_params(pk);
     pval = params;
-    ptype = V_ASN1_SEQUENCE;
 
     order = BN_new();
     if (!order) {
@@ -766,8 +773,8 @@ static int pub_encode_gost_ec(X509_PUBKEY *pub, const EVP_PKEY *pk)
     }
 
     ret = i2d_ASN1_OCTET_STRING(octet, &buf);
-    ASN1_BIT_STRING_free(octet);
  err:
+    ASN1_BIT_STRING_free(octet);
     if (X)
         BN_free(X);
     if (Y)