75 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| ---
 | |
|  Makefile.util.def           |  6 +++++-
 | |
|  grub-core/Makefile.core.def |  2 +-
 | |
|  grub-core/disk/luks2.c      | 13 +++++++++++--
 | |
|  3 files changed, 17 insertions(+), 4 deletions(-)
 | |
| 
 | |
| diff --git a/Makefile.util.def b/Makefile.util.def
 | |
| index f8b356cc1..39fe9cb7c 100644
 | |
| --- a/Makefile.util.def
 | |
| +++ b/Makefile.util.def
 | |
| @@ -3,7 +3,7 @@ AutoGen definitions Makefile.tpl;
 | |
|  library = {
 | |
|    name = libgrubkern.a;
 | |
|    cflags = '$(CFLAGS_GNULIB)';
 | |
| -  cppflags = '$(CPPFLAGS_GNULIB) -I$(srcdir)/grub-core/lib/json';
 | |
| +  cppflags = '$(CPPFLAGS_GNULIB) -I$(srcdir)/grub-core/lib/json -I$(srcdir)/grub-core/lib/argon2';
 | |
| 
 | |
|    common = util/misc.c;
 | |
|    common = grub-core/kern/command.c;
 | |
| @@ -36,6 +36,10 @@ library = {
 | |
|    common = grub-core/kern/misc.c;
 | |
|    common = grub-core/kern/partition.c;
 | |
|    common = grub-core/lib/crypto.c;
 | |
| +  common = grub-core/lib/argon2/argon2.c;
 | |
| +  common = grub-core/lib/argon2/core.c;
 | |
| +  common = grub-core/lib/argon2/ref.c;
 | |
| +  common = grub-core/lib/argon2/blake2/blake2b.c;
 | |
|    common = grub-core/lib/json/json.c;
 | |
|    common = grub-core/disk/luks.c;
 | |
|    common = grub-core/disk/luks2.c;
 | |
| diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def
 | |
| index 3a004e88c..e5e5b216b 100644
 | |
| --- a/grub-core/Makefile.core.def
 | |
| +++ b/grub-core/Makefile.core.def
 | |
| @@ -1197,7 +1197,7 @@ module = {
 | |
|    common = disk/luks2.c;
 | |
|    common = lib/gnulib/base64.c;
 | |
|    cflags = '$(CFLAGS_POSIX) $(CFLAGS_GNULIB)';
 | |
| -  cppflags = '$(CPPFLAGS_POSIX) $(CPPFLAGS_GNULIB) -I$(srcdir)/lib/json';
 | |
| +  cppflags = '$(CPPFLAGS_POSIX) $(CPPFLAGS_GNULIB) -I$(srcdir)/lib/json -I$(srcdir)/lib/argon2';
 | |
|  };
 | |
| 
 | |
|  module = {
 | |
| diff --git a/grub-core/disk/luks2.c b/grub-core/disk/luks2.c
 | |
| index 02822c777..2ec0d4116 100644
 | |
| --- a/grub-core/disk/luks2.c
 | |
| +++ b/grub-core/disk/luks2.c
 | |
| @@ -27,6 +27,7 @@
 | |
|  #include <grub/partition.h>
 | |
|  #include <grub/i18n.h>
 | |
| 
 | |
| +#include <argon2.h>
 | |
|  #include <base64.h>
 | |
|  #include <json.h>
 | |
| 
 | |
| @@ -448,8 +449,16 @@ luks2_decrypt_key (grub_uint8_t *out_key,
 | |
|      {
 | |
|        case LUKS2_KDF_TYPE_ARGON2I:
 | |
|        case LUKS2_KDF_TYPE_ARGON2ID:
 | |
| -	ret = grub_error (GRUB_ERR_BAD_ARGUMENT, "Argon2 not supported");
 | |
| -	goto err;
 | |
| +	ret = argon2_hash (k->kdf.u.argon2.time, k->kdf.u.argon2.memory, k->kdf.u.argon2.cpus,
 | |
| +			   passphrase, passphraselen, salt, saltlen, area_key, k->area.key_size,
 | |
| +			   k->kdf.type == LUKS2_KDF_TYPE_ARGON2I ? Argon2_i : Argon2_id,
 | |
| +			   ARGON2_VERSION_NUMBER);
 | |
| +        if (ret)
 | |
| +	  {
 | |
| +	    grub_dprintf ("luks2", "Argon2 failed: %s\n", argon2_error_message (ret));
 | |
| +	    goto err;
 | |
| +	  }
 | |
| +        break;
 | |
|        case LUKS2_KDF_TYPE_PBKDF2:
 | |
|  	hash = grub_crypto_lookup_md_by_name (k->kdf.u.pbkdf2.hash);
 | |
|  	if (!hash)
 |