mirror of
https://github.com/systemd/systemd.git
synced 2025-08-24 09:49:49 +03:00
test: siphash24 - verify internal state and composability
Verify the state of the hash-function according to the reference paper, also verify that we can decompose the input and hash the chunks one by one and still get the same result.
This commit is contained in:
@ -26,15 +26,17 @@
|
|||||||
|
|
||||||
/* see https://131002.net/siphash/siphash.pdf, Appendix A */
|
/* see https://131002.net/siphash/siphash.pdf, Appendix A */
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
|
struct siphash state = {};
|
||||||
const uint8_t in[15] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
const uint8_t in[15] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e };
|
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e };
|
||||||
const uint8_t key[16] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
const uint8_t key[16] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
|
||||||
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
|
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
|
||||||
uint64_t out = 0;
|
uint64_t out = 0;
|
||||||
unsigned k;
|
unsigned i, j, k;
|
||||||
usec_t ts;
|
usec_t ts;
|
||||||
|
|
||||||
siphash24((uint8_t *)&out, in, sizeof(in), key);
|
siphash24((uint8_t *)&out, in, sizeof(in), key);
|
||||||
|
assert_se(out == 0xa129ca6149be45e5);
|
||||||
|
|
||||||
assert_se(out == 0xa129ca6149be45e5ULL);
|
assert_se(out == 0xa129ca6149be45e5ULL);
|
||||||
|
|
||||||
@ -44,4 +46,33 @@ int main(int argc, char *argv[]) {
|
|||||||
ts = now(CLOCK_MONOTONIC) - ts;
|
ts = now(CLOCK_MONOTONIC) - ts;
|
||||||
|
|
||||||
log_info("%llu iterations per second", (ITERATIONS * USEC_PER_SEC) / ts);
|
log_info("%llu iterations per second", (ITERATIONS * USEC_PER_SEC) / ts);
|
||||||
|
|
||||||
|
/* verify the internal state as given in the above paper */
|
||||||
|
siphash_init(&state, key);
|
||||||
|
assert_se(state.v0 == 0x7469686173716475);
|
||||||
|
assert_se(state.v1 == 0x6b617f6d656e6665);
|
||||||
|
assert_se(state.v2 == 0x6b7f62616d677361);
|
||||||
|
assert_se(state.v3 == 0x7b6b696e727e6c7b);
|
||||||
|
siphash24_compress(in, sizeof(in), &state);
|
||||||
|
assert_se(state.v0 == 0x4a017198de0a59e0);
|
||||||
|
assert_se(state.v1 == 0x0d52f6f62a4f59a4);
|
||||||
|
assert_se(state.v2 == 0x634cb3577b01fd3d);
|
||||||
|
assert_se(state.v3 == 0xa5224d6f55c7d9c8);
|
||||||
|
assert_se(siphash24_finalize(&state) == 0xa129ca6149be45e5);
|
||||||
|
assert_se(state.v0 == 0xf6bcd53893fecff1);
|
||||||
|
assert_se(state.v1 == 0x54b9964c7ea0d937);
|
||||||
|
assert_se(state.v2 == 0x1b38329c099bb55a);
|
||||||
|
assert_se(state.v3 == 0x1814bb89ad7be679);
|
||||||
|
|
||||||
|
/* verify that decomposing the input in three chunks gives the
|
||||||
|
same result */
|
||||||
|
for (i = 0; i < sizeof(in); i++) {
|
||||||
|
for (j = i; j < sizeof(in); j++) {
|
||||||
|
siphash_init(&state, key);
|
||||||
|
siphash24_compress(in, i, &state);
|
||||||
|
siphash24_compress(&in[i], j - i, &state);
|
||||||
|
siphash24_compress(&in[j], sizeof(in) - j, &state);
|
||||||
|
assert_se(siphash24_finalize(&state) == 0xa129ca6149be45e5);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user