From bee3c05fe9fe4327228e68901c24021bfc65115f Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Mon, 11 May 2009 11:37:21 -0500 Subject: [PATCH] working on checksums --- basis/checksums/hmac/hmac.factor | 16 ++++++++++------ basis/checksums/md5/md5.factor | 31 ++++++++++++++++++++++--------- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/basis/checksums/hmac/hmac.factor b/basis/checksums/hmac/hmac.factor index 7350a02573..fd7f6ef3a1 100755 --- a/basis/checksums/hmac/hmac.factor +++ b/basis/checksums/hmac/hmac.factor @@ -8,6 +8,7 @@ IN: checksums.hmac sha1 get-sha1 @@ -15,12 +16,13 @@ IN: checksums.hmac [ process-sha1-block ] [ process-sha1-block ] bi* get-sha1 ; -: md5-hmac ( Ko Ki stream -- hmac ) + : 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 ; @@ -35,12 +37,14 @@ MEMO: ipad ( -- seq ) 64 HEX: 36 ; PRIVATE> -: hmac ( K stream checksum -- value ) - ; - :: hmac-stream ( K stream checksum -- value ) - K init-K :> i :> o - stream checksum checksum-stream ; + 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 ; : 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 bf43805df2..abdc3504cc 100644 --- a/basis/checksums/md5/md5.factor +++ b/basis/checksums/md5/md5.factor @@ -13,7 +13,7 @@ TUPLE: md5-state bytes-read state old-state ; md5-state new 0 >>bytes-read { HEX: 67452301 HEX: efcdab89 HEX: 98badcfe HEX: 10325476 } - [ clone >>state ] [ clone >>old-state ] bi ; + [ clone >>state ] [ >>old-state ] bi ; > ] [ old-state>> v-w+ dup clone ] [ ] tri - [ (>>old-state) ] [ (>>state) ] bi ; + [ (>>old-state) ] [ (>>state) ] bi ; inline : T ( N -- Y ) - sin abs 32 2^ * >integer ; foldable + sin abs 32 2^ * >integer ; inline :: F ( X Y Z -- FXYZ ) #! F(X,Y,Z) = XY v not(X) Z @@ -179,15 +179,15 @@ MACRO: with-md5-round ( ops quot -- ) block f state bytes-read>> pad-last-block [ state (process-md5-block) ] each ] if ; - -:: stream>md5 ( stream state -- ) - 64 stream stream-read - [ state process-md5-block ] [ length 64 = ] bi - [ stream state stream>md5 ] when ; : get-md5 ( md5-state -- bytes ) state>> [ 4 >le ] map B{ } concat-as ; +:: stream>md5 ( state stream -- ) + 64 stream stream-read + [ state process-md5-block ] [ length 64 = ] bi + [ state stream stream>md5 ] when ; + PRIVATE> SINGLETON: md5 @@ -195,4 +195,17 @@ SINGLETON: md5 INSTANCE: md5 stream-checksum M: md5 checksum-stream - drop [ stream>md5 ] [ get-md5 ] bi ; + drop [ ] dip [ stream>md5 ] [ drop get-md5 ] 2bi ; + +GENERIC: initialize-checksum ( checksum -- state ) +GENERIC# add-bytes 1 ( state bytes -- state ) +GENERIC# add-stream 1 ( state stream -- state ) +GENERIC: finish-checksum ( state -- bytes ) + +M: md5 initialize-checksum drop ; + +M: md5-state finish-checksum get-md5 ; + +M: md5-state add-bytes over [ binary stream>md5 ] dip ; + +M: md5-state add-stream over [ stream>md5 ] dip ;