378 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			378 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Factor
		
	
	
|  | USING: cryptlib.libcl cryptlib prettyprint kernel alien sequences libc math | ||
|  | tools.test io io.files continuations alien.c-types splitting generic.math | ||
|  | io.encodings.binary ;
 | ||
|  | 
 | ||
|  | "=========================================================" print
 | ||
|  | "Envelope/de-envelop test..." print
 | ||
|  | "=========================================================" print
 | ||
|  | 
 | ||
|  | [ | ||
|  |     ! envelope | ||
|  |     CRYPT_FORMAT_CRYPTLIB [ | ||
|  |         "Hello world" set-pop-buffer | ||
|  |         envelope-handle CRYPT_ENVINFO_DATASIZE | ||
|  |         get-pop-buffer alien>char-string length set-attribute | ||
|  |         envelope-handle get-pop-buffer dup alien>char-string length push-data | ||
|  |         get-bytes-copied .
 | ||
|  |         envelope-handle flush-data | ||
|  |         envelope-handle 1024 pop-data | ||
|  |         get-bytes-copied .
 | ||
|  |         pop-buffer-string .
 | ||
|  |     ] with-envelope | ||
|  | 
 | ||
|  |     ! de-envelope | ||
|  |     CRYPT_FORMAT_AUTO [ | ||
|  |         envelope-handle get-pop-buffer get-bytes-copied push-data | ||
|  |         get-bytes-copied .
 | ||
|  |         envelope-handle flush-data | ||
|  |         envelope-handle get-bytes-copied pop-data | ||
|  |         get-bytes-copied .
 | ||
|  |         [ "Hello world" ] [ pop-buffer-string ] unit-test | ||
|  |     ] with-envelope | ||
|  | 
 | ||
|  | ] with-cryptlib | ||
|  | 
 | ||
|  | "=========================================================" print
 | ||
|  | "Password encryption test..." print
 | ||
|  | "=========================================================" print
 | ||
|  | 
 | ||
|  | [ | ||
|  |     ! envelope | ||
|  |     CRYPT_FORMAT_CRYPTLIB [ | ||
|  |         envelope-handle CRYPT_ENVINFO_PASSWORD "password" set-attribute-string | ||
|  |         "Hello world" set-pop-buffer | ||
|  |         envelope-handle CRYPT_ENVINFO_DATASIZE | ||
|  |         get-pop-buffer alien>char-string length set-attribute | ||
|  |         envelope-handle get-pop-buffer dup alien>char-string length push-data | ||
|  |         get-bytes-copied .
 | ||
|  |         envelope-handle flush-data | ||
|  |         envelope-handle 1024 pop-data | ||
|  |         get-bytes-copied .
 | ||
|  |         pop-buffer-string .
 | ||
|  |     ] with-envelope | ||
|  | 
 | ||
|  |         ! de-envelope | ||
|  |     CRYPT_FORMAT_AUTO [ | ||
|  |         [ envelope-handle get-pop-buffer get-bytes-copied push-data ] [ | ||
|  |             dup CRYPT_ENVELOPE_RESOURCE = [ | ||
|  |                 envelope-handle CRYPT_ENVINFO_PASSWORD | ||
|  |                 "password" set-attribute-string | ||
|  |             ] [ | ||
|  |                 rethrow
 | ||
|  |             ] if
 | ||
|  |         ] recover drop
 | ||
|  |         get-bytes-copied .
 | ||
|  |         envelope-handle flush-data | ||
|  |         envelope-handle get-bytes-copied pop-data | ||
|  |         get-bytes-copied .
 | ||
|  |         [ "Hello world" ] [ pop-buffer-string ] unit-test | ||
|  |     ] with-envelope | ||
|  | ] with-cryptlib | ||
|  | 
 | ||
|  | "=========================================================" print
 | ||
|  | "Compression test..." print
 | ||
|  | "=========================================================" print
 | ||
|  | 
 | ||
|  | [ | ||
|  |     ! envelope | ||
|  |     CRYPT_FORMAT_CRYPTLIB [ | ||
|  |         envelope-handle CRYPT_ENVINFO_COMPRESSION CRYPT_UNUSED set-attribute | ||
|  |         "Hello world" set-pop-buffer | ||
|  |         envelope-handle CRYPT_ENVINFO_DATASIZE | ||
|  |         get-pop-buffer alien>char-string length set-attribute | ||
|  |         envelope-handle get-pop-buffer dup alien>char-string length push-data | ||
|  |         get-bytes-copied .
 | ||
|  |         envelope-handle flush-data | ||
|  |         envelope-handle 1024 pop-data | ||
|  |         get-bytes-copied .
 | ||
|  |         pop-buffer-string .
 | ||
|  |     ] with-envelope | ||
|  | 
 | ||
|  |     ! de-envelope | ||
|  |     CRYPT_FORMAT_AUTO [ | ||
|  |         envelope-handle get-pop-buffer get-bytes-copied push-data | ||
|  |         get-bytes-copied .
 | ||
|  |         envelope-handle flush-data | ||
|  |         envelope-handle get-bytes-copied pop-data | ||
|  |         get-bytes-copied .
 | ||
|  |         [ "Hello world" ] [ pop-buffer-string ] unit-test | ||
|  |     ] with-envelope | ||
|  | ] with-cryptlib | ||
|  | 
 | ||
|  | "=========================================================" print
 | ||
|  | "Conventional encryption test..." print
 | ||
|  | "=========================================================" print
 | ||
|  | 
 | ||
|  | [ | ||
|  |     ! envelope | ||
|  |     CRYPT_FORMAT_CRYPTLIB [ | ||
|  |         CRYPT_ALGO_IDEA [ | ||
|  |             context-handle CRYPT_CTXINFO_KEY "0123456789ABCDEF" set-attribute-string | ||
|  |             envelope-handle CRYPT_ENVINFO_SESSIONKEY context-handle *int set-attribute | ||
|  |         ] with-context | ||
|  | 
 | ||
|  |         "Hello world" set-pop-buffer | ||
|  |         envelope-handle CRYPT_ENVINFO_DATASIZE | ||
|  |         get-pop-buffer alien>char-string length set-attribute | ||
|  |         envelope-handle get-pop-buffer dup alien>char-string length push-data | ||
|  |         get-bytes-copied .
 | ||
|  |         envelope-handle flush-data | ||
|  |         envelope-handle 1024 pop-data | ||
|  |         get-bytes-copied .
 | ||
|  |         pop-buffer-string .
 | ||
|  |     ] with-envelope | ||
|  | 
 | ||
|  |     ! de-envelope | ||
|  |     CRYPT_FORMAT_AUTO [ | ||
|  |         [ envelope-handle get-pop-buffer get-bytes-copied push-data ] [ | ||
|  |             dup CRYPT_ENVELOPE_RESOURCE = [ | ||
|  |                 CRYPT_ALGO_IDEA create-context | ||
|  |                 context-handle CRYPT_CTXINFO_KEY "0123456789ABCDEF" | ||
|  |                 set-attribute-string | ||
|  |                 envelope-handle CRYPT_ENVINFO_SESSIONKEY context-handle *int | ||
|  |                 set-attribute | ||
|  |             ] [ | ||
|  |                 rethrow
 | ||
|  |             ] if
 | ||
|  |         ] recover drop
 | ||
|  | 
 | ||
|  |         get-bytes-copied .
 | ||
|  |         destroy-context | ||
|  |         envelope-handle flush-data | ||
|  |         envelope-handle get-bytes-copied pop-data | ||
|  |         get-bytes-copied .
 | ||
|  |         [ "Hello world" ] [ pop-buffer-string ] unit-test | ||
|  |     ] with-envelope | ||
|  | ] with-cryptlib | ||
|  | 
 | ||
|  | "=========================================================" print
 | ||
|  | "Large data size envelope/de-envelop test..." print
 | ||
|  | "=========================================================" print
 | ||
|  | 
 | ||
|  | [ | ||
|  |     ! envelope | ||
|  |     CRYPT_FORMAT_CRYPTLIB [ | ||
|  |         "extra/cryptlib/test/large_data.txt" resource-path | ||
|  |         binary file-contents set-pop-buffer | ||
|  |         envelope-handle CRYPT_ATTRIBUTE_BUFFERSIZE | ||
|  |         get-pop-buffer alien>char-string length 10000 + set-attribute | ||
|  |         envelope-handle CRYPT_ENVINFO_DATASIZE | ||
|  |         get-pop-buffer alien>char-string length set-attribute | ||
|  |         envelope-handle get-pop-buffer dup alien>char-string length push-data | ||
|  |         get-bytes-copied .
 | ||
|  |         envelope-handle flush-data | ||
|  |         envelope-handle get-pop-buffer alien>char-string length 10000 + pop-data | ||
|  |         get-bytes-copied .
 | ||
|  |         ! pop-buffer-string . | ||
|  |     ] with-envelope | ||
|  | 
 | ||
|  |     ! de-envelope | ||
|  |     CRYPT_FORMAT_AUTO [ | ||
|  |         envelope-handle CRYPT_ATTRIBUTE_BUFFERSIZE | ||
|  |         get-pop-buffer alien>char-string length 10000 + set-attribute | ||
|  |         envelope-handle get-pop-buffer get-bytes-copied push-data | ||
|  |         get-bytes-copied .
 | ||
|  |         envelope-handle flush-data | ||
|  |         envelope-handle get-bytes-copied pop-data | ||
|  |         get-bytes-copied .
 | ||
|  |         ! pop-buffer-string . | ||
|  |         [ "/opt/local/lib/libcl.dylib(dylib1.o):" ] | ||
|  |         [ pop-buffer-string "\n" split first ] unit-test | ||
|  |         [ "00000000 t __mh_dylib_header" ] | ||
|  |         [ pop-buffer-string "\n" split last/first first ] unit-test | ||
|  |     ] with-envelope | ||
|  | ] with-cryptlib | ||
|  | 
 | ||
|  | "=========================================================" print
 | ||
|  | "Large data size password encryption test..." print
 | ||
|  | "=========================================================" print
 | ||
|  | 
 | ||
|  | [ | ||
|  | 
 | ||
|  |     ! envelope | ||
|  |     CRYPT_FORMAT_CRYPTLIB [ | ||
|  |         envelope-handle CRYPT_ENVINFO_PASSWORD "password" set-attribute-string | ||
|  |         "extra/cryptlib/test/large_data.txt" resource-path | ||
|  |         binary file-contents set-pop-buffer | ||
|  |         envelope-handle CRYPT_ATTRIBUTE_BUFFERSIZE | ||
|  |         get-pop-buffer alien>char-string length 10000 + set-attribute | ||
|  |         envelope-handle CRYPT_ENVINFO_DATASIZE | ||
|  |         get-pop-buffer alien>char-string length set-attribute | ||
|  |         envelope-handle get-pop-buffer dup alien>char-string length push-data | ||
|  |         get-bytes-copied .
 | ||
|  |         envelope-handle flush-data | ||
|  |         envelope-handle get-pop-buffer alien>char-string length 10000 + pop-data | ||
|  |         get-bytes-copied .
 | ||
|  |         pop-buffer-string .
 | ||
|  |     ] with-envelope | ||
|  | 
 | ||
|  |     ! de-envelope | ||
|  |     CRYPT_FORMAT_AUTO [ | ||
|  |         envelope-handle CRYPT_ATTRIBUTE_BUFFERSIZE 130000 set-attribute | ||
|  |         [ envelope-handle get-pop-buffer get-bytes-copied push-data ] [ | ||
|  |             dup CRYPT_ENVELOPE_RESOURCE = [ | ||
|  |                 envelope-handle CRYPT_ENVINFO_PASSWORD | ||
|  |                 "password" set-attribute-string | ||
|  |             ] [ | ||
|  |                 rethrow
 | ||
|  |             ] if
 | ||
|  |         ] recover drop
 | ||
|  | 
 | ||
|  |         get-bytes-copied .
 | ||
|  |         envelope-handle flush-data | ||
|  |         envelope-handle get-bytes-copied pop-data | ||
|  |         get-bytes-copied .
 | ||
|  |         ! pop-buffer-string . | ||
|  | 
 | ||
|  |         [ "/opt/local/lib/libcl.dylib(dylib1.o):" ] | ||
|  |         [ pop-buffer-string "\n" split first ] unit-test | ||
|  | 
 | ||
|  |         [ "00000000 t __mh_dylib_header" ] | ||
|  |         [ pop-buffer-string "\n" split last/first first ] unit-test | ||
|  |     ] with-envelope | ||
|  | ] with-cryptlib | ||
|  | 
 | ||
|  | "=========================================================" print
 | ||
|  | "Generating a key pair test..." print
 | ||
|  | "=========================================================" print
 | ||
|  | 
 | ||
|  | [ | ||
|  |     CRYPT_ALGO_RSA [ | ||
|  |         context-handle CRYPT_CTXINFO_LABEL "private key" set-attribute-string | ||
|  | 
 | ||
|  |         ! a particular key length can be set (e.g. 1536-bit/192-byte key) | ||
|  |         context-handle CRYPT_CTXINFO_KEYSIZE 1536 8 / set-attribute | ||
|  | 
 | ||
|  |         context-handle generate-key | ||
|  | 
 | ||
|  |         CRYPT_KEYSET_FILE "extra/cryptlib/test/keys.p15" resource-path | ||
|  |         CRYPT_KEYOPT_CREATE [ | ||
|  |             "password" add-private-key | ||
|  |         ] with-keyset | ||
|  |     ] with-context | ||
|  | ] with-cryptlib | ||
|  | 
 | ||
|  | "Passed" print
 | ||
|  | 
 | ||
|  | "=========================================================" print
 | ||
|  | "Simple certificate creation test..." print
 | ||
|  | "=========================================================" print
 | ||
|  | 
 | ||
|  | [ | ||
|  |     CRYPT_ALGO_RSA [ | ||
|  |         context-handle CRYPT_CTXINFO_LABEL "private key" set-attribute-string | ||
|  |         context-handle generate-key | ||
|  |         CRYPT_KEYSET_FILE "extra/cryptlib/test/keys.p15" resource-path | ||
|  |         CRYPT_KEYOPT_CREATE [ | ||
|  |             "password" add-private-key | ||
|  |             CRYPT_CERTTYPE_CERTIFICATE [ | ||
|  |                 certificate-handle CRYPT_CERTINFO_XYZZY 1 set-attribute | ||
|  |                 certificate-handle CRYPT_CERTINFO_SUBJECTPUBLICKEYINFO | ||
|  |                 context-handle *int set-attribute | ||
|  |                 certificate-handle CRYPT_CERTINFO_COMMONNAME "Dave Smith" | ||
|  |                 set-attribute-string | ||
|  |                 sign-certificate | ||
|  |                 check-certificate | ||
|  |                 add-public-key | ||
|  |                 f 0 CRYPT_CERTFORMAT_TEXT_CERTIFICATE export-certificate | ||
|  |                 get-cert-length *int dup malloc swap
 | ||
|  |                 CRYPT_CERTFORMAT_TEXT_CERTIFICATE export-certificate | ||
|  |                 get-cert-buffer alien>char-string print
 | ||
|  |             ] with-certificate | ||
|  |         ] with-keyset | ||
|  |     ] with-context | ||
|  | ] with-cryptlib | ||
|  | 
 | ||
|  | : ssh-session ( -- )
 | ||
|  |     "=========================================================" print
 | ||
|  |     "SSH session test..." print
 | ||
|  |     "=========================================================" print
 | ||
|  | 
 | ||
|  |     ! start client connection with: | ||
|  |     ! ssh -v localhost -p3000 | ||
|  |     "waiting for: ssh -v localhost -p3000" print flush
 | ||
|  | 
 | ||
|  |     ! Are you sure you want to continue connecting (yes/no)? yes | ||
|  |     ! ... | ||
|  |     ! <at> localhost's password: (any password will be accepted) | ||
|  | 
 | ||
|  |     ! If you want to run the test again you should clean the [localhost]:3000 | ||
|  |     ! ssh-rsa entry in the known_hosts file, in your home directory under the .ssh | ||
|  |     ! folder, since the test generates a new RSA certificate on every run. | ||
|  | 
 | ||
|  |     [ | ||
|  |         CRYPT_KEYSET_FILE "extra/cryptlib/test/keys.p15" resource-path | ||
|  |         CRYPT_KEYOPT_READONLY [ | ||
|  |             CRYPT_KEYID_NAME "private key" "password" get-private-key | ||
|  | 
 | ||
|  |             CRYPT_SESSION_SSH_SERVER [ | ||
|  | 
 | ||
|  |                 session-handle CRYPT_SESSINFO_SERVER_NAME "localhost" | ||
|  |                 set-attribute-string | ||
|  | 
 | ||
|  |                 session-handle CRYPT_SESSINFO_SERVER_PORT 3000 set-attribute | ||
|  | 
 | ||
|  |                 session-handle CRYPT_SESSINFO_PRIVATEKEY | ||
|  | 
 | ||
|  |                 context-handle *int set-attribute | ||
|  | 
 | ||
|  |                 [ session-handle CRYPT_SESSINFO_ACTIVE 1 set-attribute ] [ | ||
|  |                     dup CRYPT_ENVELOPE_RESOURCE = [ | ||
|  |                         session-handle CRYPT_SESSINFO_AUTHRESPONSE 1
 | ||
|  |                         set-attribute | ||
|  | 
 | ||
|  |                         session-handle CRYPT_SESSINFO_ACTIVE 1 set-attribute | ||
|  | 
 | ||
|  |                         "Welcome to cryptlib, now go away.\r\n" set-pop-buffer | ||
|  | 
 | ||
|  |                         session-handle  get-pop-buffer dup alien>char-string | ||
|  |                         length push-data | ||
|  | 
 | ||
|  |                         session-handle flush-data | ||
|  |                     ] [ | ||
|  |                         rethrow
 | ||
|  |                     ] if
 | ||
|  |                 ] recover drop
 | ||
|  |             ] with-session | ||
|  |         ] with-keyset | ||
|  |     ] with-cryptlib | ||
|  | 
 | ||
|  |     "Passed" print
 | ||
|  | ;
 | ||
|  | 
 | ||
|  | : ssl-session ( -- )
 | ||
|  |     "=========================================================" print
 | ||
|  |     "SSL session test..." print
 | ||
|  |     "=========================================================" print
 | ||
|  | 
 | ||
|  |     ! start client connection with: | ||
|  |     ! curl -k https://localhost:3000 | ||
|  |     "waiting for: curl -k https://localhost:3000" print flush
 | ||
|  | 
 | ||
|  |     [ | ||
|  |         CRYPT_KEYSET_FILE "extra/cryptlib/test/keys.p15" resource-path | ||
|  |         CRYPT_KEYOPT_READONLY [ | ||
|  |             CRYPT_KEYID_NAME "private key" "password" get-private-key | ||
|  | 
 | ||
|  |             CRYPT_SESSION_SSL_SERVER [ | ||
|  |                 session-handle CRYPT_SESSINFO_SERVER_NAME "localhost" | ||
|  |                 set-attribute-string | ||
|  |                 session-handle CRYPT_SESSINFO_SERVER_PORT 3000 set-attribute | ||
|  |                 session-handle CRYPT_OPTION_NET_WRITETIMEOUT 10 set-attribute | ||
|  |                 session-handle CRYPT_OPTION_NET_READTIMEOUT 10 set-attribute | ||
|  |                 session-handle CRYPT_OPTION_NET_CONNECTTIMEOUT 10 set-attribute | ||
|  |                 session-handle CRYPT_SESSINFO_PRIVATEKEY | ||
|  |                 context-handle *int set-attribute | ||
|  | 
 | ||
|  |                 session-handle CRYPT_SESSINFO_ACTIVE 1 set-attribute | ||
|  |                 "Welcome to cryptlib, now go away.\r\n" set-pop-buffer | ||
|  |                 session-handle  get-pop-buffer dup alien>char-string | ||
|  |                 length push-data | ||
|  |                 session-handle flush-data | ||
|  |             ] with-session | ||
|  |         ] with-keyset | ||
|  |     ] with-cryptlib | ||
|  | 
 | ||
|  |     "Passed" print
 | ||
|  | ;
 |