aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorMaria Matejka <mq@jmq.cz>2020-04-05 01:12:06 +0200
committerMaria Matejka <mq@jmq.cz>2020-04-05 01:15:26 +0200
commit2928c5bcc7c3caaeb6de34a84ca63de9a12e1f1a (patch)
tree9e4f21e2f759846332bc6d7e305e90aca031b183 /lib
parentc9d11e6230c49cdfd1f17829be0e877aba05e90b (diff)
downloadbird-2928c5bcc7c3caaeb6de34a84ca63de9a12e1f1a.tar.gz
Fletcher16 test fixed to work at bigendian architectures.
To be honest, it was wrong in concept, anyway it accidentally worked.
Diffstat (limited to 'lib')
-rw-r--r--lib/fletcher16_test.c31
1 files changed, 21 insertions, 10 deletions
diff --git a/lib/fletcher16_test.c b/lib/fletcher16_test.c
index 1020e6ec..3cd4c302 100644
--- a/lib/fletcher16_test.c
+++ b/lib/fletcher16_test.c
@@ -24,24 +24,33 @@ straightforward_fletcher16_compute(const char *data)
sum2 = (sum2 + sum1) % 255;
}
- return (sum2 << 8) | sum1;
+ sum2 = (sum2 + sum1) % 255;
+ sum2 = (sum2 + sum1) % 255;
+
+ return (sum1 << 8) | sum2;
}
static u16
straightforward_fletcher16_checksum(const char *data)
{
u16 csum;
- u8 c0,c1,f0,f1;
+ u16 c0,c1,x,y;
csum = straightforward_fletcher16_compute(data);
- f0 = csum & 0xff;
- f1 = (csum >> 8) & 0xff;
- c0 = 0xff - ((f0 + f1) % 0xff);
- c1 = 0xff - ((f0 + c0) % 0xff);
+ c0 = (csum >> 8) & 0xff;
+ c1 = csum & 0xff;
+
+ x = (255 + c0 - c1) % 255;
+ y = (510 - 2*c0 + c1) % 255;
- return (c1 << 8) | c0;
+ if (!x) x = 255;
+ if (!y) y = 255;
+
+ return (x << 8) | y;
}
+const u8 zero16[2] = {};
+
static int
test_fletcher16(void *out_, const void *in_, const void *expected_out_)
{
@@ -53,7 +62,8 @@ test_fletcher16(void *out_, const void *in_, const void *expected_out_)
fletcher16_init(&ctxt);
fletcher16_update(&ctxt, in, strlen(in));
- put_u16(out, fletcher16_compute(&ctxt));
+ fletcher16_update(&ctxt, zero16, 2);
+ *out = fletcher16_compute(&ctxt);
return *out == *expected_out;
}
@@ -70,7 +80,8 @@ test_fletcher16_checksum(void *out_, const void *in_, const void *expected_out_)
fletcher16_init(&ctxt);
fletcher16_update(&ctxt, in, len);
- put_u16(out, fletcher16_final(&ctxt, len, len));
+ fletcher16_update(&ctxt, zero16, 2);
+ *out = fletcher16_final(&ctxt, len+2, len);
return *out == *expected_out;
}
@@ -81,7 +92,7 @@ t_fletcher16_compute(void)
struct bt_pair test_vectors[] = {
{
.in = "\001\002",
- .out = & (const u16) { 0x0403 },
+ .out = & ((const u16) { straightforward_fletcher16_compute("\001\002") }),
},
{
.in = "",