]> wagner.pp.ru Git - openssl-gost/engine.git/commitdiff
gost_crypt: Add some sanity checking to GOST_init_cipher
authorVitaly Chikunov <vt@altlinux.org>
Tue, 12 May 2020 09:26:01 +0000 (12:26 +0300)
committerDmitry Belyavskiy <beldmit@users.noreply.github.com>
Tue, 12 May 2020 09:55:47 +0000 (12:55 +0300)
- Stream cipher should have block_size 1, other should not.
- Stream cipher should not have padding.
- If IV is specified Custom IV flag should be set.

gost_crypt.c

index 8a2b960835ccae73956ebd0790d8c2f679be4e28..8277fa2536b3713bf1f9d37a427049c3bd0994af 100644 (file)
@@ -86,10 +86,30 @@ EVP_CIPHER *GOST_init_cipher(GOST_cipher *c)
     if (c->cipher)
         return c->cipher;
 
+    /* Some sanity checking. */
+    int flags = c->flags | TPL_VAL(c, flags);
+    int block_size = TPL(c, block_size);
+    switch (flags & EVP_CIPH_MODE) {
+    case EVP_CIPH_CTR_MODE:
+    case EVP_CIPH_CFB_MODE:
+    case EVP_CIPH_OFB_MODE:
+        OPENSSL_assert(block_size == 1);
+        OPENSSL_assert(flags & EVP_CIPH_NO_PADDING);
+        break;
+    default:
+        OPENSSL_assert(block_size != 1);
+        OPENSSL_assert(!(flags & EVP_CIPH_NO_PADDING));
+    }
+
+    if (TPL(c, iv_len))
+        OPENSSL_assert(flags & EVP_CIPH_CUSTOM_IV);
+    else
+        OPENSSL_assert(!(flags & EVP_CIPH_CUSTOM_IV));
+
     EVP_CIPHER *cipher;
-    if (!(cipher = EVP_CIPHER_meth_new(c->nid, TPL(c, block_size), TPL(c, key_len)))
+    if (!(cipher = EVP_CIPHER_meth_new(c->nid, block_size, TPL(c, key_len)))
         || !EVP_CIPHER_meth_set_iv_length(cipher, TPL(c, iv_len))
-        || !EVP_CIPHER_meth_set_flags(cipher, c->flags | TPL_VAL(c, flags))
+        || !EVP_CIPHER_meth_set_flags(cipher, flags)
         || !EVP_CIPHER_meth_set_init(cipher, TPL(c, init))
         || !EVP_CIPHER_meth_set_do_cipher(cipher, TPL(c, do_cipher))
         || !EVP_CIPHER_meth_set_cleanup(cipher, TPL(c, cleanup))