Committed. Thanks чт, 15 июн. 2017 г., 21:37 Eric Biggers <ebigge...@gmail.com>:
> From: Eric Biggers <ebigg...@google.com> > > Allow GRUB to mount ext2/3/4 filesystems that have the encryption > feature. On such a filesystem, inodes may have EXT4_ENCRYPT_FLAG set. > For a regular file, this means its contents are encrypted; for a > directory, this means the filenames in its directory entries are > encrypted; and for a symlink, this means its target is encrypted. Since > GRUB cannot decrypt encrypted contents or filenames, just issue an error > if it would need to do so. This is sufficient to allow unencrypted boot > files to co-exist with encrypted files elsewhere on the filesystem. > > (Note that encrypted regular files and symlinks will not normally be > encountered outside an encrypted directory; however, it's possible via > hard links, so they still need to be handled.) > > Tested by booting from an ext4 /boot partition on which I had run > 'tune2fs -O encrypt'. I also verified that the expected error messages > are printed when trying to access encrypted directories, files, and > symlinks from the GRUB command line. Also ran 'sudo ./grub-fs-tester > ext4_encrypt'; note that this requires e2fsprogs v1.43+ and Linux v4.1+. > > Signed-off-by: Eric Biggers <ebigg...@google.com> > --- > > v2: don't mark the error messages for translation, and test '-O encrypt' in > grub-fs-tester. > > grub-core/fs/ext2.c | 23 ++++++++++++++++++++++- > tests/ext234_test.in | 1 + > tests/util/grub-fs-tester.in | 10 ++++++++++ > 3 files changed, 33 insertions(+), 1 deletion(-) > > diff --git a/grub-core/fs/ext2.c b/grub-core/fs/ext2.c > index cdce63bcc..ac6b7220a 100644 > --- a/grub-core/fs/ext2.c > +++ b/grub-core/fs/ext2.c > @@ -102,6 +102,7 @@ GRUB_MOD_LICENSE ("GPLv3+"); > #define EXT4_FEATURE_INCOMPAT_64BIT 0x0080 > #define EXT4_FEATURE_INCOMPAT_MMP 0x0100 > #define EXT4_FEATURE_INCOMPAT_FLEX_BG 0x0200 > +#define EXT4_FEATURE_INCOMPAT_ENCRYPT 0x10000 > > /* The set of back-incompatible features this driver DOES support. Add > (OR) > * flags here as the related features are implemented into the driver. */ > @@ -109,7 +110,8 @@ GRUB_MOD_LICENSE ("GPLv3+"); > | EXT4_FEATURE_INCOMPAT_EXTENTS \ > | EXT4_FEATURE_INCOMPAT_FLEX_BG \ > | EXT2_FEATURE_INCOMPAT_META_BG \ > - | EXT4_FEATURE_INCOMPAT_64BIT) > + | EXT4_FEATURE_INCOMPAT_64BIT \ > + | EXT4_FEATURE_INCOMPAT_ENCRYPT) > /* List of rationales for the ignored "incompatible" features: > * needs_recovery: Not really back-incompatible - was added as such to > forbid > * ext2 drivers from mounting an ext3 volume with a dirty > @@ -138,6 +140,7 @@ GRUB_MOD_LICENSE ("GPLv3+"); > #define EXT3_JOURNAL_FLAG_DELETED 4 > #define EXT3_JOURNAL_FLAG_LAST_TAG 8 > > +#define EXT4_ENCRYPT_FLAG 0x800 > #define EXT4_EXTENTS_FLAG 0x80000 > > /* The ext2 superblock. */ > @@ -706,6 +709,12 @@ grub_ext2_read_symlink (grub_fshelp_node_t node) > grub_ext2_read_inode (diro->data, diro->ino, &diro->inode); > if (grub_errno) > return 0; > + > + if (diro->inode.flags & grub_cpu_to_le32_compile_time > (EXT4_ENCRYPT_FLAG)) > + { > + grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, "symlink is > encrypted"); > + return 0; > + } > } > > symlink = grub_malloc (grub_le_to_cpu32 (diro->inode.size) + 1); > @@ -749,6 +758,12 @@ grub_ext2_iterate_dir (grub_fshelp_node_t dir, > return 0; > } > > + if (diro->inode.flags & grub_cpu_to_le32_compile_time > (EXT4_ENCRYPT_FLAG)) > + { > + grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, "directory is encrypted"); > + return 0; > + } > + > /* Search the file. */ > while (fpos < grub_le_to_cpu32 (diro->inode.size)) > { > @@ -859,6 +874,12 @@ grub_ext2_open (struct grub_file *file, const char > *name) > goto fail; > } > > + if (fdiro->inode.flags & grub_cpu_to_le32_compile_time > (EXT4_ENCRYPT_FLAG)) > + { > + err = grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, "file is > encrypted"); > + goto fail; > + } > + > grub_memcpy (data->inode, &fdiro->inode, sizeof (struct > grub_ext2_inode)); > grub_free (fdiro); > > diff --git a/tests/ext234_test.in b/tests/ext234_test.in > index 892b99cbd..4f1eb527e 100644 > --- a/tests/ext234_test.in > +++ b/tests/ext234_test.in > @@ -30,3 +30,4 @@ fi > "@builddir@/grub-fs-tester" ext3 > "@builddir@/grub-fs-tester" ext4 > "@builddir@/grub-fs-tester" ext4_metabg > +"@builddir@/grub-fs-tester" ext4_encrypt > diff --git a/tests/util/grub-fs-tester.in b/tests/util/grub-fs-tester.in > index 88cbe7365..6d21705c5 100644 > --- a/tests/util/grub-fs-tester.in > +++ b/tests/util/grub-fs-tester.in > @@ -156,6 +156,12 @@ for LOGSECSIZE in $(range "$MINLOGSECSIZE" > "$MAXLOGSECSIZE" 1); do > # Could go further but what's the point? > MAXBLKSIZE=$((65536*1024)) > ;; > + xext4_encrypt) > + # OS LIMITATION: Linux currently only allows the 'encrypt' > feature > + # in combination with block_size = PAGE_SIZE (4096 bytes on > x86). > + MINBLKSIZE=$(getconf PAGE_SIZE) > + MAXBLKSIZE=$MINBLKSIZE > + ;; > xext*) > MINBLKSIZE=1024 > if [ $MINBLKSIZE -lt $SECSIZE ]; then > @@ -796,6 +802,10 @@ for LOGSECSIZE in $(range "$MINLOGSECSIZE" > "$MAXLOGSECSIZE" 1); do > MKE2FS_DEVICE_SECTSIZE=$SECSIZE "mkfs.ext4" -O > meta_bg,^resize_inode -b $BLKSIZE -L "$FSLABEL" -q "${MOUNTDEVICE}" > MOUNTFS=ext4 > ;; > + xext4_encrypt) > + MKE2FS_DEVICE_SECTSIZE=$SECSIZE "mkfs.ext4" -O encrypt > -b $BLKSIZE -L "$FSLABEL" -q "${MOUNTDEVICE}" > + MOUNTFS=ext4 > + ;; > xext*) > MKE2FS_DEVICE_SECTSIZE=$SECSIZE "mkfs.$fs" -b $BLKSIZE > -L "$FSLABEL" -q "${MOUNTDEVICE}" ;; > xxfs) > -- > 2.13.1 > > > _______________________________________________ > Grub-devel mailing list > Grub-devel@gnu.org > https://lists.gnu.org/mailman/listinfo/grub-devel >
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel