/* Void Main's man pages */

{ phpMan } else { main(); }

Command: man perldoc info search(apropos)  


CKSUM(1P)                                           POSIX Programmer's Manual                                          CKSUM(1P)



PROLOG
       This  manual  page is part of the POSIX Programmer's Manual.  The Linux implementation of this interface may differ (con-
       sult the corresponding Linux manual page for details of Linux behavior), or the  interface  may  not  be  implemented  on
       Linux.

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  international-
              ization 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 stan-
              dard 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 cryptographi-
       cally  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 can-
       not 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 algo-
       rithm 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 con-
       sidered. 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 dif-
       ficult to describe or justify.

       The calculation used is identical to that given in pseudo-code in the referenced Sarwate article. The pseudo-code  rendi-
       tion 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,  Copy-
       right (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.open-
       group.org/unix/online.html .



IEEE/The Open Group                                           2003                                                     CKSUM(1P)

Valid XHTML 1.0!Valid CSS!