! Copyright (C) 2007, 2008, Slava Pestov, Elie CHAFTARI.
! See http://factorcode.org/license.txt for BSD license.
-USING: init io kernel namespaces openssl.libcrypto openssl.libssl
-sequences ;
+USING: alien.libraries kernel math namespaces openssl.libcrypto
+openssl.libssl sequences ;
IN: openssl
! This code is based on http://www.rtfm.com/openssl-examples/
+SYMBOLS: ssl-initialized? ssl-new-api? ;
+
SINGLETON: openssl
: (ssl-error-string) ( n -- string )
: ssl-error-string ( -- string )
ERR_get_error (ssl-error-string) ;
-: (ssl-error) ( -- * )
+: throw-ssl-error ( -- * )
ssl-error-string throw ;
: ssl-error ( obj -- )
- { f 0 } member? [ (ssl-error) ] when ;
+ { f 0 } member? [ throw-ssl-error ] when ;
-: init-ssl ( -- )
+: init-old-api ( -- )
SSL_library_init ssl-error
SSL_load_error_strings
- OpenSSL_add_all_digests
- OpenSSL_add_all_ciphers ;
+ OpenSSL_add_all_digests ;
+
+: init-new-api ( -- )
+ 0 f OPENSSL_init_ssl ssl-error
+ OPENSSL_INIT_LOAD_SSL_STRINGS
+ OPENSSL_INIT_LOAD_CRYPTO_STRINGS bitand
+ f OPENSSL_init_ssl ssl-error
+ OPENSSL_INIT_ADD_ALL_DIGESTS f OPENSSL_init_ssl ssl-error ;
+
+: init-ssl ( -- )
+ "OPENSSL_init_ssl" "libssl" dlsym? >boolean
+ [ ssl-new-api? set-global ]
+ [ [ init-new-api ] [ init-old-api ] if ] bi ;
+
+: maybe-init-ssl ( -- )
+ ssl-initialized? get-global [
+ init-ssl
+ t ssl-initialized? set-global
+ ] unless ;
-[ init-ssl ] "openssl" add-startup-hook
+STARTUP-HOOK: [ f ssl-initialized? set-global ]