Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.forth > #18040

Re: SHA-512

Newsgroups comp.lang.forth
Date 2012-12-16 17:33 -0800
References <16921688918435@frunobulax.edu> <96031919918435@frunobulax.edu>
Message-ID <cd9d5192-14e2-46d9-8117-84df2b72d9cd@googlegroups.com> (permalink)
Subject Re: SHA-512
From jzakiya@gmail.com

Show all headers | View raw


On Sunday, December 16, 2012 9:00:07 AM UTC-5, Marcel Hendrix wrote:
> mhx@iae.nl (Marcel Hendrix) writes Re: SHA-512
> 
> 
> 
> > jzakiya@gmail.com writes Re: SHA-512
> 
> [..]
> 
> > I have looked at my own (PICK-less) idea of SHA-512 again, and it couldn't work. 
> 
> > However, I found a way to improve your algorithm (literalize H[x]). ATM  test3  
> 
> > runs in 11.048 seconds on my 2.66 GHz i7 system. SHAfile needs 2.741 seconds 
> 
> > to process 385,241,618 bytes (64.9.. 50 MB/s/GHz). Hopefully your fix of 15 PICK 
> 
> > will create additional room for speedup.
> 
> [..]
> 
> 
> 
> The PICK fix works now too, but the speedup is only slight.
> 
> Performance is 65.95 MB/s/GHz for strings, 52.16 MB/s/GHz for file. 
> 
> This should be faster than the NIST reference (99MB/s on a 1.8 GHz Core2).
> 
> 
> 
> The following code is not portable.
> 
> 
> 
> -marcel
> 
> -- 
> 
> (*
> 
>  * LANGUAGE    : ANS Forth with extensions
> 
>  * PROJECT     : Forth Environments
> 
>  * DESCRIPTION : SHA-512 64-bit Hash algorithm
> 
>  * CATEGORY    : Utility
> 
>  * AUTHOR      : Copyright (c) 2012 Jabari Zakiya -- jzakiya@mail.com  12/07/2012 
> 
>  * LAST CHANGE : December 16, 2012, Marcel Hendrix 
> 
>  *)
> 
> 
> 
> 
> 
> 
> 
> 	NEEDS -miscutil
> 
> 
> 
> 	REVISION -sha-512 "--- SHA-512             Version 1.01 ---"
> 
> 
> 
> 	PRIVATES
> 
> 
> 
> DOC
> 
> (*
> 
>    NIST spec at:  http://csrc.nist.gov/encryption/tkhash.html
> 
> 
> 
> 	FORTH> SHAtest
> 
> 	SHA-512 test suite:
> 
> 
> 
> 	""
> 
> 	cf83e1357eefb8bd f1542850d66d8007 d620e4050b5715dc 83f4a921d36ce9ce 47d0d13c5d85f2b0 ff8318d2877eec2f 63b931bd47417a81 a538327af927da3e
> 
> 	cf83e1357eefb8bd f1542850d66d8007 d620e4050b5715dc 83f4a921d36ce9ce 47d0d13c5d85f2b0 ff8318d2877eec2f 63b931bd47417a81 a538327af927da3e
> 
> 
> 
> 	"abc"
> 
> 	ddaf35a193617aba cc417349ae204131 12e6fa4e89a97ea2 0a9eeee64b55d39a 2192992a274fc1a8 36ba3c23a3feebbd 454d4423643ce80e 2a9ac94fa54ca49f
> 
> 	ddaf35a193617aba cc417349ae204131 12e6fa4e89a97ea2 0a9eeee64b55d39a 2192992a274fc1a8 36ba3c23a3feebbd 454d4423643ce80e 2a9ac94fa54ca49f
> 
> 
> 
> 	"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"
> 
> 	8e959b75dae313da 8cf4f72814fc143f 8f7779c6eb9f7fa1 7299aeadb6889018 501d289e4900f7e4 331b99dec4b5433a c7d329eeb6dd2654 5e96e55b874be909
> 
> 	8e959b75dae313da 8cf4f72814fc143f 8f7779c6eb9f7fa1 7299aeadb6889018 501d289e4900f7e4 331b99dec4b5433a c7d329eeb6dd2654 5e96e55b874be909
> 
> 
> 
> 	"The quick brown fox jumps over the lazy dog"
> 
> 	07e547d9586f6a73 f73fbac0435ed769 51218fb7d0c8d788 a309d785436bbb64 2e93a252a954f239 12547d1e8a3b5ed6 e1bfd7097821233f a0538f3db854fee6
> 
> 	07e547d9586f6a73 f73fbac0435ed769 51218fb7d0c8d788 a309d785436bbb64 2e93a252a954f239 12547d1e8a3b5ed6 e1bfd7097821233f a0538f3db854fee6
> 
> 
> 
> 	2 million copies of ASCII 'a' (61h)
> 
> 	9bc68759247e3332 bec1c79d128d28a8 931d0c9f96c8aa97 5731b563475fdddd df7f873c25086908 effe270e23c5a01e 5dfb3289bf5d091d 8fb454b1bcf98dda
> 
> 
> 
> 	400,000 copies of ASCII BL (20h)
> 
> 	19ef4876e03c9347 6e00b486c62108d4 d7136f6d4782817b 449bacf44d0963e0 3f5ab474cb6822c2 963a979e8e15298c d60f22841c51f616 1620c0e031c65f4a
> 
> 	 ok
> 
> 
> 
> 	FORTH> SHAbm
> 
> 	SHA-512 test for EX1, 1000 loops: 0.001 seconds elapsed.
> 
> 	SHA-512 test for EX2, 1000 loops: 0.003 seconds elapsed.
> 
> 	SHA-512 test for EX3, 1000 loops: 10.872 seconds elapsed. ok
> 
> 
> 
> 	2e6 (bytes) 1000e f* ( loops) 10.872e ( s) f/  2.66e ( GHz) f/  20e f2^x ( 1MB) f/  f. ( 65.95 MB/s/GHz )
> 
> 	( NIST ref.: 99 MB/s on 1.8 GHz Core2 )
> 
> 
> 
> 	FORTH> TIMER-RESET S" C:\idfwforth\df_snapshot_4.0_2010_08_19.tar.gz" @SHAfile .ELAPSED
> 
> 	Bytesize: 385241618
> 
> 	SHA-512 : 45800c7d8fe7c13f 6670176b93b82c34 6f6f072ff1f50aee 586ccd6e7b02ef7c e27eb8f5a3cb814a 74e1d18b3107ea9b 8fdf171bf573a420 2a666c67703437bf
> 
> 	2.648 seconds elapsed. ok
> 
> 	385241618e ( bytes) 2.741e ( s) f/  2.66e ( GHz) f/  20e f2^x ( 1MB) f/  f.  ( 52.16 MB/s/GHz )
> 
> *)
> 
> ENDDOC
> 
> 
> 
> #64 =: CELLSIZE	 PRIVATE -- CPU bitsize
> 
> 
> 
> 0. DVALUE SHAlen PRIVATE		  -- Holds byte length of string < 2^128 bits|2^125 bytes
> 
> CREATE SHAval    PRIVATE   8 CELLS ALLOT  -- Holds hash after each block
> 
> CREATE SHAsh     PRIVATE #88 CELLS ALLOT  -- Fully extended hash array
> 
> CREATE W         PRIVATE #16 CELLS ALLOT  -- Holds message block
> 
> ALIGN1024				  -- this helps, why??	
> 
> CREATE X         PRIVATE #80 CELLS ALLOT  -- Holds temp processed data
> 
> 
> 
> 0 VALUE =X       PRIVATE -- Pointer to addr of temp data
> 
> 0 VALUE =H       PRIVATE -- Pointer to addr of hash value H for each round
> 
> CREATE cbuffer   PRIVATE  $8000 CHARS ALLOT
> 
> 
> 
> : >cb       cbuffer CELLPLACE+  BL cbuffer CELLCHAR+ ; PRIVATE ( c-addr u -- ) 
> 
> : InitMake  SHAsh TO =H  X TO =X  cbuffer 0!  S" : SHA512 ( -- )" >cb ; PRIVATE
> 
> : EndMake   S" ;" >cb  cbuffer @+ EVALUATE ; PRIVATE 
> 
> : :=: 	    CREATE PRIVATE ,   DOES> @ (H.) >cb ; PRIVATE
> 
> 
> 
> $428a2f98d728ae22 :=: K0   $7137449123ef65cd :=: K1   $b5c0fbcfec4d3b2f :=: K2   $e9b5dba58189dbbc :=: K3
> 
> $3956c25bf348b538 :=: K4   $59f111f1b605d019 :=: K5   $923f82a4af194f9b :=: K6   $ab1c5ed5da6d8118 :=: K7
> 
> $d807aa98a3030242 :=: K8   $12835b0145706fbe :=: K9   $243185be4ee4b28c :=: K10  $550c7dc3d5ffb4e2 :=: K11
> 
> $72be5d74f27b896f :=: K12  $80deb1fe3b1696b1 :=: K13  $9bdc06a725c71235 :=: K14  $c19bf174cf692694 :=: K15
> 
> $e49b69c19ef14ad2 :=: K16  $efbe4786384f25e3 :=: K17  $0fc19dc68b8cd5b5 :=: K18  $240ca1cc77ac9c65 :=: K19
> 
> $2de92c6f592b0275 :=: K20  $4a7484aa6ea6e483 :=: K21  $5cb0a9dcbd41fbd4 :=: K22  $76f988da831153b5 :=: K23
> 
> $983e5152ee66dfab :=: K24  $a831c66d2db43210 :=: K25  $b00327c898fb213f :=: K26  $bf597fc7beef0ee4 :=: K27
> 
> $c6e00bf33da88fc2 :=: K28  $d5a79147930aa725 :=: K29  $06ca6351e003826f :=: K30  $142929670a0e6e70 :=: K31
> 
> $27b70a8546d22ffc :=: K32  $2e1b21385c26c926 :=: K33  $4d2c6dfc5ac42aed :=: K34  $53380d139d95b3df :=: K35
> 
> $650a73548baf63de :=: K36  $766a0abb3c77b2a8 :=: K37  $81c2c92e47edaee6 :=: K38  $92722c851482353b :=: K39
> 
> $a2bfe8a14cf10364 :=: K40  $a81a664bbc423001 :=: K41  $c24b8b70d0f89791 :=: K42  $c76c51a30654be30 :=: K43
> 
> $d192e819d6ef5218 :=: K44  $d69906245565a910 :=: K45  $f40e35855771202a :=: K46  $106aa07032bbd1b8 :=: K47
> 
> $19a4c116b8d2d0c8 :=: K48  $1e376c085141ab53 :=: K49  $2748774cdf8eeb99 :=: K50  $34b0bcb5e19b48a8 :=: K51
> 
> $391c0cb3c5c95a63 :=: K52  $4ed8aa4ae3418acb :=: K53  $5b9cca4f7763e373 :=: K54  $682e6ff3d6b2b8a3 :=: K55
> 
> $748f82ee5defb2fc :=: K56  $78a5636f43172f60 :=: K57  $84c87814a1f0ab72 :=: K58  $8cc702081a6439ec :=: K59
> 
> $90befffa23631e28 :=: K60  $a4506cebde82bde9 :=: K61  $bef9a3f7b2c67915 :=: K62  $c67178f2e372532b :=: K63
> 
> $ca273eceea26619c :=: K64  $d186b8c721c0c207 :=: K65  $eada7dd6cde0eb1e :=: K66  $f57d4f7fee6ed178 :=: K67
> 
> $06f067aa72176fba :=: K68  $0a637dc5a2c898a6 :=: K69  $113f9804bef90dae :=: K70  $1b710b35131c471b :=: K71
> 
> $28db77f523047d84 :=: K72  $32caab7b40c72493 :=: K73  $3c9ebe0a15c9bebc :=: K74  $431d67c49c100d4c :=: K75
> 
> $4cc5d4becb3e42b6 :=: K76  $597f299cfc657e2a :=: K77  $5fcb6fab3ad6faec :=: K78  $6c44198c4a475817 :=: K79
> 
> 
> 
> : H[H]  =H             (H.) >cb ; PRIVATE -- Return H addr
> 
> : H[G]  =H  1 CELLS  + (H.) >cb ; PRIVATE -- Return G addr
> 
> : H[F]  =H  2 CELLS  + (H.) >cb ; PRIVATE -- Return F addr
> 
> : H[E]  =H  3 CELLS  + (H.) >cb ; PRIVATE -- Return E addr
> 
> : H[D]  =H  4 CELLS  + (H.) >cb ; PRIVATE -- Return D addr
> 
> : H[C]  =H  5 CELLS  + (H.) >cb ; PRIVATE -- Return C addr
> 
> : H[B]  =H  6 CELLS  + (H.) >cb ; PRIVATE -- Return B addr
> 
> : H[A]  =H  7 CELLS  + (H.) >cb ; PRIVATE -- Return A addr
> 
> 
> 
> : SHAinit ( -- )  \ Load initial hash values H0 - H7
> 
> 	$6a09e667f3bcc908 ( H0)  $bb67ae8584caa73b ( H1)
> 
> 	$3c6ef372fe94f82b ( H2)  $a54ff53a5f1d36f1 ( H3)
> 
> 	$510e527fade682d1 ( H4)  $9b05688c2b3e6c1f ( H5)
> 
> 	$1f83d9abfb41bd6b ( H6)  $5be0cd19137e2179 ( H7)
> 
> 	SHAsh  7 0 DO  TUCK  !  CELL+  LOOP  !		\ Put initial hash in SHAsh array
> 
> 	SHAsh  SHAval  8 CELLS  CMOVE ; PRIVATE        	\ Put copy in SHAval array
> 
> 
> 
> : UpDateHash ( a b c -- )  \ Update hash values and load arrays with new values
> 
> 	8 0 DO  DUP >R @  SWAP  DUP >R @  +  DUP        \ Compute updated hash subvalue
> 
> 	  	R@ !  OVER !  CELL+  R> CELL+  R> CELL+ \ Store updated hash subvalue
> 
> 	  LOOP  3DROP ; PRIVATE				\ Clear stack when done
> 
> 
> 
> : >offs	  ( u -- addr ) CELLS =X + (H.) >cb ; PRIVATE
> 
> 
> 
> : sig0    DUP  DUP   1 ROR  SWAP   8 ROR  XOR  SWAP  7 RSHIFT  XOR ; PRIVATE 	( x -- n ) 
> 
> : sig1    DUP  DUP #19 ROR  SWAP #61 ROR  XOR  SWAP  6 RSHIFT  XOR ; PRIVATE 	( x -- n ) 
> 
> : Wi	  #-16 >offs S" D@ sig0 +" >cb  -7 >offs S" @ +" >cb  -2 >offs S" @ sig1 +  DUP" >cb  0 >offs S" !" >cb  CELL +TO =X ; PRIVATE ( ..Wi --..Wi' Wi') 
> 
> : Wi@     S" DUP @ DUP" >cb  0 >offs S" !" >cb   CELL +TO =X  ; PRIVATE    \ dup @ tuck 
> 
> : Ch      H[F] S" 2@  OVER  AND  SWAP  INVERT" >cb  H[G]  S" @  AND  XOR" >cb ; PRIVATE ( -- n ) 
> 
> : Maj     H[C] S" DUP >R  CELL+  2@  OVER  AND  SWAP  R@ @  AND XOR  R> 2@ AND  XOR" >cb ; PRIVATE ( -- n ) 
> 
> : T1x     Ch  H[E] S" @  DUP >R  #14 ror  R@  #18 ror  XOR  R>  #41 ror  XOR  +" >cb  H[H] S" @ +" >cb ; PRIVATE ( -- n ) 
> 
> : T2      Maj H[A] S" @  DUP >R  #28 ror  R@  #34 ror  XOR  R>  #39 ror  XOR  +" >cb ; PRIVATE ( -- n ) 
> 
> : subrnd  S" DUP"  >cb  H[D] S" +!" >cb  T2 S" +" >cb  H[A] S" CELL+ !" >cb  CELL +TO =H ; PRIVATE 
> 
> : rndi[   Wi@  T1x  S" +"  >cb ; PRIVATE 
> 
> : rndn[   Wi   T1x  S" +"  >cb ; PRIVATE   
> 
> : ]rndi   S" +" >cb subrnd S" CELL+" >cb ; PRIVATE 
> 
> : ]rndn   S" +" >cb subrnd ; PRIVATE 
> 
> : ~rndi	  S" DROP" >cb ; PRIVATE 	
> 
> : ~rndn	  S" SHAsh SHAval" >cb  H[H]  S" UpDateHash" >cb ; PRIVATE 
> 
> 
> 
> InitMake
> 
>   rndi[ K0  ]rndi  rndi[ K1  ]rndi  rndi[ K2  ]rndi  rndi[ K3  ]rndi
> 
>   rndi[ K4  ]rndi  rndi[ K5  ]rndi  rndi[ K6  ]rndi  rndi[ K7  ]rndi
> 
>   rndi[ K8  ]rndi  rndi[ K9  ]rndi  rndi[ K10 ]rndi  rndi[ K11 ]rndi
> 
>   rndi[ K12 ]rndi  rndi[ K13 ]rndi  rndi[ K14 ]rndi  rndi[ K15 ]rndi ~rndi
> 
>   rndn[ K16 ]rndn  rndn[ K17 ]rndn  rndn[ K18 ]rndn  rndn[ K19 ]rndn 
> 
>   rndn[ K20 ]rndn  rndn[ K21 ]rndn  rndn[ K22 ]rndn  rndn[ K23 ]rndn  
> 
>   rndn[ K24 ]rndn  rndn[ K25 ]rndn  rndn[ K26 ]rndn  rndn[ K27 ]rndn  
> 
>   rndn[ K28 ]rndn  rndn[ K29 ]rndn  rndn[ K30 ]rndn  rndn[ K31 ]rndn  
> 
>   rndn[ K32 ]rndn  rndn[ K33 ]rndn  rndn[ K34 ]rndn  rndn[ K35 ]rndn  
> 
>   rndn[ K36 ]rndn  rndn[ K37 ]rndn  rndn[ K38 ]rndn  rndn[ K39 ]rndn  
> 
>   rndn[ K40 ]rndn  rndn[ K41 ]rndn  rndn[ K42 ]rndn  rndn[ K43 ]rndn  
> 
>   rndn[ K44 ]rndn  rndn[ K45 ]rndn  rndn[ K46 ]rndn  rndn[ K47 ]rndn  
> 
>   rndn[ K48 ]rndn  rndn[ K49 ]rndn  rndn[ K50 ]rndn  rndn[ K51 ]rndn  
> 
>   rndn[ K52 ]rndn  rndn[ K53 ]rndn  rndn[ K54 ]rndn  rndn[ K55 ]rndn  
> 
>   rndn[ K56 ]rndn  rndn[ K57 ]rndn  rndn[ K58 ]rndn  rndn[ K59 ]rndn  
> 
>   rndn[ K60 ]rndn  rndn[ K61 ]rndn  rndn[ K62 ]rndn  rndn[ K63 ]rndn  
> 
>   rndn[ K64 ]rndn  rndn[ K65 ]rndn  rndn[ K66 ]rndn  rndn[ K67 ]rndn  
> 
>   rndn[ K68 ]rndn  rndn[ K69 ]rndn  rndn[ K70 ]rndn  rndn[ K71 ]rndn  
> 
>   rndn[ K72 ]rndn  rndn[ K73 ]rndn  rndn[ K74 ]rndn  rndn[ K75 ]rndn  
> 
>   rndn[ K76 ]rndn  rndn[ K77 ]rndn  rndn[ K78 ]rndn  rndn[ K79 ]rndn ~rndn 
> 
> EndMake 
> 
> 
> 
> : storelen      D2* D2* D2* ( bytes->bits)  W #112 CHARS + !  W #120 CHARS + ! ; PRIVATE ( lo hi -- ) 
> 
> : setlen  	SHAlen  storelen ; PRIVATE ( -- )
> 
> : cellsreverse	0 ?DO  DUP  @  BSWAP  OVER !  CELL+  LOOP  DROP ; PRIVATE ( addr n -- ) 
> 
> : endian16 	DUP  #16 cellsreverse ; PRIVATE ( addr1 -- addr2 )  
> 
> : endian14 	DUP  #14 cellsreverse ; PRIVATE ( addr1 -- addr2 ) 
> 
> 
> 
> -- Do all 128 byte blocks leaving remainder block
> 
> : hashfullblocks ( addr1 dcount -- addr2 dcount )	      \ dcount is double number: lo hi
> 
> 	SWAP  DUP >R  7 RSHIFT               ( addr1 hi lo* ) \ Store lo on return, lo*=lo/128
> 
> 	OVER CELLSIZE 7 -  LSHIFT OR >R      ( addr1 hi     ) \ Return is now: :R lo lo'
> 
> 	( hi) 7 RSHIFT 
> 
> 	0 ?DO                                       ( addr1 ) \ Do if hi'= hi/128 > 0
> 
> 		0 0 DO  DUP endian16 SHA512 #128 +  
> 
> 	 	  LOOP 			     	    ( addr' ) \ Hash for 2^cellsize full blocks
> 
> 	 LOOP                                	    ( addr' ) \ Hash for hi'*2^cellsize full blocks
> 
> 	R> 0 ?DO  DUP endian16 SHA512 #128 +  LOOP  ( addr' ) \ Hash for lo' count full 128 byte blocks
> 
> 	R> ( lo) #127 AND ; PRIVATE             ( addr2 cnt ) \ Leave address and count for partial block
> 
> 
> 
> : hashfinal ( addr count -- )  		      \ Hash partial and/or last block
> 
> 	DUP >R  W  SWAP  CMOVE                \ Move bytes into block W array
> 
> 	W  R@ +  #128 OVER  C!   ( addr     ) \ Put 80h after last message byte
> 
> 	CHAR+  #111 R@ -         ( addr #   ) \ Compute tentative 0 byte FILL count
> 
> 	R> #111 >                ( addr # ? ) \ Is partial block byte count > 111 ?
> 
> 	   IF   #16 + ERASE            ( -- ) \ If yes, FILL rest of block w/zeroes
> 
> 		W  endian16  SHA512    ( -- ) \ Endian adjust block if required, then hash
> 
> 		W  #112          ( addr 112 ) \ Now setup last block containing bit count
> 
> 	ENDIF                    ( addr #   )
> 
> 	ERASE setlen  W  endian14  SHA512 ;   \ Zero FILL last block, set message bit count
> 
>  	PRIVATE 			      \ Endian adjust, except bit count, then hash
> 
> 
> 
> -- Compute SHA512 from a counted buffer of text
> 
> : SHAbuffer ( addr dcount -- ) SHAinit  2DUP TO SHAlen  hashfullblocks  hashfinal ;
> 
> 
> 
> -- ===============  Hash string display wordset  ===============
> 
> -- Array of digits 0123456789abcdef
> 
> : digit$      ( -- addr )  S" 0123456789abcdef" DROP ; PRIVATE 
> 
> : intdigits   ( -- )  PAD 0! ; PRIVATE 
> 
> : savedigit   ( n -- )  PAD C@ 1+  DUP PAD C!  PAD +  C! ; PRIVATE 
> 
> : bytedigits  ( n -- )  DUP 4 RSHIFT digit$ + C@ savedigit #15 AND digit$ + C@ savedigit ; PRIVATE 
> 
> : celldigits  ( addr -- )  DUP 7 + DO  I C@ bytedigits  -1 +LOOP  BL savedigit ; PRIVATE 
> 
> : SHAstring   ( -- addr u ) intdigits  SHAval 7 CELLS +   8 0 DO  DUP  celldigits  CELL-  LOOP  DROP  PAD COUNT ;
> 
> : HASH.       ( -- ) CR  SHAstring  TYPE SPACE ; -- Display SHA-512 hash value in hex
> 
> : QuoteString ( addr cnt -- ) CR CR &" EMIT TYPE &" EMIT ; PRIVATE 
> 
> 
> 
> -- ====================  File hash wordset  ====================
> 
> 0 VALUE rfileid PRIVATE -- Holds fileid of input file
> 
> : bytes@    ( addr n -- )  rfileid  READ-FILE  2DROP ; PRIVATE
> 
> : block@    ( -- )  W #128 bytes@ ; PRIVATE 
> 
> 
> 
> : getpartial ( cnt  -- W' cnt2 ? )
> 
> 	W 2DUP  SWAP  DUP >R  bytes@               	    ( cnt1 addr1  )
> 
> 	+ #128 OVER C! CHAR+ #111 R@ - R> #111 > ; PRIVATE  ( addr2 cnt2 ? )
> 
> 
> 
> : @SHAfile ( c-addr u -- )
> 
> 	R/O BIN OPEN-FILE  SWAP  TO rfileid  ( ior) ?FILE
> 
> 	SHAinit 
> 
> 	rfileid FILE-SIZE  DROP ( ud )  	       		\ Get bytesize of input file
> 
> 	0. D-                                         		\ Adjust to hash subset of file
> 
> 	CR ." Bytesize: " 2DUP D.                    		\ Display hash size to screen
> 
> 	2DUP  2>R                                     		\ ( lo  hi ) Save file byte cnt on RETURN
> 
> 	OVER  7 RSHIFT OVER					\ ( lo  hi lo* hi )
> 
> 	CELLSIZE 7 -  LSHIFT OR  SWAP  7 RSHIFT       		\ ( lo  lo' hi') lo' hi' now full block count
> 
> 	0 ?DO  0 0 DO  block@  W endian16 SHA512  LOOP LOOP  	\ Hash hi*2^cellsize full blocks
> 
> 	0 ?DO  block@  W endian16 SHA512  LOOP               	\ Hash lo count full 128 byte blocks
> 
> 	( lo) #127 AND ( rembytes) getpartial ( addr cnt ? ) 	\ Read remaining bytes
> 
> 	  IF  #16 + ERASE  W endian16 SHA512  W #112  ENDIF    	\ Do if rembytes > 111
> 
> 	ERASE  2R> storelen  W endian14  SHA512   	    	\ Do last block
> 
> 	CR  ." SHA-512 : "  CR SHAstring TYPE CR      		\ Show SHA-512 hash for file
> 
> 	rfileid CLOSE-FILE ?FILE ; 	            	   	\ Close the input file
> 
> 
> 
> NESTING @ 1 = 
> 
>   [IF]
> 
> 
> 
> -- ====================  SHA-512 Test Suite  ================================================================================================================
> 
> -- Load W array with data on stack
> 
> : WLoad	W #15 CELLS +  ( d0..d15 W[15] )  #16 0 DO  TUCK ! CELL-  LOOP DROP ; PRIVATE ( d0..d15 -- ) 
> 
> 
> 
> -- ----------------------------------------------------------------------------------------------------------------------------------------------------------
> 
> -- EXAMPLE 0: from Wikipedia
> 
> : EX0	S" " 2DUP QuoteString  
> 
> 	U>D ( addr dcount) SHAbuffer HASH.  
> 
> 	CR S" cf83e1357eefb8bd f1542850d66d8007 d620e4050b5715dc 83f4a921d36ce9ce 47d0d13c5d85f2b0 ff8318d2877eec2f 63b931bd47417a81 a538327af927da3e" TYPE ;
> 
> -- ----------------------------------------------------------------------------------------------------------------------------------------------------------
> 
> -- EXAMPLE 1: from FIPS PUB
> 
> : EX1	S" abc" 2DUP QuoteString 
> 
> 	U>D ( addr dcount) SHAbuffer HASH.  
> 
> 	CR S" ddaf35a193617aba cc417349ae204131 12e6fa4e89a97ea2 0a9eeee64b55d39a 2192992a274fc1a8 36ba3c23a3feebbd 454d4423643ce80e 2a9ac94fa54ca49f" TYPE ;
> 
> -- ----------------------------------------------------------------------------------------------------------------------------------------------------------
> 
> -- EXAMPLE 2: from FIPS PUB
> 
> : EX2a	S" abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" ;
> 
> : EX2	EX2a 2DUP QuoteString 
> 
> 	U>D ( addr dcount)  SHAbuffer HASH. 
> 
> 	CR S" 8e959b75dae313da 8cf4f72814fc143f 8f7779c6eb9f7fa1 7299aeadb6889018 501d289e4900f7e4 331b99dec4b5433a c7d329eeb6dd2654 5e96e55b874be909" TYPE ;
> 
> 
> 
> : EX5	S" The quick brown fox jumps over the lazy dog" 2DUP QuoteString 
> 
> 	U>D ( addr dcount)  SHAbuffer HASH. 
> 
> 	CR S" 07e547d9586f6a73 f73fbac0435ed769 51218fb7d0c8d788 a309d785436bbb64 2e93a252a954f239 12547d1e8a3b5ed6 e1bfd7097821233f a0538f3db854fee6" TYPE ;
> 
> -- ----------------------------------------------------------------------------------------------------------------------------------------------------------
> 
> -- EXAMPLE 3:
> 
> -- Message: 1 million copies of 'a' (61h), (8 million bits)
> 
> -- Hash = ?
> 
> -- Load block of all 'a's (61h), must hash 15,625 times
> 
> : EX3a	W #128 'a'  FILL  ;
> 
> -- Last message block: 1st bit a '1', bit-count = 16 million
> 
> : EX3b	$8000000000000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 #16000000 WLoad ;
> 
> -- Do hash for message of 2 million copies of ASCII 'a' (61h)
> 
> : EX3	SHAinit  EX3a  #15625 0 DO  W SHA512  LOOP  EX3b  W SHA512 HASH. ;
> 
> -- -------------------------------------------------------------
> 
> -- EXAMPLE 4:
> 
> -- Message: 400,000 SPACES 'BL' (20h), (3,200,000 bits)
> 
> -- Hash = ?
> 
> -- Load block of all "BL' (20h), hash 156 full blocks + 16 bytes
> 
> : EX4a	W #128  BLANK ;
> 
> -- Last message block: 1st bit a '1', bit-count = 3,200,000
> 
> : EX4b	$8000000000000000 0 0 0 0 0 0 0 0 0 0 0 0 0  0 #3200000 WLoad ;
> 
> -- Do hash for message of 400,000 SPACES 'BL' (20h)
> 
> : EX4	SHAinit  EX4a  #3125 0 DO  W SHA512  LOOP  EX4b  W SHA512 HASH. ;
> 
> 
> 
> : SHATest ( -- )
> 
> 	CR ." SHA-512 test suite:"
> 
> 	EX0  EX1  EX2  EX5
> 
> 	CR CR S" 2 million copies of ASCII 'a' (61h)" TYPE EX3
> 
> 	CR CR S" 400,000 copies of ASCII BL (20h)"    TYPE EX4 CR ;
> 
> 
> 
> : [EX1]	S" abc" U>D ( addr dcount) SHAbuffer ; PRIVATE 
> 
> : [EX2]	EX2a    U>D  SHAbuffer  ; PRIVATE  
> 
> : [EX3] SHAinit EX3a  #15625 0 DO W SHA512 LOOP EX3b W SHA512 ; PRIVATE 
> 
> : test1 CR ." SHA-512 test for EX1, 1000 loops: "  TIMER-RESET  #1000 0 DO  [EX1]  LOOP  .ELAPSED ;
> 
> : test2 CR ." SHA-512 test for EX2, 1000 loops: "  TIMER-RESET  #1000 0 DO  [EX2]  LOOP  .ELAPSED ;
> 
> : test3 CR ." SHA-512 test for EX3, 1000 loops: "  TIMER-RESET  #1000 0 DO  [EX3]  LOOP  .ELAPSED ;
> 
> : SHAbm ( -- ) test1 test2 test3 ;
> 
> 
> 
> :ABOUT	CR ." Try: SHAtest                     -- test SHA-512 (roughly)"
> 
> 	CR ."      SHAbm                       -- speed benchmark" 
> 
> 	CR ." ( c-addr ud -- ) SHAbuffer HASH. -- print hash value of string" 
> 
> 	CR ." ( c-addr u -- ) @SHAfile         -- print hash value of file." ;
> 
> 
> 
> [ELSE]
> 
> 
> 
> :ABOUT	CR ." Try: ( c-addr ud -- ) SHAbuffer HASH. -- print hash value of string" 
> 
> 	CR ."      ( c-addr u -- )  @SHAfile        -- print hash value of file." ;
> 
> 
> 
> [THEN]
> 
> 
> 
> NESTING @ 1 = [IF]	.ABOUT -sha-512 CR  [THEN]
> 
> 			DEPRIVE
> 
> 
> 
>                               (* End of Source *)

You may get a 3-5% speed increase using these better versions of 'UpDateHash.  Use the one the works the best. With VFX the first version takes 85 bytes and the 2nd 77 bytes, but the first one is faster. 

If you want even more speed unroll the loop and do it explicitly.

------------------------------  New UpDateHash -----------------------------
: UpDateHash ( -)  \ Update hash values: SHAsh(i) = SHAval(i) = SHAval(i-1) + H[H](i-1)
  H[H] 8 0 DO  DUP @  I CELLS DUP >R SHAval + TUCK  +! \ Compute updated hash subvalue
               @  SHAsh R> +  !  CELL+  LOOP  DROP     \ Store updated hash subvalue
  SHAsh  TO  H[H]                                      \ Point H[H] to updated SHAsh(0)=h
;

: UpDateHash ( -)  \ Update hash values: SHAsh(i) = SHAval(i) = SHAval(i-1) + H[H](i-1)
  8 0 DO H[H] I CELLS DUP >R + @ SHAval R@ + TUCK +!   \ Compute updated hash subvalue
               @  SHAsh R> +  !  LOOP                  \ Store updated hash subvalue
  SHAsh  TO  H[H]                                      \ Point H[H] to updated SHAsh(0)=h
;
----------------------------------------------------------------------------

jz

Back to comp.lang.forth | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

SHA-512 mhx@iae.nl (Marcel Hendrix) - 2012-12-02 23:48 +0200
  Re: SHA-512 jzakiya@gmail.com - 2012-12-07 14:47 -0800
    Re: SHA-512 Coos Haak <chforth@hccnet.nl> - 2012-12-08 00:49 +0100
      Re: SHA-512 jzakiya@gmail.com - 2012-12-07 16:54 -0800
        Re: SHA-512 Coos Haak <chforth@hccnet.nl> - 2012-12-08 18:21 +0100
      Re: SHA-512 jzakiya@gmail.com - 2012-12-08 18:36 -0800
        Re: SHA-512 mhx@iae.nl (Marcel Hendrix) - 2012-12-09 09:14 +0200
          Re: SHA-512 jzakiya@gmail.com - 2012-12-09 17:23 -0800
            Re: SHA-512 jzakiya@gmail.com - 2012-12-09 17:29 -0800
              Re: SHA-512 jzakiya@gmail.com - 2012-12-09 20:46 -0800
              Re: SHA-512 m.a.m.hendrix@tue.nl - 2012-12-10 03:53 -0800
                Re: SHA-512 jzakiya@gmail.com - 2012-12-10 13:05 -0800
                Re: SHA-512 mhx@iae.nl (Marcel Hendrix) - 2012-12-10 23:17 +0200
                Re: SHA-512 jzakiya@gmail.com - 2012-12-13 06:30 -0800
                Re: SHA-512 mhx@iae.nl (Marcel Hendrix) - 2012-12-13 21:33 +0200
                Re: SHA-512 jzakiya@gmail.com - 2012-12-13 19:38 -0800
                Re: SHA-512 mhx@iae.nl (Marcel Hendrix) - 2012-12-14 22:52 +0200
                Re: SHA-512 jzakiya@gmail.com - 2012-12-14 16:39 -0800
                Re: SHA-512 mhx@iae.nl (Marcel Hendrix) - 2012-12-15 19:11 +0200
                Re: SHA-512 mhx@iae.nl (Marcel Hendrix) - 2012-12-16 16:00 +0200
                Re: SHA-512 jzakiya@gmail.com - 2012-12-16 17:33 -0800
                Re: SHA-512 jzakiya@gmail.com - 2012-12-16 22:35 -0800
                Re: SHA-512 mhx@iae.nl (Marcel Hendrix) - 2012-12-17 10:14 +0200
                Re: SHA-512 mhx@iae.nl (Marcel Hendrix) - 2012-12-17 10:51 +0200
                Re: SHA-512 jzakiya@gmail.com - 2012-12-17 09:13 -0800
                Re: SHA-512 mhx@iae.nl (Marcel Hendrix) - 2012-12-17 22:24 +0200
                Re: SHA-512 jzakiya@gmail.com - 2013-01-15 20:38 -0800
                Re: SHA-512 jzakiya@gmail.com - 2013-01-15 20:54 -0800
                Re: SHA-512 Howerd <howerdo@yahoo.co.uk> - 2012-12-13 13:06 -0800
                Re: SHA-512 Howerd <howerdo@yahoo.co.uk> - 2012-12-13 13:03 -0800
    Re: SHA-512 mhx@iae.nl (Marcel Hendrix) - 2012-12-08 22:08 +0200

csiph-web