]> gitweb.factorcode.org Git - factor-unmaintained.git/blobdiff - cryptlib/cryptlib-tests.factor
unmaintained: New home for misfit Factor vocabularies.
[factor-unmaintained.git] / cryptlib / cryptlib-tests.factor
diff --git a/cryptlib/cryptlib-tests.factor b/cryptlib/cryptlib-tests.factor
new file mode 100644 (file)
index 0000000..aeac468
--- /dev/null
@@ -0,0 +1,377 @@
+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
+;