USING: crypto.common kernel splitting math sequences namespaces io.binary symbols math.bitfields.lib ; IN: crypto.sha2 r >r + + w+ r> r> swap set-nth ; inline : prepare-message-schedule ( seq -- w-seq ) word-size get group [ be> ] map block-size get 0 pad-right dup 16 64 dup [ process-M-256 ] with each ; : ch ( x y z -- x' ) [ bitxor bitand ] keep bitxor ; : maj ( x y z -- x' ) >r [ bitand ] 2keep bitor r> bitand bitor ; : S0-256 ( x -- x' ) [ -2 bitroll-32 ] keep [ -13 bitroll-32 ] keep -22 bitroll-32 bitxor bitxor ; inline : S1-256 ( x -- x' ) [ -6 bitroll-32 ] keep [ -11 bitroll-32 ] keep -25 bitroll-32 bitxor bitxor ; inline : T1 ( W n -- T1 ) [ swap nth ] keep K get nth + e vars get slice3 ch + e vars get nth S1-256 + h vars get nth w+ ; : T2 ( -- T2 ) a vars get nth S0-256 a vars get slice3 maj w+ ; : update-vars ( T1 T2 -- ) vars get h g pick exchange g f pick exchange f e pick exchange pick d pick nth w+ e pick set-nth d c pick exchange c b pick exchange b a pick exchange >r w+ a r> set-nth ; : process-chunk ( M -- ) H get clone vars set prepare-message-schedule block-size get [ T1 T2 update-vars ] with each vars get H get [ w+ ] 2map H set ; : seq>byte-array ( n seq -- string ) [ swap [ >be % ] curry each ] B{ } make ; : byte-array>sha2 ( byte-array -- string ) t preprocess-plaintext block-size get group [ process-chunk ] each 4 H get seq>byte-array ; PRIVATE> : byte-array>sha-256 ( string -- string ) [ K-256 K set initial-H-256 H set 4 word-size set 64 block-size set byte-array>sha2 ] with-scope ; : byte-array>sha-256-string ( string -- hexstring ) byte-array>sha-256 hex-string ;