Files
ueforth/lib/hashing/sha256.fs
2022-06-03 12:07:53 -07:00

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