From 7840ef16e9fae8341efea5a882f484262d50d7e6 Mon Sep 17 00:00:00 2001 From: Daniel Larimer Date: Thu, 4 Feb 2016 16:32:13 -0500 Subject: [PATCH] adding rshift --- include/fc/crypto/sha256.hpp | 1 + src/crypto/_digest_common.cpp | 26 +++++++++++++++++++++++++- src/crypto/_digest_common.hpp | 1 + src/crypto/sha256.cpp | 5 +++++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/include/fc/crypto/sha256.hpp b/include/fc/crypto/sha256.hpp index 387a1d0..87fffa2 100644 --- a/include/fc/crypto/sha256.hpp +++ b/include/fc/crypto/sha256.hpp @@ -60,6 +60,7 @@ class sha256 return ds; } friend sha256 operator << ( const sha256& h1, uint32_t i ); + friend sha256 operator >> ( const sha256& h1, uint32_t i ); friend bool operator == ( const sha256& h1, const sha256& h2 ); friend bool operator != ( const sha256& h1, const sha256& h2 ); friend sha256 operator ^ ( const sha256& h1, const sha256& h2 ); diff --git a/src/crypto/_digest_common.cpp b/src/crypto/_digest_common.cpp index 2c5c652..67a015b 100644 --- a/src/crypto/_digest_common.cpp +++ b/src/crypto/_digest_common.cpp @@ -16,7 +16,7 @@ namespace fc { namespace detail { uint8_t* out8 = (uint8_t*) out; if (i >= 8) { - shift_l( in8, out8, n, i >> 3 ); + shift_l( in8, out8, n, i / 8 ); i &= 7; in8 = out8; } @@ -26,4 +26,28 @@ namespace fc { namespace detail { out8[p] = (in8[p] << i) | (in8[p+1]>>(8-i)); out8[p] = in8[p] << i; } + static void shift_r( const uint8_t* in, uint8_t* out, std::size_t n, unsigned int i) { + if (i < n) { + memcpy( out+i, in, n-i ); + } else { + i = n; + } + memset( out, 0, i ); + } + + void shift_r( const char* in, char* out, std::size_t n, unsigned int i) { + const uint8_t* in8 = (uint8_t*) in; + uint8_t* out8 = (uint8_t*) out; + + if (i >= 8) { + shift_r( in8, out8, n, i / 8 ); + i &= 7; + in8 = out8; + } + + std::size_t p; + for( p = n-1; p > 0; --p ) + out8[p] = (in8[p] >> i) | (in8[p-1]<<(8-i)); + out8[p] = in8[p] >> i; + } }} diff --git a/src/crypto/_digest_common.hpp b/src/crypto/_digest_common.hpp index 8aa21b3..8582309 100644 --- a/src/crypto/_digest_common.hpp +++ b/src/crypto/_digest_common.hpp @@ -4,4 +4,5 @@ */ namespace fc { namespace detail { void shift_l( const char* in, char* out, std::size_t n, unsigned int i); + void shift_r( const char* in, char* out, std::size_t n, unsigned int i); }} diff --git a/src/crypto/sha256.cpp b/src/crypto/sha256.cpp index b043c2c..9c3b9e6 100644 --- a/src/crypto/sha256.cpp +++ b/src/crypto/sha256.cpp @@ -69,6 +69,11 @@ namespace fc { fc::detail::shift_l( h1.data(), result.data(), result.data_size(), i ); return result; } + sha256 operator >> ( const sha256& h1, uint32_t i ) { + sha256 result; + fc::detail::shift_r( h1.data(), result.data(), result.data_size(), i ); + return result; + } sha256 operator ^ ( const sha256& h1, const sha256& h2 ) { sha256 result; result._hash[0] = h1._hash[0] ^ h2._hash[0];