1CKSUM(P) POSIX Programmer's Manual CKSUM(P)
2
3
4
6 cksum - write file checksums and sizes
7
9 cksum [file ...]
10
12 The cksum utility shall calculate and write to standard output a cyclic
13 redundancy check (CRC) for each input file, and also write to standard
14 output the number of octets in each file. The CRC used is based on the
15 polynomial used for CRC error checking in the ISO/IEC 8802-3:1996 stan‐
16 dard (Ethernet).
17
18 The encoding for the CRC checksum is defined by the generating polyno‐
19 mial:
20
21
22 G(x)=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
23
24 Mathematically, the CRC value corresponding to a given file shall be
25 defined by the following procedure:
26
27 1. The n bits to be evaluated are considered to be the coefficients of
28 a mod 2 polynomial M( x) of degree n-1. These n bits are the bits
29 from the file, with the most significant bit being the most signif‐
30 icant bit of the first octet of the file and the last bit being the
31 least significant bit of the last octet, padded with zero bits (if
32 necessary) to achieve an integral number of octets, followed by one
33 or more octets representing the length of the file as a binary
34 value, least significant octet first. The smallest number of octets
35 capable of representing this integer shall be used.
36
37 2. M( x) is multiplied by x**32 (that is, shifted left 32 bits) and
38 divided by G( x) using mod 2 division, producing a remainder R( x)
39 of degree <= 31.
40
41 3. The coefficients of R( x) are considered to be a 32-bit sequence.
42
43 4. The bit sequence is complemented and the result is the CRC.
44
46 None.
47
49 The following operand shall be supported:
50
51 file A pathname of a file to be checked. If no file operands are
52 specified, the standard input shall be used.
53
54
56 The standard input shall be used only if no file operands are speci‐
57 fied. See the INPUT FILES section.
58
60 The input files can be any file type.
61
63 The following environment variables shall affect the execution of
64 cksum:
65
66 LANG Provide a default value for the internationalization variables
67 that are unset or null. (See the Base Definitions volume of
68 IEEE Std 1003.1-2001, Section 8.2, Internationalization Vari‐
69 ables for the precedence of internationalization variables used
70 to determine the values of locale categories.)
71
72 LC_ALL If set to a non-empty string value, override the values of all
73 the other internationalization variables.
74
75 LC_CTYPE
76 Determine the locale for the interpretation of sequences of
77 bytes of text data as characters (for example, single-byte as
78 opposed to multi-byte characters in arguments).
79
80 LC_MESSAGES
81 Determine the locale that should be used to affect the format
82 and contents of diagnostic messages written to standard error.
83
84 NLSPATH
85 Determine the location of message catalogs for the processing of
86 LC_MESSAGES .
87
88
90 Default.
91
93 For each file processed successfully, the cksum utility shall write in
94 the following format:
95
96
97 "%u %d %s\n", <checksum>, <# of octets>, <pathname>
98
99 If no file operand was specified, the pathname and its leading <space>
100 shall be omitted.
101
103 The standard error shall be used only for diagnostic messages.
104
106 None.
107
109 None.
110
112 The following exit values shall be returned:
113
114 0 All files were processed successfully.
115
116 >0 An error occurred.
117
118
120 Default.
121
122 The following sections are informative.
123
125 The cksum utility is typically used to quickly compare a suspect file
126 against a trusted version of the same, such as to ensure that files
127 transmitted over noisy media arrive intact. However, this comparison
128 cannot be considered cryptographically secure. The chances of a damaged
129 file producing the same CRC as the original are small; deliberate
130 deception is difficult, but probably not impossible.
131
132 Although input files to cksum can be any type, the results need not be
133 what would be expected on character special device files or on file
134 types not described by the System Interfaces volume of
135 IEEE Std 1003.1-2001. Since this volume of IEEE Std 1003.1-2001 does
136 not specify the block size used when doing input, checksums of charac‐
137 ter special files need not process all of the data in those files.
138
139 The algorithm is expressed in terms of a bitstream divided into octets.
140 If a file is transmitted between two systems and undergoes any data
141 transformation (such as changing little-endian byte ordering to big-
142 endian), identical CRC values cannot be expected. Implementations per‐
143 forming such transformations may extend cksum to handle such situa‐
144 tions.
145
147 None.
148
150 The following C-language program can be used as a model to describe the
151 algorithm. It assumes that a char is one octet. It also assumes that
152 the entire file is available for one pass through the function. This
153 was done for simplicity in demonstrating the algorithm, rather than as
154 an implementation model.
155
156
157 static unsigned long crctab[] = {
158 0x00000000,
159 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
160 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6,
161 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
162 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac,
163 0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f,
164 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a,
165 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
166 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58,
167 0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033,
168 0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027, 0xddb056fe,
169 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
170 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4,
171 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
172 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5,
173 0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
174 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 0x7897ab07,
175 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c,
176 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1,
177 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
178 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b,
179 0xbb60adfc, 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698,
180 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d,
181 0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
182 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 0xc6bcf05f,
183 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
184 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80,
185 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
186 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a,
187 0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, 0x21dc2629,
188 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c,
189 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
190 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e,
191 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65,
192 0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, 0xdea580d8,
193 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
194 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2,
195 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
196 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74,
197 0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
198 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 0x7b827d21,
199 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a,
200 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, 0x18197087,
201 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
202 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d,
203 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce,
204 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb,
205 0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
206 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 0x89b8fd09,
207 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
208 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf,
209 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
210 };
211
212
213 unsigned long memcrc(const unsigned char *b, size_t n)
214 {
215 /* Input arguments:
216 * const char* b == byte sequence to checksum
217 * size_t n == length of sequence
218 */
219
220
221 register unsigned i, c, s = 0;
222
223
224 for (i = n; i > 0; --i) {
225 c = (unsigned)(*b++);
226 s = (s << 8) ^ crctab[(s >> 24) ^ c];
227 }
228
229
230 /* Extend with the length of the string. */
231 while (n != 0) {
232 c = n & 0377;
233 n >>= 8;
234 s = (s << 8) ^ crctab[(s >> 24) ^ c];
235 }
236
237
238 return ~s;
239 }
240
241 The historical practice of writing the number of "blocks" has been
242 changed to writing the number of octets, since the latter is not only
243 more useful, but also since historical implementations have not been
244 consistent in defining what a "block" meant. Octets are used instead
245 of bytes because bytes can differ in size between systems.
246
247 The algorithm used was selected to increase the operational robustness
248 of cksum. Neither the System V nor BSD sum algorithm was selected.
249 Since each of these was different and each was the default behavior on
250 those systems, no realistic compromise was available if either were
251 selected-some set of historical applications would break. Therefore,
252 the name was changed to cksum. Although the historical sum commands
253 will probably continue to be provided for many years, programs designed
254 for portability across systems should use the new name.
255
256 The algorithm selected is based on that used by the ISO/IEC 8802-3:1996
257 standard (Ethernet) for the frame check sequence field. The algorithm
258 used does not match the technical definition of a checksum; the term is
259 used for historical reasons. The length of the file is included in the
260 CRC calculation because this parallels inclusion of a length field by
261 Ethernet in its CRC, but also because it guards against inadvertent
262 collisions between files that begin with different series of zero
263 octets. The chance that two different files produce identical CRCs is
264 much greater when their lengths are not considered. Keeping the length
265 and the checksum of the file itself separate would yield a slightly
266 more robust algorithm, but historical usage has always been that a sin‐
267 gle number (the checksum as printed) represents the signature of the
268 file. It was decided that historical usage was the more important con‐
269 sideration.
270
271 Early proposals contained modifications to the Ethernet algorithm that
272 involved extracting table values whenever an intermediate result became
273 zero. This was demonstrated to be less robust than the current method
274 and mathematically difficult to describe or justify.
275
276 The calculation used is identical to that given in pseudo-code in the
277 referenced Sarwate article. The pseudo-code rendition is:
278
279
280 X <- 0; Y <- 0;
281 for i <- m -1 step -1 until 0 do
282 begin
283 T <- X(1) ^ A[i];
284 X(1) <- X(0); X(0) <- Y(1); Y(1) <- Y(0); Y(0) <- 0;
285 comment: f[T] and f'[T] denote the T-th words in the
286 table f and f' ;
287 X <- X ^ f[T]; Y <- Y ^ f'[T];
288 end
289
290 The pseudo-code is reproduced exactly as given; however, note that in
291 the case of cksum, A[i] represents a byte of the file, the words X and
292 Y are treated as a single 32-bit value, and the tables f and f' are a
293 single table containing 32-bit values.
294
295 The referenced Sarwate article also discusses generating the table.
296
298 None.
299
301 None.
302
304 Portions of this text are reprinted and reproduced in electronic form
305 from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology
306 -- Portable Operating System Interface (POSIX), The Open Group Base
307 Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of
308 Electrical and Electronics Engineers, Inc and The Open Group. In the
309 event of any discrepancy between this version and the original IEEE and
310 The Open Group Standard, the original IEEE and The Open Group Standard
311 is the referee document. The original Standard can be obtained online
312 at http://www.opengroup.org/unix/online.html .
313
314
315
316IEEE/The Open Group 2003 CKSUM(P)