From b5e315d2cdf11b517e2722850eaa431e641524dd Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Sun, 17 May 2009 12:45:20 -0500 Subject: [PATCH] working on hmac --- basis/checksums/hmac/hmac-tests.factor | 11 ++++-- basis/checksums/hmac/hmac.factor | 47 ++++++++++---------------- basis/checksums/md5/md5.factor | 5 ++- basis/checksums/sha2/sha2-tests.factor | 2 -- basis/checksums/sha2/sha2.factor | 10 ++++-- core/checksums/checksums.factor | 5 +-- 6 files changed, 41 insertions(+), 39 deletions(-) diff --git a/basis/checksums/hmac/hmac-tests.factor b/basis/checksums/hmac/hmac-tests.factor index 9541ca2f26..8835bed981 100755 --- a/basis/checksums/hmac/hmac-tests.factor +++ b/basis/checksums/hmac/hmac-tests.factor @@ -1,6 +1,6 @@ USING: kernel io strings byte-arrays sequences namespaces math parser checksums.hmac tools.test checksums.md5 checksums.sha1 -checksums.sha2 ; +checksums.sha2 checksums ; IN: checksums.hmac.tests [ @@ -39,4 +39,11 @@ IN: checksums.hmac.tests ] unit-test [ "b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7" ] -[ HEX: b 20 sha-256 hmac-bytes >string ] unit-test +[ 20 HEX: b "Hi There" sha-256 hmac-bytes hex-string ] unit-test + +[ "167f928588c5cc2eef8e3093caa0e87c9ff566a14794aa61648d81621a2a40c6" ] +[ + "JefeJefeJefeJefeJefeJefeJefeJefe" + "what do ya want for nothing?" sha-256 hmac-bytes hex-string +] unit-test + diff --git a/basis/checksums/hmac/hmac.factor b/basis/checksums/hmac/hmac.factor index 17b391f215..538dfc92c8 100755 --- a/basis/checksums/hmac/hmac.factor +++ b/basis/checksums/hmac/hmac.factor @@ -3,48 +3,35 @@ USING: arrays checksums checksums.md5 checksums.md5.private checksums.sha1 combinators fry io io.binary io.encodings.binary io.files io.streams.byte-array kernel math math.vectors memoize -sequences ; +sequences locals accessors ; IN: checksums.hmac sha1 get-sha1 - initialize-sha1 - [ process-sha1-block ] - [ process-sha1-block ] bi* get-sha1 ; - - : md5-hmac ( Ko Ki stream -- hmac ) - initialize-md5 process-md5-block - stream>md5 get-md5 - initialize-md5 - [ process-md5-block ] - [ process-md5-block ] bi* get-md5 ; -*/ - : seq-bitxor ( seq seq -- seq ) [ bitxor ] 2map ; -MEMO: opad ( -- seq ) 64 HEX: 5c ; +: opad ( checksum-state -- seq ) block-size>> HEX: 5c ; -MEMO: ipad ( -- seq ) 64 HEX: 36 ; +: ipad ( checksum-state -- seq ) block-size>> HEX: 36 ; -: init-K ( K -- o i ) - 64 0 pad-tail - [ opad seq-bitxor ] - [ ipad seq-bitxor ] bi ; +:: init-K ( K checksum checksum-state -- o i ) + checksum-state block-size>> K length < + [ K checksum checksum-bytes ] [ K ] if + checksum-state block-size>> 0 pad-tail + [ checksum-state opad seq-bitxor ] + [ checksum-state ipad seq-bitxor ] bi ; PRIVATE> :: hmac-stream ( K stream checksum -- value ) - K init-K :> Ki :> Ko - checksum initialize-checksum - Ki add-bytes - stream add-stream finish-checksum - checksum initialize-checksum - Ko add-bytes swap add-bytes - finish-checksum ; + K checksum dup initialize-checksum-state + dup :> checksum-state + init-K :> Ki :> Ko + checksum-state Ki add-checksum-bytes + stream add-checksum-stream get-checksum + checksum initialize-checksum-state + Ko add-checksum-bytes swap add-checksum-bytes + get-checksum ; : hmac-file ( K path checksum -- value ) [ binary ] dip hmac-stream ; diff --git a/basis/checksums/md5/md5.factor b/basis/checksums/md5/md5.factor index 97a263bab5..026df34012 100644 --- a/basis/checksums/md5/md5.factor +++ b/basis/checksums/md5/md5.factor @@ -14,10 +14,13 @@ INSTANCE: md5 stream-checksum TUPLE: md5-state < checksum-state state old-state ; : ( -- md5 ) - 64 md5-state new-checksum-state + md5-state new-checksum-state + 64 >>block-size { HEX: 67452301 HEX: efcdab89 HEX: 98badcfe HEX: 10325476 } [ clone >>state ] [ >>old-state ] bi ; +M: md5 initialize-checksum-state drop ; + ( -- sha2-state ) - 64 sha-224-state new-checksum-state + sha-224-state new-checksum-state + 64 >>block-size K-256 >>K initial-H-224 >>H 4 >>word-size ; : ( -- sha2-state ) - 64 sha-256-state new-checksum-state + sha-256-state new-checksum-state + 64 >>block-size K-256 >>K initial-H-256 >>H 4 >>word-size ; +M: sha-224 initialize-checksum-state drop ; + +M: sha-256 initialize-checksum-state drop ; + : s0-256 ( x -- x' ) [ [ -7 bitroll-32 ] diff --git a/core/checksums/checksums.factor b/core/checksums/checksums.factor index 0910a3efac..1d57823e18 100644 --- a/core/checksums/checksums.factor +++ b/core/checksums/checksums.factor @@ -8,9 +8,8 @@ MIXIN: checksum TUPLE: checksum-state bytes-read block-size bytes ; -: new-checksum-state ( block-size class -- checksum-state ) +: new-checksum-state ( class -- checksum-state ) new - swap >>block-size 0 >>bytes-read V{ } clone >>bytes ; inline @@ -18,6 +17,8 @@ M: checksum-state clone call-next-method [ clone ] change-bytes ; +GENERIC: initialize-checksum-state ( class -- checksum-state ) + GENERIC: checksum-block ( bytes checksum -- ) GENERIC: get-checksum ( checksum -- value )