[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 1/2] tests: add crypto unittest for chacha20poly1305


Signed-off-by: Jussi Kivilinna <jussi.kivilinna@xxxxxx>
---
 tests/unittests/torture_crypto.c | 73 ++++++++++++++++++++++++++++++++
 1 file changed, 73 insertions(+)

diff --git a/tests/unittests/torture_crypto.c b/tests/unittests/torture_crypto.c
index fd5e7753..caa00b72 100644
--- a/tests/unittests/torture_crypto.c
+++ b/tests/unittests/torture_crypto.c
@@ -110,10 +110,83 @@ static void torture_crypto_aes256_cbc(void **state)
     ssh_cipher_clear(&cipher);
 }
 
+#define POLY1305_TAGLEN 16
+
+uint8_t chacha20poly1305_encrypted[sizeof(uint32_t) + 144 + POLY1305_TAGLEN] =
+    "\xed\xaf\xbc\xa3\xf6\x97\x75\xb4\x3b\x8f\xb0\x8e\xb0\x0a\x8e"
+    "\xb3\x90\x21\x0d\x7a\xb6\xd3\x03\xf6\xbc\x6e\x3a\x32\x67\xe1"
+    "\x13\x65\x43\x3b\x34\x9d\xcb\x62\x7e\x0a\x80\xb0\x45\x87\x07"
+    "\x85\x49\x8d\x23\x5f\xac\x9c\x8b\xa8\xd5\x01\x12\xfe\x52\xc6"
+    "\x99\xb4\xf2\xde\x12\x78\x79\xea\x1c\x5f\x45\xcd\xf7\xe4\xa0"
+    "\x66\x15\x7f\xe3\xf4\x73\x3b\xe0\x52\xac\x2a\x00\x73\xd0\xd7"
+    "\x95\xa9\xb9\x3a\xe0\x50\x13\xf4\xdc\xfc\x2a\x64\xb5\xcf\x29"
+    "\x88\xef\x4c\x56\x10\x30\x28\xbb\x59\xb8\x23\x58\xab\x01\xa2"
+    "\xab\x6b\xdd\xee\x20\x43\xe1\xec\x7a\xe1\xaa\x8b\x60\x19\xde"
+    "\x3a\xd1\xd6\x80\x49\x7d\x5c\x81\xb8\x96\xad\x62\x32\xb4\x24"
+    "\x5c\xcf\xb8\xab\xd7\xa6\xc6\x47\x8d\x73\x9e\x44\xc6\x66";
+
+static void torture_crypto_chacha20poly1305(void **state)
+{
+    const uint64_t seq = (uint64_t)1234567890 * 98765431;
+    uint8_t input[sizeof(uint32_t) + sizeof(cleartext)];
+    uint8_t output[sizeof(input) + POLY1305_TAGLEN] = {0};
+    uint8_t *outtag = output + sizeof(input);
+    struct ssh_cipher_struct cipher = {0};
+    uint32_t in_length;
+    int rc;
+    (void)state;
+
+    assert_int_equal(sizeof(output), sizeof(chacha20poly1305_encrypted));
+
+    in_length = htonl(sizeof(cleartext));
+    memcpy(input, &in_length, sizeof(uint32_t));
+    memcpy(input + sizeof(uint32_t), cleartext, sizeof(cleartext));
+
+    rc = get_cipher(&cipher, "chacha20-poly1305@xxxxxxxxxxx");
+    assert_int_equal(rc, SSH_OK);
+
+    assert_non_null(cipher.set_encrypt_key);
+    assert_non_null(cipher.aead_encrypt);
+
+    rc = cipher.set_encrypt_key(&cipher, key, NULL);
+    assert_int_equal(rc, SSH_OK);
+
+    cipher.aead_encrypt(&cipher, input, output, sizeof(input), outtag, seq);
+
+    assert_memory_equal(output, chacha20poly1305_encrypted,
+                        sizeof(chacha20poly1305_encrypted));
+    ssh_cipher_clear(&cipher);
+
+    memset(output, '\0', sizeof(output));
+
+    rc = get_cipher(&cipher, "chacha20-poly1305@xxxxxxxxxxx");
+    assert_int_equal(rc, SSH_OK);
+
+    assert_non_null(cipher.set_decrypt_key);
+    assert_non_null(cipher.aead_decrypt);
+    assert_non_null(cipher.aead_decrypt_length);
+
+    rc = cipher.set_decrypt_key(&cipher, key, NULL);
+    assert_int_equal(rc, SSH_OK);
+
+    rc = cipher.aead_decrypt_length(&cipher, chacha20poly1305_encrypted,
+                                    output, sizeof(uint32_t), seq);
+    assert_int_equal(rc, SSH_OK);
+
+    rc = cipher.aead_decrypt(&cipher, chacha20poly1305_encrypted,
+                             output + sizeof(uint32_t), sizeof(cleartext), seq);
+    assert_int_equal(rc, SSH_OK);
+
+    assert_memory_equal(output, input, sizeof(input));
+
+    ssh_cipher_clear(&cipher);
+}
+
 int torture_run_tests(void) {
     int rc;
     const struct CMUnitTest tests[] = {
         cmocka_unit_test(torture_crypto_aes256_cbc),
+        cmocka_unit_test(torture_crypto_chacha20poly1305),
     };
 
     ssh_init();
-- 
2.20.1


Archive administrator: postmaster@lists.cynapses.org