logo

oasis-root

Compiled tree of Oasis Linux based on own branch at <https://hacktivis.me/git/oasis/> git clone https://anongit.hacktivis.me/git/oasis-root.git

cksum.1p (13580B)


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