]> www.wagner.pp.ru Git - openssl-gost/engine.git/blobdiff - gost_crypt.c
Merge https://github.com/gost-engine/engine
[openssl-gost/engine.git] / gost_crypt.c
index 52aad0a2a59d08eecd2190dc2811e530779374c9..66e769d355a747fc6ea88f6423bdeda80084aa0d 100644 (file)
@@ -205,8 +205,13 @@ const struct gost_cipher_info *get_encryption_params(ASN1_OBJECT *obj)
     struct gost_cipher_info *param;
     if (!obj) {
         const char *params = get_gost_engine_param(GOST_PARAM_CRYPT_PARAMS);
-        if (!params || !strlen(params))
-            return &gost_cipher_list[4];
+        if (!params || !strlen(params)) {
+            int i;
+            for (i = 0; gost_cipher_list[i].nid != NID_undef; i++)
+                if (gost_cipher_list[i].nid == NID_id_tc26_gost_28147_param_Z)
+                    return &gost_cipher_list[i];
+            return &gost_cipher_list[0];
+        }
 
         nid = OBJ_txt2nid(params);
         if (nid == NID_undef) {
@@ -761,24 +766,46 @@ int gost_imit_ctrl(EVP_MD_CTX *ctx, int type, int arg, void *ptr)
         return 1;
     case EVP_MD_CTRL_SET_KEY:
         {
-            if (arg != 32) {
-                GOSTerr(GOST_F_GOST_IMIT_CTRL, GOST_R_INVALID_MAC_KEY_SIZE);
-                return 0;
+                                   struct ossl_gost_imit_ctx *gost_imit_ctx = ctx->md_data;
+
+                                   if (ctx->digest->init(ctx) <= 0) {
+                                       GOSTerr(GOST_F_GOST_IMIT_CTRL, GOST_R_MAC_KEY_NOT_SET);
+                                       return 0;
+                                   }
+                                         ctx->flags |= EVP_MD_CTX_FLAG_NO_INIT;
+
+            if (arg == 0) {
+                                                   struct gost_mac_key *key = (struct gost_mac_key*) ptr;
+                                                               if (key->mac_param_nid != NID_undef) {
+                                                                       const struct gost_cipher_info *param = get_encryption_params(OBJ_nid2obj(key->mac_param_nid));
+                                                                       if (param == NULL)
+                                                                       {
+                    GOSTerr(GOST_F_GOST_IMIT_CTRL, GOST_R_INVALID_MAC_PARAMS);
+                    return 0;
+                                                                       }
+                                                                       gost_init(&(gost_imit_ctx->cctx), param->sblock);
+                                                               }
+                                                               gost_key(&(gost_imit_ctx->cctx), key->key);
+                gost_imit_ctx->key_set = 1;
+
+                                                               return 1;
             }
-
-            gost_key(&(((struct ossl_gost_imit_ctx *)(ctx->md_data))->cctx),
-                     ptr);
-            ((struct ossl_gost_imit_ctx *)(ctx->md_data))->key_set = 1;
+                                               else if (arg == 32)
+                                               {
+            gost_key(&(gost_imit_ctx->cctx), ptr);
+            gost_imit_ctx->key_set = 1;
             return 1;
-
+                                               }
+            GOSTerr(GOST_F_GOST_IMIT_CTRL, GOST_R_INVALID_MAC_KEY_SIZE);
+            return 0;
         }
     case EVP_MD_CTRL_MAC_LEN:
         {
+            struct ossl_gost_imit_ctx *c = ctx->md_data;
             if (arg < 1 || arg > 8) {
                 GOSTerr(GOST_F_GOST_IMIT_CTRL, GOST_R_INVALID_MAC_SIZE);
                 return 0;
             }
-            struct ossl_gost_imit_ctx *c = ctx->md_data;
             c->dgst_size=arg;
             return 1;
         }