Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.forth > #17959
| Newsgroups | comp.lang.forth |
|---|---|
| Date | 2012-12-09 17:29 -0800 |
| References | <da31affb-78bd-415b-87ad-caa242cca438@googlegroups.com> <70899494918435@frunobulax.edu> <62e45762-bcc8-40a9-ae3e-c7093e8336ac@googlegroups.com> |
| Message-ID | <38caf893-c352-4ab6-87df-d8fc2181de52@googlegroups.com> (permalink) |
| Subject | Re: SHA-512 |
| From | jzakiya@gmail.com |
On Sunday, December 9, 2012 8:23:01 PM UTC-5, jza...@gmail.com wrote:
> On Sunday, December 9, 2012 2:14:33 AM UTC-5, Marcel Hendrix wrote:
>
> > jzakiya@gmail.com writes Re: SHA-512
>
> >
>
> > [..]
>
> >
>
> > > Hopefully, this was THE error.
>
> >
>
> >
>
> >
>
> > > 8cc702081a6438ec CONSTANT K59 should be
>
> >
>
> > > 8cc702081a6439ec CONSTANT K59
>
> >
>
> >
>
> >
>
> > This doesn't fix the problem.
>
> >
>
> >
>
> >
>
> > Here is the content of H[a] ... H[h] before and after the first round:
>
> >
>
> >
>
> >
>
> > FORTH> EX1
>
> >
>
> > t0: $6A09E667F3BCC908 $BB67AE8584CAA73B $3C6EF372FE94F82B $A54FF53A5F1D36F1
>
> >
>
> > $510E527FADE682D1 $9B05688C2B3E6C1F $1F83D9ABFB41BD6B $5BE0CD19137E2179
>
> >
>
> >
>
> >
>
> > t1: $AE260B24BD1CFDFB $6A09E667F3BCC908 $BB67AE8584CAA73B $3C6EF372FE94F82B
>
> >
>
> > $10413EA07AD53F97 $510E527FADE682D1 $9B05688C2B3E6C1F $1F83D9ABFB41BD6B
>
> >
>
> >
>
> >
>
> > h[a] and h[e] are wrong. Maybe something with 2@ ?
>
> >
>
> >
>
> >
>
> > I suspected problems with HEX/DECIMAL, therefore the below listing is again
>
> >
>
> > a bit different.
>
> >
>
> >
>
> >
>
> > -marcel
>
> >
>
> >
>
> >
>
> > --
>
> >
>
> > ANEW -sha-512
>
> >
>
> >
>
> >
>
> > \ Forth code for Secure Hash Algorithm 512 (SHA-512)
>
> >
>
> > \ NIST spec at: http://csrc.nist.gov/encryption/tkhash.html
>
> >
>
> > \ For Little/Big Endian byte addressable CPUs, e.g. Intel/Power PC
>
> >
>
> > \ DEPENDENCIES: CORE EXT WORDSET ; COMMON USAGE 3DROP ?DO CELL-
>
> >
>
> > \ Use of this code is free subject to acknowledgment of copyright.
>
> >
>
> > \ Copyright (c) 2012 Jabari Zakiya -- jzakiya@mail.com 12/07/2012
>
> >
>
> >
>
> >
>
> > \ ======================= MACRO Wordset ========================
>
> >
>
> > \ MACRO wordset from Wil Baden's Tool Belt series in
>
> >
>
> > \ Forth Dimensions (FD) Vol. 19, No. 2, July/August 1997
>
> >
>
> > \ Original code has been modified to make more efficient
>
> >
>
> > \ MACRO allows insertion of parameters following the macro
>
> >
>
> > \ "\" represents place where parameter is inserted
>
> >
>
> > \ Example: MACRO ?? " IF \ THEN "
>
> >
>
> > \ : FOO .. ?? EXIT .... ; ?? compiles to -- IF EXIT THEN
>
> >
>
> >
>
> >
>
> > \ PLACE and STRING for system if needed
>
> >
>
> > \ Not needed for SwiftForth v 2.00.3, needed for Win32Forth V 4.10
>
> >
>
> > \ : PLACE ( caddr n addr -) 2DUP C! CHAR+ SWAP CHARS MOVE ;
>
> >
>
> > : SSTRING ( char "ccc" -) WORD COUNT HERE OVER 1+ CHARS ALLOT PACK DROP ;
>
> >
>
> >
>
> >
>
> > \ Versions of /STRING and ANEW if system doesn't have them
>
> >
>
> > \ : /STRING ( a n k - a+k n-k) ( OVER MIN) TUCK - >R CHARS + R> ;
>
> >
>
> > \ : ANEW >IN @ BL WORD FIND IF EXECUTE ELSE DROP THEN >IN ! MARKER ;
>
> >
>
> >
>
> >
>
> > \ : split-at-char ( a n char - a k a+k n-k)
>
> >
>
> > \ >R 2DUP BEGIN DUP WHILE OVER C@ R@ -
>
> >
>
> > \ WHILE 1 /STRING REPEAT THEN
>
> >
>
> > \ R> DROP TUCK 2>R - 2R>
>
> >
>
> > \ ;
>
> >
>
> >
>
> >
>
> > : DOES>MACRO \ Compile the macro, including external parameters
>
> >
>
> > DOES> COUNT BEGIN [CHAR] \ split-at-char 2>R EVALUATE R@
>
> >
>
> > WHILE BL WORD COUNT EVALUATE 2R> 1 /STRING REPEAT
>
> >
>
> > R> DROP R> DROP
>
> >
>
> > ;
>
> >
>
> >
>
> >
>
> > \ Macro creation word which allows parameter insertion
>
> >
>
> > : MACRO CREATE IMMEDIATE CHAR SSTRING DOES>MACRO ;
>
> >
>
> >
>
> >
>
> > \ ==================== Start SHA-256 Code ====================
>
> >
>
> > DECIMAL
>
> >
>
> > 64 CONSTANT CELLSIZE \ CPU bitsize
>
> >
>
> >
>
> >
>
> > 2VARIABLE SHAlen \ Holds byte length of string < 2^128 bits|2^125 bytes
>
> >
>
> > CREATE SHAval 8 CELLS ALLOT \ Holds hash after each block
>
> >
>
> > CREATE SHAsh 88 CELLS ALLOT \ Fully extended hash array
>
> >
>
> > CREATE W 16 CELLS ALLOT \ Holds message block
>
> >
>
> > 1 W ! \ For compile time endian testing
>
> >
>
> >
>
> >
>
> > HEX
>
> >
>
> >
>
> >
>
> > \ SHA-512 round constants
>
> >
>
> > 428a2f98d728ae22 CONSTANT K0 7137449123ef65cd CONSTANT K1
>
> >
>
> > b5c0fbcfec4d3b2f CONSTANT K2 e9b5dba58189dbbc CONSTANT K3
>
> >
>
> > 3956c25bf348b538 CONSTANT K4 59f111f1b605d019 CONSTANT K5
>
> >
>
> > 923f82a4af194f9b CONSTANT K6 ab1c5ed5da6d8118 CONSTANT K7
>
> >
>
> > d807aa98a3030242 CONSTANT K8 12835b0145706fbe CONSTANT K9
>
> >
>
> > 243185be4ee4b28c CONSTANT K10 550c7dc3d5ffb4e2 CONSTANT K11
>
> >
>
> > 72be5d74f27b896f CONSTANT K12 80deb1fe3b1696b1 CONSTANT K13
>
> >
>
> > 9bdc06a725c71235 CONSTANT K14 c19bf174cf692694 CONSTANT K15
>
> >
>
> > e49b69c19ef14ad2 CONSTANT K16 efbe4786384f25e3 CONSTANT K17
>
> >
>
> > 0fc19dc68b8cd5b5 CONSTANT K18 240ca1cc77ac9c65 CONSTANT K19
>
> >
>
> > 2de92c6f592b0275 CONSTANT K20 4a7484aa6ea6e483 CONSTANT K21
>
> >
>
> > 5cb0a9dcbd41fbd4 CONSTANT K22 76f988da831153b5 CONSTANT K23
>
> >
>
> > 983e5152ee66dfab CONSTANT K24 a831c66d2db43210 CONSTANT K25
>
> >
>
> > b00327c898fb213f CONSTANT K26 bf597fc7beef0ee4 CONSTANT K27
>
> >
>
> > c6e00bf33da88fc2 CONSTANT K28 d5a79147930aa725 CONSTANT K29
>
> >
>
> > 06ca6351e003826f CONSTANT K30 142929670a0e6e70 CONSTANT K31
>
> >
>
> > 27b70a8546d22ffc CONSTANT K32 2e1b21385c26c926 CONSTANT K33
>
> >
>
> > 4d2c6dfc5ac42aed CONSTANT K34 53380d139d95b3df CONSTANT K35
>
> >
>
> > 650a73548baf63de CONSTANT K36 766a0abb3c77b2a8 CONSTANT K37
>
> >
>
> > 81c2c92e47edaee6 CONSTANT K38 92722c851482353b CONSTANT K39
>
> >
>
> > a2bfe8a14cf10364 CONSTANT K40 a81a664bbc423001 CONSTANT K41
>
> >
>
> > c24b8b70d0f89791 CONSTANT K42 c76c51a30654be30 CONSTANT K43
>
> >
>
> > d192e819d6ef5218 CONSTANT K44 d69906245565a910 CONSTANT K45
>
> >
>
> > f40e35855771202a CONSTANT K46 106aa07032bbd1b8 CONSTANT K47
>
> >
>
> > 19a4c116b8d2d0c8 CONSTANT K48 1e376c085141ab53 CONSTANT K49
>
> >
>
> > 2748774cdf8eeb99 CONSTANT K50 34b0bcb5e19b48a8 CONSTANT K51
>
> >
>
> > 391c0cb3c5c95a63 CONSTANT K52 4ed8aa4ae3418acb CONSTANT K53
>
> >
>
> > 5b9cca4f7763e373 CONSTANT K54 682e6ff3d6b2b8a3 CONSTANT K55
>
> >
>
> > 748f82ee5defb2fc CONSTANT K56 78a5636f43172f60 CONSTANT K57
>
> >
>
> > 84c87814a1f0ab72 CONSTANT K58 8cc702081a6439ec CONSTANT K59
>
> >
>
> > 90befffa23631e28 CONSTANT K60 a4506cebde82bde9 CONSTANT K61
>
> >
>
> > bef9a3f7b2c67915 CONSTANT K62 c67178f2e372532b CONSTANT K63
>
> >
>
> > ca273eceea26619c CONSTANT K64 d186b8c721c0c207 CONSTANT K65
>
> >
>
> > eada7dd6cde0eb1e CONSTANT K66 f57d4f7fee6ed178 CONSTANT K67
>
> >
>
> > 06f067aa72176fba CONSTANT K68 0a637dc5a2c898a6 CONSTANT K69
>
> >
>
> > 113f9804bef90dae CONSTANT K70 1b710b35131c471b CONSTANT K71
>
> >
>
> > 28db77f523047d84 CONSTANT K72 32caab7b40c72493 CONSTANT K73
>
> >
>
> > 3c9ebe0a15c9bebc CONSTANT K74 431d67c49c100d4c CONSTANT K75
>
> >
>
> > 4cc5d4becb3e42b6 CONSTANT K76 597f299cfc657e2a CONSTANT K77
>
> >
>
> > 5fcb6fab3ad6faec CONSTANT K78 6c44198c4a475817 CONSTANT K79
>
> >
>
> >
>
> >
>
> > DECIMAL
>
> >
>
> >
>
> >
>
> > 0 VALUE H[H] \ Pointer to addr of hash value H for each round
>
> >
>
> >
>
> >
>
> > : H[G] H[H] 1 CELLS + ; \ Return G adr
>
> >
>
> > : H[F] H[H] 2 CELLS + ; \ Return F adr
>
> >
>
> > : H[E] H[H] 3 CELLS + ; \ Return E adr
>
> >
>
> > : H[D] H[H] 4 CELLS + ; \ Return D adr
>
> >
>
> > : H[C] H[H] 5 CELLS + ; \ Return C adr
>
> >
>
> > : H[B] H[H] 6 CELLS + ; \ Return B adr
>
> >
>
> > : H[A] H[H] 7 CELLS + ; \ Return A adr
>
> >
>
> >
>
> >
>
> > : 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 \ Put copy in SHAval array
>
> >
>
> > SHAsh TO H[H] ; \ Init pointer to last hash value
>
> >
>
> >
>
> >
>
> > : UpDateHash ( -) \ Update hash values and load arrays with new values
>
> >
>
> > SHAsh SHAval H[H] \ Place array addresses on stack
>
> >
>
> > 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 \ Clear stack when done
>
> >
>
> > SHAsh TO H[H] ; \ Init pointer to last subvalue
>
> >
>
> >
>
> >
>
> > \ ( - n ) n = (E AND F) XOR (~E AND G)
>
> >
>
> > : Ch H[F] 2@ OVER AND SWAP INVERT H[G] @ AND XOR ;
>
> >
>
> >
>
> >
>
> > \ ( - n ) n = (A AND B) XOR (A AND C) XOR (B AND C)
>
> >
>
> > : Maj H[C] DUP >R CELL+ 2@ OVER AND SWAP R@ @ AND XOR R> 2@ AND XOR ;
>
> >
>
> >
>
> >
>
> > \ ( - n ) T1x = Ch(e,f,g) + Sig1(e) + h
>
> >
>
> > : T1x Ch H[E] @ DUP >R #14 ror R@ #18 ror XOR R> #41 ror XOR + H[H] @ + ;
>
> >
>
> >
>
> >
>
> > \ ( - n ) T2 = Maj(a,b,c) + Sig0(a)
>
> >
>
> > : T2 Maj H[A] @ DUP >R #28 ror R@ #34 ror XOR R> #39 ror XOR + ;
>
> >
>
> >
>
> >
>
> > \ ( x - n ) n = ROR1(X) XOR ROR8(X) XOR SHR7(X)
>
> >
>
> > : sig0 ( x - n ) DUP DUP 1 ROR SWAP 8 ROR XOR SWAP 7 RSHIFT XOR ;
>
> >
>
> >
>
> >
>
> > \ ( x - n ) n = ROR19(X) XOR ROR61(X) XOR SHR6(X)
>
> >
>
> > : sig1 ( x - n ) DUP DUP #19 ROR SWAP #61 ROR XOR SWAP 6 RSHIFT XOR ;
>
> >
>
> >
>
> >
>
> > \ Put two copies of original Wi on stack, keep its address
>
> >
>
> > : Wi@ ( [Wi] - wi [Wi] wi) DUP @ TUCK ;
>
> >
>
> >
>
> >
>
> > \ Create 2 copies of new Wi' from Wi on stack ( ..Wi -..Wi' Wi')
>
> >
>
> > : Wi #15 PICK #15 PICK sig0 + 7 PICK + 2 PICK sig1 + DUP ;
>
> >
>
> >
>
> >
>
> > \ Drop 80 Wi cells from stack ( W0..W79 - )
>
> >
>
> > : WiDROP 5 0 DO 2DROP 2DROP 2DROP 2DROP 2DROP 2DROP 2DROP 2DROP LOOP ;
>
> >
>
> >
>
> >
>
> > : subrnd DUP H[D] +! T2 + H[G] TO H[H] H[A] ! ;
>
> >
>
> >
>
> >
>
> > MACRO rndi\ " Wi@ T1x + \ + subrnd CELL+"
>
> >
>
> > MACRO rndn\ " Wi T1x + \ + subrnd "
>
> >
>
> >
>
> >
>
> > : show CR h[a] @ H. space h[b] @ H. space h[c] @ H. space h[d] @ H.
>
> >
>
> > CR h[e] @ H. space h[f] @ H. space h[g] @ H. space h[h] @ H. ;
>
> >
>
> >
>
> >
>
> > : SHA512 ( Wadr - )
>
> >
>
> > show
>
> >
>
> > rndi\ K0 show abort rndi\ K1 rndi\ K2 rndi\ K3 \ Wi = Mi for 1st 16 rounds
>
> >
>
> > rndi\ K4 rndi\ K5 rndi\ K6 rndi\ K7
>
> >
>
> > rndi\ K8 rndi\ K9 rndi\ K10 rndi\ K11
>
> >
>
> > rndi\ K12 rndi\ K13 rndi\ K14 rndi\ K15 DROP ( W0..W15 )
>
> >
>
> > rndn\ K16 rndn\ K17 rndn\ K18 rndn\ K19 \ Wj now function of Wi
>
> >
>
> > rndn\ K20 rndn\ K21 rndn\ K22 rndn\ K23
>
> >
>
> > rndn\ K24 rndn\ K25 rndn\ K26 rndn\ K27
>
> >
>
> > rndn\ K28 rndn\ K29 rndn\ K30 rndn\ K31
>
> >
>
> > rndn\ K32 rndn\ K33 rndn\ K34 rndn\ K35
>
> >
>
> > rndn\ K36 rndn\ K37 rndn\ K38 rndn\ K39
>
> >
>
> > rndn\ K40 rndn\ K41 rndn\ K42 rndn\ K43
>
> >
>
> > rndn\ K44 rndn\ K45 rndn\ K46 rndn\ K47
>
> >
>
> > rndn\ K48 rndn\ K49 rndn\ K50 rndn\ K51
>
> >
>
> > rndn\ K52 rndn\ K53 rndn\ K54 rndn\ K55
>
> >
>
> > rndn\ K56 rndn\ K57 rndn\ K58 rndn\ K59
>
> >
>
> > rndn\ K60 rndn\ K61 rndn\ K62 rndn\ K63
>
> >
>
> > rndn\ K64 rndn\ K65 rndn\ K66 rndn\ K67
>
> >
>
> > rndn\ K68 rndn\ K69 rndn\ K70 rndn\ K71
>
> >
>
> > rndn\ K72 rndn\ K73 rndn\ K74 rndn\ K75
>
> >
>
> > rndn\ K76 rndn\ K77 rndn\ K78 rndn\ K79 WiDROP ( - )
>
> >
>
> > UpDateHash
>
> >
>
> > ;
>
> >
>
> >
>
> >
>
> > : setlen ( -- ) \ Store bit count into last two cells
>
> >
>
> > SHAlen 2@ D2* D2* D2* ( bytes->bits) W #112 CHARS + ! W #120 CHARS + ! ;
>
> >
>
> >
>
> >
>
> > : bytes>< ( m -- w ) \ Reverse cell bytes: 1234567890abcdef <-> efcdab9078563412
>
> >
>
> > DUP >R #38 LSHIFT
>
> >
>
> > R@ $FF00 AND #28 LSHIFT OR
>
> >
>
> > R@ $FF0000 AND #18 LSHIFT OR
>
> >
>
> > R@ $FF000000 AND 8 LSHIFT OR
>
> >
>
> > R@ #20 RSHIFT $FF AND OR
>
> >
>
> > R@ #18 RSHIFT $FF00 AND OR
>
> >
>
> > R@ #10 RSHIFT $FF0000 AND OR
>
> >
>
> > R> 8 RSHIFT $FF000000 AND OR ;
>
> >
>
> >
>
> >
>
> > : cellsreverse ( adr n -- ) \ Reverse bytes of n cells in array
>
> >
>
> > 0 DO DUP @ bytes>< OVER ! CELL+ LOOP DROP ;
>
> >
>
> >
>
> >
>
> > W C@
>
> >
>
> > [IF] \ if little ENDIAN, e.g. Intel/AMD
>
> >
>
> > : endian16 ( adr -- adr ) DUP #16 cellsreverse ;
>
> >
>
> > : endian14 ( adr -- adr ) DUP #14 cellsreverse ;
>
> >
>
> > [ELSE] \ if big ENDIAN, e.g. Macs
>
> >
>
> > : endian16 ( adr -- adr ) ; \ Do nothing
>
> >
>
> > : endian14 ( adr -- adr ) ; \ Do nothing
>
> >
>
> > [THEN]
>
> >
>
> >
>
> >
>
> > \ Do all 128 byte blocks leaving remainder block
>
> >
>
> > : hashfullblocks ( adr1 dcount -- adr2 count ) \ dcount is double number: lo hi
>
> >
>
> > SWAP DUP >R 7 RSHIFT ( adr1 hi lo* ) \ Store lo on return, do lo*=lo/128
>
> >
>
> > OVER CELLSIZE 7 - LSHIFT OR >R ( adr1 hi ) \ Return is now: :R lo lo'
>
> >
>
> > ( hi) 7 RSHIFT 0 ?DO ( adr1 ) \ Do if hi'= hi/128 > 0
>
> >
>
> > 0 0 DO DUP endian16 SHA512 #128 + LOOP ( lo' adr') \ Hash for 2^cellsize full blocks
>
> >
>
> > LOOP ( adr' ) \ Hash for hi'*2^cellsize full blocks
>
> >
>
> > R> 0 ?DO DUP endian16 SHA512 #128 + LOOP ( adr' ) \ Hash block for lo count full 128 byte blocks
>
> >
>
> > R> ( lo) #127 AND ; ( adr2 cnt2 ) \ 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! ( adr ) \ Put 80h after last message byte
>
> >
>
> > CHAR+ #111 R@ - ( adr # ) \ Compute tentative 0 byte FILL count
>
> >
>
> > R> #111 > ( adr # ? ) \ Is partial block byte count > 111 ?
>
> >
>
> > IF #16 + 0 FILL ( -- ) \ If yes, FILL rest of block w/zeroes
>
> >
>
> > W endian16 SHA512 ( -- ) \ Endian adjust block if required, then hash
>
> >
>
> > W #112 ( adr 112 ) \ Now setup last block containing bit count
>
> >
>
> > THEN ( adr # )
>
> >
>
> > 0 FILL setlen W endian14 SHA512 ; \ Zero FILL last block, set message bit count
>
> >
>
> > ( -- ) \ Endian adjust, except bit count, then hash
>
> >
>
> >
>
> >
>
> > \ Compute SHA512 from a counted buffer of text
>
> >
>
> > : SHAbuffer ( addr dcount -- ) SHAinit 2DUP SHAlen 2! hashfullblocks hashfinal ;
>
> >
>
> >
>
> >
>
> > \ =============== Hash string display wordset ===============
>
> >
>
> > DECIMAL
>
> >
>
> >
>
> >
>
> > \ Array of digits 0123456789abcdef
>
> >
>
> > : digit$ ( -- adr ) S" 0123456789abcdef" DROP ;
>
> >
>
> >
>
> >
>
> > : intdigits ( -- ) 0 PAD ! ;
>
> >
>
> > : savedigit ( n -- ) PAD C@ 1+ DUP PAD C! PAD + C! ;
>
> >
>
> > : bytedigits ( n1 -- ) DUP 4 RSHIFT digit$ + C@ savedigit #15 AND digit$ + C@ savedigit ;
>
> >
>
> >
>
> >
>
> > W C@
>
> >
>
> > [IF] \ little ENDIAN
>
> >
>
> > : celldigits ( a1 -- ) DUP 7 + DO I C@ bytedigits -1 +LOOP ;
>
> >
>
> > [ELSE] \ big ENDIAN
>
> >
>
> > : celldigits ( a1 -- ) DUP 8 + SWAP DO I C@ bytedigits LOOP ;
>
> >
>
> > [THEN]
>
> >
>
> >
>
> >
>
> > : SHAstring ( -- adr count ) \ Return counted SHA-512 string array
>
> >
>
> > intdigits SHAval 7 CELLS + 8 0 DO DUP celldigits CELL- LOOP DROP PAD COUNT ;
>
> >
>
> >
>
> >
>
> > \ Display SHA-512 hash value in hex ( A B C D E F G H )
>
> >
>
> > : HASH. CR SHAstring TYPE SPACE ;
>
> >
>
> > : QuoteString ( adr cnt --) [CHAR] " EMIT TYPE [CHAR] " EMIT ;
>
> >
>
> >
>
> >
>
> > \ ==================== File hash wordset ====================
>
> >
>
> > VARIABLE rfileid \ Holds fileid number of input file
>
> >
>
> >
>
> >
>
> > : InputFileName ( -- ior) CR CR ." Filename: " PAD DUP #80 ACCEPT ( adr #) R/O OPEN-FILE SWAP rfileid ! ( ior) ;
>
> >
>
> > : TryAgain? ( -- ?) CR CR ." Invalid iput file, try again? (Y/N)" KEY DUP EMIT DUP [CHAR] N = SWAP [CHAR] n = OR ;
>
> >
>
> >
>
> >
>
> > \ Read n bytes from input file, store at addr array
>
> >
>
> > : bytes@ ( adr n - ) rfileid @ READ-FILE 2DROP ;
>
> >
>
> >
>
> >
>
> > : storelen ( lo hi - ) \ Store bit count into last two cells
>
> >
>
> > D2* D2* D2* ( bytes->bits) W #112 CHARS + ! W #120 CHARS + ! ;
>
> >
>
> > : getpartial ( cnt -- W' cnt2 ?)
>
> >
>
> > W 2DUP SWAP DUP >R bytes@ ( cnt1 adr1 )
>
> >
>
> > + #128 OVER C! CHAR+ #111 R@ - R> #111 > ; ( adr2 cnt2 ?)
>
> >
>
> >
>
> >
>
> > : block@ W 128 bytes@ ;
>
> >
>
> >
>
> >
>
> > : SHAfile ( -- )
>
> >
>
> > BEGIN InputFileName ( ior) \ Enter filename
>
> >
>
> > WHILE TryAgain? IF EXIT THEN \ Not valid, try (not) again
>
> >
>
> > REPEAT SHAinit \ Valid file, init transform
>
> >
>
> > rfileid @ FILE-SIZE DROP ( ud ) \ Get bytesize of input file
>
> >
>
> > 2. D- \ Dec cnt by 2 for CR|LF EOF
>
> >
>
> > CR ." Bytesize: " 2DUP D. \ Display filesize 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') 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 ( adr cnt ?) \ Read remaining bytes
>
> >
>
> > IF #16 + 0 FILL W endian16 SHA512 W #112 THEN \ Do if rembytes > 111
>
> >
>
> > 0 FILL 2R> storelen W endian14 SHA512 \ Do last block
>
> >
>
> > CR ." SHA-512 : " SHAstring TYPE CR \ Show SHA-512 hash for file
>
> >
>
> > rfileid @ CLOSE-FILE DROP ; \ Close the input file
>
> >
>
> >
>
> >
>
> > \ ==================== SHA-512 Test Suite =====================
>
> >
>
> > DECIMAL
>
> >
>
> >
>
> >
>
> > \ Load W array with data on stack
>
> >
>
> > : WLoad ( d0..d15 -- ) W #15 CELLS + ( d0..d15 W[15] ) #16 0 DO TUCK ! CELL- LOOP DROP ;
>
> >
>
> >
>
> >
>
> > \ -------------------------------------------------------------
>
> >
>
> > \ EXAMPLE 1: from FIPS PUB
>
> >
>
> > \ Message: ASCII string 'abc'
>
> >
>
> > \ Hash = DDAF35A1 93617ABA CC417349 AE204131 12E6FA4E 89A97EA2 0A9EEEE6 4B55D39A
>
> >
>
> > \ 2192992A 274FC1A8 36BA3C23 A3FEEBBD 454D4423 643CE80E 2A9AC94F A54CA49F
>
> >
>
> >
>
> >
>
> > \ Compute and display hash for ASCII string 'abc'
>
> >
>
> > : EX1 S" abc" U>D ( adr dcount) SHAbuffer HASH. ;
>
> >
>
> >
>
> >
>
> > \ -------------------------------------------------------------
>
> >
>
> > \ EXAMPLE 2: from FIPS PUB
>
> >
>
> > \ Message:"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"
>
> >
>
> > \ Hash = 8E959B75 DAE313DA 8CF4F728 14FC143F 8F7779C6 EB9F7FA1 7299AEAD B6889018
>
> >
>
> > \ 501D289E 4900F7E4 331B99DE C4B5433A C7D329EE B6DD2654 5E96E55B 874BE909
>
> >
>
> >
>
> >
>
> > : EX2a S" abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu" U>D ( adr dcount) ;
>
> >
>
> > : EX2 EX2a SHAbuffer HASH. ;
>
> >
>
> >
>
> >
>
> > \ -------------------------------------------------------------
>
> >
>
> > \ EXAMPLE 3:
>
> >
>
> > \ Message: 2 million copies of 'a' (61h), (16 million bits)
>
> >
>
> > \ Hash =
>
> >
>
> >
>
> >
>
> > \ Load block of all 'a's (61h), must hash 15,625 times
>
> >
>
> > : EX3a W #128 [CHAR] 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 BL FILL ;
>
> >
>
> >
>
> >
>
> > \ 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. ;
>
> >
>
> >
>
> >
>
> > \ -------------------------------------------------------------
>
> >
>
> > \ Message: blank string ''
>
> >
>
> > \ Hash =
>
> >
>
> >
>
> >
>
> > : SHATest ( -- )
>
> >
>
> > CR ." SHA-512 test suite:"
>
> >
>
> > S" " U>D ( adr dcount) SHAbuffer HASH. S" " QuoteString
>
> >
>
> > EX1 S" abc" QuoteString
>
> >
>
> > EX2 EX2a DROP QuoteString
>
> >
>
> > EX3 S" 2 million copies of ASCII 'a' (61h)" TYPE
>
> >
>
> > EX4 S" 400,000 copies of ASCII BL (20h)" TYPE CR ;
>
> >
>
> >
>
> >
>
> > \ =========== Forth specific performance test ===========
>
> >
>
> >
>
> >
>
> > VARIABLE start-ms
>
> >
>
> >
>
> >
>
> > : TIMER-START ( -- ) ?MS start-ms ! ;
>
> >
>
> > : MS? ( -- u ) ?MS start-ms @ - ( abs ) ;
>
> >
>
> > : .### ( -) BASE @ >R DECIMAL MS? 0 <# # # # [CHAR] . HOLD #S #> R> BASE ! TYPE ;
>
> >
>
> >
>
> >
>
> > DECIMAL #1000 VALUE N#
>
> >
>
> >
>
> >
>
> > : [EX1] S" abc" U>D ( adr dcount) SHAbuffer ;
>
> >
>
> > : [EX2] EX2a SHAbuffer ;
>
> >
>
> > : [EX3] SHAinit EX3a #15625 0 DO W SHA512 LOOP EX3b W SHA512 ;
>
> >
>
> >
>
> >
>
> > : test1 [ DECIMAL ]
>
> >
>
> > cr ." SHA-512 test for EX1 for " N# . ." loops in milliseconds is "
>
> >
>
> > TIMER-START N# 0 DO [EX1] LOOP MS? U. ;
>
> >
>
> >
>
> >
>
> > : test2 [ DECIMAL ]
>
> >
>
> > cr ." SHA-512 test for EX2 for " N# . ." loops in milliseconds is "
>
> >
>
> > TIMER-START N# 0 DO [EX2] LOOP MS? U. ;
>
> >
>
> >
>
> >
>
> > : test3 [ DECIMAL ]
>
> >
>
> > cr ." SHA-512 test for EX3 for " N# . ." loops in milliseconds is "
>
> >
>
> > TIMER-START N# 0 DO [EX3] LOOP MS? U. ;
>
>
>
> Hey Marcel,
>
>
>
> The problem is bytes><
>
>
>
> All the numbers in the original code are HEX. You changed the HEX values for the shifts to decimal without converting them from HEX.
>
>
>
> Your code:
>
>
>
> : bytes>< ( m - w ) \ Reverse cell bytes: 1234567890abcdef <-> efcdab9078563412
>
> DUP >R #38 LSHIFT
>
> R@ $FF00 AND #28 LSHIFT OR
>
> R@ $FF0000 AND #18 LSHIFT OR
>
> R@ $FF000000 AND 8 LSHIFT OR
>
> R@ #20 RSHIFT $FF AND OR
>
> R@ #18 RSHIFT $FF00 AND OR
>
> R@ #10 RSHIFT $FF0000 AND OR
>
> R> 8 RSHIFT $FF000000 AND OR ;
>
>
>
> Correct code:
>
>
>
> : bytes>< ( m - w ) \ Reverse cell bytes: 1234567890abcdef <-> efcdab9078563412
>
> DUP >R $38 LSHIFT
>
> R@ $FF00 AND $28 LSHIFT OR
>
> R@ $FF0000 AND $18 LSHIFT OR
>
> R@ $FF000000 AND 8 LSHIFT OR
>
> R@ $20 RSHIFT $FF AND OR
>
> R@ $18 RSHIFT $FF00 AND OR
>
> R@ #10 RSHIFT $FF0000 AND OR
>
> R> 8 RSHIFT $FF000000 AND OR ;
>
>
>
> To test do:
>
>
>
> $1234567890abcdef bytes>< hex .
>
> should display efcdab9078563412
>
>
>
> Jabari
Ahhhhh...corrected correction:
: bytes>< ( m - w ) \ Reverse cell bytes: 1234567890abcdef <-> efcdab9078563412
DUP >R $38 LSHIFT
R@ $FF00 AND $28 LSHIFT OR
R@ $FF0000 AND $18 LSHIFT OR
R@ $FF000000 AND 8 LSHIFT OR
R@ $20 RSHIFT $FF AND OR
R@ $18 RSHIFT $FF00 AND OR
R@ $10 RSHIFT $FF0000 AND OR
R> 8 RSHIFT $FF000000 AND OR ;
Back to comp.lang.forth | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll 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