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
96b6d6f1
Commit
96b6d6f1
authored
Feb 14, 2009
by
Rusty Russell
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
CRC module.
parent
7eb00644
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
230 additions
and
0 deletions
+230
-0
ccan/crc/_info.c
ccan/crc/_info.c
+42
-0
ccan/crc/crc.c
ccan/crc/crc.c
+104
-0
ccan/crc/crc.h
ccan/crc/crc.h
+15
-0
ccan/crc/test/api.c
ccan/crc/test/api.c
+69
-0
No files found.
ccan/crc/_info.c
0 → 100644
View file @
96b6d6f1
#include <string.h>
/**
* crc - routines for crc of bytes
*
* Cyclic Redundancy Check routines. They are reasonably fasts
* checksum routine, 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.
*
* Example:
* #include <ccan/crc.h>
* #include <stdio.h>
* #include <stdlib.h>
*
* int main(int argc, char *argv[])
* {
* if (argc != 2) {
* fprintf(stderr, "Usage: %s <string>\n"
* "Prints 32 bit CRC of the string\n", argv[0]);
* exit(1);
* }
* printf("0x%08x\n", crc32(argv[1], strlen(argv[1])));
* exit(0);
* }
*
* Licence: Public Domain
* Author: Gary S. Brown
* Maintainer: Rusty Russell <rusty@rustcorp.com.au>
*/
int
main
(
int
argc
,
char
*
argv
[])
{
if
(
argc
!=
2
)
return
1
;
if
(
strcmp
(
argv
[
1
],
"depends"
)
==
0
)
{
return
0
;
}
return
1
;
}
ccan/crc/crc.c
0 → 100644
View file @
96b6d6f1
/*-
* 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.
*/
#include "crc.h"
#include <stdbool.h>
#include <stdlib.h>
static
const
uint32_t
crc32_tab
[]
=
{
0x00000000
,
0x77073096
,
0xee0e612c
,
0x990951ba
,
0x076dc419
,
0x706af48f
,
0xe963a535
,
0x9e6495a3
,
0x0edb8832
,
0x79dcb8a4
,
0xe0d5e91e
,
0x97d2d988
,
0x09b64c2b
,
0x7eb17cbd
,
0xe7b82d07
,
0x90bf1d91
,
0x1db71064
,
0x6ab020f2
,
0xf3b97148
,
0x84be41de
,
0x1adad47d
,
0x6ddde4eb
,
0xf4d4b551
,
0x83d385c7
,
0x136c9856
,
0x646ba8c0
,
0xfd62f97a
,
0x8a65c9ec
,
0x14015c4f
,
0x63066cd9
,
0xfa0f3d63
,
0x8d080df5
,
0x3b6e20c8
,
0x4c69105e
,
0xd56041e4
,
0xa2677172
,
0x3c03e4d1
,
0x4b04d447
,
0xd20d85fd
,
0xa50ab56b
,
0x35b5a8fa
,
0x42b2986c
,
0xdbbbc9d6
,
0xacbcf940
,
0x32d86ce3
,
0x45df5c75
,
0xdcd60dcf
,
0xabd13d59
,
0x26d930ac
,
0x51de003a
,
0xc8d75180
,
0xbfd06116
,
0x21b4f4b5
,
0x56b3c423
,
0xcfba9599
,
0xb8bda50f
,
0x2802b89e
,
0x5f058808
,
0xc60cd9b2
,
0xb10be924
,
0x2f6f7c87
,
0x58684c11
,
0xc1611dab
,
0xb6662d3d
,
0x76dc4190
,
0x01db7106
,
0x98d220bc
,
0xefd5102a
,
0x71b18589
,
0x06b6b51f
,
0x9fbfe4a5
,
0xe8b8d433
,
0x7807c9a2
,
0x0f00f934
,
0x9609a88e
,
0xe10e9818
,
0x7f6a0dbb
,
0x086d3d2d
,
0x91646c97
,
0xe6635c01
,
0x6b6b51f4
,
0x1c6c6162
,
0x856530d8
,
0xf262004e
,
0x6c0695ed
,
0x1b01a57b
,
0x8208f4c1
,
0xf50fc457
,
0x65b0d9c6
,
0x12b7e950
,
0x8bbeb8ea
,
0xfcb9887c
,
0x62dd1ddf
,
0x15da2d49
,
0x8cd37cf3
,
0xfbd44c65
,
0x4db26158
,
0x3ab551ce
,
0xa3bc0074
,
0xd4bb30e2
,
0x4adfa541
,
0x3dd895d7
,
0xa4d1c46d
,
0xd3d6f4fb
,
0x4369e96a
,
0x346ed9fc
,
0xad678846
,
0xda60b8d0
,
0x44042d73
,
0x33031de5
,
0xaa0a4c5f
,
0xdd0d7cc9
,
0x5005713c
,
0x270241aa
,
0xbe0b1010
,
0xc90c2086
,
0x5768b525
,
0x206f85b3
,
0xb966d409
,
0xce61e49f
,
0x5edef90e
,
0x29d9c998
,
0xb0d09822
,
0xc7d7a8b4
,
0x59b33d17
,
0x2eb40d81
,
0xb7bd5c3b
,
0xc0ba6cad
,
0xedb88320
,
0x9abfb3b6
,
0x03b6e20c
,
0x74b1d29a
,
0xead54739
,
0x9dd277af
,
0x04db2615
,
0x73dc1683
,
0xe3630b12
,
0x94643b84
,
0x0d6d6a3e
,
0x7a6a5aa8
,
0xe40ecf0b
,
0x9309ff9d
,
0x0a00ae27
,
0x7d079eb1
,
0xf00f9344
,
0x8708a3d2
,
0x1e01f268
,
0x6906c2fe
,
0xf762575d
,
0x806567cb
,
0x196c3671
,
0x6e6b06e7
,
0xfed41b76
,
0x89d32be0
,
0x10da7a5a
,
0x67dd4acc
,
0xf9b9df6f
,
0x8ebeeff9
,
0x17b7be43
,
0x60b08ed5
,
0xd6d6a3e8
,
0xa1d1937e
,
0x38d8c2c4
,
0x4fdff252
,
0xd1bb67f1
,
0xa6bc5767
,
0x3fb506dd
,
0x48b2364b
,
0xd80d2bda
,
0xaf0a1b4c
,
0x36034af6
,
0x41047a60
,
0xdf60efc3
,
0xa867df55
,
0x316e8eef
,
0x4669be79
,
0xcb61b38c
,
0xbc66831a
,
0x256fd2a0
,
0x5268e236
,
0xcc0c7795
,
0xbb0b4703
,
0x220216b9
,
0x5505262f
,
0xc5ba3bbe
,
0xb2bd0b28
,
0x2bb45a92
,
0x5cb36a04
,
0xc2d7ffa7
,
0xb5d0cf31
,
0x2cd99e8b
,
0x5bdeae1d
,
0x9b64c2b0
,
0xec63f226
,
0x756aa39c
,
0x026d930a
,
0x9c0906a9
,
0xeb0e363f
,
0x72076785
,
0x05005713
,
0x95bf4a82
,
0xe2b87a14
,
0x7bb12bae
,
0x0cb61b38
,
0x92d28e9b
,
0xe5d5be0d
,
0x7cdcefb7
,
0x0bdbdf21
,
0x86d3d2d4
,
0xf1d4e242
,
0x68ddb3f8
,
0x1fda836e
,
0x81be16cd
,
0xf6b9265b
,
0x6fb077e1
,
0x18b74777
,
0x88085ae6
,
0xff0f6a70
,
0x66063bca
,
0x11010b5c
,
0x8f659eff
,
0xf862ae69
,
0x616bffd3
,
0x166ccf45
,
0xa00ae278
,
0xd70dd2ee
,
0x4e048354
,
0x3903b3c2
,
0xa7672661
,
0xd06016f7
,
0x4969474d
,
0x3e6e77db
,
0xaed16a4a
,
0xd9d65adc
,
0x40df0b66
,
0x37d83bf0
,
0xa9bcae53
,
0xdebb9ec5
,
0x47b2cf7f
,
0x30b5ffe9
,
0xbdbdf21c
,
0xcabac28a
,
0x53b39330
,
0x24b4a3a6
,
0xbad03605
,
0xcdd70693
,
0x54de5729
,
0x23d967bf
,
0xb3667a2e
,
0xc4614ab8
,
0x5d681b02
,
0x2a6f2b94
,
0xb40bbe37
,
0xc30c8ea1
,
0x5a05df1b
,
0x2d02ef8d
};
uint32_t
crc32
(
const
void
*
buf
,
size_t
size
)
{
const
uint8_t
*
p
;
uint32_t
crc
;
p
=
buf
;
crc
=
~
0U
;
while
(
size
--
)
crc
=
crc32_tab
[(
crc
^
*
p
++
)
&
0xFF
]
^
(
crc
>>
8
);
return
crc
^
~
0U
;
}
ccan/crc/crc.h
0 → 100644
View file @
96b6d6f1
#ifndef CCAN_CRC_H
#define CCAN_CRC_H
#include <stdint.h>
#include <stdlib.h>
/**
* crc32 - 32 bit crc of string of bytes
* @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.
*/
uint32_t
crc32
(
const
void
*
buf
,
size_t
size
);
#endif
/* CCAN_CRC_H */
ccan/crc/test/api.c
0 → 100644
View file @
96b6d6f1
#include "crc/crc.h"
#include "crc/crc.c"
#include "tap/tap.h"
#include <string.h>
/* Expected CRCs of 4 of each char. */
static
uint32_t
crc_expect
[]
=
{
0x2144df1c
,
0xf626d399
,
0x54f1c057
,
0x8393ccd2
,
0xca2ee18a
,
0x1d4ced0f
,
0xbf9bfec1
,
0x68f9f244
,
0x2ce1a471
,
0xfb83a8f4
,
0x5954bb3a
,
0x8e36b7bf
,
0xc78b9ae7
,
0x10e99662
,
0xb23e85ac
,
0x655c8929
,
0x3a0e29c6
,
0xed6c2543
,
0x4fbb368d
,
0x98d93a08
,
0xd1641750
,
0x06061bd5
,
0xa4d1081b
,
0x73b3049e
,
0x37ab52ab
,
0xe0c95e2e
,
0x421e4de0
,
0x957c4165
,
0xdcc16c3d
,
0x0ba360b8
,
0xa9747376
,
0x7e167ff3
,
0x17d132a8
,
0xc0b33e2d
,
0x62642de3
,
0xb5062166
,
0xfcbb0c3e
,
0x2bd900bb
,
0x890e1375
,
0x5e6c1ff0
,
0x1a7449c5
,
0xcd164540
,
0x6fc1568e
,
0xb8a35a0b
,
0xf11e7753
,
0x267c7bd6
,
0x84ab6818
,
0x53c9649d
,
0x0c9bc472
,
0xdbf9c8f7
,
0x792edb39
,
0xae4cd7bc
,
0xe7f1fae4
,
0x3093f661
,
0x9244e5af
,
0x4526e92a
,
0x013ebf1f
,
0xd65cb39a
,
0x748ba054
,
0xa3e9acd1
,
0xea548189
,
0x3d368d0c
,
0x9fe19ec2
,
0x48839247
,
0x4c6f0474
,
0x9b0d08f1
,
0x39da1b3f
,
0xeeb817ba
,
0xa7053ae2
,
0x70673667
,
0xd2b025a9
,
0x05d2292c
,
0x41ca7f19
,
0x96a8739c
,
0x347f6052
,
0xe31d6cd7
,
0xaaa0418f
,
0x7dc24d0a
,
0xdf155ec4
,
0x08775241
,
0x5725f2ae
,
0x8047fe2b
,
0x2290ede5
,
0xf5f2e160
,
0xbc4fcc38
,
0x6b2dc0bd
,
0xc9fad373
,
0x1e98dff6
,
0x5a8089c3
,
0x8de28546
,
0x2f359688
,
0xf8579a0d
,
0xb1eab755
,
0x6688bbd0
,
0xc45fa81e
,
0x133da49b
,
0x7afae9c0
,
0xad98e545
,
0x0f4ff68b
,
0xd82dfa0e
,
0x9190d756
,
0x46f2dbd3
,
0xe425c81d
,
0x3347c498
,
0x775f92ad
,
0xa03d9e28
,
0x02ea8de6
,
0xd5888163
,
0x9c35ac3b
,
0x4b57a0be
,
0xe980b370
,
0x3ee2bff5
,
0x61b01f1a
,
0xb6d2139f
,
0x14050051
,
0xc3670cd4
,
0x8ada218c
,
0x5db82d09
,
0xff6f3ec7
,
0x280d3242
,
0x6c156477
,
0xbb7768f2
,
0x19a07b3c
,
0xcec277b9
,
0x877f5ae1
,
0x501d5664
,
0xf2ca45aa
,
0x25a8492f
,
0xfb1369cc
,
0x2c716549
,
0x8ea67687
,
0x59c47a02
,
0x1079575a
,
0xc71b5bdf
,
0x65cc4811
,
0xb2ae4494
,
0xf6b612a1
,
0x21d41e24
,
0x83030dea
,
0x5461016f
,
0x1ddc2c37
,
0xcabe20b2
,
0x6869337c
,
0xbf0b3ff9
,
0xe0599f16
,
0x373b9393
,
0x95ec805d
,
0x428e8cd8
,
0x0b33a180
,
0xdc51ad05
,
0x7e86becb
,
0xa9e4b24e
,
0xedfce47b
,
0x3a9ee8fe
,
0x9849fb30
,
0x4f2bf7b5
,
0x0696daed
,
0xd1f4d668
,
0x7323c5a6
,
0xa441c923
,
0xcd868478
,
0x1ae488fd
,
0xb8339b33
,
0x6f5197b6
,
0x26ecbaee
,
0xf18eb66b
,
0x5359a5a5
,
0x843ba920
,
0xc023ff15
,
0x1741f390
,
0xb596e05e
,
0x62f4ecdb
,
0x2b49c183
,
0xfc2bcd06
,
0x5efcdec8
,
0x899ed24d
,
0xd6cc72a2
,
0x01ae7e27
,
0xa3796de9
,
0x741b616c
,
0x3da64c34
,
0xeac440b1
,
0x4813537f
,
0x9f715ffa
,
0xdb6909cf
,
0x0c0b054a
,
0xaedc1684
,
0x79be1a01
,
0x30033759
,
0xe7613bdc
,
0x45b62812
,
0x92d42497
,
0x9638b2a4
,
0x415abe21
,
0xe38dadef
,
0x34efa16a
,
0x7d528c32
,
0xaa3080b7
,
0x08e79379
,
0xdf859ffc
,
0x9b9dc9c9
,
0x4cffc54c
,
0xee28d682
,
0x394ada07
,
0x70f7f75f
,
0xa795fbda
,
0x0542e814
,
0xd220e491
,
0x8d72447e
,
0x5a1048fb
,
0xf8c75b35
,
0x2fa557b0
,
0x66187ae8
,
0xb17a766d
,
0x13ad65a3
,
0xc4cf6926
,
0x80d73f13
,
0x57b53396
,
0xf5622058
,
0x22002cdd
,
0x6bbd0185
,
0xbcdf0d00
,
0x1e081ece
,
0xc96a124b
,
0xa0ad5f10
,
0x77cf5395
,
0xd518405b
,
0x027a4cde
,
0x4bc76186
,
0x9ca56d03
,
0x3e727ecd
,
0xe9107248
,
0xad08247d
,
0x7a6a28f8
,
0xd8bd3b36
,
0x0fdf37b3
,
0x46621aeb
,
0x9100166e
,
0x33d705a0
,
0xe4b50925
,
0xbbe7a9ca
,
0x6c85a54f
,
0xce52b681
,
0x1930ba04
,
0x508d975c
,
0x87ef9bd9
,
0x25388817
,
0xf25a8492
,
0xb642d2a7
,
0x6120de22
,
0xc3f7cdec
,
0x1495c169
,
0x5d28ec31
,
0x8a4ae0b4
,
0x289df37a
,
0xffffffff
,
};
int
main
(
int
argc
,
char
*
argv
[])
{
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
<
256
;
i
++
)
{
memset
(
c
,
i
,
sizeof
(
c
));
ok1
(
crc32
(
c
,
sizeof
(
c
))
==
crc_expect
[
i
]);
}
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