]> gitweb.factorcode.org Git - factor.git/blob - basis/openssl/openssl.factor
977f8d0f3004cc526477d73e229279a2509e16a4
[factor.git] / basis / openssl / openssl.factor
1 ! Copyright (C) 2007, 2008, Slava Pestov, Elie CHAFTARI.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: alien.libraries init kernel math namespaces openssl.libcrypto
4 openssl.libssl sequences ;
5 IN: openssl
6
7 ! This code is based on http://www.rtfm.com/openssl-examples/
8
9 SYMBOLS: ssl-initialized? ssl-new-api? ;
10
11 SINGLETON: openssl
12
13 : (ssl-error-string) ( n -- string )
14     ERR_clear_error f ERR_error_string ;
15
16 : ssl-error-string ( -- string )
17     ERR_get_error (ssl-error-string) ;
18
19 : throw-ssl-error ( -- * )
20     ssl-error-string throw ;
21
22 : ssl-error ( obj -- )
23     { f 0 } member? [ throw-ssl-error ] when ;
24
25 : init-old-api ( -- )
26     SSL_library_init ssl-error
27     SSL_load_error_strings
28     OpenSSL_add_all_digests ;
29
30 : init-new-api ( -- )
31     0 f OPENSSL_init_ssl ssl-error
32     OPENSSL_INIT_LOAD_SSL_STRINGS
33     OPENSSL_INIT_LOAD_CRYPTO_STRINGS bitand
34     f OPENSSL_init_ssl ssl-error
35     OPENSSL_INIT_ADD_ALL_DIGESTS f OPENSSL_init_ssl ssl-error ;
36
37 : init-ssl ( -- )
38     "OPENSSL_init_ssl" "libssl" dlsym? >boolean
39     [ ssl-new-api? set-global ]
40     [ [ init-new-api ] [ init-old-api ] if ] bi ;
41
42 : maybe-init-ssl ( -- )
43     ssl-initialized? get-global [
44         init-ssl
45         t ssl-initialized? set-global
46     ] unless ;
47
48 STARTUP-HOOK: [ f ssl-initialized? set-global ]