Looks good. Reviewed-by: Vladimir Serbinenko <phco...@gmail.com>

Regards
Vladimir 'phcoder' Serbinenko

Le mer. 6 août 2025, 10:16, Gary Lin <g...@suse.com> a écrit :

> This commit introduces grub_crypto_argon2() which leverages the
> '_gcry_kdf_*' functions from libgcrypt to provide Argon2 support.
>
> Due to the dependency of the '_gcry_kdf_*' functions, the order of
> 'ldadd' entries have to be tweaked in Makefile.util.def so that the
> linker can discover those functions.
>
> Signed-off-by: Gary Lin <g...@suse.com>
> ---
>  Makefile.util.def           | 19 +++++++-------
>  grub-core/Makefile.core.def |  5 ++++
>  grub-core/lib/argon2.c      | 52 +++++++++++++++++++++++++++++++++++++
>  include/grub/crypto.h       |  9 +++++++
>  4 files changed, 76 insertions(+), 9 deletions(-)
>  create mode 100644 grub-core/lib/argon2.c
>
> diff --git a/Makefile.util.def b/Makefile.util.def
> index 038253b37..820897bff 100644
> --- a/Makefile.util.def
> +++ b/Makefile.util.def
> @@ -43,6 +43,7 @@ library = {
>    common = grub-core/disk/key_protector.c;
>    common = grub-core/disk/cryptodisk.c;
>    common = grub-core/disk/AFSplitter.c;
> +  common = grub-core/lib/argon2.c;
>    common = grub-core/lib/pbkdf2.c;
>    common = grub-core/commands/extcmd.c;
>    common = grub-core/lib/arg.c;
> @@ -225,8 +226,8 @@ program = {
>    cflags = '-I$(srcdir)/grub-core/lib/tss2
> -I$(srcdir)/grub-core/commands/tpm2_key_protector';
>
>    ldadd = libgrubmods.a;
> -  ldadd = libgrubgcry.a;
>    ldadd = libgrubkern.a;
> +  ldadd = libgrubgcry.a;
>    ldadd = grub-core/lib/gnulib/libgnu.a;
>    ldadd = '$(LIBTASN1)';
>    ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR)
> $(LIBGEOM)';
> @@ -323,8 +324,8 @@ program = {
>    common = grub-core/osdep/init.c;
>
>    ldadd = libgrubmods.a;
> -  ldadd = libgrubgcry.a;
>    ldadd = libgrubkern.a;
> +  ldadd = libgrubgcry.a;
>    ldadd = grub-core/lib/gnulib/libgnu.a;
>    ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR)
> $(LIBGEOM)';
>  };
> @@ -378,8 +379,8 @@ program = {
>    common = grub-core/osdep/init.c;
>
>    ldadd = libgrubmods.a;
> -  ldadd = libgrubgcry.a;
>    ldadd = libgrubkern.a;
> +  ldadd = libgrubgcry.a;
>    ldadd = grub-core/lib/gnulib/libgnu.a;
>    ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR)
> $(LIBGEOM)';
>  };
> @@ -466,8 +467,8 @@ program = {
>    common = grub-core/kern/emu/argp_common.c;
>
>    ldadd = libgrubmods.a;
> -  ldadd = libgrubgcry.a;
>    ldadd = libgrubkern.a;
> +  ldadd = libgrubgcry.a;
>    ldadd = grub-core/lib/gnulib/libgnu.a;
>    ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR)
> $(LIBGEOM)';
>  };
> @@ -605,8 +606,8 @@ program = {
>
>    ldadd = '$(LIBLZMA)';
>    ldadd = libgrubmods.a;
> -  ldadd = libgrubgcry.a;
>    ldadd = libgrubkern.a;
> +  ldadd = libgrubgcry.a;
>    ldadd = grub-core/lib/gnulib/libgnu.a;
>    ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR)
> $(LIBGEOM)';
>
> @@ -691,8 +692,8 @@ program = {
>
>    ldadd = '$(LIBLZMA)';
>    ldadd = libgrubmods.a;
> -  ldadd = libgrubgcry.a;
>    ldadd = libgrubkern.a;
> +  ldadd = libgrubgcry.a;
>    ldadd = grub-core/lib/gnulib/libgnu.a;
>    ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR)
> $(LIBGEOM)';
>  };
> @@ -1400,8 +1401,8 @@ program = {
>    common = grub-core/kern/emu/argp_common.c;
>
>    ldadd = libgrubmods.a;
> -  ldadd = libgrubgcry.a;
>    ldadd = libgrubkern.a;
> +  ldadd = libgrubgcry.a;
>    ldadd = grub-core/lib/gnulib/libgnu.a;
>    ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
>  };
> @@ -1434,8 +1435,8 @@ program = {
>    common = grub-core/osdep/init.c;
>
>    ldadd = libgrubmods.a;
> -  ldadd = libgrubgcry.a;
>    ldadd = libgrubkern.a;
> +  ldadd = libgrubgcry.a;
>    ldadd = grub-core/lib/gnulib/libgnu.a;
>    ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
>  };
> @@ -1463,8 +1464,8 @@ program = {
>    common = grub-core/osdep/init.c;
>
>    ldadd = libgrubmods.a;
> -  ldadd = libgrubgcry.a;
>    ldadd = libgrubkern.a;
> +  ldadd = libgrubgcry.a;
>    ldadd = grub-core/lib/gnulib/libgnu.a;
>    ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
>  };
> diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
> index b3f71196a..16166b1ed 100644
> --- a/grub-core/Makefile.core.def
> +++ b/grub-core/Makefile.core.def
> @@ -1694,6 +1694,11 @@ module = {
>    common = lib/pbkdf2.c;
>  };
>
> +module = {
> +  name = argon2;
> +  common = lib/argon2.c;
> +};
> +
>  module = {
>    name = relocator;
>    common = lib/relocator.c;
> diff --git a/grub-core/lib/argon2.c b/grub-core/lib/argon2.c
> new file mode 100644
> index 000000000..12ad7ad1c
> --- /dev/null
> +++ b/grub-core/lib/argon2.c
> @@ -0,0 +1,52 @@
> +/*
> + *  GRUB  --  GRand Unified Bootloader
> + *  Copyright (C) 2025  Free Software Foundation, Inc.
> + *
> + *  GRUB is free software: you can redistribute it and/or modify
> + *  it under the terms of the GNU General Public License as published by
> + *  the Free Software Foundation, either version 3 of the License, or
> + *  (at your option) any later version.
> + *
> + *  GRUB is distributed in the hope that it will be useful,
> + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *  GNU General Public License for more details.
> + *
> + *  You should have received a copy of the GNU General Public License
> + *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#include <grub/crypto.h>
> +#include <grub/dl.h>
> +
> +GRUB_MOD_LICENSE ("GPLv3+");
> +
> +gcry_err_code_t
> +grub_crypto_argon2 (int subalgo,
> +                   const unsigned long *param, unsigned int paramlen,
> +                   const void *password, grub_size_t passwordlen,
> +                   const void *salt, grub_size_t saltlen,
> +                   const void *key, grub_size_t keylen,
> +                   const void *ad, grub_size_t adlen,
> +                   grub_size_t resultlen, void *result)
> +{
> +  gcry_kdf_hd_t hd = {0};
> +  gpg_err_code_t err;
> +
> +  if (saltlen == 0)
> +    return GPG_ERR_INV_VALUE;
> +
> +  err = _gcry_kdf_open (&hd, GRUB_GCRY_KDF_ARGON2, subalgo, param,
> paramlen,
> +                       password, passwordlen, salt, saltlen, key, keylen,
> +                       ad, adlen);
> +  if (err != GPG_ERR_NO_ERROR)
> +    return err;
> +
> +  err = _gcry_kdf_compute (hd, NULL);
> +  if (err == GPG_ERR_NO_ERROR)
> +    err = _gcry_kdf_final (hd, resultlen, result);
> +
> +  _gcry_kdf_close (hd);
> +
> +  return err;
> +}
> diff --git a/include/grub/crypto.h b/include/grub/crypto.h
> index d323f00ce..c6eb8b2d2 100644
> --- a/include/grub/crypto.h
> +++ b/include/grub/crypto.h
> @@ -573,6 +573,15 @@ grub_crypto_pbkdf2 (const struct gcry_md_spec *md,
>                     unsigned int c,
>                     grub_uint8_t *DK, grub_size_t dkLen);
>
> +gcry_err_code_t
> +grub_crypto_argon2 (int subalgo,
> +                   const unsigned long *param, unsigned int paramlen,
> +                   const void *password, grub_size_t passwordlen,
> +                   const void *salt, grub_size_t saltlen,
> +                   const void *key, grub_size_t keylen,
> +                   const void *ad, grub_size_t adlen,
> +                   grub_size_t resultlen, void *result);
> +
>  int
>  grub_crypto_memcmp (const void *a, const void *b, grub_size_t n);
>
> --
> 2.43.0
>
>
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to