Importing cksum (needed by NetBSD build system)

Change-Id: I47308635f6307066643f83f07b6751b1f2a05eb4
This commit is contained in:
Lionel Sambuc 2012-10-22 15:42:09 +02:00
parent 9a5aca794e
commit 280d8c668e
23 changed files with 1742 additions and 161 deletions

View file

@ -4,7 +4,7 @@
SUBDIR= add_route arp ash at backup banner basename btrace cal \ SUBDIR= add_route arp ash at backup banner basename btrace cal \
cawf cd cdprobe cpp \ cawf cd cdprobe cpp \
chmod chown ci cksum cleantmp clear cmp co \ chmod chown ci cleantmp clear cmp co \
comm compress cp crc cron crontab cut \ comm compress cp crc cron crontab cut \
dd decomp16 DESCRIBE dev2name devmand devsize df dhcpd \ dd decomp16 DESCRIBE dev2name devmand devsize df dhcpd \
dhrystone diff dirname diskctl dumpcore \ dhrystone diff dirname diskctl dumpcore \

View file

@ -1,4 +0,0 @@
PROG= cksum
MAN=
.include <bsd.prog.mk>

View file

@ -1,155 +0,0 @@
/* cksum.c - Display file checksums and block counts Author: V. Archer */
/* Copyright 1991 by Vincent Archer
* You may freely redistribute this software, in source or binary
* form, provided that you do not alter this copyright mention in any
* way.
*/
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int error;
/* Table from P1003.2 (4.9/Fig 4.1). In fact, this table was taken from zmodem
* and rewritten to look like the Draft 11 example.
*/
unsigned long crctab[] = {
0x7fffffff,
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
};
int main(int argc, char **argv);
void crc(int fd, char *name);
unsigned long strncrc(unsigned char *b, int n, unsigned long s);
static int aux;
/* Routine straight out of 4.9.10 */
unsigned long strncrc(b, n, s)
register unsigned char *b; /* byte sequence to checksum */
register int n; /* length of sequence */
register unsigned long s; /* initial checksum value */
{
register int i;
while (n-- > 0) {
/* Compute the index to the crc table */
i = (s >> 24) ^ ((unsigned int) (*b++));
if (i == 0) {
/* Replace an intermediate zero with the next value
* from the sequence */
i = aux++;
if (aux >= sizeof(crctab) / sizeof(crctab[0])) aux = 0;
}
/* New checksum value */
s = (s << 8) ^ crctab[i];
}
return(s);
}
/* Main module. No options switches allowed, none parsed. */
int main(argc, argv)
int argc;
char *argv[];
{
argc--;
error = 0;
if (!argc)
crc(0, (char *) 0);
else
for (argv++; argc--; argv++) crc(open(*argv, O_RDONLY), *argv);
return(error);
}
/* Compute crc and size of input file descriptor. */
void crc(fd, name)
int fd;
char *name;
{
off_t f_size;
unsigned long crc;
int nb;
unsigned char buffer[1024];
if (fd < 0) {
perror(name);
error = 1;
return;
}
crc = 0;
f_size = 0;
aux = 0;
for (;;) {
nb = read(fd, (char *) buffer, sizeof(buffer));
if (nb < 0) {
close(fd);
perror(name ? name : "stdin");
error = 1;
return;
}
if (!nb) break;
f_size += nb;
crc = strncrc(buffer, nb, crc);
}
close(fd);
printf("%lu %ld", crc, f_size);
if (name)
printf(" %s\n", name);
else
putchar('\n');
}

View file

@ -2,6 +2,8 @@
# Timestamp in UTC,minixpath,netbsdpath # Timestamp in UTC,minixpath,netbsdpath
# minixpath: path in Minix source tree (starting from /usr/src/) # minixpath: path in Minix source tree (starting from /usr/src/)
# netbsdpath: path in BSD source tree (starting from src/) # netbsdpath: path in BSD source tree (starting from src/)
2012/10/17 12:00:00,tools/cksum
2012/10/17 12:00:00,usr.bin/cksum
2012/10/17 12:00:00,usr.sbin/postinstall 2012/10/17 12:00:00,usr.sbin/postinstall
2012/05/01 16:16:12,external/bsd/libarchive 2012/05/01 16:16:12,external/bsd/libarchive
2012/02/10 16:16:12,usr.sbin/chroot 2012/02/10 16:16:12,usr.sbin/chroot

7
tools/cksum/Makefile Normal file
View file

@ -0,0 +1,7 @@
# $NetBSD: Makefile,v 1.3 2006/10/29 06:17:08 dogcow Exp $
HOSTPROGNAME= ${_TOOL_PREFIX}cksum
HOST_SRCDIR= usr.bin/cksum
CPPFLAGS+= -I${.CURDIR}/../compat/sys
.include "${.CURDIR}/../Makefile.host"

View file

@ -3,7 +3,7 @@
.include <bsd.own.mk> .include <bsd.own.mk>
# NetBSD imports # NetBSD imports
SUBDIR= login indent m4 make mktemp stat tic sed mkdep uniq seq du man \ SUBDIR= login indent cksum m4 make mktemp stat tic sed mkdep uniq seq du man \
apropos chpass newgrp passwd bzip2 bzip2recover gzip su genassym \ apropos chpass newgrp passwd bzip2 bzip2recover gzip su genassym \
xinstall ldd/elf32 .WAIT ldd xinstall ldd/elf32 .WAIT ldd

20
usr.bin/cksum/Makefile Normal file
View file

@ -0,0 +1,20 @@
# $NetBSD: Makefile,v 1.16 2009/04/14 22:15:18 lukem Exp $
# @(#)Makefile 8.2 (Berkeley) 4/28/95
PROG= cksum
SRCS= cksum.c crc.c md2.c md4.c md5.c sha1.c rmd160.c print.c sum1.c sum2.c
SRCS+= sha256.c sha384.c sha512.c
LINKS= ${BINDIR}/cksum ${BINDIR}/sum
LINKS+= ${BINDIR}/cksum ${BINDIR}/md2
LINKS+= ${BINDIR}/cksum ${BINDIR}/md4
LINKS+= ${BINDIR}/cksum ${BINDIR}/md5
LINKS+= ${BINDIR}/cksum ${BINDIR}/sha1
LINKS+= ${BINDIR}/cksum ${BINDIR}/rmd160
MLINKS= cksum.1 sum.1
MLINKS+=cksum.1 md2.1
MLINKS+=cksum.1 md4.1
MLINKS+=cksum.1 md5.1
MLINKS+=cksum.1 sha1.1
MLINKS+=cksum.1 rmd160.1
.include <bsd.prog.mk>

332
usr.bin/cksum/cksum.1 Normal file
View file

@ -0,0 +1,332 @@
.\" $NetBSD: cksum.1,v 1.44 2012/06/25 02:32:12 riastradh Exp $
.\"
.\" Copyright (c) 1991, 1993
.\" The Regents of the University of California. All rights reserved.
.\"
.\" This code is derived from software contributed to Berkeley by
.\" the Institute of Electrical and Electronics Engineers, Inc.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\" 3. Neither the name of the University nor the names of its contributors
.\" may be used to endorse or promote products derived from this software
.\" without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" @(#)cksum.1 8.2 (Berkeley) 4/28/95
.\"
.Dd June 24, 2012
.Dt CKSUM 1
.Os
.Sh NAME
.Nm cksum ,
.Nm md2 ,
.Nm md4 ,
.Nm md5 ,
.Nm rmd160 ,
.Nm sha1 ,
.Nm sum
.Nd display file checksums and block counts
.Sh SYNOPSIS
.Nm cksum
.Op Fl n
.Op Fl a Ar algorithm Oo Fl ptx Oc Oo Fl s Ar string Oc
.Op Fl o Ar 1 Ns | Ns Ar 2
.Op Ar Li \&| Fl c Oo Fl w Oc Oo Ar sumfile Oc
.Nm sum
.Op Fl n
.Op Fl a Ar algorithm Oo Fl ptx Oc Oo Fl s Ar string Oc
.Op Fl o Ar 1 Ns | Ns Ar 2
.Op Ar Li \&| Fl c Oo Fl w Oc Oo Ar sumfile Oc
.Nm md2
.Op Fl nptx
.Op Fl s Ar string
.Op Ar Li \&| Fl c Oo Fl w Oc Oo Ar sumfile Oc
.Nm md4
.Op Fl nptx
.Op Fl s Ar string
.Op Ar Li \&| Fl c Oo Fl w Oc Oo Ar sumfile Oc
.Nm md5
.Op Fl nptx
.Op Fl s Ar string
.Op Ar Li \&| Fl c Oo Fl w Oc Oo Ar sumfile Oc
.Nm rmd160
.Op Fl nptx
.Op Fl s Ar string
.Op Ar Li \&| Fl c Oo Fl w Oc Oo Ar sumfile Oc
.Nm sha1
.Op Fl nptx
.Op Fl s Ar string
.Op Ar Li \&| Fl c Oo Fl w Oc Oo Ar sumfile Oc
.Sh DESCRIPTION
The
.Nm
utility writes to the standard output three whitespace separated
fields for each input file.
These fields are a checksum
.Tn CRC ,
the total number of octets in the file and the file name.
If no file name is specified, the standard input is used and no file name
is written.
.Pp
The
.Nm sum
utility is identical to the
.Nm
utility, except that it defaults to using historic algorithm 1, as
described below.
It is provided for compatibility only.
.Pp
The
.Nm md2 ,
.Nm md4 ,
.Nm md5 ,
.Nm sha1 ,
and
.Nm rmd160
utilities compute cryptographic hash functions, and write to standard
output the hexadecimal representation of the hash of their input.
.Pp
The options are as follows:
.Bl -tag -width indent
.It Fl a Ar algorithm
When invoked as
.Nm cksum ,
use the specified
.Ar algorithm .
Valid algorithms are:
.Bl -column -offset indent ".Sy Algorithm" ".Sy Bits" ".Sy Description"
.It Sy Algorithm Ta Sy Bits Ta Sy Description
.It Li CRC Ta 32 Ta Default CRC algorithm
.It Li MD2 Ta 128 Ta MD2, per Li RFC1319
.It Li MD4 Ta 128 Ta MD4, per Li RFC1320
.It Li MD5 Ta 128 Ta MD5, per Li RFC1321
.It Li RMD160 Ta 160 Ta RIPEMD-160
.It Li SHA1 Ta 160 Ta SHA-1, per Li FIPS PUB 180-1
.It Li SHA256 Ta 256 Ta SHA-2
.It Li SHA384 Ta 384 Ta SHA-2
.It Li SHA512 Ta 512 Ta SHA-2
.It Li old1 Ta 16 Ta Algorithm 1, per Fl o Ar 1
.It Li old2 Ta 16 Ta Algorithm 2, per Fl o Ar 2
.El
.It Fl c Op Ar sumfile
Verify (check) files against a list of checksums.
The list is read from
.Ar sumfile ,
or from stdin if no filename is given.
E.g. first run
.Dl Ic md5 *.tgz \*[Gt] MD5
.Dl Ic sha1 *.tgz \*[Gt] SHA1
to generate a list of MD5 checksums in
.Pa MD5 ,
then use the following command to verify them:
.Dl Ic cat MD5 SHA1 | cksum -c
If an error is found during checksum verification, an error
message is printed, and the program returns an error code of 1.
.It Fl o
Use historic algorithms instead of the (superior) default one.
.Pp
Algorithm 1 is the algorithm used by historic
.Bx
systems as the
.Xr sum 1
algorithm and by historic
.At V
systems as the
.Xr sum 1
algorithm when using the
.Fl r
option.
This is a 16-bit checksum, with a right rotation before each addition;
overflow is discarded.
.Pp
Algorithm 2 is the algorithm used by historic
.At V
systems as the
default
.Xr sum 1
algorithm.
This is a 32-bit checksum, and is defined as follows:
.Bd -unfilled -offset indent
s = sum of all bytes;
r = s % 2^16 + (s % 2^32) / 2^16;
cksum = (r % 2^16) + r / 2^16;
.Ed
.Pp
Both algorithm 1 and 2 write to the standard output the same fields as
the default algorithm except that the size of the file in bytes is
replaced with the size of the file in blocks.
For historic reasons, the block size is 1024 for algorithm 1 and 512
for algorithm 2.
Partial blocks are rounded up.
.It Fl w
Print warnings about malformed checksum files when verifying
checksums with
.Fl c .
.El
.Pp
The following options apply only when using the one of the message
digest algorithms:
.Bl -tag -width indent
.It Fl n
Print the hash and the filename in the normal sum output form, with
the hash at the left and the filename following on the right.
.It Fl p
Echo input from standard input to standard output, and append the
selected message digest.
.It Fl s Ar string
Print the hash of the given string
.Ar string .
.It Fl t
Run a built-in message digest time trial.
.It Fl x
Run a built-in message digest test script.
The tests that are run
are supposed to encompass all the various tests in the suites that
accompany the algorithms' descriptions with the exception of the
last test for the SHA-1 algorithm and the RIPEMD-160 algorithm.
The
last test for these is one million copies of the lower letter a.
.El
.Pp
The default
.Tn CRC
used is based on the polynomial used for
.Tn CRC
error checking
in the networking standard
.St -iso8802-3 .
The
.Tn CRC
checksum encoding is defined by the generating polynomial:
.Pp
.Bd -unfilled -offset indent
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
.Ed
.Pp
Mathematically, the
.Tn CRC
value corresponding to a given file is defined by
the following procedure:
.Bd -filled -offset indent
The
.Ar n
bits to be evaluated are considered to be the coefficients of a mod 2
polynomial M(x) of degree
.Ar n Ns \-1 .
These
.Ar 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 are used.
.Pp
M(x) is multiplied by x^32 (i.e., shifted left 32 bits) and divided by
G(x) using mod 2 division, producing a remainder R(x) of degree \*[Le] 31.
.Pp
The coefficients of R(x) are considered to be a 32-bit sequence.
.Pp
The bit sequence is complemented and the result is the CRC.
.Ed
.Pp
The
.Nm
and
.Nm sum
utilities exit 0 on success, and \*[Gt]0 if an error occurs.
.Sh SEE ALSO
.Xr openssl 1 ,
.Xr mtree 8
.Pp
The default calculation is identical to that given in pseudo-code
in the following
.Tn ACM
article.
.Rs
.%T "Computation of Cyclic Redundancy Checks Via Table Lookup"
.%A Dilip V. Sarwate
.%J "Communications of the \*(tNACM\*(sP"
.%D "August 1988"
.Re
.Rs
.%A R. Rivest
.%T The MD2 Message-Digest Algorithm
.%O RFC 1319
.Re
.Rs
.%A R. Rivest
.%T The MD4 Message-Digest Algorithm
.%O RFC 1186 and RFC 1320
.Re
.Rs
.%A R. Rivest
.%T The MD5 Message-Digest Algorithm
.%O RFC 1321
.Re
.Rs
.%A U.S. DOC/NIST
.%T Secure Hash Standard
.%O FIPS PUB 180-1
.Re
.Sh STANDARDS
The
.Nm
utility is expected to conform to
.St -p1003.1-2004 .
.Sh HISTORY
The
.Nm
utility appeared in
.Bx 4.4 .
.Nm md5
was added in
.Nx 1.3 .
The functionality for
.Nm md2 ,
.Nm md4 ,
.Nm sha1 ,
and
.Nm rmd160
was added in
.Nx 1.6 .
Support for the SHA-2 algorithms
.Po
.Li SHA256 ,
.Li SHA384 ,
and
.Li SHA512
.Pc
was added in
.Nx 3.0 .
The functionality to verify checksum stored in a file
.Pq Fl c
first appeared in
.Nx 4.0 .
.\" .Pp
.\" The
.\" .Nm sum
.\" utility appeared in
.\" .Bx ?.?
.\" and
.\" .At V .

543
usr.bin/cksum/cksum.c Normal file
View file

@ -0,0 +1,543 @@
/* $NetBSD: cksum.c,v 1.45 2011/08/29 14:12:29 joerg Exp $ */
/*-
* Copyright (c) 1991, 1993
* The Regents of the University of California. All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* James W. Williams of NASA Goddard Space Flight Center.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
/*-
* Copyright (c) 1997 Jason R. Thorpe. All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* James W. Williams of NASA Goddard Space Flight Center.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#if HAVE_NBTOOL_CONFIG_H
#include "nbtool_config.h"
#endif
#include <sys/cdefs.h>
#if defined(__COPYRIGHT) && !defined(lint)
__COPYRIGHT("@(#) Copyright (c) 1991, 1993\
The Regents of the University of California. All rights reserved.");
#endif /* not lint */
#if defined(__RCSID) && !defined(lint)
#if 0
static char sccsid[] = "@(#)cksum.c 8.2 (Berkeley) 4/28/95";
#endif
__RCSID("$NetBSD: cksum.c,v 1.45 2011/08/29 14:12:29 joerg Exp $");
#endif /* not lint */
#include <sys/types.h>
#include <ctype.h>
#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <locale.h>
#include <md2.h>
#include <md4.h>
#include <md5.h>
#include <rmd160.h>
#include <sha1.h>
#include <sha2.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "extern.h"
typedef char *(*_filefunc)(const char *, char *);
const struct hash {
const char *progname;
const char *hashname;
void (*stringfunc)(const char *);
void (*timetrialfunc)(void);
void (*testsuitefunc)(void);
void (*filterfunc)(int);
char *(*filefunc)(const char *, char *);
} hashes[] = {
{ "md2", "MD2",
MD2String, MD2TimeTrial, MD2TestSuite,
MD2Filter, MD2File },
{ "md4", "MD4",
MD4String, MD4TimeTrial, MD4TestSuite,
MD4Filter, MD4File },
{ "md5", "MD5",
MD5String, MD5TimeTrial, MD5TestSuite,
MD5Filter, MD5File },
{ "rmd160", "RMD160",
RMD160String, RMD160TimeTrial, RMD160TestSuite,
RMD160Filter, (_filefunc) RMD160File },
{ "sha1", "SHA1",
SHA1String, SHA1TimeTrial, SHA1TestSuite,
SHA1Filter, (_filefunc) SHA1File },
{ "sha256", "SHA256",
SHA256_String, SHA256_TimeTrial, SHA256_TestSuite,
SHA256_Filter, (_filefunc) SHA256_File },
{ "sha384", "SHA384",
SHA384_String, SHA384_TimeTrial, SHA384_TestSuite,
SHA384_Filter, (_filefunc) SHA384_File },
{ "sha512", "SHA512",
SHA512_String, SHA512_TimeTrial, SHA512_TestSuite,
SHA512_Filter, (_filefunc) SHA512_File },
{ .progname = NULL, },
};
static int hash_digest_file(char *, const struct hash *, int);
__dead static void requirehash(const char *);
__dead static void usage(void);
int
main(int argc, char **argv)
{
int ch, fd, rval, dosum, pflag, nohashstdin;
u_int32_t val;
off_t len;
char *fn;
const char *progname;
int (*cfncn) (int, u_int32_t *, off_t *);
void (*pfncn) (char *, u_int32_t, off_t);
const struct hash *hash;
int normal, i, check_warn, do_check;
cfncn = NULL;
pfncn = NULL;
dosum = pflag = nohashstdin = 0;
normal = 0;
check_warn = 0;
do_check = 0;
setlocale(LC_ALL, "");
progname = getprogname();
for (hash = hashes; hash->hashname != NULL; hash++)
if (strcmp(progname, hash->progname) == 0)
break;
if (hash->hashname == NULL) {
hash = NULL;
if (!strcmp(progname, "sum")) {
dosum = 1;
cfncn = csum1;
pfncn = psum1;
} else {
cfncn = crc;
pfncn = pcrc;
}
}
while ((ch = getopt(argc, argv, "a:cno:ps:twx")) != -1)
switch(ch) {
case 'a':
if (hash) {
warnx("illegal use of -a option\n");
usage();
}
i = 0;
while (hashes[i].hashname != NULL) {
if (!strcasecmp(hashes[i].hashname, optarg)) {
hash = &hashes[i];
break;
}
i++;
}
if (hash == NULL) {
if (!strcasecmp(optarg, "old1")) {
cfncn = csum1;
pfncn = psum1;
} else if (!strcasecmp(optarg, "old2")) {
cfncn = csum2;
pfncn = psum2;
} else if (!strcasecmp(optarg, "crc")) {
cfncn = crc;
pfncn = pcrc;
} else {
warnx("illegal argument to -a option");
usage();
}
}
break;
case 'c':
do_check = 1;
break;
case 'n':
normal = 1;
break;
case 'o':
if (hash) {
warnx("%s mutually exclusive with sum",
hash->hashname);
usage();
}
if (!strcmp(optarg, "1")) {
cfncn = csum1;
pfncn = psum1;
} else if (!strcmp(optarg, "2")) {
cfncn = csum2;
pfncn = psum2;
} else {
warnx("illegal argument to -o option");
usage();
}
break;
case 'p':
if (hash == NULL)
requirehash("-p");
pflag = 1;
break;
case 's':
if (hash == NULL)
requirehash("-s");
nohashstdin = 1;
hash->stringfunc(optarg);
break;
case 't':
if (hash == NULL)
requirehash("-t");
nohashstdin = 1;
hash->timetrialfunc();
break;
case 'w':
check_warn = 1;
break;
case 'x':
if (hash == NULL)
requirehash("-x");
nohashstdin = 1;
hash->testsuitefunc();
break;
case '?':
default:
usage();
}
argc -= optind;
argv += optind;
if (do_check) {
/*
* Verify checksums
*/
FILE *f;
char buf[BUFSIZ];
char *s, *p_filename, *p_cksum;
int l_filename, l_cksum;
char filename[BUFSIZ];
char cksum[BUFSIZ];
int ok,cnt,badcnt;
rval = 0;
cnt = badcnt = 0;
if (argc == 0) {
f = fdopen(STDIN_FILENO, "r");
} else {
f = fopen(argv[0], "r");
}
if (f == NULL)
err(1, "Cannot read %s",
argc>0?argv[0]:"stdin");
while(fgets(buf, sizeof(buf), f) != NULL) {
s=strrchr(buf, '\n');
if (s)
*s = '\0';
p_cksum = p_filename = NULL;
p_filename = strchr(buf, '(');
if (p_filename) {
/*
* Assume 'normal' output if there's a '('
*/
p_filename += 1;
normal = 0;
p_cksum = strrchr(p_filename, ')');
if (p_cksum == NULL) {
if (check_warn)
warnx("bogus format: %s. "
"Skipping...",
buf);
rval = 1;
continue;
}
p_cksum += 4;
l_cksum = strlen(p_cksum);
l_filename = p_cksum - p_filename - 4;
/* Sanity check, and find proper hash if
* it's not the same as the current program
*/
if (hash == NULL ||
strncmp(buf, hash->hashname,
strlen(hash->hashname)) != 0) {
/*
* Search proper hash
*/
const struct hash *nhash;
for (nhash = hashes ;
nhash->hashname != NULL;
nhash++)
if (strncmp(buf,
nhash->hashname,
strlen(nhash->hashname)) == 0)
break;
if (nhash->hashname == NULL) {
if (check_warn)
warnx("unknown hash: %s",
buf);
rval = 1;
continue;
} else {
hash = nhash;
}
}
} else {
if (hash) {
int nspaces;
/*
* 'normal' output, no (ck)sum
*/
normal = 1;
nspaces = 1;
p_cksum = buf;
p_filename = strchr(buf, ' ');
if (p_filename == NULL) {
if (check_warn)
warnx("no filename in %s? "
"Skipping...", buf);
rval = 1;
continue;
}
while (isspace((int)*++p_filename))
nspaces++;
l_filename = strlen(p_filename);
l_cksum = p_filename - buf - nspaces;
} else {
/*
* sum/cksum output format
*/
p_cksum = buf;
s=strchr(p_cksum, ' ');
if (s == NULL) {
if (check_warn)
warnx("bogus format: %s."
" Skipping...",
buf);
rval = 1;
continue;
}
l_cksum = s - p_cksum;
p_filename = strrchr(buf, ' ');
if (p_filename == NULL) {
if (check_warn)
warnx("no filename in %s?"
" Skipping...",
buf);
rval = 1;
continue;
}
p_filename++;
l_filename = strlen(p_filename);
}
}
strlcpy(filename, p_filename, l_filename+1);
strlcpy(cksum, p_cksum, l_cksum+1);
if (hash) {
if (access(filename, R_OK) == 0
&& strcmp(cksum, hash->filefunc(filename, NULL)) == 0)
ok = 1;
else
ok = 0;
} else {
if ((fd = open(filename, O_RDONLY, 0)) < 0) {
if (check_warn)
warn("%s", filename);
rval = 1;
ok = 0;
} else {
if (cfncn(fd, &val, &len))
ok = 0;
else {
u_int32_t should_val;
should_val =
strtoul(cksum, NULL, 10);
if (val == should_val)
ok = 1;
else
ok = 0;
}
close(fd);
}
}
if (! ok) {
if (hash)
printf("(%s) ", hash->hashname);
printf("%s: FAILED\n", filename);
badcnt++;
}
cnt++;
}
fclose(f);
if (badcnt > 0)
rval = 1;
} else {
/*
* Calculate checksums
*/
fd = STDIN_FILENO;
fn = NULL;
rval = 0;
do {
if (*argv) {
fn = *argv++;
if (hash != NULL) {
if (hash_digest_file(fn, hash, normal)) {
warn("%s", fn);
rval = 1;
}
continue;
}
if ((fd = open(fn, O_RDONLY, 0)) < 0) {
warn("%s", fn);
rval = 1;
continue;
}
} else if (hash && !nohashstdin) {
hash->filterfunc(pflag);
}
if (hash == NULL) {
if (cfncn(fd, &val, &len)) {
warn("%s", fn ? fn : "stdin");
rval = 1;
} else
pfncn(fn, val, len);
(void)close(fd);
}
} while (*argv);
}
exit(rval);
}
static int
hash_digest_file(char *fn, const struct hash *hash, int normal)
{
char *cp;
cp = hash->filefunc(fn, NULL);
if (cp == NULL)
return 1;
if (normal)
printf("%s %s\n", cp, fn);
else
printf("%s (%s) = %s\n", hash->hashname, fn, cp);
free(cp);
return 0;
}
static void
requirehash(const char *flg)
{
warnx("%s flag requires `-a algorithm'", flg);
usage();
}
static void
usage(void)
{
const char fileargs[] = "[file ... | -c [-w] [sumfile]]";
const char sumargs[] = "[-n] [-a algorithm [-ptx] [-s string]] [-o 1|2]";
const char hashargs[] = "[-nptx] [-s string]";
(void)fprintf(stderr, "usage: cksum %s\n %s\n",
sumargs, fileargs);
(void)fprintf(stderr, " sum %s\n %s\n",
sumargs, fileargs);
(void)fprintf(stderr, " md2 %s %s\n", hashargs, fileargs);
(void)fprintf(stderr, " md4 %s %s\n", hashargs, fileargs);
(void)fprintf(stderr, " md5 %s %s\n", hashargs, fileargs);
(void)fprintf(stderr, " rmd160 %s %s\n", hashargs, fileargs);
(void)fprintf(stderr, " sha1 %s %s\n", hashargs, fileargs);
exit(1);
}

162
usr.bin/cksum/crc.c Normal file
View file

@ -0,0 +1,162 @@
/* $NetBSD: crc.c,v 1.18 2006/09/04 20:01:10 dsl Exp $ */
/*-
* Copyright (c) 1991, 1993
* The Regents of the University of California. All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* James W. Williams of NASA Goddard Space Flight Center.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#if HAVE_NBTOOL_CONFIG_H
#include "nbtool_config.h"
#endif
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
#if 0
static char sccsid[] = "@(#)crc.c 8.1 (Berkeley) 6/17/93";
#else
__RCSID("$NetBSD: crc.c,v 1.18 2006/09/04 20:01:10 dsl Exp $");
#endif
#endif /* not lint */
#include <sys/types.h>
#include <unistd.h>
#include "extern.h"
static const u_int32_t crctab[] = {
0x0,
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
};
/*
* Compute a POSIX 1003.2 checksum. This routine has been broken out so that
* other programs can use it. It takes a file descriptor to read from and
* locations to store the crc and the number of bytes read. It returns 0 on
* success and 1 on failure. Errno is set on failure.
*/
int
crc(int fd, u_int32_t *cval, off_t *clen)
{
u_char *p;
int nr;
u_int32_t thecrc;
off_t len;
u_char buf[16 * 1024];
#define COMPUTE(var, ch) (var) = (var) << 8 ^ crctab[(var) >> 24 ^ (ch)]
thecrc = 0;
len = 0;
while ((nr = read(fd, buf, sizeof(buf))) > 0)
for (len += nr, p = buf; nr--; ++p) {
COMPUTE(thecrc, *p);
}
if (nr < 0)
return 1;
*clen = len;
/* Include the length of the file. */
for (; len != 0; len >>= 8) {
COMPUTE(thecrc, len & 0xff);
}
*cval = ~thecrc;
return 0;
}
/* These two are rather more useful to the outside world */
uint32_t
crc_buf(uint32_t thecrc, const void *buf, size_t len)
{
const uint8_t *p = buf;
for (p = buf; len; p++, len--)
COMPUTE(thecrc, *p);
return thecrc;
}
uint32_t
crc_byte(uint32_t thecrc, unsigned int byte_val)
{
COMPUTE(thecrc, byte_val & 0xff);
return thecrc;
}

View file

@ -0,0 +1,38 @@
/* $NetBSD: crc_extern.h,v 1.1 2006/09/04 20:01:10 dsl Exp $ */
/*-
* Copyright (c) 1991, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)extern.h 8.1 (Berkeley) 6/6/93
*/
__BEGIN_DECLS
int crc(int, u_int32_t *, off_t *);
uint32_t crc_buf(uint32_t, const void *, size_t);
uint32_t crc_byte(uint32_t, unsigned int);
__END_DECLS

88
usr.bin/cksum/extern.h Normal file
View file

@ -0,0 +1,88 @@
/* $NetBSD: extern.h,v 1.19 2006/09/04 20:01:10 dsl Exp $ */
/*-
* Copyright (c) 1991, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)extern.h 8.1 (Berkeley) 6/6/93
*/
#if HAVE_NBTOOL_CONFIG_H
#include "nbtool_config.h"
#endif
#include <sys/cdefs.h>
#include "crc_extern.h"
__BEGIN_DECLS
void pcrc(char *, u_int32_t, off_t);
void psum1(char *, u_int32_t, off_t);
void psum2(char *, u_int32_t, off_t);
int csum1(int, u_int32_t *, off_t *);
int csum2(int, u_int32_t *, off_t *);
int md5(int, u_int32_t *, u_int32_t *);
void MD2String(const char *);
void MD2TimeTrial(void);
void MD2TestSuite(void);
void MD2Filter(int);
void MD4String(const char *);
void MD4TimeTrial(void);
void MD4TestSuite(void);
void MD4Filter(int);
void MD5String(const char *);
void MD5TimeTrial(void);
void MD5TestSuite(void);
void MD5Filter(int);
void SHA1String(const char *);
void SHA1TimeTrial(void);
void SHA1TestSuite(void);
void SHA1Filter(int);
void RMD160String(const char *);
void RMD160TimeTrial(void);
void RMD160TestSuite(void);
void RMD160Filter(int);
void SHA256_String(const char *);
void SHA256_TimeTrial(void);
void SHA256_TestSuite(void);
void SHA256_Filter(int);
void SHA384_String(const char *);
void SHA384_TimeTrial(void);
void SHA384_TestSuite(void);
void SHA384_Filter(int);
void SHA512_String(const char *);
void SHA512_TimeTrial(void);
void SHA512_TestSuite(void);
void SHA512_Filter(int);
__END_DECLS

21
usr.bin/cksum/md2.c Normal file
View file

@ -0,0 +1,21 @@
/* $NetBSD: md2.c,v 1.1 2001/03/20 18:46:26 atatat Exp $ */
#include <md2.h> /* this hash type */
#include <md5.h> /* the hash we're replacing */
#define HASHTYPE "MD2"
#define HASHLEN 32
#define MD5Filter MD2Filter
#define MD5String MD2String
#define MD5TestSuite MD2TestSuite
#define MD5TimeTrial MD2TimeTrial
#define MD5Data MD2Data
#define MD5Init MD2Init
#define MD5Update MD2Update
#define MD5End MD2End
#define MD5_CTX MD2_CTX
#include "md5.c"

21
usr.bin/cksum/md4.c Normal file
View file

@ -0,0 +1,21 @@
/* $NetBSD: md4.c,v 1.1 2001/03/20 18:46:26 atatat Exp $ */
#include <md4.h> /* this hash type */
#include <md5.h> /* the hash we're replacing */
#define HASHTYPE "MD4"
#define HASHLEN 32
#define MD5Filter MD4Filter
#define MD5String MD4String
#define MD5TestSuite MD4TestSuite
#define MD5TimeTrial MD4TimeTrial
#define MD5Data MD4Data
#define MD5Init MD4Init
#define MD5Update MD4Update
#define MD5End MD4End
#define MD5_CTX MD4_CTX
#include "md5.c"

153
usr.bin/cksum/md5.c Normal file
View file

@ -0,0 +1,153 @@
/* $NetBSD: md5.c,v 1.10 2008/12/29 00:51:29 christos Exp $ */
/*
* MDDRIVER.C - test driver for MD2, MD4 and MD5
*/
/*
* Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All
* rights reserved.
*
* RSA Data Security, Inc. makes no representations concerning either
* the merchantability of this software or the suitability of this
* software for any particular purpose. It is provided "as is"
* without express or implied warranty of any kind.
*
* These notices must be retained in any copies of any part of this
* documentation and/or software.
*/
#if HAVE_NBTOOL_CONFIG_H
#include "nbtool_config.h"
#endif
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
__RCSID("$NetBSD: md5.c,v 1.10 2008/12/29 00:51:29 christos Exp $");
#endif /* not lint */
#include <sys/types.h>
#include <err.h>
#include <md5.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
void MD5Filter(int);
void MD5String(const char *);
void MD5TestSuite(void);
void MD5TimeTrial(void);
#ifndef HASHTYPE
#define HASHTYPE "MD5"
#endif
#ifndef HASHLEN
#define HASHLEN 32
#endif
/*
* Length of test block, number of test blocks.
*/
#define TEST_BLOCK_LEN 1000
#define TEST_BLOCK_COUNT 1000
/*
* Digests a string and prints the result.
*/
void
MD5String(const char *string)
{
unsigned int len = strlen(string);
char buf[HASHLEN + 1];
printf("%s (\"%s\") = %s\n", HASHTYPE, string,
MD5Data((const unsigned char *)string, len, buf));
}
/*
* Measures the time to digest TEST_BLOCK_COUNT TEST_BLOCK_LEN-byte blocks.
*/
void
MD5TimeTrial(void)
{
MD5_CTX context;
time_t endTime, startTime;
unsigned char block[TEST_BLOCK_LEN];
unsigned int i;
char *p, buf[HASHLEN + 1];
printf("%s time trial. Digesting %d %d-byte blocks ...", HASHTYPE,
TEST_BLOCK_LEN, TEST_BLOCK_COUNT);
fflush(stdout);
/* Initialize block */
for (i = 0; i < TEST_BLOCK_LEN; i++)
block[i] = (unsigned char) (i & 0xff);
/* Start timer */
time(&startTime);
/* Digest blocks */
MD5Init(&context);
for (i = 0; i < TEST_BLOCK_COUNT; i++)
MD5Update(&context, block, TEST_BLOCK_LEN);
p = MD5End(&context,buf);
/* Stop timer */
time(&endTime);
printf(" done\n");
printf("Digest = %s\n", p);
printf("Time = %ld seconds\n", (long) (endTime - startTime));
/*
* Be careful that endTime-startTime is not zero.
* (Bug fix from Ric * Anderson, ric@Artisoft.COM.)
*/
printf("Speed = %lld bytes/second\n",
(long long) TEST_BLOCK_LEN * TEST_BLOCK_COUNT /
((endTime - startTime) != 0 ? (endTime - startTime) : 1));
}
/*
* Digests a reference suite of strings and prints the results.
*/
void
MD5TestSuite(void)
{
printf("%s test suite:\n", HASHTYPE);
MD5String("");
MD5String("a");
MD5String("abc");
MD5String("message digest");
MD5String("abcdefghijklmnopqrstuvwxyz");
MD5String("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq");
MD5String
("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
MD5String
("1234567890123456789012345678901234567890\
1234567890123456789012345678901234567890");
}
/*
* Digests the standard input and prints the result.
*/
void
MD5Filter(int pipe)
{
MD5_CTX context;
size_t len;
unsigned char buffer[BUFSIZ];
char buf[HASHLEN + 1];
MD5Init(&context);
while ((len = fread(buffer, (size_t)1, (size_t)BUFSIZ, stdin)) > 0) {
if (pipe && (len != fwrite(buffer, (size_t)1, len, stdout)))
err(1, "stdout");
MD5Update(&context, buffer, (unsigned int)len);
}
printf("%s\n", MD5End(&context,buf));
}

76
usr.bin/cksum/print.c Normal file
View file

@ -0,0 +1,76 @@
/* $NetBSD: print.c,v 1.11 2005/01/12 17:04:35 xtraeme Exp $ */
/*-
* Copyright (c) 1991, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#if HAVE_NBTOOL_CONFIG_H
#include "nbtool_config.h"
#endif
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
#if 0
static char sccsid[] = "@(#)print.c 8.1 (Berkeley) 6/6/93";
#else
__RCSID("$NetBSD: print.c,v 1.11 2005/01/12 17:04:35 xtraeme Exp $");
#endif
#endif /* not lint */
#include <sys/types.h>
#include <stdio.h>
#include "extern.h"
void
pcrc(char *fn, u_int32_t val, off_t len)
{
(void)printf("%lu %lld", (unsigned long)val, (long long)len);
if (fn)
(void)printf(" %s", fn);
(void)printf("\n");
}
void
psum1(char *fn, u_int32_t val, off_t len)
{
(void)printf("%lu %lld", (unsigned long)val,
(long long)(len + 1023) / 1024);
if (fn)
(void)printf(" %s", fn);
(void)printf("\n");
}
void
psum2(char *fn, u_int32_t val, off_t len)
{
(void)printf("%lu %lld", (unsigned long)val,
(long long)(len + 511) / 512);
if (fn)
(void)printf(" %s", fn);
(void)printf("\n");
}

25
usr.bin/cksum/rmd160.c Normal file
View file

@ -0,0 +1,25 @@
/* $NetBSD: rmd160.c,v 1.3 2006/10/30 20:22:54 christos Exp $ */
#if HAVE_NBTOOL_CONFIG_H
#include "nbtool_config.h"
#endif
#include <rmd160.h> /* this hash type */
#include <md5.h> /* the hash we're replacing */
#define HASHTYPE "RMD160"
#define HASHLEN 40
#define MD5Filter RMD160Filter
#define MD5String RMD160String
#define MD5TestSuite RMD160TestSuite
#define MD5TimeTrial RMD160TimeTrial
#define MD5Data RMD160Data
#define MD5Init RMD160Init
#define MD5Update RMD160Update
#define MD5End RMD160End
#define MD5_CTX RMD160_CTX
#include "md5.c"

21
usr.bin/cksum/sha1.c Normal file
View file

@ -0,0 +1,21 @@
/* $NetBSD: sha1.c,v 1.1 2001/03/20 18:46:27 atatat Exp $ */
#include <sha1.h> /* this hash type */
#include <md5.h> /* the hash we're replacing */
#define HASHTYPE "SHA1"
#define HASHLEN 40
#define MD5Filter SHA1Filter
#define MD5String SHA1String
#define MD5TestSuite SHA1TestSuite
#define MD5TimeTrial SHA1TimeTrial
#define MD5Data SHA1Data
#define MD5Init SHA1Init
#define MD5Update SHA1Update
#define MD5End SHA1End
#define MD5_CTX SHA1_CTX
#include "md5.c"

25
usr.bin/cksum/sha256.c Normal file
View file

@ -0,0 +1,25 @@
/* $NetBSD: sha256.c,v 1.3 2006/10/30 20:22:54 christos Exp $ */
#if HAVE_NBTOOL_CONFIG_H
#include "nbtool_config.h"
#endif
#include <sha2.h> /* this hash type */
#include <md5.h> /* the hash we're replacing */
#define HASHTYPE "SHA256"
#define HASHLEN 64
#define MD5Filter SHA256_Filter
#define MD5String SHA256_String
#define MD5TestSuite SHA256_TestSuite
#define MD5TimeTrial SHA256_TimeTrial
#define MD5Data SHA256_Data
#define MD5Init SHA256_Init
#define MD5Update SHA256_Update
#define MD5End SHA256_End
#define MD5_CTX SHA256_CTX
#include "md5.c"

25
usr.bin/cksum/sha384.c Normal file
View file

@ -0,0 +1,25 @@
/* $NetBSD: sha384.c,v 1.3 2006/10/30 20:22:54 christos Exp $ */
#if HAVE_NBTOOL_CONFIG_H
#include "nbtool_config.h"
#endif
#include <sha2.h> /* this hash type */
#include <md5.h> /* the hash we're replacing */
#define HASHTYPE "SHA384"
#define HASHLEN 96
#define MD5Filter SHA384_Filter
#define MD5String SHA384_String
#define MD5TestSuite SHA384_TestSuite
#define MD5TimeTrial SHA384_TimeTrial
#define MD5Data SHA384_Data
#define MD5Init SHA384_Init
#define MD5Update SHA384_Update
#define MD5End SHA384_End
#define MD5_CTX SHA384_CTX
#include "md5.c"

25
usr.bin/cksum/sha512.c Normal file
View file

@ -0,0 +1,25 @@
/* $NetBSD: sha512.c,v 1.3 2006/10/30 20:22:54 christos Exp $ */
#if HAVE_NBTOOL_CONFIG_H
#include "nbtool_config.h"
#endif
#include <sha2.h> /* this hash type */
#include <md5.h> /* the hash we're replacing */
#define HASHTYPE "SHA512"
#define HASHLEN 128
#define MD5Filter SHA512_Filter
#define MD5String SHA512_String
#define MD5TestSuite SHA512_TestSuite
#define MD5TimeTrial SHA512_TimeTrial
#define MD5Data SHA512_Data
#define MD5Init SHA512_Init
#define MD5Update SHA512_Update
#define MD5End SHA512_End
#define MD5_CTX SHA512_CTX
#include "md5.c"

76
usr.bin/cksum/sum1.c Normal file
View file

@ -0,0 +1,76 @@
/* $NetBSD: sum1.c,v 1.13 2005/02/05 00:13:34 simonb Exp $ */
/*-
* Copyright (c) 1991, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#if HAVE_NBTOOL_CONFIG_H
#include "nbtool_config.h"
#endif
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
#if 0
static char sccsid[] = "@(#)sum1.c 8.1 (Berkeley) 6/6/93";
#else
__RCSID("$NetBSD: sum1.c,v 1.13 2005/02/05 00:13:34 simonb Exp $");
#endif
#endif /* not lint */
#include <sys/types.h>
#include <unistd.h>
#include "extern.h"
int
csum1(int fd, u_int32_t *cval, off_t *clen)
{
off_t total;
int nr;
u_int thecrc;
u_char *p;
u_char buf[8192];
/*
* 16-bit checksum, rotating right before each addition;
* overflow is discarded.
*/
thecrc = total = 0;
while ((nr = read(fd, buf, sizeof(buf))) > 0)
for (total += nr, p = buf; nr--; ++p) {
if (thecrc & 1)
thecrc |= 0x10000;
thecrc = ((thecrc >> 1) + *p) & 0xffff;
}
if (nr < 0)
return 1;
*cval = thecrc;
*clen = total;
return 0;
}

80
usr.bin/cksum/sum2.c Normal file
View file

@ -0,0 +1,80 @@
/* $NetBSD: sum2.c,v 1.13 2005/02/05 00:13:34 simonb Exp $ */
/*-
* Copyright (c) 1991, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#if HAVE_NBTOOL_CONFIG_H
#include "nbtool_config.h"
#endif
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
#if 0
static char sccsid[] = "@(#)sum2.c 8.1 (Berkeley) 6/6/93";
#else
__RCSID("$NetBSD: sum2.c,v 1.13 2005/02/05 00:13:34 simonb Exp $");
#endif
#endif /* not lint */
#include <sys/types.h>
#include <unistd.h>
#include "extern.h"
int
csum2(int fd, u_int32_t *cval, off_t *clen)
{
u_int32_t thecrc;
off_t total;
int nr;
u_char *p;
u_char buf[8192];
/*
* Draft 8 POSIX 1003.2:
*
* s = sum of all bytes
* r = s % 2^16 + (s % 2^32) / 2^16
* thecrc = (r % 2^16) + r / 2^16
*/
thecrc = 0;
total = 0;
while ((nr = read(fd, buf, sizeof(buf))) > 0)
for (total += nr, p = buf; nr--; ++p)
thecrc += *p;
if (nr < 0)
return 1;
thecrc = (thecrc & 0xffff) + (thecrc >> 16);
thecrc = (thecrc & 0xffff) + (thecrc >> 16);
*cval = thecrc;
*clen = total;
return 0;
}