[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] Implement checksum verification for gunzip
From: |
Andrei Borzenkov |
Subject: |
Re: [PATCH] Implement checksum verification for gunzip |
Date: |
Tue, 3 May 2016 19:49:03 +0300 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.7.2 |
01.05.2016 15:32, Stefan Fritsch пишет:
> This implements the crc32 check for the gzip format. Support for zlib's
> adler checksum is not included, yet.
>
That looks fine, but it is something for post 2.02. Ping if it gets forgot.
> diff --git a/contrib/grub2/grub-core/io/gzio.c
> b/contrib/grub2/grub-core/io/gzio.c
> index 0f2ea6b..432f0aa 100644
> --- a/contrib/grub2/grub-core/io/gzio.c
> +++ b/contrib/grub2/grub-core/io/gzio.c
> @@ -43,6 +43,7 @@
> #include <grub/dl.h>
> #include <grub/deflate.h>
> #include <grub/i18n.h>
> +#include <grub/crypto.h>
>
> GRUB_MOD_LICENSE ("GPLv3+");
>
> @@ -94,6 +95,14 @@ struct grub_gzio
> struct huft *tl;
> /* The distance code table. */
> struct huft *td;
> + /* The checksum algorithm */
> + const gcry_md_spec_t *hdesc;
Are different algorithms possible?
> + /* The wanted checksum */
> + grub_uint32_t orig_checksum;
> + /* The uncompressed length */
> + grub_size_t orig_len;
> + /* Context for checksum calculation */
> + grub_uint8_t *hcontext;
> /* The lookup bits for the literal/length code table. */
> int bl;
> /* The lookup bits for the distance code table. */
> @@ -180,7 +189,7 @@ test_gzip_header (grub_file_t file)
> grub_uint8_t os_type;
> } hdr;
> grub_uint16_t extra_len;
> - grub_uint32_t orig_len;
> + grub_uint32_t crc32;
> grub_gzio_t gzio = file->data;
>
> if (grub_file_tell (gzio->file) != 0)
> @@ -215,12 +224,15 @@ test_gzip_header (grub_file_t file)
>
> /* FIXME: don't do this on not easily seekable files. */
> {
> - grub_file_seek (gzio->file, grub_file_size (gzio->file) - 4);
> - if (grub_file_read (gzio->file, &orig_len, 4) != 4)
> + grub_file_seek (gzio->file, grub_file_size (gzio->file) - 8);
> + if (grub_file_read (gzio->file, &crc32, 4) != 4)
> + return 0;
> + gzio->orig_checksum = grub_le_to_cpu32 (crc32);
> + if (grub_file_read (gzio->file, &gzio->orig_len, 4) != 4)
> return 0;
> /* FIXME: this does not handle files whose original size is over 4GB.
> But how can we know the real original size? */
> - file->size = grub_le_to_cpu32 (orig_len);
> + file->size = grub_le_to_cpu32 (gzio->orig_len);
> }
>
> initialize_tables (gzio);
> @@ -1095,7 +1107,23 @@ inflate_window (grub_gzio_t gzio)
>
> gzio->saved_offset += gzio->wp;
>
> - /* XXX do CRC calculation here! */
> + if (gzio->hcontext)
> + {
> + gzio->hdesc->write (gzio->hcontext, gzio->slide, gzio->wp);
> +
> + if (gzio->saved_offset == gzio->orig_len)
> + {
> + grub_uint32_t csum;
> +
> + gzio->hdesc->final (gzio->hcontext);
> + csum = *(grub_uint32_t *)gzio->hdesc->read (gzio->hcontext);
> + csum = grub_be_to_cpu32 (csum);
> + if (csum != gzio->orig_checksum)
> + grub_error (GRUB_ERR_BAD_COMPRESSED_DATA,
> + "checksum mismatch %08x/%08x",
> + gzio->orig_checksum, csum);
> + }
> + }
> }
>
>
> @@ -1118,6 +1146,9 @@ initialize_tables (grub_gzio_t gzio)
> huft_free (gzio->td);
> gzio->tl = NULL;
> gzio->td = NULL;
> +
> + if (gzio->hcontext)
> + gzio->hdesc->init(gzio->hcontext);
> }
>
>
> @@ -1143,6 +1174,9 @@ grub_gzio_open (grub_file_t io, const char *name
> __attribute__ ((unused)))
>
> gzio->file = io;
>
> + gzio->hdesc = GRUB_MD_CRC32;
> + gzio->hcontext = grub_malloc(gzio->hdesc->contextsize);
> +
> file->device = io->device;
> file->data = gzio;
> file->fs = &grub_gzio_fs;
> @@ -1151,6 +1185,7 @@ grub_gzio_open (grub_file_t io, const char *name
> __attribute__ ((unused)))
> if (! test_gzip_header (file))
> {
> grub_errno = GRUB_ERR_NONE;
> + grub_free (gzio->hcontext);
> grub_free (gzio);
> grub_free (file);
> grub_file_seek (io, 0);
> @@ -1287,6 +1322,7 @@ grub_gzio_close (grub_file_t file)
> grub_file_close (gzio->file);
> huft_free (gzio->tl);
> huft_free (gzio->td);
> + grub_free (gzio->hcontext);
> grub_free (gzio);
>
> /* No need to close the same device twice. */
>
> _______________________________________________
> Grub-devel mailing list
> address@hidden
> https://lists.gnu.org/mailman/listinfo/grub-devel
>