mirror of
https://github.com/sheumann/hush.git
synced 2024-08-21 11:28:57 +00:00
Patch from Rob Sullivan to consolidate crc32 table generation.
This commit is contained in:
parent
998f449375
commit
c57ec37959
@ -293,6 +293,7 @@ static int ofd; /* output file descriptor */
|
|||||||
static unsigned insize; /* valid bytes in inbuf */
|
static unsigned insize; /* valid bytes in inbuf */
|
||||||
static unsigned outcnt; /* bytes in output buffer */
|
static unsigned outcnt; /* bytes in output buffer */
|
||||||
|
|
||||||
|
static uint32_t *crc_32_tab;
|
||||||
|
|
||||||
/* Output a 16 bit value, lsb first */
|
/* Output a 16 bit value, lsb first */
|
||||||
static void put_short(ush w)
|
static void put_short(ush w)
|
||||||
@ -344,32 +345,13 @@ static void write_buf(int fd, void *buf, unsigned cnt)
|
|||||||
* pointer, then initialize the crc shift register contents instead.
|
* pointer, then initialize the crc shift register contents instead.
|
||||||
* Return the current crc in either case.
|
* Return the current crc in either case.
|
||||||
*/
|
*/
|
||||||
static ulg updcrc(uch * s, unsigned n)
|
static uint32_t updcrc(uch * s, unsigned n)
|
||||||
{
|
{
|
||||||
static ulg crc = (ulg) 0xffffffffL; /* shift register contents */
|
static uint32_t crc = ~0; /* shift register contents */
|
||||||
register ulg c; /* temporary variable */
|
uint32_t c; /* temporary variable */
|
||||||
static unsigned long crc_32_tab[256];
|
|
||||||
|
|
||||||
if (crc_32_tab[1] == 0x00000000L) {
|
|
||||||
unsigned long csr; /* crc shift register */
|
|
||||||
const unsigned long e = 0xedb88320L; /* polynomial exclusive-or pattern */
|
|
||||||
int i; /* counter for all possible eight bit values */
|
|
||||||
int k; /* byte being shifted into crc apparatus */
|
|
||||||
|
|
||||||
/* Compute table of CRC's. */
|
|
||||||
for (i = 1; i < 256; i++) {
|
|
||||||
csr = i;
|
|
||||||
/* The idea to initialize the register with the byte instead of
|
|
||||||
* zero was stolen from Haruhiko Okumura's ar002
|
|
||||||
*/
|
|
||||||
for (k = 8; k; k--)
|
|
||||||
csr = csr & 1 ? (csr >> 1) ^ e : csr >> 1;
|
|
||||||
crc_32_tab[i] = csr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s == NULL) {
|
if (s == NULL) {
|
||||||
c = 0xffffffffL;
|
c = ~0;
|
||||||
} else {
|
} else {
|
||||||
c = crc;
|
c = crc;
|
||||||
if (n)
|
if (n)
|
||||||
@ -378,7 +360,7 @@ static ulg updcrc(uch * s, unsigned n)
|
|||||||
} while (--n);
|
} while (--n);
|
||||||
}
|
}
|
||||||
crc = c;
|
crc = c;
|
||||||
return c ^ 0xffffffffL; /* (instead of ~c for 64-bit machines) */
|
return ~c;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* bits.c -- output variable-length bit strings
|
/* bits.c -- output variable-length bit strings
|
||||||
@ -1223,6 +1205,9 @@ int gzip_main(int argc, char **argv)
|
|||||||
ALLOC(uch, window, 2L * WSIZE);
|
ALLOC(uch, window, 2L * WSIZE);
|
||||||
ALLOC(ush, tab_prefix, 1L << BITS);
|
ALLOC(ush, tab_prefix, 1L << BITS);
|
||||||
|
|
||||||
|
/* Initialise the CRC32 table */
|
||||||
|
crc_32_tab = bb_crc32_filltable(0);
|
||||||
|
|
||||||
clear_bufs();
|
clear_bufs();
|
||||||
part_nb = 0;
|
part_nb = 0;
|
||||||
|
|
||||||
@ -2416,7 +2401,7 @@ static void set_file_type(void)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
static ulg crc; /* crc on uncompressed file data */
|
static uint32_t crc; /* crc on uncompressed file data */
|
||||||
static long header_bytes; /* number of bytes in gzip header */
|
static long header_bytes; /* number of bytes in gzip header */
|
||||||
|
|
||||||
static void put_long(ulg n)
|
static void put_long(ulg n)
|
||||||
|
@ -84,8 +84,8 @@ typedef struct {
|
|||||||
|
|
||||||
/* The CRC values stored in the block header and calculated from the data */
|
/* The CRC values stored in the block header and calculated from the data */
|
||||||
|
|
||||||
unsigned int crc32Table[256],headerCRC, totalCRC, writeCRC;
|
uint32_t headerCRC, totalCRC, writeCRC;
|
||||||
|
uint32_t *crc32Table;
|
||||||
/* Intermediate buffer and its size (in bytes) */
|
/* Intermediate buffer and its size (in bytes) */
|
||||||
|
|
||||||
unsigned int *dbuf, dbufSize;
|
unsigned int *dbuf, dbufSize;
|
||||||
@ -620,7 +620,7 @@ decode_next_byte:
|
|||||||
bd->writeCount=previous;
|
bd->writeCount=previous;
|
||||||
return (previous!=RETVAL_LAST_BLOCK) ? previous : gotcount;
|
return (previous!=RETVAL_LAST_BLOCK) ? previous : gotcount;
|
||||||
}
|
}
|
||||||
bd->writeCRC=0xffffffffUL;
|
bd->writeCRC=~0;
|
||||||
pos=bd->writePos;
|
pos=bd->writePos;
|
||||||
current=bd->writeCurrent;
|
current=bd->writeCurrent;
|
||||||
goto decode_next_byte;
|
goto decode_next_byte;
|
||||||
@ -634,7 +634,7 @@ static int start_bunzip(bunzip_data **bdp, int in_fd, unsigned char *inbuf,
|
|||||||
int len)
|
int len)
|
||||||
{
|
{
|
||||||
bunzip_data *bd;
|
bunzip_data *bd;
|
||||||
unsigned int i,j,c;
|
unsigned int i;
|
||||||
const unsigned int BZh0=(((unsigned int)'B')<<24)+(((unsigned int)'Z')<<16)
|
const unsigned int BZh0=(((unsigned int)'B')<<24)+(((unsigned int)'Z')<<16)
|
||||||
+(((unsigned int)'h')<<8)+(unsigned int)'0';
|
+(((unsigned int)'h')<<8)+(unsigned int)'0';
|
||||||
|
|
||||||
@ -657,12 +657,7 @@ static int start_bunzip(bunzip_data **bdp, int in_fd, unsigned char *inbuf,
|
|||||||
|
|
||||||
/* Init the CRC32 table (big endian) */
|
/* Init the CRC32 table (big endian) */
|
||||||
|
|
||||||
for(i=0;i<256;i++) {
|
bd->crc32Table = bb_crc32_filltable(1);
|
||||||
c=i<<24;
|
|
||||||
for(j=8;j;j--)
|
|
||||||
c=c&0x80000000 ? (c<<1)^0x04c11db7 : (c<<1);
|
|
||||||
bd->crc32Table[i]=c;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Setup for I/O error handling via longjmp */
|
/* Setup for I/O error handling via longjmp */
|
||||||
|
|
||||||
|
@ -95,8 +95,8 @@ static unsigned int gunzip_outbuf_count; /* bytes in output buffer */
|
|||||||
enum { gunzip_wsize = 0x8000 };
|
enum { gunzip_wsize = 0x8000 };
|
||||||
static unsigned char *gunzip_window;
|
static unsigned char *gunzip_window;
|
||||||
|
|
||||||
static unsigned int *gunzip_crc_table;
|
static uint32_t *gunzip_crc_table;
|
||||||
unsigned int gunzip_crc;
|
uint32_t gunzip_crc;
|
||||||
|
|
||||||
/* If BMAX needs to be larger than 16, then h and x[] should be ulg. */
|
/* If BMAX needs to be larger than 16, then h and x[] should be ulg. */
|
||||||
#define BMAX 16 /* maximum bit length of any code (16 for explode) */
|
#define BMAX 16 /* maximum bit length of any code (16 for explode) */
|
||||||
@ -168,35 +168,6 @@ static unsigned int fill_bitbuffer(unsigned int bitbuffer, unsigned int *current
|
|||||||
return(bitbuffer);
|
return(bitbuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void make_gunzip_crc_table(void)
|
|
||||||
{
|
|
||||||
const unsigned int poly = 0xedb88320; /* polynomial exclusive-or pattern */
|
|
||||||
unsigned short i; /* counter for all possible eight bit values */
|
|
||||||
|
|
||||||
/* initial shift register value */
|
|
||||||
gunzip_crc = 0xffffffffL;
|
|
||||||
gunzip_crc_table = (unsigned int *) xmalloc(256 * sizeof(unsigned int));
|
|
||||||
|
|
||||||
/* Compute and print table of CRC's, five per line */
|
|
||||||
for (i = 0; i < 256; i++) {
|
|
||||||
unsigned int table_entry; /* crc shift register */
|
|
||||||
unsigned char k; /* byte being shifted into crc apparatus */
|
|
||||||
|
|
||||||
table_entry = i;
|
|
||||||
/* The idea to initialize the register with the byte instead of
|
|
||||||
* zero was stolen from Haruhiko Okumura's ar002
|
|
||||||
*/
|
|
||||||
for (k = 8; k; k--) {
|
|
||||||
if (table_entry & 1) {
|
|
||||||
table_entry = (table_entry >> 1) ^ poly;
|
|
||||||
} else {
|
|
||||||
table_entry >>= 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
gunzip_crc_table[i] = table_entry;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Free the malloc'ed tables built by huft_build(), which makes a linked
|
* Free the malloc'ed tables built by huft_build(), which makes a linked
|
||||||
* list of the tables it made, with the links in a dummy first entry of
|
* list of the tables it made, with the links in a dummy first entry of
|
||||||
@ -922,8 +893,9 @@ int inflate_unzip(int in, int out)
|
|||||||
gunzip_bb = 0;
|
gunzip_bb = 0;
|
||||||
|
|
||||||
/* Create the crc table */
|
/* Create the crc table */
|
||||||
make_gunzip_crc_table();
|
gunzip_crc_table = bb_crc32_filltable(0);
|
||||||
|
gunzip_crc = ~0;
|
||||||
|
|
||||||
/* Allocate space for buffer */
|
/* Allocate space for buffer */
|
||||||
bytebuffer = xmalloc(bytebuffer_max);
|
bytebuffer = xmalloc(bytebuffer_max);
|
||||||
|
|
||||||
@ -955,7 +927,7 @@ int inflate_unzip(int in, int out)
|
|||||||
|
|
||||||
int inflate_gunzip(int in, int out)
|
int inflate_gunzip(int in, int out)
|
||||||
{
|
{
|
||||||
unsigned int stored_crc = 0;
|
uint32_t stored_crc = 0;
|
||||||
unsigned int count;
|
unsigned int count;
|
||||||
|
|
||||||
inflate_unzip(in, out);
|
inflate_unzip(in, out);
|
||||||
@ -972,7 +944,7 @@ int inflate_gunzip(int in, int out)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Validate decompression - crc */
|
/* Validate decompression - crc */
|
||||||
if (stored_crc != (gunzip_crc ^ 0xffffffffL)) {
|
if (stored_crc != (~gunzip_crc)) {
|
||||||
bb_error_msg("crc error");
|
bb_error_msg("crc error");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -508,6 +508,8 @@ void md5_begin(md5_ctx_t *ctx);
|
|||||||
void md5_hash(const void *data, size_t length, md5_ctx_t *ctx);
|
void md5_hash(const void *data, size_t length, md5_ctx_t *ctx);
|
||||||
void *md5_end(void *resbuf, md5_ctx_t *ctx);
|
void *md5_end(void *resbuf, md5_ctx_t *ctx);
|
||||||
|
|
||||||
|
extern uint32_t *bb_crc32_filltable (int endian);
|
||||||
|
|
||||||
/* busybox.h will include dmalloc later for us, else include it here. */
|
/* busybox.h will include dmalloc later for us, else include it here. */
|
||||||
#if !defined _BB_INTERNAL_H_ && defined DMALLOC
|
#if !defined _BB_INTERNAL_H_ && defined DMALLOC
|
||||||
#include <dmalloc.h>
|
#include <dmalloc.h>
|
||||||
|
@ -13,7 +13,7 @@ LIBBB-n:=
|
|||||||
LIBBB-y:= \
|
LIBBB-y:= \
|
||||||
bb_asprintf.c ask_confirmation.c change_identity.c chomp.c \
|
bb_asprintf.c ask_confirmation.c change_identity.c chomp.c \
|
||||||
compare_string_array.c concat_path_file.c copy_file.c copyfd.c \
|
compare_string_array.c concat_path_file.c copy_file.c copyfd.c \
|
||||||
create_icmp_socket.c create_icmp6_socket.c \
|
crc32.c create_icmp_socket.c create_icmp6_socket.c \
|
||||||
device_open.c dump.c error_msg.c error_msg_and_die.c find_mount_point.c \
|
device_open.c dump.c error_msg.c error_msg_and_die.c find_mount_point.c \
|
||||||
find_pid_by_name.c find_root_device.c fgets_str.c full_read.c \
|
find_pid_by_name.c find_root_device.c fgets_str.c full_read.c \
|
||||||
full_write.c get_last_path_component.c get_line_from_file.c \
|
full_write.c get_last_path_component.c get_line_from_file.c \
|
||||||
|
40
libbb/crc32.c
Normal file
40
libbb/crc32.c
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
/* vi: set sw=4 ts=4: */
|
||||||
|
/*
|
||||||
|
* CRC32 table fill function
|
||||||
|
* Copyright (C) 2006 by Rob Sullivan <cogito.ergo.cogito@gmail.com>
|
||||||
|
* (I can't really claim much credit however, as the algorithm is
|
||||||
|
* very well-known)
|
||||||
|
*
|
||||||
|
* The following function creates a CRC32 table depending on whether
|
||||||
|
* a big-endian (0x04c11db7) or little-endian (0xedb88320) CRC32 is
|
||||||
|
* required. Admittedly, there are other CRC32 polynomials floating
|
||||||
|
* around, but Busybox doesn't use them.
|
||||||
|
*
|
||||||
|
* endian = 1: big-endian
|
||||||
|
* endian = 0: little-endian
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "libbb.h"
|
||||||
|
|
||||||
|
uint32_t *bb_crc32_filltable (int endian) {
|
||||||
|
|
||||||
|
uint32_t *crc_table = xmalloc(256 * sizeof(uint32_t));
|
||||||
|
uint32_t polynomial = endian ? 0x04c11db7 : 0xedb88320;
|
||||||
|
uint32_t c;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
for (i = 0; i < 256; i++) {
|
||||||
|
c = endian ? (i << 24) : i;
|
||||||
|
for (j = 8; j; j--) {
|
||||||
|
if (endian)
|
||||||
|
c = (c&0x80000000) ? ((c << 1) ^ polynomial) : (c << 1);
|
||||||
|
else
|
||||||
|
c = (c&1) ? ((c >> 1) ^ polynomial) : (c >> 1);
|
||||||
|
}
|
||||||
|
*crc_table++ = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
return crc_table - 256;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user