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