0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-10-18 09:58:43 +00:00
bird/lib/fletcher16_test.c
2015-08-05 12:36:40 +02:00

178 lines
3.9 KiB
C

/*
* BIRD Library -- Fletcher-16 checksum Tests
*
* (c) 2015 CZ.NIC z.s.p.o.
*
* Can be freely distributed and used under the terms of the GNU GPL.
*/
#include "test/birdtest.h"
#include "lib/fletcher16.h"
struct in {
u8 *data;
int count;
};
static u16
straightforward_fletcher16_compute(const char *data)
{
int count = strlen(data);
u16 sum1 = 0;
u16 sum2 = 0;
int index;
for(index = 0; index < count; ++index)
{
sum1 = (sum1 + data[index]) % 255;
sum2 = (sum2 + sum1) % 255;
}
return (sum2 << 8) | sum1;
}
static u16
straightforward_fletcher16_checksum(const char *data)
{
u16 csum;
u8 c0,c1,f0,f1;
csum = straightforward_fletcher16_compute(data);
f0 = csum & 0xff;
f1 = (csum >> 8) & 0xff;
c0 = 0xff - ((f0 + f1) % 0xff);
c1 = 0xff - ((f0 + c0) % 0xff);
return (c1 << 8) | c0;
}
static u16
get_fletcher16_compute(const char *str)
{
struct fletcher16_context ctxt;
fletcher16_init(&ctxt);
fletcher16_update(&ctxt, str, strlen(str));
u16 f;
put_u16(&f, fletcher16_compute(&ctxt));
return f;
}
static u16
get_fletcher16_checksum(const char *str)
{
struct fletcher16_context ctxt;
int len = strlen(str);
fletcher16_init(&ctxt);
fletcher16_update(&ctxt, str, len);
u16 f;
put_u16(&f, fletcher16_final(&ctxt, len, len));
return f;
}
static int
t_fletcher16_compute(void)
{
struct in_out {
char *in;
u16 out;
} in_out[] = {
{
.in = "\001\002",
.out = 0x0403,
},
{
.in = "",
.out = straightforward_fletcher16_compute(""),
},
{
.in = "a",
.out = straightforward_fletcher16_compute("a"),
},
{
.in = "abcd",
.out = straightforward_fletcher16_compute("abcd"),
},
{
.in = "message digest",
.out = straightforward_fletcher16_compute("message digest"),
},
{
.in = "abcdefghijklmnopqrstuvwxyz",
.out = straightforward_fletcher16_compute("abcdefghijklmnopqrstuvwxyz"),
},
{
.in = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
.out = straightforward_fletcher16_compute("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"),
},
{
.in = "12345678901234567890123456789012345678901234567890123456789012345678901234567890",
.out = straightforward_fletcher16_compute("12345678901234567890123456789012345678901234567890123456789012345678901234567890"),
},
};
bt_assert_out_fn_in(get_fletcher16_compute, in_out, "'%s'", "0x%04X");
return BT_SUCCESS;
}
static int
t_fletcher16_checksum(void)
{
struct in_out {
char *in;
u16 out;
} in_out[] = {
{
.in = "\001\002",
.out = straightforward_fletcher16_checksum("\001\002"),
},
{
.in = "",
.out = straightforward_fletcher16_checksum(""),
},
{
.in = "a",
.out = straightforward_fletcher16_checksum("a"),
},
{
.in = "abcd",
.out = straightforward_fletcher16_checksum("abcd"),
},
{
.in = "message digest",
.out = straightforward_fletcher16_checksum("message digest"),
},
{
.in = "abcdefghijklmnopqrstuvwxyz",
.out = straightforward_fletcher16_checksum("abcdefghijklmnopqrstuvwxyz"),
},
{
.in = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
.out = straightforward_fletcher16_checksum("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"),
},
{
.in = "12345678901234567890123456789012345678901234567890123456789012345678901234567890",
.out = straightforward_fletcher16_checksum("12345678901234567890123456789012345678901234567890123456789012345678901234567890"),
},
};
bt_assert_out_fn_in(get_fletcher16_checksum, in_out, "'%s'", "0x%04X");
return BT_SUCCESS;
}
int
main(int argc, char *argv[])
{
bt_init(argc, argv);
bt_test_suite(t_fletcher16_compute, "Fletcher-16 Compute Tests");
bt_test_suite(t_fletcher16_checksum, "Fletcher-16 Checksum Tests");
return bt_end();
}