From 9efe8d1ed5ee210ae644b7118f1d674a2de5f3e8 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Sat, 22 Jul 2017 14:16:10 +0200 Subject: Add fast-path SHA256 functions for integral types --- libbutl/sha256.hxx | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) (limited to 'libbutl/sha256.hxx') diff --git a/libbutl/sha256.hxx b/libbutl/sha256.hxx index e81b87b..459b46c 100644 --- a/libbutl/sha256.hxx +++ b/libbutl/sha256.hxx @@ -6,9 +6,10 @@ #define LIBBUTL_SHA256_HXX #include -#include // strlen() +#include // strlen(), memcpy() #include -#include // size_t +#include // size_t +#include // enable_if, is_integral #include @@ -50,6 +51,39 @@ namespace butl explicit sha256 (const char* s): sha256 () {append (s);} + // Append an integral type with a fast path optimization (see + // SHA256_Update() for details). + // + void + append (char c) + { + std::uint32_t r ((ctx_.count >> 3) & 0x3f); + + if (1 < 64 - r) + { + ctx_.buf[r] = static_cast (c); + ctx_.count += 8; + } + else + append (&c, 1); + } + + template + typename std::enable_if::value>::type + append (T x) + { + const std::size_t len (sizeof (x)); + std::uint32_t r ((ctx_.count >> 3) & 0x3f); + + if (len < 64 - r) + { + std::memcpy (&ctx_.buf[r], &x, sizeof (x)); + ctx_.count += len << 3; + } + else + append (&x, len); + } + // Extract result. // // It can be obtained as either a 32-byte binary digest or as a 64- -- cgit v1.1