377 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			377 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 ;
 | 
						|
 | 
						|
"=========================================================" 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
 | 
						|
        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
 | 
						|
        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
 | 
						|
;
 |