]> www.wagner.pp.ru Git - openssl-gost/engine.git/blobdiff - gost_pmeth.c
Don't forget to remove some temporary files
[openssl-gost/engine.git] / gost_pmeth.c
index a8252172dbb304722c9a6044bbc8d19f5849bb09..789eeea8918d97ad2ec32d40629a3ada392c1f89 100644 (file)
@@ -30,20 +30,19 @@ static int pkey_gost_init(EVP_PKEY_CTX *ctx)
         return 0;
     memset(data, 0, sizeof(*data));
     if (pkey && EVP_PKEY_get0(pkey)) {
-        switch (EVP_PKEY_base_id(pkey)) {
-        case NID_id_GostR3410_2001:
-        case NID_id_GostR3410_2012_256:
-        case NID_id_GostR3410_2012_512:
+               int id =  (EVP_PKEY_base_id(pkey));
+        if (id == NID_id_GostR3410_2001 ||
+            id ==  NID_gost2012_256 ||
+            id == NID_gost2012_512)
             {
                 const EC_GROUP *group =
                     EC_KEY_get0_group(EVP_PKEY_get0((EVP_PKEY *)pkey));
                 if (group != NULL) {
                     data->sign_param_nid = EC_GROUP_get_curve_name(group);
-                    break;
                 }
-                /* else */
             }
-        default:
+        else 
+                       {
             OPENSSL_free(data);
             return 0;
         }
@@ -97,38 +96,33 @@ static int pkey_gost_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)
 
             OPENSSL_assert(p2 != NULL);
 
-            switch (EVP_MD_type((const EVP_MD *)p2)) {
-            case NID_id_GostR3411_94:
+            int md_type = EVP_MD_type((const EVP_MD *)p2);
+            if (md_type == NID_id_GostR3411_94) {
                 if (pkey_nid == NID_id_GostR3410_2001
                     || pkey_nid == NID_id_GostR3410_94) {
                     pctx->md = (EVP_MD *)p2;
                     return 1;
                 }
-                break;
-
-            case NID_id_GostR3411_2012_256:
-                if (pkey_nid == NID_id_GostR3410_2012_256) {
+                       } else if (md_type == NID_md_gost12_256) {
+                if (pkey_nid == NID_gost2012_256) {
                     pctx->md = (EVP_MD *)p2;
                     return 1;
                 }
-                break;
-
-            case NID_id_GostR3411_2012_512:
-                if (pkey_nid == NID_id_GostR3410_2012_512) {
+            } else if ( md_type == NID_md_gost12_512) {
+                if (pkey_nid == NID_gost2012_512) {
                     pctx->md = (EVP_MD *)p2;
                     return 1;
                 }
-                break;
             }
 
             GOSTerr(GOST_F_PKEY_GOST_CTRL, GOST_R_INVALID_DIGEST_TYPE);
             return 0;
         }
-
+#ifdef EVP_PKEY_CTRL_GET_MD
     case EVP_PKEY_CTRL_GET_MD:
         *(const EVP_MD **)p2 = pctx->md;
         return 1;
-
+#endif
     case EVP_PKEY_CTRL_PKCS7_ENCRYPT:
     case EVP_PKEY_CTRL_PKCS7_DECRYPT:
     case EVP_PKEY_CTRL_PKCS7_SIGN:
@@ -311,25 +305,19 @@ static int pkey_gost2012_paramgen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)
         return 0;
     }
 
-    switch (data->sign_param_nid) {
-    case NID_id_tc26_gost_3410_2012_512_paramSetA:
-    case NID_id_tc26_gost_3410_2012_512_paramSetB:
+    if (data->sign_param_nid == NID_id_tc26_gost_3410_2012_512_paramSetA ||
+        data->sign_param_nid == NID_id_tc26_gost_3410_2012_512_paramSetB) {
         result =
-            (EVP_PKEY_assign(pkey, NID_id_GostR3410_2012_512, ec)) ? 1 : 0;
-        break;
-
-    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:
-    case NID_id_GostR3410_2001_TestParamSet:
+            (EVP_PKEY_assign(pkey, NID_gost2012_512, ec)) ? 1 : 0;
+    } else 
+       if (data->sign_param_nid == NID_id_GostR3410_2001_CryptoPro_A_ParamSet ||
+    data->sign_param_nid == NID_id_GostR3410_2001_CryptoPro_B_ParamSet ||
+    data->sign_param_nid == NID_id_GostR3410_2001_CryptoPro_C_ParamSet ||
+    data->sign_param_nid == NID_id_GostR3410_2001_CryptoPro_XchA_ParamSet ||
+    data->sign_param_nid == NID_id_GostR3410_2001_CryptoPro_XchB_ParamSet ||
+    data->sign_param_nid == NID_id_GostR3410_2001_TestParamSet) {
         result =
-            (EVP_PKEY_assign(pkey, NID_id_GostR3410_2012_256, ec)) ? 1 : 0;
-        break;
-    default:
-        result = 0;
-        break;
+            (EVP_PKEY_assign(pkey, NID_gost2012_256, ec)) ? 1 : 0;
     }
 
     if (result == 0)
@@ -382,21 +370,18 @@ static int pkey_gost_ec_cp_sign(EVP_PKEY_CTX *ctx, unsigned char *sig,
     DSA_SIG *unpacked_sig = NULL;
     EVP_PKEY *pkey = EVP_PKEY_CTX_get0_pkey(ctx);
     int order = 0;
-
+       int id = EVP_PKEY_base_id(pkey);
     if (!siglen)
         return 0;
     if (!pkey)
         return 0;
 
-    switch (EVP_PKEY_base_id(pkey)) {
-    case NID_id_GostR3410_2001:
-    case NID_id_GostR3410_2012_256:
+    if (id == NID_id_GostR3410_2001 ||
+        id == NID_gost2012_256) {
         order = 64;
-        break;
-    case NID_id_GostR3410_2012_512:
+    } else if (id == NID_gost2012_512) {
         order = 128;
-        break;
-    default:
+    } else {
         return 0;
     }
 
@@ -470,6 +455,7 @@ static int pkey_gost_mac_init(EVP_PKEY_CTX *ctx)
     if (!data)
         return 0;
     memset(data, 0, sizeof(*data));
+       data->mac_size = 4;
     EVP_PKEY_CTX_set_data(ctx, data);
     return 1;
 }
@@ -513,11 +499,11 @@ static int pkey_gost_mac_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)
             data->md = (EVP_MD *)p2;
             return 1;
         }
-
+#ifdef EVP_PKEY_CTRL_GET_MD
     case EVP_PKEY_CTRL_GET_MD:
         *(const EVP_MD **)p2 = data->md;
         return 1;
-
+#endif
     case EVP_PKEY_CTRL_PKCS7_ENCRYPT:
     case EVP_PKEY_CTRL_PKCS7_DECRYPT:
     case EVP_PKEY_CTRL_PKCS7_SIGN:
@@ -553,6 +539,17 @@ static int pkey_gost_mac_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)
             }
             return mctx->digest->md_ctrl(mctx, EVP_MD_CTRL_SET_KEY, 32, key);
         }
+       case EVP_PKEY_CTRL_MAC_LEN:     
+               {
+                       if (p1<1 || p1>8)
+                               {
+                                       
+                                       GOSTerr(GOST_F_PKEY_GOST_MAC_CTRL,GOST_R_INVALID_MAC_SIZE);
+                                       return 0;
+                               }
+                               data->mac_size = p1;
+                               return 1;
+               }
     }
     return -2;
 }
@@ -584,6 +581,16 @@ static int pkey_gost_mac_ctrl_str(EVP_PKEY_CTX *ctx,
         return ret;
 
     }
+       if (!strcmp(type,maclen_ctrl_string)) {
+               char *endptr;
+               long size=strtol(value,&endptr,10);
+               if (*endptr!='\0') {
+                       GOSTerr(GOST_F_PKEY_GOST_MAC_CTRL_STR,
+                                  GOST_R_INVALID_MAC_SIZE);
+                       return 0;
+               }
+               return pkey_gost_mac_ctrl(ctx, EVP_PKEY_CTRL_MAC_LEN,size,NULL);
+       }
     return -2;
 }
 
@@ -624,6 +631,7 @@ static int pkey_gost_mac_signctx(EVP_PKEY_CTX *ctx, unsigned char *sig,
 {
     unsigned int tmpsiglen;
     int ret;
+       struct gost_mac_pmeth_data *data = EVP_PKEY_CTX_get_data(ctx);
 
     if (!siglen)
         return 0;
@@ -631,11 +639,13 @@ static int pkey_gost_mac_signctx(EVP_PKEY_CTX *ctx, unsigned char *sig,
                                  * sizeof(size_t) */
 
     if (!sig) {
-        *siglen = 4;
+        *siglen = data->mac_size;
         return 1;
     }
+
+       mctx->digest->md_ctrl(mctx, EVP_MD_CTRL_MAC_LEN, data->mac_size, NULL);
     ret = EVP_DigestFinal_ex(mctx, sig, &tmpsiglen);
-    *siglen = tmpsiglen;
+    *siglen = data->mac_size;
     return ret;
 }
 
@@ -646,8 +656,7 @@ int register_pmeth_gost(int id, EVP_PKEY_METHOD **pmeth, int flags)
     if (!*pmeth)
         return 0;
 
-    switch (id) {
-    case NID_id_GostR3410_2001:
+    if (id == NID_id_GostR3410_2001) {
         EVP_PKEY_meth_set_ctrl(*pmeth,
                                pkey_gost_ctrl, pkey_gost_ec_ctrl_str_256);
         EVP_PKEY_meth_set_sign(*pmeth, NULL, pkey_gost_ec_cp_sign);
@@ -663,8 +672,7 @@ int register_pmeth_gost(int id, EVP_PKEY_METHOD **pmeth, int flags)
                                  pkey_gost_derive_init, pkey_gost_ec_derive);
         EVP_PKEY_meth_set_paramgen(*pmeth, pkey_gost_paramgen_init,
                                    pkey_gost2001_paramgen);
-        break;
-    case NID_id_GostR3410_2012_256:
+    } else if (id == NID_gost2012_256) {
         EVP_PKEY_meth_set_ctrl(*pmeth,
                                pkey_gost_ctrl, pkey_gost_ec_ctrl_str_256);
         EVP_PKEY_meth_set_sign(*pmeth, NULL, pkey_gost_ec_cp_sign);
@@ -681,8 +689,7 @@ int register_pmeth_gost(int id, EVP_PKEY_METHOD **pmeth, int flags)
         EVP_PKEY_meth_set_paramgen(*pmeth,
                                    pkey_gost_paramgen_init,
                                    pkey_gost2012_paramgen);
-        break;
-    case NID_id_GostR3410_2012_512:
+    } else if (id == NID_gost2012_512 ) {
         EVP_PKEY_meth_set_ctrl(*pmeth,
                                pkey_gost_ctrl, pkey_gost_ec_ctrl_str_512);
         EVP_PKEY_meth_set_sign(*pmeth, NULL, pkey_gost_ec_cp_sign);
@@ -699,8 +706,7 @@ int register_pmeth_gost(int id, EVP_PKEY_METHOD **pmeth, int flags)
         EVP_PKEY_meth_set_paramgen(*pmeth,
                                    pkey_gost_paramgen_init,
                                    pkey_gost2012_paramgen);
-        break;
-    case NID_id_Gost28147_89_MAC:
+    } else if (id == NID_id_Gost28147_89_MAC) {
         EVP_PKEY_meth_set_ctrl(*pmeth, pkey_gost_mac_ctrl,
                                pkey_gost_mac_ctrl_str);
         EVP_PKEY_meth_set_signctx(*pmeth, pkey_gost_mac_signctx_init,
@@ -709,8 +715,8 @@ int register_pmeth_gost(int id, EVP_PKEY_METHOD **pmeth, int flags)
         EVP_PKEY_meth_set_init(*pmeth, pkey_gost_mac_init);
         EVP_PKEY_meth_set_cleanup(*pmeth, pkey_gost_mac_cleanup);
         EVP_PKEY_meth_set_copy(*pmeth, pkey_gost_mac_copy);
-        return 1;
-    case NID_gost_mac_12:
+               return 1;
+    } else if (id == NID_gost_mac_12) {
         EVP_PKEY_meth_set_ctrl(*pmeth, pkey_gost_mac_ctrl,
                                pkey_gost_mac_ctrl_str);
         EVP_PKEY_meth_set_signctx(*pmeth, pkey_gost_mac_signctx_init,
@@ -719,8 +725,9 @@ int register_pmeth_gost(int id, EVP_PKEY_METHOD **pmeth, int flags)
         EVP_PKEY_meth_set_init(*pmeth, pkey_gost_mac_init);
         EVP_PKEY_meth_set_cleanup(*pmeth, pkey_gost_mac_cleanup);
         EVP_PKEY_meth_set_copy(*pmeth, pkey_gost_mac_copy);
-        return 1;
-    default:                   /* Unsupported method */
+               return 1;
+    } else {
+       /* Unsupported method */
         return 0;
     }
     EVP_PKEY_meth_set_init(*pmeth, pkey_gost_init);