7 #include "zypp/base/Logger.h"
8 #include "zypp/base/Exception.h"
9 #include "zypp/KeyRing.h"
10 #include "zypp/PublicKey.h"
11 #include "zypp/TmpPath.h"
13 #include <boost/test/auto_unit_test.hpp>
15 #include "KeyRingTestReceiver.h"
17 using boost::unit_test::test_suite;
18 using boost::unit_test::test_case;
22 using namespace zypp::filesystem;
24 #define DATADIR (Pathname(TESTS_SRC_DIR) + "/zypp/data/KeyRing")
26 BOOST_AUTO_TEST_CASE(keyring_test)
28 PublicKey key( Pathname(DATADIR) + "public.asc" );
32 * import a not trusted key
33 * ask for trust, answer yes
34 * ask for import, answer no
37 KeyRingTestReceiver keyring_callbacks;
38 KeyRingTestSignalReceiver receiver;
39 // base sandbox for playing
41 KeyRing keyring( tmp_dir.path() );
43 BOOST_CHECK_EQUAL( keyring.publicKeys().size(), (unsigned) 0 );
44 BOOST_CHECK_EQUAL( keyring.trustedPublicKeys().size(), (unsigned) 0 );
46 keyring.importKey( key, false );
48 BOOST_CHECK_EQUAL( keyring.publicKeys().size(), (unsigned) 1 );
49 BOOST_CHECK_EQUAL( keyring.trustedPublicKeys().size(), (unsigned) 0 );
51 BOOST_CHECK_MESSAGE( keyring.isKeyKnown( key.id() ), "Imported untrusted key should be known");
52 BOOST_CHECK_MESSAGE( ! keyring.isKeyTrusted( key.id() ), "Imported untrusted key should be untrusted");
54 keyring_callbacks.answerTrustKey(true);
55 bool to_continue = keyring.verifyFileSignatureWorkflow( DATADIR + "repomd.xml", "Blah Blah", DATADIR + "repomd.xml.asc");
57 BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedAcceptUnknownKey(), "Should not ask for unknown key, it was known");
58 BOOST_CHECK_MESSAGE( keyring_callbacks.askedTrustKey(), "Verify Signature Workflow with only 1 untrusted key should ask user wether to trust");
59 BOOST_CHECK_MESSAGE( keyring_callbacks.askedImportKey(), "Trusting a key should ask for import");
60 BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedAcceptVerFailed(), "The signature validates");
61 BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedAcceptUnsignedFile(), "It is a signed file, so dont ask the opposite");
63 BOOST_CHECK_MESSAGE( to_continue, "We did not import, but we trusted and signature validates.");
68 * import a not trusted key
69 * ask for trust, answer yes
70 * ask for import, answer no
71 * vorrupt the file and check
74 KeyRingTestReceiver keyring_callbacks;
75 KeyRingTestSignalReceiver receiver;
76 // base sandbox for playing
78 KeyRing keyring( tmp_dir.path() );
80 BOOST_CHECK_EQUAL( keyring.publicKeys().size(), (unsigned) 0 );
81 BOOST_CHECK_EQUAL( keyring.trustedPublicKeys().size(), (unsigned) 0 );
83 keyring.importKey( key, false );
85 keyring_callbacks.answerTrustKey(true);
87 // now we will recheck with a corrupted file
88 bool to_continue = keyring.verifyFileSignatureWorkflow( DATADIR + "repomd.xml.corrupted", "Blah Blah", DATADIR + "repomd.xml.asc");
90 // check wether the user got the right questions
91 BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedAcceptUnknownKey(), "Should not ask for unknown key, it was known");
92 BOOST_CHECK_MESSAGE( keyring_callbacks.askedTrustKey(), "Verify Signature Workflow with only 1 untrusted key should ask user wether to trust");
93 BOOST_CHECK_MESSAGE( keyring_callbacks.askedImportKey(), "Trusting a key should ask for import");
94 BOOST_CHECK_MESSAGE( keyring_callbacks.askedAcceptVerFailed(), "The signature does not validates");
95 BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedAcceptUnsignedFile(), "It is a signed file, so dont ask the opposite");
97 BOOST_CHECK_MESSAGE( ! to_continue, "We did not continue with a corrupted file");
102 * import a not trusted key
103 * ask for trust, answer yes
104 * ask for import, answer no
105 * check without signature
108 KeyRingTestReceiver keyring_callbacks;
109 KeyRingTestSignalReceiver receiver;
110 // base sandbox for playing
112 KeyRing keyring( tmp_dir.path() );
114 keyring.importKey( key, false );
116 keyring_callbacks.answerTrustKey(true);
117 // now we will recheck with a unsigned file
118 bool to_continue = keyring.verifyFileSignatureWorkflow( DATADIR + "repomd.xml", "Blah Blah", Pathname() );
120 // check wether the user got the right questions
121 BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedAcceptUnknownKey(), "Should not ask for unknown key, it was known");
122 BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedTrustKey(), "No signature, no key to trust");
123 BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedImportKey(), "No signature, no key to import");
124 BOOST_CHECK_MESSAGE( keyring_callbacks.askedAcceptUnsignedFile(), "Ask the user wether to accept an unsigned file");
125 BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedAcceptVerFailed(), "There is no signature to verify");
127 BOOST_CHECK_MESSAGE( ! to_continue, "We did not continue with a unsigned file");
132 * should ask for unknown key
136 KeyRingTestReceiver keyring_callbacks;
137 KeyRingTestSignalReceiver receiver;
138 // base sandbox for playing
140 KeyRing keyring( tmp_dir.path() );
142 BOOST_CHECK_MESSAGE( ! keyring.isKeyKnown( key.id() ), "empty keyring has not known keys");
144 //keyring_callbacks.answerAcceptUnknownKey(true);
145 bool to_continue = keyring.verifyFileSignatureWorkflow( DATADIR + "repomd.xml", "Blah Blah", DATADIR + "repomd.xml.asc");
146 BOOST_CHECK_MESSAGE(keyring_callbacks.askedAcceptUnknownKey(), "Should ask to accept unknown key, empty keyring");
147 BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedTrustKey(), "Unknown key cant be trusted");
148 BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedImportKey(), "Unknown key cant be imported");
150 BOOST_CHECK_MESSAGE( ! to_continue, "We answered no to accept unknown key");
159 KeyRingTestReceiver keyring_callbacks;
160 KeyRingTestSignalReceiver receiver;
161 // base sandbox for playing
163 KeyRing keyring( tmp_dir.path() );
165 BOOST_CHECK_EQUAL( keyring.publicKeys().size(), (unsigned) 0 );
166 BOOST_CHECK_EQUAL( keyring.trustedPublicKeys().size(), (unsigned) 0 );
168 keyring.importKey( key, true );
170 BOOST_CHECK_EQUAL( receiver._trusted_key_added_called, true );
172 BOOST_CHECK_EQUAL( keyring.publicKeys().size(), (unsigned) 0 );
173 BOOST_CHECK_EQUAL( keyring.trustedPublicKeys().size(), (unsigned) 1 );
175 BOOST_CHECK_MESSAGE( keyring.isKeyKnown( key.id() ), "Imported trusted key should be known");
176 BOOST_CHECK_MESSAGE( keyring.isKeyTrusted( key.id() ), "Imported trusted key should be trusted");
178 bool to_continue = keyring.verifyFileSignatureWorkflow( DATADIR + "repomd.xml", "Blah Blah", DATADIR + "repomd.xml.asc");
180 BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedAcceptUnknownKey(), "Should not ask for unknown key, it was known");
181 BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedTrustKey(), "Verify Signature Workflow with only 1 untrusted key should ask user wether to trust");
182 BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedImportKey(), "Trusting a key should ask for import");
183 BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedAcceptVerFailed(), "The signature validates");
184 BOOST_CHECK_MESSAGE( ! keyring_callbacks.askedAcceptUnsignedFile(), "It is a signed file, so dont ask the opposite");
186 BOOST_CHECK_MESSAGE( to_continue, "We did not import, but we trusted and signature validates.");
188 //keyring.importKey( key, true );
189 //BOOST_CHECK_EQUAL( receiver._trusted_key_added_called, true );
190 //BOOST_CHECK_EQUAL( keyring.trustedPublicKeys().size(), 1 );
192 /* check signature id can be extracted */
196 BOOST_AUTO_TEST_CASE(signature_test)
198 PublicKey key( DATADIR + "public.asc" );
201 KeyRingTestReceiver keyring_callbacks;
202 KeyRingTestSignalReceiver receiver;
203 // base sandbox for playing
205 KeyRing keyring( tmp_dir.path() );
207 BOOST_CHECK_EQUAL( keyring.readSignatureKeyId( DATADIR + "repomd.xml.asc" ), "BD61D89BD98821BE" );
208 BOOST_CHECK_THROW( keyring.readSignatureKeyId(Pathname()), Exception );
210 BOOST_CHECK_EQUAL( keyring.readSignatureKeyId(tmp.path()), "" );
212 keyring.importKey(key);
214 BOOST_CHECK(keyring.verifyFileSignature( DATADIR + "repomd.xml", DATADIR + "repomd.xml.asc"));
215 BOOST_CHECK( ! keyring.verifyFileSignature( DATADIR + "repomd.xml.corrupted", DATADIR + "repomd.xml.asc"));