Remove static switch to ease fuzz coverage tracking

This commit is contained in:
Alex Hultman
2020-08-14 16:58:49 +02:00
parent 959ac9ef80
commit 436076479f
+51 -40
View File
@@ -37,54 +37,65 @@ struct WebSocketHandshake {
void operator()(uint32_t *a, uint32_t *hash) {} void operator()(uint32_t *a, uint32_t *hash) {}
}; };
template <int state> static inline uint32_t rol(uint32_t value, size_t bits) {return (value << bits) | (value >> (32 - bits));}
struct Sha1Loop { static inline uint32_t blk(uint32_t b[16], size_t i) {
static inline uint32_t rol(uint32_t value, size_t bits) {return (value << bits) | (value >> (32 - bits));} return rol(b[(i + 13) & 15] ^ b[(i + 8) & 15] ^ b[(i + 2) & 15] ^ b[i], 1);
static inline uint32_t blk(uint32_t b[16], size_t i) { }
return rol(b[(i + 13) & 15] ^ b[(i + 8) & 15] ^ b[(i + 2) & 15] ^ b[i], 1);
}
struct Sha1Loop1 {
template <int i> template <int i>
static inline void f(uint32_t *a, uint32_t *b) { static inline void f(uint32_t *a, uint32_t *b) {
switch (state) { a[i % 5] += ((a[(3 + i) % 5] & (a[(2 + i) % 5] ^ a[(1 + i) % 5])) ^ a[(1 + i) % 5]) + b[i] + 0x5a827999 + rol(a[(4 + i) % 5], 5);
case 1: a[(3 + i) % 5] = rol(a[(3 + i) % 5], 30);
a[i % 5] += ((a[(3 + i) % 5] & (a[(2 + i) % 5] ^ a[(1 + i) % 5])) ^ a[(1 + i) % 5]) + b[i] + 0x5a827999 + rol(a[(4 + i) % 5], 5); }
a[(3 + i) % 5] = rol(a[(3 + i) % 5], 30); };
break; struct Sha1Loop2 {
case 2: template <int i>
b[i] = blk(b, i); static inline void f(uint32_t *a, uint32_t *b) {
a[(1 + i) % 5] += ((a[(4 + i) % 5] & (a[(3 + i) % 5] ^ a[(2 + i) % 5])) ^ a[(2 + i) % 5]) + b[i] + 0x5a827999 + rol(a[(5 + i) % 5], 5); b[i] = blk(b, i);
a[(4 + i) % 5] = rol(a[(4 + i) % 5], 30); a[(1 + i) % 5] += ((a[(4 + i) % 5] & (a[(3 + i) % 5] ^ a[(2 + i) % 5])) ^ a[(2 + i) % 5]) + b[i] + 0x5a827999 + rol(a[(5 + i) % 5], 5);
break; a[(4 + i) % 5] = rol(a[(4 + i) % 5], 30);
case 3: }
b[(i + 4) % 16] = blk(b, (i + 4) % 16); };
a[i % 5] += (a[(3 + i) % 5] ^ a[(2 + i) % 5] ^ a[(1 + i) % 5]) + b[(i + 4) % 16] + 0x6ed9eba1 + rol(a[(4 + i) % 5], 5); struct Sha1Loop3 {
a[(3 + i) % 5] = rol(a[(3 + i) % 5], 30); template <int i>
break; static inline void f(uint32_t *a, uint32_t *b) {
case 4: b[(i + 4) % 16] = blk(b, (i + 4) % 16);
b[(i + 8) % 16] = blk(b, (i + 8) % 16); a[i % 5] += (a[(3 + i) % 5] ^ a[(2 + i) % 5] ^ a[(1 + i) % 5]) + b[(i + 4) % 16] + 0x6ed9eba1 + rol(a[(4 + i) % 5], 5);
a[i % 5] += (((a[(3 + i) % 5] | a[(2 + i) % 5]) & a[(1 + i) % 5]) | (a[(3 + i) % 5] & a[(2 + i) % 5])) + b[(i + 8) % 16] + 0x8f1bbcdc + rol(a[(4 + i) % 5], 5); a[(3 + i) % 5] = rol(a[(3 + i) % 5], 30);
a[(3 + i) % 5] = rol(a[(3 + i) % 5], 30); }
break; };
case 5: struct Sha1Loop4 {
b[(i + 12) % 16] = blk(b, (i + 12) % 16); template <int i>
a[i % 5] += (a[(3 + i) % 5] ^ a[(2 + i) % 5] ^ a[(1 + i) % 5]) + b[(i + 12) % 16] + 0xca62c1d6 + rol(a[(4 + i) % 5], 5); static inline void f(uint32_t *a, uint32_t *b) {
a[(3 + i) % 5] = rol(a[(3 + i) % 5], 30); b[(i + 8) % 16] = blk(b, (i + 8) % 16);
break; a[i % 5] += (((a[(3 + i) % 5] | a[(2 + i) % 5]) & a[(1 + i) % 5]) | (a[(3 + i) % 5] & a[(2 + i) % 5])) + b[(i + 8) % 16] + 0x8f1bbcdc + rol(a[(4 + i) % 5], 5);
case 6: a[(3 + i) % 5] = rol(a[(3 + i) % 5], 30);
b[i] += a[4 - i]; }
} };
struct Sha1Loop5 {
template <int i>
static inline void f(uint32_t *a, uint32_t *b) {
b[(i + 12) % 16] = blk(b, (i + 12) % 16);
a[i % 5] += (a[(3 + i) % 5] ^ a[(2 + i) % 5] ^ a[(1 + i) % 5]) + b[(i + 12) % 16] + 0xca62c1d6 + rol(a[(4 + i) % 5], 5);
a[(3 + i) % 5] = rol(a[(3 + i) % 5], 30);
}
};
struct Sha1Loop6 {
template <int i>
static inline void f(uint32_t *a, uint32_t *b) {
b[i] += a[4 - i];
} }
}; };
static inline void sha1(uint32_t hash[5], uint32_t b[16]) { static inline void sha1(uint32_t hash[5], uint32_t b[16]) {
uint32_t a[5] = {hash[4], hash[3], hash[2], hash[1], hash[0]}; uint32_t a[5] = {hash[4], hash[3], hash[2], hash[1], hash[0]};
static_for<16, Sha1Loop<1>>()(a, b); static_for<16, Sha1Loop1>()(a, b);
static_for<4, Sha1Loop<2>>()(a, b); static_for<4, Sha1Loop2>()(a, b);
static_for<20, Sha1Loop<3>>()(a, b); static_for<20, Sha1Loop3>()(a, b);
static_for<20, Sha1Loop<4>>()(a, b); static_for<20, Sha1Loop4>()(a, b);
static_for<20, Sha1Loop<5>>()(a, b); static_for<20, Sha1Loop5>()(a, b);
static_for<5, Sha1Loop<6>>()(a, hash); static_for<5, Sha1Loop6>()(a, hash);
} }
static inline void base64(unsigned char *src, char *dst) { static inline void base64(unsigned char *src, char *dst) {