test-mail-key.c revision bf2d54df4f5943ec0617aadb1900bb8f40b12150
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2015-2016 Dovecot authors, see the included COPYING file */
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic const char *mcp_old_user_key = "1\t716\t0\t048FD04FD3612B22D32790C592CF21CEF417EFD2EA34AE5F688FA5B51BED29E05A308B68DA78E16E90B47A11E133BD9A208A2894FD01B0BEE865CE339EA3FB17AC\td0cfaca5d335f9edc41c84bb47465184cb0e2ec3931bebfcea4dd433615e77a0";
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic const char *mcp_old_user_key_id = "d0cfaca5d335f9edc41c84bb47465184cb0e2ec3931bebfcea4dd433615e77a0";
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic const char *mcp_old_box_key = "1\t716\t1\t0567e6bf9579813ae967314423b0fceb14bda24749303923de9a9bb9370e0026f995901a57e63113eeb2baf0c940e978d00686cbb52bd5014bc318563375876255\t0300E46DA2125427BE968EB3B649910CDC4C405E5FFDE18D433A97CABFEE28CEEFAE9EE356C792004FFB80981D67E741B8CC036A34235A8D2E1F98D1658CFC963D07EB\td0cfaca5d335f9edc41c84bb47465184cb0e2ec3931bebfcea4dd433615e77a0\t7c9a1039ea2e4fed73e81dd3ffc3fa22ea4a28352939adde7bf8ea858b00fa4f";
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic const char *mcp_old_box_key_id = "7c9a1039ea2e4fed73e81dd3ffc3fa22ea4a28352939adde7bf8ea858b00fa4f";
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic struct mail_storage_service_ctx *mail_storage_service = NULL;
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainenstatic struct mail_user *test_mail_user = NULL;
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainenstatic struct mail_storage_service_user *test_service_user = NULL;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic const char *mail_home;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic const char *test_user_key_id;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic const char *test_box_key_id;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstruct mail_crypt_user *mail_crypt_get_mail_crypt_user(struct mail_user *user ATTR_UNUSED)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschint test_mail_attribute_get(struct mailbox *box, bool user_key, bool shared,
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch const char *pubid, const char **value_r, const char **error_r)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch attr_name = user_key ? USER_CRYPT_PREFIX ACTIVE_KEY_NAME :
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen attr_type = shared ? MAIL_ATTRIBUTE_TYPE_SHARED : MAIL_ATTRIBUTE_TYPE_PRIVATE;
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen if ((ret = mailbox_attribute_get(box, attr_type,
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch *error_r = t_strdup_printf("mailbox_attribute_get(%s, %s) failed: %s",
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschtest_mail_attribute_set(struct mailbox_transaction_context *t,
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch bool user_key, bool shared, const char *pubid,
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch attr_name = user_key ? USER_CRYPT_PREFIX ACTIVE_KEY_NAME :
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch attr_type = shared ? MAIL_ATTRIBUTE_TYPE_SHARED : MAIL_ATTRIBUTE_TYPE_PRIVATE;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch if ((ret = mailbox_attribute_set(t, attr_type,
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch *error_r = t_strdup_printf("mailbox_attribute_set(%s, %s) failed: %s",
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch mailbox_get_vname(mailbox_transaction_get_mailbox(t)),
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen mailbox_get_last_error(mailbox_transaction_get_mailbox(t), NULL));
d730192e34fbedbc590a5abc7351e5af5e120c5fTimo Sirainen if (getcwd(path_buf, sizeof(path_buf)) == NULL)
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen mail_home = p_strdup_printf(test_pool, "%s/mcp_user/", path_buf);
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen .userdb_fields = (const char*const[]){
76f0cc074ea79151e968078906224d8b6a5806fdTimo Sirainen t_strdup_printf("mail_crypt_curve=prime256v1"),
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch mail_storage_service = mail_storage_service_init(master_service, NULL,
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch if (mail_storage_service_lookup(mail_storage_service, &input,
3ab672903a7ed98263b89180261079870c964831Timo Sirainen i_error("Cannot lookup test user: %s", error);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch mail_storage_service_user_get_settings_parser(test_service_user);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch t_strdup_printf("mail_attribute_dict=file:%s/dovecot-attributes",
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch if (mail_storage_service_next(mail_storage_service, test_service_user,
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen i_error("Cannot lookup test user: %s", error);
3ab672903a7ed98263b89180261079870c964831Timo Sirainen mail_storage_service_user_free(&test_service_user);
3ab672903a7ed98263b89180261079870c964831Timo Sirainen mail_storage_service_deinit(&mail_storage_service);
3ab672903a7ed98263b89180261079870c964831Timo Sirainen if (unlink_directory(mail_home, UNLINK_DIRECTORY_FLAG_RMDIR,
3ab672903a7ed98263b89180261079870c964831Timo Sirainen i_error("unlink_directory(%s) failed: %s", mail_home, error);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch /* try to generate a keypair for user */
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen if (mail_crypt_user_generate_keypair(test_mail_user, &pair,
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen i_error("generate_keypair failed: %s", error);
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen test_user_key_id = p_strdup(test_pool, pubid);
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen /* keys ought to be in cache or somewhere...*/
5afe997e79978b7e989aa3b0bfdf4a813ecdc6f6Timo Sirainen if (mail_crypt_user_get_private_key(test_mail_user, NULL, &pair.priv, &error) <= 0)
2c42748505ef4aed83ff59b34e50ed5606900c86Timo Sirainen i_error("Cannot get user private key: %s", error);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch if (mail_crypt_user_get_public_key(test_mail_user, &user_key,
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen i_error("Cannot get user private key: %s", error);
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen mail_namespace_find_inbox(test_mail_user->namespaces);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct mailbox *box = mailbox_alloc(ns->list, "INBOX",
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen if (mail_crypt_box_generate_keypair(box, &pair, user_key, &pubid,
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainen i_error("generate_keypair failed: %s", error);
4afd5082f38342fd688acb5796912329f57dd02cTimo Sirainenstatic void test_cache_reset(void)
3ab672903a7ed98263b89180261079870c964831Timo Sirainen struct mail_crypt_user *muser = mail_crypt_get_mail_crypt_user(test_mail_user);
3ab672903a7ed98263b89180261079870c964831Timo Sirainen mail_crypt_key_cache_destroy(&muser->key_cache);
3ab672903a7ed98263b89180261079870c964831Timo Sirainen test_assert(mail_crypt_user_get_private_key(test_mail_user, NULL,
3ab672903a7ed98263b89180261079870c964831Timo Sirainen i_error("mail_crypt_user_get_private_key() failed: %s", error);
3ab672903a7ed98263b89180261079870c964831Timo Sirainen test_assert(mail_crypt_user_get_public_key(test_mail_user,
3ab672903a7ed98263b89180261079870c964831Timo Sirainen i_error("mail_crypt_user_get_public_key() failed: %s", error);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Boschstatic void test_verify_keys(void)
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct dcrypt_private_key *privkey = NULL, *user_key = NULL;
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch mail_namespace_find_inbox(test_mail_user->namespaces);
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch struct mailbox *box = mailbox_alloc(ns->list, "INBOX",
0fe2992e4d09f3ae4cceea88c9871c832d67b461Stephan Bosch /* verify links */
&error) > 0);
&error) > 0);
&error) > 0);
&error) > 0);
&error) > 0);
&error) > 0);
&error) > 0);
&error) > 0);
test_end();
static void test_old_key(void)
(void)mailbox_transaction_commit(&t);
error);
test_end();
static void test_setup(void)
if (init_test_mail_user() < 0) {
static void test_teardown(void)
void (*tests[])(void) = {
random_init();
return ret;