changeset 26345:f9737783d0f1

lib-dcrypt: Add tests for raw keys
author Aki Tuomi <aki.tuomi@open-xchange.com>
date Mon, 19 Aug 2019 22:40:02 +0300
parents d105ebec077a
children 1cabad843182
files src/lib-dcrypt/test-crypto.c
diffstat 1 files changed, 118 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-dcrypt/test-crypto.c	Mon Aug 19 14:39:05 2019 +0300
+++ b/src/lib-dcrypt/test-crypto.c	Mon Aug 19 22:40:02 2019 +0300
@@ -1,6 +1,7 @@
 /* Copyright (c) 2016-2018 Dovecot authors, see the included COPYING file */
 
 #include "lib.h"
+#include "array.h"
 #include "buffer.h"
 #include "str.h"
 #include "dcrypt.h"
@@ -901,6 +902,122 @@
 	test_end();
 }
 
+static void test_raw_keys(void)
+{
+
+	test_begin("test_raw_keys");
+
+	ARRAY_TYPE(dcrypt_raw_key) priv_key;
+	ARRAY_TYPE(dcrypt_raw_key) pub_key;
+	pool_t pool = pool_datastack_create();
+
+	enum dcrypt_key_type t;
+
+	p_array_init(&priv_key, pool, 2);
+	p_array_init(&pub_key, pool, 2);
+
+	/* generate ECC key */
+	struct dcrypt_keypair pair;
+	i_assert(dcrypt_keypair_generate(&pair, DCRYPT_KEY_EC, 0, "prime256v1", NULL));
+
+	/* store it */
+	test_assert(dcrypt_key_store_private_raw(pair.priv, pool, &t, &priv_key,
+		    NULL));
+	test_assert(dcrypt_key_store_public_raw(pair.pub, pool, &t, &pub_key,
+		    NULL));
+	dcrypt_keypair_unref(&pair);
+
+	/* load it */
+	test_assert(dcrypt_key_load_private_raw(&pair.priv, t, &priv_key,
+		    NULL));
+	test_assert(dcrypt_key_load_public_raw(&pair.pub, t, &pub_key,
+		    NULL));
+
+	dcrypt_keypair_unref(&pair);
+
+	/* test load known raw private key */
+	const char *curve = "prime256v1";
+	const unsigned char priv_key_data[] = {
+		0x16, 0x9e, 0x62, 0x36, 0xaf, 0x9c, 0xae, 0x0e, 0x71, 0xda,
+		0xf2, 0x63, 0xe2, 0xe0, 0x5d, 0xf1, 0xd5, 0x35, 0x8c, 0x2b,
+		0x68, 0xf0, 0x2a, 0x69, 0xc4, 0x5d, 0x3d, 0x1c, 0xde, 0xa1,
+		0x9b, 0xd3
+	};
+
+	/* create buffers */
+	struct dcrypt_raw_key *item;
+	ARRAY_TYPE(dcrypt_raw_key) static_key;
+	t_array_init(&static_key, 2);
+
+	/* Add OID */
+	buffer_t *buf = t_buffer_create(32);
+	test_assert(dcrypt_name2oid(curve, buf, NULL));
+	item = array_append_space(&static_key);
+	item->parameter = buf->data;
+	item->len = buf->used;
+
+	/* Add key data */
+	item = array_append_space(&static_key);
+	item->parameter = priv_key_data;
+	item->len = sizeof(priv_key_data);
+
+	/* Try load it */
+	test_assert(dcrypt_key_load_private_raw(&pair.priv, t,
+						&static_key, NULL));
+
+	/* See what we got */
+	buf = t_buffer_create(128);
+	test_assert(dcrypt_key_store_private(pair.priv, DCRYPT_FORMAT_DOVECOT,
+					     NULL, buf, NULL, NULL, NULL));
+	test_assert_strcmp(str_c(buf),
+			   "2:1.2.840.10045.3.1.7:0:00000020169e6236af9cae0e71d"
+			   "af263e2e05df1d5358c2b68f02a69c45d3d1cdea19bd3:21d11"
+			   "6b7b3e5c52e81f0437a10b0116cfafc467fb1b96e48926d0216"
+			   "68fc1bea");
+
+	/* try to load public key, too */
+	const unsigned char pub_key_data[] = {
+		0x04, 0xe8, 0x7c, 0x6d, 0xa0, 0x29, 0xfe, 0x5d, 0x16, 0x1a,
+		0xd6, 0x6a, 0xc6, 0x1c, 0x78, 0x8a, 0x36, 0x0f, 0xfb, 0x64,
+		0xe7, 0x7f, 0x58, 0x13, 0xb3, 0x80, 0x1f, 0x99, 0x45, 0xee,
+		0xa9, 0x4a, 0xe2, 0xde, 0xf3, 0x88, 0xc6, 0x37, 0x72, 0x7f,
+		0xbe, 0x97, 0x02, 0x94, 0xb2, 0x21, 0x60, 0xa4, 0x98, 0x4e,
+		0xfb, 0x46, 0x19, 0x61, 0x4c, 0xc5, 0xe1, 0x9f, 0xe9, 0xb2,
+		0xd2, 0x4d, 0xae, 0x83, 0x4b
+	};
+
+	array_clear(&static_key);
+
+	/* Add OID */
+	buf = t_buffer_create(32);
+	test_assert(dcrypt_name2oid(curve, buf, NULL));
+	item = array_append_space(&static_key);
+	item->parameter = buf->data;
+	item->len = buf->used;
+
+	/* Add key data */
+	item = array_append_space(&static_key);
+	item->parameter = pub_key_data;
+	item->len = sizeof(pub_key_data);
+
+	/* See what we got */
+	test_assert(dcrypt_key_load_public_raw(&pair.pub, t,
+					       &static_key, NULL));
+	buf = t_buffer_create(128);
+	test_assert(dcrypt_key_store_public(pair.pub, DCRYPT_FORMAT_DOVECOT,
+					    buf, NULL));
+	test_assert_strcmp(str_c(buf),
+			   "2:3059301306072a8648ce3d020106082a8648ce3d030107034"
+			   "20004e87c6da029fe5d161ad66ac61c788a360ffb64e77f5813"
+			   "b3801f9945eea94ae2def388c637727fbe970294b22160a4984"
+			   "efb4619614cc5e19fe9b2d24dae834b:21d116b7b3e5c52e81f"
+			   "0437a10b0116cfafc467fb1b96e48926d021668fc1bea");
+
+	dcrypt_keypair_unref(&pair);
+
+	test_end();
+}
+
 int main(void)
 {
 	struct dcrypt_settings set = {
@@ -931,6 +1048,7 @@
 		test_get_info_pw_encrypted,
 		test_password_change,
 		test_load_invalid_keys,
+		test_raw_keys,
 		NULL
 	};