! Copyright (C) 2008, 2010 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: accessors kernel namespaces continuations destructors io debugger io.sockets io.sockets.private sequences summary calendar delegate system vocabs.loader combinators present ; IN: io.sockets.secure SYMBOL: secure-socket-timeout 1 minutes secure-socket-timeout set-global SYMBOL: secure-socket-backend HOOK: ssl-supported? secure-socket-backend ( -- ? ) M: object ssl-supported? f ; SINGLETONS: SSLv2 SSLv23 SSLv3 TLSv1 ; TUPLE: secure-config method key-file password verify verify-depth ca-file ca-path dh-file ephemeral-key-bits ; : ( -- config ) secure-config new SSLv23 >>method 1024 >>ephemeral-key-bits t >>verify ; TUPLE: secure-context < disposable config handle ; HOOK: secure-socket-backend ( config -- context ) : with-secure-context ( config quot -- ) [ [ ] [ [ secure-context set ] prepose ] bi* with-disposal ] with-scope ; inline TUPLE: secure { addrspec read-only } ; C: secure M: secure present addrspec>> present " (secure)" append ; CONSULT: inet secure addrspec>> ; M: secure resolve-host ( secure -- seq ) addrspec>> resolve-host [ ] map ; HOOK: check-certificate secure-socket-backend ( host handle -- ) PREDICATE: secure-inet < secure addrspec>> inet? ; > host>> pick handle>> check-certificate ] with-destructors ; PRIVATE> ERROR: premature-close ; M: premature-close summary drop "Connection closed prematurely - potential truncation attack" ; ERROR: certificate-verify-error result ; M: certificate-verify-error summary drop "Certificate verification failed" ; ERROR: common-name-verify-error expected got ; M: common-name-verify-error summary drop "Common name verification failed" ; ERROR: upgrade-on-non-socket ; M: upgrade-on-non-socket summary drop "send-secure-handshake can only be used if input-stream and" print "output-stream are a socket" ; ERROR: upgrade-buffers-full ; M: upgrade-buffers-full summary drop "send-secure-handshake can only be used if buffers are empty" ; HOOK: send-secure-handshake secure-socket-backend ( -- ) HOOK: accept-secure-handshake secure-socket-backend ( -- ) { { [ os unix? ] [ "io.sockets.secure.unix" require ] } { [ os windows? ] [ "openssl" require ] } } cond