]> gitweb.factorcode.org Git - factor.git/commitdiff
checksums.openssl: implement common checksum interface
authorAlexander Iljin <ajsoft@yandex.ru>
Thu, 23 Jun 2016 07:10:57 +0000 (10:10 +0300)
committerJohn Benediktsson <mrjbq7@gmail.com>
Wed, 29 Jun 2016 21:17:57 +0000 (14:17 -0700)
basis/checksums/openssl/openssl.factor

index 41c8537d45820f1976c22a5ecda9673dd08aeaf1..77523405021fa0cdb4d176d3f86f5753259dd8a7 100644 (file)
@@ -1,8 +1,8 @@
-! Copyright (C) 2008, 2010 Slava Pestov
+! Copyright (C) 2008, 2010, 2016 Slava Pestov, Alexander Ilin
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors byte-arrays alien.c-types alien.data kernel
-continuations destructors sequences io openssl openssl.libcrypto
-checksums checksums.stream classes.struct ;
+USING: accessors alien.c-types alien.data checksums
+checksums.stream destructors io kernel openssl openssl.libcrypto
+sequences ;
 IN: checksums.openssl
 
 ERROR: unknown-digest name ;
@@ -17,8 +17,6 @@ INSTANCE: openssl-checksum stream-checksum
 
 C: <openssl-checksum> openssl-checksum
 
-<PRIVATE
-
 TUPLE: evp-md-context < disposable handle ;
 
 : <evp-md-context> ( -- ctx )
@@ -28,8 +26,7 @@ TUPLE: evp-md-context < disposable handle ;
 M: evp-md-context dispose*
     handle>> EVP_MD_CTX_destroy ;
 
-: with-evp-md-context ( quot -- )
-    maybe-init-ssl [ <evp-md-context> ] dip with-disposal ; inline
+<PRIVATE
 
 : digest-named ( name -- md )
     dup EVP_get_digestbyname
@@ -38,27 +35,22 @@ M: evp-md-context dispose*
 : set-digest ( name ctx -- )
     handle>> swap digest-named f EVP_DigestInit_ex ssl-error ;
 
-: checksum-loop ( ctx -- )
-    dup handle>>
-    4096 read-partial dup [
-        dup length EVP_DigestUpdate ssl-error
-        checksum-loop
-    ] [ 3drop ] if ;
+PRIVATE>
 
-: digest-value ( ctx -- value )
+M: openssl-checksum initialize-checksum-state ( checksum -- evp-md-context )
+    maybe-init-ssl name>> <evp-md-context> [ set-digest ] keep ;
+
+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 )
     handle>>
     { { int EVP_MAX_MD_SIZE } int }
     [ EVP_DigestFinal_ex ssl-error ] with-out-parameters
     memory>byte-array ;
 
-PRIVATE>
+M: openssl-checksum checksum-bytes ( bytes checksum -- value )
+    initialize-checksum-state [ swap add-checksum-bytes get-checksum ] with-disposal ;
 
-M: openssl-checksum checksum-stream
-    name>> swap [
-        [
-            [ set-digest ]
-            [ checksum-loop ]
-            [ digest-value ]
-            tri
-        ] with-evp-md-context
-    ] with-input-stream ;
+M: openssl-checksum checksum-stream ( stream checksum -- value )
+    initialize-checksum-state [ swap add-checksum-stream get-checksum ] with-disposal ;