mirror of
https://github.com/sheumann/hush.git
synced 2024-12-23 05:29:58 +00:00
Fix bug (wrong value computed) when reading file from stdin, implement
-s option
This commit is contained in:
parent
7aa62cf173
commit
138d71bc35
@ -4,7 +4,7 @@
|
|||||||
* shasum fixed with reference to coreutils and the nist fip180-1 document
|
* shasum fixed with reference to coreutils and the nist fip180-1 document
|
||||||
* which is incorrect, in section 5
|
* which is incorrect, in section 5
|
||||||
* - ft(B,C,D) = (B AND C) OR ((NOT B) AND D) ( 0 <= t <= 19)
|
* - ft(B,C,D) = (B AND C) OR ((NOT B) AND D) ( 0 <= t <= 19)
|
||||||
* + ft(B,C,D) = (D XOR (B AND (C XOR S))) ( 0 <= t <= 19)
|
* + ft(B,C,D) = (D XOR (B AND (C XOR D))) ( 0 <= t <= 19)
|
||||||
*
|
*
|
||||||
* Copyright (C) 1999 Scott G. Miller
|
* Copyright (C) 1999 Scott G. Miller
|
||||||
* Copyright (C) 2003 Glenn L. McGrath
|
* Copyright (C) 2003 Glenn L. McGrath
|
||||||
@ -112,7 +112,7 @@ static void sha_hash(unsigned int *data, int *hash)
|
|||||||
hash[4] += e;
|
hash[4] += e;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sha1sum_stream(FILE * fd, unsigned int *hashval)
|
static void sha1sum_stream(FILE *fd, unsigned int *hashval)
|
||||||
{
|
{
|
||||||
RESERVE_CONFIG_BUFFER(buffer, 64);
|
RESERVE_CONFIG_BUFFER(buffer, 64);
|
||||||
int length = 0;
|
int length = 0;
|
||||||
@ -128,11 +128,6 @@ static void sha1sum_stream(FILE * fd, unsigned int *hashval)
|
|||||||
length += c;
|
length += c;
|
||||||
if (feof(fd) || ferror(fd)) {
|
if (feof(fd) || ferror(fd)) {
|
||||||
int i;
|
int i;
|
||||||
/* If reading from stdin we need to get rid of a tailing character */
|
|
||||||
if (fd == stdin) {
|
|
||||||
c--;
|
|
||||||
length--;
|
|
||||||
}
|
|
||||||
for (i = c; i < 61; i++) {
|
for (i = c; i < 61; i++) {
|
||||||
if (i == c) {
|
if (i == c) {
|
||||||
buffer[i] = 0x80;
|
buffer[i] = 0x80;
|
||||||
@ -153,34 +148,37 @@ static void sha1sum_stream(FILE * fd, unsigned int *hashval)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void print_hash(unsigned short hash_length, unsigned int *hash_val, char *filename)
|
static void print_hash(unsigned int *hash_value, unsigned char hash_length, unsigned char *filename)
|
||||||
{
|
{
|
||||||
int x;
|
unsigned char x;
|
||||||
|
|
||||||
for (x = 0; x < hash_length; x++) {
|
for (x = 0; x < hash_length; x++) {
|
||||||
printf("%08x", hash_val[x]);
|
printf("%08x", hash_value[x]);
|
||||||
}
|
}
|
||||||
if (filename != NULL) {
|
putchar(' ');
|
||||||
putchar(' ');
|
putchar(' ');
|
||||||
putchar(' ');
|
puts(filename);
|
||||||
puts(filename);
|
|
||||||
}
|
|
||||||
putchar('\n');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define FLAG_SILENT 1
|
||||||
|
#define FLAG_CHECK 2
|
||||||
|
#define FLAG_WARN 3
|
||||||
|
|
||||||
/* This should become a common function used by sha1sum and md5sum,
|
/* This should become a common function used by sha1sum and md5sum,
|
||||||
* it needs extra functionality first
|
* it needs extra functionality first
|
||||||
*/
|
*/
|
||||||
extern int authenticate(const int argc, char **argv, void (*hash_ptr)(FILE *stream, unsigned int *hashval), const unsigned short hash_length)
|
extern int authenticate(int argc, char **argv, void (*hash_ptr)(FILE *stream, unsigned int *hashval), const unsigned char hash_length)
|
||||||
{
|
{
|
||||||
|
unsigned int hash_value[hash_length];
|
||||||
|
unsigned char flags = 0;
|
||||||
int opt;
|
int opt;
|
||||||
unsigned int *hashval;
|
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "sc:w")) != -1) {
|
while ((opt = getopt(argc, argv, "sc:w")) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
#if 0
|
|
||||||
case 's': /* Dont output anything, status code shows success */
|
case 's': /* Dont output anything, status code shows success */
|
||||||
|
flags |= FLAG_SILENT;
|
||||||
break;
|
break;
|
||||||
|
#if 0
|
||||||
case 'c': /* Check a list of checksums against stored values */
|
case 'c': /* Check a list of checksums against stored values */
|
||||||
break;
|
break;
|
||||||
case 'w': /* Warn of bad formatting when checking files */
|
case 'w': /* Warn of bad formatting when checking files */
|
||||||
@ -191,34 +189,38 @@ extern int authenticate(const int argc, char **argv, void (*hash_ptr)(FILE *stre
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hashval = xmalloc(hash_length * sizeof(unsigned int));
|
|
||||||
|
|
||||||
if (argc == optind) {
|
if (argc == optind) {
|
||||||
hash_ptr(stdin, hashval);
|
argv[argc] = "-";
|
||||||
print_hash(hash_length, hashval, NULL);
|
|
||||||
} else {
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = optind; i < argc; i++) {
|
|
||||||
if (!strcmp(argv[i], "-")) {
|
|
||||||
hash_ptr(stdin, hashval);
|
|
||||||
print_hash(hash_length, hashval, NULL);
|
|
||||||
} else {
|
|
||||||
FILE *stream = bb_xfopen(argv[i], "r");
|
|
||||||
hash_ptr(stream, hashval);
|
|
||||||
fclose(stream);
|
|
||||||
print_hash(hash_length, hashval, argv[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
free(hashval);
|
while (optind < argc) {
|
||||||
|
FILE *stream;
|
||||||
|
unsigned char *file_ptr = argv[optind];
|
||||||
|
|
||||||
return 0;
|
if ((file_ptr[0] == '-') && (file_ptr[1] == '\0')) {
|
||||||
|
stream = stdin;
|
||||||
|
} else {
|
||||||
|
stream = bb_wfopen(file_ptr, "r");
|
||||||
|
if (stream == NULL) {
|
||||||
|
return(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
hash_ptr(stream, hash_value);
|
||||||
|
if (!flags & FLAG_SILENT) {
|
||||||
|
print_hash(hash_value, hash_length, file_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fclose(stream) == EOF) {
|
||||||
|
bb_perror_msg_and_die("Couldnt close file %s", file_ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
optind++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int sha1sum_main(int argc, char **argv)
|
extern int sha1sum_main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
/* sha1 length is 5 nibbles */
|
|
||||||
return (authenticate(argc, argv, sha1sum_stream, 5));
|
return (authenticate(argc, argv, sha1sum_stream, 5));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user