1 ! Copyright (C) 2008 Slava Pestov
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors byte-arrays alien.c-types kernel continuations
4 destructors sequences io openssl openssl.libcrypto checksums ;
7 ERROR: unknown-digest name ;
9 TUPLE: openssl-checksum name ;
11 : openssl-md5 T{ openssl-checksum f "md5" } ;
13 : openssl-sha1 T{ openssl-checksum f "sha1" } ;
15 INSTANCE: openssl-checksum checksum
17 C: <openssl-checksum> openssl-checksum
21 TUPLE: evp-md-context handle ;
23 : <evp-md-context> ( -- ctx )
24 "EVP_MD_CTX" <c-object>
25 dup EVP_MD_CTX_init evp-md-context boa ;
27 M: evp-md-context dispose
28 handle>> EVP_MD_CTX_cleanup drop ;
30 : with-evp-md-context ( quot -- )
31 maybe-init-ssl >r <evp-md-context> r> with-disposal ; inline
33 : digest-named ( name -- md )
34 dup EVP_get_digestbyname
35 [ ] [ unknown-digest ] ?if ;
37 : set-digest ( name ctx -- )
38 handle>> swap digest-named f EVP_DigestInit_ex ssl-error ;
40 : checksum-loop ( ctx -- )
42 4096 read-partial dup [
43 dup length EVP_DigestUpdate ssl-error
47 : digest-value ( ctx -- value )
49 EVP_MAX_MD_SIZE <byte-array> 0 <int>
50 [ EVP_DigestFinal_ex ssl-error ] 2keep
51 *int memory>byte-array ;
55 M: openssl-checksum checksum-stream