]> gitweb.factorcode.org Git - factor.git/commitdiff
checksums: some cleanup.
authorJohn Benediktsson <mrjbq7@gmail.com>
Thu, 30 Jun 2016 18:41:27 +0000 (11:41 -0700)
committerJohn Benediktsson <mrjbq7@gmail.com>
Thu, 30 Jun 2016 19:30:58 +0000 (12:30 -0700)
- define checksum-bytes and checksum-stream in terms of each other
- delete stream-checksum now that it's no longer needed
- move checksum-state stuff into checksums.common
- add a block-checksum that uses the checksum-state stuff
- change checksums.openssl to not use the checksum-state

basis/checksums/common/common.factor
basis/checksums/hmac/hmac.factor
basis/checksums/md5/md5.factor
basis/checksums/openssl/openssl.factor
basis/checksums/sha/sha.factor
basis/checksums/stream/stream-docs.factor [deleted file]
basis/checksums/stream/stream.factor [deleted file]
basis/checksums/stream/summary.txt [deleted file]
core/checksums/checksums.factor

index 69d6c3ed9def0e54a0b1d4eada26afc86796bd32..8e062bb0d17f47a9918488778b3cfe4991b97f87 100644 (file)
@@ -1,6 +1,8 @@
 ! Copyright (C) 2006, 2008 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: byte-arrays grouping io.binary kernel make math ;
+USING: accessors byte-arrays byte-vectors checksums grouping io
+io.backend io.binary io.encodings.binary io.files kernel make
+math sequences ;
 IN: checksums.common
 
 : calculate-pad-length ( length -- length' )
@@ -12,3 +14,52 @@ IN: checksums.common
         [ 0x3f bitand calculate-pad-length <byte-array> % ]
         [ 3 shift 8 rot [ >be ] [ >le ] if % ] bi
     ] B{ } make 64 group ;
+
+MIXIN: block-checksum
+
+INSTANCE: block-checksum checksum
+
+TUPLE: checksum-state
+{ bytes-read integer }
+{ block-size integer }
+{ bytes byte-vector } ;
+
+: new-checksum-state ( class -- checksum-state )
+    new
+        BV{ } clone >>bytes ; inline
+
+M: checksum-state clone
+    call-next-method
+    [ clone ] change-bytes ;
+
+GENERIC: initialize-checksum-state ( checksum -- checksum-state )
+
+GENERIC: checksum-block ( bytes checksum-state -- )
+
+GENERIC: get-checksum ( checksum-state -- value )
+
+: add-checksum-bytes ( checksum-state data -- checksum-state' )
+    over bytes>> [ push-all ] keep
+    [ dup length pick block-size>> >= ]
+    [
+        over block-size>> cut-slice [
+            over checksum-block
+            [ block-size>> ] keep [ + ] change-bytes-read
+        ] dip
+    ] while
+    >byte-vector
+    [ >>bytes ] [ length [ + ] curry change-bytes-read ] bi ;
+
+: add-checksum-stream ( checksum-state stream -- checksum-state )
+    [ [ add-checksum-bytes ] each-block ] with-input-stream ;
+
+: add-checksum-file ( checksum-state path -- checksum-state )
+    binary <file-reader> add-checksum-stream ;
+
+M: block-checksum checksum-bytes
+    initialize-checksum-state
+    swap add-checksum-bytes get-checksum ;
+
+M: block-checksum checksum-stream
+    initialize-checksum-state
+    swap add-checksum-stream get-checksum ;
index 86b724d49a533a05a7b954b9a6955b21c3433fe7..4c88a56edbef660f1b0e58e270338d7cd8fa5806 100644 (file)
@@ -1,8 +1,8 @@
 ! Copyright (C) 2008 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors arrays checksums combinators fry io io.binary
-io.encodings.binary io.files io.streams.byte-array kernel
-locals math math.vectors memoize sequences ;
+USING: accessors arrays checksums checksums.common
+io.encodings.binary io.files io.streams.byte-array kernel locals
+math math.vectors sequences ;
 IN: checksums.hmac
 
 <PRIVATE
index 71d60f3367dc04b7d24484fc65cb3bf95e917d72..0bebd0ab23ff1798cc978d0fa27d0395e5cba6a3 100644 (file)
@@ -1,15 +1,15 @@
 ! Copyright (C) 2006, 2008 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors alien.c-types alien.data byte-arrays checksums
-checksums.common checksums.stream combinators fry grouping hints
-kernel kernel.private literals locals macros math math.bitwise
+checksums.common combinators fry grouping hints kernel
+kernel.private literals locals macros math math.bitwise
 math.functions sequences sequences.private specialized-arrays ;
 SPECIALIZED-ARRAY: uint
 IN: checksums.md5
 
 SINGLETON: md5
 
-INSTANCE: md5 stream-checksum
+INSTANCE: md5 block-checksum
 
 TUPLE: md5-state < checksum-state
 { state uint-array }
@@ -201,8 +201,4 @@ M: md5-state get-checksum
     [ bytes>> f ] [ bytes-read>> pad-last-block ] [ ] tri
     [ [ checksum-block ] curry each ] [ md5>checksum ] bi ;
 
-M: md5 checksum-stream
-    drop
-    [ <md5-state> ] dip add-checksum-stream get-checksum ;
-
 PRIVATE>
index 3bade18f9024db6c847e19e76e2dab0c1502d4a4..d6a5be2f178481608b41aa268234a77be7aef1fd 100644 (file)
@@ -1,20 +1,19 @@
 ! Copyright (C) 2008, 2010, 2016 Slava Pestov, Alexander Ilin
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors alien.c-types alien.data checksums
-checksums.stream destructors fry io kernel openssl openssl.libcrypto
-sequences ;
+USING: accessors alien.c-types alien.data checksums destructors
+io kernel openssl openssl.libcrypto sequences ;
 IN: checksums.openssl
 
 ERROR: unknown-digest name ;
 
 TUPLE: openssl-checksum name ;
 
+INSTANCE: openssl-checksum checksum
+
 CONSTANT: openssl-md5 T{ openssl-checksum f "md5" }
 
 CONSTANT: openssl-sha1 T{ openssl-checksum f "sha1" }
 
-INSTANCE: openssl-checksum stream-checksum
-
 C: <openssl-checksum> openssl-checksum
 
 <PRIVATE
@@ -29,31 +28,34 @@ M: evp-md-context dispose*
     handle>> EVP_MD_CTX_destroy ;
 
 : digest-named ( name -- md )
-    dup EVP_get_digestbyname
-    [ ] [ unknown-digest ] ?if ;
+    dup EVP_get_digestbyname [ ] [ unknown-digest ] ?if ;
 
 : set-digest ( name ctx -- )
     handle>> swap digest-named f EVP_DigestInit_ex ssl-error ;
 
-: checksum-method ( data checksum method: ( ctx data -- ctx' ) -- value )
-    [ initialize-checksum-state ] dip '[ swap @ get-checksum ] with-disposal ; inline
-
-PRIVATE>
-
-M: openssl-checksum initialize-checksum-state ( checksum -- evp-md-context )
-    maybe-init-ssl name>> <evp-md-context> [ set-digest ] keep ;
+: with-evp-md-context ( ... checksum quot: ( ... ctx -- ... ) -- ... )
+    [
+        maybe-init-ssl name>> <evp-md-context>
+        [ set-digest ] keep
+    ] dip with-disposal ; inline
 
-M: evp-md-context add-checksum-bytes ( ctx bytes -- ctx' )
-    [ dup handle>> ] dip dup length EVP_DigestUpdate ssl-error ;
-
-M: evp-md-context get-checksum ( ctx -- value )
+: digest-value ( ctx -- value )
     handle>>
     { { int EVP_MAX_MD_SIZE } int }
     [ EVP_DigestFinal_ex ssl-error ] with-out-parameters
     memory>byte-array ;
 
-M: openssl-checksum checksum-bytes ( bytes checksum -- value )
-    [ add-checksum-bytes ] checksum-method ;
+: digest-update ( ctx bytes -- ctx )
+    [ dup handle>> ] dip dup length EVP_DigestUpdate ssl-error ;
+
+PRIVATE>
+
+M: openssl-checksum checksum-bytes
+    [ swap digest-update digest-value ] with-evp-md-context ;
 
-M: openssl-checksum checksum-stream ( stream checksum -- value )
-    [ add-checksum-stream ] checksum-method ;
+M: openssl-checksum checksum-stream
+    [
+        swap
+        [ [ digest-update ] each-block ] with-input-stream
+        digest-value
+    ] with-evp-md-context ;
index fa1dc47caac078df6750740b6ec2b92f5f8bb664..4d930619e4ba1cdfe8a6bb71a8429116515ab3c4 100644 (file)
@@ -7,7 +7,7 @@ sequences.generalizations sequences.private ;
 IN: checksums.sha
 
 MIXIN: sha
-INSTANCE: sha checksum
+INSTANCE: sha block-checksum
 
 SINGLETON: sha1
 INSTANCE: sha1 sha
@@ -405,12 +405,4 @@ M: sha1-state get-checksum
     clone
     [ pad-last-short-block ] [ sha-256>checksum ] bi ;
 
-M: sha checksum-stream
-    initialize-checksum-state swap add-checksum-stream
-    get-checksum ;
-
-M: sha checksum-bytes
-    initialize-checksum-state swap add-checksum-bytes
-    get-checksum ;
-
 PRIVATE>
diff --git a/basis/checksums/stream/stream-docs.factor b/basis/checksums/stream/stream-docs.factor
deleted file mode 100644 (file)
index d8a9c61..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-USING: checksums help.markup help.syntax ;
-IN: checksums.stream
-
-ARTICLE: "checksums.stream" "Stream Checksum"
-"The instances of the " { $link stream-checksum } " mixin must implement " { $link checksum-stream } "." ;
-
-ABOUT: "checksums.stream"
diff --git a/basis/checksums/stream/stream.factor b/basis/checksums/stream/stream.factor
deleted file mode 100644 (file)
index e753467..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-! Copyright (C) 2008 Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-USING: io.encodings.binary io.streams.byte-array kernel
-checksums ;
-IN: checksums.stream
-
-MIXIN: stream-checksum
-
-M: stream-checksum checksum-bytes
-    [ binary <byte-reader> ] dip checksum-stream ;
-
-INSTANCE: stream-checksum checksum
diff --git a/basis/checksums/stream/summary.txt b/basis/checksums/stream/summary.txt
deleted file mode 100644 (file)
index 12fcb8c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Computing checksums of streaming data
index 64ddd11be711d10ac67c76735c209a307954fa47..f81e4b9807be614adc83017abfc218839ef0b191 100644 (file)
@@ -1,56 +1,20 @@
 ! Copyright (c) 2008 Slava Pestov
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors byte-arrays byte-vectors io io.backend io.files
-kernel math math.parser sequences ;
+USING: io io.backend io.encodings.binary io.files
+io.streams.byte-array kernel sequences ;
 IN: checksums
 
 MIXIN: checksum
 
-TUPLE: checksum-state
-{ bytes-read integer }
-{ block-size integer }
-{ bytes byte-vector } ;
-
-: new-checksum-state ( class -- checksum-state )
-    new
-        BV{ } clone >>bytes ; inline
-
-M: checksum-state clone
-    call-next-method
-    [ clone ] change-bytes ;
-
-GENERIC: initialize-checksum-state ( checksum -- checksum-state )
-
-GENERIC: checksum-block ( bytes checksum-state -- )
-
-GENERIC# add-checksum-bytes 1 ( checksum-state bytes -- checksum-state' )
-
-GENERIC: get-checksum ( checksum-state -- value )
-
-M: checksum-state add-checksum-bytes ( checksum-state data -- checksum-state' )
-    over bytes>> [ push-all ] keep
-    [ dup length pick block-size>> >= ]
-    [
-        over block-size>> cut-slice [
-            over checksum-block
-            [ block-size>> ] keep [ + ] change-bytes-read
-        ] dip
-    ] while
-    >byte-vector
-    [ >>bytes ] [ length [ + ] curry change-bytes-read ] bi ;
-
-: add-checksum-stream ( checksum-state stream -- checksum-state )
-    [ [ add-checksum-bytes ] each-block ] with-input-stream ;
-
-: add-checksum-file ( checksum-state path -- checksum-state )
-    normalize-path (file-reader) add-checksum-stream ;
-
 GENERIC: checksum-bytes ( bytes checksum -- value )
 
 GENERIC: checksum-stream ( stream checksum -- value )
 
 GENERIC: checksum-lines ( lines checksum -- value )
 
+M: checksum checksum-bytes
+    [ binary <byte-reader> ] dip checksum-stream ;
+
 M: checksum checksum-stream
     [ stream-contents ] dip checksum-bytes ;
 
@@ -58,7 +22,4 @@ M: checksum checksum-lines
     [ B{ CHAR: \n } join ] dip checksum-bytes ;
 
 : checksum-file ( path checksum -- value )
-    ! normalize-path (file-reader) is equivalent to
-    ! binary <file-reader>. We use the lower-level form
-    ! so that we can move io.encodings.binary to basis/.
-    [ normalize-path (file-reader) ] dip checksum-stream ;
+    [ binary <file-reader> ] dip checksum-stream ;