aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common.h4
-rw-r--r--libhashsum.h48
-rw-r--r--libhashsum_init_blake224_hasher.319
-rw-r--r--libhashsum_init_blake224_hasher.c13
-rw-r--r--libhashsum_init_blake256_hasher.319
-rw-r--r--libhashsum_init_blake256_hasher.c13
-rw-r--r--libhashsum_init_blake384_hasher.319
-rw-r--r--libhashsum_init_blake384_hasher.c13
-rw-r--r--libhashsum_init_blake512_hasher.319
-rw-r--r--libhashsum_init_blake512_hasher.c13
-rw-r--r--libhashsum_init_blake_hasher.319
-rw-r--r--libhashsum_init_blakeb_hasher.319
-rw-r--r--libhashsum_init_blakes_hasher.319
-rw-r--r--libhashsum_init_hasher.378
-rw-r--r--libhashsum_init_hasher_from_string.378
-rw-r--r--libhashsum_init_keccak_224_hasher.361
-rw-r--r--libhashsum_init_keccak_256_hasher.361
-rw-r--r--libhashsum_init_keccak_384_hasher.361
-rw-r--r--libhashsum_init_keccak_512_hasher.361
-rw-r--r--libhashsum_init_keccak__.c49
-rw-r--r--libhashsum_init_keccak_hasher.361
-rw-r--r--libhashsum_init_md2_hasher.37
-rw-r--r--libhashsum_init_md2_hasher.c1
-rw-r--r--libhashsum_init_md4_hasher.319
-rw-r--r--libhashsum_init_md4_hasher.c13
-rw-r--r--libhashsum_init_md5_hasher.319
-rw-r--r--libhashsum_init_md5_hasher.c13
-rw-r--r--libhashsum_init_rawshake128_hasher.361
-rw-r--r--libhashsum_init_rawshake256_hasher.361
-rw-r--r--libhashsum_init_rawshake512_hasher.361
-rw-r--r--libhashsum_init_rawshake_hasher.361
-rw-r--r--libhashsum_init_ripemd_128_hasher.319
-rw-r--r--libhashsum_init_ripemd_128_hasher.c13
-rw-r--r--libhashsum_init_ripemd_160_hasher.319
-rw-r--r--libhashsum_init_ripemd_160_hasher.c13
-rw-r--r--libhashsum_init_ripemd_256_hasher.319
-rw-r--r--libhashsum_init_ripemd_256_hasher.c13
-rw-r--r--libhashsum_init_ripemd_320_hasher.319
-rw-r--r--libhashsum_init_ripemd_320_hasher.c13
-rw-r--r--libhashsum_init_sha0_hasher.319
-rw-r--r--libhashsum_init_sha0_hasher.c7
-rw-r--r--libhashsum_init_sha1_hasher.319
-rw-r--r--libhashsum_init_sha1_hasher.c7
-rw-r--r--libhashsum_init_sha2_hasher.319
-rw-r--r--libhashsum_init_sha2_hasher.c7
-rw-r--r--libhashsum_init_sha3_224_hasher.361
-rw-r--r--libhashsum_init_sha3_256_hasher.361
-rw-r--r--libhashsum_init_sha3_384_hasher.361
-rw-r--r--libhashsum_init_sha3_512_hasher.361
-rw-r--r--libhashsum_init_sha3_hasher.361
-rw-r--r--libhashsum_init_sha_224_hasher.319
-rw-r--r--libhashsum_init_sha_256_hasher.319
-rw-r--r--libhashsum_init_sha_384_hasher.319
-rw-r--r--libhashsum_init_sha_512_224_hasher.319
-rw-r--r--libhashsum_init_sha_512_256_hasher.319
-rw-r--r--libhashsum_init_sha_512_hasher.319
-rw-r--r--libhashsum_init_shake128_hasher.361
-rw-r--r--libhashsum_init_shake256_hasher.361
-rw-r--r--libhashsum_init_shake512_hasher.361
-rw-r--r--libhashsum_init_shake_hasher.361
-rw-r--r--misc-tests.c3
61 files changed, 1740 insertions, 195 deletions
diff --git a/common.h b/common.h
index bd273be..e55ca46 100644
--- a/common.h
+++ b/common.h
@@ -151,6 +151,10 @@ run_tests(const char *name, enum libhashsum_algorithm algorithm, size_t hash_siz
fprintf(stderr, "libhashsum_init_hasher returned NULL pointer in .finalise\n");
return 2;
}
+ if (hasher.stretch) {
+ fprintf(stderr, "libhashsum_init_hasher returned non-NULL pointer in .stretch\n");
+ return 2;
+ }
input_string_len = strlen(testcases[i].input);
bits = testcases[i].extra_bits;
if (bits) {
diff --git a/libhashsum.h b/libhashsum.h
index b10f2f4..22f7488 100644
--- a/libhashsum.h
+++ b/libhashsum.h
@@ -375,7 +375,7 @@ struct libhashsum_hasher {
size_t (*process)(struct libhashsum_hasher *this, const void *data, size_t bytes);
/**
- * Update the hash state given it's final
+ * Update the hash state given its final
* input data
*
* Regardless of the algorithm's standard, the function
@@ -385,6 +385,9 @@ struct libhashsum_hasher {
* bit and the most significant bit will be used as the
* last bit
*
+ * `this->hash_output` will be set to point to a buffer
+ * in `this->state` containing the hash
+ *
* @param this The object containing this function pointer
* @param data The new input data
* @param bytes The number of bytes available in `data` for reading
@@ -410,6 +413,13 @@ struct libhashsum_hasher {
* bit and the most significant bit will be used as the
* last bit
*
+ * `this->hash_output` will be set to point to a buffer
+ * in `this->state` containing the hash. However if
+ * `this->hash_output` is already non-`NULL`, the function
+ * _may_ choose to immediately output to the buffer that
+ * `this->hash_output` pointers to (the application must
+ * make sure it is sufficiently large).
+ *
* @param this The object containing this function pointer
* @param data The new input data, the function may rewrite its content
* @param bytes The number of bytes available in `data` for reading
@@ -427,6 +437,42 @@ struct libhashsum_hasher {
int (*finalise)(struct libhashsum_hasher *this, void *data, size_t bytes, unsigned extra_bits, size_t size);
/**
+ * Extend the hash with an additional `this->hash_size` bytes
+ *
+ * This pointer will be set to `NULL` when the object initialised,
+ * but once `*.finalise` or `*.finalise_const` is called, it
+ * will be set a point to a function _if_ the algorithm supports
+ * extending the hash indefinitely (if there is a limit, this
+ * pointer will be set to `NULL` once the limit has been reached)
+ *
+ * If the hash function supports generating hashes before the
+ * entire file has been processed, this pointer be non-`NULL`
+ * immediately when the object is initialised, however the
+ * hash function does not support extending the hash, calling
+ * this function, `*.finalise`, or `*.finalise_const` will
+ * reset this pointer to `NULL`. (No currently supported hash
+ * function supports this behaviour.)
+ *
+ * `this->hash_output` will be set to point to a buffer
+ * in `this->state` containing the hash extent. Note that
+ * this overrides any hash previously generated for `this`.
+ *
+ * @param this The object containing this function pointer
+ * @param skip Non-zero if the function need not set
+ * `this->hash_output` and output the hash extent
+ * (note that the function may ignore this argument)
+ * @param buffer If non-`NULL`, the function _may_ choose output the
+ * hash extent to the provided buffer (the application
+ * must ensure it is sufficently large). If the function
+ * does output to the provided buffer, it will reset
+ * `this->hash_output` to `NULL`.
+ *
+ * @since 1.0
+ */
+ LIBHASHSUM_1_NONNULL_
+ void (*stretch)(struct libhashsum_hasher *this, int skip, void *buffer);
+
+ /**
* Unless this pointer its `NULL`, it points to
* function that shall be once the object (`this`)
* is not needed anymore
diff --git a/libhashsum_init_blake224_hasher.3 b/libhashsum_init_blake224_hasher.3
index 1dd1655..e25f92b 100644
--- a/libhashsum_init_blake224_hasher.3
+++ b/libhashsum_init_blake224_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_blake224_hasher - initialise state for BLAKE224 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -108,7 +109,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -134,8 +135,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -167,6 +176,10 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL .
+.PP
.I hasher->destroy
will be set to
.IR NULL .
diff --git a/libhashsum_init_blake224_hasher.c b/libhashsum_init_blake224_hasher.c
index 642af8d..f4b0726 100644
--- a/libhashsum_init_blake224_hasher.c
+++ b/libhashsum_init_blake224_hasher.c
@@ -27,13 +27,15 @@ finalise_const(struct libhashsum_hasher *this, const void *data, size_t bytes, u
m = &m[r];
bytes -= r;
+ if (!this->hash_output)
+ this->hash_output = this->state.blake224.buf;
+
memcpy(this->state.blake224.buf, m, bytes + (size_t)(extra_bits > 0U));
if (extra_bits)
this->state.blake224.buf[bytes] = libhashsum_reverse_byte__(this->state.blake224.buf[bytes]);
libblake_blake224_digest(&this->state.blake224.s, this->state.blake224.buf, bytes,
- extra_bits, NULL, this->state.blake224.buf);
+ extra_bits, NULL, this->hash_output);
memset(&this->state.blake224.s, 0, sizeof(this->state.blake224.s));
- this->hash_output = this->state.blake224.buf;
return 0;
}
@@ -55,15 +57,17 @@ finalise(struct libhashsum_hasher *this, void *data, size_t bytes, unsigned extr
bytes -= r;
size -= r;
+ if (!this->hash_output)
+ this->hash_output = this->state.blake224.buf;
+
if (size < libblake_blake224_digest_get_required_input_size(bytes, extra_bits, NULL)) {
memcpy(this->state.blake224.buf, m, bytes + (size_t)(extra_bits > 0U));
m = this->state.blake224.buf;
}
if (extra_bits)
m[bytes] = libhashsum_reverse_byte__(m[bytes]);
- libblake_blake224_digest(&this->state.blake224.s, m, bytes, extra_bits, NULL, this->state.blake224.buf);
+ libblake_blake224_digest(&this->state.blake224.s, m, bytes, extra_bits, NULL, this->hash_output);
memset(&this->state.blake224.s, 0, sizeof(this->state.blake224.s));
- this->hash_output = this->state.blake224.buf;
return 0;
}
@@ -104,6 +108,7 @@ libhashsum_init_blake224_hasher(struct libhashsum_hasher *this, const void *salt
this->process = &process;
this->finalise_const = &finalise_const;
this->finalise = &finalise;
+ this->stretch = NULL;
this->destroy = NULL;
libblake_blake224_init2(&this->state.blake224.s, salt);
return 0;
diff --git a/libhashsum_init_blake256_hasher.3 b/libhashsum_init_blake256_hasher.3
index c427f51..9baf5e3 100644
--- a/libhashsum_init_blake256_hasher.3
+++ b/libhashsum_init_blake256_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_blake256_hasher - initialise state for BLAKE256 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -108,7 +109,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -134,8 +135,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -167,6 +176,10 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL .
+.PP
.I hasher->destroy
will be set to
.IR NULL .
diff --git a/libhashsum_init_blake256_hasher.c b/libhashsum_init_blake256_hasher.c
index 39a8eb9..3d00290 100644
--- a/libhashsum_init_blake256_hasher.c
+++ b/libhashsum_init_blake256_hasher.c
@@ -27,13 +27,15 @@ finalise_const(struct libhashsum_hasher *this, const void *data, size_t bytes, u
m = &m[r];
bytes -= r;
+ if (!this->hash_output)
+ this->hash_output = this->state.blake256.buf;
+
memcpy(this->state.blake256.buf, m, bytes + (size_t)(extra_bits > 0U));
if (extra_bits)
this->state.blake256.buf[bytes] = libhashsum_reverse_byte__(this->state.blake256.buf[bytes]);
libblake_blake256_digest(&this->state.blake256.s, this->state.blake256.buf, bytes,
- extra_bits, NULL, this->state.blake256.buf);
+ extra_bits, NULL, this->hash_output);
memset(&this->state.blake256.s, 0, sizeof(this->state.blake256.s));
- this->hash_output = this->state.blake256.buf;
return 0;
}
@@ -55,15 +57,17 @@ finalise(struct libhashsum_hasher *this, void *data, size_t bytes, unsigned extr
bytes -= r;
size -= r;
+ if (!this->hash_output)
+ this->hash_output = this->state.blake256.buf;
+
if (size < libblake_blake256_digest_get_required_input_size(bytes, extra_bits, NULL)) {
memcpy(this->state.blake256.buf, m, bytes + (size_t)(extra_bits > 0U));
m = this->state.blake256.buf;
}
if (extra_bits)
m[bytes] = libhashsum_reverse_byte__(m[bytes]);
- libblake_blake256_digest(&this->state.blake256.s, m, bytes, extra_bits, NULL, this->state.blake256.buf);
+ libblake_blake256_digest(&this->state.blake256.s, m, bytes, extra_bits, NULL, this->hash_output);
memset(&this->state.blake256.s, 0, sizeof(this->state.blake256.s));
- this->hash_output = this->state.blake256.buf;
return 0;
}
@@ -104,6 +108,7 @@ libhashsum_init_blake256_hasher(struct libhashsum_hasher *this, const void *salt
this->process = &process;
this->finalise_const = &finalise_const;
this->finalise = &finalise;
+ this->stretch = NULL;
this->destroy = NULL;
libblake_blake256_init2(&this->state.blake256.s, salt);
return 0;
diff --git a/libhashsum_init_blake384_hasher.3 b/libhashsum_init_blake384_hasher.3
index 29b31b5..6882cba 100644
--- a/libhashsum_init_blake384_hasher.3
+++ b/libhashsum_init_blake384_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_blake384_hasher - initialise state for BLAKE384 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -108,7 +109,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -134,8 +135,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -167,6 +176,10 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL .
+.PP
.I hasher->destroy
will be set to
.IR NULL .
diff --git a/libhashsum_init_blake384_hasher.c b/libhashsum_init_blake384_hasher.c
index 5346689..a64d5ee 100644
--- a/libhashsum_init_blake384_hasher.c
+++ b/libhashsum_init_blake384_hasher.c
@@ -27,13 +27,15 @@ finalise_const(struct libhashsum_hasher *this, const void *data, size_t bytes, u
m = &m[r];
bytes -= r;
+ if (!this->hash_output)
+ this->hash_output = this->state.blake384.buf;
+
memcpy(this->state.blake384.buf, m, bytes + (size_t)(extra_bits > 0U));
if (extra_bits)
this->state.blake384.buf[bytes] = libhashsum_reverse_byte__(this->state.blake384.buf[bytes]);
libblake_blake384_digest(&this->state.blake384.s, this->state.blake384.buf, bytes,
- extra_bits, NULL, this->state.blake384.buf);
+ extra_bits, NULL, this->hash_output);
memset(&this->state.blake384.s, 0, sizeof(this->state.blake384.s));
- this->hash_output = this->state.blake384.buf;
return 0;
}
@@ -55,15 +57,17 @@ finalise(struct libhashsum_hasher *this, void *data, size_t bytes, unsigned extr
bytes -= r;
size -= r;
+ if (!this->hash_output)
+ this->hash_output = this->state.blake384.buf;
+
if (size < libblake_blake384_digest_get_required_input_size(bytes, extra_bits, NULL)) {
memcpy(this->state.blake384.buf, m, bytes + (size_t)(extra_bits > 0U));
m = this->state.blake384.buf;
}
if (extra_bits)
m[bytes] = libhashsum_reverse_byte__(m[bytes]);
- libblake_blake384_digest(&this->state.blake384.s, m, bytes, extra_bits, NULL, this->state.blake384.buf);
+ libblake_blake384_digest(&this->state.blake384.s, m, bytes, extra_bits, NULL, this->hash_output);
memset(&this->state.blake384.s, 0, sizeof(this->state.blake384.s));
- this->hash_output = this->state.blake384.buf;
return 0;
}
@@ -104,6 +108,7 @@ libhashsum_init_blake384_hasher(struct libhashsum_hasher *this, const void *salt
this->process = &process;
this->finalise_const = &finalise_const;
this->finalise = &finalise;
+ this->stretch = NULL;
this->destroy = NULL;
libblake_blake384_init2(&this->state.blake384.s, salt);
return 0;
diff --git a/libhashsum_init_blake512_hasher.3 b/libhashsum_init_blake512_hasher.3
index a2d690d..efbebe0 100644
--- a/libhashsum_init_blake512_hasher.3
+++ b/libhashsum_init_blake512_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_blake512_hasher - initialise state for BLAKE512 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -108,7 +109,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -134,8 +135,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -167,6 +176,10 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL .
+.PP
.I hasher->destroy
will be set to
.IR NULL .
diff --git a/libhashsum_init_blake512_hasher.c b/libhashsum_init_blake512_hasher.c
index a42b429..6407a7b 100644
--- a/libhashsum_init_blake512_hasher.c
+++ b/libhashsum_init_blake512_hasher.c
@@ -27,13 +27,15 @@ finalise_const(struct libhashsum_hasher *this, const void *data, size_t bytes, u
m = &m[r];
bytes -= r;
+ if (!this->hash_output)
+ this->hash_output = this->state.blake512.buf;
+
memcpy(this->state.blake512.buf, m, bytes + (size_t)(extra_bits > 0U));
if (extra_bits)
this->state.blake512.buf[bytes] = libhashsum_reverse_byte__(this->state.blake512.buf[bytes]);
libblake_blake512_digest(&this->state.blake512.s, this->state.blake512.buf, bytes,
- extra_bits, NULL, this->state.blake512.buf);
+ extra_bits, NULL, this->hash_output);
memset(&this->state.blake512.s, 0, sizeof(this->state.blake512.s));
- this->hash_output = this->state.blake512.buf;
return 0;
}
@@ -55,15 +57,17 @@ finalise(struct libhashsum_hasher *this, void *data, size_t bytes, unsigned extr
bytes -= r;
size -= r;
+ if (!this->hash_output)
+ this->hash_output = this->state.blake512.buf;
+
if (size < libblake_blake512_digest_get_required_input_size(bytes, extra_bits, NULL)) {
memcpy(this->state.blake512.buf, m, bytes + (size_t)(extra_bits > 0U));
m = this->state.blake512.buf;
}
if (extra_bits)
m[bytes] = libhashsum_reverse_byte__(m[bytes]);
- libblake_blake512_digest(&this->state.blake512.s, m, bytes, extra_bits, NULL, this->state.blake512.buf);
+ libblake_blake512_digest(&this->state.blake512.s, m, bytes, extra_bits, NULL, this->hash_output);
memset(&this->state.blake512.s, 0, sizeof(this->state.blake512.s));
- this->hash_output = this->state.blake512.buf;
return 0;
}
@@ -104,6 +108,7 @@ libhashsum_init_blake512_hasher(struct libhashsum_hasher *this, const void *salt
this->process = &process;
this->finalise_const = &finalise_const;
this->finalise = &finalise;
+ this->stretch = NULL;
this->destroy = NULL;
libblake_blake512_init2(&this->state.blake512.s, salt);
return 0;
diff --git a/libhashsum_init_blake_hasher.3 b/libhashsum_init_blake_hasher.3
index f6f77bb..1535428 100644
--- a/libhashsum_init_blake_hasher.3
+++ b/libhashsum_init_blake_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_blake_hasher - initialise state for BLAKE hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -140,7 +141,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -166,8 +167,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -199,6 +208,10 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL .
+.PP
.I hasher->destroy
will be set to
.IR NULL .
diff --git a/libhashsum_init_blakeb_hasher.3 b/libhashsum_init_blakeb_hasher.3
index 3d1230e..2650f02 100644
--- a/libhashsum_init_blakeb_hasher.3
+++ b/libhashsum_init_blakeb_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_blakeb_hasher - initialise state for BLAKEb hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -117,7 +118,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -143,8 +144,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -176,6 +185,10 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL .
+.PP
.I hasher->destroy
will be set to
.IR NULL .
diff --git a/libhashsum_init_blakes_hasher.3 b/libhashsum_init_blakes_hasher.3
index 23ce54f..bf16b9b 100644
--- a/libhashsum_init_blakes_hasher.3
+++ b/libhashsum_init_blakes_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_blakes_hasher - initialise state for BLAKEs hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -117,7 +118,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -143,8 +144,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -176,6 +185,10 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL .
+.PP
.I hasher->destroy
will be set to
.IR NULL .
diff --git a/libhashsum_init_hasher.3 b/libhashsum_init_hasher.3
index df8c382..0f3f978 100644
--- a/libhashsum_init_hasher.3
+++ b/libhashsum_init_hasher.3
@@ -18,6 +18,7 @@ libhashsum_init_hasher - initialise state for hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -284,7 +285,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -310,8 +311,22 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large), provided that the library
+supports this behaviour for the selected hash
+function, otherwise it will behave as if
+.I hasher->hash_output
+was set to
+.IR NULL .
+The function will failure if:
.RS
.TP
.B EINVAL
@@ -350,6 +365,63 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL ,
+however upon successful completion of
+.I *hasher->finalise
+or
+.IR *hasher->finalise_const ,
+.I hasher->stretch
+will be set to point to a function that can be
+used to extend the hash by
+.I hasher->hash_size
+bytes, and can be called repeated, provided that the
+hash function supports extending the hash. If the
+hash extention support is limited,
+.I *hasher->stretch
+will reset
+.I hasher->stretch
+to
+.I NULL
+once the limit has been reached. If the hash
+function supports generating hashes at any time,
+.I hasher->stretch
+will be set to point to a function at immediately.
+The hash extent will be written to a buffer in
+.I hasher->state
+(which
+.I *hasher->finalize
+and
+.I *hasher->finalize_const
+also write the hash to), and
+.I hasher->hash_output
+will be set to point to this buffer.
+.IR *hasher->stretch 's
+parameter
+.I this
+shall be
+.IR hasher .
+Its parameter
+.I skip
+can be set to non-zero if the hash extent should
+be discarded
+.RI ( hasher->hash_output
+will not be set in this case).
+Its parameter
+.I buffer
+shall be
+.I NULL
+for the above described behaviour, or an sufficiently
+large buffer the function shall output the hash extent
+to. If
+.I buffer
+is
+.RI non- NULL ,
+.I hasher->hash_output
+will be set to
+.IR NULL ).
+.PP
.I hasher->destroy
will either be set to
.I NULL
diff --git a/libhashsum_init_hasher_from_string.3 b/libhashsum_init_hasher_from_string.3
index 00f7723..db88547 100644
--- a/libhashsum_init_hasher_from_string.3
+++ b/libhashsum_init_hasher_from_string.3
@@ -16,6 +16,7 @@ libhashsum_init_hasher_from_string - initialise state for hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -113,7 +114,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -139,8 +140,22 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large), provided that the library
+supports this behaviour for the selected hash
+function, otherwise it will behave as if
+.I hasher->hash_output
+was set to
+.IR NULL .
+The function will failure if:
.RS
.TP
.B EINVAL
@@ -179,6 +194,63 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL ,
+however upon successful completion of
+.I *hasher->finalise
+or
+.IR *hasher->finalise_const ,
+.I hasher->stretch
+will be set to point to a function that can be
+used to extend the hash by
+.I hasher->hash_size
+bytes, and can be called repeated, provided that the
+hash function supports extending the hash. If the
+hash extention support is limited,
+.I *hasher->stretch
+will reset
+.I hasher->stretch
+to
+.I NULL
+once the limit has been reached. If the hash
+function supports generating hashes at any time,
+.I hasher->stretch
+will be set to point to a function at immediately.
+The hash extent will be written to a buffer in
+.I hasher->state
+(which
+.I *hasher->finalize
+and
+.I *hasher->finalize_const
+also write the hash to), and
+.I hasher->hash_output
+will be set to point to this buffer.
+.IR *hasher->stretch 's
+parameter
+.I this
+shall be
+.IR hasher .
+Its parameter
+.I skip
+can be set to non-zero if the hash extent should
+be discarded
+.RI ( hasher->hash_output
+will not be set in this case).
+Its parameter
+.I buffer
+shall be
+.I NULL
+for the above described behaviour, or an sufficiently
+large buffer the function shall output the hash extent
+to. If
+.I buffer
+is
+.RI non- NULL ,
+.I hasher->hash_output
+will be set to
+.IR NULL ).
+.PP
.I hasher->destroy
will either be set to
.I NULL
diff --git a/libhashsum_init_keccak_224_hasher.3 b/libhashsum_init_keccak_224_hasher.3
index 9852f68..74c5db5 100644
--- a/libhashsum_init_keccak_224_hasher.3
+++ b/libhashsum_init_keccak_224_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_keccak_224_hasher - initialise state for Keccak-224 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -91,7 +92,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -117,8 +118,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -150,6 +159,52 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL ,
+however upon successful completion of
+.I *hasher->finalise
+or
+.IR *hasher->finalise_const ,
+.I hasher->stretch
+will be set to point to a function that can be
+used to extend the hash by
+.I hasher->hash_size
+bytes, and can be called repeated without limitation.
+The hash extent will be written to a buffer in
+.I hasher->state
+(which
+.I *hasher->finalize
+and
+.I *hasher->finalize_const
+also write the hash to), and
+.I hasher->hash_output
+will be set to point to this buffer.
+.IR *hasher->stretch 's
+parameter
+.I this
+shall be
+.IR hasher .
+Its parameter
+.I skip
+can be set to non-zero if the hash extent should
+be discarded
+.RI ( hasher->hash_output
+will not be set in this case).
+Its parameter
+.I buffer
+shall be
+.I NULL
+for the above described behaviour, or an sufficiently
+large buffer the function shall output the hash extent
+to. If
+.I buffer
+is
+.RI non- NULL ,
+.I hasher->hash_output
+will be set to
+.IR NULL ).
+.PP
.I hasher->destroy
will be set to a pointer to a function to to
call, with
diff --git a/libhashsum_init_keccak_256_hasher.3 b/libhashsum_init_keccak_256_hasher.3
index 6492401..f73ea91 100644
--- a/libhashsum_init_keccak_256_hasher.3
+++ b/libhashsum_init_keccak_256_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_keccak_256_hasher - initialise state for Keccak-256 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -91,7 +92,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -117,8 +118,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -150,6 +159,52 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL ,
+however upon successful completion of
+.I *hasher->finalise
+or
+.IR *hasher->finalise_const ,
+.I hasher->stretch
+will be set to point to a function that can be
+used to extend the hash by
+.I hasher->hash_size
+bytes, and can be called repeated without limitation.
+The hash extent will be written to a buffer in
+.I hasher->state
+(which
+.I *hasher->finalize
+and
+.I *hasher->finalize_const
+also write the hash to), and
+.I hasher->hash_output
+will be set to point to this buffer.
+.IR *hasher->stretch 's
+parameter
+.I this
+shall be
+.IR hasher .
+Its parameter
+.I skip
+can be set to non-zero if the hash extent should
+be discarded
+.RI ( hasher->hash_output
+will not be set in this case).
+Its parameter
+.I buffer
+shall be
+.I NULL
+for the above described behaviour, or an sufficiently
+large buffer the function shall output the hash extent
+to. If
+.I buffer
+is
+.RI non- NULL ,
+.I hasher->hash_output
+will be set to
+.IR NULL ).
+.PP
.I hasher->destroy
will be set to a pointer to a function to to
call, with
diff --git a/libhashsum_init_keccak_384_hasher.3 b/libhashsum_init_keccak_384_hasher.3
index 1527ad0..7528e4f 100644
--- a/libhashsum_init_keccak_384_hasher.3
+++ b/libhashsum_init_keccak_384_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_keccak_384_hasher - initialise state for Keccak-384 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -91,7 +92,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -117,8 +118,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -150,6 +159,52 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL ,
+however upon successful completion of
+.I *hasher->finalise
+or
+.IR *hasher->finalise_const ,
+.I hasher->stretch
+will be set to point to a function that can be
+used to extend the hash by
+.I hasher->hash_size
+bytes, and can be called repeated without limitation.
+The hash extent will be written to a buffer in
+.I hasher->state
+(which
+.I *hasher->finalize
+and
+.I *hasher->finalize_const
+also write the hash to), and
+.I hasher->hash_output
+will be set to point to this buffer.
+.IR *hasher->stretch 's
+parameter
+.I this
+shall be
+.IR hasher .
+Its parameter
+.I skip
+can be set to non-zero if the hash extent should
+be discarded
+.RI ( hasher->hash_output
+will not be set in this case).
+Its parameter
+.I buffer
+shall be
+.I NULL
+for the above described behaviour, or an sufficiently
+large buffer the function shall output the hash extent
+to. If
+.I buffer
+is
+.RI non- NULL ,
+.I hasher->hash_output
+will be set to
+.IR NULL ).
+.PP
.I hasher->destroy
will be set to a pointer to a function to to
call, with
diff --git a/libhashsum_init_keccak_512_hasher.3 b/libhashsum_init_keccak_512_hasher.3
index d59f0ba..06846ed 100644
--- a/libhashsum_init_keccak_512_hasher.3
+++ b/libhashsum_init_keccak_512_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_keccak_512_hasher - initialise state for Keccak-512 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -91,7 +92,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -117,8 +118,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -150,6 +159,52 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL ,
+however upon successful completion of
+.I *hasher->finalise
+or
+.IR *hasher->finalise_const ,
+.I hasher->stretch
+will be set to point to a function that can be
+used to extend the hash by
+.I hasher->hash_size
+bytes, and can be called repeated without limitation.
+The hash extent will be written to a buffer in
+.I hasher->state
+(which
+.I *hasher->finalize
+and
+.I *hasher->finalize_const
+also write the hash to), and
+.I hasher->hash_output
+will be set to point to this buffer.
+.IR *hasher->stretch 's
+parameter
+.I this
+shall be
+.IR hasher .
+Its parameter
+.I skip
+can be set to non-zero if the hash extent should
+be discarded
+.RI ( hasher->hash_output
+will not be set in this case).
+Its parameter
+.I buffer
+shall be
+.I NULL
+for the above described behaviour, or an sufficiently
+large buffer the function shall output the hash extent
+to. If
+.I buffer
+is
+.RI non- NULL ,
+.I hasher->hash_output
+will be set to
+.IR NULL ).
+.PP
.I hasher->destroy
will be set to a pointer to a function to to
call, with
diff --git a/libhashsum_init_keccak__.c b/libhashsum_init_keccak__.c
index 03dd466..ee146bc 100644
--- a/libhashsum_init_keccak__.c
+++ b/libhashsum_init_keccak__.c
@@ -4,6 +4,26 @@
LIBHASHSUM_1_NONNULL_
+static void
+stretch(struct libhashsum_hasher *this, int skip, void *buffer)
+{
+ if (skip) {
+ libkeccak_fast_squeeze(&this->state.keccak.s, 1);
+ return;
+ }
+
+ if (buffer)
+ this->hash_output = NULL;
+ else if (this->hash_size > sizeof(this->state.keccak.sum.buf))
+ this->hash_output = this->state.keccak.sum.dyn;
+ else
+ this->hash_output = this->state.keccak.sum.buf;
+
+ libkeccak_squeeze(&this->state.keccak.s, buffer ? buffer : this->hash_output);
+}
+
+
+LIBHASHSUM_1_NONNULL_
static size_t
process(struct libhashsum_hasher *this, const void *data, size_t bytes)
{
@@ -29,15 +49,15 @@ finalise_const(struct libhashsum_hasher *this, const void *data, size_t bytes, u
m = &m[r];
bytes -= r;
- if (this->hash_size > sizeof(this->state.keccak.sum.buf))
- this->hash_output = this->state.keccak.sum.dyn;
- else
- this->hash_output = this->state.keccak.sum.buf;
+ if (!this->hash_output) {
+ if (this->hash_size > sizeof(this->state.keccak.sum.buf))
+ this->hash_output = this->state.keccak.sum.dyn;
+ else
+ this->hash_output = this->state.keccak.sum.buf;
+ }
libkeccak_digest(&this->state.keccak.s, m, bytes, extra_bits, this->state.keccak.suffix, this->hash_output);
libkeccak_state_wipe_message(&this->state.keccak.s);
- libkeccak_state_fast_destroy(&this->state.keccak.s);
- memset(&this->state.keccak.s, 0, sizeof(this->state.keccak.s));
- this->state.keccak.s.M = NULL;
+ this->stretch = &stretch;
return 0;
}
@@ -68,10 +88,12 @@ finalise(struct libhashsum_hasher *this, void *data, size_t bytes, unsigned extr
need += this->input_block_size;
}
- if (this->hash_size > sizeof(this->state.keccak.sum.buf))
- this->hash_output = this->state.keccak.sum.dyn;
- else
- this->hash_output = this->state.keccak.sum.buf;
+ if (!this->hash_output) {
+ if (this->hash_size > sizeof(this->state.keccak.sum.buf))
+ this->hash_output = this->state.keccak.sum.dyn;
+ else
+ this->hash_output = this->state.keccak.sum.buf;
+ }
if (size < need)
libkeccak_digest(&this->state.keccak.s, m, bytes, extra_bits, this->state.keccak.suffix,
this->state.keccak.squeezes > 1U ? NULL : this->hash_output);
@@ -90,9 +112,7 @@ finalise(struct libhashsum_hasher *this, void *data, size_t bytes, unsigned extr
libkeccak_squeeze(&this->state.keccak.s, this->hash_output);
libkeccak_state_wipe_message(&this->state.keccak.s);
- libkeccak_state_fast_destroy(&this->state.keccak.s);
- memset(&this->state.keccak.s, 0, sizeof(this->state.keccak.s));
- this->state.keccak.s.M = NULL;
+ this->stretch = &stretch;
return 0;
}
@@ -142,6 +162,7 @@ libhashsum_init_keccak__(struct libhashsum_hasher *this, size_t hashbits, void *
this->process = &process;
this->finalise_const = &finalise_const;
this->finalise = &finalise;
+ this->stretch = NULL;
this->destroy = &destroy;
return 0;
}
diff --git a/libhashsum_init_keccak_hasher.3 b/libhashsum_init_keccak_hasher.3
index 3b2def5..1712da7 100644
--- a/libhashsum_init_keccak_hasher.3
+++ b/libhashsum_init_keccak_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_keccak_hasher - initialise state for Keccak hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -171,7 +172,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -197,8 +198,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -230,6 +239,52 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL ,
+however upon successful completion of
+.I *hasher->finalise
+or
+.IR *hasher->finalise_const ,
+.I hasher->stretch
+will be set to point to a function that can be
+used to extend the hash by
+.I hasher->hash_size
+bytes, and can be called repeated without limitation.
+The hash extent will be written to a buffer in
+.I hasher->state
+(which
+.I *hasher->finalize
+and
+.I *hasher->finalize_const
+also write the hash to), and
+.I hasher->hash_output
+will be set to point to this buffer.
+.IR *hasher->stretch 's
+parameter
+.I this
+shall be
+.IR hasher .
+Its parameter
+.I skip
+can be set to non-zero if the hash extent should
+be discarded
+.RI ( hasher->hash_output
+will not be set in this case).
+Its parameter
+.I buffer
+shall be
+.I NULL
+for the above described behaviour, or an sufficiently
+large buffer the function shall output the hash extent
+to. If
+.I buffer
+is
+.RI non- NULL ,
+.I hasher->hash_output
+will be set to
+.IR NULL ).
+.PP
.I hasher->destroy
will be set to a pointer to a function to to
call, with
diff --git a/libhashsum_init_md2_hasher.3 b/libhashsum_init_md2_hasher.3
index 5ec44b4..5d99295 100644
--- a/libhashsum_init_md2_hasher.3
+++ b/libhashsum_init_md2_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_md2_hasher - initialise state for MD2 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -88,7 +89,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -149,6 +150,10 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL .
+.PP
.I hasher->destroy
will be set to
.IR NULL .
diff --git a/libhashsum_init_md2_hasher.c b/libhashsum_init_md2_hasher.c
index cf0a495..b28a6ae 100644
--- a/libhashsum_init_md2_hasher.c
+++ b/libhashsum_init_md2_hasher.c
@@ -142,6 +142,7 @@ libhashsum_init_md2_hasher(struct libhashsum_hasher *this)
this->process = &process;
this->finalise_const = &finalise_const;
this->finalise = &finalise;
+ this->stretch = NULL;
this->destroy = NULL;
memset(&this->state.md2, 0, sizeof(this->state.md2));
return 0;
diff --git a/libhashsum_init_md4_hasher.3 b/libhashsum_init_md4_hasher.3
index fba261d..adbb8a3 100644
--- a/libhashsum_init_md4_hasher.3
+++ b/libhashsum_init_md4_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_md4_hasher - initialise state for MD4 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -88,7 +89,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -114,8 +115,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -147,6 +156,10 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL .
+.PP
.I hasher->destroy
will be set to
.IR NULL .
diff --git a/libhashsum_init_md4_hasher.c b/libhashsum_init_md4_hasher.c
index bc361d8..abcc115 100644
--- a/libhashsum_init_md4_hasher.c
+++ b/libhashsum_init_md4_hasher.c
@@ -122,15 +122,17 @@ finalise_common(struct libhashsum_hasher *this, uint8_t *m, size_t bytes, unsign
memset(&this->state.md4.m, 0, sizeof(this->state.md4.m));
this->state.md4.count = 0;
+ if (!this->hash_output)
+ this->hash_output = this->state.md4.h.sum;
+
for (i = 0; i < 4U; i++) {
hi = this->state.md4.h.h32[i];
- this->state.md4.h.sum[i * 4U + 0U] = (uint8_t)(hi >> 0);
- this->state.md4.h.sum[i * 4U + 1U] = (uint8_t)(hi >> 8);
- this->state.md4.h.sum[i * 4U + 2U] = (uint8_t)(hi >> 16);
- this->state.md4.h.sum[i * 4U + 3U] = (uint8_t)(hi >> 24);
+ this->hash_output[i * 4U + 0U] = (uint8_t)(hi >> 0);
+ this->hash_output[i * 4U + 1U] = (uint8_t)(hi >> 8);
+ this->hash_output[i * 4U + 2U] = (uint8_t)(hi >> 16);
+ this->hash_output[i * 4U + 3U] = (uint8_t)(hi >> 24);
}
- this->hash_output = this->state.md4.h.sum;
return 0;
}
@@ -185,6 +187,7 @@ libhashsum_init_md4_hasher(struct libhashsum_hasher *this)
this->process = &process;
this->finalise_const = &finalise_const;
this->finalise = &finalise;
+ this->stretch = NULL;
this->destroy = NULL;
memset(&this->state.md4, 0, sizeof(this->state.md4));
this->state.md4.h.h32[0] = UINT32_C(0x67452301);
diff --git a/libhashsum_init_md5_hasher.3 b/libhashsum_init_md5_hasher.3
index be887fc..95abd7b 100644
--- a/libhashsum_init_md5_hasher.3
+++ b/libhashsum_init_md5_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_md5_hasher - initialise state for MD5 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -88,7 +89,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -114,8 +115,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -147,6 +156,10 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL .
+.PP
.I hasher->destroy
will be set to
.IR NULL .
diff --git a/libhashsum_init_md5_hasher.c b/libhashsum_init_md5_hasher.c
index 8147204..7eec6ed 100644
--- a/libhashsum_init_md5_hasher.c
+++ b/libhashsum_init_md5_hasher.c
@@ -138,15 +138,17 @@ finalise_common(struct libhashsum_hasher *this, uint8_t *m, size_t bytes, unsign
memset(this->state.md5.w, 0, sizeof(this->state.md5.w));
this->state.md5.count = 0;
+ if (!this->hash_output)
+ this->hash_output = this->state.md5.h.sum;
+
for (i = 0; i < 4U; i++) {
hi = this->state.md5.h.h32[i];
- this->state.md5.h.sum[i * 4U + 0U] = (uint8_t)(hi >> 0);
- this->state.md5.h.sum[i * 4U + 1U] = (uint8_t)(hi >> 8);
- this->state.md5.h.sum[i * 4U + 2U] = (uint8_t)(hi >> 16);
- this->state.md5.h.sum[i * 4U + 3U] = (uint8_t)(hi >> 24);
+ this->hash_output[i * 4U + 0U] = (uint8_t)(hi >> 0);
+ this->hash_output[i * 4U + 1U] = (uint8_t)(hi >> 8);
+ this->hash_output[i * 4U + 2U] = (uint8_t)(hi >> 16);
+ this->hash_output[i * 4U + 3U] = (uint8_t)(hi >> 24);
}
- this->hash_output = this->state.md5.h.sum;
return 0;
}
@@ -200,6 +202,7 @@ libhashsum_init_md5_hasher(struct libhashsum_hasher *this)
this->process = &process;
this->finalise_const = &finalise_const;
this->finalise = &finalise;
+ this->stretch = NULL;
this->destroy = NULL;
memset(&this->state.md5, 0, sizeof(this->state.md5));
this->state.md5.h.h32[0] = UINT32_C(0x67452301);
diff --git a/libhashsum_init_rawshake128_hasher.3 b/libhashsum_init_rawshake128_hasher.3
index fdc0f1d..178a03b 100644
--- a/libhashsum_init_rawshake128_hasher.3
+++ b/libhashsum_init_rawshake128_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_rawshake128_hasher - initialise state for RawSHAKE128 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -106,7 +107,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -132,8 +133,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -165,6 +174,52 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL ,
+however upon successful completion of
+.I *hasher->finalise
+or
+.IR *hasher->finalise_const ,
+.I hasher->stretch
+will be set to point to a function that can be
+used to extend the hash by
+.I hasher->hash_size
+bytes, and can be called repeated without limitation.
+The hash extent will be written to a buffer in
+.I hasher->state
+(which
+.I *hasher->finalize
+and
+.I *hasher->finalize_const
+also write the hash to), and
+.I hasher->hash_output
+will be set to point to this buffer.
+.IR *hasher->stretch 's
+parameter
+.I this
+shall be
+.IR hasher .
+Its parameter
+.I skip
+can be set to non-zero if the hash extent should
+be discarded
+.RI ( hasher->hash_output
+will not be set in this case).
+Its parameter
+.I buffer
+shall be
+.I NULL
+for the above described behaviour, or an sufficiently
+large buffer the function shall output the hash extent
+to. If
+.I buffer
+is
+.RI non- NULL ,
+.I hasher->hash_output
+will be set to
+.IR NULL ).
+.PP
.I hasher->destroy
will be set to a pointer to a function to to
call, with
diff --git a/libhashsum_init_rawshake256_hasher.3 b/libhashsum_init_rawshake256_hasher.3
index e0b1e69..f24b6e1 100644
--- a/libhashsum_init_rawshake256_hasher.3
+++ b/libhashsum_init_rawshake256_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_rawshake256_hasher - initialise state for RawSHAKE256 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -106,7 +107,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -132,8 +133,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -165,6 +174,52 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL ,
+however upon successful completion of
+.I *hasher->finalise
+or
+.IR *hasher->finalise_const ,
+.I hasher->stretch
+will be set to point to a function that can be
+used to extend the hash by
+.I hasher->hash_size
+bytes, and can be called repeated without limitation.
+The hash extent will be written to a buffer in
+.I hasher->state
+(which
+.I *hasher->finalize
+and
+.I *hasher->finalize_const
+also write the hash to), and
+.I hasher->hash_output
+will be set to point to this buffer.
+.IR *hasher->stretch 's
+parameter
+.I this
+shall be
+.IR hasher .
+Its parameter
+.I skip
+can be set to non-zero if the hash extent should
+be discarded
+.RI ( hasher->hash_output
+will not be set in this case).
+Its parameter
+.I buffer
+shall be
+.I NULL
+for the above described behaviour, or an sufficiently
+large buffer the function shall output the hash extent
+to. If
+.I buffer
+is
+.RI non- NULL ,
+.I hasher->hash_output
+will be set to
+.IR NULL ).
+.PP
.I hasher->destroy
will be set to a pointer to a function to to
call, with
diff --git a/libhashsum_init_rawshake512_hasher.3 b/libhashsum_init_rawshake512_hasher.3
index 3ee9aa6..04da5c4 100644
--- a/libhashsum_init_rawshake512_hasher.3
+++ b/libhashsum_init_rawshake512_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_rawshake512_hasher - initialise state for RawSHAKE512 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -106,7 +107,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -132,8 +133,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -165,6 +174,52 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL ,
+however upon successful completion of
+.I *hasher->finalise
+or
+.IR *hasher->finalise_const ,
+.I hasher->stretch
+will be set to point to a function that can be
+used to extend the hash by
+.I hasher->hash_size
+bytes, and can be called repeated without limitation.
+The hash extent will be written to a buffer in
+.I hasher->state
+(which
+.I *hasher->finalize
+and
+.I *hasher->finalize_const
+also write the hash to), and
+.I hasher->hash_output
+will be set to point to this buffer.
+.IR *hasher->stretch 's
+parameter
+.I this
+shall be
+.IR hasher .
+Its parameter
+.I skip
+can be set to non-zero if the hash extent should
+be discarded
+.RI ( hasher->hash_output
+will not be set in this case).
+Its parameter
+.I buffer
+shall be
+.I NULL
+for the above described behaviour, or an sufficiently
+large buffer the function shall output the hash extent
+to. If
+.I buffer
+is
+.RI non- NULL ,
+.I hasher->hash_output
+will be set to
+.IR NULL ).
+.PP
.I hasher->destroy
will be set to a pointer to a function to to
call, with
diff --git a/libhashsum_init_rawshake_hasher.3 b/libhashsum_init_rawshake_hasher.3
index cd2b9a0..6fa7416 100644
--- a/libhashsum_init_rawshake_hasher.3
+++ b/libhashsum_init_rawshake_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_rawshake_hasher - initialise state for RawSHAKE hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -120,7 +121,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -146,8 +147,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -179,6 +188,52 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL ,
+however upon successful completion of
+.I *hasher->finalise
+or
+.IR *hasher->finalise_const ,
+.I hasher->stretch
+will be set to point to a function that can be
+used to extend the hash by
+.I hasher->hash_size
+bytes, and can be called repeated without limitation.
+The hash extent will be written to a buffer in
+.I hasher->state
+(which
+.I *hasher->finalize
+and
+.I *hasher->finalize_const
+also write the hash to), and
+.I hasher->hash_output
+will be set to point to this buffer.
+.IR *hasher->stretch 's
+parameter
+.I this
+shall be
+.IR hasher .
+Its parameter
+.I skip
+can be set to non-zero if the hash extent should
+be discarded
+.RI ( hasher->hash_output
+will not be set in this case).
+Its parameter
+.I buffer
+shall be
+.I NULL
+for the above described behaviour, or an sufficiently
+large buffer the function shall output the hash extent
+to. If
+.I buffer
+is
+.RI non- NULL ,
+.I hasher->hash_output
+will be set to
+.IR NULL ).
+.PP
.I hasher->destroy
will be set to a pointer to a function to to
call, with
diff --git a/libhashsum_init_ripemd_128_hasher.3 b/libhashsum_init_ripemd_128_hasher.3
index 856fedf..4093084 100644
--- a/libhashsum_init_ripemd_128_hasher.3
+++ b/libhashsum_init_ripemd_128_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_ripemd_128_hasher - initialise state for RIPEMD-128 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -88,7 +89,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -114,8 +115,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -147,6 +156,10 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL .
+.PP
.I hasher->destroy
will be set to
.IR NULL .
diff --git a/libhashsum_init_ripemd_128_hasher.c b/libhashsum_init_ripemd_128_hasher.c
index d958adb..02ac338 100644
--- a/libhashsum_init_ripemd_128_hasher.c
+++ b/libhashsum_init_ripemd_128_hasher.c
@@ -158,15 +158,17 @@ finalise_common(struct libhashsum_hasher *this, uint8_t *m, size_t bytes, unsign
memset(&this->state.ripemd_128.m, 0, sizeof(this->state.ripemd_128.m));
this->state.ripemd_128.count = 0;
+ if (!this->hash_output)
+ this->hash_output = this->state.ripemd_128.h.sum;
+
for (i = 0; i < 4U; i++) {
hi = this->state.ripemd_128.h.h32[i];
- this->state.ripemd_128.h.sum[i * 4U + 0U] = (uint8_t)(hi >> 0);
- this->state.ripemd_128.h.sum[i * 4U + 1U] = (uint8_t)(hi >> 8);
- this->state.ripemd_128.h.sum[i * 4U + 2U] = (uint8_t)(hi >> 16);
- this->state.ripemd_128.h.sum[i * 4U + 3U] = (uint8_t)(hi >> 24);
+ this->hash_output[i * 4U + 0U] = (uint8_t)(hi >> 0);
+ this->hash_output[i * 4U + 1U] = (uint8_t)(hi >> 8);
+ this->hash_output[i * 4U + 2U] = (uint8_t)(hi >> 16);
+ this->hash_output[i * 4U + 3U] = (uint8_t)(hi >> 24);
}
- this->hash_output = this->state.ripemd_128.h.sum;
return 0;
}
@@ -221,6 +223,7 @@ libhashsum_init_ripemd_128_hasher(struct libhashsum_hasher *this)
this->process = &process;
this->finalise_const = &finalise_const;
this->finalise = &finalise;
+ this->stretch = NULL;
this->destroy = NULL;
memset(&this->state.ripemd_128, 0, sizeof(this->state.ripemd_128));
this->state.ripemd_128.h.h32[0] = UINT32_C(0x67452301);
diff --git a/libhashsum_init_ripemd_160_hasher.3 b/libhashsum_init_ripemd_160_hasher.3
index 94de83d..9a80caa 100644
--- a/libhashsum_init_ripemd_160_hasher.3
+++ b/libhashsum_init_ripemd_160_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_ripemd_160_hasher - initialise state for RIPEMD-160 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -88,7 +89,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -114,8 +115,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -147,6 +156,10 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL .
+.PP
.I hasher->destroy
will be set to
.IR NULL .
diff --git a/libhashsum_init_ripemd_160_hasher.c b/libhashsum_init_ripemd_160_hasher.c
index edb1c5f..2e510fa 100644
--- a/libhashsum_init_ripemd_160_hasher.c
+++ b/libhashsum_init_ripemd_160_hasher.c
@@ -161,15 +161,17 @@ finalise_common(struct libhashsum_hasher *this, uint8_t *m, size_t bytes, unsign
memset(this->state.ripemd_160.w2, 0, sizeof(this->state.ripemd_160.w2));
this->state.ripemd_160.count = 0;
+ if (!this->hash_output)
+ this->hash_output = this->state.ripemd_160.h.sum;
+
for (i = 0; i < 5U; i++) {
hi = this->state.ripemd_160.h.h32[i];
- this->state.ripemd_160.h.sum[i * 4U + 0U] = (uint8_t)(hi >> 0);
- this->state.ripemd_160.h.sum[i * 4U + 1U] = (uint8_t)(hi >> 8);
- this->state.ripemd_160.h.sum[i * 4U + 2U] = (uint8_t)(hi >> 16);
- this->state.ripemd_160.h.sum[i * 4U + 3U] = (uint8_t)(hi >> 24);
+ this->hash_output[i * 4U + 0U] = (uint8_t)(hi >> 0);
+ this->hash_output[i * 4U + 1U] = (uint8_t)(hi >> 8);
+ this->hash_output[i * 4U + 2U] = (uint8_t)(hi >> 16);
+ this->hash_output[i * 4U + 3U] = (uint8_t)(hi >> 24);
}
- this->hash_output = this->state.ripemd_160.h.sum;
return 0;
}
@@ -224,6 +226,7 @@ libhashsum_init_ripemd_160_hasher(struct libhashsum_hasher *this)
this->process = &process;
this->finalise_const = &finalise_const;
this->finalise = &finalise;
+ this->stretch = NULL;
this->destroy = NULL;
memset(&this->state.ripemd_160, 0, sizeof(this->state.ripemd_160));
this->state.ripemd_160.h.h32[0] = UINT32_C(0x67452301);
diff --git a/libhashsum_init_ripemd_256_hasher.3 b/libhashsum_init_ripemd_256_hasher.3
index 12638d8..1d83bce 100644
--- a/libhashsum_init_ripemd_256_hasher.3
+++ b/libhashsum_init_ripemd_256_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_ripemd_256_hasher - initialise state for RIPEMD-256 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -88,7 +89,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -114,8 +115,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -147,6 +156,10 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL .
+.PP
.I hasher->destroy
will be set to
.IR NULL .
diff --git a/libhashsum_init_ripemd_256_hasher.c b/libhashsum_init_ripemd_256_hasher.c
index ce3bf14..d9249b4 100644
--- a/libhashsum_init_ripemd_256_hasher.c
+++ b/libhashsum_init_ripemd_256_hasher.c
@@ -169,15 +169,17 @@ finalise_common(struct libhashsum_hasher *this, uint8_t *m, size_t bytes, unsign
memset(&this->state.ripemd_256.m, 0, sizeof(this->state.ripemd_256.m));
this->state.ripemd_256.count = 0;
+ if (!this->hash_output)
+ this->hash_output = this->state.ripemd_256.h.sum;
+
for (i = 0; i < 8U; i++) {
hi = this->state.ripemd_256.h.h32[i];
- this->state.ripemd_256.h.sum[i * 4U + 0U] = (uint8_t)(hi >> 0);
- this->state.ripemd_256.h.sum[i * 4U + 1U] = (uint8_t)(hi >> 8);
- this->state.ripemd_256.h.sum[i * 4U + 2U] = (uint8_t)(hi >> 16);
- this->state.ripemd_256.h.sum[i * 4U + 3U] = (uint8_t)(hi >> 24);
+ this->hash_output[i * 4U + 0U] = (uint8_t)(hi >> 0);
+ this->hash_output[i * 4U + 1U] = (uint8_t)(hi >> 8);
+ this->hash_output[i * 4U + 2U] = (uint8_t)(hi >> 16);
+ this->hash_output[i * 4U + 3U] = (uint8_t)(hi >> 24);
}
- this->hash_output = this->state.ripemd_256.h.sum;
return 0;
}
@@ -232,6 +234,7 @@ libhashsum_init_ripemd_256_hasher(struct libhashsum_hasher *this)
this->process = &process;
this->finalise_const = &finalise_const;
this->finalise = &finalise;
+ this->stretch = NULL;
this->destroy = NULL;
memset(&this->state.ripemd_256, 0, sizeof(this->state.ripemd_256));
this->state.ripemd_256.h.h32[0] = UINT32_C(0x67452301);
diff --git a/libhashsum_init_ripemd_320_hasher.3 b/libhashsum_init_ripemd_320_hasher.3
index bcaf00a..41b2c2a 100644
--- a/libhashsum_init_ripemd_320_hasher.3
+++ b/libhashsum_init_ripemd_320_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_ripemd_320_hasher - initialise state for RIPEMD-320 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -88,7 +89,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -114,8 +115,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -147,6 +156,10 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL .
+.PP
.I hasher->destroy
will be set to
.IR NULL .
diff --git a/libhashsum_init_ripemd_320_hasher.c b/libhashsum_init_ripemd_320_hasher.c
index d5af69a..80e4e23 100644
--- a/libhashsum_init_ripemd_320_hasher.c
+++ b/libhashsum_init_ripemd_320_hasher.c
@@ -175,15 +175,17 @@ finalise_common(struct libhashsum_hasher *this, uint8_t *m, size_t bytes, unsign
memset(this->state.ripemd_320.w2, 0, sizeof(this->state.ripemd_320.w2));
this->state.ripemd_320.count = 0;
+ if (!this->hash_output)
+ this->hash_output = this->state.ripemd_320.h.sum;
+
for (i = 0; i < 10U; i++) {
hi = this->state.ripemd_320.h.h32[i];
- this->state.ripemd_320.h.sum[i * 4U + 0U] = (uint8_t)(hi >> 0);
- this->state.ripemd_320.h.sum[i * 4U + 1U] = (uint8_t)(hi >> 8);
- this->state.ripemd_320.h.sum[i * 4U + 2U] = (uint8_t)(hi >> 16);
- this->state.ripemd_320.h.sum[i * 4U + 3U] = (uint8_t)(hi >> 24);
+ this->hash_output[i * 4U + 0U] = (uint8_t)(hi >> 0);
+ this->hash_output[i * 4U + 1U] = (uint8_t)(hi >> 8);
+ this->hash_output[i * 4U + 2U] = (uint8_t)(hi >> 16);
+ this->hash_output[i * 4U + 3U] = (uint8_t)(hi >> 24);
}
- this->hash_output = this->state.ripemd_320.h.sum;
return 0;
}
@@ -238,6 +240,7 @@ libhashsum_init_ripemd_320_hasher(struct libhashsum_hasher *this)
this->process = &process;
this->finalise_const = &finalise_const;
this->finalise = &finalise;
+ this->stretch = NULL;
this->destroy = NULL;
memset(&this->state.ripemd_320, 0, sizeof(this->state.ripemd_320));
this->state.ripemd_320.h.h32[0] = UINT32_C(0x67452301);
diff --git a/libhashsum_init_sha0_hasher.3 b/libhashsum_init_sha0_hasher.3
index 521f0cb..571c065 100644
--- a/libhashsum_init_sha0_hasher.3
+++ b/libhashsum_init_sha0_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_sha0_hasher - initialise state for SHA-0 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -89,7 +90,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -115,8 +116,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -148,6 +157,10 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL .
+.PP
.I hasher->destroy
will be set to
.IR NULL .
diff --git a/libhashsum_init_sha0_hasher.c b/libhashsum_init_sha0_hasher.c
index 7f420d8..b7d42a8 100644
--- a/libhashsum_init_sha0_hasher.c
+++ b/libhashsum_init_sha0_hasher.c
@@ -38,9 +38,11 @@ finalise_const(struct libhashsum_hasher *this, const void *data, size_t bytes, u
m = &m[r];
bytes -= r;
- libsha1_digest(&this->state.sha0.s, m, (bytes << 3) | (size_t)extra_bits, this->state.sha0.sum);
+ if (!this->hash_output)
+ this->hash_output = this->state.sha0.sum;
+
+ libsha1_digest(&this->state.sha0.s, m, (bytes << 3) | (size_t)extra_bits, this->hash_output);
memset(&this->state.sha0.s, 0, sizeof(this->state.sha0.s));
- this->hash_output = this->state.sha0.sum;
return 0;
}
@@ -66,6 +68,7 @@ libhashsum_init_sha0_hasher(struct libhashsum_hasher *this)
this->process = &process;
this->finalise_const = &finalise_const;
this->finalise = &finalise;
+ this->stretch = NULL;
this->destroy = NULL;
libsha1_init(&this->state.sha0.s, LIBSHA1_0);
return 0;
diff --git a/libhashsum_init_sha1_hasher.3 b/libhashsum_init_sha1_hasher.3
index 4669f81..fb4d18d 100644
--- a/libhashsum_init_sha1_hasher.3
+++ b/libhashsum_init_sha1_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_sha1_hasher - initialise state for SHA-1 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -89,7 +90,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -115,8 +116,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -148,6 +157,10 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL .
+.PP
.I hasher->destroy
will be set to
.IR NULL .
diff --git a/libhashsum_init_sha1_hasher.c b/libhashsum_init_sha1_hasher.c
index 91bcc15..13020e2 100644
--- a/libhashsum_init_sha1_hasher.c
+++ b/libhashsum_init_sha1_hasher.c
@@ -38,9 +38,11 @@ finalise_const(struct libhashsum_hasher *this, const void *data, size_t bytes, u
m = &m[r];
bytes -= r;
- libsha1_digest(&this->state.sha1.s, m, (bytes << 3) | (size_t)extra_bits, this->state.sha1.sum);
+ if (!this->hash_output)
+ this->hash_output = this->state.sha1.sum;
+
+ libsha1_digest(&this->state.sha1.s, m, (bytes << 3) | (size_t)extra_bits, this->hash_output);
memset(&this->state.sha1.s, 0, sizeof(this->state.sha1.s));
- this->hash_output = this->state.sha1.sum;
return 0;
}
@@ -66,6 +68,7 @@ libhashsum_init_sha1_hasher(struct libhashsum_hasher *this)
this->process = &process;
this->finalise_const = &finalise_const;
this->finalise = &finalise;
+ this->stretch = NULL;
this->destroy = NULL;
libsha1_init(&this->state.sha1.s, LIBSHA1_1);
return 0;
diff --git a/libhashsum_init_sha2_hasher.3 b/libhashsum_init_sha2_hasher.3
index 618dafc..c1d7d91 100644
--- a/libhashsum_init_sha2_hasher.3
+++ b/libhashsum_init_sha2_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_sha2_hasher - initialise state for SHA-2 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -127,7 +128,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -153,8 +154,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -186,6 +195,10 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL .
+.PP
.I hasher->destroy
will be set to
.IR NULL .
diff --git a/libhashsum_init_sha2_hasher.c b/libhashsum_init_sha2_hasher.c
index f06c59b..7e5aa38 100644
--- a/libhashsum_init_sha2_hasher.c
+++ b/libhashsum_init_sha2_hasher.c
@@ -38,9 +38,11 @@ finalise_const(struct libhashsum_hasher *this, const void *data, size_t bytes, u
m = &m[r];
bytes -= r;
- libsha2_digest(&this->state.sha2.s, data, (bytes << 3) | extra_bits, this->state.sha2.sum);
+ if (!this->hash_output)
+ this->hash_output = this->state.sha2.sum;
+
+ libsha2_digest(&this->state.sha2.s, data, (bytes << 3) | extra_bits, this->hash_output);
memset(&this->state.sha2.s, 0, sizeof(this->state.sha2.s));
- this->hash_output = this->state.sha2.sum;
return 0;
}
@@ -95,6 +97,7 @@ libhashsum_init_sha2_hasher(struct libhashsum_hasher *this, unsigned algobits, s
this->process = &process;
this->finalise_const = &finalise_const;
this->finalise = &finalise;
+ this->stretch = NULL;
this->destroy = NULL;
libsha2_init(&this->state.sha2.s, algo);
return 0;
diff --git a/libhashsum_init_sha3_224_hasher.3 b/libhashsum_init_sha3_224_hasher.3
index b6af8cd..ba5a6da 100644
--- a/libhashsum_init_sha3_224_hasher.3
+++ b/libhashsum_init_sha3_224_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_sha3_224_hasher - initialise state for SHA-3-224 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -90,7 +91,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -116,8 +117,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -149,6 +158,52 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL ,
+however upon successful completion of
+.I *hasher->finalise
+or
+.IR *hasher->finalise_const ,
+.I hasher->stretch
+will be set to point to a function that can be
+used to extend the hash by
+.I hasher->hash_size
+bytes, and can be called repeated without limitation.
+The hash extent will be written to a buffer in
+.I hasher->state
+(which
+.I *hasher->finalize
+and
+.I *hasher->finalize_const
+also write the hash to), and
+.I hasher->hash_output
+will be set to point to this buffer.
+.IR *hasher->stretch 's
+parameter
+.I this
+shall be
+.IR hasher .
+Its parameter
+.I skip
+can be set to non-zero if the hash extent should
+be discarded
+.RI ( hasher->hash_output
+will not be set in this case).
+Its parameter
+.I buffer
+shall be
+.I NULL
+for the above described behaviour, or an sufficiently
+large buffer the function shall output the hash extent
+to. If
+.I buffer
+is
+.RI non- NULL ,
+.I hasher->hash_output
+will be set to
+.IR NULL ).
+.PP
.I hasher->destroy
will be set to a pointer to a function to to
call, with
diff --git a/libhashsum_init_sha3_256_hasher.3 b/libhashsum_init_sha3_256_hasher.3
index f26de4d..8e862d2 100644
--- a/libhashsum_init_sha3_256_hasher.3
+++ b/libhashsum_init_sha3_256_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_sha3_256_hasher - initialise state for SHA-3-256 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -90,7 +91,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -116,8 +117,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -149,6 +158,52 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL ,
+however upon successful completion of
+.I *hasher->finalise
+or
+.IR *hasher->finalise_const ,
+.I hasher->stretch
+will be set to point to a function that can be
+used to extend the hash by
+.I hasher->hash_size
+bytes, and can be called repeated without limitation.
+The hash extent will be written to a buffer in
+.I hasher->state
+(which
+.I *hasher->finalize
+and
+.I *hasher->finalize_const
+also write the hash to), and
+.I hasher->hash_output
+will be set to point to this buffer.
+.IR *hasher->stretch 's
+parameter
+.I this
+shall be
+.IR hasher .
+Its parameter
+.I skip
+can be set to non-zero if the hash extent should
+be discarded
+.RI ( hasher->hash_output
+will not be set in this case).
+Its parameter
+.I buffer
+shall be
+.I NULL
+for the above described behaviour, or an sufficiently
+large buffer the function shall output the hash extent
+to. If
+.I buffer
+is
+.RI non- NULL ,
+.I hasher->hash_output
+will be set to
+.IR NULL ).
+.PP
.I hasher->destroy
will be set to a pointer to a function to to
call, with
diff --git a/libhashsum_init_sha3_384_hasher.3 b/libhashsum_init_sha3_384_hasher.3
index ba82490..8bdcdf2 100644
--- a/libhashsum_init_sha3_384_hasher.3
+++ b/libhashsum_init_sha3_384_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_sha3_384_hasher - initialise state for SHA-3-384 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -90,7 +91,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -116,8 +117,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -149,6 +158,52 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL ,
+however upon successful completion of
+.I *hasher->finalise
+or
+.IR *hasher->finalise_const ,
+.I hasher->stretch
+will be set to point to a function that can be
+used to extend the hash by
+.I hasher->hash_size
+bytes, and can be called repeated without limitation.
+The hash extent will be written to a buffer in
+.I hasher->state
+(which
+.I *hasher->finalize
+and
+.I *hasher->finalize_const
+also write the hash to), and
+.I hasher->hash_output
+will be set to point to this buffer.
+.IR *hasher->stretch 's
+parameter
+.I this
+shall be
+.IR hasher .
+Its parameter
+.I skip
+can be set to non-zero if the hash extent should
+be discarded
+.RI ( hasher->hash_output
+will not be set in this case).
+Its parameter
+.I buffer
+shall be
+.I NULL
+for the above described behaviour, or an sufficiently
+large buffer the function shall output the hash extent
+to. If
+.I buffer
+is
+.RI non- NULL ,
+.I hasher->hash_output
+will be set to
+.IR NULL ).
+.PP
.I hasher->destroy
will be set to a pointer to a function to to
call, with
diff --git a/libhashsum_init_sha3_512_hasher.3 b/libhashsum_init_sha3_512_hasher.3
index 5155ae1..9106b64 100644
--- a/libhashsum_init_sha3_512_hasher.3
+++ b/libhashsum_init_sha3_512_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_sha3_512_hasher - initialise state for SHA-3-512 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -90,7 +91,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -116,8 +117,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -149,6 +158,52 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL ,
+however upon successful completion of
+.I *hasher->finalise
+or
+.IR *hasher->finalise_const ,
+.I hasher->stretch
+will be set to point to a function that can be
+used to extend the hash by
+.I hasher->hash_size
+bytes, and can be called repeated without limitation.
+The hash extent will be written to a buffer in
+.I hasher->state
+(which
+.I *hasher->finalize
+and
+.I *hasher->finalize_const
+also write the hash to), and
+.I hasher->hash_output
+will be set to point to this buffer.
+.IR *hasher->stretch 's
+parameter
+.I this
+shall be
+.IR hasher .
+Its parameter
+.I skip
+can be set to non-zero if the hash extent should
+be discarded
+.RI ( hasher->hash_output
+will not be set in this case).
+Its parameter
+.I buffer
+shall be
+.I NULL
+for the above described behaviour, or an sufficiently
+large buffer the function shall output the hash extent
+to. If
+.I buffer
+is
+.RI non- NULL ,
+.I hasher->hash_output
+will be set to
+.IR NULL ).
+.PP
.I hasher->destroy
will be set to a pointer to a function to to
call, with
diff --git a/libhashsum_init_sha3_hasher.3 b/libhashsum_init_sha3_hasher.3
index 3aa3612..89ab925 100644
--- a/libhashsum_init_sha3_hasher.3
+++ b/libhashsum_init_sha3_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_sha3_hasher - initialise state for SHA-3 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -94,7 +95,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -120,8 +121,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -153,6 +162,52 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL ,
+however upon successful completion of
+.I *hasher->finalise
+or
+.IR *hasher->finalise_const ,
+.I hasher->stretch
+will be set to point to a function that can be
+used to extend the hash by
+.I hasher->hash_size
+bytes, and can be called repeated without limitation.
+The hash extent will be written to a buffer in
+.I hasher->state
+(which
+.I *hasher->finalize
+and
+.I *hasher->finalize_const
+also write the hash to), and
+.I hasher->hash_output
+will be set to point to this buffer.
+.IR *hasher->stretch 's
+parameter
+.I this
+shall be
+.IR hasher .
+Its parameter
+.I skip
+can be set to non-zero if the hash extent should
+be discarded
+.RI ( hasher->hash_output
+will not be set in this case).
+Its parameter
+.I buffer
+shall be
+.I NULL
+for the above described behaviour, or an sufficiently
+large buffer the function shall output the hash extent
+to. If
+.I buffer
+is
+.RI non- NULL ,
+.I hasher->hash_output
+will be set to
+.IR NULL ).
+.PP
.I hasher->destroy
will be set to a pointer to a function to to
call, with
diff --git a/libhashsum_init_sha_224_hasher.3 b/libhashsum_init_sha_224_hasher.3
index 6ce3e23..b5cffa0 100644
--- a/libhashsum_init_sha_224_hasher.3
+++ b/libhashsum_init_sha_224_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_sha_224_hasher - initialise state for SHA-224 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -90,7 +91,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -116,8 +117,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -149,6 +158,10 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL .
+.PP
.I hasher->destroy
will be set to
.IR NULL .
diff --git a/libhashsum_init_sha_256_hasher.3 b/libhashsum_init_sha_256_hasher.3
index 6d8ee51..edb1209 100644
--- a/libhashsum_init_sha_256_hasher.3
+++ b/libhashsum_init_sha_256_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_sha_256_hasher - initialise state for SHA-256 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -90,7 +91,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -116,8 +117,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -149,6 +158,10 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL .
+.PP
.I hasher->destroy
will be set to
.IR NULL .
diff --git a/libhashsum_init_sha_384_hasher.3 b/libhashsum_init_sha_384_hasher.3
index 6f31e8c..ad0ab38 100644
--- a/libhashsum_init_sha_384_hasher.3
+++ b/libhashsum_init_sha_384_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_sha_384_hasher - initialise state for SHA-384 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -90,7 +91,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -116,8 +117,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -149,6 +158,10 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL .
+.PP
.I hasher->destroy
will be set to
.IR NULL .
diff --git a/libhashsum_init_sha_512_224_hasher.3 b/libhashsum_init_sha_512_224_hasher.3
index c06d4b1..3810bc2 100644
--- a/libhashsum_init_sha_512_224_hasher.3
+++ b/libhashsum_init_sha_512_224_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_sha_512_224_hasher - initialise state for SHA-512/224 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -90,7 +91,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -116,8 +117,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -149,6 +158,10 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL .
+.PP
.I hasher->destroy
will be set to
.IR NULL .
diff --git a/libhashsum_init_sha_512_256_hasher.3 b/libhashsum_init_sha_512_256_hasher.3
index c162484..76912c7 100644
--- a/libhashsum_init_sha_512_256_hasher.3
+++ b/libhashsum_init_sha_512_256_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_sha_512_256_hasher - initialise state for SHA-512/256 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -90,7 +91,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -116,8 +117,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -149,6 +158,10 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL .
+.PP
.I hasher->destroy
will be set to
.IR NULL .
diff --git a/libhashsum_init_sha_512_hasher.3 b/libhashsum_init_sha_512_hasher.3
index 3c8541d..eba1cd9 100644
--- a/libhashsum_init_sha_512_hasher.3
+++ b/libhashsum_init_sha_512_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_sha_512_hasher - initialise state for SHA-512 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -90,7 +91,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -116,8 +117,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -149,6 +158,10 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL .
+.PP
.I hasher->destroy
will be set to
.IR NULL .
diff --git a/libhashsum_init_shake128_hasher.3 b/libhashsum_init_shake128_hasher.3
index e69fabe..f852491 100644
--- a/libhashsum_init_shake128_hasher.3
+++ b/libhashsum_init_shake128_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_shake128_hasher - initialise state for SHAKE128 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -106,7 +107,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -132,8 +133,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -165,6 +174,52 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL ,
+however upon successful completion of
+.I *hasher->finalise
+or
+.IR *hasher->finalise_const ,
+.I hasher->stretch
+will be set to point to a function that can be
+used to extend the hash by
+.I hasher->hash_size
+bytes, and can be called repeated without limitation.
+The hash extent will be written to a buffer in
+.I hasher->state
+(which
+.I *hasher->finalize
+and
+.I *hasher->finalize_const
+also write the hash to), and
+.I hasher->hash_output
+will be set to point to this buffer.
+.IR *hasher->stretch 's
+parameter
+.I this
+shall be
+.IR hasher .
+Its parameter
+.I skip
+can be set to non-zero if the hash extent should
+be discarded
+.RI ( hasher->hash_output
+will not be set in this case).
+Its parameter
+.I buffer
+shall be
+.I NULL
+for the above described behaviour, or an sufficiently
+large buffer the function shall output the hash extent
+to. If
+.I buffer
+is
+.RI non- NULL ,
+.I hasher->hash_output
+will be set to
+.IR NULL ).
+.PP
.I hasher->destroy
will be set to a pointer to a function to to
call, with
diff --git a/libhashsum_init_shake256_hasher.3 b/libhashsum_init_shake256_hasher.3
index d9f407e..972e68e 100644
--- a/libhashsum_init_shake256_hasher.3
+++ b/libhashsum_init_shake256_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_shake256_hasher - initialise state for SHAKE256 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -106,7 +107,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -132,8 +133,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -165,6 +174,52 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL ,
+however upon successful completion of
+.I *hasher->finalise
+or
+.IR *hasher->finalise_const ,
+.I hasher->stretch
+will be set to point to a function that can be
+used to extend the hash by
+.I hasher->hash_size
+bytes, and can be called repeated without limitation.
+The hash extent will be written to a buffer in
+.I hasher->state
+(which
+.I *hasher->finalize
+and
+.I *hasher->finalize_const
+also write the hash to), and
+.I hasher->hash_output
+will be set to point to this buffer.
+.IR *hasher->stretch 's
+parameter
+.I this
+shall be
+.IR hasher .
+Its parameter
+.I skip
+can be set to non-zero if the hash extent should
+be discarded
+.RI ( hasher->hash_output
+will not be set in this case).
+Its parameter
+.I buffer
+shall be
+.I NULL
+for the above described behaviour, or an sufficiently
+large buffer the function shall output the hash extent
+to. If
+.I buffer
+is
+.RI non- NULL ,
+.I hasher->hash_output
+will be set to
+.IR NULL ).
+.PP
.I hasher->destroy
will be set to a pointer to a function to to
call, with
diff --git a/libhashsum_init_shake512_hasher.3 b/libhashsum_init_shake512_hasher.3
index ba3d5b6..074ec2c 100644
--- a/libhashsum_init_shake512_hasher.3
+++ b/libhashsum_init_shake512_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_shake512_hasher - initialise state for SHAKE512 hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -106,7 +107,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -132,8 +133,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -165,6 +174,52 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL ,
+however upon successful completion of
+.I *hasher->finalise
+or
+.IR *hasher->finalise_const ,
+.I hasher->stretch
+will be set to point to a function that can be
+used to extend the hash by
+.I hasher->hash_size
+bytes, and can be called repeated without limitation.
+The hash extent will be written to a buffer in
+.I hasher->state
+(which
+.I *hasher->finalize
+and
+.I *hasher->finalize_const
+also write the hash to), and
+.I hasher->hash_output
+will be set to point to this buffer.
+.IR *hasher->stretch 's
+parameter
+.I this
+shall be
+.IR hasher .
+Its parameter
+.I skip
+can be set to non-zero if the hash extent should
+be discarded
+.RI ( hasher->hash_output
+will not be set in this case).
+Its parameter
+.I buffer
+shall be
+.I NULL
+for the above described behaviour, or an sufficiently
+large buffer the function shall output the hash extent
+to. If
+.I buffer
+is
+.RI non- NULL ,
+.I hasher->hash_output
+will be set to
+.IR NULL ).
+.PP
.I hasher->destroy
will be set to a pointer to a function to to
call, with
diff --git a/libhashsum_init_shake_hasher.3 b/libhashsum_init_shake_hasher.3
index e04429f..e551211 100644
--- a/libhashsum_init_shake_hasher.3
+++ b/libhashsum_init_shake_hasher.3
@@ -16,6 +16,7 @@ libhashsum_init_shake_hasher - initialise state for SHAKE hashing
size_t (*\fIprocess\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP);
int (*\fIfinalise_const\fP)(struct libhashsum_hasher *\fPthis\fP, const void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP);
int (*\fIfinalise\fP)(struct libhashsum_hasher *\fPthis\fP, void *\fPdata\fP, size_t \fPbytes\fP, unsigned \fPextra_bits\fP, size_t \fPsize\fP);
+ void (*\fIstretch\fP)(struct libhashsum_hasher *\fPthis\fP, int \fPskip\fP, void *\fPbuffer\fP);
void (*\fIdestroy\fP)(struct libhashsum_hasher *\fPthis\fP);
union libhashsum_state { /* definition omitted */ } \fIstate\fP;
};
@@ -120,7 +121,7 @@ no greater than
.I hasher->finalise_const
will be set to a pointer to the function to call
once the entire text being hashed has been loaded,
-and to get the hash of the text. It's parameter
+and to get the hash of the text. Its parameter
.I this
shall be set to
.IR hasher .
@@ -146,8 +147,16 @@ to a pointer to a buffer in
containing the binary hash of the processed data.
Otherwise, the function will return -1, and set
.I errno
-to indicate the error. The function will failure
-if:
+to indicate the error. However, if the user has
+already set
+.I hasher->hash_output
+to a
+.RI non- NULL
+pointer, the function will output the binary hash
+to that pointer instead without redirecting
+.I hasher->hash_output
+(the application must make sure this buffer is
+sufficiently large). The function will failure if:
.RS
.TP
.B EINVAL
@@ -179,6 +188,52 @@ shall be set to the size of the buffer
is otherwise identical to
.IR *hasher->finalise_const .
.PP
+.I hasher->stretch
+will be set to
+.IR NULL ,
+however upon successful completion of
+.I *hasher->finalise
+or
+.IR *hasher->finalise_const ,
+.I hasher->stretch
+will be set to point to a function that can be
+used to extend the hash by
+.I hasher->hash_size
+bytes, and can be called repeated without limitation.
+The hash extent will be written to a buffer in
+.I hasher->state
+(which
+.I *hasher->finalize
+and
+.I *hasher->finalize_const
+also write the hash to), and
+.I hasher->hash_output
+will be set to point to this buffer.
+.IR *hasher->stretch 's
+parameter
+.I this
+shall be
+.IR hasher .
+Its parameter
+.I skip
+can be set to non-zero if the hash extent should
+be discarded
+.RI ( hasher->hash_output
+will not be set in this case).
+Its parameter
+.I buffer
+shall be
+.I NULL
+for the above described behaviour, or an sufficiently
+large buffer the function shall output the hash extent
+to. If
+.I buffer
+is
+.RI non- NULL ,
+.I hasher->hash_output
+will be set to
+.IR NULL ).
+.PP
.I hasher->destroy
will be set to a pointer to a function to to
call, with
diff --git a/misc-tests.c b/misc-tests.c
index 0144916..4eca0a6 100644
--- a/misc-tests.c
+++ b/misc-tests.c
@@ -7,7 +7,7 @@
if ((ASSERTION))\
break;\
fprintf(stderr, "assertion `%s` at line %i failed\n", #ASSERTION, __LINE__);\
- exit(1);\
+ exit(2);\
} while (0)
@@ -23,6 +23,7 @@ eq(struct libhashsum_hasher *a, struct libhashsum_hasher *b)
a->process != b->process ||
a->finalise_const != b->finalise_const ||
a->finalise != b->finalise ||
+ a->stretch != b->stretch ||
a->destroy != b->destroy)
return 0;
if (a->hash_output && memcpy(a->hash_output, b->hash_output, a->hash_size))