a340c98c2536866445b66ff38f5600deb71ba116
[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 <dpl/test/test_runner.h>
36 #include <dpl/test/test_runner_child.h>
37 #include <dpl/log/log.h>
38
39 #include <tests_common.h>
40 #include <ckm-common.h>
41
42 using namespace CKM;
43 using namespace std;
44
45 namespace {
46
47 const char* TEST_LABEL = "test_label";
48
49 class MyObserver: public ManagerAsync::Observer
50 {
51 public:
52     MyObserver() :
53             m_finished(false), m_error(0)
54     {
55     }
56
57     void ReceivedError(int error)
58     {
59         LogError("Received error: " << error);
60         m_finished = true;
61         m_error = error;
62         m_cv.notify_one();
63     }
64
65     void ReceivedSaveKey() { Succeeded(); }
66     void ReceivedSaveCertificate() { Succeeded(); }
67     void ReceivedSaveData() { Succeeded(); }
68
69     void ReceivedRemovedAlias() { Succeeded(); }
70
71     void ReceivedKey(Key &&) { Succeeded(); }
72     void ReceivedCertificate(Certificate &&) { Succeeded(); }
73     void ReceivedData(RawBuffer &&) { Succeeded(); }
74
75     void ReceivedKeyAliasVector(AliasVector && av) { m_aliases = move(av); Succeeded(); }
76     void ReceivedCertificateAliasVector(AliasVector && av) { m_aliases = move(av); Succeeded(); }
77     void ReceivedDataAliasVector(AliasVector && av) { m_aliases = move(av); Succeeded(); }
78
79     void ReceivedCreateKeyPairRSA() { Succeeded(); }
80     void ReceivedCreateKeyPairDSA() { Succeeded(); }
81     void ReceivedCreateKeyPairECDSA() { Succeeded(); }
82
83     void ReceivedGetCertificateChain(CertificateShPtrVector && chain)
84             { m_certChain = move(chain); Succeeded(); }
85
86     void ReceivedCreateSignature(RawBuffer && buffer) { m_signed = move(buffer); Succeeded(); }
87     void ReceivedVerifySignature() { Succeeded(); }
88     void ReceivedOCSPCheck(int status) { m_ocspStatus = status; Succeeded(); }
89
90     void ReceivedSetPermission() { Succeeded(); }
91
92
93     void WaitForResponse()
94     {
95         unique_lock < mutex > lock(m_mutex);
96
97         m_cv.wait(lock, [this] {return m_finished;});
98     }
99
100     bool m_finished;
101     int m_error;
102     AliasVector m_aliases;
103     CertificateShPtrVector m_certChain;
104     RawBuffer m_signed;
105     int m_ocspStatus;
106
107 protected:
108     void Succeeded()
109     {
110         LogDebug("Succeeded");
111         m_finished = true;
112         m_cv.notify_one();
113     }
114
115     mutex m_mutex;
116     condition_variable m_cv;
117 };
118
119 typedef shared_ptr<MyObserver> MyObserverPtr;
120
121 const char* TEST_PASS = "test-pass";
122
123 enum Type {
124     RSA,
125     DSA,
126     ECDSA
127 };
128
129 struct KeyPair
130 {
131     KeyPair(const std::string& prv_pem, const std::string& pub_pem) {
132         RawBuffer buffer_prv(prv_pem.begin(), prv_pem.end());
133         prv = Key::create(buffer_prv);
134         assert(prv);
135
136         RawBuffer buffer_pub(pub_pem.begin(), pub_pem.end());
137         pub = Key::create(buffer_pub);
138         assert(pub);
139     }
140
141     KeyShPtr prv;
142     KeyShPtr pub;
143 };
144
145 typedef map<Type, vector<KeyPair> > KeyMap;
146
147 std::string format_full_label_alias(const std::string &label, const std::string &alias)
148 {
149     std::stringstream ss;
150     ss << label << std::string(ckmc_label_name_separator) << alias;
151     return ss.str();
152 }
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
397 typedef void (ManagerAsync::*certChainFn2)(const ManagerAsync::ObserverPtr&,
398                                            const CertificateShPtr&,
399                                            const AliasVector&);
400 } // namespace anonymous
401
402
403 RUNNER_TEST_GROUP_INIT(CKM_ASYNC_API);
404
405 RUNNER_TEST(TA0000_init)
406 {
407     int temp;
408     ControlShPtr control = Control::create();
409     RUNNER_ASSERT_MSG(CKM_API_SUCCESS == (temp = control->unlockUserKey(APP_UID, TEST_PASS)),
410                          "Error=" << ErrorToString(temp));
411     RUNNER_ASSERT_MSG(CKM_API_SUCCESS == (temp = control->removeUserData(APP_UID)),
412                          "Error=" << ErrorToString(temp));
413 }
414
415 // saveKey
416 RUNNER_CHILD_TEST(TA0010_save_key_invalid_param)
417 {
418     switch_to_storage_user(TEST_LABEL);
419
420     test_no_observer(&ManagerAsync::saveKey, "alias", keys[RSA][0].prv, Policy());
421     test_invalid_param(&ManagerAsync::saveKey, "", keys[RSA][0].prv, Policy());
422     test_invalid_param(&ManagerAsync::saveKey, "alias", KeyShPtr(), Policy());
423 }
424
425 RUNNER_CHILD_TEST(TA0020_save_key_already_exists)
426 {
427     switch_to_storage_user(TEST_LABEL);
428
429     DBCleanup dbc;
430     test_positive(&ManagerAsync::saveKey, dbc.alias("alias"), keys[RSA][0].prv, Policy());
431     test_negative(&ManagerAsync::saveKey,
432                   CKM_API_ERROR_DB_ALIAS_EXISTS,
433                   dbc.alias("alias"),
434                   keys[RSA][0].prv,
435                   Policy());
436 }
437
438 RUNNER_CHILD_TEST(TA0050_save_key_positive)
439 {
440     switch_to_storage_user(TEST_LABEL);
441
442     DBCleanup dbc;
443     test_positive(&ManagerAsync::saveKey, dbc.alias("alias"), keys[RSA][0].prv, Policy());
444 }
445
446
447 // saveCertificate
448 RUNNER_CHILD_TEST(TA0110_save_cert_invalid_param)
449 {
450     switch_to_storage_user(TEST_LABEL);
451
452     CertificateShPtr cert = Certificate::create(test_buffer, DataFormat::FORM_PEM);
453     test_no_observer(&ManagerAsync::saveCertificate, "", cert, Policy());
454     test_invalid_param(&ManagerAsync::saveCertificate, "", cert, Policy());
455     test_invalid_param(&ManagerAsync::saveCertificate, "alias", CertificateShPtr(), Policy());
456 }
457
458 RUNNER_CHILD_TEST(TA0120_save_cert_already_exists)
459 {
460     switch_to_storage_user(TEST_LABEL);
461
462     DBCleanup dbc;
463     test_positive(&ManagerAsync::saveCertificate, dbc.alias("alias"), certs[0], Policy());
464     test_negative(&ManagerAsync::saveCertificate,
465                   CKM_API_ERROR_DB_ALIAS_EXISTS,
466                   dbc.alias("alias"),
467                   certs[0],
468                   Policy());
469 }
470
471 RUNNER_CHILD_TEST(TA0150_save_cert_positive)
472 {
473     switch_to_storage_user(TEST_LABEL);
474
475     DBCleanup dbc;
476     test_positive(&ManagerAsync::saveCertificate, dbc.alias("alias"), certs[0], Policy());
477 }
478
479
480 // saveData
481 RUNNER_CHILD_TEST(TA0210_save_data_invalid_param)
482 {
483     switch_to_storage_user(TEST_LABEL);
484
485     test_no_observer(&ManagerAsync::saveData, "", test_buffer, Policy());
486     test_invalid_param(&ManagerAsync::saveData, "", test_buffer, Policy());
487     test_invalid_param(&ManagerAsync::saveData, "alias", RawBuffer(), Policy());
488 }
489
490 RUNNER_CHILD_TEST(TA0220_save_data_already_exists)
491 {
492     switch_to_storage_user(TEST_LABEL);
493
494     DBCleanup dbc;
495     test_positive(&ManagerAsync::saveData, dbc.alias("alias"), test_buffer, Policy());
496     test_negative(&ManagerAsync::saveData,
497                   CKM_API_ERROR_DB_ALIAS_EXISTS,
498                   dbc.alias("alias"),
499                   test_buffer,
500                   Policy());
501 }
502
503 RUNNER_CHILD_TEST(TA0250_save_data_positive)
504 {
505     switch_to_storage_user(TEST_LABEL);
506
507     DBCleanup dbc;
508     test_positive(&ManagerAsync::saveData, dbc.alias("alias"), test_buffer, Policy());
509 }
510
511
512 // removeKey
513 RUNNER_CHILD_TEST(TA0310_remove_alias_invalid_param)
514 {
515     switch_to_storage_user(TEST_LABEL);
516
517     test_no_observer(&ManagerAsync::removeAlias, "alias");
518     test_invalid_param(&ManagerAsync::removeAlias, "");
519 }
520
521 RUNNER_CHILD_TEST(TA0330_remove_alias_unknown_alias)
522 {
523     switch_to_storage_user(TEST_LABEL);
524
525     test_negative(&ManagerAsync::removeAlias, CKM_API_ERROR_DB_ALIAS_UNKNOWN, "non-existing-alias");
526 }
527
528 RUNNER_CHILD_TEST(TA0350_remove_key_positive)
529 {
530     switch_to_storage_user(TEST_LABEL);
531
532     DBCleanup dbc;
533     test_positive(&ManagerAsync::saveKey, dbc.alias("alias"), keys[RSA][0].prv, Policy());
534     test_positive(&ManagerAsync::removeAlias, dbc.alias("alias"));
535 }
536
537
538 RUNNER_CHILD_TEST(TA0450_remove_cert_positive)
539 {
540     switch_to_storage_user(TEST_LABEL);
541
542     DBCleanup dbc;
543     test_positive(&ManagerAsync::saveCertificate, dbc.alias("alias"), certs[0], Policy());
544     test_positive(&ManagerAsync::removeAlias, dbc.alias("alias"));
545 }
546
547
548 RUNNER_CHILD_TEST(TA0550_remove_data_positive)
549 {
550     switch_to_storage_user(TEST_LABEL);
551
552     DBCleanup dbc;
553     test_positive(&ManagerAsync::saveData, dbc.alias("alias"), test_buffer, Policy());
554     test_positive(&ManagerAsync::removeAlias, dbc.alias("alias"));
555 }
556
557
558 // getKey
559 RUNNER_CHILD_TEST(TA0610_get_key_invalid_param)
560 {
561     switch_to_storage_user(TEST_LABEL);
562
563     test_no_observer(&ManagerAsync::getKey, "alias", "");
564     test_invalid_param(&ManagerAsync::getKey, "", "");
565 }
566
567 RUNNER_CHILD_TEST(TA0630_get_key_unknown_alias)
568 {
569     switch_to_storage_user(TEST_LABEL);
570
571     test_negative(&ManagerAsync::getKey, CKM_API_ERROR_DB_ALIAS_UNKNOWN, "non-existing-alias", "");
572 }
573
574 RUNNER_CHILD_TEST(TA0640_get_key_wrong_password)
575 {
576     switch_to_storage_user(TEST_LABEL);
577
578     DBCleanup dbc;
579     test_positive(&ManagerAsync::saveKey, dbc.alias("alias"), keys[RSA][0].prv, Policy("password"));
580     test_negative(&ManagerAsync::getKey,
581                   CKM_API_ERROR_SERVER_ERROR,
582                   dbc.alias("alias"),
583                   "wrong-password");
584 }
585
586 RUNNER_CHILD_TEST(TA0650_get_key_positive)
587 {
588     switch_to_storage_user(TEST_LABEL);
589
590     DBCleanup dbc;
591     test_positive(&ManagerAsync::saveKey, dbc.alias("alias"), keys[RSA][0].prv, Policy("password"));
592     test_positive(&ManagerAsync::getKey, dbc.alias("alias"), "password");
593 }
594
595
596 // getCertificate
597 RUNNER_CHILD_TEST(TA0710_get_cert_invalid_param)
598 {
599     switch_to_storage_user(TEST_LABEL);
600
601     test_no_observer(&ManagerAsync::getCertificate, "alias", "");
602     test_invalid_param(&ManagerAsync::getCertificate, "", "");
603 }
604
605 RUNNER_CHILD_TEST(TA0730_get_cert_unknown_alias)
606 {
607     switch_to_storage_user(TEST_LABEL);
608
609     test_negative(&ManagerAsync::getCertificate,
610                   CKM_API_ERROR_DB_ALIAS_UNKNOWN,
611                   "non-existing-alias",
612                   "");
613 }
614
615 RUNNER_CHILD_TEST(TA0740_get_cert_wrong_password)
616 {
617     switch_to_storage_user(TEST_LABEL);
618
619     DBCleanup dbc;
620     test_positive(&ManagerAsync::saveCertificate,
621                   dbc.alias("alias"),
622                   certs[0],
623                   Policy("password"));
624     test_negative(&ManagerAsync::getCertificate,
625                   CKM_API_ERROR_SERVER_ERROR,
626                   dbc.alias("alias"),
627                   "wrong-password");
628 }
629
630 RUNNER_CHILD_TEST(TA0750_get_cert_positive)
631 {
632     switch_to_storage_user(TEST_LABEL);
633
634     DBCleanup dbc;
635     test_positive(&ManagerAsync::saveCertificate, dbc.alias("alias"), certs[0], Policy("password"));
636     test_positive(&ManagerAsync::getCertificate, dbc.alias("alias"), "password");
637 }
638
639
640 // getData
641 RUNNER_CHILD_TEST(TA0810_get_data_invalid_param)
642 {
643     switch_to_storage_user(TEST_LABEL);
644
645     test_no_observer(&ManagerAsync::getData, "alias", "");
646     test_invalid_param(&ManagerAsync::getData, "", "");
647 }
648
649 RUNNER_CHILD_TEST(TA0830_get_data_unknown_alias)
650 {
651     switch_to_storage_user(TEST_LABEL);
652
653     test_negative(&ManagerAsync::getData, CKM_API_ERROR_DB_ALIAS_UNKNOWN, "non-existing-alias", "");
654 }
655
656 RUNNER_CHILD_TEST(TA0840_get_data_wrong_password)
657 {
658     switch_to_storage_user(TEST_LABEL);
659
660     DBCleanup dbc;
661     test_positive(&ManagerAsync::saveData, dbc.alias("alias"), test_buffer, Policy("password"));
662     test_negative(&ManagerAsync::getData,
663                   CKM_API_ERROR_SERVER_ERROR,
664                   dbc.alias("alias"),
665                   "wrong-password");
666 }
667
668 RUNNER_CHILD_TEST(TA0850_get_data_positive)
669 {
670     switch_to_storage_user(TEST_LABEL);
671
672     DBCleanup dbc;
673     test_positive(&ManagerAsync::saveData, dbc.alias("alias"), test_buffer, Policy("password"));
674     test_positive(&ManagerAsync::getData, dbc.alias("alias"), "password");
675 }
676
677
678 // getKeyAliasVector
679 RUNNER_CHILD_TEST(TA0910_get_key_alias_vector_invalid_param)
680 {
681     switch_to_storage_user(TEST_LABEL);
682
683     test_no_observer(&ManagerAsync::getKeyAliasVector);
684 }
685
686 RUNNER_CHILD_TEST(TA0950_get_key_alias_vector_positive)
687 {
688     switch_to_storage_user(TEST_LABEL);
689
690     DBCleanup dbc;
691     test_positive(&ManagerAsync::saveKey, dbc.alias("alias1"), keys[RSA][0].prv, Policy());
692     test_check_aliases(&ManagerAsync::getKeyAliasVector, { format_full_label_alias(std::string(TEST_LABEL), Alias(dbc.alias("alias1"))) });
693
694     test_positive(&ManagerAsync::saveKey, dbc.alias("alias2"), keys[DSA][0].prv, Policy());
695     test_check_aliases(&ManagerAsync::getKeyAliasVector, { format_full_label_alias(std::string(TEST_LABEL), Alias(dbc.alias("alias1"))),
696                                                            format_full_label_alias(std::string(TEST_LABEL), Alias(dbc.alias("alias2"))) });
697
698     test_positive(&ManagerAsync::removeAlias, dbc.alias("alias1"));
699     test_check_aliases(&ManagerAsync::getKeyAliasVector, { format_full_label_alias(std::string(TEST_LABEL), Alias(dbc.alias("alias2"))) });
700 }
701
702
703 // getCertificateAliasVector
704 RUNNER_CHILD_TEST(TA1010_get_cert_alias_vector_invalid_param)
705 {
706     switch_to_storage_user(TEST_LABEL);
707
708     test_no_observer(&ManagerAsync::getCertificateAliasVector);
709 }
710
711 RUNNER_CHILD_TEST(TA1050_get_cert_alias_vector_positive)
712 {
713     switch_to_storage_user(TEST_LABEL);
714
715     DBCleanup dbc;
716     test_positive(&ManagerAsync::saveCertificate, dbc.alias("alias1"), certs[0], Policy());
717     test_check_aliases(&ManagerAsync::getCertificateAliasVector, { format_full_label_alias(std::string(TEST_LABEL), Alias(dbc.alias("alias1"))) });
718
719     test_positive(&ManagerAsync::saveCertificate, dbc.alias("alias2"), certs[1], Policy());
720     test_check_aliases(&ManagerAsync::getCertificateAliasVector, { format_full_label_alias(std::string(TEST_LABEL), Alias(dbc.alias("alias1"))),
721                                                                    format_full_label_alias(std::string(TEST_LABEL), Alias(dbc.alias("alias2"))) });
722
723     test_positive(&ManagerAsync::removeAlias, dbc.alias("alias1"));
724     test_check_aliases(&ManagerAsync::getCertificateAliasVector, { format_full_label_alias(std::string(TEST_LABEL), Alias(dbc.alias("alias2"))) });
725 }
726
727
728 // getDataAliasVector
729 RUNNER_CHILD_TEST(TA1110_get_data_alias_vector_invalid_param)
730 {
731     switch_to_storage_user(TEST_LABEL);
732
733     test_no_observer(&ManagerAsync::getDataAliasVector);
734 }
735
736 RUNNER_CHILD_TEST(TA1150_get_data_alias_vector_positive)
737 {
738     switch_to_storage_user(TEST_LABEL);
739
740     DBCleanup dbc;
741     test_positive(&ManagerAsync::saveData, dbc.alias("alias1"), test_buffer, Policy());
742     test_check_aliases(&ManagerAsync::getDataAliasVector, { format_full_label_alias(std::string(TEST_LABEL), Alias(dbc.alias("alias1"))) });
743
744     test_positive(&ManagerAsync::saveData, dbc.alias("alias2"), test_buffer, Policy());
745     test_check_aliases(&ManagerAsync::getDataAliasVector, { format_full_label_alias(std::string(TEST_LABEL), Alias(dbc.alias("alias1"))),
746                                                             format_full_label_alias(std::string(TEST_LABEL), Alias(dbc.alias("alias2"))) });
747
748     test_positive(&ManagerAsync::removeAlias, dbc.alias("alias1"));
749     test_check_aliases(&ManagerAsync::getDataAliasVector, { format_full_label_alias(std::string(TEST_LABEL), Alias(dbc.alias("alias2"))) });
750 }
751
752
753 // createKeyPairRSA
754 RUNNER_CHILD_TEST(TA1210_create_key_pair_rsa_invalid_param)
755 {
756     switch_to_storage_user(TEST_LABEL);
757
758     test_no_observer(&ManagerAsync::createKeyPairRSA,
759                      1024,
760                      "alias_prv",
761                      "alias_pub",
762                      Policy(),
763                      Policy());
764 }
765
766 RUNNER_CHILD_TEST(TA1220_create_key_pair_rsa_already_exists)
767 {
768     switch_to_storage_user(TEST_LABEL);
769
770     DBCleanup dbc;
771     test_positive(&ManagerAsync::saveKey, dbc.alias("alias_prv"), keys[RSA][0].prv, Policy());
772     test_negative(&ManagerAsync::createKeyPairRSA,
773                   CKM_API_ERROR_DB_ALIAS_EXISTS,
774                   1024,
775                   dbc.alias("alias_prv"),
776                   dbc.alias("alias_pub"),
777                   Policy(),
778                   Policy());
779 }
780
781 RUNNER_CHILD_TEST(TA1250_create_key_pair_rsa_positive)
782 {
783     switch_to_storage_user(TEST_LABEL);
784
785     DBCleanup dbc;
786     test_positive(&ManagerAsync::createKeyPairRSA,
787                   1024,
788                   dbc.alias("alias_prv"),
789                   dbc.alias("alias_pub"),
790                   Policy(),
791                   Policy());
792
793     test_check_aliases(&ManagerAsync::getKeyAliasVector, { format_full_label_alias(std::string(TEST_LABEL), Alias(dbc.alias("alias_prv"))),
794                                                            format_full_label_alias(std::string(TEST_LABEL), Alias(dbc.alias("alias_pub"))) });
795 }
796
797 // createKeyPairDSA
798 RUNNER_CHILD_TEST(TA1270_create_key_pair_dsa_invalid_param)
799 {
800     switch_to_storage_user(TEST_LABEL);
801
802     test_no_observer(&ManagerAsync::createKeyPairDSA,
803                      1024,
804                      "alias_prv",
805                      "alias_pub",
806                      Policy(),
807                      Policy());
808 }
809
810 RUNNER_CHILD_TEST(TA1280_create_key_pair_dsa_already_exists)
811 {
812     switch_to_storage_user(TEST_LABEL);
813
814     DBCleanup dbc;
815     test_positive(&ManagerAsync::saveKey, dbc.alias("alias_prv"), keys[DSA][0].prv, Policy());
816     test_negative(&ManagerAsync::createKeyPairDSA,
817                   CKM_API_ERROR_DB_ALIAS_EXISTS,
818                   1024,
819                   dbc.alias("alias_prv"),
820                   dbc.alias("alias_pub"),
821                   Policy(),
822                   Policy());
823 }
824
825 RUNNER_CHILD_TEST(TA1290_create_key_pair_dsa_positive)
826 {
827     switch_to_storage_user(TEST_LABEL);
828
829     DBCleanup dbc;
830     test_positive(&ManagerAsync::createKeyPairDSA,
831                   1024,
832                   dbc.alias("alias_prv"),
833                   dbc.alias("alias_pub"),
834                   Policy(),
835                   Policy());
836
837     test_check_aliases(&ManagerAsync::getKeyAliasVector, { format_full_label_alias(std::string(TEST_LABEL), Alias(dbc.alias("alias_prv"))),
838                                                            format_full_label_alias(std::string(TEST_LABEL), Alias(dbc.alias("alias_pub"))) });
839 }
840
841 // createKeyPairECDSA
842 RUNNER_CHILD_TEST(TA1310_create_key_pair_ecdsa_invalid_param)
843 {
844     switch_to_storage_user(TEST_LABEL);
845
846     test_no_observer(&ManagerAsync::createKeyPairECDSA,
847                      ElipticCurve::prime192v1,
848                      "alias_prv",
849                      "alias_pub",
850                      Policy(),
851                      Policy());
852 }
853
854 RUNNER_CHILD_TEST(TA1320_create_key_pair_ecdsa_already_exists)
855 {
856     switch_to_storage_user(TEST_LABEL);
857
858     DBCleanup dbc;
859     test_positive(&ManagerAsync::saveKey, dbc.alias("alias_prv"), keys[ECDSA][0].prv, Policy());
860     test_negative(&ManagerAsync::createKeyPairECDSA,
861                   CKM_API_ERROR_DB_ALIAS_EXISTS,
862                   ElipticCurve::prime192v1,
863                   dbc.alias("alias_prv"),
864                   dbc.alias("alias_pub"),
865                   Policy(),
866                   Policy());
867 }
868
869 RUNNER_CHILD_TEST(TA1350_create_key_pair_ecdsa_positive)
870 {
871     switch_to_storage_user(TEST_LABEL);
872
873     DBCleanup dbc;
874     test_positive(&ManagerAsync::createKeyPairECDSA,
875                   ElipticCurve::prime192v1,
876                   dbc.alias("alias_prv"),
877                   dbc.alias("alias_pub"),
878                   Policy(),
879                   Policy());
880
881     test_check_aliases(&ManagerAsync::getKeyAliasVector, { format_full_label_alias(std::string(TEST_LABEL), Alias(dbc.alias("alias_prv"))),
882                                                            format_full_label_alias(std::string(TEST_LABEL), Alias(dbc.alias("alias_pub"))) });
883 }
884
885
886 // getCertificateChain
887 RUNNER_CHILD_TEST(TA1410_get_certificate_chain_invalid_param)
888 {
889     switch_to_storage_user(TEST_LABEL);
890
891     CertificateShPtr cert = certs[0];
892     CertificateShPtrVector certv = { certs[1] };
893     test_no_observer<certChainFn1>(&ManagerAsync::getCertificateChain, cert, certv);
894     test_invalid_param<certChainFn1>(&ManagerAsync::getCertificateChain,
895                                      CertificateShPtr(),
896                                      certv);
897     test_invalid_param<certChainFn1>(&ManagerAsync::getCertificateChain,
898                                      cert,
899                                      CertificateShPtrVector());
900
901     Alias alias = "alias";
902     AliasVector aliasv = { alias };
903     test_no_observer<certChainFn2>(&ManagerAsync::getCertificateChain, cert, aliasv);
904     test_invalid_param<certChainFn2>(&ManagerAsync::getCertificateChain,
905                                      CertificateShPtr(),
906                                      aliasv);
907     test_invalid_param<certChainFn2>(&ManagerAsync::getCertificateChain, cert, AliasVector());
908 }
909
910 RUNNER_CHILD_TEST(TA1420_get_certificate_chain_negative)
911 {
912     switch_to_storage_user(TEST_LABEL);
913
914     DBCleanup dbc;
915     CertificateShPtr cert = certs[0];
916     CertificateShPtrVector certv = { certs[0] };
917     test_negative<certChainFn1>(&ManagerAsync::getCertificateChain,
918                                 CKM_API_ERROR_VERIFICATION_FAILED,
919                                 cert,
920                                 certv);
921     AliasVector aliasv = { dbc.alias("alias") };
922     test_positive(&ManagerAsync::saveCertificate, aliasv[0], certs[0], Policy());
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", Permission::READ_REMOVE);
1173     test_invalid_param(&ManagerAsync::setPermission, "", "accessor", Permission::READ_REMOVE);
1174     test_invalid_param(&ManagerAsync::setPermission, "alias", "", Permission::READ_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                   Permission::READ);
1188     test_positive(&ManagerAsync::setPermission,
1189                   dbc.alias("alias3"),
1190                   TEST_LABEL,
1191                   Permission::READ_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                   Permission::READ_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 RUNNER_TEST(TA9999_deinit)
1244 {
1245     int temp;
1246     ControlShPtr control = Control::create();
1247     RUNNER_ASSERT_MSG(CKM_API_SUCCESS == (temp = control->lockUserKey(APP_UID)),
1248                          "Error=" << ErrorToString(temp));
1249     RUNNER_ASSERT_MSG(CKM_API_SUCCESS == (temp = control->removeUserData(APP_UID)),
1250                          "Error=" << ErrorToString(temp));
1251 }