]> www.wagner.pp.ru Git - openssl-gost/engine.git/blobdiff - gost_omac_acpkm.c
Fix compilation with Microsoft Visual C.
[openssl-gost/engine.git] / gost_omac_acpkm.c
index 9bdb05f0e510ae2be0957531bfa777e329e79788..793a6d3fe60ed16b5583282111dbadc874476371 100644 (file)
@@ -150,13 +150,14 @@ static int CMAC_ACPKM_Init(CMAC_ACPKM_CTX *ctx, const void *key, size_t keylen,
     /* Non-NULL key means initialisation is complete */
     if (key) {
         unsigned char acpkm_iv[EVP_MAX_BLOCK_LENGTH];
+        int block_size, key_len;
 
         /* Initialize CTR for ACPKM-Master */
         if (!EVP_CIPHER_CTX_cipher(ctx->actx))
             return 0;
         /* block size of ACPKM cipher could be 1, but,
          * cbc cipher is same with correct block_size */
-        const int block_size = EVP_CIPHER_CTX_block_size(ctx->cctx);
+        block_size = EVP_CIPHER_CTX_block_size(ctx->cctx);
         /* Wide IV = 1^{n/2} || 0,
          * where a^r denotes the string that consists of r 'a' bits */
         memset(acpkm_iv, 0xff, block_size / 2);
@@ -164,7 +165,7 @@ static int CMAC_ACPKM_Init(CMAC_ACPKM_CTX *ctx, const void *key, size_t keylen,
         if (!EVP_EncryptInit_ex(ctx->actx, NULL, NULL, key, acpkm_iv))
             return 0;
         /* EVP_CIPHER key_len may be different from EVP_CIPHER_CTX key_len */
-        int key_len = EVP_CIPHER_key_length(EVP_CIPHER_CTX_cipher(ctx->actx));
+        key_len = EVP_CIPHER_key_length(EVP_CIPHER_CTX_cipher(ctx->actx));
 
         /* Generate first key material (K^1 || K^1_1) */
         if (!EVP_Cipher(ctx->actx, ctx->km, zero_iv, key_len + block_size))
@@ -254,7 +255,8 @@ static int CMAC_ACPKM_Update(CMAC_ACPKM_CTX *ctx, const void *in, size_t dlen)
 static int CMAC_ACPKM_Final(CMAC_ACPKM_CTX *ctx, unsigned char *out,
                             size_t *poutlen)
 {
-    int i, bl, lb;
+    int i, bl, lb, key_len;
+    unsigned char *k1, k2[EVP_MAX_BLOCK_LENGTH];
     if (ctx->nlast_block == -1)
         return 0;
     bl = EVP_CIPHER_CTX_block_size(ctx->cctx);
@@ -265,10 +267,9 @@ static int CMAC_ACPKM_Final(CMAC_ACPKM_CTX *ctx, unsigned char *out,
 
     if (!CMAC_ACPKM_Mesh(ctx))
         return 0;
-    int key_len = EVP_CIPHER_key_length(EVP_CIPHER_CTX_cipher(ctx->actx));
+    key_len = EVP_CIPHER_key_length(EVP_CIPHER_CTX_cipher(ctx->actx));
     /* Keys k1 and k2 */
-    unsigned char *k1 = ctx->km + key_len;
-    unsigned char k2[EVP_MAX_BLOCK_LENGTH];
+    k1 = ctx->km + key_len;
     make_kn(k2, ctx->km + key_len, bl);
 
     /* Is last block complete? */
@@ -425,6 +426,7 @@ int omac_acpkm_imit_ctrl(EVP_MD_CTX *ctx, int type, int arg, void *ptr)
             if (c->cipher_nid == NID_undef) {
                 switch (EVP_MD_nid(md)) {
                 case NID_grasshopper_mac:
+                case NID_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac:
                     c->cipher_nid = NID_grasshopper_cbc;
                     break;
                 }
@@ -464,7 +466,7 @@ int omac_acpkm_imit_ctrl(EVP_MD_CTX *ctx, int type, int arg, void *ptr)
             }
             return 1;
         }
-    case EVP_MD_CTRL_MAC_LEN:
+    case EVP_MD_CTRL_XOF_LEN:   /* Supported in OpenSSL */
         {
             OMAC_ACPKM_CTX *c = EVP_MD_CTX_md_data(ctx);
             switch (c->cipher_nid) {
@@ -475,6 +477,13 @@ int omac_acpkm_imit_ctrl(EVP_MD_CTX *ctx, int type, int arg, void *ptr)
                 }
                 c->dgst_size = arg;
                 break;
+            case NID_magma_cbc:
+                if (arg < 1 || arg > 8) {
+                    GOSTerr(GOST_F_OMAC_ACPKM_IMIT_CTRL, GOST_R_INVALID_MAC_SIZE);
+                    return 0;
+                }
+                c->dgst_size = arg;
+                break;
             default:
                 return 0;
             }
@@ -499,7 +508,7 @@ EVP_MD *grasshopper_omac_acpkm(void)
             || !EVP_MD_meth_set_result_size(md, MAX_GOST_OMAC_ACPKM_SIZE)
             || !EVP_MD_meth_set_input_blocksize(md, GRASSHOPPER_BLOCK_SIZE)
             || !EVP_MD_meth_set_app_datasize(md, sizeof(OMAC_ACPKM_CTX))
-            || !EVP_MD_meth_set_flags(md, 0)
+            || !EVP_MD_meth_set_flags(md, EVP_MD_FLAG_XOF)
             || !EVP_MD_meth_set_init(md, grasshopper_omac_acpkm_init)
             || !EVP_MD_meth_set_update(md, omac_acpkm_imit_update)
             || !EVP_MD_meth_set_final(md, omac_acpkm_imit_final)