test-mail-global-key.c revision beec8b0a6a3ece557c9acec524e82542a9641662
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (c) 2015-2016 Dovecot authors, see the included COPYING file */
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch#include "lib.h"
ee2633056e67353157bfbce4d9e0d1c3ceaa627aStephan Bosch#include "test-common.h"
ee2633056e67353157bfbce4d9e0d1c3ceaa627aStephan Bosch#include "randgen.h"
201c3b9375760bafbc180629b4c6ad71ed554aecStephan Bosch#include "array.h"
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch#include "dcrypt.h"
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch#include "hex-binary.h"
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch#include "mail-crypt-common.h"
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch#include "mail-crypt-key.h"
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch#include "fs-crypt-settings.h"
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch#include "mail-crypt-pluginenv.c"
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Boschstatic struct fs_crypt_settings fs_set;
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Boschstatic const char *settings[] = {
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch "mail_crypt_global_private_key",
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JR0hBZ0VBTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEJHMHdhd0lCQVFRZ1lJdWZKWlplMlk2aUZ6NXgKa29Jb3lzYjNkWkxaV3N5ZWtqT2MvR2pzTGQyaFJBTkNBQVNuSVdnUXVoRThqcUFMY21maXVuUnlFazd2a3EveQphOXZZSzUwYjNjRmhDc0xVNHRmVlRMa0IxWS82VmxaajYzUUtNelhOdms1RzVPRDFvZkVsY3B5agotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCg==",
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch "mail_crypt_global_public_key",
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch "LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFcHlGb0VMb1JQSTZnQzNKbjRycDBjaEpPNzVLdgo4bXZiMkN1ZEc5M0JZUXJDMU9MWDFVeTVBZFdQK2xaV1krdDBDak0xemI1T1J1VGc5YUh4SlhLY293PT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg==",
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch "mail_crypt_global_private_key2",
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch "LS0tLS1CRUdJTiBFTkNSWVBURUQgUFJJVkFURSBLRVktLS0tLQpNSUhlTUVrR0NTcUdTSWIzRFFFRkRUQThNQnNHQ1NxR1NJYjNEUUVGRERBT0JBaXA2cUpja1FET3F3SUNDQUF3CkhRWUpZSVpJQVdVREJBRXFCQkFXN09oUFRlU0xSOExLcGYwZjZHa3ZCSUdRZk5rYUpodnM2VWVWS2RkN2NzdFMKMURSNXJYTWtON09FbVNjTTljRlk2UDVrMzdnY1VJUFZudTQrOTFYZUE1MTU2cnBpUEpycEdkZnprcjhPNVFqZApsMWRycmR6Z0hqZHE4T2VmbUR1MEEzMjRZd25SS3hGRExUcjlHMkxVMkhoYmV6a0xjV1FwMVJISDZsNXRRcUtwCjZid05iMnc3OXhCb01YSjN6MVZqcElOZk9wRnJ6M3lucVlqUXhseTIrQjg2Ci0tLS0tRU5EIEVOQ1JZUFRFRCBQUklWQVRFIEtFWS0tLS0tCg==",
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch "mail_crypt_global_private_key2_password",
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch "password",
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch};
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Boschint
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Boschmail_crypt_load_global_private_keys(const struct fs_crypt_settings *set,
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch const char *set_prefix,
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch struct mail_crypt_global_keys *global_keys,
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch const char **error_r);
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch
38af46387e565053adf6c47f7f6871676d685de8Stephan Boschstatic void test_setup(void)
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch{
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch struct dcrypt_settings set = {
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch .module_dir = top_builddir "/src/lib-dcrypt/.libs"
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch };
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch if (!dcrypt_initialize(NULL, &set, NULL)) {
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch i_info("No functional dcrypt backend found - skipping tests");
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch test_exit(0);
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch }
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch i_array_init(&fs_set.plugin_envs, 8);
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch array_append(&fs_set.plugin_envs, settings, N_ELEMENTS(settings));
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch}
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch
38af46387e565053adf6c47f7f6871676d685de8Stephan Boschstatic void test_try_load_keys(void)
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch{
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch const char *pubid1 = "c79e262924842de291a8bcd413f4122a570abd033adeff7c1cdfdc9d05998c75";
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch const char *pubid2 = "aaf927444bff8b63425e852c6b3f769e8221b952b42cf886fae7d326c5be098e";
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch buffer_t *key_id = buffer_create_dynamic(pool_datastack_create(), 128);
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch const char *error = NULL;
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch test_begin("try_load_keys");
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch struct mail_crypt_global_keys keys;
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch memset(&keys, 0, sizeof(keys));
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch mail_crypt_global_keys_init(&keys);
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch const char *set_prefix = "mail_crypt_global";
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch const char *set_key = t_strconcat(set_prefix, "_public_key", NULL);
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch const char *key_data = mail_crypt_plugin_getenv(&fs_set, set_key);
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch test_assert(key_data != NULL);
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch
38af46387e565053adf6c47f7f6871676d685de8Stephan Bosch if (key_data != NULL) {
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch test_assert(mail_crypt_load_global_public_key(set_key, key_data,
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch &keys, &error) == 0);
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch test_assert(mail_crypt_load_global_private_keys(&fs_set, set_prefix,
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch &keys, &error) == 0);
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch /* did we get two private keys? */
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch test_assert(array_count(&keys.private_keys) == 2);
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch /* public key id checks */
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch buffer_set_used_size(key_id, 0);
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch test_assert(dcrypt_key_id_public(keys.public_key, MAIL_CRYPT_KEY_ID_ALGORITHM, key_id, &error) == TRUE);
45324f1eafa565dbc65e4dd335de9507dead55e6Timo Sirainen test_assert(strcmp(binary_to_hex(key_id->data, key_id->used), pubid1) == 0);
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch const struct mail_crypt_global_private_key *key =
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch array_idx(&keys.private_keys, 0);
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch buffer_set_used_size(key_id, 0);
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch test_assert(dcrypt_key_id_private(key->key, MAIL_CRYPT_KEY_ID_ALGORITHM, key_id, &error) == TRUE);
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch test_assert(strcmp(binary_to_hex(key_id->data, key_id->used), pubid1) == 0);
833bed942977673526c72e79bccc09314fc57104Phil Carmody
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch key = array_idx(&keys.private_keys, 1);
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch buffer_set_used_size(key_id, 0);
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch test_assert(dcrypt_key_id_private(key->key, MAIL_CRYPT_KEY_ID_ALGORITHM, key_id, &error) == TRUE);
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch test_assert(strcmp(binary_to_hex(key_id->data, key_id->used), pubid2) == 0);
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch
e9228a3918aa0243eff4aae1ff5462bd3198417fTimo Sirainen }
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch mail_crypt_global_keys_free(&keys);
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch
1e9296de32c9ddda40f33c06556cd568ddadf71fTimo Sirainen test_end();
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch}
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Boschstatic void test_empty_keyset(void)
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch{
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch test_begin("test_empty_keyset");
903f0b38884375179cea63b9d0821e295c38764aTimo Sirainen
903f0b38884375179cea63b9d0821e295c38764aTimo Sirainen /* this should not crash */
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch struct mail_crypt_global_keys keys;
1e9296de32c9ddda40f33c06556cd568ddadf71fTimo Sirainen memset(&keys, 0, sizeof(keys));
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch test_assert(mail_crypt_global_key_find(&keys, "423423423423") == NULL);
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch test_end();
833bed942977673526c72e79bccc09314fc57104Phil Carmody}
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch
833bed942977673526c72e79bccc09314fc57104Phil Carmodystatic void test_teardown(void)
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch{
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch array_free(&fs_set.plugin_envs);
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch dcrypt_deinitialize();
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch}
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Boschint main(void)
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch{
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch void (*tests[])(void) = {
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch test_setup,
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch test_try_load_keys,
1e9296de32c9ddda40f33c06556cd568ddadf71fTimo Sirainen test_empty_keyset,
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch test_teardown,
3fcb3d2d1f3583025ff62bae95ec706920f398b1Stephan Bosch NULL
faa8995f1d300e7a8917407a52bbd1b98e10bf25Timo Sirainen };
faa8995f1d300e7a8917407a52bbd1b98e10bf25Timo Sirainen
faa8995f1d300e7a8917407a52bbd1b98e10bf25Timo Sirainen random_init();
ee2633056e67353157bfbce4d9e0d1c3ceaa627aStephan Bosch int ret = test_run(tests);
faa8995f1d300e7a8917407a52bbd1b98e10bf25Timo Sirainen return ret;
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch}
2f64a4c88de91c483fb378bc80d10e1caa6f2305Stephan Bosch