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
 | |
| ;
 |