adding rshift

This commit is contained in:
Daniel Larimer 2016-02-04 16:32:13 -05:00
parent 4438c8aa80
commit 7840ef16e9
4 changed files with 32 additions and 1 deletions

View file

@ -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 );

View file

@ -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;
}
}}

View file

@ -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);
}}

View file

@ -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];