1 ! Copyright (C) 2008, 2010, 2016 Slava Pestov, Alexander Ilin
2 ! See https://factorcode.org/license.txt for BSD license.
3 USING: accessors alien.c-types alien.data checksums checksums.common
4 destructors kernel namespaces openssl openssl.libcrypto sequences ;
7 ERROR: unknown-digest name ;
9 TUPLE: openssl-checksum name ;
11 INSTANCE: openssl-checksum block-checksum
13 CONSTANT: openssl-md5 T{ openssl-checksum f "md5" }
15 CONSTANT: openssl-sha1 T{ openssl-checksum f "sha1" }
17 CONSTANT: openssl-sha256 T{ openssl-checksum f "sha256" }
19 C: <openssl-checksum> openssl-checksum
23 TUPLE: evp-md-context < disposable handle ;
25 : evp-md-ctx-new ( -- ctx )
26 ssl-new-api? get-global [ EVP_MD_CTX_new ] [ EVP_MD_CTX_create ] if ;
28 : evp-md-ctx-free ( ctx -- )
29 ssl-new-api? get-global [ EVP_MD_CTX_free ] [ EVP_MD_CTX_destroy ] if ;
31 : <evp-md-context> ( -- ctx )
32 evp-md-context new-disposable evp-md-ctx-new >>handle ;
34 M: evp-md-context dispose*
35 handle>> evp-md-ctx-free ;
37 : digest-named ( name -- md )
38 [ EVP_get_digestbyname ] [ unknown-digest ] ?unless ;
40 : set-digest ( name ctx -- )
41 handle>> swap digest-named f EVP_DigestInit_ex ssl-error ;
43 M: openssl-checksum initialize-checksum-state
44 maybe-init-ssl name>> <evp-md-context> [ set-digest ] keep ;
46 M: evp-md-context add-checksum-bytes
47 [ dup handle>> ] dip dup length EVP_DigestUpdate ssl-error ;
49 M: evp-md-context get-checksum
51 { { int EVP_MAX_MD_SIZE } int }
52 [ EVP_DigestFinal_ex ssl-error ] with-out-parameters