Provided by: manpages-posix_2.16-1_all bug

NAME

       cksum - write file checksums and sizes

SYNOPSIS

       cksum [file ...]

DESCRIPTION

       The  cksum  utility shall calculate and write to standard output a cyclic redundancy check
       (CRC) for each input file, and also write to standard output the number of octets in  each
       file.  The  CRC  used  is  based  on  the  polynomial  used  for CRC error checking in the
       ISO/IEC 8802-3:1996 standard (Ethernet).

       The encoding for the CRC checksum is defined by the generating polynomial:

              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

       Mathematically, the CRC value corresponding to a  given  file  shall  be  defined  by  the
       following procedure:

        1. The n bits to be evaluated are considered to be the coefficients of a mod 2 polynomial
           M( x) of degree n-1. These  n  bits  are  the  bits  from  the  file,  with  the  most
           significant  bit being the most significant bit of the first octet of the file and the
           last bit being the least significant bit of the last octet, padded with zero bits  (if
           necessary)  to  achieve  an  integral number of octets, followed by one or more octets
           representing the length of the file as a binary value, least significant octet  first.
           The smallest number of octets capable of representing this integer shall be used.

        2. M(  x)  is  multiplied  by  x**32 (that is, shifted left 32 bits) and divided by G( x)
           using mod 2 division, producing a remainder R( x) of degree <= 31.

        3. The coefficients of R( x) are considered to be a 32-bit sequence.

        4. The bit sequence is complemented and the result is the CRC.

OPTIONS

       None.

OPERANDS

       The following operand shall be supported:

       file   A pathname of a file to be checked. If no file operands are specified, the standard
              input shall be used.

STDIN

       The  standard  input  shall  be used only if no file operands are specified. See the INPUT
       FILES section.

INPUT FILES

       The input files can be any file type.

ENVIRONMENT VARIABLES

       The following environment variables shall affect the execution of cksum:

       LANG   Provide a default value for the internationalization variables that  are  unset  or
              null.  (See  the  Base  Definitions  volume  of  IEEE Std 1003.1-2001, Section 8.2,
              Internationalization Variables for the precedence of internationalization variables
              used to determine the values of locale categories.)

       LC_ALL If  set  to  a  non-empty  string  value,  override  the  values  of  all the other
              internationalization variables.

       LC_CTYPE
              Determine the locale for the interpretation of sequences of bytes of text  data  as
              characters  (for  example,  single-byte  as  opposed  to  multi-byte  characters in
              arguments).

       LC_MESSAGES
              Determine the locale that should be used to  affect  the  format  and  contents  of
              diagnostic messages written to standard error.

       NLSPATH
              Determine the location of message catalogs for the processing of LC_MESSAGES .

ASYNCHRONOUS EVENTS

       Default.

STDOUT

       For  each  file  processed  successfully,  the  cksum utility shall write in the following
       format:

              "%u %d %s\n", <checksum>, <# of octets>, <pathname>

       If no file operand was specified, the pathname and its leading <space> shall be omitted.

STDERR

       The standard error shall be used only for diagnostic messages.

OUTPUT FILES

       None.

EXTENDED DESCRIPTION

       None.

EXIT STATUS

       The following exit values shall be returned:

        0     All files were processed successfully.

       >0     An error occurred.

CONSEQUENCES OF ERRORS

       Default.

       The following sections are informative.

APPLICATION USAGE

       The cksum utility is typically used to quickly compare a suspect file  against  a  trusted
       version  of  the  same,  such  as to ensure that files transmitted over noisy media arrive
       intact. However, this  comparison  cannot  be  considered  cryptographically  secure.  The
       chances  of  a  damaged  file producing the same CRC as the original are small; deliberate
       deception is difficult, but probably not impossible.

       Although input files to cksum can be any type, the results  need  not  be  what  would  be
       expected  on  character  special device files or on file types not described by the System
       Interfaces volume of IEEE Std 1003.1-2001. Since this volume of IEEE Std 1003.1-2001  does
       not  specify  the  block  size used when doing input, checksums of character special files
       need not process all of the data in those files.

       The algorithm is expressed in terms of a bitstream divided into  octets.   If  a  file  is
       transmitted  between  two  systems and undergoes any data transformation (such as changing
       little-endian byte ordering to big-endian),  identical  CRC  values  cannot  be  expected.
       Implementations   performing   such  transformations  may  extend  cksum  to  handle  such
       situations.

EXAMPLES

       None.

RATIONALE

       The following C-language program can be used as a model  to  describe  the  algorithm.  It
       assumes  that  a char is one octet.  It also assumes that the entire file is available for
       one pass through  the  function.  This  was  done  for  simplicity  in  demonstrating  the
       algorithm, rather than as an implementation model.

              static unsigned long crctab[] = {
              0x00000000,
              0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
              0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6,
              0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
              0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac,
              0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f,
              0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a,
              0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
              0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58,
              0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033,
              0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027, 0xddb056fe,
              0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
              0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4,
              0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
              0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5,
              0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
              0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 0x7897ab07,
              0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c,
              0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1,
              0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
              0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b,
              0xbb60adfc, 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698,
              0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d,
              0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
              0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 0xc6bcf05f,
              0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
              0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80,
              0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
              0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a,
              0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, 0x21dc2629,
              0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c,
              0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
              0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e,
              0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65,
              0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, 0xdea580d8,
              0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
              0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2,
              0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
              0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74,
              0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
              0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 0x7b827d21,
              0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a,
              0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, 0x18197087,
              0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
              0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d,
              0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce,
              0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb,
              0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
              0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 0x89b8fd09,
              0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
              0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf,
              0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
              };

              unsigned long memcrc(const unsigned char *b, size_t n)
              {
              /*  Input arguments:
               *  const char*   b == byte sequence to checksum
               *  size_t        n == length of sequence
               */

                  register unsigned   i, c, s = 0;

                  for (i = n; i > 0; --i) {
                      c = (unsigned)(*b++);
                      s = (s << 8) ^ crctab[(s >> 24) ^ c];
                  }

                  /* Extend with the length of the string. */
                  while (n != 0) {
                      c = n & 0377;
                      n >>= 8;
                      s = (s << 8) ^ crctab[(s >> 24) ^ c];
                  }

                  return ~s;
              }

       The  historical practice of writing the number of "blocks" has been changed to writing the
       number of octets, since the latter is not only more  useful,  but  also  since  historical
       implementations  have  not  been  consistent in defining what a "block" meant.  Octets are
       used instead of bytes because bytes can differ in size between systems.

       The algorithm used was selected to increase the operational robustness of  cksum.  Neither
       the  System  V  nor  BSD sum algorithm was selected. Since each of these was different and
       each was the default behavior on those systems, no realistic compromise was  available  if
       either  were selected-some set of historical applications would break. Therefore, the name
       was changed to cksum. Although the historical sum commands will probably  continue  to  be
       provided  for  many years, programs designed for portability across systems should use the
       new name.

       The algorithm  selected  is  based  on  that  used  by  the  ISO/IEC 8802-3:1996  standard
       (Ethernet)  for  the  frame  check  sequence  field. The algorithm used does not match the
       technical definition of a checksum; the term is used for historical reasons.   The  length
       of  the  file  is  included  in  the CRC calculation because this parallels inclusion of a
       length field by Ethernet in its CRC,  but  also  because  it  guards  against  inadvertent
       collisions  between files that begin with different series of zero octets. The chance that
       two different files produce identical CRCs is much greater  when  their  lengths  are  not
       considered.  Keeping the length and the checksum of the file itself separate would yield a
       slightly more robust algorithm, but historical usage has always been that a single  number
       (the  checksum  as  printed)  represents  the  signature  of the file. It was decided that
       historical usage was the more important consideration.

       Early proposals contained modifications to the Ethernet algorithm that involved extracting
       table values whenever an intermediate result became zero. This was demonstrated to be less
       robust than the current method and mathematically difficult to describe or justify.

       The calculation used is identical to that given in pseudo-code in the  referenced  Sarwate
       article. The pseudo-code rendition is:

              X <- 0; Y <- 0;
              for i <- m -1 step -1 until 0 do
                  begin
                  T <- X(1) ^ A[i];
                  X(1) <- X(0); X(0) <- Y(1); Y(1) <- Y(0); Y(0) <- 0;
                  comment: f[T] and f'[T] denote the T-th words in the
                      table f and f' ;
                  X <- X ^ f[T]; Y <- Y ^ f'[T];
                  end

       The  pseudo-code  is reproduced exactly as given; however, note that in the case of cksum,
       A[i] represents a byte of the file, the words X and Y  are  treated  as  a  single  32-bit
       value, and the tables f and f' are a single table containing 32-bit values.

       The referenced Sarwate article also discusses generating the table.

FUTURE DIRECTIONS

       None.

SEE ALSO

       None.

COPYRIGHT

       Portions  of  this  text  are  reprinted  and  reproduced in electronic form from IEEE Std
       1003.1, 2003 Edition, Standard for Information Technology  --  Portable  Operating  System
       Interface  (POSIX), The Open Group Base Specifications Issue 6, Copyright (C) 2001-2003 by
       the Institute of Electrical and Electronics Engineers, Inc and  The  Open  Group.  In  the
       event  of  any  discrepancy  between this version and the original IEEE and The Open Group
       Standard, the original IEEE and The Open Group  Standard  is  the  referee  document.  The
       original Standard can be obtained online at http://www.opengroup.org/unix/online.html .