235 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			235 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			Factor
		
	
	
| ! Copyright (C) 2007 Elie CHAFTARI
 | |
| ! See http://factorcode.org/license.txt for BSD license.
 | |
| 
 | |
| ! libs/cryptib/cryptlib.factor
 | |
| 
 | |
| ! Adapted from cryptlib.h
 | |
| ! Tested with cryptlib 3.3.1.0
 | |
| USING: cryptlib.libcl kernel hashtables alien math 
 | |
| namespaces sequences assocs libc alien.c-types alien.accessors continuations ;
 | |
| 
 | |
| IN: cryptlib
 | |
| 
 | |
| SYMBOL: keyset
 | |
| SYMBOL: certificate
 | |
| SYMBOL: cert-buffer
 | |
| SYMBOL: cert-length
 | |
| SYMBOL: context
 | |
| SYMBOL: envelope
 | |
| SYMBOL: bytes-copied
 | |
| SYMBOL: pop-buffer
 | |
| SYMBOL: session
 | |
| 
 | |
| ! =========================================================
 | |
| ! Error-handling routines
 | |
| ! =========================================================
 | |
| 
 | |
| : check-result ( result -- )
 | |
|     dup CRYPT_OK = [ 
 | |
|         drop
 | |
|     ] [
 | |
|         dup CRYPT_ENVELOPE_RESOURCE = [
 | |
|             throw
 | |
|         ] [
 | |
|             dup error-messages >hashtable at throw
 | |
|         ] if     
 | |
|     ] if ;
 | |
| 
 | |
| ! =========================================================
 | |
| ! Secure pointer-freeing routines
 | |
| ! =========================================================
 | |
| 
 | |
| : secure-free ( ptr n -- )
 | |
|     [ dupd 0 -rot set-alien-unsigned-1 ] each free ;
 | |
| 
 | |
| : secure-free-array ( ptr n type -- )
 | |
|     heap-size * [ dupd 0 -rot set-alien-unsigned-1 ] each free ;
 | |
| 
 | |
| : secure-free-object ( ptr type -- )
 | |
|     1 swap secure-free-array ;
 | |
| 
 | |
| ! =========================================================
 | |
| ! Initialise and shut down cryptlib
 | |
| ! =========================================================
 | |
| 
 | |
| : init ( -- )
 | |
|     cryptInit check-result ;
 | |
| 
 | |
| : end ( -- )
 | |
|     cryptEnd check-result ;
 | |
| 
 | |
| : with-cryptlib ( quot -- )
 | |
|         [ init [ end ] [ ] cleanup ] with-scope ; inline
 | |
| 
 | |
| ! =========================================================
 | |
| ! Create and destroy an encryption context
 | |
| ! =========================================================
 | |
| 
 | |
| : create-context ( algo -- )
 | |
|     >r "int" <c-object> dup swap CRYPT_UNUSED r> cryptCreateContext
 | |
|     check-result context set ;
 | |
| 
 | |
| : destroy-context ( -- )
 | |
|     context get [ *int cryptDestroyContext check-result ] when*
 | |
|         context off ;
 | |
| 
 | |
| : with-context ( algo quot -- )
 | |
|         swap create-context [ destroy-context ] [ ] cleanup ; inline
 | |
| 
 | |
| ! =========================================================
 | |
| ! Keyset routines
 | |
| ! =========================================================
 | |
| 
 | |
| : open-keyset ( type name options -- )
 | |
|     >r >r >r "int" <c-object> dup swap CRYPT_UNUSED r> r> string>char-alien
 | |
|     r> cryptKeysetOpen check-result keyset set ;
 | |
| 
 | |
| : close-keyset ( -- )
 | |
|     keyset get *int cryptKeysetClose check-result
 | |
|         destroy-context ;
 | |
| 
 | |
| : with-keyset ( type name options quot -- )
 | |
|         >r open-keyset r> [ close-keyset ] [ ] cleanup ; inline
 | |
| 
 | |
| : get-public-key ( idtype id -- )
 | |
|     >r >r keyset get *int "int*" <c-object> tuck r> r> string>char-alien
 | |
|     cryptGetPublicKey check-result context set ;
 | |
| 
 | |
| : get-private-key ( idtype id password -- )
 | |
|     >r >r >r keyset get *int "int*" <c-object> tuck r>
 | |
|     r> string>char-alien r> string>char-alien cryptGetPrivateKey
 | |
|     check-result context set ;
 | |
| 
 | |
| : get-key ( idtype id password -- )
 | |
|     >r >r >r keyset get *int "int*" <c-object> tuck r>
 | |
|     r> string>char-alien r> string>char-alien cryptGetKey
 | |
|     check-result context set ;
 | |
| 
 | |
| : add-public-key ( -- )
 | |
|     keyset get *int certificate get *int cryptAddPublicKey check-result ;
 | |
| 
 | |
| : add-private-key ( password -- )
 | |
|     >r keyset get *int context get *int r> string>char-alien
 | |
|     cryptAddPrivateKey check-result ;
 | |
| 
 | |
| : delete-key ( type id -- )
 | |
|     >r >r keyset get *int r> r> string>char-alien cryptDeleteKey
 | |
|     check-result ;
 | |
| 
 | |
| ! =========================================================
 | |
| ! Certificate routines
 | |
| ! =========================================================
 | |
| 
 | |
| : create-certificate ( type -- )
 | |
|     >r "int" <c-object> dup swap CRYPT_UNUSED r>
 | |
|     cryptCreateCert check-result certificate set ;
 | |
| 
 | |
| : destroy-certificate ( -- )
 | |
|     certificate get *int cryptDestroyCert check-result ;
 | |
| 
 | |
| : with-certificate ( type quot -- )
 | |
|         swap create-certificate [ destroy-certificate ] [ ] cleanup ; inline
 | |
| 
 | |
| : sign-certificate ( -- )
 | |
|     certificate get *int context get *int cryptSignCert check-result ;
 | |
| 
 | |
| : check-certificate ( -- )
 | |
|     certificate get *int context get *int cryptCheckCert check-result ;
 | |
| 
 | |
| : import-certificate ( certbuffer length -- )
 | |
|     >r r> CRYPT_UNUSED "int*" malloc-object dup >r
 | |
|     cryptImportCert check-result r> certificate set ;
 | |
| 
 | |
| : export-certificate ( certbuffer maxlength format -- )
 | |
|     >r >r dup swap r> "int*" malloc-object dup r> swap >r
 | |
|     certificate get *int cryptExportCert check-result
 | |
|     cert-buffer set r> cert-length set ;
 | |
| 
 | |
| ! =========================================================
 | |
| ! Generate a key into a context
 | |
| ! =========================================================
 | |
| 
 | |
| : generate-key ( handle -- )
 | |
|     *int cryptGenerateKey check-result ;
 | |
| 
 | |
| ! =========================================================
 | |
| ! Get/set/delete attribute functions
 | |
| ! =========================================================
 | |
| 
 | |
| : set-attribute ( handle attribute value -- )
 | |
|     >r >r *int r> r> cryptSetAttribute check-result ;
 | |
| 
 | |
| : set-attribute-string ( handle attribute value -- )
 | |
|     >r >r *int r> r> dup length swap string>char-alien swap
 | |
|     cryptSetAttributeString check-result ;
 | |
| 
 | |
| ! =========================================================
 | |
| ! Envelope and Session routines
 | |
| ! =========================================================
 | |
| 
 | |
| : create-envelope ( format -- )
 | |
|     >r "int" <c-object> dup swap CRYPT_UNUSED r> cryptCreateEnvelope
 | |
|     check-result envelope set ;
 | |
| 
 | |
| : destroy-envelope ( -- )
 | |
|     envelope get *int cryptDestroyEnvelope check-result ;
 | |
| 
 | |
| : with-envelope ( format quot -- )
 | |
|         swap create-envelope [ destroy-envelope ] [ ] cleanup ;
 | |
| 
 | |
| : create-session ( format -- )
 | |
|     >r "int" <c-object> dup swap CRYPT_UNUSED r> cryptCreateSession
 | |
|     check-result session set ;
 | |
| 
 | |
| : destroy-session ( -- )
 | |
|     session get *int cryptDestroySession check-result ;
 | |
| 
 | |
| : with-session ( format quot -- )
 | |
|         swap create-session [ destroy-session ] [ ] cleanup ;
 | |
| 
 | |
| : push-data ( handle buffer length -- )
 | |
|     >r >r *int r> r> "int" <c-object> [ cryptPushData ]
 | |
|     keep swap check-result bytes-copied set ;
 | |
| 
 | |
| : flush-data ( handle -- )
 | |
|     *int cryptFlushData check-result ;
 | |
| 
 | |
| : pop-data ( handle length -- )
 | |
|     dup >r >r *int r> "uchar*" malloc-array 
 | |
|     dup r> swap >r "int" <c-object> [ cryptPopData ] keep
 | |
|     swap check-result bytes-copied set r> pop-buffer set ;
 | |
| 
 | |
| ! =========================================================
 | |
| ! Public routines
 | |
| ! =========================================================
 | |
| 
 | |
| : envelope-handle ( -- envelope )
 | |
|     envelope get ;
 | |
| 
 | |
| : context-handle ( -- context )
 | |
|     context get ;
 | |
| 
 | |
| : certificate-handle ( -- certificate )
 | |
|     certificate get ;
 | |
| 
 | |
| : session-handle ( -- session )
 | |
|     session get ;
 | |
| 
 | |
| : set-pop-buffer ( data -- )
 | |
|     string>char-alien pop-buffer set ;
 | |
| 
 | |
| : get-pop-buffer ( -- buffer )
 | |
|     pop-buffer get ;
 | |
| 
 | |
| : pop-buffer-string ( -- s )
 | |
|     pop-buffer get alien>char-string ;
 | |
| 
 | |
| : get-bytes-copied ( -- value )
 | |
|     bytes-copied get *int ;
 | |
| 
 | |
| : get-cert-buffer ( -- certreq )
 | |
|     cert-buffer get ;
 | |
| 
 | |
| : get-cert-length ( -- certlength )
 | |
|     cert-length get ;
 |