ccan/crc32c: new module for accelerated CRC32 (on x86-64).
[ccan] / ccan / crc32c / test / api-crc32c.c
1 /* Test vectors from https://tools.ietf.org/html/rfc3720#appendix-B.4 */
2 #include <ccan/crc32c/crc32c.h>
3 #include <ccan/tap/tap.h>
4 #include <string.h>
5
6 #define BSWAP_32(val)                                   \
7         ((((uint32_t)(val) & 0x000000ff) << 24)         \
8          | (((uint32_t)(val) & 0x0000ff00) << 8)                \
9          | (((uint32_t)(val) & 0x00ff0000) >> 8)                \
10          | (((uint32_t)(val) & 0xff000000) >> 24))
11
12 #if HAVE_LITTLE_ENDIAN
13 #define BE32_TO_CPU(le_val) BSWAP_32((uint32_t)le_val)
14 #else
15 #define BE32_TO_CPU(le_val) ((uint32_t)(le_val))
16 #endif
17
18 int main(void)
19 {
20         unsigned char m[48];
21
22         plan_tests(5);
23
24         /* 32 bytes of zeroes:
25
26      Byte:        0  1  2  3
27
28         0:       00 00 00 00
29       ...
30        28:       00 00 00 00
31
32       CRC:       aa 36 91 8a
33         */
34
35         memset(m, 0, 32);
36         ok1(crc32c(0, m, 32) == BE32_TO_CPU(0xaa36918a));
37
38         /* 32 bytes of ones:
39
40      Byte:        0  1  2  3
41
42         0:       ff ff ff ff
43       ...
44        28:       ff ff ff ff
45
46       CRC:       43 ab a8 62
47         */
48         memset(m, 0xff, 32);
49         ok1(crc32c(0, m, 32) == BE32_TO_CPU(0x43aba862));
50
51         /* 32 bytes of incrementing 00..1f:
52
53      Byte:        0  1  2  3
54
55         0:       00 01 02 03
56       ...
57        28:       1c 1d 1e 1f
58
59       CRC:       4e 79 dd 46
60         */
61         for (size_t i = 0; i < 32; i++)
62                 m[i] = i;
63         ok1(crc32c(0, m, 32) == BE32_TO_CPU(0x4e79dd46));
64
65         /*  32 bytes of decrementing 1f..00:
66
67      Byte:        0  1  2  3
68
69         0:       1f 1e 1d 1c
70       ...
71        28:       03 02 01 00
72
73       CRC:       5c db 3f 11
74         */
75         for (size_t i = 0; i < 32; i++)
76                 m[i] = 31 - i;
77         ok1(crc32c(0, m, 32) == BE32_TO_CPU(0x5cdb3f11));
78
79         /*  An iSCSI - SCSI Read (10) Command PDU
80     Byte:        0  1  2  3
81
82        0:       01 c0 00 00
83        4:       00 00 00 00
84        8:       00 00 00 00
85       12:       00 00 00 00
86       16:       14 00 00 00
87       20:       00 00 04 00
88       24:       00 00 00 14
89       28:       00 00 00 18
90       32:       28 00 00 00
91       36:       00 00 00 00
92       40:       02 00 00 00
93       44:       00 00 00 00
94
95      CRC:       56 3a 96 d9
96         */
97         memset(m, 0, sizeof(m));
98         m[0] = 0x01;
99         m[1] = 0xc0;
100         m[16] = 0x14;
101         m[22] = 0x04;
102         m[27] = 0x14;
103         m[31] = 0x18;
104         m[32] = 0x28;
105         m[40] = 0x02;
106         ok1(crc32c(0, m, sizeof(m)) == BE32_TO_CPU(0x563a96d9));
107
108         return exit_status();
109 }