hash/sha1: style
This commit is contained in:
parent
485cc52a7b
commit
c4960e337e
@ -24,15 +24,15 @@ using cruft::crypto::hash::SHA1;
|
|||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// Constant words for sequence of rounds
|
// Constant words for sequence of rounds
|
||||||
static constexpr uint32_t K_00 = 0x5A827999;
|
static constexpr u32 K_00 = 0x5A827999;
|
||||||
static constexpr uint32_t K_20 = 0x6ED9EBA1;
|
static constexpr u32 K_20 = 0x6ED9EBA1;
|
||||||
static constexpr uint32_t K_40 = 0x8F1BBCDC;
|
static constexpr u32 K_40 = 0x8F1BBCDC;
|
||||||
static constexpr uint32_t K_60 = 0xCA62C1D6;
|
static constexpr u32 K_60 = 0xCA62C1D6;
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
static constexpr
|
static constexpr
|
||||||
std::array<uint32_t,5> INITIAL_H = {
|
std::array<u32,5> INITIAL_H = {
|
||||||
0x67452301,
|
0x67452301,
|
||||||
0xEFCDAB89,
|
0xEFCDAB89,
|
||||||
0x98BADCFE,
|
0x98BADCFE,
|
||||||
@ -43,82 +43,53 @@ std::array<uint32_t,5> INITIAL_H = {
|
|||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
static constexpr size_t BLOCK_WORDS = 16;
|
static constexpr size_t BLOCK_WORDS = 16;
|
||||||
static constexpr size_t BLOCK_BYTES = BLOCK_WORDS * sizeof (uint32_t);
|
static constexpr size_t BLOCK_BYTES = BLOCK_WORDS * sizeof (u32);
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// Logical function for sequence of rounds
|
// Logical function for sequence of rounds
|
||||||
static constexpr
|
static constexpr u32 f_00 (u32 B, u32 C, u32 D) { return (B & C) | (~B & D); }
|
||||||
uint32_t
|
static constexpr u32 f_20 (u32 B, u32 C, u32 D) { return B ^ C ^ D; }
|
||||||
f_00 (uint32_t B, uint32_t C, uint32_t D)
|
static constexpr u32 f_40 (u32 B, u32 C, u32 D) { return (B & C) | (B & D) | (C & D); }
|
||||||
{
|
static constexpr u32 f_60 (u32 B, u32 C, u32 D) { return B ^ C ^ D; }
|
||||||
return (B & C) | (~B & D);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
static constexpr
|
|
||||||
uint32_t
|
|
||||||
f_20 (uint32_t B, uint32_t C, uint32_t D)
|
|
||||||
{
|
|
||||||
return B ^ C ^ D;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
static constexpr
|
|
||||||
uint32_t
|
|
||||||
f_40 (uint32_t B, uint32_t C, uint32_t D)
|
|
||||||
{
|
|
||||||
return (B & C) | (B & D) | (C & D);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
static constexpr
|
|
||||||
uint32_t
|
|
||||||
f_60 (uint32_t B, uint32_t C, uint32_t D)
|
|
||||||
{
|
|
||||||
return B ^ C ^ D;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
static void
|
static void
|
||||||
process (std::array<uint32_t,5> &H, std::array<uint32_t,16+64> &W)
|
process (std::array<u32,5> &H, std::array<u32,16+64> &W)
|
||||||
{
|
{
|
||||||
// Byteswap the raw input we have buffered ready for arithmetic
|
// Byteswap the raw input we have buffered ready for arithmetic
|
||||||
std::transform (std::begin (W),
|
std::transform (std::begin (W),
|
||||||
std::end (W),
|
std::end (W),
|
||||||
std::begin (W),
|
std::begin (W),
|
||||||
[] (uint32_t x) {
|
[] (u32 x) {
|
||||||
return cruft::ntoh (x);
|
return cruft::ntoh (x);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Initialise the work buffer and the state variables
|
// Initialise the work buffer and the state variables
|
||||||
for (size_t t = 16; t < 80; ++t)
|
for (int t = 16; t < 80; ++t)
|
||||||
W[t] = cruft::rotatel (W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1);
|
W[t] = cruft::rotatel (W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1);
|
||||||
|
|
||||||
uint32_t A = H[0],
|
u32 A = H[0],
|
||||||
B = H[1],
|
B = H[1],
|
||||||
C = H[2],
|
C = H[2],
|
||||||
D = H[3],
|
D = H[3],
|
||||||
E = H[4];
|
E = H[4];
|
||||||
|
|
||||||
// Perform each of the four rounds
|
// Perform each of the four rounds
|
||||||
#define ROTATE_STATE(i) do { \
|
#define ROTATE_STATE(i) do { \
|
||||||
uint32_t temp = cruft::rotatel (A, 5) + f_##i (B, C, D) + E + W[t] + K_##i; \
|
u32 temp = cruft::rotatel (A, 5) + f_##i (B, C, D) + E + W[t] + K_##i; \
|
||||||
E = D; \
|
E = D; \
|
||||||
D = C; \
|
D = C; \
|
||||||
C = cruft::rotatel (B, 30); \
|
C = cruft::rotatel (B, 30); \
|
||||||
B = A; \
|
B = A; \
|
||||||
A = temp; \
|
A = temp; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
for (size_t t = 0; t < 20; ++t) ROTATE_STATE(00);
|
for (int t = 0; t < 20; ++t) ROTATE_STATE(00);
|
||||||
for (size_t t = 20; t < 40; ++t) ROTATE_STATE(20);
|
for (int t = 20; t < 40; ++t) ROTATE_STATE(20);
|
||||||
for (size_t t = 40; t < 60; ++t) ROTATE_STATE(40);
|
for (int t = 40; t < 60; ++t) ROTATE_STATE(40);
|
||||||
for (size_t t = 60; t < 80; ++t) ROTATE_STATE(60);
|
for (int t = 60; t < 80; ++t) ROTATE_STATE(60);
|
||||||
|
|
||||||
// Update the resulting hash state
|
// Update the resulting hash state
|
||||||
H[0] += A;
|
H[0] += A;
|
||||||
@ -131,7 +102,7 @@ process (std::array<uint32_t,5> &H, std::array<uint32_t,16+64> &W)
|
|||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
SHA1::digest_t
|
SHA1::digest_t
|
||||||
SHA1::operator() (cruft::view<const uint8_t*> data) noexcept
|
SHA1::operator() (cruft::view<const u08*> data) noexcept
|
||||||
{
|
{
|
||||||
return (*this) (data, nullptr);
|
return (*this) (data, nullptr);
|
||||||
}
|
}
|
||||||
@ -140,20 +111,20 @@ SHA1::operator() (cruft::view<const uint8_t*> data) noexcept
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
SHA1::digest_t
|
SHA1::digest_t
|
||||||
SHA1::operator() (
|
SHA1::operator() (
|
||||||
cruft::view<const uint8_t*> data_a,
|
cruft::view<const u08*> data_a,
|
||||||
cruft::view<const uint8_t*> data_b
|
cruft::view<const u08*> data_b
|
||||||
) noexcept {
|
) noexcept {
|
||||||
/* RESET */
|
/* RESET */
|
||||||
uint64_t total = 0;
|
u64 total = 0;
|
||||||
|
|
||||||
union {
|
union {
|
||||||
std::array<uint32_t,5> w;
|
std::array<u32,5> w;
|
||||||
std::array<uint8_t,20> b;
|
std::array<u08,20> b;
|
||||||
} H;
|
} H;
|
||||||
|
|
||||||
union {
|
union {
|
||||||
std::array<uint8_t, 16*4+64*4> c;
|
std::array<u08, 16*4+64*4> c;
|
||||||
std::array<uint32_t, 16 +64 > W;
|
std::array<u32, 16 +64 > W;
|
||||||
} state;
|
} state;
|
||||||
|
|
||||||
H.w = INITIAL_H;
|
H.w = INITIAL_H;
|
||||||
@ -204,6 +175,6 @@ SHA1::operator() (
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* DIGEST */
|
/* DIGEST */
|
||||||
std::transform (std::begin (H.w), std::end (H.w), std::begin (H.w), cruft::hton<uint32_t>);
|
std::transform (std::begin (H.w), std::end (H.w), std::begin (H.w), cruft::hton<u32>);
|
||||||
return H.b;
|
return H.b;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user