factor/basis/checksums/openssl/openssl.factor

66 lines
1.6 KiB
Factor
Raw Normal View History

! Copyright (C) 2008, 2010 Slava Pestov
2008-05-11 18:43:45 -04:00
! 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
2009-09-18 18:50:20 -04:00
checksums checksums.stream classes.struct ;
2008-05-11 18:43:45 -04:00
IN: checksums.openssl
ERROR: unknown-digest name ;
TUPLE: openssl-checksum name ;
CONSTANT: openssl-md5 T{ openssl-checksum f "md5" }
2008-05-11 18:43:45 -04:00
CONSTANT: openssl-sha1 T{ openssl-checksum f "sha1" }
2008-05-11 18:43:45 -04:00
2008-12-08 15:58:00 -05:00
INSTANCE: openssl-checksum stream-checksum
2008-05-11 18:43:45 -04:00
C: <openssl-checksum> openssl-checksum
<PRIVATE
TUPLE: evp-md-context < disposable handle ;
2008-05-11 18:43:45 -04:00
: <evp-md-context> ( -- ctx )
evp-md-context new-disposable
EVP_MD_CTX_create >>handle ;
2008-05-11 18:43:45 -04:00
M: evp-md-context dispose*
handle>> EVP_MD_CTX_destroy ;
2008-05-11 18:43:45 -04:00
: with-evp-md-context ( quot -- )
2008-11-29 14:00:50 -05:00
maybe-init-ssl [ <evp-md-context> ] dip with-disposal ; inline
2008-05-11 18:43:45 -04:00
: digest-named ( name -- md )
dup EVP_get_digestbyname
[ ] [ unknown-digest ] ?if ;
: 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 ;
: digest-value ( ctx -- value )
handle>>
{ { int EVP_MAX_MD_SIZE } int }
[ EVP_DigestFinal_ex ssl-error ]
[ memory>byte-array ]
with-out-parameters ;
2008-05-11 18:43:45 -04:00
PRIVATE>
M: openssl-checksum checksum-stream
name>> swap [
[
[ set-digest ]
[ checksum-loop ]
[ digest-value ]
tri
] with-evp-md-context
] with-input-stream ;