summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2013-09-07 10:06:46 +0200
committerWerner Koch <wk@gnupg.org>2013-09-10 22:09:15 +0200
commitf3bca0c77c4979504f95fdbc618f7458e61e3e45 (patch)
tree9001cc1a8709dbe0f80ab3747ab062ac15e67246 /src
parent0a28b2d2c9181a536fc894e24626714832619923 (diff)
downloadlibgcrypt-f3bca0c77c4979504f95fdbc618f7458e61e3e45.tar.gz
md: Add function gcry_md_hash_buffers.
* src/gcrypt.h.in (gcry_buffer_t): new. (gcry_md_hash_buffers): New. * src/visibility.c, src/visibility.h: Add wrapper for new function. * src/libgcrypt.def, src/libgcrypt.vers: Export new function. * cipher/md.c (gcry_md_hash_buffers): New. * cipher/sha1.c (_gcry_sha1_hash_buffers): New. * tests/basic.c (check_one_md_multi): New. (check_digests): Run that test. * tests/hmac.c (check_hmac_multi): New. (main): Run that test. Signed-off-by: Werner Koch <wk@gnupg.org>
Diffstat (limited to 'src')
-rw-r--r--src/cipher.h2
-rw-r--r--src/gcrypt.h.in14
-rw-r--r--src/libgcrypt.def1
-rw-r--r--src/libgcrypt.vers1
-rw-r--r--src/visibility.c12
-rw-r--r--src/visibility.h3
6 files changed, 33 insertions, 0 deletions
diff --git a/src/cipher.h b/src/cipher.h
index ea8ba2af..7791083b 100644
--- a/src/cipher.h
+++ b/src/cipher.h
@@ -79,6 +79,8 @@ void _gcry_rmd160_hash_buffer (void *outbuf,
/*-- sha1.c --*/
void _gcry_sha1_hash_buffer (void *outbuf,
const void *buffer, size_t length);
+void _gcry_sha1_hash_buffers (void *outbuf,
+ const gcry_buffer_t *iov, int iovcnt);
/*-- rijndael.c --*/
void _gcry_aes_cfb_enc (void *context, unsigned char *iv,
diff --git a/src/gcrypt.h.in b/src/gcrypt.h.in
index 5d30ced1..71ea0730 100644
--- a/src/gcrypt.h.in
+++ b/src/gcrypt.h.in
@@ -232,6 +232,16 @@ typedef struct gcry_mpi *GCRY_MPI _GCRY_GCC_ATTR_DEPRECATED;
typedef struct gcry_mpi *GcryMPI _GCRY_GCC_ATTR_DEPRECATED;
#endif
+/* A structure used for scatter gather hashing. */
+typedef struct
+{
+ size_t size; /* The allocated size of the buffer or 0. */
+ size_t off; /* Offset into the buffer. */
+ size_t len; /* The used length of the buffer. */
+ void *data; /* The buffer. */
+} gcry_buffer_t;
+
+
/* Check that the library fulfills the version requirement. */
@@ -1151,6 +1161,10 @@ unsigned char *gcry_md_read (gcry_md_hd_t hd, int algo);
void gcry_md_hash_buffer (int algo, void *digest,
const void *buffer, size_t length);
+/* Convenience function to hash multiple buffers. */
+gpg_error_t gcry_md_hash_buffers (int algo, unsigned int flags, void *digest,
+ const gcry_buffer_t *iov, int iovcnt);
+
/* Retrieve the algorithm used with HD. This does not work reliable
if more than one algorithm is enabled in HD. */
int gcry_md_get_algo (gcry_md_hd_t hd);
diff --git a/src/libgcrypt.def b/src/libgcrypt.def
index 9c691ec2..9fa42458 100644
--- a/src/libgcrypt.def
+++ b/src/libgcrypt.def
@@ -245,6 +245,7 @@ EXPORTS
gcry_mpi_ec_curve_point @218
+ gcry_md_hash_buffers @219
;; end of file with public symbols for Windows.
diff --git a/src/libgcrypt.vers b/src/libgcrypt.vers
index beb691ee..904ab412 100644
--- a/src/libgcrypt.vers
+++ b/src/libgcrypt.vers
@@ -39,6 +39,7 @@ GCRYPT_1.6 {
gcry_md_algo_info; gcry_md_algo_name; gcry_md_close;
gcry_md_copy; gcry_md_ctl; gcry_md_enable; gcry_md_get;
gcry_md_get_algo; gcry_md_get_algo_dlen; gcry_md_hash_buffer;
+ gcry_md_hash_buffers;
gcry_md_info; gcry_md_is_enabled; gcry_md_is_secure;
gcry_md_map_name; gcry_md_open; gcry_md_read;
gcry_md_reset; gcry_md_setkey;
diff --git a/src/visibility.c b/src/visibility.c
index 404da20b..48725ffe 100644
--- a/src/visibility.c
+++ b/src/visibility.c
@@ -997,6 +997,18 @@ gcry_md_hash_buffer (int algo, void *digest,
_gcry_md_hash_buffer (algo, digest, buffer, length);
}
+gpg_error_t
+gcry_md_hash_buffers (int algo, unsigned int flags, void *digest,
+ const gcry_buffer_t *iov, int iovcnt)
+{
+ if (!fips_is_operational ())
+ {
+ (void)fips_not_operational ();
+ fips_signal_error ("called in non-operational state");
+ }
+ return _gcry_md_hash_buffers (algo, flags, digest, iov, iovcnt);
+}
+
int
gcry_md_get_algo (gcry_md_hd_t hd)
{
diff --git a/src/visibility.h b/src/visibility.h
index b4da48e8..5e3556c0 100644
--- a/src/visibility.h
+++ b/src/visibility.h
@@ -63,6 +63,7 @@
#define gcry_md_get_algo _gcry_md_get_algo
#define gcry_md_get_algo_dlen _gcry_md_get_algo_dlen
#define gcry_md_hash_buffer _gcry_md_hash_buffer
+#define gcry_md_hash_buffers _gcry_md_hash_buffers
#define gcry_md_info _gcry_md_info
#define gcry_md_is_enabled _gcry_md_is_enabled
#define gcry_md_is_secure _gcry_md_is_secure
@@ -279,6 +280,7 @@ gcry_err_code_t gcry_md_get (gcry_md_hd_t hd, int algo,
#undef gcry_md_get_algo
#undef gcry_md_get_algo_dlen
#undef gcry_md_hash_buffer
+#undef gcry_md_hash_buffers
#undef gcry_md_info
#undef gcry_md_is_enabled
#undef gcry_md_is_secure
@@ -455,6 +457,7 @@ MARK_VISIBLE (gcry_md_get)
MARK_VISIBLE (gcry_md_get_algo)
MARK_VISIBLE (gcry_md_get_algo_dlen)
MARK_VISIBLE (gcry_md_hash_buffer)
+MARK_VISIBLE (gcry_md_hash_buffers)
MARK_VISIBLE (gcry_md_info)
MARK_VISIBLE (gcry_md_is_enabled)
MARK_VISIBLE (gcry_md_is_secure)