]> wagner.pp.ru Git - openssl-gost/engine.git/blobdiff - gost_pmeth.c
Provide cmake test if alignment requirement is strict
[openssl-gost/engine.git] / gost_pmeth.c
index af92fbf93c3f85d05eddc9786dddbf7c51bf3c83..9c1d602c303ba030196775ef357ebd6868b4624b 100644 (file)
@@ -148,10 +148,25 @@ static int pkey_gost_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)
         pctx->sign_param_nid = (int)p1;
         return 1;
     case EVP_PKEY_CTRL_SET_IV:
-        OPENSSL_assert(p2 != NULL);
+       if (p1 > sizeof(pctx->shared_ukm) || !p2) {
+           GOSTerr(GOST_F_PKEY_GOST_CTRL, GOST_R_UKM_NOT_SET);
+           return 0;
+       }
         memcpy(pctx->shared_ukm, p2, (int)p1);
         pctx->shared_ukm_size = p1;
         return 1;
+    case EVP_PKEY_CTRL_SET_VKO:
+       switch (p1) {
+           case 0: /* switch to KEG */
+           case NID_id_GostR3411_2012_256:
+           case NID_id_GostR3411_2012_512:
+               break;
+           default:
+               GOSTerr(GOST_F_PKEY_GOST_CTRL, GOST_R_INVALID_DIGEST_TYPE);
+               return 0;
+       }
+        pctx->vko_dgst_nid = p1;
+        return 1;
   case EVP_PKEY_CTRL_CIPHER:
         switch (p1) {
           case NID_magma_ctr_acpkm:
@@ -202,6 +217,19 @@ static int pkey_gost_ec_ctrl_str_common(EVP_PKEY_CTX *ctx,
     OPENSSL_free(tmp);
 
     return pkey_gost_ctrl(ctx, EVP_PKEY_CTRL_SET_IV, len, ukm_buf);
+  } else if (strcmp(type, vko_ctrl_string) == 0) {
+      int bits = atoi(value);
+      int vko_dgst_nid = 0;
+
+      if (bits == 256)
+         vko_dgst_nid = NID_id_GostR3411_2012_256;
+      else if (bits == 512)
+         vko_dgst_nid = NID_id_GostR3411_2012_512;
+      else if (bits != 0) {
+         GOSTerr(GOST_F_PKEY_GOST_EC_CTRL_STR_COMMON, GOST_R_INVALID_DIGEST_TYPE);
+         return 0;
+      }
+      return pkey_gost_ctrl(ctx, EVP_PKEY_CTRL_SET_VKO, vko_dgst_nid, NULL);
   }
   return -2;
 }