9ee9a367f600a4e5ab6356f9b1b0d75a5cc6288a
[platform/core/test/security-tests.git] / tests / ckm / async-api.cpp
1 /*
2  *  Copyright (c) 2000 - 2014 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  *  Contact: Bumjin Im <bj.im@samsung.com>
5  *
6  *  Licensed under the Apache License, Version 2.0 (the "License");
7  *  you may not use this file except in compliance with the License.
8  *  You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  *  Unless required by applicable law or agreed to in writing, software
13  *  distributed under the License is distributed on an "AS IS" BASIS,
14  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  *  See the License for the specific language governing permissions and
16  *  limitations under the License
17  */
18 /*
19  * @file       async-api.cpp
20  * @author     Krzysztof Jackiewicz (k.jackiewicz@samsung.com)
21  * @version    1.0
22  */
23
24 #include <mutex>
25 #include <utility>
26 #include <condition_variable>
27 #include <cassert>
28
29 #include <ckmc/ckmc-type.h>
30 #include <ckm/ckm-manager-async.h>
31 #include <ckm/ckm-manager.h>
32 #include <ckm/ckm-control.h>
33 #include <ckm/ckm-raw-buffer.h>
34
35 #include <fstream>
36
37 #include <dpl/test/test_runner.h>
38 #include <dpl/test/test_runner_child.h>
39 #include <dpl/log/log.h>
40
41 #include <tests_common.h>
42 #include <ckm-common.h>
43
44 using namespace CKM;
45 using namespace std;
46
47 namespace {
48
49 const char* TEST_LABEL = "test_label";
50 const CertificateShPtrVector EMPTY_CERT_VECTOR;
51 const AliasVector EMPTY_ALIAS_VECTOR;
52
53 class MyObserver: public ManagerAsync::Observer
54 {
55 public:
56     MyObserver() :
57             m_finished(false), m_error(0)
58     {
59     }
60
61     void ReceivedError(int error)
62     {
63         LogError("Received error: " << error);
64         m_finished = true;
65         m_error = error;
66         m_cv.notify_one();
67     }
68
69     void ReceivedSaveKey() { Succeeded(); }
70     void ReceivedSaveCertificate() { Succeeded(); }
71     void ReceivedSaveData() { Succeeded(); }
72     void ReceivedSavePKCS12() { Succeeded(); }
73
74     void ReceivedRemovedAlias() { Succeeded(); }
75
76     void ReceivedKey(Key &&) { Succeeded(); }
77     void ReceivedCertificate(Certificate &&) { Succeeded(); }
78     void ReceivedData(RawBuffer &&) { Succeeded(); }
79     void ReceivedPKCS12(PKCS12ShPtr && pkcs) { m_pkcs = pkcs; Succeeded(); }
80
81     void ReceivedKeyAliasVector(AliasVector && av) { m_aliases = move(av); Succeeded(); }
82     void ReceivedCertificateAliasVector(AliasVector && av) { m_aliases = move(av); Succeeded(); }
83     void ReceivedDataAliasVector(AliasVector && av) { m_aliases = move(av); Succeeded(); }
84
85     void ReceivedCreateKeyPairRSA() { Succeeded(); }
86     void ReceivedCreateKeyPairDSA() { Succeeded(); }
87     void ReceivedCreateKeyPairECDSA() { Succeeded(); }
88
89     void ReceivedGetCertificateChain(CertificateShPtrVector && chain)
90             { m_certChain = move(chain); Succeeded(); }
91
92     void ReceivedCreateSignature(RawBuffer && buffer) { m_signed = move(buffer); Succeeded(); }
93     void ReceivedVerifySignature() { Succeeded(); }
94
95     void ReceivedOCSPCheck(int status) { m_ocspStatus = status; Succeeded(); }
96
97     void ReceivedSetPermission() { Succeeded(); }
98
99     void WaitForResponse()
100     {
101         unique_lock < mutex > lock(m_mutex);
102
103         m_cv.wait(lock, [this] {return m_finished;});
104     }
105
106     bool m_finished;
107     int m_error;
108     AliasVector m_aliases;
109     CertificateShPtrVector m_certChain;
110     PKCS12ShPtr m_pkcs;
111     RawBuffer m_signed;
112     int m_ocspStatus;
113
114 protected:
115     void Succeeded()
116     {
117         LogDebug("Succeeded");
118         m_finished = true;
119         m_cv.notify_one();
120     }
121
122     mutex m_mutex;
123     condition_variable m_cv;
124 };
125
126 typedef shared_ptr<MyObserver> MyObserverPtr;
127
128 const char* TEST_PASS = "test-pass";
129
130 enum Type {
131     RSA,
132     DSA,
133     ECDSA
134 };
135
136 struct KeyPair
137 {
138     KeyPair(const std::string& prv_pem, const std::string& pub_pem) {
139         RawBuffer buffer_prv(prv_pem.begin(), prv_pem.end());
140         prv = Key::create(buffer_prv);
141         assert(prv);
142
143         RawBuffer buffer_pub(pub_pem.begin(), pub_pem.end());
144         pub = Key::create(buffer_pub);
145         assert(pub);
146     }
147
148     KeyShPtr prv;
149     KeyShPtr pub;
150 };
151
152 typedef map<Type, vector<KeyPair> > KeyMap;
153
154
155 KeyMap initializeKeys()
156 {
157     KeyMap km;
158
159     km[RSA].emplace_back(
160             "-----BEGIN RSA PRIVATE KEY-----\n"
161             "MIICXAIBAAKBgQDMP6sKttnQ58BAi27b8X+8KVQtJgpJhhCF0RtWaTVqAhVDG3y4\n"
162             "x6IuAvXDtPSjLe/2E01fYGVxNComPJOmUOfUD06BCWPYH2+7jOfQIOy/TMlt+W7x\n"
163             "fou9rqnPRoKRaodoLqH5WK0ahkntWCAjstoKZoG+3Op0tEjy0jpmzeyNiQIDAQAB\n"
164             "AoGBAJRDX1CuvNx1bkwsKvQDkTqwMYd4hp0qcVICIbsPMhPaoT6OdHHZkHOf+HDx\n"
165             "KWhOj1LsXgzu95Q+Tp5k+LURI8ayu2RTsz/gYECgPNUsZ7gXl4co1bK+g5kiC+qr\n"
166             "sgSfkbYpp0OXefnl5x4KaJlZeSpn0UdDqx0kwI1x2E098i1VAkEA5thNY9YZNQdN\n"
167             "p6aopxOF5OmAjbLkq6wu255rDM5YgeepXXro/lmPociobtv8vPzbWKfoYZJL0Zj4\n"
168             "Qzj7Qz7s0wJBAOKBbpeG9PuNP1nR1h8kvyuILW8F89JOcIOUeqwokq4eJVqXdFIj\n"
169             "ct8eSEFmyXNqXD7b9+Tcw6vRIZuddVhNcrMCQAlpaD5ZzE1NLu1W7ilhsmPS4Vrl\n"
170             "oE0fiAmMO/EZuKITP+R/zmAQZrrB45whe/x4krjan67auByjj/utpxDmz+ECQEg/\n"
171             "UK80dN/n5dUYgVvdtLyF6zgGhgcGzgyqR5ayOlcfdnq25Htuoy1X02RJDOirfFDw\n"
172             "iNmPMTqUskuYpd1MltECQBwcy1cpnJWIXwCTQwg3enjkOVw80Tbr3iU9ASjHJTH2\n"
173             "N6FGHC4BQCm1fL6Bo0/0oSra+Ika3/1Vw1WwijUSiO8=\n"
174             "-----END RSA PRIVATE KEY-----",
175
176             "-----BEGIN PUBLIC KEY-----\n"
177             "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMP6sKttnQ58BAi27b8X+8KVQt\n"
178             "JgpJhhCF0RtWaTVqAhVDG3y4x6IuAvXDtPSjLe/2E01fYGVxNComPJOmUOfUD06B\n"
179             "CWPYH2+7jOfQIOy/TMlt+W7xfou9rqnPRoKRaodoLqH5WK0ahkntWCAjstoKZoG+\n"
180             "3Op0tEjy0jpmzeyNiQIDAQAB\n"
181             "-----END PUBLIC KEY-----"
182     );
183     km[DSA].emplace_back(
184             "-----BEGIN DSA PRIVATE KEY-----\n"
185             "MIIBuwIBAAKBgQDIsQRYgnU4mm5VrMyykpNNzeHTQAO8E2hJAcOwNPBrdos8amak\n"
186             "rcJnyBaNh56ZslcuXNEKJuxiDsy4VM9KUR8fHTqTiF5s+4NArzdrdwNQpKWjAqJN\n"
187             "fgpCdaLZHw9o857flcQ4dyYNnAz1/SNGnv03Dm8EYRNRFNaFNw7zBPjyVwIVANyj\n"
188             "7ijLfrCbDZDi6ond5Np1Ns0hAoGBAIcS1ceWtw6DAGmYww27r/1lLtqjrq8j0w0a\n"
189             "F6Ly+pZ/y+WTw9KT18eRKPmVgruVSn3VVVJeN00XaoKvfPSHkTRIE5rro2ZEInhp\n"
190             "3g0Vak7EXJWe7KKBRXqSMNFkndjKv1nyNKeWSEq9Xql6SPn8J8TfmbyUpPSIglZR\n"
191             "vJ2DHwHJAoGAPZLRdIhIIJi4UWoyQrCqk1iF3pkBeukXzeZGqNWEjgzLAjMZEVYM\n"
192             "DLLKippahjxLZSWB7LOoS+XE4fonpBBute/tgF23ToR8fQuiBu+KvtAP/QuCOJ/L\n"
193             "S0aYYr1/eXmMByYPZ58Vf93KuUgoUAkWmc+mLBn6J2+fygnWcOOSo6sCFC/slPOv\n"
194             "yAKPlW7WQzgV5jLLNUW7\n"
195             "-----END DSA PRIVATE KEY-----",
196
197             "-----BEGIN DSA PRIVATE KEY-----\n"
198             "MIIBuwIBAAKBgQDIsQRYgnU4mm5VrMyykpNNzeHTQAO8E2hJAcOwNPBrdos8amak\n"
199             "rcJnyBaNh56ZslcuXNEKJuxiDsy4VM9KUR8fHTqTiF5s+4NArzdrdwNQpKWjAqJN\n"
200             "fgpCdaLZHw9o857flcQ4dyYNnAz1/SNGnv03Dm8EYRNRFNaFNw7zBPjyVwIVANyj\n"
201             "7ijLfrCbDZDi6ond5Np1Ns0hAoGBAIcS1ceWtw6DAGmYww27r/1lLtqjrq8j0w0a\n"
202             "F6Ly+pZ/y+WTw9KT18eRKPmVgruVSn3VVVJeN00XaoKvfPSHkTRIE5rro2ZEInhp\n"
203             "3g0Vak7EXJWe7KKBRXqSMNFkndjKv1nyNKeWSEq9Xql6SPn8J8TfmbyUpPSIglZR\n"
204             "vJ2DHwHJAoGAPZLRdIhIIJi4UWoyQrCqk1iF3pkBeukXzeZGqNWEjgzLAjMZEVYM\n"
205             "DLLKippahjxLZSWB7LOoS+XE4fonpBBute/tgF23ToR8fQuiBu+KvtAP/QuCOJ/L\n"
206             "S0aYYr1/eXmMByYPZ58Vf93KuUgoUAkWmc+mLBn6J2+fygnWcOOSo6sCFC/slPOv\n"
207             "yAKPlW7WQzgV5jLLNUW7\n"
208             "-----END DSA PRIVATE KEY-----"
209     );
210     km[ECDSA].emplace_back(
211             "-----BEGIN EC PRIVATE KEY-----\n"
212             "MF8CAQEEGF3rz8OuFpcESrlqCm0G96oovr0XbX+DRKAKBggqhkjOPQMBAaE0AzIA\n"
213             "BHiZYByQiRNQ91GWNnTfoBbp9G8DP9oJYc/cDZlk4lKUpmbvm//RWf1U7ag3tOVy\n"
214             "sQ==\n"
215             "-----END EC PRIVATE KEY-----",
216
217             "-----BEGIN PUBLIC KEY-----\n"
218             "MEkwEwYHKoZIzj0CAQYIKoZIzj0DAQEDMgAEeJlgHJCJE1D3UZY2dN+gFun0bwM/\n"
219             "2glhz9wNmWTiUpSmZu+b/9FZ/VTtqDe05XKx\n"
220             "-----END PUBLIC KEY-----"
221     );
222     return km;
223 }
224
225 KeyMap keys = initializeKeys();
226
227 CertificateShPtr createCert(const std::string& cert) {
228     RawBuffer buffer_cert(cert.begin(), cert.end());
229     CertificateShPtr cptr = Certificate::create(buffer_cert, DataFormat::FORM_PEM);
230     assert(cptr);
231     return cptr;
232 }
233
234 typedef vector<CertificateShPtr> CertVector;
235
236 CertVector initializeCerts()
237 {
238     CertVector cv;
239     cv.emplace_back(createCert(
240         "-----BEGIN CERTIFICATE-----\n"
241         "MIIF0TCCBLmgAwIBAgIQaPGTP4aS7Ut/WDNaBzdQrDANBgkqhkiG9w0BAQUFADCB\n"
242         "ujELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL\n"
243         "ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2Ug\n"
244         "YXQgaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JwYSAoYykwNjE0MDIGA1UEAxMr\n"
245         "VmVyaVNpZ24gQ2xhc3MgMyBFeHRlbmRlZCBWYWxpZGF0aW9uIFNTTCBDQTAeFw0x\n"
246         "NDAyMjAwMDAwMDBaFw0xNTAyMjAyMzU5NTlaMIHmMRMwEQYLKwYBBAGCNzwCAQMT\n"
247         "AlBMMR0wGwYDVQQPExRQcml2YXRlIE9yZ2FuaXphdGlvbjETMBEGA1UEBRMKMDAw\n"
248         "MDAyNTIzNzELMAkGA1UEBhMCUEwxDzANBgNVBBEUBjAwLTk1MDEUMBIGA1UECBML\n"
249         "bWF6b3dpZWNraWUxETAPBgNVBAcUCFdhcnN6YXdhMRYwFAYDVQQJFA1TZW5hdG9y\n"
250         "c2thIDE4MRMwEQYDVQQKFAptQmFuayBTLkEuMQwwCgYDVQQLFANESU4xGTAXBgNV\n"
251         "BAMUEHd3dy5tYmFuay5jb20ucGwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK\n"
252         "AoIBAQDph6x8V6xUW/+651+qHF+UmorH9uaz2ZrX2bIWiMKIJFmpDDHlxcapKkqE\n"
253         "BV04is83aiCpqKtc2ZHy2g4Hpj1eSF5BP2+OAlo0YUQZPIeRRdiMjmeAxw/ncBDx\n"
254         "9rQBuCJ4XTD6cqQox5SI0TASOZ+wyAEjbDRXzL73XqRAFZ1LOpb2ONkolS+RutMB\n"
255         "vshvCsWPeNe7eGLuOh6DyC6r1vX9xhw3xnjM2mTSvmtimgzSLacNGKqRrsucUgcb\n"
256         "0+O5C2jZAtAMLyZksL92cxmWbtVzUYzem4chjHu5cRxUlPNzUJWrrczueB7Ip4A8\n"
257         "aQuFMfNXYc0x+WLWjy//urypMKjhAgMBAAGjggGjMIIBnzAbBgNVHREEFDASghB3\n"
258         "d3cubWJhbmsuY29tLnBsMAkGA1UdEwQCMAAwDgYDVR0PAQH/BAQDAgWgMB0GA1Ud\n"
259         "JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBEBgNVHSAEPTA7MDkGC2CGSAGG+EUB\n"
260         "BxcGMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9jcHMw\n"
261         "HQYDVR0OBBYEFN37iGaS7mZnENxZ9FGqNLR+QgoMMB8GA1UdIwQYMBaAFPyKULqe\n"
262         "uSVae1WFT5UAY4/pWGtDMEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9FVlNlY3Vy\n"
263         "ZS1jcmwudmVyaXNpZ24uY29tL0VWU2VjdXJlMjAwNi5jcmwwfAYIKwYBBQUHAQEE\n"
264         "cDBuMC0GCCsGAQUFBzABhiFodHRwOi8vRVZTZWN1cmUtb2NzcC52ZXJpc2lnbi5j\n"
265         "b20wPQYIKwYBBQUHMAKGMWh0dHA6Ly9FVlNlY3VyZS1haWEudmVyaXNpZ24uY29t\n"
266         "L0VWU2VjdXJlMjAwNi5jZXIwDQYJKoZIhvcNAQEFBQADggEBAD0wO+rooUrIM4qp\n"
267         "PHhp+hkXK6WMQ2qzGOmbMcZjw0govg5vkzkefPDryIXXbrF8mRagiJNMSfNaWWeh\n"
268         "Cj41OV24EdUl0OLbFxNzcvub599zRs/apfaRLTfsmlmOgi0/YP305i+3tJ2ll946\n"
269         "P+qV1wXnXqTqEdIl4Ys3+1HmDCdTB1hoDwAAzqRVUXZ5+iiwPAU7R/LTHfMjV1ke\n"
270         "8jtNFfrorlZMCfVH/7eEnHJvVjOJt+YFe4aFMzE+DfuYIK7MH+olC2v79kBwbnEQ\n"
271         "fvHMA9gFwOYLUBBdSfcocp8EKZ+mRlNPGR/3LBrPeaQQ0GZEkxzRK+v/aNTuiYfr\n"
272         "oFXtrg0=\n"
273         "-----END CERTIFICATE-----\n"
274     ));
275
276     cv.emplace_back(createCert(
277         "-----BEGIN CERTIFICATE-----\n"
278         "MIIF5DCCBMygAwIBAgIQW3dZxheE4V7HJ8AylSkoazANBgkqhkiG9w0BAQUFADCB\n"
279         "yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL\n"
280         "ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp\n"
281         "U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW\n"
282         "ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0\n"
283         "aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMTYxMTA3MjM1OTU5WjCBujEL\n"
284         "MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW\n"
285         "ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2UgYXQg\n"
286         "aHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JwYSAoYykwNjE0MDIGA1UEAxMrVmVy\n"
287         "aVNpZ24gQ2xhc3MgMyBFeHRlbmRlZCBWYWxpZGF0aW9uIFNTTCBDQTCCASIwDQYJ\n"
288         "KoZIhvcNAQEBBQADggEPADCCAQoCggEBAJjboFXrnP0XeeOabhQdsVuYI4cWbod2\n"
289         "nLU4O7WgerQHYwkZ5iqISKnnnbYwWgiXDOyq5BZpcmIjmvt6VCiYxQwtt9citsj5\n"
290         "OBfH3doxRpqUFI6e7nigtyLUSVSXTeV0W5K87Gws3+fBthsaVWtmCAN/Ra+aM/EQ\n"
291         "wGyZSpIkMQht3QI+YXZ4eLbtfjeubPOJ4bfh3BXMt1afgKCxBX9ONxX/ty8ejwY4\n"
292         "P1C3aSijtWZfNhpSSENmUt+ikk/TGGC+4+peGXEFv54cbGhyJW+ze3PJbb0S/5tB\n"
293         "Ml706H7FC6NMZNFOvCYIZfsZl1h44TO/7Wg+sSdFb8Di7Jdp91zT91ECAwEAAaOC\n"
294         "AdIwggHOMB0GA1UdDgQWBBT8ilC6nrklWntVhU+VAGOP6VhrQzASBgNVHRMBAf8E\n"
295         "CDAGAQH/AgEAMD0GA1UdIAQ2MDQwMgYEVR0gADAqMCgGCCsGAQUFBwIBFhxodHRw\n"
296         "czovL3d3dy52ZXJpc2lnbi5jb20vY3BzMD0GA1UdHwQ2MDQwMqAwoC6GLGh0dHA6\n"
297         "Ly9FVlNlY3VyZS1jcmwudmVyaXNpZ24uY29tL3BjYTMtZzUuY3JsMA4GA1UdDwEB\n"
298         "/wQEAwIBBjARBglghkgBhvhCAQEEBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZ\n"
299         "MFcwVRYJaW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7\n"
300         "GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwKQYDVR0R\n"
301         "BCIwIKQeMBwxGjAYBgNVBAMTEUNsYXNzM0NBMjA0OC0xLTQ3MD0GCCsGAQUFBwEB\n"
302         "BDEwLzAtBggrBgEFBQcwAYYhaHR0cDovL0VWU2VjdXJlLW9jc3AudmVyaXNpZ24u\n"
303         "Y29tMB8GA1UdIwQYMBaAFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqGSIb3DQEB\n"
304         "BQUAA4IBAQCWovp/5j3t1CvOtxU/wHIDX4u6FpAl98KD2Md1NGNoElMMU4l7yVYJ\n"
305         "p8M2RE4O0GJis4b66KGbNGeNUyIXPv2s7mcuQ+JdfzOE8qJwwG6Cl8A0/SXGI3/t\n"
306         "5rDFV0OEst4t8dD2SB8UcVeyrDHhlyQjyRNddOVG7wl8nuGZMQoIeRuPcZ8XZsg4\n"
307         "z+6Ml7YGuXNG5NOUweVgtSV1LdlpMezNlsOjdv3odESsErlNv1HoudRETifLriDR\n"
308         "fip8tmNHnna6l9AW5wtsbfdDbzMLKTB3+p359U64drPNGLT5IO892+bKrZvQTtKH\n"
309         "qQ2mRHNQ3XBb7a1+Srwi1agm5MKFIA3Z\n"
310         "-----END CERTIFICATE-----\n"
311     ));
312     return cv;
313 }
314
315 CertVector certs = initializeCerts();
316
317 const RawBuffer raw_buffer(const char* buffer)
318 {
319     return RawBuffer(buffer, buffer + strlen(buffer));
320 }
321
322 const RawBuffer test_buffer = raw_buffer("test_string");
323
324 template <typename F, typename... Args>
325 void test_negative(F&& func, int expected, Args... args)
326 {
327     MyObserverPtr obs = make_shared<MyObserver>();
328     ManagerAsync mgr;
329
330     (mgr.*func)(static_pointer_cast < ManagerAsync::Observer > (obs), args...);
331     obs->WaitForResponse();
332
333     RUNNER_ASSERT_MSG(obs->m_finished, "Request is not finished!");
334     RUNNER_ASSERT_MSG(
335             obs->m_error == expected,
336             "Expected " << expected << "/" << ErrorToString(expected) <<
337             " got: " << obs->m_error << "/" << ErrorToString(obs->m_error));
338 }
339
340 template <typename F, typename... Args>
341 void test_invalid_param(F&& func, Args... args)
342 {
343     test_negative(move(func), CKM_API_ERROR_INPUT_PARAM, args...);
344 }
345
346 template <typename F, typename... Args>
347 void test_no_observer(F&& func, Args... args)
348 {
349     ManagerAsync::ObserverPtr obs;
350     ManagerAsync mgr;
351
352     try {
353         (mgr.*func)(obs, args...);
354         RUNNER_ASSERT_MSG(false, "function() should have thrown an exception");
355     } catch (const invalid_argument& e) {
356         RUNNER_ASSERT(true);
357     } catch (...) {
358         RUNNER_ASSERT_MSG(false, "Unexpected exception");
359     }
360 }
361
362 template <typename F, typename... Args>
363 MyObserverPtr test_positive(F&& func, Args... args)
364 {
365     MyObserverPtr obs = make_shared<MyObserver>();
366     ManagerAsync mgr;
367
368     (mgr.*func)(static_pointer_cast < ManagerAsync::Observer > (obs), args...);
369     obs->WaitForResponse();
370
371     RUNNER_ASSERT_MSG(obs->m_finished, "Request is not finished!");
372     RUNNER_ASSERT_MSG(obs->m_error == 0,
373                          "Request failed " << obs->m_error << "/" << ErrorToString(obs->m_error));
374     return obs;
375 }
376
377 template <typename F, typename... Args>
378 void test_check_aliases(F&& func, const AliasVector& expected, Args... args)
379 {
380     auto obs = test_positive(move(func), args...);
381     RUNNER_ASSERT_MSG(obs->m_aliases == expected, "Retrieved aliases differ from expected");
382 }
383
384 template <typename F, typename... Args>
385 void test_check_cert_chain(F&& func, size_t expected, Args... args)
386 {
387     auto obs = test_positive(move(func), args...);
388     RUNNER_ASSERT_MSG(
389             obs->m_certChain.size() == expected,
390             "Expected chain length: " << expected << " got: " << obs->m_certChain.size());
391 }
392
393 typedef void (ManagerAsync::*certChainFn1)(const ManagerAsync::ObserverPtr&,
394                                            const CertificateShPtr&,
395                                            const CertificateShPtrVector&,
396                                            const CertificateShPtrVector&,
397                                            bool);
398
399 typedef void (ManagerAsync::*certChainFn2)(const ManagerAsync::ObserverPtr&,
400                                            const CertificateShPtr&,
401                                            const AliasVector&,
402                                            const AliasVector&,
403                                            bool);
404 } // namespace anonymous
405
406
407 RUNNER_TEST_GROUP_INIT(CKM_ASYNC_API);
408
409 RUNNER_TEST(TA0000_init)
410 {
411     int temp;
412     ControlShPtr control = Control::create();
413     RUNNER_ASSERT_MSG(CKM_API_SUCCESS == (temp = control->removeUserData(APP_UID)),
414                          "Error=" << ErrorToString(temp));
415 }
416
417 // saveKey
418 RUNNER_CHILD_TEST(TA0010_save_key_invalid_param)
419 {
420     switch_to_storage_user(TEST_LABEL);
421
422     test_no_observer(&ManagerAsync::saveKey, "alias", keys[RSA][0].prv, Policy());
423     test_invalid_param(&ManagerAsync::saveKey, "", keys[RSA][0].prv, Policy());
424     test_invalid_param(&ManagerAsync::saveKey, "alias", KeyShPtr(), Policy());
425 }
426
427 RUNNER_CHILD_TEST(TA0020_save_key_already_exists)
428 {
429     switch_to_storage_user(TEST_LABEL);
430
431     DBCleanup dbc;
432     test_positive(&ManagerAsync::saveKey, dbc.alias("alias"), keys[RSA][0].prv, Policy());
433     test_negative(&ManagerAsync::saveKey,
434                   CKM_API_ERROR_DB_ALIAS_EXISTS,
435                   dbc.alias("alias"),
436                   keys[RSA][0].prv,
437                   Policy());
438 }
439
440 RUNNER_CHILD_TEST(TA0050_save_key_positive)
441 {
442     switch_to_storage_user(TEST_LABEL);
443
444     DBCleanup dbc;
445     test_positive(&ManagerAsync::saveKey, dbc.alias("alias"), keys[RSA][0].prv, Policy());
446 }
447
448
449 // saveCertificate
450 RUNNER_CHILD_TEST(TA0110_save_cert_invalid_param)
451 {
452     switch_to_storage_user(TEST_LABEL);
453
454     CertificateShPtr cert = Certificate::create(test_buffer, DataFormat::FORM_PEM);
455     test_no_observer(&ManagerAsync::saveCertificate, "", cert, Policy());
456     test_invalid_param(&ManagerAsync::saveCertificate, "", cert, Policy());
457     test_invalid_param(&ManagerAsync::saveCertificate, "alias", CertificateShPtr(), Policy());
458 }
459
460 RUNNER_CHILD_TEST(TA0120_save_cert_already_exists)
461 {
462     switch_to_storage_user(TEST_LABEL);
463
464     DBCleanup dbc;
465     test_positive(&ManagerAsync::saveCertificate, dbc.alias("alias"), certs[0], Policy());
466     test_negative(&ManagerAsync::saveCertificate,
467                   CKM_API_ERROR_DB_ALIAS_EXISTS,
468                   dbc.alias("alias"),
469                   certs[0],
470                   Policy());
471 }
472
473 RUNNER_CHILD_TEST(TA0150_save_cert_positive)
474 {
475     switch_to_storage_user(TEST_LABEL);
476
477     DBCleanup dbc;
478     test_positive(&ManagerAsync::saveCertificate, dbc.alias("alias"), certs[0], Policy());
479 }
480
481
482 // saveData
483 RUNNER_CHILD_TEST(TA0210_save_data_invalid_param)
484 {
485     switch_to_storage_user(TEST_LABEL);
486
487     test_no_observer(&ManagerAsync::saveData, "", test_buffer, Policy());
488     test_invalid_param(&ManagerAsync::saveData, "", test_buffer, Policy());
489     test_invalid_param(&ManagerAsync::saveData, "alias", RawBuffer(), Policy());
490 }
491
492 RUNNER_CHILD_TEST(TA0220_save_data_already_exists)
493 {
494     switch_to_storage_user(TEST_LABEL);
495
496     DBCleanup dbc;
497     test_positive(&ManagerAsync::saveData, dbc.alias("alias"), test_buffer, Policy());
498     test_negative(&ManagerAsync::saveData,
499                   CKM_API_ERROR_DB_ALIAS_EXISTS,
500                   dbc.alias("alias"),
501                   test_buffer,
502                   Policy());
503 }
504
505 RUNNER_CHILD_TEST(TA0250_save_data_positive)
506 {
507     switch_to_storage_user(TEST_LABEL);
508
509     DBCleanup dbc;
510     test_positive(&ManagerAsync::saveData, dbc.alias("alias"), test_buffer, Policy());
511 }
512
513
514 // removeKey
515 RUNNER_CHILD_TEST(TA0310_remove_alias_invalid_param)
516 {
517     switch_to_storage_user(TEST_LABEL);
518
519     test_no_observer(&ManagerAsync::removeAlias, "alias");
520     test_invalid_param(&ManagerAsync::removeAlias, "");
521 }
522
523 RUNNER_CHILD_TEST(TA0330_remove_alias_unknown_alias)
524 {
525     switch_to_storage_user(TEST_LABEL);
526
527     test_negative(&ManagerAsync::removeAlias, CKM_API_ERROR_DB_ALIAS_UNKNOWN, "non-existing-alias");
528 }
529
530 RUNNER_CHILD_TEST(TA0350_remove_key_positive)
531 {
532     switch_to_storage_user(TEST_LABEL);
533
534     DBCleanup dbc;
535     test_positive(&ManagerAsync::saveKey, dbc.alias("alias"), keys[RSA][0].prv, Policy());
536     test_positive(&ManagerAsync::removeAlias, dbc.alias("alias"));
537 }
538
539
540 RUNNER_CHILD_TEST(TA0450_remove_cert_positive)
541 {
542     switch_to_storage_user(TEST_LABEL);
543
544     DBCleanup dbc;
545     test_positive(&ManagerAsync::saveCertificate, dbc.alias("alias"), certs[0], Policy());
546     test_positive(&ManagerAsync::removeAlias, dbc.alias("alias"));
547 }
548
549
550 RUNNER_CHILD_TEST(TA0550_remove_data_positive)
551 {
552     switch_to_storage_user(TEST_LABEL);
553
554     DBCleanup dbc;
555     test_positive(&ManagerAsync::saveData, dbc.alias("alias"), test_buffer, Policy());
556     test_positive(&ManagerAsync::removeAlias, dbc.alias("alias"));
557 }
558
559
560 // getKey
561 RUNNER_CHILD_TEST(TA0610_get_key_invalid_param)
562 {
563     switch_to_storage_user(TEST_LABEL);
564
565     test_no_observer(&ManagerAsync::getKey, "alias", "");
566     test_invalid_param(&ManagerAsync::getKey, "", "");
567 }
568
569 RUNNER_CHILD_TEST(TA0630_get_key_unknown_alias)
570 {
571     switch_to_storage_user(TEST_LABEL);
572
573     test_negative(&ManagerAsync::getKey, CKM_API_ERROR_DB_ALIAS_UNKNOWN, "non-existing-alias", "");
574 }
575
576 RUNNER_CHILD_TEST(TA0640_get_key_wrong_password)
577 {
578     switch_to_storage_user(TEST_LABEL);
579
580     DBCleanup dbc;
581     test_positive(&ManagerAsync::saveKey, dbc.alias("alias"), keys[RSA][0].prv, Policy("password"));
582     test_negative(&ManagerAsync::getKey,
583                   CKM_API_ERROR_SERVER_ERROR,
584                   dbc.alias("alias"),
585                   "wrong-password");
586 }
587
588 RUNNER_CHILD_TEST(TA0650_get_key_positive)
589 {
590     switch_to_storage_user(TEST_LABEL);
591
592     DBCleanup dbc;
593     test_positive(&ManagerAsync::saveKey, dbc.alias("alias"), keys[RSA][0].prv, Policy("password"));
594     test_positive(&ManagerAsync::getKey, dbc.alias("alias"), "password");
595 }
596
597
598 // getCertificate
599 RUNNER_CHILD_TEST(TA0710_get_cert_invalid_param)
600 {
601     switch_to_storage_user(TEST_LABEL);
602
603     test_no_observer(&ManagerAsync::getCertificate, "alias", "");
604     test_invalid_param(&ManagerAsync::getCertificate, "", "");
605 }
606
607 RUNNER_CHILD_TEST(TA0730_get_cert_unknown_alias)
608 {
609     switch_to_storage_user(TEST_LABEL);
610
611     test_negative(&ManagerAsync::getCertificate,
612                   CKM_API_ERROR_DB_ALIAS_UNKNOWN,
613                   "non-existing-alias",
614                   "");
615 }
616
617 RUNNER_CHILD_TEST(TA0740_get_cert_wrong_password)
618 {
619     switch_to_storage_user(TEST_LABEL);
620
621     DBCleanup dbc;
622     test_positive(&ManagerAsync::saveCertificate,
623                   dbc.alias("alias"),
624                   certs[0],
625                   Policy("password"));
626     test_negative(&ManagerAsync::getCertificate,
627                   CKM_API_ERROR_SERVER_ERROR,
628                   dbc.alias("alias"),
629                   "wrong-password");
630 }
631
632 RUNNER_CHILD_TEST(TA0750_get_cert_positive)
633 {
634     switch_to_storage_user(TEST_LABEL);
635
636     DBCleanup dbc;
637     test_positive(&ManagerAsync::saveCertificate, dbc.alias("alias"), certs[0], Policy("password"));
638     test_positive(&ManagerAsync::getCertificate, dbc.alias("alias"), "password");
639 }
640
641
642 // getData
643 RUNNER_CHILD_TEST(TA0810_get_data_invalid_param)
644 {
645     switch_to_storage_user(TEST_LABEL);
646
647     test_no_observer(&ManagerAsync::getData, "alias", "");
648     test_invalid_param(&ManagerAsync::getData, "", "");
649 }
650
651 RUNNER_CHILD_TEST(TA0830_get_data_unknown_alias)
652 {
653     switch_to_storage_user(TEST_LABEL);
654
655     test_negative(&ManagerAsync::getData, CKM_API_ERROR_DB_ALIAS_UNKNOWN, "non-existing-alias", "");
656 }
657
658 RUNNER_CHILD_TEST(TA0840_get_data_wrong_password)
659 {
660     switch_to_storage_user(TEST_LABEL);
661
662     DBCleanup dbc;
663     test_positive(&ManagerAsync::saveData, dbc.alias("alias"), test_buffer, Policy("password"));
664     test_negative(&ManagerAsync::getData,
665                   CKM_API_ERROR_SERVER_ERROR,
666                   dbc.alias("alias"),
667                   "wrong-password");
668 }
669
670 RUNNER_CHILD_TEST(TA0850_get_data_positive)
671 {
672     switch_to_storage_user(TEST_LABEL);
673
674     DBCleanup dbc;
675     test_positive(&ManagerAsync::saveData, dbc.alias("alias"), test_buffer, Policy("password"));
676     test_positive(&ManagerAsync::getData, dbc.alias("alias"), "password");
677 }
678
679
680 // getKeyAliasVector
681 RUNNER_CHILD_TEST(TA0910_get_key_alias_vector_invalid_param)
682 {
683     switch_to_storage_user(TEST_LABEL);
684
685     test_no_observer(&ManagerAsync::getKeyAliasVector);
686 }
687
688 RUNNER_CHILD_TEST(TA0950_get_key_alias_vector_positive)
689 {
690     switch_to_storage_user(TEST_LABEL);
691
692     DBCleanup dbc;
693     test_positive(&ManagerAsync::saveKey, dbc.alias("alias1"), keys[RSA][0].prv, Policy());
694     test_check_aliases(&ManagerAsync::getKeyAliasVector, { aliasWithLabel(TEST_LABEL, dbc.alias("alias1")) });
695
696     test_positive(&ManagerAsync::saveKey, dbc.alias("alias2"), keys[DSA][0].prv, Policy());
697     test_check_aliases(&ManagerAsync::getKeyAliasVector, { aliasWithLabel(TEST_LABEL, dbc.alias("alias1")),
698                                                            aliasWithLabel(TEST_LABEL, dbc.alias("alias2")) });
699
700     test_positive(&ManagerAsync::removeAlias, dbc.alias("alias1"));
701     test_check_aliases(&ManagerAsync::getKeyAliasVector, { aliasWithLabel(TEST_LABEL, dbc.alias("alias2")) });
702 }
703
704
705 // getCertificateAliasVector
706 RUNNER_CHILD_TEST(TA1010_get_cert_alias_vector_invalid_param)
707 {
708     switch_to_storage_user(TEST_LABEL);
709
710     test_no_observer(&ManagerAsync::getCertificateAliasVector);
711 }
712
713 RUNNER_CHILD_TEST(TA1050_get_cert_alias_vector_positive)
714 {
715     switch_to_storage_user(TEST_LABEL);
716
717     DBCleanup dbc;
718     test_positive(&ManagerAsync::saveCertificate, dbc.alias("alias1"), certs[0], Policy());
719     test_check_aliases(&ManagerAsync::getCertificateAliasVector, { aliasWithLabel(TEST_LABEL, dbc.alias("alias1")) });
720
721     test_positive(&ManagerAsync::saveCertificate, dbc.alias("alias2"), certs[1], Policy());
722     test_check_aliases(&ManagerAsync::getCertificateAliasVector, { aliasWithLabel(TEST_LABEL, dbc.alias("alias1")),
723                                                                    aliasWithLabel(TEST_LABEL, dbc.alias("alias2")) });
724
725     test_positive(&ManagerAsync::removeAlias, dbc.alias("alias1"));
726     test_check_aliases(&ManagerAsync::getCertificateAliasVector, { aliasWithLabel(TEST_LABEL, dbc.alias("alias2")) });
727 }
728
729
730 // getDataAliasVector
731 RUNNER_CHILD_TEST(TA1110_get_data_alias_vector_invalid_param)
732 {
733     switch_to_storage_user(TEST_LABEL);
734
735     test_no_observer(&ManagerAsync::getDataAliasVector);
736 }
737
738 RUNNER_CHILD_TEST(TA1150_get_data_alias_vector_positive)
739 {
740     switch_to_storage_user(TEST_LABEL);
741
742     DBCleanup dbc;
743     test_positive(&ManagerAsync::saveData, dbc.alias("alias1"), test_buffer, Policy());
744     test_check_aliases(&ManagerAsync::getDataAliasVector, { aliasWithLabel(TEST_LABEL, dbc.alias("alias1")) });
745
746     test_positive(&ManagerAsync::saveData, dbc.alias("alias2"), test_buffer, Policy());
747     test_check_aliases(&ManagerAsync::getDataAliasVector, { aliasWithLabel(TEST_LABEL, dbc.alias("alias1")),
748                                                             aliasWithLabel(TEST_LABEL, dbc.alias("alias2")) });
749
750     test_positive(&ManagerAsync::removeAlias, dbc.alias("alias1"));
751     test_check_aliases(&ManagerAsync::getDataAliasVector, { aliasWithLabel(TEST_LABEL, dbc.alias("alias2")) });
752 }
753
754
755 // createKeyPairRSA
756 RUNNER_CHILD_TEST(TA1210_create_key_pair_rsa_invalid_param)
757 {
758     switch_to_storage_user(TEST_LABEL);
759
760     test_no_observer(&ManagerAsync::createKeyPairRSA,
761                      1024,
762                      "alias_prv",
763                      "alias_pub",
764                      Policy(),
765                      Policy());
766 }
767
768 RUNNER_CHILD_TEST(TA1220_create_key_pair_rsa_already_exists)
769 {
770     switch_to_storage_user(TEST_LABEL);
771
772     DBCleanup dbc;
773     test_positive(&ManagerAsync::saveKey, dbc.alias("alias_prv"), keys[RSA][0].prv, Policy());
774     test_negative(&ManagerAsync::createKeyPairRSA,
775                   CKM_API_ERROR_DB_ALIAS_EXISTS,
776                   1024,
777                   dbc.alias("alias_prv"),
778                   dbc.alias("alias_pub"),
779                   Policy(),
780                   Policy());
781 }
782
783 RUNNER_CHILD_TEST(TA1250_create_key_pair_rsa_positive)
784 {
785     switch_to_storage_user(TEST_LABEL);
786
787     DBCleanup dbc;
788     test_positive(&ManagerAsync::createKeyPairRSA,
789                   1024,
790                   dbc.alias("alias_prv"),
791                   dbc.alias("alias_pub"),
792                   Policy(),
793                   Policy());
794
795     test_check_aliases(&ManagerAsync::getKeyAliasVector, { aliasWithLabel(TEST_LABEL, dbc.alias("alias_prv")),
796                                                            aliasWithLabel(TEST_LABEL, dbc.alias("alias_pub")) });
797 }
798
799 // createKeyPairDSA
800 RUNNER_CHILD_TEST(TA1270_create_key_pair_dsa_invalid_param)
801 {
802     switch_to_storage_user(TEST_LABEL);
803
804     test_no_observer(&ManagerAsync::createKeyPairDSA,
805                      1024,
806                      "alias_prv",
807                      "alias_pub",
808                      Policy(),
809                      Policy());
810 }
811
812 RUNNER_CHILD_TEST(TA1280_create_key_pair_dsa_already_exists)
813 {
814     switch_to_storage_user(TEST_LABEL);
815
816     DBCleanup dbc;
817     test_positive(&ManagerAsync::saveKey, dbc.alias("alias_prv"), keys[DSA][0].prv, Policy());
818     test_negative(&ManagerAsync::createKeyPairDSA,
819                   CKM_API_ERROR_DB_ALIAS_EXISTS,
820                   1024,
821                   dbc.alias("alias_prv"),
822                   dbc.alias("alias_pub"),
823                   Policy(),
824                   Policy());
825 }
826
827 RUNNER_CHILD_TEST(TA1290_create_key_pair_dsa_positive)
828 {
829     switch_to_storage_user(TEST_LABEL);
830
831     DBCleanup dbc;
832     test_positive(&ManagerAsync::createKeyPairDSA,
833                   1024,
834                   dbc.alias("alias_prv"),
835                   dbc.alias("alias_pub"),
836                   Policy(),
837                   Policy());
838
839     test_check_aliases(&ManagerAsync::getKeyAliasVector, { aliasWithLabel(TEST_LABEL, dbc.alias("alias_prv")),
840                                                            aliasWithLabel(TEST_LABEL, dbc.alias("alias_pub")) });
841 }
842
843 // createKeyPairECDSA
844 RUNNER_CHILD_TEST(TA1310_create_key_pair_ecdsa_invalid_param)
845 {
846     switch_to_storage_user(TEST_LABEL);
847
848     test_no_observer(&ManagerAsync::createKeyPairECDSA,
849                      ElipticCurve::prime192v1,
850                      "alias_prv",
851                      "alias_pub",
852                      Policy(),
853                      Policy());
854 }
855
856 RUNNER_CHILD_TEST(TA1320_create_key_pair_ecdsa_already_exists)
857 {
858     switch_to_storage_user(TEST_LABEL);
859
860     DBCleanup dbc;
861     test_positive(&ManagerAsync::saveKey, dbc.alias("alias_prv"), keys[ECDSA][0].prv, Policy());
862     test_negative(&ManagerAsync::createKeyPairECDSA,
863                   CKM_API_ERROR_DB_ALIAS_EXISTS,
864                   ElipticCurve::prime192v1,
865                   dbc.alias("alias_prv"),
866                   dbc.alias("alias_pub"),
867                   Policy(),
868                   Policy());
869 }
870
871 RUNNER_CHILD_TEST(TA1350_create_key_pair_ecdsa_positive)
872 {
873     switch_to_storage_user(TEST_LABEL);
874
875     DBCleanup dbc;
876     test_positive(&ManagerAsync::createKeyPairECDSA,
877                   ElipticCurve::prime192v1,
878                   dbc.alias("alias_prv"),
879                   dbc.alias("alias_pub"),
880                   Policy(),
881                   Policy());
882
883     test_check_aliases(&ManagerAsync::getKeyAliasVector, { aliasWithLabel(TEST_LABEL, dbc.alias("alias_prv")),
884                                                            aliasWithLabel(TEST_LABEL, dbc.alias("alias_pub")) });
885 }
886
887
888 // getCertificateChain
889 RUNNER_CHILD_TEST(TA1410_get_certificate_chain_invalid_param)
890 {
891     switch_to_storage_user(TEST_LABEL);
892
893     CertificateShPtr cert = certs[0];
894     CertificateShPtrVector certv = { certs[1] };
895     test_no_observer<certChainFn1>(&ManagerAsync::getCertificateChain,
896                                    cert,
897                                    certv,
898                                    EMPTY_CERT_VECTOR,
899                                    true);
900     test_invalid_param<certChainFn1>(&ManagerAsync::getCertificateChain,
901                                      CertificateShPtr(),
902                                      certv,
903                                      EMPTY_CERT_VECTOR,
904                                      true);
905
906     Alias alias = "alias";
907     AliasVector aliasv = { alias };
908     test_no_observer<certChainFn2>(&ManagerAsync::getCertificateChain,
909                                    cert,
910                                    aliasv,
911                                    EMPTY_ALIAS_VECTOR,
912                                    true);
913     test_invalid_param<certChainFn2>(&ManagerAsync::getCertificateChain,
914                                      CertificateShPtr(),
915                                      aliasv,
916                                      EMPTY_ALIAS_VECTOR,
917                                      true);
918 }
919
920 RUNNER_CHILD_TEST(TA1420_get_certificate_chain_negative)
921 {
922     switch_to_storage_user(TEST_LABEL);
923
924     DBCleanup dbc;
925     CertificateShPtr cert = certs[0];
926     CertificateShPtrVector certv = { certs[0] };
927     test_negative<certChainFn1>(&ManagerAsync::getCertificateChain,
928                                 CKM_API_ERROR_VERIFICATION_FAILED,
929                                 cert,
930                                 EMPTY_CERT_VECTOR,
931                                 EMPTY_CERT_VECTOR,
932                                 true);
933     test_negative<certChainFn1>(&ManagerAsync::getCertificateChain,
934                                 CKM_API_ERROR_VERIFICATION_FAILED,
935                                 cert,
936                                 certv,
937                                 EMPTY_CERT_VECTOR,
938                                 true);
939     AliasVector aliasv = { dbc.alias("alias") };
940     test_positive(&ManagerAsync::saveCertificate, aliasv[0], certs[0], Policy());
941     test_negative<certChainFn2>(&ManagerAsync::getCertificateChain,
942                                 CKM_API_ERROR_VERIFICATION_FAILED,
943                                 cert,
944                                 EMPTY_ALIAS_VECTOR,
945                                 EMPTY_ALIAS_VECTOR,
946                                 true);
947     test_negative<certChainFn2>(&ManagerAsync::getCertificateChain,
948                                 CKM_API_ERROR_VERIFICATION_FAILED,
949                                 cert,
950                                 aliasv,
951                                 EMPTY_ALIAS_VECTOR,
952                                 true);
953 }
954
955 RUNNER_CHILD_TEST(TA1450_get_certificate_chain_positive)
956 {
957     switch_to_storage_user(TEST_LABEL);
958
959     DBCleanup dbc;
960     CertificateShPtr cert = certs[0];
961     CertificateShPtrVector certv = { certs[1] };
962     test_check_cert_chain<certChainFn1>(&ManagerAsync::getCertificateChain,
963                                         3,
964                                         cert,
965                                         certv,
966                                         EMPTY_CERT_VECTOR,
967                                         true);
968
969     AliasVector aliasv = { dbc.alias("alias") };
970     test_positive(&ManagerAsync::saveCertificate, aliasv[0], certs[1], Policy());
971     test_check_cert_chain<certChainFn2>(&ManagerAsync::getCertificateChain,
972                                         3,
973                                         cert,
974                                         aliasv,
975                                         EMPTY_ALIAS_VECTOR,
976                                         true);
977 }
978
979
980 // createSignature
981 RUNNER_CHILD_TEST(TA1510_create_signature_invalid_param)
982 {
983     switch_to_storage_user(TEST_LABEL);
984
985     test_no_observer(&ManagerAsync::createSignature,
986                      "alias",
987                      "",
988                      test_buffer,
989                      HashAlgorithm::SHA1,
990                      RSAPaddingAlgorithm::PKCS1);
991     test_invalid_param(&ManagerAsync::createSignature,
992                        "",
993                        "",
994                        test_buffer,
995                        HashAlgorithm::SHA1,
996                        RSAPaddingAlgorithm::PKCS1);
997     test_invalid_param(&ManagerAsync::createSignature,
998                        "alias",
999                        "",
1000                        RawBuffer(),
1001                        HashAlgorithm::SHA1,
1002                        RSAPaddingAlgorithm::PKCS1);
1003 }
1004
1005 RUNNER_CHILD_TEST(TA1520_create_signature_invalid_password)
1006 {
1007     switch_to_storage_user(TEST_LABEL);
1008
1009     DBCleanup dbc;
1010     test_positive(&ManagerAsync::saveKey, dbc.alias("alias"), keys[RSA][0].prv, Policy("password"));
1011     test_negative(&ManagerAsync::createSignature,
1012                   CKM_API_ERROR_INPUT_PARAM,
1013                   dbc.alias("alias"),
1014                   "wrong-password",
1015                   RawBuffer(),
1016                   HashAlgorithm::SHA1,
1017                   RSAPaddingAlgorithm::PKCS1);
1018 }
1019
1020 RUNNER_CHILD_TEST(TA1550_create_signature_positive)
1021 {
1022     switch_to_storage_user(TEST_LABEL);
1023
1024     DBCleanup dbc;
1025     test_positive(&ManagerAsync::saveKey, dbc.alias("alias"), keys[RSA][0].prv, Policy("password"));
1026     test_positive(&ManagerAsync::createSignature,
1027                   dbc.alias("alias"),
1028                   "password",
1029                   test_buffer,
1030                   HashAlgorithm::SHA1,
1031                   RSAPaddingAlgorithm::PKCS1);
1032 }
1033
1034
1035 // verifySignature
1036 RUNNER_CHILD_TEST(TA1610_verify_signature_invalid_param)
1037 {
1038     switch_to_storage_user(TEST_LABEL);
1039
1040     test_no_observer(&ManagerAsync::verifySignature,
1041                      "",
1042                      "",
1043                      RawBuffer(),
1044                      RawBuffer(),
1045                      HashAlgorithm::SHA1,
1046                      RSAPaddingAlgorithm::PKCS1);
1047     test_invalid_param(&ManagerAsync::verifySignature,
1048                        "",
1049                        "",
1050                        test_buffer,
1051                        test_buffer,
1052                        HashAlgorithm::SHA1,
1053                        RSAPaddingAlgorithm::PKCS1);
1054 }
1055
1056 RUNNER_CHILD_TEST(TA1620_verify_signature_invalid_password)
1057 {
1058     switch_to_storage_user(TEST_LABEL);
1059
1060     DBCleanup dbc;
1061     test_positive(&ManagerAsync::saveKey, dbc.alias("alias_prv"), keys[RSA][0].prv, Policy("pass1"));
1062     test_positive(&ManagerAsync::saveKey, dbc.alias("alias_pub"), keys[RSA][0].pub, Policy("pass2"));
1063     auto obs = test_positive(&ManagerAsync::createSignature,
1064                              dbc.alias("alias_prv"),
1065                              "pass1",
1066                              test_buffer,
1067                              HashAlgorithm::SHA1,
1068                              RSAPaddingAlgorithm::PKCS1);
1069
1070     test_negative(&ManagerAsync::verifySignature,
1071                   CKM_API_ERROR_SERVER_ERROR,
1072                   dbc.alias("alias_pub"),
1073                   "wrong-password",
1074                   test_buffer,
1075                   obs->m_signed,
1076                   HashAlgorithm::SHA1,
1077                   RSAPaddingAlgorithm::PKCS1);
1078 }
1079
1080 RUNNER_CHILD_TEST(TA1630_verify_signature_invalid_message)
1081 {
1082     switch_to_storage_user(TEST_LABEL);
1083
1084     DBCleanup dbc;
1085     test_positive(&ManagerAsync::saveKey, dbc.alias("alias_prv"), keys[RSA][0].prv, Policy(""));
1086     test_positive(&ManagerAsync::saveKey, dbc.alias("alias_pub"), keys[RSA][0].pub, Policy(""));
1087
1088     auto obs = test_positive(&ManagerAsync::createSignature,
1089                              dbc.alias("alias_prv"),
1090                              "",
1091                              test_buffer,
1092                              HashAlgorithm::SHA1,
1093                              RSAPaddingAlgorithm::PKCS1);
1094
1095     test_negative(&ManagerAsync::verifySignature,
1096                   CKM_API_ERROR_VERIFICATION_FAILED,
1097                   dbc.alias("alias_pub"),
1098                   "",
1099                   raw_buffer("invalid-unsigned-mesage"),
1100                   obs->m_signed,
1101                   HashAlgorithm::SHA1,
1102                   RSAPaddingAlgorithm::PKCS1);
1103 }
1104
1105 RUNNER_CHILD_TEST(TA1640_verify_signature_invalid_signature)
1106 {
1107     switch_to_storage_user(TEST_LABEL);
1108
1109     DBCleanup dbc;
1110     test_positive(&ManagerAsync::saveKey, dbc.alias("alias_pub"), keys[RSA][0].pub, Policy(""));
1111
1112     test_negative(&ManagerAsync::verifySignature,
1113                   CKM_API_ERROR_VERIFICATION_FAILED,
1114                   dbc.alias("alias_pub"),
1115                   "",
1116                   test_buffer,
1117                   raw_buffer("invalid-signature"),
1118                   HashAlgorithm::SHA1,
1119                   RSAPaddingAlgorithm::PKCS1);
1120 }
1121
1122 RUNNER_CHILD_TEST(TA1650_verify_signature_wrong_key)
1123 {
1124     switch_to_storage_user(TEST_LABEL);
1125
1126     DBCleanup dbc;
1127     test_positive(&ManagerAsync::saveKey, dbc.alias("alias_prv"), keys[RSA][0].prv, Policy(""));
1128     auto obs = test_positive(&ManagerAsync::createSignature,
1129                              dbc.alias("alias_prv"),
1130                              "",
1131                              test_buffer,
1132                              HashAlgorithm::SHA1,
1133                              RSAPaddingAlgorithm::PKCS1);
1134
1135     test_negative(&ManagerAsync::verifySignature,
1136                   CKM_API_ERROR_SERVER_ERROR,
1137                   dbc.alias("alias_prv"),
1138                   "",
1139                   test_buffer,
1140                   obs->m_signed,
1141                   HashAlgorithm::SHA1,
1142                   RSAPaddingAlgorithm::PKCS1);
1143 }
1144
1145 RUNNER_CHILD_TEST(TA1660_verify_signature_positive)
1146 {
1147     switch_to_storage_user(TEST_LABEL);
1148
1149     DBCleanup dbc;
1150     test_positive(&ManagerAsync::saveKey, dbc.alias("alias_prv"), keys[RSA][0].prv, Policy("pass1"));
1151     test_positive(&ManagerAsync::saveKey, dbc.alias("alias_pub"), keys[RSA][0].pub, Policy("pass2"));
1152     auto obs = test_positive(&ManagerAsync::createSignature,
1153                              dbc.alias("alias_prv"),
1154                              "pass1",
1155                              test_buffer,
1156                              HashAlgorithm::SHA1,
1157                              RSAPaddingAlgorithm::PKCS1);
1158
1159     test_positive(&ManagerAsync::verifySignature,
1160                   dbc.alias("alias_pub"),
1161                   "pass2",
1162                   test_buffer,
1163                   obs->m_signed,
1164                   HashAlgorithm::SHA1,
1165                   RSAPaddingAlgorithm::PKCS1);
1166 }
1167
1168
1169 // ocspCheck
1170 RUNNER_CHILD_TEST(TA1710_ocsp_check_invalid_param)
1171 {
1172     test_no_observer(&ManagerAsync::ocspCheck, EMPTY_CERT_VECTOR);
1173     test_invalid_param(&ManagerAsync::ocspCheck, EMPTY_CERT_VECTOR);
1174 }
1175
1176 RUNNER_CHILD_TEST(TA1720_ocsp_check_negative)
1177 {
1178     switch_to_storage_ocsp_user(TEST_LABEL);
1179
1180     DBCleanup dbc;
1181     CertificateShPtrVector certv = { certs[0], certs[0] };
1182
1183     auto obs = test_positive(&ManagerAsync::ocspCheck, certv);
1184     RUNNER_ASSERT_MSG(obs->m_ocspStatus != CKM_API_OCSP_STATUS_GOOD,
1185                          "Verification should fail. Got: " << obs->m_ocspStatus);
1186 }
1187
1188 RUNNER_CHILD_TEST(TA1750_ocsp_check_positive)
1189 {
1190     RUNNER_IGNORED_MSG("Fixed in next version of ckm!");
1191     switch_to_storage_ocsp_user(TEST_LABEL);
1192
1193     DBCleanup dbc;
1194     CertificateShPtr cert = certs[0];
1195     CertificateShPtrVector certv = { certs[1] };
1196     auto obs = test_positive<certChainFn1>(&ManagerAsync::getCertificateChain,
1197                                            cert,
1198                                            certv,
1199                                            EMPTY_CERT_VECTOR,
1200                                            true);
1201
1202     auto obs2 = test_positive(&ManagerAsync::ocspCheck, obs->m_certChain);
1203     RUNNER_ASSERT_MSG(obs2->m_ocspStatus == CKM_API_OCSP_STATUS_GOOD,
1204                          "Verification failed. Error: " << obs->m_ocspStatus);
1205 }
1206
1207 // setPermission
1208 RUNNER_CHILD_TEST(TA1810_allow_access_invalid_param)
1209 {
1210     switch_to_storage_user(TEST_LABEL);
1211
1212     test_no_observer(&ManagerAsync::setPermission, "alias", "accessor", CKM::Permission::READ | CKM::Permission::REMOVE);
1213     test_invalid_param(&ManagerAsync::setPermission, "", "accessor", CKM::Permission::READ | CKM::Permission::REMOVE);
1214     test_invalid_param(&ManagerAsync::setPermission, "alias", "", CKM::Permission::READ | CKM::Permission::REMOVE);
1215 }
1216
1217 RUNNER_TEST(TA1820_allow_access)
1218 {
1219     DBCleanup dbc;
1220     CharPtr top_label = get_label();
1221     test_positive(&ManagerAsync::saveData, dbc.alias("alias"), test_buffer, Policy());
1222     test_positive(&ManagerAsync::saveData, dbc.alias("alias2"), test_buffer, Policy());
1223     test_positive(&ManagerAsync::saveData, dbc.alias("alias3"), test_buffer, Policy());
1224     test_positive(&ManagerAsync::setPermission,
1225                   dbc.alias("alias2"),
1226                   TEST_LABEL,
1227                   CKM::Permission::READ);
1228     test_positive(&ManagerAsync::setPermission,
1229                   dbc.alias("alias3"),
1230                   TEST_LABEL,
1231                   CKM::Permission::READ | CKM::Permission::REMOVE);
1232
1233     {
1234         ScopedLabel label(TEST_LABEL);
1235
1236         test_negative(&ManagerAsync::getData, CKM_API_ERROR_DB_ALIAS_UNKNOWN, dbc.alias("alias"), "");
1237         test_negative(&ManagerAsync::removeAlias, CKM_API_ERROR_DB_ALIAS_UNKNOWN, dbc.alias("alias"));
1238
1239         // test from allowed label, but without properly addressing alias (coming from default label)
1240         test_negative(&ManagerAsync::getData, CKM_API_ERROR_DB_ALIAS_UNKNOWN, dbc.alias("alias2"), "");
1241
1242         // now test with appropriate addressing
1243         std::string full_alias2_address = aliasWithLabel(top_label.get(), dbc.alias("alias2"));
1244         test_positive(&ManagerAsync::getData, full_alias2_address, "");
1245         test_negative(&ManagerAsync::removeAlias, CKM_API_ERROR_ACCESS_DENIED, full_alias2_address);
1246
1247         std::string full_alias3_address = aliasWithLabel(top_label.get(), dbc.alias("alias3"));
1248         test_positive(&ManagerAsync::getData, full_alias3_address, "");
1249         test_positive(&ManagerAsync::removeAlias, full_alias3_address);
1250     }
1251 }
1252
1253 // denyAccess
1254 RUNNER_CHILD_TEST(TA1910_deny_access_invalid_param)
1255 {
1256     switch_to_storage_user(TEST_LABEL);
1257
1258     test_no_observer(&ManagerAsync::setPermission, "alias", "accessor", CKM::Permission::NONE);
1259     test_invalid_param(&ManagerAsync::setPermission, "", "accessor", CKM::Permission::NONE);
1260     test_invalid_param(&ManagerAsync::setPermission, "alias", "", CKM::Permission::NONE);
1261 }
1262
1263 RUNNER_TEST(TA1920_deny_access)
1264 {
1265     DBCleanup dbc;
1266     CharPtr top_label = get_label();
1267     test_positive(&ManagerAsync::saveData, dbc.alias("alias"), test_buffer, Policy());
1268     test_positive(&ManagerAsync::setPermission,
1269                   dbc.alias("alias"),
1270                   TEST_LABEL,
1271                   CKM::Permission::READ | CKM::Permission::REMOVE);
1272     test_positive(&ManagerAsync::setPermission, dbc.alias("alias"), TEST_LABEL, CKM::Permission::NONE);
1273
1274     {
1275         ScopedLabel label(TEST_LABEL);
1276
1277         std::string full_alias_address = aliasWithLabel(top_label.get(), dbc.alias("alias"));
1278         test_negative(&ManagerAsync::getData, CKM_API_ERROR_DB_ALIAS_UNKNOWN, full_alias_address, "");
1279         test_negative(&ManagerAsync::removeAlias, CKM_API_ERROR_DB_ALIAS_UNKNOWN, full_alias_address);
1280     }
1281 }
1282
1283 namespace
1284 {
1285 CKM::Alias alias_PKCS_exportable = "async-test-PKCS-export";
1286 CKM::Alias alias_PKCS_not_exportable = "async-test-PKCS-no-export";
1287 }
1288
1289 RUNNER_TEST(TA2000_PKCS_add_bundle_with_chain_certs)
1290 {
1291     DBCleanup dbc;
1292     auto manager = CKM::Manager::create();
1293     std::ifstream is("/usr/share/ckm-test/pkcs.p12");
1294     std::istreambuf_iterator<char> begin(is), end;
1295     std::vector<char> buff(begin, end);
1296
1297     CKM::RawBuffer buffer(buff.size());
1298     memcpy(buffer.data(), buff.data(), buff.size());
1299
1300     auto pkcs = CKM::PKCS12::create(buffer, CKM::Password());
1301     RUNNER_ASSERT_MSG_BT(
1302         NULL != pkcs.get(),
1303         "Error in PKCS12::create()");
1304
1305     auto cert = pkcs->getCertificate();
1306     RUNNER_ASSERT_MSG_BT(
1307         NULL != cert.get(),
1308         "Error in PKCS12::getCertificate()");
1309
1310     auto key = pkcs->getKey();
1311     RUNNER_ASSERT_MSG_BT(
1312         NULL != key.get(),
1313         "Error in PKCS12::getKey()");
1314
1315     auto caVector = pkcs->getCaCertificateShPtrVector();
1316     RUNNER_ASSERT_MSG_BT(
1317         2 == caVector.size(),
1318         "Wrong size of vector");
1319
1320     // save to the CKM
1321     int tmp;
1322     CKM::Policy exportable;
1323     CKM::Policy notExportable(CKM::Password(), false);
1324
1325     test_positive(&ManagerAsync::savePKCS12,
1326                   alias_PKCS_exportable,
1327                   pkcs,
1328                   exportable,
1329                   exportable);
1330     test_negative(&ManagerAsync::savePKCS12,
1331                   CKM_API_ERROR_DB_ALIAS_EXISTS,
1332                   alias_PKCS_exportable,
1333                   pkcs,
1334                   exportable,
1335                   exportable);
1336
1337     test_positive(&ManagerAsync::savePKCS12,
1338                   alias_PKCS_not_exportable,
1339                   pkcs,
1340                   notExportable,
1341                   notExportable);
1342     test_negative(&ManagerAsync::savePKCS12,
1343                   CKM_API_ERROR_DB_ALIAS_EXISTS,
1344                   alias_PKCS_not_exportable,
1345                   pkcs,
1346                   notExportable,
1347                   notExportable);
1348 }
1349
1350 RUNNER_TEST(TA2010_PKCS_get)
1351 {
1352     DBCleanup dbc;
1353     int temp;
1354     auto manager = CKM::Manager::create();
1355
1356     // fail - no entry
1357     test_negative(&ManagerAsync::getPKCS12,
1358                   CKM_API_ERROR_DB_ALIAS_UNKNOWN,
1359                   "i-do-not-exist");
1360
1361
1362     // fail - not exportable
1363     test_negative(&ManagerAsync::getPKCS12,
1364                   CKM_API_ERROR_NOT_EXPORTABLE,
1365                   dbc.alias(alias_PKCS_not_exportable.c_str()));
1366
1367     // success - exportable
1368     auto obs = test_positive(&ManagerAsync::getPKCS12,
1369                              dbc.alias(alias_PKCS_exportable.c_str()));
1370
1371     auto cert = obs->m_pkcs->getCertificate();
1372     RUNNER_ASSERT_MSG_BT(
1373         NULL != cert.get(),
1374         "Error in PKCS12::getCertificate()");
1375
1376     auto key = obs->m_pkcs->getKey();
1377     RUNNER_ASSERT_MSG_BT(
1378         NULL != key.get(),
1379         "Error in PKCS12::getKey()");
1380
1381     auto caVector = obs->m_pkcs->getCaCertificateShPtrVector();
1382     RUNNER_ASSERT_MSG_BT(
1383         2 == caVector.size(),
1384         "Wrong size of vector");
1385 }
1386
1387 RUNNER_TEST(TA9999_deinit)
1388 {
1389     int temp;
1390     ControlShPtr control = Control::create();
1391     RUNNER_ASSERT_MSG(CKM_API_SUCCESS == (temp = control->lockUserKey(APP_UID)),
1392                          "Error=" << ErrorToString(temp));
1393     RUNNER_ASSERT_MSG(CKM_API_SUCCESS == (temp = control->removeUserData(APP_UID)),
1394                          "Error=" << ErrorToString(temp));
1395 }