summaryrefslogtreecommitdiff
path: root/src/lib/crypt_ops/crypto_digest.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2018-12-13 16:59:04 -0500
committerNick Mathewson <nickm@torproject.org>2019-01-17 12:43:20 -0500
commit9b0dd1ae04bb4bb3bf86fe8dd629f84a07bf5cbf (patch)
treedaa8493cff72c8017f1fe9034f57c7c3f0ddb4a8 /src/lib/crypt_ops/crypto_digest.c
parentc3931714038e422972b80a893db0807d4d8ae937 (diff)
downloadtor-9b0dd1ae04bb4bb3bf86fe8dd629f84a07bf5cbf.tar.gz
tor-9b0dd1ae04bb4bb3bf86fe8dd629f84a07bf5cbf.zip
Add a function to compute an XOF in one shot.
Motivation: 1. It's convenient. 2. It's all that openssl supports. Part of 28837.
Diffstat (limited to 'src/lib/crypt_ops/crypto_digest.c')
-rw-r--r--src/lib/crypt_ops/crypto_digest.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/lib/crypt_ops/crypto_digest.c b/src/lib/crypt_ops/crypto_digest.c
index 2cbd3d1124..1e64100f2f 100644
--- a/src/lib/crypt_ops/crypto_digest.c
+++ b/src/lib/crypt_ops/crypto_digest.c
@@ -955,3 +955,27 @@ crypto_xof_free_(crypto_xof_t *xof)
memwipe(xof, 0, sizeof(crypto_xof_t));
tor_free(xof);
}
+
+/** Compute the XOF (SHAKE256) of a <b>input_len</b> bytes at <b>input</b>,
+ * putting <b>output_len</b> bytes at <b>output</b>. */
+void
+crypto_xof(uint8_t *output, size_t output_len,
+ const uint8_t *input, size_t input_len)
+{
+#ifdef OPENSSL_HAS_SHA3
+ EVP_MD_CTX *ctx = EVP_MD_CTX_new();
+ tor_assert(ctx);
+ int r = EVP_DigestInit(ctx, EVP_shake256());
+ tor_assert(r == 1);
+ r = EVP_DigestUpdate(ctx, input, input_len);
+ tor_assert(r == 1);
+ r = EVP_DigestFinalXOF(ctx, output, output_len);
+ tor_assert(r == 1);
+ EVP_MD_CTX_free(ctx);
+#else
+ crypto_xof_t *xof = crypto_xof_new();
+ crypto_xof_add_bytes(xof, input, input_len);
+ crypto_xof_squeeze_bytes(xof, output, output_len);
+ crypto_xof_free(xof);
+#endif
+}