154 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			154 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Factor
		
	
	
|  | ! Copyright (C) 2007 Elie CHAFTARI | ||
|  | ! See http://factorcode.org/license.txt for BSD license. | ||
|  | !
 | ||
|  | ! Tested with OpenSSL 0.9.8a_0 on Mac OS X 10.4.9 PowerPC | ||
|  | 
 | ||
|  | USING: alien alien.c-types assocs kernel libc namespaces | ||
|  | openssl.libcrypto openssl.libssl sequences unix ;
 | ||
|  | 
 | ||
|  | IN: openssl | ||
|  | 
 | ||
|  | SYMBOL: bio | ||
|  | SYMBOL: ssl-bio | ||
|  | 
 | ||
|  | SYMBOL: ctx | ||
|  | SYMBOL: dh | ||
|  | SYMBOL: rsa | ||
|  | 
 | ||
|  | ! ========================================================= | ||
|  | ! Callback routines | ||
|  | ! ========================================================= | ||
|  | 
 | ||
|  | : password-cb ( -- alien )
 | ||
|  |     "int" { "char*" "int" "int" "void*" } "cdecl" | ||
|  |     [ 3drop "password" string>char-alien 1023 memcpy | ||
|  |     "password" length ] alien-callback ;
 | ||
|  | 
 | ||
|  | ! ========================================================= | ||
|  | ! Error-handling routines | ||
|  | ! ========================================================= | ||
|  | 
 | ||
|  | : get-error ( -- num )
 | ||
|  |     ERR_get_error ;
 | ||
|  | 
 | ||
|  | : error-string ( num -- str )
 | ||
|  |     f ERR_error_string ;
 | ||
|  | 
 | ||
|  | : check-result ( result -- )
 | ||
|  |     1 = [  ] [ | ||
|  |         get-error error-string throw
 | ||
|  |     ] if ;
 | ||
|  | 
 | ||
|  | : ssl-get-error ( ssl ret -- )
 | ||
|  |     SSL_get_error error-messages at throw ;
 | ||
|  | 
 | ||
|  | ! Write errors to a file | ||
|  | : bio-new-file ( path mode -- )
 | ||
|  |     BIO_new_file bio set ;
 | ||
|  | 
 | ||
|  | : bio-print ( bio str -- n )
 | ||
|  |     BIO_printf ;
 | ||
|  | 
 | ||
|  | : bio-free ( bio -- )
 | ||
|  |     BIO_free check-result ;
 | ||
|  | 
 | ||
|  | ! ========================================================= | ||
|  | ! Initialization routines | ||
|  | ! ========================================================= | ||
|  | 
 | ||
|  | : init ( -- )
 | ||
|  |     SSL_library_init drop ; ! always returns 1 | ||
|  | 
 | ||
|  | : load-error-strings ( -- )
 | ||
|  |     SSL_load_error_strings ;
 | ||
|  | 
 | ||
|  | : ssl-v23 ( -- method )
 | ||
|  |     SSLv23_method ;
 | ||
|  | 
 | ||
|  | : new-ctx ( method -- )
 | ||
|  |     SSL_CTX_new ctx set ;
 | ||
|  | 
 | ||
|  | : use-cert-chain ( ctx file -- )
 | ||
|  |     SSL_CTX_use_certificate_chain_file check-result ;
 | ||
|  | 
 | ||
|  | : set-default-passwd ( ctx cb -- )
 | ||
|  |     SSL_CTX_set_default_passwd_cb ;
 | ||
|  | 
 | ||
|  | : set-default-passwd-userdata ( ctx passwd -- )
 | ||
|  |     SSL_CTX_set_default_passwd_cb_userdata ;
 | ||
|  | 
 | ||
|  | : use-private-key ( ctx file type -- )
 | ||
|  |     SSL_CTX_use_PrivateKey_file check-result ;
 | ||
|  | 
 | ||
|  | : verify-load-locations ( ctx file path -- )
 | ||
|  |     SSL_CTX_load_verify_locations check-result ;
 | ||
|  | 
 | ||
|  | : set-verify-depth ( ctx depth -- )
 | ||
|  |     SSL_CTX_set_verify_depth ;
 | ||
|  | 
 | ||
|  | : read-pem-dh-params ( bio x cb u -- )
 | ||
|  |     PEM_read_bio_DHparams dh set ;
 | ||
|  | 
 | ||
|  | : set-tmp-dh-callback ( ctx dh -- )
 | ||
|  |     SSL_CTX_set_tmp_dh_callback ;
 | ||
|  | 
 | ||
|  | : set-ctx-ctrl ( ctx cmd larg parg -- )
 | ||
|  |     SSL_CTX_ctrl check-result ;
 | ||
|  | 
 | ||
|  | : generate-rsa-key ( n e cb cbarg -- )
 | ||
|  |     RSA_generate_key rsa set ;
 | ||
|  | 
 | ||
|  | : set-tmp-rsa-callback ( ctx rsa -- )
 | ||
|  |     SSL_CTX_set_tmp_rsa_callback ;
 | ||
|  | 
 | ||
|  | : free-rsa ( rsa -- )
 | ||
|  |     RSA_free ;
 | ||
|  | 
 | ||
|  | : bio-new-socket ( fd flag -- sbio )
 | ||
|  |     BIO_new_socket ;
 | ||
|  | 
 | ||
|  | : new-ssl ( ctx -- ssl )
 | ||
|  |     SSL_new ;
 | ||
|  | 
 | ||
|  | : set-ssl-bio ( ssl bio bio -- )
 | ||
|  |     SSL_set_bio ;
 | ||
|  | 
 | ||
|  | : set-ssl-fd ( ssl fd -- )
 | ||
|  |     SSL_set_fd check-result ;
 | ||
|  | 
 | ||
|  | : ssl-accept ( ssl -- result )
 | ||
|  |     SSL_accept ;
 | ||
|  | 
 | ||
|  | ! ========================================================= | ||
|  | ! Clean-up and termination routines | ||
|  | ! ========================================================= | ||
|  | 
 | ||
|  | : destroy-ctx ( ctx -- )
 | ||
|  |     SSL_CTX_free ;
 | ||
|  | 
 | ||
|  | ! ========================================================= | ||
|  | ! Public routines | ||
|  | ! ========================================================= | ||
|  | 
 | ||
|  | : get-bio ( -- bio )
 | ||
|  |     bio get ;
 | ||
|  | 
 | ||
|  | : get-ssl-bio ( -- bio )
 | ||
|  |     ssl-bio get ;
 | ||
|  | 
 | ||
|  | : get-ctx ( -- ctx )
 | ||
|  |     ctx get ;
 | ||
|  | 
 | ||
|  | : get-dh ( -- dh )
 | ||
|  |     dh get ;
 | ||
|  | 
 | ||
|  | : get-rsa ( -- rsa )
 | ||
|  |     rsa get ;
 | ||
|  | 
 | ||
|  | : >md5 ( str -- byte-array )
 | ||
|  |     dup length 16 "uchar" <c-array> [ MD5 ] keep nip ;
 | ||
|  | 
 | ||
|  | : >sha1 ( str -- byte-array )
 | ||
|  |     dup length 20 "uchar" <c-array> [ SHA1 ] keep nip ;
 | ||
|  | 
 |