Grub Development Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Patrick Steinhardt <ps@pks.im>
To: grub-devel@gnu.org
Cc: Patrick Steinhardt <ps@pks.im>,
	Max Tottenham <mtottenh@akamai.com>,
	Daniel Kiper <dkiper@net-space.pl>
Subject: [PATCH v4 0/6] Support for LUKS2 disk encryption
Date: Mon, 18 Nov 2019 09:45:11 +0100	[thread overview]
Message-ID: <cover.1574066413.git.ps@pks.im> (raw)
In-Reply-To: <cover.1572717208.git.ps@pks.im>

Hi,

another week, another new version of this patch series. Changes
to v3 include the following:

    - Renamed `err` variables to `ret`.
    - Fixed formatting of multiline comments.
    - Aligned struct members.
    - Moved some defines around.
    - Added EXPORT_FUNC() to the JSON interface.

All in all it's mostly cosmetical changes to better match GRUB's
coding style. I've attached the range-diff against v3 to this
mail.

Patrick

Patrick Steinhardt (6):
  json: Import upstream jsmn-1.1.0
  json: Implement wrapping interface
  bootstrap: Add gnulib's base64 module
  afsplitter: Move into its own module
  luks: Move configuration of ciphers into cryptodisk
  disk: Implement support for LUKS2

 Makefile.util.def                             |   4 +-
 bootstrap.conf                                |   3 +-
 conf/Makefile.extra-dist                      |   1 +
 docs/grub-dev.texi                            |  14 +
 docs/grub.texi                                |   5 +-
 grub-core/Makefile.core.def                   |  19 +-
 grub-core/disk/AFSplitter.c                   |   3 +
 grub-core/disk/cryptodisk.c                   | 163 ++++-
 grub-core/disk/luks.c                         | 190 +----
 grub-core/disk/luks2.c                        | 674 ++++++++++++++++++
 grub-core/lib/gnulib-patches/fix-base64.patch |  23 +
 grub-core/lib/json/jsmn.h                     | 468 ++++++++++++
 grub-core/lib/json/json.c                     | 240 +++++++
 grub-core/lib/json/json.h                     | 103 +++
 include/grub/cryptodisk.h                     |   3 +
 15 files changed, 1733 insertions(+), 180 deletions(-)
 create mode 100644 grub-core/disk/luks2.c
 create mode 100644 grub-core/lib/gnulib-patches/fix-base64.patch
 create mode 100644 grub-core/lib/json/jsmn.h
 create mode 100644 grub-core/lib/json/json.c
 create mode 100644 grub-core/lib/json/json.h

Range-diff against v3:
1:  7bd619827 ! 1:  2469e96f9 json: Import upstream jsmn-1.1.0
    @@ Commit message
         [1]: https://github.com/zserge/jsmn
     
         Signed-off-by: Patrick Steinhardt <ps@pks.im>
    +    Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
     
      ## docs/grub-dev.texi ##
     @@ docs/grub-dev.texi: to update it.
2:  680b5add5 ! 2:  126fd8408 json: Implement wrapping interface
    @@ grub-core/lib/json/json.c
     +{
     +  grub_json_t *json = NULL;
     +  jsmn_parser parser;
    -+  grub_err_t err;
    ++  grub_err_t ret = GRUB_ERR_NONE;
     +  int jsmn_err;
     +
    ++  if (!string)
    ++    return GRUB_ERR_BAD_ARGUMENT;
    ++
     +  json = grub_zalloc (sizeof (*json));
     +  if (!json)
     +    return GRUB_ERR_OUT_OF_MEMORY;
    -+  json->idx = 0;
     +  json->string = string;
    -+  if (!json->string)
    -+    {
    -+      err = GRUB_ERR_OUT_OF_MEMORY;
    -+      goto out;
    -+    }
     +
    ++  /*
    ++   * Parse the string twice: first to determine how many tokens
    ++   * we need to allocate, second to fill allocated tokens.
    ++   */
     +  jsmn_init(&parser);
     +  jsmn_err = jsmn_parse (&parser, string, string_len, NULL, 0);
     +  if (jsmn_err <= 0)
     +    {
    -+      err = GRUB_ERR_BAD_ARGUMENT;
    -+      goto out;
    ++      ret = GRUB_ERR_BAD_ARGUMENT;
    ++      goto err;
     +    }
     +
     +  json->tokens = grub_malloc (sizeof (jsmntok_t) * jsmn_err);
     +  if (!json->tokens)
     +    {
    -+      err = GRUB_ERR_OUT_OF_MEMORY;
    -+      goto out;
    ++      ret = GRUB_ERR_OUT_OF_MEMORY;
    ++      goto err;
     +    }
     +
    -+  jsmn_init(&parser);
    ++  jsmn_init (&parser);
     +  jsmn_err = jsmn_parse (&parser, string, string_len, json->tokens, jsmn_err);
     +  if (jsmn_err <= 0)
     +    {
    -+      err = GRUB_ERR_BAD_ARGUMENT;
    -+      goto out;
    ++      ret = GRUB_ERR_BAD_ARGUMENT;
    ++      goto err;
     +    }
     +
    -+  err = GRUB_ERR_NONE;
     +  *out = json;
    -+out:
    -+  if (err && json)
    ++
    ++ err:
    ++  if (ret && json)
     +    {
     +      grub_free (json->string);
     +      grub_free (json->tokens);
     +      grub_free (json);
     +    }
    -+  return err;
    ++  return ret;
     +}
     +
     +void
    @@ grub-core/lib/json/json.c
     +grub_json_getsize (const grub_json_t *json)
     +{
     +  jsmntok_t *p = &((jsmntok_t *)json->tokens)[json->idx];
    ++
     +  return p->size;
     +}
     +
    @@ grub-core/lib/json/json.c
     +grub_json_gettype (const grub_json_t *json)
     +{
     +  jsmntok_t *p = &((jsmntok_t *)json->tokens)[json->idx];
    ++
     +  switch (p->type)
     +    {
     +    case JSMN_OBJECT:
    @@ grub-core/lib/json/json.c
     +    default:
     +      break;
     +    }
    ++
     +  return GRUB_JSON_UNDEFINED;
     +}
     +
    @@ grub-core/lib/json/json.c
     +  jsmntok_t *p = &((jsmntok_t *)parent->tokens)[parent->idx];
     +  grub_size_t offset = 1;
     +
    -+  if (n >= (unsigned) p->size)
    ++  if (n >= (grub_size_t) p->size)
     +    return GRUB_ERR_BAD_ARGUMENT;
     +
     +  while (n--)
    @@ grub-core/lib/json/json.c
     +{
     +  const grub_json_t *p = parent;
     +  grub_json_t child;
    ++  grub_err_t ret;
     +  jsmntok_t *tok;
     +
     +  if (key)
     +    {
    -+      grub_err_t err = grub_json_getvalue (&child, parent, key);
    -+      if (err)
    -+	return err;
    ++      ret = grub_json_getvalue (&child, parent, key);
    ++      if (ret)
    ++	return ret;
     +      p = &child;
     +    }
     +
    @@ grub-core/lib/json/json.c
     +{
     +  grub_json_type_t type;
     +  const char *value;
    -+  grub_err_t err;
    ++  grub_err_t ret;
     +
    -+  err = get_value(&type, &value, parent, key);
    -+  if (err)
    -+    return err;
    ++  ret = get_value(&type, &value, parent, key);
    ++  if (ret)
    ++    return ret;
     +  if (type != GRUB_JSON_STRING)
     +    return GRUB_ERR_BAD_ARGUMENT;
     +
    @@ grub-core/lib/json/json.c
     +{
     +  grub_json_type_t type;
     +  const char *value;
    -+  grub_err_t err;
    ++  grub_err_t ret;
     +
    -+  err = get_value(&type, &value, parent, key);
    -+  if (err)
    -+    return err;
    ++  ret = get_value(&type, &value, parent, key);
    ++  if (ret)
    ++    return ret;
     +  if (type != GRUB_JSON_STRING && type != GRUB_JSON_PRIMITIVE)
     +    return GRUB_ERR_BAD_ARGUMENT;
     +
    @@ grub-core/lib/json/json.c
     +{
     +  grub_json_type_t type;
     +  const char *value;
    -+  grub_err_t err;
    ++  grub_err_t ret;
     +
    -+  err = get_value(&type, &value, parent, key);
    -+  if (err)
    -+    return err;
    ++  ret = get_value(&type, &value, parent, key);
    ++  if (ret)
    ++    return ret;
     +  if (type != GRUB_JSON_STRING && type != GRUB_JSON_PRIMITIVE)
     +    return GRUB_ERR_BAD_ARGUMENT;
     +
    @@ grub-core/lib/json/json.h (new)
     +};
     +typedef struct grub_json grub_json_t;
     +
    -+/* Parse a JSON-encoded string. Note that the string passed to
    ++/*
    ++ * Parse a JSON-encoded string. Note that the string passed to
     + * this function will get modified on subsequent calls to
    -+ * `grub_json_get*`. Returns the root object of the parsed JSON
    -+ * object, which needs to be free'd via `grub_json_free`.
    ++ * grub_json_get*(). Returns the root object of the parsed JSON
    ++ * object, which needs to be free'd via grub_json_free().
     + */
    -+grub_err_t
    -+grub_json_parse (grub_json_t **out, char *string, grub_size_t string_len);
    ++extern grub_err_t EXPORT_FUNC(grub_json_parse) (grub_json_t **out,
    ++					        char *string,
    ++						grub_size_t string_len);
     +
    -+/* Free the structure and its contents. The string passed to
    -+ * `grub_json_parse` will not be free'd.
    ++/*
    ++ * Free the structure and its contents. The string passed to
    ++ * grub_json_parse() will not be free'd.
     + */
    -+void
    -+grub_json_free (grub_json_t *json);
    ++extern void EXPORT_FUNC(grub_json_free) (grub_json_t *json);
     +
    -+/* Get the child count of the given JSON token. Children are
    -+ * present for arrays, objects (dicts) and keys of a dict. */
    -+grub_size_t
    -+grub_json_getsize (const grub_json_t *json);
    ++/*
    ++ * Get the child count of the given JSON token. Children are
    ++ * present for arrays, objects (dicts) and keys of a dict.
    ++ */
    ++extern grub_size_t EXPORT_FUNC(grub_json_getsize) (const grub_json_t *json);
     +
     +/* Get the type of the given JSON token. */
    -+grub_json_type_t
    -+grub_json_gettype (const grub_json_t *json);
    ++extern grub_json_type_t EXPORT_FUNC(grub_json_gettype) (const grub_json_t *json);
     +
    -+/* Get n'th child of object, array or key. Will return an error if no
    -+ * such child exists. The result does not need to be free'd. */
    -+grub_err_t
    -+grub_json_getchild (grub_json_t *out, const grub_json_t *parent, grub_size_t n);
    ++/*
    ++ * Get n'th child of object, array or key. Will return an error if no
    ++ * such child exists. The result does not need to be free'd.
    ++ */
    ++extern grub_err_t EXPORT_FUNC(grub_json_getchild) (grub_json_t *out,
    ++						   const grub_json_t *parent,
    ++						   grub_size_t n);
     +
    -+/* Get value of key from a JSON object. The result does not need
    -+ * to be free'd. */
    -+grub_err_t
    -+grub_json_getvalue (grub_json_t *out, const grub_json_t *parent, const char *key);
    ++/*
    ++ * Get value of key from a JSON object. The result does not need
    ++ * to be free'd.
    ++ */
    ++extern grub_err_t EXPORT_FUNC(grub_json_getvalue) (grub_json_t *out,
    ++						   const grub_json_t *parent,
    ++						   const char *key);
     +
     +/* Get the string representation of a JSON object. */
    -+grub_err_t
    -+grub_json_getstring (const char **out, const grub_json_t *parent, const char *key);
    ++extern grub_err_t EXPORT_FUNC(grub_json_getstring) (const char **out,
    ++						    const grub_json_t *parent,
    ++						    const char *key);
     +
     +/* Get the uint64 representation of a JSON object. */
    -+grub_err_t
    -+grub_json_getuint64 (grub_uint64_t *out, const grub_json_t *parent, const char *key);
    ++extern grub_err_t EXPORT_FUNC(grub_json_getuint64) (grub_uint64_t *out,
    ++						    const grub_json_t *parent,
    ++						    const char *key);
     +
     +/* Get the int64 representation of a JSON object. */
    -+grub_err_t
    -+grub_json_getint64 (grub_int64_t *out, const grub_json_t *parent, const char *key);
    ++extern grub_err_t EXPORT_FUNC(grub_json_getint64) (grub_int64_t *out,
    ++						   const grub_json_t *parent,
    ++						   const char *key);
     +
     +#endif
3:  461696fe7 = 3:  e29ef98a2 bootstrap: Add gnulib's base64 module
4:  18cfacbe5 = 4:  f95f7b1c2 afsplitter: Move into its own module
5:  1a185b6d8 = 5:  5a3bb8742 luks: Move configuration of ciphers into cryptodisk
6:  9d88fcbab ! 6:  9c21363ee disk: Implement support for LUKS2
    @@ docs/grub.texi: is requested interactively. Option @var{device} configures speci
      devices; option @option{-b} configures all geli containers that have boot flag set.
      
     -GRUB suports devices encrypted using LUKS and geli. Note that necessary modules (@var{luks} and @var{geli}) have to be loaded manually before this command can
    -+GRUB suports devices encrypted using LUKS and geli. Note that necessary modules (@var{luks}, @var{luks2} and @var{geli}) have to be loaded manually before this command can
    - be used.
    +-be used.
    ++GRUB suports devices encrypted using LUKS, LUKS2 and geli. Note that necessary
    ++modules (@var{luks}, @var{luks2} and @var{geli}) have to be loaded manually
    ++before this command can be used.
      @end deffn
      
    + 
     
      ## grub-core/Makefile.core.def ##
     @@ grub-core/Makefile.core.def: module = {
    @@ grub-core/disk/luks2.c (new)
     +#include <base64.h>
     +#include <json.h>
     +
    -+#define MAX_PASSPHRASE 256
    -+
     +GRUB_MOD_LICENSE ("GPLv3+");
     +
    -+gcry_err_code_t AF_merge (const gcry_md_spec_t * hash, grub_uint8_t * src,
    -+			  grub_uint8_t * dst, grub_size_t blocksize,
    -+			  grub_size_t blocknumbers);
    ++#define LUKS_MAGIC_1ST "LUKS\xBA\xBE"
    ++#define LUKS_MAGIC_2ND "SKUL\xBA\xBE"
    ++#define MAX_PASSPHRASE 256
     +
     +enum grub_luks2_kdf_type
     +{
    @@ grub-core/disk/luks2.c (new)
     +/* On disk LUKS header */
     +struct grub_luks2_header
     +{
    -+  char magic[6];
    -+#define LUKS_MAGIC_1ST    "LUKS\xBA\xBE"
    -+#define LUKS_MAGIC_2ND    "SKUL\xBA\xBE"
    ++  char		magic[6];
     +  grub_uint16_t version;
     +  grub_uint64_t hdr_size;
     +  grub_uint64_t seqid;
    -+  char label[48];
    -+  char csum_alg[32];
    -+  grub_uint8_t salt[64];
    -+  char uuid[40];
    -+  char subsystem[48];
    -+  grub_uint64_t hdr_offset;
    -+  char _padding[184];
    -+  grub_uint8_t csum[64];
    -+  char _padding4096[7*512];
    ++  char		label[48];
    ++  char		csum_alg[32];
    ++  grub_uint8_t	salt[64];
    ++  char		uuid[40];
    ++  char		subsystem[48];
    ++  grub_uint64_t	hdr_offset;
    ++  char		_padding[184];
    ++  grub_uint8_t	csum[64];
    ++  char		_padding4096[7*512];
     +} GRUB_PACKED;
     +typedef struct grub_luks2_header grub_luks2_header_t;
     +
    @@ grub-core/disk/luks2.c (new)
     +  grub_int64_t priority;
     +  struct
     +  {
    -+    const char *encryption;
    ++    const char	  *encryption;
     +    grub_uint64_t offset;
     +    grub_uint64_t size;
    -+    grub_int64_t key_size;
    ++    grub_int64_t  key_size;
     +  } area;
     +  struct
     +  {
    -+    const char *hash;
    ++    const char	 *hash;
     +    grub_int64_t stripes;
     +  } af;
     +  struct
     +  {
     +    grub_luks2_kdf_type_t type;
    -+    const char *salt;
    ++    const char		  *salt;
     +    union
     +    {
     +      struct
    @@ grub-core/disk/luks2.c (new)
     +      } argon2i;
     +      struct
     +      {
    -+	const char *hash;
    ++	const char   *hash;
     +	grub_int64_t iterations;
     +      } pbkdf2;
     +    } u;
    @@ grub-core/disk/luks2.c (new)
     +struct grub_luks2_segment
     +{
     +  grub_uint64_t offset;
    -+  const char *size;
    -+  const char *encryption;
    -+  grub_int64_t sector_size;
    ++  const char	*size;
    ++  const char	*encryption;
    ++  grub_int64_t	sector_size;
     +};
     +typedef struct grub_luks2_segment grub_luks2_segment_t;
     +
     +struct grub_luks2_digest
     +{
     +  /* Both keyslots and segments are interpreted as bitfields here */
    -+  grub_uint64_t keyslots;
    -+  grub_uint64_t segments;
    -+  const char *salt;
    -+  const char *digest;
    -+  const char *hash;
    -+  grub_int64_t iterations;
    ++  grub_uint64_t	keyslots;
    ++  grub_uint64_t	segments;
    ++  const char	*salt;
    ++  const char	*digest;
    ++  const char	*hash;
    ++  grub_int64_t	iterations;
     +};
     +typedef struct grub_luks2_digest grub_luks2_digest_t;
     +
    ++gcry_err_code_t AF_merge (const gcry_md_spec_t * hash, grub_uint8_t * src,
    ++			  grub_uint8_t * dst, grub_size_t blocksize,
    ++			  grub_size_t blocknumbers);
    ++
     +static grub_err_t
     +luks2_parse_keyslot (grub_luks2_keyslot_t *out, const grub_json_t *keyslot)
     +{
    @@ grub-core/disk/luks2.c (new)
     +luks2_read_header (grub_disk_t disk, grub_luks2_header_t *outhdr)
     +{
     +  grub_luks2_header_t primary, secondary, *header = &primary;
    -+  grub_err_t err;
    ++  grub_err_t ret;
     +
     +  /* Read the primary LUKS header. */
    -+  err = grub_disk_read (disk, 0, 0, sizeof (primary), &primary);
    -+  if (err)
    -+    return err;
    ++  ret = grub_disk_read (disk, 0, 0, sizeof (primary), &primary);
    ++  if (ret)
    ++    return ret;
     +
     +  /* Look for LUKS magic sequence.  */
    -+  if (grub_memcmp (primary.magic, LUKS_MAGIC_1ST, sizeof (primary.magic))
    -+      || grub_be_to_cpu16 (primary.version) != 2)
    ++  if (grub_memcmp (primary.magic, LUKS_MAGIC_1ST, sizeof (primary.magic)) ||
    ++      grub_be_to_cpu16 (primary.version) != 2)
     +    return GRUB_ERR_BAD_SIGNATURE;
     +
     +  /* Read the secondary header. */
    -+  err = grub_disk_read (disk, 0, grub_be_to_cpu64 (primary.hdr_size), sizeof (secondary), &secondary);
    -+  if (err)
    -+    return err;
    ++  ret = grub_disk_read (disk, 0, grub_be_to_cpu64 (primary.hdr_size), sizeof (secondary), &secondary);
    ++  if (ret)
    ++    return ret;
     +
     +  /* Look for LUKS magic sequence.  */
    -+  if (grub_memcmp (secondary.magic, LUKS_MAGIC_2ND, sizeof (secondary.magic))
    -+      || grub_be_to_cpu16 (secondary.version) != 2)
    ++  if (grub_memcmp (secondary.magic, LUKS_MAGIC_2ND, sizeof (secondary.magic)) ||
    ++      grub_be_to_cpu16 (secondary.version) != 2)
     +    return GRUB_ERR_BAD_SIGNATURE;
     +
     +  if (grub_be_to_cpu64 (primary.seqid) < grub_be_to_cpu64 (secondary.seqid))
    @@ grub-core/disk/luks2.c (new)
     +{
     +  grub_cryptodisk_t cryptodisk;
     +  grub_luks2_header_t header;
    -+  grub_err_t err;
     +
     +  if (check_boot)
     +    return NULL;
     +
    -+  err = luks2_read_header (disk, &header);
    -+  if (err)
    ++  if (luks2_read_header (disk, &header))
     +    {
     +      grub_errno = GRUB_ERR_NONE;
     +      return NULL;
    @@ grub-core/disk/luks2.c (new)
     +  cryptodisk = grub_zalloc (sizeof (*cryptodisk));
     +  if (!cryptodisk)
     +    return NULL;
    ++
     +  COMPILE_TIME_ASSERT (sizeof (cryptodisk->uuid) >= sizeof (header.uuid));
    ++
     +  grub_memcpy (cryptodisk->uuid, header.uuid, sizeof (header.uuid));
     +  cryptodisk->modname = "luks2";
     +  return cryptodisk;
    @@ grub-core/disk/luks2.c (new)
     +  grub_uint8_t digest[GRUB_CRYPTODISK_MAX_KEYLEN], salt[GRUB_CRYPTODISK_MAX_KEYLEN];
     +  grub_size_t saltlen = sizeof (salt), digestlen = sizeof (digest);
     +  const gcry_md_spec_t *hash;
    -+  gcry_err_code_t gcry_err;
    ++  gcry_err_code_t gcry_ret;
     +
    -+  /* Decdoe both digest and salt */
    ++  /* Decode both digest and salt */
     +  if (!base64_decode(d->digest, grub_strlen (d->digest), (char *)digest, &digestlen))
    -+      return grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid digest");
    ++    return grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid digest");
     +  if (!base64_decode(d->salt, grub_strlen (d->salt), (char *)salt, &saltlen))
    -+      return grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid digest salt");
    ++    return grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid digest salt");
     +
     +  /* Configure the hash used for the digest. */
     +  hash = grub_crypto_lookup_md_by_name (d->hash);
     +  if (!hash)
    -+      return grub_error (GRUB_ERR_FILE_NOT_FOUND, "Couldn't load %s hash", d->hash);
    ++    return grub_error (GRUB_ERR_FILE_NOT_FOUND, "Couldn't load %s hash", d->hash);
     +
     +  /* Calculate the candidate key's digest */
    -+  gcry_err = grub_crypto_pbkdf2 (hash,
    ++  gcry_ret = grub_crypto_pbkdf2 (hash,
     +				 candidate_key, candidate_key_len,
     +				 salt, saltlen,
     +				 d->iterations,
     +				 candidate_digest, digestlen);
    -+  if (gcry_err)
    -+      return grub_crypto_gcry_error (gcry_err);
    ++  if (gcry_ret)
    ++    return grub_crypto_gcry_error (gcry_ret);
     +
     +  if (grub_memcmp (candidate_digest, digest, digestlen) != 0)
    -+      return grub_error (GRUB_ERR_ACCESS_DENIED, "Mismatching digests");
    ++    return grub_error (GRUB_ERR_ACCESS_DENIED, "Mismatching digests");
     +
     +  return GRUB_ERR_NONE;
     +}
    @@ grub-core/disk/luks2.c (new)
     +  grub_size_t saltlen = sizeof (salt);
     +  char cipher[32], *p;;
     +  const gcry_md_spec_t *hash;
    -+  gcry_err_code_t gcry_err;
    -+  grub_err_t err;
    ++  gcry_err_code_t gcry_ret;
    ++  grub_err_t ret;
     +
     +  if (!base64_decode(k->kdf.salt, grub_strlen (k->kdf.salt),
     +		     (char *)salt, &saltlen))
     +    {
    -+      err = grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid keyslot salt");
    ++      ret = grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid keyslot salt");
     +      goto err;
     +    }
     +
    @@ grub-core/disk/luks2.c (new)
     +  switch (k->kdf.type)
     +    {
     +      case LUKS2_KDF_TYPE_ARGON2I:
    -+	err = grub_error (GRUB_ERR_BAD_ARGUMENT, "Argon2 not supported");
    ++	ret = grub_error (GRUB_ERR_BAD_ARGUMENT, "Argon2 not supported");
     +	goto err;
     +      case LUKS2_KDF_TYPE_PBKDF2:
     +	hash = grub_crypto_lookup_md_by_name (k->kdf.u.pbkdf2.hash);
     +	if (!hash)
     +	  {
    -+	    err = grub_error (GRUB_ERR_FILE_NOT_FOUND, "Couldn't load %s hash",
    ++	    ret = grub_error (GRUB_ERR_FILE_NOT_FOUND, "Couldn't load %s hash",
     +			      k->kdf.u.pbkdf2.hash);
     +	    goto err;
     +	  }
     +
    -+	gcry_err = grub_crypto_pbkdf2 (hash, (grub_uint8_t *) passphrase,
    ++	gcry_ret = grub_crypto_pbkdf2 (hash, (grub_uint8_t *) passphrase,
     +				       passphraselen,
     +				       salt, saltlen,
     +				       k->kdf.u.pbkdf2.iterations,
     +				       area_key, k->area.key_size);
    -+	if (gcry_err)
    ++	if (gcry_ret)
     +	  {
    -+	    err = grub_crypto_gcry_error (gcry_err);
    ++	    ret = grub_crypto_gcry_error (gcry_ret);
     +	    goto err;
     +	  }
     +
    @@ grub-core/disk/luks2.c (new)
     +      return grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid encryption");
     +  *p = '\0';
     +
    -+  err = grub_cryptodisk_setcipher (crypt, cipher, p + 1);
    -+  if (err)
    -+      return err;
    ++  ret = grub_cryptodisk_setcipher (crypt, cipher, p + 1);
    ++  if (ret)
    ++      return ret;
     +
    -+  gcry_err = grub_cryptodisk_setkey (crypt, area_key, k->area.key_size);
    -+  if (gcry_err)
    ++  gcry_ret = grub_cryptodisk_setkey (crypt, area_key, k->area.key_size);
    ++  if (gcry_ret)
     +    {
    -+      err = grub_crypto_gcry_error (gcry_err);
    ++      ret = grub_crypto_gcry_error (gcry_ret);
     +      goto err;
     +    }
     +
    @@ grub-core/disk/luks2.c (new)
     +  split_key = grub_malloc (k->area.size);
     +  if (!split_key)
     +    {
    -+      err = grub_errno;
    ++      ret = grub_errno;
     +      goto err;
     +    }
     +
     +  grub_errno = GRUB_ERR_NONE;
    -+  err = grub_disk_read (disk, 0, k->area.offset, k->area.size, split_key);
    -+  if (err)
    ++  ret = grub_disk_read (disk, 0, k->area.offset, k->area.size, split_key);
    ++  if (ret)
     +    {
     +      grub_dprintf ("luks2", "Read error: %s\n", grub_errmsg);
     +      goto err;
     +    }
     +
    -+  gcry_err = grub_cryptodisk_decrypt (crypt, split_key, k->area.size, 0);
    -+  if (gcry_err)
    ++  gcry_ret = grub_cryptodisk_decrypt (crypt, split_key, k->area.size, 0);
    ++  if (gcry_ret)
     +    {
    -+      err = grub_crypto_gcry_error (gcry_err);
    ++      ret = grub_crypto_gcry_error (gcry_ret);
     +      goto err;
     +    }
     +
    @@ grub-core/disk/luks2.c (new)
     +  hash = grub_crypto_lookup_md_by_name (k->af.hash);
     +  if (!hash)
     +    {
    -+      err = grub_error (GRUB_ERR_FILE_NOT_FOUND, "Couldn't load %s hash",
    ++      ret = grub_error (GRUB_ERR_FILE_NOT_FOUND, "Couldn't load %s hash",
     +			k->af.hash);
     +      goto err;
     +    }
     +
     +  /* Merge the decrypted key material to get the candidate master key. */
    -+  gcry_err = AF_merge (hash, split_key, out_key, k->key_size, k->af.stripes);
    -+  if (gcry_err)
    ++  gcry_ret = AF_merge (hash, split_key, out_key, k->key_size, k->af.stripes);
    ++  if (gcry_ret)
     +    {
    -+      err = grub_crypto_gcry_error (gcry_err);
    ++      ret = grub_crypto_gcry_error (gcry_ret);
     +      goto err;
     +    }
     +
     +  grub_dprintf ("luks2", "Candidate key recovered\n");
     +
    -+err:
    ++ err:
     +  grub_free (split_key);
    -+  return err;
    ++  return ret;
     +}
     +
     +static grub_err_t
    @@ grub-core/disk/luks2.c (new)
     +  grub_luks2_keyslot_t keyslot;
     +  grub_luks2_digest_t digest;
     +  grub_luks2_segment_t segment;
    -+  gcry_err_code_t gcry_err;
    ++  gcry_err_code_t gcry_ret;
     +  grub_json_t *json = NULL, keyslots;
    -+  grub_err_t err;
    ++  grub_err_t ret;
     +
    -+  err = luks2_read_header (disk, &header);
    -+  if (err)
    -+    return err;
    ++  ret = luks2_read_header (disk, &header);
    ++  if (ret)
    ++    return ret;
     +
     +  json_header = grub_zalloc (grub_be_to_cpu64 (header.hdr_size) - sizeof (header));
     +  if (!json_header)
     +      return GRUB_ERR_OUT_OF_MEMORY;
     +
     +  /* Read the JSON area. */
    -+  err = grub_disk_read (disk, 0, grub_be_to_cpu64 (header.hdr_offset) + sizeof (header),
    ++  ret = grub_disk_read (disk, 0, grub_be_to_cpu64 (header.hdr_offset) + sizeof (header),
     +			grub_be_to_cpu64 (header.hdr_size) - sizeof (header), json_header);
    -+  if (err)
    ++  if (ret)
     +      goto err;
     +
     +  ptr = grub_memchr(json_header, 0, grub_be_to_cpu64 (header.hdr_size) - sizeof (header));
     +  if (!ptr)
     +    goto err;
     +
    -+  err = grub_json_parse (&json, json_header, grub_be_to_cpu64 (header.hdr_size));
    -+  if (err)
    ++  ret = grub_json_parse (&json, json_header, grub_be_to_cpu64 (header.hdr_size));
    ++  if (ret)
     +    {
    -+      err = grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid LUKS2 JSON header");
    ++      ret = grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid LUKS2 JSON header");
     +      goto err;
     +    }
     +
    @@ grub-core/disk/luks2.c (new)
     +		crypt->uuid);
     +  if (!grub_password_get (passphrase, MAX_PASSPHRASE))
     +    {
    -+      err = grub_error (GRUB_ERR_BAD_ARGUMENT, "Passphrase not supplied");
    ++      ret = grub_error (GRUB_ERR_BAD_ARGUMENT, "Passphrase not supplied");
     +      goto err;
     +    }
     +
    -+  err = grub_json_getvalue (&keyslots, json, "keyslots");
    -+  if (err)
    ++  ret = grub_json_getvalue (&keyslots, json, "keyslots");
    ++  if (ret)
     +      goto err;
     +
     +  /* Try all keyslot */
     +  for (i = 0; i < grub_json_getsize (&keyslots); i++)
     +    {
    -+      err = luks2_get_keyslot (&keyslot, &digest, &segment, json, i);
    -+      if (err)
    ++      ret = luks2_get_keyslot (&keyslot, &digest, &segment, json, i);
    ++      if (ret)
     +	goto err;
     +
     +      if (keyslot.priority == 0)
    @@ grub-core/disk/luks2.c (new)
     +      else
     +	crypt->total_length = grub_strtoull(segment.size, NULL, 10);
     +
    -+      err = luks2_decrypt_key (candidate_key, disk, crypt, &keyslot,
    ++      ret = luks2_decrypt_key (candidate_key, disk, crypt, &keyslot,
     +			       (const grub_uint8_t *) passphrase, grub_strlen (passphrase));
    -+      if (err)
    ++      if (ret)
     +	{
     +	  grub_dprintf ("luks2", "Decryption with keyslot %"PRIuGRUB_SIZE" failed", i);
     +	  continue;
     +	}
     +
    -+      err = luks2_verify_key (&digest, candidate_key, keyslot.key_size);
    -+      if (err)
    ++      ret = luks2_verify_key (&digest, candidate_key, keyslot.key_size);
    ++      if (ret)
     +	{
     +	  grub_dprintf ("luks2", "Could not open keyslot %"PRIuGRUB_SIZE"\n", i);
     +	  continue;
     +	}
     +
    -+      /* TRANSLATORS: It's a cryptographic key slot: one element of an array
    -+	 where each element is either empty or holds a key. */
    ++      /*
    ++       * TRANSLATORS: It's a cryptographic key slot: one element of an array
    ++       * where each element is either empty or holds a key.
    ++       */
     +      grub_printf_ (N_("Slot %"PRIuGRUB_SIZE" opened\n"), i);
     +
     +      candidate_key_len = keyslot.key_size;
    @@ grub-core/disk/luks2.c (new)
     +    }
     +  if (candidate_key_len == 0)
     +    {
    -+      err = grub_error (GRUB_ERR_ACCESS_DENIED, "Invalid passphrase");
    ++      ret = grub_error (GRUB_ERR_ACCESS_DENIED, "Invalid passphrase");
     +      goto err;
     +    }
     +
    @@ grub-core/disk/luks2.c (new)
     +      return grub_error (GRUB_ERR_BAD_ARGUMENT, "Invalid encryption");
     +  *ptr = '\0';
     +
    -+  err = grub_cryptodisk_setcipher (crypt, cipher, ptr + 1);
    -+  if (err)
    ++  ret = grub_cryptodisk_setcipher (crypt, cipher, ptr + 1);
    ++  if (ret)
     +      goto err;
     +
     +  /* Set the master key. */
    -+  gcry_err = grub_cryptodisk_setkey (crypt, candidate_key, candidate_key_len);
    -+  if (gcry_err)
    ++  gcry_ret = grub_cryptodisk_setkey (crypt, candidate_key, candidate_key_len);
    ++  if (gcry_ret)
     +    {
    -+      err = grub_crypto_gcry_error (gcry_err);
    ++      ret = grub_crypto_gcry_error (gcry_ret);
     +      goto err;
     +    }
     +
    -+err:
    ++ err:
     +  grub_free (part);
     +  grub_free (json_header);
     +  grub_json_free (json);
    -+  return err;
    ++  return ret;
     +}
     +
     +static struct grub_cryptodisk_dev luks2_crypto = {
-- 
2.24.0



  parent reply	other threads:[~2019-11-18  8:45 UTC|newest]

Thread overview: 87+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-02 18:06 [PATCH 0/6] Support for LUKS2 disc encryption Patrick Steinhardt
2019-11-02 18:06 ` [PATCH 1/6] jsmn: Add JSON parser Patrick Steinhardt
2019-11-02 18:06 ` [PATCH 2/6] jsmn: Add convenience functions Patrick Steinhardt
2019-11-04 10:26   ` Max Tottenham
2019-11-04 11:00     ` Patrick Steinhardt
2019-11-04 17:42       ` Daniel Kiper
2019-11-04 18:56         ` Patrick Steinhardt
2019-11-06 11:44           ` Daniel Kiper
2019-11-06 13:08             ` Patrick Steinhardt
2019-11-13 11:16               ` Daniel Kiper
2019-11-02 18:06 ` [PATCH 3/6] bootstrap: Add gnulib's base64 module Patrick Steinhardt
2019-11-04 10:30   ` Max Tottenham
2019-11-04 11:02     ` Patrick Steinhardt
2019-11-02 18:06 ` [PATCH 4/6] afsplitter: Move into its own module Patrick Steinhardt
2019-11-02 18:06 ` [PATCH 5/6] luks: Move configuration of ciphers into cryptodisk Patrick Steinhardt
2019-11-02 18:06 ` [PATCH 6/6] disk: Implement support for LUKS2 Patrick Steinhardt
2019-11-05  6:58 ` [PATCH v2 0/6] Support for LUKS2 disk encryption Patrick Steinhardt
2019-11-05  6:58   ` [PATCH v2 1/6] json: Import upstream jsmn-1.1.0 Patrick Steinhardt
2019-11-05  6:58   ` [PATCH v2 2/6] json: Implement wrapping interface Patrick Steinhardt
2019-11-05  9:54     ` Max Tottenham
2019-11-05  6:58   ` [PATCH v2 3/6] bootstrap: Add gnulib's base64 module Patrick Steinhardt
2019-11-06 12:04     ` Daniel Kiper
2019-11-05  6:58   ` [PATCH v2 4/6] afsplitter: Move into its own module Patrick Steinhardt
2019-11-06 12:06     ` Daniel Kiper
2019-11-05  6:58   ` [PATCH v2 5/6] luks: Move configuration of ciphers into cryptodisk Patrick Steinhardt
2019-11-06 12:22     ` Daniel Kiper
2019-11-05  6:58   ` [PATCH v2 6/6] disk: Implement support for LUKS2 Patrick Steinhardt
2019-11-13 13:22 ` [PATCH v3 0/6] Support for LUKS2 disk encryption Patrick Steinhardt
2019-11-13 13:22   ` [PATCH v3 1/6] json: Import upstream jsmn-1.1.0 Patrick Steinhardt
2019-11-14 10:15     ` Daniel Kiper
2019-11-13 13:22   ` [PATCH v3 2/6] json: Implement wrapping interface Patrick Steinhardt
2019-11-14 12:37     ` Daniel Kiper
2019-11-14 13:12       ` Patrick Steinhardt
2019-11-15 11:56         ` Daniel Kiper
2019-11-15 12:36           ` Patrick Steinhardt
2019-11-18 14:45             ` Daniel Kiper
2019-11-26  6:22               ` Patrick Steinhardt
2019-11-13 13:22   ` [PATCH v3 3/6] bootstrap: Add gnulib's base64 module Patrick Steinhardt
2019-11-13 13:22   ` [PATCH v3 4/6] afsplitter: Move into its own module Patrick Steinhardt
2019-11-13 13:22   ` [PATCH v3 5/6] luks: Move configuration of ciphers into cryptodisk Patrick Steinhardt
2019-11-13 13:22   ` [PATCH v3 6/6] disk: Implement support for LUKS2 Patrick Steinhardt
2019-11-15 12:31     ` Daniel Kiper
2019-11-15 12:55       ` Patrick Steinhardt
2019-11-18  8:45 ` Patrick Steinhardt [this message]
2019-11-18  8:45   ` [PATCH v4 1/6] json: Import upstream jsmn-1.1.0 Patrick Steinhardt
2019-11-18  8:45   ` [PATCH v4 2/6] json: Implement wrapping interface Patrick Steinhardt
2019-11-18 14:14     ` Daniel Kiper
2019-11-18 15:46       ` Patrick Steinhardt
2019-11-18 16:29         ` Daniel Kiper
2019-11-18  8:45   ` [PATCH v4 3/6] bootstrap: Add gnulib's base64 module Patrick Steinhardt
2019-11-18  8:45   ` [PATCH v4 4/6] afsplitter: Move into its own module Patrick Steinhardt
2019-11-18  8:45   ` [PATCH v4 5/6] luks: Move configuration of ciphers into cryptodisk Patrick Steinhardt
2019-11-18  8:45   ` [PATCH v4 6/6] disk: Implement support for LUKS2 Patrick Steinhardt
2019-11-18 14:33     ` Daniel Kiper
2019-11-29  6:51 ` [PATCH v5 0/6] Support for LUKS2 disk encryption Patrick Steinhardt
2019-11-29  6:51   ` [PATCH v5 1/6] json: Import upstream jsmn-1.1.0 Patrick Steinhardt
2019-11-29  6:51   ` [PATCH v5 2/6] json: Implement wrapping interface Patrick Steinhardt
2019-11-29 15:34     ` Daniel Kiper
2019-12-06 17:24       ` Patrick Steinhardt
2019-12-08 22:49         ` Daniel Kiper
2019-11-29  6:51   ` [PATCH v5 3/6] bootstrap: Add gnulib's base64 module Patrick Steinhardt
2019-11-29  6:51   ` [PATCH v5 4/6] afsplitter: Move into its own module Patrick Steinhardt
2019-11-29  6:51   ` [PATCH v5 5/6] luks: Move configuration of ciphers into cryptodisk Patrick Steinhardt
2019-11-29  6:51   ` [PATCH v5 6/6] disk: Implement support for LUKS2 Patrick Steinhardt
2019-12-10  9:26 ` [PATCH v6 0/6] Support for LUKS2 disk encryption Patrick Steinhardt
2019-12-10  9:26   ` [PATCH v6 1/6] json: Import upstream jsmn-1.1.0 Patrick Steinhardt
2019-12-10  9:26   ` [PATCH v6 2/6] json: Implement wrapping interface Patrick Steinhardt
2019-12-13 18:56     ` Daniel Kiper
2019-12-10  9:26   ` [PATCH v6 3/6] bootstrap: Add gnulib's base64 module Patrick Steinhardt
2019-12-10  9:26   ` [PATCH v6 4/6] afsplitter: Move into its own module Patrick Steinhardt
2019-12-10  9:26   ` [PATCH v6 5/6] luks: Move configuration of ciphers into cryptodisk Patrick Steinhardt
2019-12-10  9:26   ` [PATCH v6 6/6] disk: Implement support for LUKS2 Patrick Steinhardt
2019-12-16 12:25     ` Daniel Kiper
2019-12-16 12:37       ` Patrick Steinhardt
2019-12-16 13:05         ` Daniel Kiper
2019-12-16 13:10           ` Patrick Steinhardt
2019-12-16 13:15             ` Daniel Kiper
2019-12-20 19:33   ` [PATCH v6 0/6] Support for LUKS2 disk encryption Daniel Kiper
2019-12-27 15:08     ` Patrick Steinhardt
2019-12-27 15:18 ` [PATCH v7 " Patrick Steinhardt
2019-12-27 15:18   ` [PATCH v7 1/6] json: Import upstream jsmn-1.1.0 Patrick Steinhardt
2019-12-27 15:18   ` [PATCH v7 2/6] json: Implement wrapping interface Patrick Steinhardt
2019-12-27 15:18   ` [PATCH v7 3/6] bootstrap: Add gnulib's base64 module Patrick Steinhardt
2019-12-27 15:18   ` [PATCH v7 4/6] afsplitter: Move into its own module Patrick Steinhardt
2019-12-27 15:18   ` [PATCH v7 5/6] luks: Move configuration of ciphers into cryptodisk Patrick Steinhardt
2019-12-27 15:18   ` [PATCH v7 6/6] disk: Implement support for LUKS2 Patrick Steinhardt
2020-01-10 14:23   ` [PATCH v7 0/6] Support for LUKS2 disk encryption Daniel Kiper

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=cover.1574066413.git.ps@pks.im \
    --to=ps@pks.im \
    --cc=dkiper@net-space.pl \
    --cc=grub-devel@gnu.org \
    --cc=mtottenh@akamai.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox