89 lines
2.9 KiB
Forth
89 lines
2.9 KiB
Forth
\ Copyright 2022 Bradley D. Nelson
|
|
\
|
|
\ Licensed under the Apache License, Version 2.0 (the "License");
|
|
\ you may not use this file except in compliance with the License.
|
|
\ You may obtain a copy of the License at
|
|
\
|
|
\ http://www.apache.org/licenses/LICENSE-2.0
|
|
\
|
|
\ Unless required by applicable law or agreed to in writing, software
|
|
\ distributed under the License is distributed on an "AS IS" BASIS,
|
|
\ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
\ See the License for the specific language governing permissions and
|
|
\ limitations under the License.
|
|
|
|
needs hashing.fs
|
|
|
|
internals hashing definitions
|
|
|
|
CREATE k HEX
|
|
428a2f98 L, 71374491 L, b5c0fbcf L, e9b5dba5 L, 3956c25b L, 59f111f1 L, 923f82a4 L, ab1c5ed5 L,
|
|
d807aa98 L, 12835b01 L, 243185be L, 550c7dc3 L, 72be5d74 L, 80deb1fe L, 9bdc06a7 L, c19bf174 L,
|
|
e49b69c1 L, efbe4786 L, 0fc19dc6 L, 240ca1cc L, 2de92c6f L, 4a7484aa L, 5cb0a9dc L, 76f988da L,
|
|
983e5152 L, a831c66d L, b00327c8 L, bf597fc7 L, c6e00bf3 L, d5a79147 L, 06ca6351 L, 14292967 L,
|
|
27b70a85 L, 2e1b2138 L, 4d2c6dfc L, 53380d13 L, 650a7354 L, 766a0abb L, 81c2c92e L, 92722c85 L,
|
|
a2bfe8a1 L, a81a664b L, c24b8b70 L, c76c51a3 L, d192e819 L, d6990624 L, f40e3585 L, 106aa070 L,
|
|
19a4c116 L, 1e376c08 L, 2748774c L, 34b0bcb5 L, 391c0cb3 L, 4ed8aa4a L, 5b9cca4f L, 682e6ff3 L,
|
|
748f82ee L, 78a5636f L, 84c87814 L, 8cc70208 L, 90befffa L, a4506ceb L, bef9a3f7 L, c67178f2 L,
|
|
DECIMAL
|
|
: k@ ( n -- n ) 4* k + UL@ ;
|
|
|
|
: init
|
|
$6a09e667 TO h0 $bb67ae85 TO h1 $3c6ef372 TO h2 $a54ff53a TO h3
|
|
$510e527f TO h4 $9b05688c TO h5 $1f83d9ab TO h6 $5be0cd19 TO h7
|
|
;
|
|
|
|
: s0 { x } x 7 >>> x 18 >>> XOR x 3 RSHIFT XOR ;
|
|
: s1 { x } x 17 >>> x 19 >>> XOR x 10 RSHIFT XOR ;
|
|
: extend
|
|
64 16 DO
|
|
I 16 - w@ I 7 - w@ + I 15 - w@ s0 + I 2 - w@ s1 + I w!
|
|
LOOP
|
|
;
|
|
|
|
: maj { x y z -- n } x y AND x z AND XOR y z AND XOR ;
|
|
: ch { x y z -- n } x y AND x INVERT z AND XOR ;
|
|
: sh0 { x -- n } x 2 >>> x 13 >>> XOR x 22 >>> XOR ;
|
|
: sh1 { x -- n } x 6 >>> x 11 >>> XOR x 25 >>> XOR ;
|
|
: step { i }
|
|
h e sh1 + e f g ch + i k@ + i w@ L+ TO temp1
|
|
a sh0 a b c maj L+ TO temp2
|
|
g TO h f TO g e TO f d temp1 L+ TO e
|
|
c TO d b TO c a TO b temp1 temp2 L+ TO a
|
|
;
|
|
|
|
: chunk
|
|
extend
|
|
h0 TO a h1 TO b h2 TO c h3 TO d
|
|
h4 TO e h5 TO f h6 TO g h7 TO h
|
|
64 0 DO I step LOOP
|
|
a h0 L+ TO h0 b h1 L+ TO h1 c h2 L+ TO h2 d h3 L+ TO h3
|
|
e h4 L+ TO h4 f h5 L+ TO h5 g h6 L+ TO h6 h h7 L+ TO h7
|
|
;
|
|
|
|
: >w { msg n }
|
|
w 64 ERASE msg w n CMOVE $80 w n + c! w 64 <->* ;
|
|
|
|
64 constant sha256-size
|
|
create sha256-hash sha256-size allot
|
|
|
|
: format
|
|
sha256-hash h0 >dig h1 >dig h2 >dig h3 >dig
|
|
h4 >dig h5 >dig h6 >dig h7 >dig DROP ;
|
|
|
|
: sha256 { msg n } n 64 /mod { edge wholes }
|
|
init
|
|
wholes 0 ?DO msg 64 >w chunk 64 +TO msg LOOP
|
|
edge 0= IF
|
|
0 0 >w
|
|
ELSE
|
|
msg edge >w
|
|
edge 56 >= IF chunk w 64 ERASE THEN
|
|
THEN
|
|
n 8 * 16 RSHIFT 16 RSHIFT 14 w!
|
|
n 8 * 15 w! chunk
|
|
format sha256-hash sha256-size
|
|
;
|
|
|
|
forth definitions
|