aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--bsum.c172
1 files changed, 34 insertions, 138 deletions
diff --git a/bsum.c b/bsum.c
index 1940cf2..648d7fb 100644
--- a/bsum.c
+++ b/bsum.c
@@ -38,9 +38,11 @@ get_lenght_by_command_name(const char *command)
}
static int
-hash_fd_blake224(int fd, const char *fname, int decode_hex, unsigned char hash[])
+hash_fd_blake(int fd, const char *fname, int decode_hex, unsigned char hash[], void *state,
+ void (*init_func)(void *state), size_t (*update_func)(void *state, const void *msg, size_t n),
+ size_t (*get_buf_size_func)(size_t bytes, size_t bits, const char *suffix),
+ void (*digest_func)(void *state, void *msg, size_t bytes, size_t bits, const char *suffix, unsigned char out[]))
{
- struct libblake_blake224_state state;
char *buf = NULL;
size_t size = 0;
size_t len = 0;
@@ -48,7 +50,7 @@ hash_fd_blake224(int fd, const char *fname, int decode_hex, unsigned char hash[]
size_t req;
ssize_t r;
int ok;
- libblake_blake224_init(&state);
+ init_func(state);
for (;;) {
if (len == size)
buf = erealloc(buf, size += 8 << 10);
@@ -64,7 +66,7 @@ hash_fd_blake224(int fd, const char *fname, int decode_hex, unsigned char hash[]
}
len += (size_t)r;
if (!decode_hex) {
- off += libblake_blake224_update(&state, &buf[off], len - off);
+ off += update_func(state, &buf[off], len - off);
if (off == len)
off = 0;
}
@@ -79,162 +81,56 @@ hash_fd_blake224(int fd, const char *fname, int decode_hex, unsigned char hash[]
return -1;
}
}
- req = libblake_blake224_digest_get_required_input_size(len, 0, NULL);
+ req = get_buf_size_func(len, 0, NULL);
if (req > size)
buf = erealloc(buf, size);
- libblake_blake224_digest(&state, buf, len, 0, NULL, hash);
+ libblake_blake224_digest(state, buf, len, 0, NULL, hash);
free(buf);
return 0;
}
static int
+hash_fd_blake224(int fd, const char *fname, int decode_hex, unsigned char hash[])
+{
+ struct libblake_blake224_state state;
+ return hash_fd_blake(fd, fname, decode_hex, hash, &state,
+ (void (*)(void *))&libblake_blake224_init,
+ (size_t (*)(void *, const void *, size_t))&libblake_blake224_update,
+ &libblake_blake224_digest_get_required_input_size,
+ (void (*)(void *, void *, size_t, size_t, const char *, unsigned char[]))&libblake_blake224_digest);
+}
+
+static int
hash_fd_blake256(int fd, const char *fname, int decode_hex, unsigned char hash[])
{
struct libblake_blake256_state state;
- char *buf = NULL;
- size_t size = 0;
- size_t len = 0;
- size_t off = 0;
- size_t req;
- ssize_t r;
- int ok;
- libblake_blake256_init(&state);
- for (;;) {
- if (len == size)
- buf = erealloc(buf, size += 8 << 10);
- r = read(fd, &buf[len], size - len);
- if (r <= 0) {
- if (!r)
- break;
- if (errno == EINTR)
- continue;
- fprintf(stderr, "%s: %s: %s\n", argv0, fname, strerror(errno));
- free(buf);
- return -1;
- }
- len += (size_t)r;
- if (!decode_hex) {
- off += libblake_blake256_update(&state, &buf[off], len - off);
- if (off == len)
- off = 0;
- }
- }
- if (off)
- memmove(&buf[0], &buf[off], len -= off);
- if (decode_hex) {
- len = libblake_decode_hex(buf, len, buf, &ok);
- if (!ok) {
- fprintf(stderr, "%s: %s: %s\n", argv0, fname, "invalid hexadecimal input");
- free(buf);
- return -1;
- }
- }
- req = libblake_blake256_digest_get_required_input_size(len, 0, NULL);
- if (req > size)
- buf = erealloc(buf, size);
- libblake_blake256_digest(&state, buf, len, 0, NULL, hash);
- free(buf);
- return 0;
+ return hash_fd_blake(fd, fname, decode_hex, hash, &state,
+ (void (*)(void *))&libblake_blake256_init,
+ (size_t (*)(void *, const void *, size_t))&libblake_blake256_update,
+ &libblake_blake256_digest_get_required_input_size,
+ (void (*)(void *, void *, size_t, size_t, const char *, unsigned char[]))&libblake_blake256_digest);
}
static int
hash_fd_blake384(int fd, const char *fname, int decode_hex, unsigned char hash[])
{
struct libblake_blake384_state state;
- char *buf = NULL;
- size_t size = 0;
- size_t len = 0;
- size_t off = 0;
- size_t req;
- ssize_t r;
- int ok;
- libblake_blake384_init(&state);
- for (;;) {
- if (len == size)
- buf = erealloc(buf, size += 8 << 10);
- r = read(fd, &buf[len], size - len);
- if (r <= 0) {
- if (!r)
- break;
- if (errno == EINTR)
- continue;
- fprintf(stderr, "%s: %s: %s\n", argv0, fname, strerror(errno));
- free(buf);
- return -1;
- }
- len += (size_t)r;
- if (!decode_hex) {
- off += libblake_blake384_update(&state, &buf[off], len - off);
- if (off == len)
- off = 0;
- }
- }
- if (off)
- memmove(&buf[0], &buf[off], len -= off);
- if (decode_hex) {
- len = libblake_decode_hex(buf, len, buf, &ok);
- if (!ok) {
- fprintf(stderr, "%s: %s: %s\n", argv0, fname, "invalid hexadecimal input");
- free(buf);
- return -1;
- }
- }
- req = libblake_blake384_digest_get_required_input_size(len, 0, NULL);
- if (req > size)
- buf = erealloc(buf, size);
- libblake_blake384_digest(&state, buf, len, 0, NULL, hash);
- free(buf);
- return 0;
+ return hash_fd_blake(fd, fname, decode_hex, hash, &state,
+ (void (*)(void *))&libblake_blake384_init,
+ (size_t (*)(void *, const void *, size_t))&libblake_blake384_update,
+ &libblake_blake384_digest_get_required_input_size,
+ (void (*)(void *, void *, size_t, size_t, const char *, unsigned char[]))&libblake_blake384_digest);
}
static int
hash_fd_blake512(int fd, const char *fname, int decode_hex, unsigned char hash[])
{
struct libblake_blake512_state state;
- char *buf = NULL;
- size_t size = 0;
- size_t len = 0;
- size_t off = 0;
- size_t req;
- ssize_t r;
- int ok;
- libblake_blake512_init(&state);
- for (;;) {
- if (len == size)
- buf = erealloc(buf, size += 8 << 10);
- r = read(fd, &buf[len], size - len);
- if (r <= 0) {
- if (!r)
- break;
- if (errno == EINTR)
- continue;
- fprintf(stderr, "%s: %s: %s\n", argv0, fname, strerror(errno));
- free(buf);
- return -1;
- }
- len += (size_t)r;
- if (!decode_hex) {
- off += libblake_blake512_update(&state, &buf[off], len - off);
- if (off == len)
- off = 0;
- }
- }
- if (off)
- memmove(&buf[0], &buf[off], len -= off);
- if (decode_hex) {
- len = libblake_decode_hex(buf, len, buf, &ok);
- if (!ok) {
- fprintf(stderr, "%s: %s: %s\n", argv0, fname, "invalid hexadecimal input");
- free(buf);
- return -1;
- }
- }
- req = libblake_blake512_digest_get_required_input_size(len, 0, NULL);
- if (req > size)
- buf = erealloc(buf, size);
- libblake_blake512_digest(&state, buf, len, 0, NULL, hash);
- free(buf);
- return 0;
+ return hash_fd_blake(fd, fname, decode_hex, hash, &state,
+ (void (*)(void *))&libblake_blake512_init,
+ (size_t (*)(void *, const void *, size_t))&libblake_blake512_update,
+ &libblake_blake512_digest_get_required_input_size,
+ (void (*)(void *, void *, size_t, size_t, const char *, unsigned char[]))&libblake_blake512_digest);
}
int