From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.90_1) id 1kFJ3V-0003Cr-RA for mharc-grub-devel@gnu.org; Mon, 07 Sep 2020 11:27:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:60034) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kFJ3S-0003BL-Jz for grub-devel@gnu.org; Mon, 07 Sep 2020 11:27:39 -0400 Received: from wout2-smtp.messagingengine.com ([64.147.123.25]:41269) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kFJ3O-0007CB-TJ for grub-devel@gnu.org; Mon, 07 Sep 2020 11:27:38 -0400 Received: from compute3.internal (compute3.nyi.internal [10.202.2.43]) by mailout.west.internal (Postfix) with ESMTP id 2896DAD6; Mon, 7 Sep 2020 11:27:31 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute3.internal (MEProxy); Mon, 07 Sep 2020 11:27:31 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pks.im; h=date :from:to:cc:subject:message-id:references:mime-version :content-type:in-reply-to; s=fm2; bh=k+3cic+MmKt57bL6pkVQwnhyKaE KVHYZVlomZpAV1Es=; b=vX6HVRbf5ChW1XcqlsRm4OH63w05lAozI9OvCKayU2Q F9JFiv/pv1pFolBF5FAnyQJa2TQoAcvDIqM0NYFaaVMmR1Sd5mqjrjkN27HRdAOi Cg71MdSrfHC9d+LkCHAKtST/I3ddim+9m5dd9+MUCRJoKFm1Rb7FmbKczH+aB9DF c+BH8647IuzzGKtG2ckctBYfz5QVSO/3FHdXEBjtSpLAlokST/5uh5RHrsxxGveC ww447pgyMGAhYTa4Es3S4tLU8ExGTftRxhqC8RfxiM8MQSw/0BGooISdOAxK1NYp qyWSCnhLJNAOhouPBy0ArkLd5wuPoqS+OdhGp8ZmEzQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm3; bh=k+3cic +MmKt57bL6pkVQwnhyKaEKVHYZVlomZpAV1Es=; b=Go2b411WFlhDEQLYjc4n7R H4mGCeKt5xsf1IcopmJcdoLk1ZPs0aM7L1B7HaKrmWFwT4aeRMtV6FdR9Bqi17Ze w7ZYd14OYk8NbdCghveCid939ZxEcf8S5Y8fQEI/geC56kJFVauFkEHHqBDjkJ/m XcNBQgvvlOjA76Dgf6Ex9VxxBJX6UME5VuFrHeHQpHzkPMlG6rmO4Qjm6rKN+2tB m0+5dnEzTKKyKil0V1S0GjbnVTKoy6sKRZyMMkiAFtLYddPIozCYg3g0u/VJ3U3U drSibi0XhywXMyuJ6vzGV2Pi4h4K6U8o4/DmZEDdb/h2BMLsQEmsZTh1gM8ud6xg == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduiedrudehtddgledtucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhepfffhvffukfhfgggtuggjsehgtderredttddvnecuhfhrohhmpefrrghtrhhi tghkucfuthgvihhnhhgrrhguthcuoehpshesphhkshdrihhmqeenucggtffrrghtthgvrh hnpeehgefhtdefueffheekgfffudelffejtdfhvdejkedthfehvdelgfetgfdvtedthfen ucfkphepkeelrddugedrfeekrddufeegnecuvehluhhsthgvrhfuihiivgeptdenucfrrg hrrghmpehmrghilhhfrhhomhepphhssehpkhhsrdhimh X-ME-Proxy: Received: from vm-mail.pks.im (x590e2686.dyn.telefonica.de [89.14.38.134]) by mail.messagingengine.com (Postfix) with ESMTPA id AB118328005E; Mon, 7 Sep 2020 11:27:29 -0400 (EDT) Received: from localhost (tanuki [10.192.0.23]) by vm-mail.pks.im (OpenSMTPD) with ESMTPSA id 86da762a (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Mon, 7 Sep 2020 15:27:28 +0000 (UTC) Date: Mon, 7 Sep 2020 17:27:27 +0200 From: Patrick Steinhardt To: grub-devel@gnu.org Cc: Denis GNUtoo Carikli , Glenn Washburn , Daniel Kiper Subject: [PATCH v3 0/9] Cryptodisk fixes for v2.06 Message-ID: References: MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="liOOAslEiF7prFVr" Content-Disposition: inline In-Reply-To: Received-SPF: pass client-ip=64.147.123.25; envelope-from=ps@pks.im; helo=wout2-smtp.messagingengine.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/09/07 11:26:12 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 07 Sep 2020 15:27:39 -0000 --liOOAslEiF7prFVr Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi, this is the third version of this patchset, collecting various fixes for LUKS2/cryptodisk for the upcoming release of GRUB v2.06. Besides my Reviewed-by tag, the only thing that changed is the final patch by Glenn. Quoting him: > The main difference with this patch is that sector_size is renamed to > log_sector_size, grub has enough inaccurate or misleading names. > Additionally, rename LOG_SECTOR_SIZE to LUKS_LOG_SECTOR_SIZE and > CRYPT_LOG_SECTOR_SIZE to GRUB_CRYPTODISK_IV_LOG_SIZE and moved to > cryptodisk.h. Also a comment was reworded for clarity. The range-diff against v2 is attached below. Patrick Glenn Washburn (6): luks2: Fix use of incorrect index and some error messages luks2: grub_cryptodisk_t->total_length is the max number of device native sectors cryptodisk: Unregister cryptomount command when removing module cryptodisk: Fix incorrect calculation of start sector cryptodisk: Fix cipher IV mode 'plain64' always being set as 'plain' cryptodisk: Properly handle non-512 byte sized sectors Patrick Steinhardt (3): json: Remove invalid typedef redefinition luks: Fix out-of-bounds copy of UUID luks2: Improve error reporting when decrypting/verifying key grub-core/disk/cryptodisk.c | 60 +++++++++++++++++++------------------ grub-core/disk/luks.c | 8 +++-- grub-core/disk/luks2.c | 55 ++++++++++++++++++++-------------- grub-core/lib/json/json.h | 9 +++--- include/grub/cryptodisk.h | 9 +++++- include/grub/disk.h | 7 +++++ 6 files changed, 88 insertions(+), 60 deletions(-) Range-diff against v2: 1: ee402de4d =3D 1: ee402de4d json: Remove invalid typedef redefinition 2: 5ecb9a4eb =3D 2: 5ecb9a4eb luks: Fix out-of-bounds copy of UUID 3: f8da5b4b4 =3D 3: f8da5b4b4 luks2: Fix use of incorrect index and som= e error messages 4: 150491a07 ! 4: efbf789e2 luks2: grub_cryptodisk_t->total_length is t= he max number of device native sectors @@ Commit message segment.size is in bytes which need to be converted to cryptodisk = sectors. =20 Signed-off-by: Glenn Washburn + Reviewed-by: Patrick Steinhardt =20 ## grub-core/disk/luks2.c ## @@ grub-core/disk/luks2.c: luks2_decrypt_key (grub_uint8_t *out_key, 5: 7dbfad568 =3D 5: eb4198a01 luks2: Improve error reporting when decry= pting/verifying key 6: dbf25a0ae =3D 6: 7ef38470b cryptodisk: Unregister cryptomount comman= d when removing module 7: 4ee7f8774 =3D 7: a9765c0f4 cryptodisk: Fix incorrect calculation of = start sector 8: 4aecb174b =3D 8: 5497b02cc cryptodisk: Fix cipher IV mode 'plain64' = always being set as 'plain' 9: f520aecfa ! 9: 81b8a7f91 cryptodisk: Properly handle non-512 byte si= zed sectors @@ Commit message Reviewed-by: Patrick Steinhardt =20 ## grub-core/disk/cryptodisk.c ## -@@ -=20 - GRUB_MOD_LICENSE ("GPLv3+"); -=20 -+/* Internally encrypted sectors are 512 bytes regardless of what the = cryptodisk is */ -+#define CRYPT_LOG_SECTOR_SIZE 9 -+ - grub_cryptodisk_dev_t grub_cryptodisk_list; -=20 - static const struct grub_arg_option options[] =3D @@ grub-core/disk/cryptodisk.c: lrw_xor (const struct lrw_sector *sec, static gcry_err_code_t grub_cryptodisk_endecrypt (struct grub_cryptodisk *dev, grub_uint8_t * data, grub_size_t len, - grub_disk_addr_t sector, int do_encrypt) -+ grub_disk_addr_t sector, grub_size_t sector_size, ++ grub_disk_addr_t sector, grub_size_t log_sector_size, + int do_encrypt) { grub_size_t i; @@ grub-core/disk/cryptodisk.c: grub_cryptodisk_endecrypt (struct grub_= cryptodisk * : grub_crypto_ecb_decrypt (dev->cipher, data, data, len)); =20 - for (i =3D 0; i < len; i +=3D (1U << dev->log_sector_size)) -+ for (i =3D 0; i < len; i +=3D (1U << sector_size)) ++ for (i =3D 0; i < len; i +=3D (1U << log_sector_size)) { grub_size_t sz =3D ((dev->cipher->cipher->blocksize + sizeof (grub_uint32_t) - 1) / sizeof (grub_uint32_t)); grub_uint32_t iv[(GRUB_CRYPTO_MAX_CIPHER_BLOCKSIZE + 3) / 4]; -+ grub_uint64_t iv_calc; ++ grub_uint64_t iv_calc =3D 0; =20 if (dev->rekey) { @@ grub-core/disk/cryptodisk.c: grub_cryptodisk_endecrypt (struct grub_= cryptodisk * return GPG_ERR_OUT_OF_MEMORY; =20 - tmp =3D grub_cpu_to_le64 (sector << dev->log_sector_size); -+ tmp =3D grub_cpu_to_le64 (sector << sector_size); ++ tmp =3D grub_cpu_to_le64 (sector << log_sector_size); dev->iv_hash->init (ctx); dev->iv_hash->write (ctx, dev->iv_prefix, dev->iv_prefix_len); dev->iv_hash->write (ctx, &tmp, sizeof (tmp)); @@ grub-core/disk/cryptodisk.c: grub_cryptodisk_endecrypt (struct grub_= cryptodisk * break; case GRUB_CRYPTODISK_MODE_IV_PLAIN64: - iv[1] =3D grub_cpu_to_le32 (sector >> 32); -+ iv_calc =3D sector << (sector_size - CRYPT_LOG_SECTOR_SIZE); ++ iv_calc =3D sector << (log_sector_size - GRUB_CRYPTODISK_IV_LOG_SI= ZE); + iv[1] =3D grub_cpu_to_le32 (iv_calc >> 32); /* FALLTHROUGH */ case GRUB_CRYPTODISK_MODE_IV_PLAIN: - iv[0] =3D grub_cpu_to_le32 (sector & 0xFFFFFFFF); -+ iv_calc =3D sector << (sector_size - CRYPT_LOG_SECTOR_SIZE); ++ iv_calc =3D sector << (log_sector_size - GRUB_CRYPTODISK_IV_LOG_SI= ZE); + iv[0] =3D grub_cpu_to_le32 (iv_calc & 0xFFFFFFFF); break; case GRUB_CRYPTODISK_MODE_IV_BYTECOUNT64: - iv[1] =3D grub_cpu_to_le32 (sector >> (32 - dev->log_sector_size)); - iv[0] =3D grub_cpu_to_le32 ((sector << dev->log_sector_size) -+ iv[1] =3D grub_cpu_to_le32 (sector >> (32 - sector_size)); -+ iv[0] =3D grub_cpu_to_le32 ((sector << sector_size) ++ iv[1] =3D grub_cpu_to_le32 (sector >> (32 - log_sector_size)); ++ iv[0] =3D grub_cpu_to_le32 ((sector << log_sector_size) & 0xFFFFFFFF); break; case GRUB_CRYPTODISK_MODE_IV_BENBI: @@ grub-core/disk/cryptodisk.c: grub_cryptodisk_endecrypt (struct grub_= cryptodisk * if (do_encrypt) err =3D grub_crypto_cbc_encrypt (dev->cipher, data + i, data + i, - (1U << dev->log_sector_size), iv); -+ (1U << sector_size), iv); ++ (1U << log_sector_size), iv); else err =3D grub_crypto_cbc_decrypt (dev->cipher, data + i, data + i, - (1U << dev->log_sector_size), iv); -+ (1U << sector_size), iv); ++ (1U << log_sector_size), iv); if (err) return err; break; @@ grub-core/disk/cryptodisk.c: grub_cryptodisk_endecrypt (struct grub_= cryptodisk * if (do_encrypt) err =3D grub_crypto_pcbc_encrypt (dev->cipher, data + i, data + = i, - (1U << dev->log_sector_size), iv); -+ (1U << sector_size), iv); ++ (1U << log_sector_size), iv); else err =3D grub_crypto_pcbc_decrypt (dev->cipher, data + i, data + = i, - (1U << dev->log_sector_size), iv); -+ (1U << sector_size), iv); ++ (1U << log_sector_size), iv); if (err) return err; break; @@ grub-core/disk/cryptodisk.c: grub_cryptodisk_endecrypt (struct grub_= cryptodisk * return err; =20 - for (j =3D 0; j < (1U << dev->log_sector_size); -+ for (j =3D 0; j < (1U << sector_size); ++ for (j =3D 0; j < (1U << log_sector_size); j +=3D dev->cipher->cipher->blocksize) { grub_crypto_xor (data + i + j, data + i + j, iv, @@ grub-core/disk/cryptodisk.c: grub_cryptodisk_endecrypt (struct grub_= cryptodisk * err =3D grub_crypto_ecb_encrypt (dev->cipher, data + i,=20 data + i, - (1U << dev->log_sector_size)); -+ (1U << sector_size)); ++ (1U << log_sector_size)); else err =3D grub_crypto_ecb_decrypt (dev->cipher, data + i,=20 data + i, - (1U << dev->log_sector_size)); -+ (1U << sector_size)); ++ (1U << log_sector_size)); if (err) return err; lrw_xor (&sec, dev, data + i); @@ grub-core/disk/cryptodisk.c: grub_cryptodisk_endecrypt (struct grub_= cryptodisk * if (do_encrypt) err =3D grub_crypto_ecb_encrypt (dev->cipher, data + i, data + i, - (1U << dev->log_sector_size)); -+ (1U << sector_size)); ++ (1U << log_sector_size)); else err =3D grub_crypto_ecb_decrypt (dev->cipher, data + i, data + i, - (1U << dev->log_sector_size)); -+ (1U << sector_size)); ++ (1U << log_sector_size)); if (err) return err; break; @@ grub-core/disk/cryptodisk.c: grub_cryptodisk_endecrypt (struct grub_= cryptodisk * grub_cryptodisk_decrypt (struct grub_cryptodisk *dev, grub_uint8_t * data, grub_size_t len, - grub_disk_addr_t sector) -+ grub_disk_addr_t sector, grub_size_t sector_size) ++ grub_disk_addr_t sector, grub_size_t log_sector_size) { - return grub_cryptodisk_endecrypt (dev, data, len, sector, 0); -+ return grub_cryptodisk_endecrypt (dev, data, len, sector, sector_si= ze, 0); ++ return grub_cryptodisk_endecrypt (dev, data, len, sector, log_secto= r_size, 0); } =20 grub_err_t @@ grub-core/disk/cryptodisk.c: grub_cryptodisk_write (grub_disk_t disk= , grub_disk_ grub_free (tmp); =20 ## grub-core/disk/luks.c ## -@@ - GRUB_MOD_LICENSE ("GPLv3+"); -=20 - #define MAX_PASSPHRASE 256 -+#define LOG_SECTOR_SIZE 9 -=20 - #define LUKS_KEY_ENABLED 0x00AC71F3 -=20 @@ grub-core/disk/luks.c: configure_ciphers (grub_disk_t disk, const c= har *check_uuid, return NULL; newdev->offset =3D grub_be_to_cpu32 (header.payloadOffset); newdev->source_disk =3D NULL; - newdev->log_sector_size =3D 9; -+ newdev->log_sector_size =3D LOG_SECTOR_SIZE; ++ newdev->log_sector_size =3D LUKS_LOG_SECTOR_SIZE; newdev->total_length =3D grub_disk_get_size (disk) - newdev->offset; grub_memcpy (newdev->uuid, uuid, sizeof (uuid)); newdev->modname =3D "luks"; @@ grub-core/disk/luks.c: luks_recover_key (grub_disk_t source, } =20 - gcry_err =3D grub_cryptodisk_decrypt (dev, split_key, length, 0= ); -+ gcry_err =3D grub_cryptodisk_decrypt (dev, split_key, length, 0= , LOG_SECTOR_SIZE); ++ gcry_err =3D grub_cryptodisk_decrypt (dev, split_key, length, 0, ++ LUKS_LOG_SECTOR_SIZE); if (gcry_err) { grub_free (split_key); @@ grub-core/disk/luks2.c: luks2_decrypt_key (grub_uint8_t *out_key, =20 - gcry_ret =3D grub_cryptodisk_decrypt (crypt, split_key, k->area.siz= e, 0); + /* -+ * The encrypted key slots are always with 512byte sectors, -+ * regardless of encrypted data sector size ++ * The key slots area is always encrypted in 512-byte sectors, ++ * regardless of encrypted data sector size. + */ -+ gcry_ret =3D grub_cryptodisk_decrypt (crypt, split_key, k->area.siz= e, 0, 9); ++ gcry_ret =3D grub_cryptodisk_decrypt (crypt, split_key, k->area.siz= e, 0, ++ LUKS_LOG_SECTOR_SIZE); if (gcry_ret) { ret =3D grub_crypto_gcry_error (gcry_ret); =20 ## include/grub/cryptodisk.h ## +@@ include/grub/cryptodisk.h: typedef enum +=20 + #define GRUB_CRYPTODISK_MAX_UUID_LENGTH 71 +=20 ++#define LUKS_LOG_SECTOR_SIZE 9 ++ ++/* For the purposes of IV incrementing the sector size is 512 bytes, = unless ++ * otherwise specified. ++ */ ++#define GRUB_CRYPTODISK_IV_LOG_SIZE 9 ++ + #define GRUB_CRYPTODISK_GF_LOG_SIZE 7 + #define GRUB_CRYPTODISK_GF_SIZE (1U << GRUB_CRYPTODISK_GF_LOG_SIZE) + #define GRUB_CRYPTODISK_GF_LOG_BYTES (GRUB_CRYPTODISK_GF_LOG_SIZE - 3) @@ include/grub/cryptodisk.h: grub_cryptodisk_setkey (grub_cryptodisk_= t dev, gcry_err_code_t grub_cryptodisk_decrypt (struct grub_cryptodisk *dev, grub_uint8_t * data, grub_size_t len, - grub_disk_addr_t sector); -+ grub_disk_addr_t sector, grub_size_t sector_size); ++ grub_disk_addr_t sector, grub_size_t log_sector_size); grub_err_t grub_cryptodisk_insert (grub_cryptodisk_t newdev, const char *name, grub_disk_t source); --=20 2.28.0 --liOOAslEiF7prFVr Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEF9hrgiFbCdvenl/rVbJhu7ckPpQFAl9WUV4ACgkQVbJhu7ck PpRCZg//e8MryidjXoWkiP+6b3RIVYF6Sw1fuj40Eg/5zyKsieW2Zus8HYGCNLIH tBJKq6OtSophWbmk1llmt016SNpxBNs4OH1LEcfhxVvJqNPFakYUmNDl/0PshYsz tJo+dgjuNgwgJuhkmIJa8WqXFKnHzy9lCCs6fAJv4cJJc2mEuuE/9SrVfMFeDnq4 qyIZcrooct9ETEPBL+5feD/FIBYew8u/U+XXzeMBxTW4jCCcD1B/u8XslMWuSYGm wFpXh6BjOgcGpXWU6ccuuFUUlOKRHl58tvbdSi/qAd3m1cAj0rVS+7I2rnjyG8W/ bO7281rmOnmH25Iq0/OF+JtrQfyvRWEnDLO9GUHyQtpwMIUY/wR9eJEecNXyMN2+ t0rSfZwbtaZtlivRkxPWBv2+cksOchRw//LWwasBoEKwAnsvhHzgHLOEAZcT+9y/ hG+9sWago9A+yHb5+q9ZESCPdN3TzOCA/y1SQsJVs1qVr/BXMDr/liJtvgWcy+d2 w2MgBS7HepXQRCuKMo5sD0+94mLLnf66HX7Cra2FePbDWbjGGim4GQ9u03dx9fl8 FZf4EZ/UKb7z3w5uglz29BCh7w8YtHFIItS15Z5MIgpAinq3J72Es9053Pl1PBxp aMXIV20rwU5jbNi1t6jYnKVvKWQSwtb84tsx5rjDvJiE71M2QLI= =v/WC -----END PGP SIGNATURE----- --liOOAslEiF7prFVr--