Subject: v21i020: Snefru hash and netnews validation programs, Part02/04 Newsgroups: comp.sources.unix Approved: rsalz@uunet.UU.NET X-Checksum-Snefru: fdcf60a5 8d41342b 4f3ec6fa 24a03bce Submitted-by: Rich $alz 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 '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, . X*/ X#include X#ifdef lint X#ifndef NDEBUG X#define NDEBUG X#endif /* NDEBUG */ X#endif /* lint */ X#include 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 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, shiftConstant) X * 2 temp2 = temp1 & 0x3FC X * 3 temp3 = S-box<0 or 1> + temp2 X * 4 temp4 = *temp3 X * 5 block ^= temp4 X * 6 block ^= 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 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