[comp.sources.unix] v21i020: Snefru hash and netnews validation programs, Part02/04

rsalz@bbn.com (Rich Salz) (03/23/90)

Submitted-by: Rich $alz <rsalz@bbn.com>
Posting-number: Volume 21, Issue 20
Archive-name: snefru/part02

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 2 (of 4)."
# Contents:  hash512.c testboxes.c2
# Wrapped by rsalz@litchi.bbn.com on Thu Mar 22 13:36:38 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'hash512.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'hash512.c'\"
else
echo shar: Extracting \"'hash512.c'\" \(11263 characters\)
sed "s/^X//" >'hash512.c' <<'END_OF_FILE'
X/*
X**  This is Snefru, derived from the Xerox Secure Hash Function.
X**  Snefru is a one-way hash function that provides authentication.
X**  It does not provide secrecy.
X**
X**  Snefru is named after a Pharaoh of ancient Egypt.
X**
X**  It is based on code that is:
X**	Copyright (c) Xerox Corporation 1989.  All rights reserved.
X**
X**	License to copy and use this software is granted provided that it
X**	is identified as the 'Xerox Secure Hash Function' in all material
X**	mentioning or referencing this software or this hash function.
X**
X**	License is also granted to make and use derivative works provided
X**	that such works are identified as 'derived from the Xerox Secure
X**	Hash Function' in all material mentioning or referencing the
X**	derived work.
X**
X**	Xerox Corporation makes no representations concerning either the
X**	merchantability of this software or the suitability of this
X**	software for any particular purpose.  It is provided "as is"
X**	without express or implied warranty of any kind.
X**
X**	These notices must be retained in any copies of any part of this
X**	software.
X**
X**  Based on the reference implementation (no algorithm changes) of
X**  version 2.0, July 31, 1989.  Implementor:  Ralph C. Merkle.
X**  This edition is by Rich $alz, <rsalz@bbn.com>.
X*/
X#include <stdio.h>
X#ifdef	lint
X#ifndef	NDEBUG
X#define NDEBUG
X#endif	/* NDEBUG */
X#endif	/* lint */
X#include <assert.h>
X#include "snefru.h"
X#ifdef	RCSID
Xstatic char RCS[] =
X	"$Header: hash512.c,v 1.1 90/03/22 12:58:26 rsalz Exp $";
X#endif	/* RCSID */
X
X
X/* Note that the 32-bit word specified by RotatedSnefruSBoxes[i][j][k]
X * is rotated right by i*8 bits. */
Xstatic SBOX	RotatedSnefruSBoxes[4][SBOXCOUNT];
X
X
XSetupHash512()
X{
X    register int	index;
X    register int	rotation;
X    register int	i;
X
X    for (index = 0; index < SBOXCOUNT; index++)
X	for (rotation = 0; rotation < 4; rotation++)
X	    for (i = 0; i < 256; i++)
X		RotatedSnefruSBoxes[rotation][index][i] =
X		    (SnefruSBoxes[index][i] >> (rotation * 8)) |
X		    (SnefruSBoxes[index][i] << (32 - rotation * 8));
X}
X
X
X/*
X**  This routine is a specialized version of HashN.  It is optimized for
X**  speed, and assumes that the input is always 16 words long:  it hashes
X**  512 bits, hence its name.  You need not try to figure out this routine
X**  unless you wish to figure out a fast implementation of Snefru.
X*/
XHash512(output, input, level, OutputBlockSize)
X    WORD32		output[OUTPUTBLOCKSIZE];
X    WORD32		input[];
X    int			level;
X    int			OutputBlockSize;
X{
X    register WORD32	block00, block01, block02, block03;
X    register WORD32	block04, block05, block06, block07;
X    register WORD32	block08, block09, block10, block11;
X    register WORD32	block12, block13, block14, block15;
X    WORD32		SBoxEntry;
X    WORD32		*SBox0;
X    WORD32		*SBox1;
X    int			index;
X
X    assert(OutputBlockSize == 4 || OutputBlockSize == 8);
X
X    /* Initialize the block to be encrypted from the input.  In theory
X     * block<i> should be kept in register.  Not all compilers can do
X     * this, even when there are enough registers -- this will degrade
X     * performance significantly. */
X    block00 = input[0];
X    block01 = input[1];
X    block02 = input[2];
X    block03 = input[3];
X    block04 = input[4];
X    block05 = input[5];
X    block06 = input[6];
X    block07 = input[7];
X    block08 = input[8];
X    block09 = input[9];
X    block10 = input[10];
X    block11 = input[11];
X    block12 = input[12];
X    block13 = input[13];
X    block14 = input[14];
X    block15 = input[15];
X
X    for (index = 0; index < 2 * level; index += 2) {
X	/* set up the base address for the two S-box pointers.  */
X	SBox0 = RotatedSnefruSBoxes[0][index];
X	SBox1 = SBox0 + 256;
X
X	/* In the following unrolled code, the basic 'assembly language'
X	 * block that is repeated is:
X	 *	1	temp1 = shift(block<i>, shiftConstant)
X	 *	2	temp2 = temp1 & 0x3FC
X	 *	3	temp3 = S-box<0 or 1> + temp2
X	 *	4	temp4 = *temp3
X	 *	5	block<i-1> ^= temp4
X	 *	6	block<i+1> ^= temp4
X	 * STEP 1:  Simply shift the i'th 32-bit block to bring the 8-bit
X	 * byte into the right position.  Note that we will also build-in a
X	 * left-shift by two bits at this stage, to eliminate the left shift
X	 * required later because we are indexing into an array of four-byte
X	 * table entries.
X	 * 
X	 * STEP 1:  Mask off the desired eight bits.  Note that 0x3FC is
X	 * simply 0xFF << 2.
X	 * 
X	 * STEP 1:  Use a normal integer add to compute the actual address
X	 * of the S-box entry.  Note that one of two pointers is used, as
X	 * appropriate.  Temp3 then holds the actual byte address of the
X	 * desired S-box entry.
X	 * 
X	 * STEP 1:  Load the four-byte S-box entry.
X	 * 
X	 * STEPS 5 and 6:  XOR the loaded S-box entry with both the
X	 * previous and the next 32-bit entries in the 'block' array.
X	 * 
X	 * Typical optimizing comilers might fail to put all the block<i>
X	 * variables into registers. This can result in significant
X	 * performance degradation. Also, most compilers will use a separate
X	 * left-shift-by-2 after masking off the needed 8 bits, but the
X	 * performance degradation caused by this oversight should be modest.
X	 */
X	SBoxEntry = SBox0[block00 & 0xFF];
X	block01 ^= SBoxEntry;
X	block15 ^= SBoxEntry;
X	SBoxEntry = SBox0[block01 & 0xFF];
X	block02 ^= SBoxEntry;
X	block00 ^= SBoxEntry;
X	SBoxEntry = SBox1[block02 & 0xFF];
X	block03 ^= SBoxEntry;
X	block01 ^= SBoxEntry;
X	SBoxEntry = SBox1[block03 & 0xFF];
X	block04 ^= SBoxEntry;
X	block02 ^= SBoxEntry;
X	SBoxEntry = SBox0[block04 & 0xFF];
X	block05 ^= SBoxEntry;
X	block03 ^= SBoxEntry;
X	SBoxEntry = SBox0[block05 & 0xFF];
X	block06 ^= SBoxEntry;
X	block04 ^= SBoxEntry;
X	SBoxEntry = SBox1[block06 & 0xFF];
X	block07 ^= SBoxEntry;
X	block05 ^= SBoxEntry;
X	SBoxEntry = SBox1[block07 & 0xFF];
X	block08 ^= SBoxEntry;
X	block06 ^= SBoxEntry;
X	SBoxEntry = SBox0[block08 & 0xFF];
X	block09 ^= SBoxEntry;
X	block07 ^= SBoxEntry;
X	SBoxEntry = SBox0[block09 & 0xFF];
X	block10 ^= SBoxEntry;
X	block08 ^= SBoxEntry;
X	SBoxEntry = SBox1[block10 & 0xFF];
X	block11 ^= SBoxEntry;
X	block09 ^= SBoxEntry;
X	SBoxEntry = SBox1[block11 & 0xFF];
X	block12 ^= SBoxEntry;
X	block10 ^= SBoxEntry;
X	SBoxEntry = SBox0[block12 & 0xFF];
X	block13 ^= SBoxEntry;
X	block11 ^= SBoxEntry;
X	SBoxEntry = SBox0[block13 & 0xFF];
X	block14 ^= SBoxEntry;
X	block12 ^= SBoxEntry;
X	SBoxEntry = SBox1[block14 & 0xFF];
X	block15 ^= SBoxEntry;
X	block13 ^= SBoxEntry;
X	SBoxEntry = SBox1[block15 & 0xFF];
X	block00 ^= SBoxEntry;
X	block14 ^= SBoxEntry;
X
X	/* SBox0 = RotatedSnefruSBoxes[2][index];  */
X	SBox0 += 2 * SBOXCOUNT * 256;
X	SBox1 = SBox0 + 256;
X
X	SBoxEntry = SBox0[(block00 >> 16) & 0xFF];
X	block01 ^= SBoxEntry;
X	block15 ^= SBoxEntry;
X	SBoxEntry = SBox0[(block01 >> 16) & 0xFF];
X	block02 ^= SBoxEntry;
X	block00 ^= SBoxEntry;
X	SBoxEntry = SBox1[(block02 >> 16) & 0xFF];
X	block03 ^= SBoxEntry;
X	block01 ^= SBoxEntry;
X	SBoxEntry = SBox1[(block03 >> 16) & 0xFF];
X	block04 ^= SBoxEntry;
X	block02 ^= SBoxEntry;
X	SBoxEntry = SBox0[(block04 >> 16) & 0xFF];
X	block05 ^= SBoxEntry;
X	block03 ^= SBoxEntry;
X	SBoxEntry = SBox0[(block05 >> 16) & 0xFF];
X	block06 ^= SBoxEntry;
X	block04 ^= SBoxEntry;
X	SBoxEntry = SBox1[(block06 >> 16) & 0xFF];
X	block07 ^= SBoxEntry;
X	block05 ^= SBoxEntry;
X	SBoxEntry = SBox1[(block07 >> 16) & 0xFF];
X	block08 ^= SBoxEntry;
X	block06 ^= SBoxEntry;
X	SBoxEntry = SBox0[(block08 >> 16) & 0xFF];
X	block09 ^= SBoxEntry;
X	block07 ^= SBoxEntry;
X	SBoxEntry = SBox0[(block09 >> 16) & 0xFF];
X	block10 ^= SBoxEntry;
X	block08 ^= SBoxEntry;
X	SBoxEntry = SBox1[(block10 >> 16) & 0xFF];
X	block11 ^= SBoxEntry;
X	block09 ^= SBoxEntry;
X	SBoxEntry = SBox1[(block11 >> 16) & 0xFF];
X	block12 ^= SBoxEntry;
X	block10 ^= SBoxEntry;
X	SBoxEntry = SBox0[(block12 >> 16) & 0xFF];
X	block13 ^= SBoxEntry;
X	block11 ^= SBoxEntry;
X	SBoxEntry = SBox0[(block13 >> 16) & 0xFF];
X	block14 ^= SBoxEntry;
X	block12 ^= SBoxEntry;
X	SBoxEntry = SBox1[(block14 >> 16) & 0xFF];
X	block15 ^= SBoxEntry;
X	block13 ^= SBoxEntry;
X	SBoxEntry = SBox1[(block15 >> 16) & 0xFF];
X	block00 ^= SBoxEntry;
X	block14 ^= SBoxEntry;
X
X
X	/* SBox0 = RotatedSnefruSBoxes[1][index];  */
X	SBox0 -= SBOXCOUNT * 256;
X	SBox1 = SBox0 + 256;
X
X	SBoxEntry = SBox0[block00 >> 24];
X	block01 ^= SBoxEntry;
X	block15 ^= SBoxEntry;
X	SBoxEntry = SBox0[block01 >> 24];
X	block02 ^= SBoxEntry;
X	block00 ^= SBoxEntry;
X	SBoxEntry = SBox1[block02 >> 24];
X	block03 ^= SBoxEntry;
X	block01 ^= SBoxEntry;
X	SBoxEntry = SBox1[block03 >> 24];
X	block04 ^= SBoxEntry;
X	block02 ^= SBoxEntry;
X	SBoxEntry = SBox0[block04 >> 24];
X	block05 ^= SBoxEntry;
X	block03 ^= SBoxEntry;
X	SBoxEntry = SBox0[block05 >> 24];
X	block06 ^= SBoxEntry;
X	block04 ^= SBoxEntry;
X	SBoxEntry = SBox1[block06 >> 24];
X	block07 ^= SBoxEntry;
X	block05 ^= SBoxEntry;
X	SBoxEntry = SBox1[block07 >> 24];
X	block08 ^= SBoxEntry;
X	block06 ^= SBoxEntry;
X	SBoxEntry = SBox0[block08 >> 24];
X	block09 ^= SBoxEntry;
X	block07 ^= SBoxEntry;
X	SBoxEntry = SBox0[block09 >> 24];
X	block10 ^= SBoxEntry;
X	block08 ^= SBoxEntry;
X	SBoxEntry = SBox1[block10 >> 24];
X	block11 ^= SBoxEntry;
X	block09 ^= SBoxEntry;
X	SBoxEntry = SBox1[block11 >> 24];
X	block12 ^= SBoxEntry;
X	block10 ^= SBoxEntry;
X	SBoxEntry = SBox0[block12 >> 24];
X	block13 ^= SBoxEntry;
X	block11 ^= SBoxEntry;
X	SBoxEntry = SBox0[block13 >> 24];
X	block14 ^= SBoxEntry;
X	block12 ^= SBoxEntry;
X	SBoxEntry = SBox1[block14 >> 24];
X	block15 ^= SBoxEntry;
X	block13 ^= SBoxEntry;
X	SBoxEntry = SBox1[block15 >> 24];
X	block00 ^= SBoxEntry;
X	block14 ^= SBoxEntry;
X
X
X	/* SBox0 = RotatedSnefruSBoxes[3][index];  */
X	SBox0 += 2 * SBOXCOUNT * 256;
X	SBox1 = SBox0 + 256;
X
X	SBoxEntry = SBox0[(block00 >> 8) & 0xFF];
X	block01 ^= SBoxEntry;
X	block15 ^= SBoxEntry;
X	SBoxEntry = SBox0[(block01 >> 8) & 0xFF];
X	block02 ^= SBoxEntry;
X	block00 ^= SBoxEntry;
X	SBoxEntry = SBox1[(block02 >> 8) & 0xFF];
X	block03 ^= SBoxEntry;
X	block01 ^= SBoxEntry;
X	SBoxEntry = SBox1[(block03 >> 8) & 0xFF];
X	block04 ^= SBoxEntry;
X	block02 ^= SBoxEntry;
X	SBoxEntry = SBox0[(block04 >> 8) & 0xFF];
X	block05 ^= SBoxEntry;
X	block03 ^= SBoxEntry;
X	SBoxEntry = SBox0[(block05 >> 8) & 0xFF];
X	block06 ^= SBoxEntry;
X	block04 ^= SBoxEntry;
X	SBoxEntry = SBox1[(block06 >> 8) & 0xFF];
X	block07 ^= SBoxEntry;
X	block05 ^= SBoxEntry;
X	SBoxEntry = SBox1[(block07 >> 8) & 0xFF];
X	block08 ^= SBoxEntry;
X	block06 ^= SBoxEntry;
X	SBoxEntry = SBox0[(block08 >> 8) & 0xFF];
X	block09 ^= SBoxEntry;
X	block07 ^= SBoxEntry;
X	SBoxEntry = SBox0[(block09 >> 8) & 0xFF];
X	block10 ^= SBoxEntry;
X	block08 ^= SBoxEntry;
X	SBoxEntry = SBox1[(block10 >> 8) & 0xFF];
X	block11 ^= SBoxEntry;
X	block09 ^= SBoxEntry;
X	SBoxEntry = SBox1[(block11 >> 8) & 0xFF];
X	block12 ^= SBoxEntry;
X	block10 ^= SBoxEntry;
X	SBoxEntry = SBox0[(block12 >> 8) & 0xFF];
X	block13 ^= SBoxEntry;
X	block11 ^= SBoxEntry;
X	SBoxEntry = SBox0[(block13 >> 8) & 0xFF];
X	block14 ^= SBoxEntry;
X	block12 ^= SBoxEntry;
X	SBoxEntry = SBox1[(block14 >> 8) & 0xFF];
X	block15 ^= SBoxEntry;
X	block13 ^= SBoxEntry;
X	SBoxEntry = SBox1[(block15 >> 8) & 0xFF];
X	block00 ^= SBoxEntry;
X	block14 ^= SBoxEntry;
X    }
X
X    output[0] = input[0] ^ block15;
X    output[1] = input[1] ^ block14;
X    output[2] = input[2] ^ block13;
X    output[3] = input[3] ^ block12;
X
X    /* Generate an extra 128 bits if the output is 256 bits. */
X    if (OutputBlockSize == 8) {
X	output[4] = input[4] ^ block11;
X	output[5] = input[5] ^ block10;
X	output[6] = input[6] ^ block09;
X	output[7] = input[7] ^ block08;
X    }
X}
END_OF_FILE
if test 11263 -ne `wc -c <'hash512.c'`; then
    echo shar: \"'hash512.c'\" unpacked with wrong size!
fi
# end of 'hash512.c'
fi
if test -f 'testboxes.c2' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'testboxes.c2'\"
else
echo shar: Extracting \"'testboxes.c2'\" \(26755 characters\)
sed "s/^X//" >'testboxes.c2' <<'END_OF_FILE'
X		"89792", "62604", "62234", "13124", "76471",
X/* 271 */	"51667", "37589", "87147", "24743", "48023",
X		"06325", "79794", "35889", "13255", "04925",
X/* 272 */	"99004", "70322", "60832", "76636", "56907",
X		"56534", "72615", "46288", "36788", "93196",
X/* 273 */	"68656", "66492", "35933", "52293", "47953",
X		"95495", "95304", "50009", "83464", "28608",
X/* 274 */	"38074", "74083", "09337", "07965", "65047",
X		"36871", "59015", "21769", "30398", "44855",
X/* 275 */	"01020", "80680", "59328", "08712", "48190",
X		"45332", "27284", "31287", "66011", "09376",
X/* 276 */	"86379", "74508", "33579", "77114", "92955",
X		"23085", "92824", "03054", "25242", "16322",
X/* 277 */	"48498", "09938", "44420", "13484", "52319",
X		"58875", "02012", "88591", "52500", "95795",
X/* 278 */	"41800", "95363", "54142", "17482", "32705",
X		"60564", "12505", "40954", "46174", "64130",
X/* 279 */	"63026", "96712", "79883", "39225", "52653",
X		"69549", "36693", "59822", "22684", "31661",
X/* 280 */	"88298", "15489", "16030", "42480", "15372",
X		"38781", "71995", "77438", "91161", "10192",
X/* 281 */	"07839", "62735", "99218", "25624", "02547",
X		"27445", "69187", "55749", "32322", "15504",
X/* 282 */	"73298", "51108", "48717", "92926", "75705",
X		"89787", "96114", "99902", "37749", "96305",
X/* 283 */	"12829", "70474", "00838", "50385", "91711",
X		"80370", "56504", "56857", "80906", "09018",
X/* 284 */	"76569", "61072", "48568", "36491", "22587",
X		"44363", "39592", "61546", "90181", "37348",
X/* 285 */	"41665", "41339", "62106", "44203", "06732",
X		"76111", "79840", "67999", "32231", "76869",
X/* 286 */	"58652", "49983", "01669", "27464", "79553",
X		"52855", "25988", "18087", "38052", "17529",
X/* 287 */	"13607", "00657", "76173", "43357", "77334",
X		"24140", "53860", "02906", "89863", "44651",
X/* 288 */	"55715", "26203", "65933", "51087", "98234",
X		"40625", "45545", "63563", "89148", "82581",
X/* 289 */	"04110", "66683", "99001", "09796", "47349",
X		"65003", "66524", "81970", "71262", "14479",
X/* 290 */	"31300", "08681", "58068", "44115", "40064",
X		"77879", "23965", "69019", "73985", "19453",
X/* 291 */	"26225", "97543", "37044", "07494", "85778",
X		"35345", "61115", "92498", "49737", "64599",
X/* 292 */	"07158", "82763", "25072", "38478", "57782",
X		"75291", "62155", "52056", "04786", "11585",
X/* 293 */	"71251", "25572", "79771", "93328", "66927",
X		"54069", "58752", "26624", "50463", "77361",
X/* 294 */	"29991", "96526", "02820", "91659", "12818",
X		"96356", "49499", "01507", "40223", "09171",
X/* 295 */	"83642", "21057", "02677", "09367", "38097",
X		"16100", "19355", "06120", "15378", "56559",
X/* 296 */	"69167", "30235", "06767", "66323", "78294",
X		"14916", "19124", "88044", "16673", "66102",
X/* 297 */	"86018", "29406", "75415", "22038", "27056",
X		"26906", "25867", "14751", "92380", "30434",
X/* 298 */	"44114", "06026", "79553", "55091", "95385",
X		"41212", "37882", "46864", "54717", "97038",
X/* 299 */	"53805", "64150", "70915", "63127", "63695",
X		"41288", "38192", "72437", "75075", "18570",
X/* 300 */	"52065", "08853", "30104", "79937", "66913",
X		"53200", "84570", "78079", "28970", "53859",
X/* 301 */	"37632", "80274", "35240", "32960", "74859",
X		"07359", "55176", "03930", "38984", "35151",
X/* 302 */	"82576", "82805", "94031", "12779", "90879",
X		"24109", "25367", "77861", "09541", "85739",
X/* 303 */	"69023", "64971", "99321", "07521", "95909",
X		"43897", "71724", "92581", "05471", "64337",
X/* 304 */	"98949", "03606", "78236", "78985", "29212",
X		"57369", "34857", "67757", "58019", "58872",
X/* 305 */	"96526", "28749", "56592", "37871", "72905",
X		"70198", "57319", "54116", "47014", "18285",
X/* 306 */	"33692", "72111", "60958", "96848", "17893",
X		"40993", "50445", "14186", "76877", "87867",
X/* 307 */	"50335", "09513", "44346", "26439", "55293",
X		"06449", "44301", "63740", "40158", "72703",
X/* 308 */	"88321", "85062", "57345", "66231", "15409",
X		"03451", "95261", "43561", "15673", "28956",
X/* 309 */	"90303", "62469", "82517", "43035", "36850",
X		"15592", "64098", "59022", "31752", "04370",
X/* 310 */	"50486", "11885", "23085", "41712", "80692",
X		"48492", "16495", "99721", "36912", "28267",
X/* 311 */	"27882", "16269", "64483", "11273", "02680",
X		"01616", "46138", "54606", "14761", "05134",
X/* 312 */	"45144", "63213", "49666", "27441", "86989",
X		"29884", "54334", "06740", "08368", "80051",
X/* 313 */	"81020", "17882", "74973", "74531", "94994",
X		"24927", "64894", "22667", "20466", "82948",
X/* 314 */	"66831", "47427", "76033", "31197", "59817",
X		"20064", "61135", "28556", "29695", "80179",
X/* 315 */	"74058", "18293", "09963", "35278", "13062",
X		"83094", "23373", "90287", "33477", "48865",
X/* 316 */	"30348", "70174", "11468", "25994", "25343",
X		"22317", "01587", "30682", "00001", "67814",
X/* 317 */	"59557", "23362", "13746", "82244", "42093",
X		"24671", "79458", "93730", "45488", "60234",
X/* 318 */	"67098", "09899", "25775", "00332", "36636",
X		"57594", "19958", "85564", "58977", "12247",
X/* 319 */	"60774", "66371", "69442", "20385", "14486",
X		"91330", "50332", "46023", "75768", "59877",
X/* 320 */	"60081", "92936", "72302", "75064", "85727",
X		"52987", "05750", "19384", "33684", "78859",
X/* 321 */	"80458", "69902", "34870", "88684", "49762",
X		"40801", "86291", "18194", "90366", "82639",
X/* 322 */	"53844", "96326", "65728", "48563", "26027",
X		"52692", "62406", "76294", "41848", "63010",
X/* 323 */	"69841", "29451", "36170", "21529", "16525",
X		"64326", "22086", "24469", "57407", "96033",
X/* 324 */	"37771", "31002", "18311", "93285", "31948",
X		"14331", "58335", "15977", "80336", "81667",
X/* 325 */	"27286", "24361", "61638", "57580", "95270",
X		"46180", "76990", "53031", "94366", "02727",
X/* 326 */	"49944", "19278", "05756", "51875", "53445",
X		"33342", "01965", "07937", "10054", "97712",
X/* 327 */	"87693", "58124", "46064", "39133", "77385",
X		"09605", "65359", "70113", "90563", "86637",
X/* 328 */	"94282", "12025", "31926", "24541", "23854",
X		"58407", "32131", "92845", "20714", "27898",
X/* 329 */	"26917", "50326", "35145", "50859", "72119",
X		"95094", "29441", "42301", "62460", "75252",
X/* 330 */	"94267", "38422", "73047", "24200", "85349",
X		"72049", "91723", "97802", "98496", "12734",
X/* 331 */	"73432", "10371", "57213", "53300", "80847",
X		"46229", "07099", "72961", "13767", "65654",
X/* 332 */	"31102", "82119", "96946", "65919", "81083",
X		"03819", "57888", "57908", "16849", "77111",
X/* 333 */	"41429", "92261", "45263", "01172", "55926",
X		"78835", "27697", "48420", "58865", "41207",
X/* 334 */	"21406", "08582", "10785", "36233", "12237",
X		"07866", "13706", "92551", "11021", "63813",
X/* 335 */	"71512", "65206", "37768", "94325", "14721",
X		"20990", "54235", "71986", "05345", "56239",
X/* 336 */	"52028", "01419", "07215", "55067", "11669",
X		"21738", "66605", "69621", "69827", "08537",
X/* 337 */	"18638", "60982", "28151", "98885", "76431",
X		"25566", "03085", "23639", "30849", "63986",
X/* 338 */	"73287", "26201", "36174", "14106", "54102",
X		"57041", "16141", "64174", "03591", "90024",
X/* 339 */	"73332", "31254", "17288", "59809", "25061",
X		"51612", "47951", "16570", "43330", "79213",
X/* 340 */	"11354", "55585", "19646", "99246", "37564",
X		"32660", "20632", "21124", "60597", "69315",
X/* 341 */	"31312", "57741", "85108", "21615", "24365",
X		"27684", "16124", "33888", "14966", "35303",
X/* 342 */	"69921", "15795", "04020", "67672", "86816",
X		"63027", "84470", "45605", "44887", "26222",
X/* 343 */	"79888", "58982", "22466", "98844", "48353",
X		"60666", "58256", "31140", "93507", "69561",
X/* 344 */	"06256", "88526", "18655", "00865", "75247",
X		"00264", "65957", "98261", "72706", "36396",
X/* 345 */	"46065", "85700", "32121", "99975", "73627",
X		"78812", "89638", "86602", "96758", "65099",
X/* 346 */	"52777", "46792", "13790", "55240", "52002",
X		"10313", "91933", "71231", "10053", "78416",
X/* 347 */	"54563", "96004", "42215", "30094", "45958",
X		"48437", "49591", "50483", "13422", "69108",
X/* 348 */	"59952", "27896", "40450", "79327", "31962",
X		"46456", "39260", "51479", "61882", "48181",
X/* 349 */	"50691", "64709", "32902", "10676", "12083",
X		"35771", "79656", "56667", "76783", "03937",
X/* 350 */	"99859", "10362", "57411", "40986", "35045",
X		"02838", "29255", "64230", "84418", "34988",
X/* 351 */	"77644", "39892", "77327", "74129", "53444",
X		"35487", "95803", "38640", "20383", "55402",
X/* 352 */	"25793", "14213", "87082", "42837", "95030",
X		"97198", "61608", "97723", "79390", "35290",
X/* 353 */	"34683", "81419", "87133", "70447", "53127",
X		"97146", "28299", "56763", "12868", "01145",
X/* 354 */	"12147", "58158", "92124", "60934", "18414",
X		"97510", "07056", "54488", "20719", "53743",
X/* 355 */	"91037", "44797", "52110", "08512", "18991",
X		"20129", "31441", "51449", "14661", "71126",
X/* 356 */	"23180", "68124", "18807", "70997", "21913",
X		"19594", "70355", "73637", "68266", "60775",
X/* 357 */	"43164", "52643", "96363", "77989", "79332",
X		"39890", "65379", "20405", "52935", "43816",
X/* 358 */	"92740", "95319", "04538", "60660", "28982",
X		"15328", "80475", "34690", "02293", "19646",
X/* 359 */	"46524", "96627", "33159", "42081", "08816",
X		"74931", "20674", "08697", "66169", "46460",
X/* 360 */	"46326", "39923", "60625", "28386", "22919",
X		"19415", "75766", "43668", "31626", "70301",
X/* 361 */	"67053", "03949", "70082", "02303", "48642",
X		"38429", "94053", "38770", "68137", "68441",
X/* 362 */	"52928", "70244", "91954", "17401", "92693",
X		"98342", "21451", "84988", "80487", "33807",
X/* 363 */	"73797", "49494", "41878", "76635", "83227",
X		"76618", "11946", "13451", "87591", "78381",
X/* 364 */	"21407", "90038", "72638", "69692", "51599",
X		"86413", "32019", "64856", "74730", "41531",
X/* 365 */	"11064", "01790", "58817", "86400", "66213",
X		"92599", "70905", "78324", "54326", "43659",
X/* 366 */	"34206", "63132", "38837", "40210", "96346",
X		"16967", "81619", "96503", "14881", "89405",
X/* 367 */	"32205", "49508", "98425", "02451", "35423",
X		"56072", "36810", "30332", "85998", "49358",
X/* 368 */	"92748", "84147", "79835", "94867", "41224",
X		"61794", "35066", "82220", "66684", "20096",
X/* 369 */	"02754", "41731", "37068", "32753", "91059",
X		"13407", "05607", "69384", "53329", "95909",
X/* 370 */	"44968", "11397", "92973", "50014", "92997",
X		"80968", "93761", "57598", "74703", "07768",
X/* 371 */	"37978", "73873", "33475", "09720", "97852",
X		"98449", "48722", "84977", "11271", "11728",
X/* 372 */	"68318", "22312", "78792", "87508", "88466",
X		"72976", "47099", "84126", "38595", "85124",
X/* 373 */	"64405", "90020", "07492", "52413", "95111",
X		"34455", "86311", "68892", "01074", "60274",
X/* 374 */	"28136", "19328", "38161", "57475", "13771",
X		"63562", "84207", "94121", "18901", "52768",
X/* 375 */	"33801", "82087", "86091", "59969", "90398",
X		"56870", "55756", "78841", "98450", "54165",
X/* 376 */	"55106", "50343", "70519", "14567", "36780",
X		"55450", "19606", "83749", "67562", "64765",
X/* 377 */	"38543", "16585", "86841", "73742", "08766",
X		"39252", "75678", "75379", "78760", "37279",
X/* 378 */	"15280", "13558", "95916", "89759", "76686",
X		"76467", "67147", "63110", "94008", "08037",
X/* 379 */	"35263", "53710", "16667", "79008", "11231",
X		"29397", "67136", "18601", "64502", "90228",
X/* 380 */	"89109", "72849", "22711", "65547", "34542",
X		"26686", "81678", "87765", "77654", "23664",
X/* 381 */	"96352", "14106", "32938", "28083", "18633",
X		"80286", "65507", "46197", "52722", "75476",
X/* 382 */	"77816", "47204", "34876", "45963", "79262",
X		"90181", "84041", "03745", "90041", "30780",
X/* 383 */	"27226", "92847", "85572", "15308", "80688",
X		"05761", "82638", "13464", "23683", "81015",
X/* 384 */	"54214", "64175", "43701", "86845", "15569",
X		"50687", "52679", "87696", "08285", "97444",
X/* 385 */	"47599", "94472", "64150", "87753", "68652",
X		"60726", "26213", "17320", "64553", "81285",
X/* 386 */	"98126", "12158", "52095", "64833", "00492",
X		"35817", "55571", "91300", "97812", "37507",
X/* 387 */	"04209", "53515", "64342", "21223", "16662",
X		"43265", "68219", "03529", "43636", "68417",
X/* 388 */	"53640", "95326", "93381", "37113", "80751",
X		"76469", "96677", "43054", "22937", "31954",
X/* 389 */	"13266", "34140", "27253", "02734", "99070",
X		"60077", "57988", "93211", "92795", "83795",
X/* 390 */	"57477", "03941", "39007", "14619", "38320",
X		"93449", "31336", "25279", "97030", "26245",
X/* 391 */	"47394", "39475", "90621", "23820", "29344",
X		"94859", "91604", "14033", "41868", "14816",
X/* 392 */	"04075", "66644", "87803", "97815", "99552",
X		"78666", "03942", "08175", "22345", "19983",
X/* 393 */	"76783", "99044", "20851", "84981", "59052",
X		"77178", "72109", "76475", "21619", "73017",
X/* 394 */	"06812", "56633", "50612", "55289", "04671",
X		"84419", "94072", "94446", "80603", "32188",
X/* 395 */	"93415", "23464", "43947", "43728", "74284",
X		"67177", "57105", "31059", "10642", "13803",
X/* 396 */	"69602", "46961", "66567", "19359", "84676",
X		"63918", "40650", "12923", "15974", "79732",
X/* 397 */	"20225", "92525", "71179", "04859", "91208",
X		"60430", "05239", "61458", "24089", "68852",
X/* 398 */	"60171", "29603", "42535", "86365", "93905",
X		"28237", "45317", "60718", "82001", "41679",
X/* 399 */	"20679", "56304", "70043", "87568", "21386",
X		"59049", "78353", "48696", "77379", "55309",
X/* 400 */	"23780", "28391", "05940", "55583", "81256",
X		"59418", "97521", "32846", "70761", "90115",
X/* 401 */	"45325", "05490", "65974", "11186", "15357",
X		"03568", "00450", "96644", "58976", "36211",
X/* 402 */	"88240", "92457", "89200", "94696", "11370",
X		"91157", "48487", "59501", "56983", "89795",
X/* 403 */	"42789", "69758", "79701", "29511", "55968",
X		"41472", "89474", "84344", "80517", "07485",
X/* 404 */	"97523", "17264", "82840", "59556", "37119",
X		"30985", "48866", "60605", "95719", "70417",
X/* 405 */	"59083", "95137", "76538", "44155", "67286",
X		"57897", "28262", "04052", "00919", "86207",
X/* 406 */	"79932", "44236", "10089", "44373", "65670",
X		"44285", "06903", "20834", "49701", "95735",
X/* 407 */	"21149", "03425", "17594", "31427", "14262",
X		"32252", "68540", "39427", "44026", "47257",
X/* 408 */	"45055", "95091", "08367", "28381", "57375",
X		"41562", "83883", "27715", "10122", "67745",
X/* 409 */	"46497", "28626", "87297", "36568", "39483",
X		"11385", "63292", "92305", "78683", "06146",
X/* 410 */	"81905", "15038", "38338", "51206", "65749",
X		"34119", "71516", "74068", "51094", "06665",
X/* 411 */	"91884", "66762", "11428", "70908", "21506",
X		"00480", "94183", "78484", "66507", "75901",
X/* 412 */	"25728", "52539", "86806", "69944", "65036",
X		"27882", "02530", "04918", "74351", "65737",
X/* 413 */	"89178", "08791", "39342", "94963", "22581",
X		"56917", "17541", "83578", "75376", "65202",
X/* 414 */	"30935", "79270", "91986", "99286", "45236",
X		"44720", "81915", "70881", "45886", "43213",
X/* 415 */	"49789", "97081", "16075", "20517", "69980",
X		"25310", "91953", "01759", "67635", "88933",
X/* 416 */	"54558", "18395", "73375", "62251", "58871",
X		"09870", "70538", "48936", "07757", "90374",
X/* 417 */	"56631", "88862", "30487", "38794", "36079",
X		"32712", "11130", "55451", "25137", "38785",
X/* 418 */	"83558", "31960", "69473", "45950", "18225",
X		"09871", "88502", "75179", "11551", "75664",
X/* 419 */	"74321", "67351", "27703", "83717", "18913",
X		"42470", "08816", "37627", "14288", "62831",
X/* 420 */	"44047", "67612", "72738", "26995", "50933",
X		"63758", "50003", "43693", "52661", "55852",
X/* 421 */	"52372", "59042", "37595", "04931", "73622",
X		"68387", "86478", "40997", "05245", "75300",
X/* 422 */	"24902", "59609", "35653", "15970", "37681",
X		"69365", "22236", "86374", "65550", "00343",
X/* 423 */	"98377", "35354", "65770", "15365", "41422",
X		"71356", "16630", "40044", "19290", "66449",
X/* 424 */	"53629", "79452", "71674", "30260", "97303",
X		"06487", "62789", "13005", "70152", "22501",
X/* 425 */	"49867", "89294", "59232", "31776", "54919",
X		"99851", "05438", "01096", "72269", "50486",
X/* 426 */	"16719", "06144", "82041", "38332", "64452",
X		"31840", "99287", "59928", "25503", "08407",
X/* 427 */	"46970", "45907", "99238", "74547", "19704",
X		"72035", "26542", "54600", "79172", "58779",
X/* 428 */	"35747", "78956", "11478", "41195", "58135",
X		"63856", "33037", "45753", "60159", "25193",
X/* 429 */	"71838", "07526", "07985", "60714", "88627",
X		"75790", "38454", "96110", "39237", "19792",
X/* 430 */	"34534", "70169", "24805", "63215", "38175",
X		"38784", "38855", "24826", "50917", "25147",
X/* 431 */	"17082", "26997", "32295", "10894", "21805",
X		"65245", "85407", "37926", "69214", "38579",
X/* 432 */	"84721", "23544", "88548", "65626", "75517",
X		"69737", "55626", "52175", "21697", "19453",
X/* 433 */	"16908", "82841", "24060", "40285", "19195",
X		"80281", "89322", "15232", "70043", "60691",
X/* 434 */	"86370", "91949", "19017", "83846", "77869",
X		"14321", "95102", "87073", "71467", "31305",
X/* 435 */	"64677", "80358", "52629", "79419", "22359",
X		"87867", "48296", "50141", "46807", "82184",
X/* 436 */	"95812", "84665", "74511", "59914", "04146",
X		"90417", "58508", "62875", "17630", "21868",
X/* 437 */	"09199", "30322", "33352", "43374", "25473",
X		"04119", "63086", "14147", "14863", "38020",
X/* 438 */	"44757", "98628", "57916", "22199", "11865",
X		"42911", "62651", "78290", "09392", "77294",
X/* 439 */	"63168", "21043", "17409", "13786", "27475",
X		"75979", "89668", "43596", "74316", "84489",
X/* 440 */	"54941", "95992", "45445", "41059", "55142",
X		"15214", "42903", "16799", "88254", "95984",
X/* 441 */	"48575", "77822", "21067", "57238", "35352",
X		"96779", "89564", "23797", "99937", "46379",
X/* 442 */	"27119", "16060", "30302", "95327", "12849",
X		"38111", "97090", "07598", "78473", "63079",
X/* 443 */	"18570", "72803", "70040", "91385", "96436",
X		"96263", "17368", "56188", "85999", "50026",
X/* 444 */	"36050", "73736", "13351", "48321", "28357",
X		"51718", "65636", "72903", "21584", "21060",
X/* 445 */	"39829", "15564", "04716", "14594", "22363",
X		"97639", "65937", "17802", "31535", "42767",
X/* 446 */	"98761", "30987", "57657", "33398", "63053",
X		"25926", "20944", "19306", "81727", "02695",
X/* 447 */	"97479", "79172", "72764", "66446", "78864",
X		"12698", "15812", "97209", "38827", "91016",
X/* 448 */	"91281", "57875", "45228", "49211", "69755",
X		"99224", "43999", "62879", "08879", "80015",
X/* 449 */	"74396", "57146", "64665", "31159", "06980",
X		"79069", "37409", "75037", "69977", "85919",
X/* 450 */	"42826", "06974", "61063", "97640", "13433",
X		"92528", "91311", "08440", "38840", "22362",
X/* 451 */	"93929", "01836", "36590", "75052", "89475",
X		"15437", "65648", "99012", "70236", "12307",
X/* 452 */	"83585", "00414", "62851", "48787", "28447",
X		"21702", "57033", "29633", "44760", "34165",
X/* 453 */	"27548", "37516", "24343", "63046", "02081",
X		"20378", "19510", "42226", "97134", "68739",
X/* 454 */	"32982", "56455", "53129", "77693", "25022",
X		"55534", "99375", "30086", "98001", "07432",
X/* 455 */	"67126", "76656", "29347", "28492", "43108",
X		"64736", "32278", "84816", "80440", "30461",
X/* 456 */	"00818", "09136", "01952", "48442", "91058",
X		"92590", "10443", "05195", "34009", "32141",
X/* 457 */	"62209", "43740", "54102", "76895", "98172",
X		"31583", "04155", "66492", "58981", "16591",
X/* 458 */	"11331", "06838", "03818", "77063", "12523",
X		"45570", "68970", "70055", "77751", "73743",
X/* 459 */	"71732", "04704", "61384", "57343", "66682",
X		"44500", "89745", "10436", "67202", "36455",
X/* 460 */	"42467", "88801", "91280", "01056", "27534",
X		"81619", "79004", "25824", "66362", "33280",
X/* 461 */	"20706", "31929", "57422", "18730", "96197",
X		"22101", "47592", "02180", "18287", "82310",
X/* 462 */	"60430", "59627", "26471", "07794", "60475",
X		"76713", "45427", "89654", "14370", "81674",
X/* 463 */	"41246", "98416", "08669", "48883", "77154",
X		"09806", "94015", "60347", "20027", "08405",
X/* 464 */	"33150", "27368", "53375", "70171", "59431",
X		"14534", "34018", "85665", "77797", "17944",
X/* 465 */	"49602", "74391", "48830", "55029", "10371",
X		"94261", "16658", "68400", "44148", "28150",
X/* 466 */	"40364", "90913", "73151", "64463", "50058",
X		"78191", "84439", "82478", "62398", "03113",
X/* 467 */	"17578", "12830", "06571", "95934", "09132",
X		"25287", "78731", "80683", "67207", "76597",
X/* 468 */	"42096", "34934", "76609", "52553", "47508",
X		"71561", "08038", "83011", "72577", "95790",
X/* 469 */	"40076", "20292", "32138", "61197", "95476",
X		"23123", "26648", "13611", "48452", "39963",
X/* 470 */	"85857", "04855", "27029", "01542", "72443",
X		"53688", "82635", "56264", "07977", "23090",
X/* 471 */	"93553", "65434", "12124", "91087", "87800",
X		"95675", "99419", "44659", "30382", "55263",
X/* 472 */	"82514", "86800", "16781", "65977", "65946",
X		"13033", "93895", "04056", "75895", "47878",
X/* 473 */	"91309", "51233", "81409", "46773", "69135",
X		"56906", "84493", "34530", "84534", "38312",
X/* 474 */	"54574", "92933", "77341", "20839", "36126",
X		"01143", "35356", "35459", "07959", "98335",
X/* 475 */	"53266", "36146", "78047", "50607", "22486",
X		"63308", "08996", "96056", "39085", "26567",
X/* 476 */	"06779", "62663", "30523", "47881", "41279",
X		"49864", "82248", "78333", "29466", "48151",
X/* 477 */	"41957", "93235", "53308", "22682", "90722",
X		"54478", "07235", "34306", "15827", "20121",
X/* 478 */	"96837", "06283", "80172", "66109", "92592",
X		"48238", "76428", "94546", "45430", "16288",
X/* 479 */	"74839", "00740", "25553", "83767", "35900",
X		"05998", "07493", "46755", "11449", "88824",
X/* 480 */	"44906", "33143", "07454", "56652", "34755",
X		"63992", "59674", "65131", "46358", "12799"
X};
X
X
X/*
X**  Generate a random digit in the range from 0 to 9, inclusive, by simply by
X**  getting the next random digit from the RAND table of random digits.
X*/
Xstatic unsigned int
XGetRandomDigit()
X{
X    static int	Count5 = 0;
X    static int	Index = 0;
X
X    if (Count5 == 5) {
X	Count5 = 0;
X	Index++;
X    }
X    if (Index >= RANDTABLESIZE) {
X	(void)fprintf(stderr, "Asked for more than %d digits.\n",
X		    RANDTABLESIZE * 5);
X	exit(1);
X    }
X    return RANDtable[Index][Count5++] - '0';
X}
X
X
X/*
X**  Get a random integer in the range from low to high, inclusive.
X*/
Xstatic unsigned int
XGetRandomNumber(low, high)
X    unsigned int	low;
X    unsigned int	high;
X{
X    unsigned int	range;
X    unsigned int	maximum;
X    unsigned int	random;
X
X    range = (high - low) + 1;
X    do {
X	for (random = 0, maximum = 1; maximum < range; maximum *= 10)
X	    random = (random * 10) + GetRandomDigit();
X	/* If random is not evenly mappable to range, try again; note that
X	 * the operation (maximum / range) TRUNCATES the result to an unsigned
X	 * int. */
X    } while (random >= ((unsigned int)(maximum / range)) * range);
X
X    /* Map random to the range and add low to stay within (low,high). */
X    return low + (random % range);
X}
X
X
X/*
X**  Exchanges two bytes in a column in an SBOX.  row1 and row2 are integers
X**  between 0 and 255 inclusive.  Col is either 0, 1, 2 or 3 and refers to
X**  the byte position in a 32-bit word where 0 is the left-most byte.
X*/
Xstatic void
XSwapBytes(anSBox, row1, row2, col)
X    SBOX		anSBox;
X    unsigned int	row1;
X    unsigned int	row2;
X    unsigned int	col;
X{
X    WORD32		mask;
X    WORD32		temp;
X
X    /* Position the mask in the appropriate column; don't delete the cast! */
X    mask = (WORD32)0xFF000000 >> (col * 8);
X
X    /* Swap the bytes. */
X    temp = anSBox[row1];
X    anSBox[row1] = (anSBox[row1] & (~mask)) | (anSBox[row2] & mask);
X    anSBox[row2] = (anSBox[row2] & (~mask)) | (temp & mask);
X}
X
X
X/*
X**  Compute the standard S boxes from the RAND table of random digits,
X**  then compare it with SnefruSBoxes -- they should be equal.
X*/
Xstatic void
XCheckSBoxes()
X{
X    register WORD32		longRow;
X    register unsigned int	col;
X    register unsigned int	row;
X    register int		i;
X    SBOX			SBoxFromRand[SBOXCOUNT];
X
X    (void)printf("Verifying the S-boxes...  ");
X    for (i = 0; i < SBOXCOUNT; i++) {
X	/* Fill initial S box with a trivial permutation (0-255) */
X	for (longRow = 0; longRow < 256; longRow++)
X	    SBoxFromRand[i][longRow] =
X		longRow | (longRow << 8) | (longRow << 16) | (longRow << 24);
X
X	for (col = 0; col < 4; col++) {
X	    for (row = 0; row < 255; row++)
X		/* Exchange random rows in the column.  This ensures that
X		 * column remains a permutation of (0-255). */
X		SwapBytes(SBoxFromRand[i], row,
X			    GetRandomNumber(row, (unsigned int)255), col);
X	}
X	for (row = 0; row < 256; row++)
X	    if (SBoxFromRand[i][row] != SnefruSBoxes[i][row]) {
X		(void)printf("box #%d is bad!\n", i);
X		exit(1);
X	    }
X    }
X    (void)printf("OK.\n");
X}
X
X
X/*
X**  Hash 512 bytes using Hash512 and HashN and compare.
X*/
Xstatic void
XHash512twice(output, input, level)
X    WORD32		output[OUTPUTBLOCKSIZE];
X    WORD32		input[];
X    int			level;
X{
X    register int	i;
X    WORD32		out1[OUTPUTBLOCKSIZE];
X    WORD32		out2[OUTPUTBLOCKSIZE];
X
X    HashN(out1, INPUTBLOCKSIZE, input, level, OUTPUTBLOCKSIZE);
X    Hash512(out2, input, level, OUTPUTBLOCKSIZE);
X    for (i = 0; i < OUTPUTBLOCKSIZE; i++) {
X	if (out1[i] != out2[i]) {
X	    (void)printf("\n\tHashN and Hash512 differ, dumping core.\n");
X	    abort();
X	    /* NOTREACHED */
X	}
X	output[i] = out1[i];
X    }
X}
X
X
X/*
X**  Test the standard S boxes to make sure they haven't been damaged.
X*/
Xmain()
X{
X    register int	i;
X    register int	j;
X    register int	k;
X    register int	testShift;
X    WORD32		Input[INPUTBLOCKSIZE];
X    WORD32		Output[OUTPUTBLOCKSIZE];
X    char		data[256];
X
X    /* Force all output right out. */
X    setbuf(stdout, (char *)NULL);
X
X    (void)printf("Checking to make sure each column is a permutation...  ");
X    for (i = 0; i < SBOXCOUNT; i++) {
X	for (testShift = 0; testShift < 32; testShift += 8) {
X	    for (j = 0; j < 256; j++)
X		data[j] = 0;
X	    for (j = 0; j < 256; j++)
X		data[(SnefruSBoxes[i][j] >> testShift) & 0xFF]++;
X	    for (j = 0; j < 256; j++)
X		if (data[j] != 1) {
X		    (void)printf("S-box %d is bad.\n", i);
X		    exit(1);
X		}
X	}
X    }
X    (void)printf("OK.\n");
X
X    /* Now check things out some more  */
X    CheckSBoxes();
X
X    /* Set up for the fast hash. */
X    SetupHash512();
X
X    (void)printf("Testing a hash of 64 bytes of 0...  ");
X    for (i = 0; i < INPUTBLOCKSIZE; i++)
X	Input[i] = 0;
X    for (k = 0, i = 0; i < 50; i++) {
X	Hash512twice(Output, Input, 4);
X	/* Copy the output into a new slot in the input buffer */
X	for (j = 0; j < OUTPUTBLOCKSIZE; j++)
X	    Input[k + j] = Output[j];
X	k += OUTPUTBLOCKSIZE;
X	/* reset pointer into input buffer if it might overflow next time */
X	if (k + OUTPUTBLOCKSIZE > INPUTBLOCKSIZE)
X	    k = 0;
X    }
X    if (Output[0] != 1967985403 || Output[1] != 2688653266
X     || Output[2] != 3911883902 || Output[3] != 1117323144
X     || Output[4] != 4238876879 || Output[5] != 877649382
X     || Output[6] != 1112396746 || Output[7] != 324992866) {
X	(void)printf("failed!\n");
X	exit(1);
X    }
X    (void)printf("OK.\n");
X
X    exit(0);
X}
END_OF_FILE
if test 26755 -ne `wc -c <'testboxes.c2'`; then
    echo shar: \"'testboxes.c2'\" unpacked with wrong size!
fi
# end of 'testboxes.c2'
fi
echo shar: End of archive 2 \(of 4\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 3 4 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 4 archives.
    echo "Now see the README"
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.
Use a domain-based address or give alternate paths, or you may lose out.