Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
ccan
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
mirror
ccan
Commits
456d1311
Commit
456d1311
authored
Feb 17, 2009
by
Rusty Russell
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added Castagnoli CRC routines, expand interface.
parent
96b6d6f1
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
266 additions
and
58 deletions
+266
-58
ccan/crc/_info.c
ccan/crc/_info.c
+5
-5
ccan/crc/crc.c
ccan/crc/crc.c
+114
-43
ccan/crc/crc.h
ccan/crc/crc.h
+70
-2
ccan/crc/test/api.c
ccan/crc/test/api.c
+77
-8
No files found.
ccan/crc/_info.c
View file @
456d1311
...
...
@@ -3,8 +3,8 @@
/**
* crc - routines for crc of bytes
*
* Cyclic Redundancy Check routines. The
y are reasonably fasts
* checksum routine, but not suitable for cryptographic use.
* Cyclic Redundancy Check routines. The
se are reasonably fast
* checksum routine
s
, but not suitable for cryptographic use.
*
* They are useful for simple error detection, eg. a 32-bit CRC will
* detect a single error burst of up to 32 bits.
...
...
@@ -21,12 +21,12 @@
* "Prints 32 bit CRC of the string\n", argv[0]);
* exit(1);
* }
* printf("0x%08x\n", crc32(argv[1], strlen(argv[1])));
* printf("0x%08x\n", crc32
c
(argv[1], strlen(argv[1])));
* exit(0);
* }
*
* Licence:
Public Domain
* Author: Gary S. Brown
* Licence:
GPL (v2 or later)
* Author: Gary S. Brown
, Clay Haapala
* Maintainer: Rusty Russell <rusty@rustcorp.com.au>
*/
int
main
(
int
argc
,
char
*
argv
[])
...
...
ccan/crc/crc.c
View file @
456d1311
/*
-
/*
crc32_ieee code:
* COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or
* code or tables extracted from it, as desired without restriction.
*
* First, the polynomial itself and its table of feedback terms. The
* polynomial is
* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0
*
* Note that we take it "backwards" and put the highest-order term in
* the lowest-order bit. The X^32 term is "implied"; the LSB is the
* X^31 term, etc. The X^0 term (usually shown as "+1") results in
* the MSB being 1
*
* Note that the usual hardware shift register implementation, which
* is what we're using (we're merely optimizing it by doing eight-bit
* chunks at a time) shifts bits into the lowest-order term. In our
* implementation, that means shifting towards the right. Why do we
* do it this way? Because the calculated CRC must be transmitted in
* order from highest-order term to lowest-order term. UARTs transmit
* characters in order from LSB to MSB. By storing the CRC this way
* we hand it to the UART in the order low-byte to high-byte; the UART
* sends each low-bit to hight-bit; and the result is transmission bit
* by bit from highest- to lowest-order term without requiring any bit
* shuffling on our part. Reception works similarly
*
* The feedback terms table consists of 256, 32-bit entries. Notes
*
* The table can be generated at runtime if desired; code to do so
* is shown later. It might not be obvious, but the feedback
* terms simply represent the results of eight shift/xor opera
* tions for all combinations of data and CRC register values
*
* The values must be right-shifted by eight bits by the "updcrc
* logic; the shift must be unsigned (bring in zeroes). On some
* hardware you could probably optimize the shift in assembler by
* using byte-swap instructions
* polynomial $edb88320
*
*
* CRC32 code derived from work by Gary S. Brown.
*/
/* crc32c code taken from 2.6.29 Linux kernel crypto/crc32c.c:
* Copyright (c) 2004 Cisco Systems, Inc.
* Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version. */
#include "crc.h"
#include <stdbool.h>
#include <stdlib.h>
static
const
uint32_t
crc32_tab
[]
=
{
/*
* This is the CRC-32C table
* Generated with:
* width = 32 bits
* poly = 0x1EDC6F41
* reflect input bytes = true
* reflect output bytes = true
*/
static
const
uint32_t
crc32c_tab
[]
=
{
0x00000000
,
0xF26B8303
,
0xE13B70F7
,
0x1350F3F4
,
0xC79A971F
,
0x35F1141C
,
0x26A1E7E8
,
0xD4CA64EB
,
0x8AD958CF
,
0x78B2DBCC
,
0x6BE22838
,
0x9989AB3B
,
0x4D43CFD0
,
0xBF284CD3
,
0xAC78BF27
,
0x5E133C24
,
0x105EC76F
,
0xE235446C
,
0xF165B798
,
0x030E349B
,
0xD7C45070
,
0x25AFD373
,
0x36FF2087
,
0xC494A384
,
0x9A879FA0
,
0x68EC1CA3
,
0x7BBCEF57
,
0x89D76C54
,
0x5D1D08BF
,
0xAF768BBC
,
0xBC267848
,
0x4E4DFB4B
,
0x20BD8EDE
,
0xD2D60DDD
,
0xC186FE29
,
0x33ED7D2A
,
0xE72719C1
,
0x154C9AC2
,
0x061C6936
,
0xF477EA35
,
0xAA64D611
,
0x580F5512
,
0x4B5FA6E6
,
0xB93425E5
,
0x6DFE410E
,
0x9F95C20D
,
0x8CC531F9
,
0x7EAEB2FA
,
0x30E349B1
,
0xC288CAB2
,
0xD1D83946
,
0x23B3BA45
,
0xF779DEAE
,
0x05125DAD
,
0x1642AE59
,
0xE4292D5A
,
0xBA3A117E
,
0x4851927D
,
0x5B016189
,
0xA96AE28A
,
0x7DA08661
,
0x8FCB0562
,
0x9C9BF696
,
0x6EF07595
,
0x417B1DBC
,
0xB3109EBF
,
0xA0406D4B
,
0x522BEE48
,
0x86E18AA3
,
0x748A09A0
,
0x67DAFA54
,
0x95B17957
,
0xCBA24573
,
0x39C9C670
,
0x2A993584
,
0xD8F2B687
,
0x0C38D26C
,
0xFE53516F
,
0xED03A29B
,
0x1F682198
,
0x5125DAD3
,
0xA34E59D0
,
0xB01EAA24
,
0x42752927
,
0x96BF4DCC
,
0x64D4CECF
,
0x77843D3B
,
0x85EFBE38
,
0xDBFC821C
,
0x2997011F
,
0x3AC7F2EB
,
0xC8AC71E8
,
0x1C661503
,
0xEE0D9600
,
0xFD5D65F4
,
0x0F36E6F7
,
0x61C69362
,
0x93AD1061
,
0x80FDE395
,
0x72966096
,
0xA65C047D
,
0x5437877E
,
0x4767748A
,
0xB50CF789
,
0xEB1FCBAD
,
0x197448AE
,
0x0A24BB5A
,
0xF84F3859
,
0x2C855CB2
,
0xDEEEDFB1
,
0xCDBE2C45
,
0x3FD5AF46
,
0x7198540D
,
0x83F3D70E
,
0x90A324FA
,
0x62C8A7F9
,
0xB602C312
,
0x44694011
,
0x5739B3E5
,
0xA55230E6
,
0xFB410CC2
,
0x092A8FC1
,
0x1A7A7C35
,
0xE811FF36
,
0x3CDB9BDD
,
0xCEB018DE
,
0xDDE0EB2A
,
0x2F8B6829
,
0x82F63B78
,
0x709DB87B
,
0x63CD4B8F
,
0x91A6C88C
,
0x456CAC67
,
0xB7072F64
,
0xA457DC90
,
0x563C5F93
,
0x082F63B7
,
0xFA44E0B4
,
0xE9141340
,
0x1B7F9043
,
0xCFB5F4A8
,
0x3DDE77AB
,
0x2E8E845F
,
0xDCE5075C
,
0x92A8FC17
,
0x60C37F14
,
0x73938CE0
,
0x81F80FE3
,
0x55326B08
,
0xA759E80B
,
0xB4091BFF
,
0x466298FC
,
0x1871A4D8
,
0xEA1A27DB
,
0xF94AD42F
,
0x0B21572C
,
0xDFEB33C7
,
0x2D80B0C4
,
0x3ED04330
,
0xCCBBC033
,
0xA24BB5A6
,
0x502036A5
,
0x4370C551
,
0xB11B4652
,
0x65D122B9
,
0x97BAA1BA
,
0x84EA524E
,
0x7681D14D
,
0x2892ED69
,
0xDAF96E6A
,
0xC9A99D9E
,
0x3BC21E9D
,
0xEF087A76
,
0x1D63F975
,
0x0E330A81
,
0xFC588982
,
0xB21572C9
,
0x407EF1CA
,
0x532E023E
,
0xA145813D
,
0x758FE5D6
,
0x87E466D5
,
0x94B49521
,
0x66DF1622
,
0x38CC2A06
,
0xCAA7A905
,
0xD9F75AF1
,
0x2B9CD9F2
,
0xFF56BD19
,
0x0D3D3E1A
,
0x1E6DCDEE
,
0xEC064EED
,
0xC38D26C4
,
0x31E6A5C7
,
0x22B65633
,
0xD0DDD530
,
0x0417B1DB
,
0xF67C32D8
,
0xE52CC12C
,
0x1747422F
,
0x49547E0B
,
0xBB3FFD08
,
0xA86F0EFC
,
0x5A048DFF
,
0x8ECEE914
,
0x7CA56A17
,
0x6FF599E3
,
0x9D9E1AE0
,
0xD3D3E1AB
,
0x21B862A8
,
0x32E8915C
,
0xC083125F
,
0x144976B4
,
0xE622F5B7
,
0xF5720643
,
0x07198540
,
0x590AB964
,
0xAB613A67
,
0xB831C993
,
0x4A5A4A90
,
0x9E902E7B
,
0x6CFBAD78
,
0x7FAB5E8C
,
0x8DC0DD8F
,
0xE330A81A
,
0x115B2B19
,
0x020BD8ED
,
0xF0605BEE
,
0x24AA3F05
,
0xD6C1BC06
,
0xC5914FF2
,
0x37FACCF1
,
0x69E9F0D5
,
0x9B8273D6
,
0x88D28022
,
0x7AB90321
,
0xAE7367CA
,
0x5C18E4C9
,
0x4F48173D
,
0xBD23943E
,
0xF36E6F75
,
0x0105EC76
,
0x12551F82
,
0xE03E9C81
,
0x34F4F86A
,
0xC69F7B69
,
0xD5CF889D
,
0x27A40B9E
,
0x79B737BA
,
0x8BDCB4B9
,
0x988C474D
,
0x6AE7C44E
,
0xBE2DA0A5
,
0x4C4623A6
,
0x5F16D052
,
0xAD7D5351
};
/*
* Steps through buffer one byte at at time, calculates reflected
* crc using table.
*/
uint32_t
crc32c
(
uint32_t
crc
,
const
void
*
buf
,
size_t
size
)
{
const
uint8_t
*
p
=
buf
;
while
(
size
--
)
crc
=
crc32c_tab
[(
crc
^
*
p
++
)
&
0xFFL
]
^
(
crc
>>
8
);
return
crc
;
}
const
uint32_t
*
crc32c_table
(
void
)
{
return
crc32c_tab
;
}
static
const
uint32_t
crc32_ieee_tab
[]
=
{
0x00000000
,
0x77073096
,
0xee0e612c
,
0x990951ba
,
0x076dc419
,
0x706af48f
,
0xe963a535
,
0x9e6495a3
,
0x0edb8832
,
0x79dcb8a4
,
0xe0d5e91e
,
0x97d2d988
,
0x09b64c2b
,
0x7eb17cbd
,
0xe7b82d07
,
0x90bf1d91
,
0x1db71064
,
0x6ab020f2
,
...
...
@@ -89,16 +156,20 @@ static const uint32_t crc32_tab[] = {
0xb40bbe37
,
0xc30c8ea1
,
0x5a05df1b
,
0x2d02ef8d
};
uint32_t
crc32
(
const
void
*
buf
,
size_t
size
)
uint32_t
crc32
_ieee
(
uint32_t
crc
,
const
void
*
buf
,
size_t
size
)
{
const
uint8_t
*
p
;
uint32_t
crc
;
p
=
buf
;
crc
=
~
0U
;
crc
^
=
~
0U
;
while
(
size
--
)
crc
=
crc32_tab
[(
crc
^
*
p
++
)
&
0xFF
]
^
(
crc
>>
8
);
crc
=
crc32_
ieee_
tab
[(
crc
^
*
p
++
)
&
0xFF
]
^
(
crc
>>
8
);
return
crc
^
~
0U
;
}
const
uint32_t
*
crc32_ieee_table
(
void
)
{
return
crc32_ieee_tab
;
}
ccan/crc/crc.h
View file @
456d1311
...
...
@@ -4,12 +4,80 @@
#include <stdlib.h>
/**
* crc32 - 32 bit crc of string of bytes
* crc32c - Castagnoli 32 bit crc of string of bytes
* @start_crc: the initial crc (usually 0)
* @buf: pointer to bytes
* @size: length of buffer
*
* If you don't know what crc32 to use, use this one: it's the best.
*
* @Article{castagnoli-crc,
* author = { Guy Castagnoli and Stefan Braeuer and Martin Herrman},
* title = {{Optimization of Cyclic Redundancy-Check Codes with 24
* and 32 Parity Bits}},
* journal = IEEE Transactions on Communication,
* year = {1993},
* volume = {41},
* number = {6},
* pages = {},
* month = {June},
*}
* 32 bit CRC checksum using polynomial
* X^32+X^28+X^27+X^26+X^25+X^23+X^22+X^20+X^19+X^18+X^14+X^13+X^11+X^10+X^9+X^8+X^6+X^0.
*
* You can calculate the CRC of non-contiguous arrays by passing @start_crc
* as 0 the first time, and the current crc result from then on.
*
* Example:
* // Check that iovec has the crc we expect (Castagnoli version)
* bool check_crc(uint32_t expected, const struct iovec *iov, int iovcnt)
* {
* uint32_t crc = 0;
* while (iovcnt >= 0) {
* crc = crc32c(crc, iov->iov_base, iov->iov_len);
* iov++;
* }
* return crc == expected;
* }
*/
uint32_t
crc32c
(
uint32_t
start_crc
,
const
void
*
buf
,
size_t
size
);
/**
* crc32c_table - Get the Castagnoli CRC table
*
* For special effects, you might want direct access to the table; this is
* the standard 256-entry table for this algorithm.
*
* In theory, this might need to malloc(), and thus return NULL.
*
* Example:
* // This dumb code only handles Castagnoli, so assert that here.
* void check_user_crc_table(const uint32_t *usertab)
* {
* const uint32_t *ctab = crc32c_table();
* if (!ieee_tab || memcmp(ieee_tab, usertab, 1024) != 0)
* abort();
* }
*/
const
uint32_t
*
crc32c_table
(
void
);
/**
* crc32_ieee - IEEE 802.3 32 bit crc of string of bytes
* @start_crc: the initial crc (usually 0)
* @buf: pointer to bytes
* @size: length of buffer
*
* 32 bit CRC checksum using polynomial
* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0.
*
* See crc32c() for details.
*/
uint32_t
crc32_ieee
(
uint32_t
start_crc
,
const
void
*
buf
,
size_t
size
);
/**
* crc32_ieee_table - Get the IEEE 802.3 CRC table
*
* See crc32c_table() for details.
*/
uint32_t
crc32
(
const
void
*
buf
,
size_t
size
);
const
uint32_t
*
crc32_ieee_table
(
void
);
#endif
/* CCAN_CRC_H */
ccan/crc/test/api.c
View file @
456d1311
...
...
@@ -4,7 +4,57 @@
#include <string.h>
/* Expected CRCs of 4 of each char. */
static
uint32_t
crc_expect
[]
=
{
static
uint32_t
crcc_expect
[]
=
{
0x00000000
,
0x99cd23b2
,
0x36763195
,
0xafbb1227
,
0x6cec632a
,
0xf5214098
,
0x5a9a52bf
,
0xc357710d
,
0xd9d8c654
,
0x4015e5e6
,
0xefaef7c1
,
0x7663d473
,
0xb534a57e
,
0x2cf986cc
,
0x834294eb
,
0x1a8fb759
,
0xb65dfa59
,
0x2f90d9eb
,
0x802bcbcc
,
0x19e6e87e
,
0xdab19973
,
0x437cbac1
,
0xecc7a8e6
,
0x750a8b54
,
0x6f853c0d
,
0xf6481fbf
,
0x59f30d98
,
0xc03e2e2a
,
0x03695f27
,
0x9aa47c95
,
0x351f6eb2
,
0xacd24d00
,
0x69578243
,
0xf09aa1f1
,
0x5f21b3d6
,
0xc6ec9064
,
0x05bbe169
,
0x9c76c2db
,
0x33cdd0fc
,
0xaa00f34e
,
0xb08f4417
,
0x294267a5
,
0x86f97582
,
0x1f345630
,
0xdc63273d
,
0x45ae048f
,
0xea1516a8
,
0x73d8351a
,
0xdf0a781a
,
0x46c75ba8
,
0xe97c498f
,
0x70b16a3d
,
0xb3e61b30
,
0x2a2b3882
,
0x85902aa5
,
0x1c5d0917
,
0x06d2be4e
,
0x9f1f9dfc
,
0x30a48fdb
,
0xa969ac69
,
0x6a3edd64
,
0xf3f3fed6
,
0x5c48ecf1
,
0xc585cf43
,
0xd2af0486
,
0x4b622734
,
0xe4d93513
,
0x7d1416a1
,
0xbe4367ac
,
0x278e441e
,
0x88355639
,
0x11f8758b
,
0x0b77c2d2
,
0x92bae160
,
0x3d01f347
,
0xa4ccd0f5
,
0x679ba1f8
,
0xfe56824a
,
0x51ed906d
,
0xc820b3df
,
0x64f2fedf
,
0xfd3fdd6d
,
0x5284cf4a
,
0xcb49ecf8
,
0x081e9df5
,
0x91d3be47
,
0x3e68ac60
,
0xa7a58fd2
,
0xbd2a388b
,
0x24e71b39
,
0x8b5c091e
,
0x12912aac
,
0xd1c65ba1
,
0x480b7813
,
0xe7b06a34
,
0x7e7d4986
,
0xbbf886c5
,
0x2235a577
,
0x8d8eb750
,
0x144394e2
,
0xd714e5ef
,
0x4ed9c65d
,
0xe162d47a
,
0x78aff7c8
,
0x62204091
,
0xfbed6323
,
0x54567104
,
0xcd9b52b6
,
0x0ecc23bb
,
0x97010009
,
0x38ba122e
,
0xa177319c
,
0x0da57c9c
,
0x94685f2e
,
0x3bd34d09
,
0xa21e6ebb
,
0x61491fb6
,
0xf8843c04
,
0x573f2e23
,
0xcef20d91
,
0xd47dbac8
,
0x4db0997a
,
0xe20b8b5d
,
0x7bc6a8ef
,
0xb891d9e2
,
0x215cfa50
,
0x8ee7e877
,
0x172acbc5
,
0xa0b27ffd
,
0x397f5c4f
,
0x96c44e68
,
0x0f096dda
,
0xcc5e1cd7
,
0x55933f65
,
0xfa282d42
,
0x63e50ef0
,
0x796ab9a9
,
0xe0a79a1b
,
0x4f1c883c
,
0xd6d1ab8e
,
0x1586da83
,
0x8c4bf931
,
0x23f0eb16
,
0xba3dc8a4
,
0x16ef85a4
,
0x8f22a616
,
0x2099b431
,
0xb9549783
,
0x7a03e68e
,
0xe3cec53c
,
0x4c75d71b
,
0xd5b8f4a9
,
0xcf3743f0
,
0x56fa6042
,
0xf9417265
,
0x608c51d7
,
0xa3db20da
,
0x3a160368
,
0x95ad114f
,
0x0c6032fd
,
0xc9e5fdbe
,
0x5028de0c
,
0xff93cc2b
,
0x665eef99
,
0xa5099e94
,
0x3cc4bd26
,
0x937faf01
,
0x0ab28cb3
,
0x103d3bea
,
0x89f01858
,
0x264b0a7f
,
0xbf8629cd
,
0x7cd158c0
,
0xe51c7b72
,
0x4aa76955
,
0xd36a4ae7
,
0x7fb807e7
,
0xe6752455
,
0x49ce3672
,
0xd00315c0
,
0x135464cd
,
0x8a99477f
,
0x25225558
,
0xbcef76ea
,
0xa660c1b3
,
0x3fade201
,
0x9016f026
,
0x09dbd394
,
0xca8ca299
,
0x5341812b
,
0xfcfa930c
,
0x6537b0be
,
0x721d7b7b
,
0xebd058c9
,
0x446b4aee
,
0xdda6695c
,
0x1ef11851
,
0x873c3be3
,
0x288729c4
,
0xb14a0a76
,
0xabc5bd2f
,
0x32089e9d
,
0x9db38cba
,
0x047eaf08
,
0xc729de05
,
0x5ee4fdb7
,
0xf15fef90
,
0x6892cc22
,
0xc4408122
,
0x5d8da290
,
0xf236b0b7
,
0x6bfb9305
,
0xa8ace208
,
0x3161c1ba
,
0x9edad39d
,
0x0717f02f
,
0x1d984776
,
0x845564c4
,
0x2bee76e3
,
0xb2235551
,
0x7174245c
,
0xe8b907ee
,
0x470215c9
,
0xdecf367b
,
0x1b4af938
,
0x8287da8a
,
0x2d3cc8ad
,
0xb4f1eb1f
,
0x77a69a12
,
0xee6bb9a0
,
0x41d0ab87
,
0xd81d8835
,
0xc2923f6c
,
0x5b5f1cde
,
0xf4e40ef9
,
0x6d292d4b
,
0xae7e5c46
,
0x37b37ff4
,
0x98086dd3
,
0x01c54e61
,
0xad170361
,
0x34da20d3
,
0x9b6132f4
,
0x02ac1146
,
0xc1fb604b
,
0x583643f9
,
0xf78d51de
,
0x6e40726c
,
0x74cfc535
,
0xed02e687
,
0x42b9f4a0
,
0xdb74d712
,
0x1823a61f
,
0x81ee85ad
,
0x2e55978a
,
0xb798b438
};
static
uint32_t
crcc_zero_expect
[]
=
{
0x00000000
,
0x00000000
,
0x00000000
,
0x00000000
,
};
static
uint32_t
crc_ieee_expect
[]
=
{
0x2144df1c
,
0xf626d399
,
0x54f1c057
,
0x8393ccd2
,
0xca2ee18a
,
0x1d4ced0f
,
0xbf9bfec1
,
0x68f9f244
,
0x2ce1a471
,
0xfb83a8f4
,
0x5954bb3a
,
0x8e36b7bf
,
0xc78b9ae7
,
0x10e99662
,
0xb23e85ac
,
0x655c8929
,
0x3a0e29c6
,
0xed6c2543
,
...
...
@@ -50,20 +100,39 @@ static uint32_t crc_expect[] = {
0x5d28ec31
,
0x8a4ae0b4
,
0x289df37a
,
0xffffffff
,
};
int
main
(
int
argc
,
char
*
argv
[])
static
uint32_t
crc_ieee_zero_expect
[]
=
{
0x00000000
,
0xd202ef8d
,
0x41d912ff
,
0xff41d912
};
/* Runs 517 tests. */
static
void
test_crc32
(
uint32_t
(
*
crc
)(
uint32_t
,
const
void
*
,
size_t
),
const
uint32_t
*
(
*
crc_table
)(
void
),
const
uint32_t
zero_expect
[
4
],
const
uint32_t
four_char_expect
[
256
],
const
uint32_t
*
table_expect
)
{
unsigned
int
i
;
char
c
[
4
]
=
{
0
};
plan_tests
(
260
);
ok1
(
crc32
(
c
,
0
)
==
0x00000000
);
ok1
(
crc32
(
c
,
1
)
==
0xd202ef8d
);
ok1
(
crc32
(
c
,
2
)
==
0x41d912ff
);
ok1
(
crc32
(
c
,
3
)
==
0xff41d912
);
for
(
i
=
0
;
i
<
4
;
i
++
)
ok1
(
crc
(
0
,
c
,
i
)
==
zero_expect
[
i
]);
for
(
i
=
0
;
i
<
256
;
i
++
)
{
memset
(
c
,
i
,
sizeof
(
c
));
ok1
(
crc32
(
c
,
sizeof
(
c
))
==
crc_expect
[
i
]);
ok1
(
crc
(
0
,
c
,
sizeof
(
c
))
==
four_char_expect
[
i
]);
/* CRC in two parts should give same answer. */
ok1
(
crc
(
crc
(
0
,
c
,
i
%
5
),
c
+
i
%
5
,
4
-
(
i
%
5
))
==
four_char_expect
[
i
]);
}
ok1
(
memcmp
(
crc_table
(),
table_expect
,
1024
)
==
0
);
}
int
main
(
int
argc
,
char
*
argv
[])
{
plan_tests
(
517
*
2
);
test_crc32
(
crc32c
,
crc32c_table
,
crcc_zero_expect
,
crcc_expect
,
crc32c_tab
);
test_crc32
(
crc32_ieee
,
crc32_ieee_table
,
crc_ieee_zero_expect
,
crc_ieee_expect
,
crc32_ieee_tab
);
return
exit_status
();
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment