Signed-off-by: Vladimir Serbinenko <phco...@gmail.com>
---
 .../lib/libgcrypt-patches/06_blake.patch      | 80 +++++++++++++++++++
 include/grub/crypto.h                         |  6 ++
 util/import_gcry.py                           | 36 +++++++--
 3 files changed, 115 insertions(+), 7 deletions(-)
 create mode 100644 grub-core/lib/libgcrypt-patches/06_blake.patch

diff --git a/grub-core/lib/libgcrypt-patches/06_blake.patch 
b/grub-core/lib/libgcrypt-patches/06_blake.patch
new file mode 100644
index 000000000..19543dc87
--- /dev/null
+++ b/grub-core/lib/libgcrypt-patches/06_blake.patch
@@ -0,0 +1,80 @@
+--- a/grub-core/lib/libgcrypt-grub/cipher/blake2.c
++++ b/grub-core/lib/libgcrypt-grub/cipher/blake2.c
+@@ -784,68 +784,6 @@
+   return blake2s_init(c, key, keylen);
+ }
+ 
+-/* Selftests from "RFC 7693, Appendix E. BLAKE2b and BLAKE2s Self-Test
+- * Module C Source". */
+-static void selftest_seq(byte *out, size_t len, u32 seed)
+-{
+-  size_t i;
+-  u32 t, a, b;
+-
+-  a = 0xDEAD4BAD * seed;
+-  b = 1;
+-
+-  for (i = 0; i < len; i++)
+-    {
+-      t = a + b;
+-      a = b;
+-      b = t;
+-      out[i] = (t >> 24) & 0xFF;
+-    }
+-}
+-
+-
+-
+-
+-gcry_err_code_t _gcry_blake2_init_with_key(void *ctx, unsigned int flags,
+-                                         const unsigned char *key,
+-                                         size_t keylen, int algo)
+-{
+-  gcry_err_code_t rc;
+-  switch (algo)
+-    {
+-    case GCRY_MD_BLAKE2B_512:
+-      rc = blake2b_init_ctx (ctx, flags, key, keylen, 512);
+-      break;
+-    case GCRY_MD_BLAKE2B_384:
+-      rc = blake2b_init_ctx (ctx, flags, key, keylen, 384);
+-      break;
+-    case GCRY_MD_BLAKE2B_256:
+-      rc = blake2b_init_ctx (ctx, flags, key, keylen, 256);
+-      break;
+-    case GCRY_MD_BLAKE2B_160:
+-      rc = blake2b_init_ctx (ctx, flags, key, keylen, 160);
+-      break;
+-    case GCRY_MD_BLAKE2S_256:
+-      rc = blake2s_init_ctx (ctx, flags, key, keylen, 256);
+-      break;
+-    case GCRY_MD_BLAKE2S_224:
+-      rc = blake2s_init_ctx (ctx, flags, key, keylen, 224);
+-      break;
+-    case GCRY_MD_BLAKE2S_160:
+-      rc = blake2s_init_ctx (ctx, flags, key, keylen, 160);
+-      break;
+-    case GCRY_MD_BLAKE2S_128:
+-      rc = blake2s_init_ctx (ctx, flags, key, keylen, 128);
+-      break;
+-    default:
+-      rc = GPG_ERR_DIGEST_ALGO;
+-      break;
+-    }
+-
+-  return rc;
+-}
+-
+-
+ #define DEFINE_BLAKE2_VARIANT(bs, BS, dbits, oid_branch) \
+   static void blake2##bs##_##dbits##_init(void *ctx, unsigned int flags) \
+   { \
+@@ -879,7 +817,7 @@
+       dbits / 8, blake2##bs##_##dbits##_init, blake2##bs##_write, \
+       blake2##bs##_final, blake2##bs##_read, NULL, \
+       _gcry_blake2##bs##_##dbits##_hash_buffers, \
+-      sizeof (BLAKE2##BS##_CONTEXT), selftests_blake2##bs \
++      sizeof (BLAKE2##BS##_CONTEXT) \
+     , \
+     GRUB_UTIL_MODNAME("gcry_blake2") \
+     .blocksize = GRUB_BLAKE2 ## BS ## _BLOCK_SIZE \
diff --git a/include/grub/crypto.h b/include/grub/crypto.h
index 25b118898..4f15a7818 100644
--- a/include/grub/crypto.h
+++ b/include/grub/crypto.h
@@ -586,8 +586,14 @@ void grub_gcry_fini_all (void);
 int
 grub_get_random (void *out, grub_size_t len);
 
+#define GRUB_UTIL_MODNAME(x) .modname = x,
+#else
+#define GRUB_UTIL_MODNAME(x)
 #endif
 
+#define GRUB_BLAKE2B_BLOCK_SIZE 128
+#define GRUB_BLAKE2S_BLOCK_SIZE 64
+
 typedef struct _gpgrt_b64state *gpgrt_b64state_t;
 gpgrt_b64state_t gpgrt_b64dec_start (const char *title);
 gpg_error_t      gpgrt_b64dec_proc (gpgrt_b64state_t state,
diff --git a/util/import_gcry.py b/util/import_gcry.py
index a4411ecb9..b6ddde9cd 100644
--- a/util/import_gcry.py
+++ b/util/import_gcry.py
@@ -120,7 +120,8 @@ mdblocksizes = {"_gcry_digest_spec_crc32" : 64,
                 "_gcry_digest_spec_gost3411_94": 32,
                 "_gcry_digest_spec_gost3411_cp": 32,
                 "_gcry_digest_spec_cshake128": 64,
-                "_gcry_digest_spec_cshake256": 64}
+                "_gcry_digest_spec_cshake256": 64,
+                "_gcry_digest_spec_blake2": "GRUB_BLAKE2 ## BS ## _BLOCK_SIZE"}
 
 cryptolist = codecs.open (os.path.join (cipher_dir_out, "crypto.lst"), "w", 
"utf-8")
 
@@ -209,6 +210,7 @@ for cipher_file in cipher_files:
         skip = 0
         skip2 = False
         ismd = False
+        ismddefine = False
         mdarg = 0
         ispk = False
         iscipher = False
@@ -245,19 +247,19 @@ for cipher_file in cipher_files:
                 mdarg = mdarg + len (spl) - 1
             if ismd or iscipher or ispk:
                 if not re.search (" *};", line) is None:
+                    escapenl = " \\" if ismddefine else ""
                     if not iscomma:
-                        fw.write ("    ,\n")
-                    fw.write ("#ifdef GRUB_UTIL\n");
-                    fw.write ("    .modname = \"%s\",\n" % modname);
-                    fw.write ("#endif\n");
+                        fw.write (f"    ,{escapenl}\n")
+                    fw.write (f"    GRUB_UTIL_MODNAME(\"%s\"){escapenl}\n" % 
modname);
                     if ismd:
                         if not (mdname in mdblocksizes):
                             print ("ERROR: Unknown digest blocksize: %s\n"
                                    % mdname)
                             exit (1)
-                        fw.write ("    .blocksize = %s\n"
+                        fw.write (f"    .blocksize = %s{escapenl}\n"
                                   % mdblocksizes [mdname])
                     ismd = False
+                    ismddefine = False
                     mdarg = 0
                     iscipher = False
                     ispk = False
@@ -281,7 +283,7 @@ for cipher_file in cipher_files:
                 hold = False
                 # We're optimising for size and exclude anything needing good
                 # randomness.
-                if re.match 
("(_gcry_hash_selftest_check_one|bulk_selftest_setkey|run_selftests|do_tripledes_set_extra_info|selftest|sm4_selftest|_gcry_[a-z0-9_]*_hash_buffers|_gcry_sha1_hash_buffer|tripledes_set2keys|_gcry_rmd160_mixblock|serpent_test|dsa_generate_ext|test_keys|gen_k|sign|gen_x931_parm_xp|generate_x931|generate_key|dsa_generate|dsa_sign|ecc_sign|generate|generate_fips186|_gcry_register_pk_dsa_progress|_gcry_register_pk_ecc_progress|progress|scanval|ec2os|ecc_generate_ext|ecc_generate|ecc_get_param|_gcry_register_pk_dsa_progress|gen_x931_parm_xp|gen_x931_parm_xi|rsa_decrypt|rsa_sign|rsa_generate_ext|rsa_generate|secret|check_exponent|rsa_blind|rsa_unblind|extract_a_from_sexp|curve_free|curve_copy|point_set|_gcry_dsa_gen_rfc6979_k|bits2octets|int2octets|_gcry_md_debug|_gcry_md_selftest|_gcry_md_is_enabled|_gcry_md_is_secure|_gcry_md_init|_gcry_md_info|md_get_algo|md_extract|_gcry_md_get
 |_gcry_md_get_algo 
|_gcry_md_extract|_gcry_md_setkey|md_setkey|prepare_macpads|_gcry_md_algo_name|search_oid|spec_from_oid|spec_from_name|spec_from_algo|map_algo|cshake_hash_buffers)",
 line) is not None:
+                if re.match 
("(_gcry_hash_selftest_check_one|bulk_selftest_setkey|run_selftests|do_tripledes_set_extra_info|selftest|sm4_selftest|_gcry_[a-z0-9_]*_hash_buffers|_gcry_sha1_hash_buffer|tripledes_set2keys|_gcry_rmd160_mixblock|serpent_test|dsa_generate_ext|test_keys|gen_k|sign|gen_x931_parm_xp|generate_x931|generate_key|dsa_generate|dsa_sign|ecc_sign|generate|generate_fips186|_gcry_register_pk_dsa_progress|_gcry_register_pk_ecc_progress|progress|scanval|ec2os|ecc_generate_ext|ecc_generate|ecc_get_param|_gcry_register_pk_dsa_progress|gen_x931_parm_xp|gen_x931_parm_xi|rsa_decrypt|rsa_sign|rsa_generate_ext|rsa_generate|secret|check_exponent|rsa_blind|rsa_unblind|extract_a_from_sexp|curve_free|curve_copy|point_set|_gcry_dsa_gen_rfc6979_k|bits2octets|int2octets|_gcry_md_debug|_gcry_md_selftest|_gcry_md_is_enabled|_gcry_md_is_secure|_gcry_md_init|_gcry_md_info|md_get_algo|md_extract|_gcry_md_get
 |_gcry_md_get_algo 
|_gcry_md_extract|_gcry_md_setkey|md_setkey|prepare_macpads|_gcry_md_algo_name|search_oid|spec_from_oid|spec_from_name|spec_from_algo|map_algo|cshake_hash_buffers|blake2b_vl_hash|selftest_seq)",
 line) is not None:
 
                     skip = 1
                     if not re.match ("selftest", line) is None and cipher_file 
== "idea.c":
@@ -355,6 +357,13 @@ for cipher_file in cipher_files:
                 ispk = True
                 iscryptostart = True
 
+            m = re.match (r"DEFINE_BLAKE2_VARIANT\((.), (.), ([0-9]*)", line)
+            if isc and not m is None:
+                bs = m.groups()[0]
+                bits = m.groups()[2]
+                mdname = f"_gcry_digest_spec_blake2{bs}_{bits}"
+                mdnames.append (mdname)
+
             m = re.match ("(const )?gcry_md_spec_t", line)
             if isc and not m is None:
                 assert (not ismd)
@@ -366,6 +375,19 @@ for cipher_file in cipher_files:
                 mdname = re.match("[a-zA-Z0-9_]*",mdname).group ()
                 mdnames.append (mdname)
                 ismd = True
+                ismddefine = False
+                mdarg = 0
+                iscryptostart = True
+            m = re.match ("  (const )?gcry_md_spec_t 
_gcry_digest_spec_blake2.*\\\\", line)
+            if isc and not m is None:
+                assert (not ismd)
+                assert (not ispk)
+                assert (not iscipher)
+                assert (not iscryptostart)
+                line = removeprefix(line, "  const ")
+                ismd = True
+                ismddefine = True
+                mdname = "_gcry_digest_spec_blake2"
                 mdarg = 0
                 iscryptostart = True
             m = re.match (r"static const char \*selftest.*;$", line)
-- 
2.49.0


_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to