Fix internal tests
[platform/core/security/cert-svc.git] / tests / vcore / TestCases.cpp
1 /*
2  *
3  * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4  *
5  *    Licensed under the Apache License, Version 2.0 (the "License");
6  *    you may not use this file except in compliance with the License.
7  *    You may obtain a copy of the License at
8  *
9  *        http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *    Unless required by applicable law or agreed to in writing, software
12  *    distributed under the License is distributed on an "AS IS" BASIS,
13  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *    See the License for the specific language governing permissions and
15  *    limitations under the License.
16  */
17 #include <string>
18
19 #include <dpl/test/test_runner.h>
20 #include <vcore/SignatureFinder.h>
21 #include <vcore/SignatureValidator.h>
22 #include "TestEnv.h"
23
24 namespace {
25
26 const std::string widget_path =
27     "/usr/apps/widget/tests/vcore_widget_uncompressed/";
28 const std::string widget_negative_hash_path =
29     "/usr/apps/widget/tests/vcore_widget_uncompressed_negative_hash/";
30 const std::string widget_negative_signature_path =
31     "/usr/apps/widget/tests/vcore_widget_uncompressed_negative_signature/";
32 const std::string widget_negative_certificate_path =
33     "/usr/apps/widget/tests/vcore_widget_uncompressed_negative_certificate/";
34 const std::string widget_partner_path =
35     "/usr/apps/widget/tests/vcore_widget_uncompressed_partner/";
36 const std::string widget_partner_operator_path =
37     "/usr/apps/widget/tests/vcore_widget_uncompressed_partner_operator/";
38
39 const std::string googleCA =
40 "MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG"
41 "A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz"
42 "cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2"
43 "MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV"
44 "BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt"
45 "YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN"
46 "ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE"
47 "BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is"
48 "I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G"
49 "CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do"
50 "lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc"
51 "AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k";
52
53 const std::string google2nd =
54 "MIIDIzCCAoygAwIBAgIEMAAAAjANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJV"
55 "UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1BgNVBAsTLkNsYXNzIDMgUHVi"
56 "bGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNTEzMDAw"
57 "MDAwWhcNMTQwNTEyMjM1OTU5WjBMMQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhh"
58 "d3RlIENvbnN1bHRpbmcgKFB0eSkgTHRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBD"
59 "QTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1NNn0I0Vf67NMf59HZGhPwtx"
60 "PKzMyGT7Y/wySweUvW+Aui/hBJPAM/wJMyPpC3QrccQDxtLN4i/1CWPN/0ilAL/g"
61 "5/OIty0y3pg25gqtAHvEZEo7hHUD8nCSfQ5i9SGraTaEMXWQ+L/HbIgbBpV8yeWo"
62 "3nWhLHpo39XKHIdYYBkCAwEAAaOB/jCB+zASBgNVHRMBAf8ECDAGAQH/AgEAMAsG"
63 "A1UdDwQEAwIBBjARBglghkgBhvhCAQEEBAMCAQYwKAYDVR0RBCEwH6QdMBsxGTAX"
64 "BgNVBAMTEFByaXZhdGVMYWJlbDMtMTUwMQYDVR0fBCowKDAmoCSgIoYgaHR0cDov"
65 "L2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwMgYIKwYBBQUHAQEEJjAkMCIGCCsG"
66 "AQUFBzABhhZodHRwOi8vb2NzcC50aGF3dGUuY29tMDQGA1UdJQQtMCsGCCsGAQUF"
67 "BwMBBggrBgEFBQcDAgYJYIZIAYb4QgQBBgpghkgBhvhFAQgBMA0GCSqGSIb3DQEB"
68 "BQUAA4GBAFWsY+reod3SkF+fC852vhNRj5PZBSvIG3dLrWlQoe7e3P3bB+noOZTc"
69 "q3J5Lwa/q4FwxKjt6lM07e8eU9kGx1Yr0Vz00YqOtCuxN5BICEIlxT6Ky3/rbwTR"
70 "bcV0oveifHtgPHfNDs5IAn8BL7abN+AqKjbc1YXWrOU/VG+WHgWv";
71
72 const std::string google3rd =
73 "MIIDIjCCAougAwIBAgIQK59+5colpiUUIEeCdTqbuTANBgkqhkiG9w0BAQUFADBM"
74 "MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg"
75 "THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0xMTEwMjYwMDAwMDBaFw0x"
76 "MzA5MzAyMzU5NTlaMGkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlh"
77 "MRYwFAYDVQQHFA1Nb3VudGFpbiBWaWV3MRMwEQYDVQQKFApHb29nbGUgSW5jMRgw"
78 "FgYDVQQDFA9tYWlsLmdvb2dsZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ"
79 "AoGBAK85FZho5JL+T0/xu/8NLrD+Jaq9aARnJ+psQ0ynbcvIj36B7ocmJRASVDOe"
80 "qj2bj46Ss0sB4/lKKcMP/ay300yXKT9pVc9wgwSvLgRudNYPFwn+niAkJOPHaJys"
81 "Eb2S5LIbCfICMrtVGy0WXzASI+JMSo3C2j/huL/3OrGGvvDFAgMBAAGjgecwgeQw"
82 "DAYDVR0TAQH/BAIwADA2BgNVHR8ELzAtMCugKaAnhiVodHRwOi8vY3JsLnRoYXd0"
83 "ZS5jb20vVGhhd3RlU0dDQ0EuY3JsMCgGA1UdJQQhMB8GCCsGAQUFBwMBBggrBgEF"
84 "BQcDAgYJYIZIAYb4QgQBMHIGCCsGAQUFBwEBBGYwZDAiBggrBgEFBQcwAYYWaHR0"
85 "cDovL29jc3AudGhhd3RlLmNvbTA+BggrBgEFBQcwAoYyaHR0cDovL3d3dy50aGF3"
86 "dGUuY29tL3JlcG9zaXRvcnkvVGhhd3RlX1NHQ19DQS5jcnQwDQYJKoZIhvcNAQEF"
87 "BQADgYEANYARzVI+hCn7wSjhIOUCj19xZVgdYnJXPOZeJWHTy60i+NiBpOf0rnzZ"
88 "wW2qkw1iB5/yZ0eZNDNPPQJ09IHWOAgh6OKh+gVBnJzJ+fPIo+4NpddQVF4vfXm3"
89 "fgp8tuIsqK7+lNfNFjBxBKqeecPStiSnJavwSI4vw6e7UN0Pz7A=";
90
91 const std::string certVerisign =
92 "MIIG+DCCBeCgAwIBAgIQU9K++SSnJF6DygHkbKokdzANBgkqhkiG9w0BAQUFADCB"
93 "vjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL"
94 "ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2Ug"
95 "YXQgaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JwYSAoYykwNjE4MDYGA1UEAxMv"
96 "VmVyaVNpZ24gQ2xhc3MgMyBFeHRlbmRlZCBWYWxpZGF0aW9uIFNTTCBTR0MgQ0Ew"
97 "HhcNMTAwNTI2MDAwMDAwWhcNMTIwNTI1MjM1OTU5WjCCASkxEzARBgsrBgEEAYI3"
98 "PAIBAxMCVVMxGTAXBgsrBgEEAYI3PAIBAhMIRGVsYXdhcmUxGzAZBgNVBA8TElYx"
99 "LjAsIENsYXVzZSA1LihiKTEQMA4GA1UEBRMHMjQ5Nzg4NjELMAkGA1UEBhMCVVMx"
100 "DjAMBgNVBBEUBTk0MDQzMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHFA1N"
101 "b3VudGFpbiBWaWV3MSIwIAYDVQQJFBk0ODcgRWFzdCBNaWRkbGVmaWVsZCBSb2Fk"
102 "MRcwFQYDVQQKFA5WZXJpU2lnbiwgSW5jLjEmMCQGA1UECxQdIFByb2R1Y3Rpb24g"
103 "U2VjdXJpdHkgU2VydmljZXMxGTAXBgNVBAMUEHd3dy52ZXJpc2lnbi5jb20wggEi"
104 "MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCj+PvvK+fZOXwno0yT/OTy2Zm9"
105 "ehnZjTtO/X2IWBEa3jG30C52uHFQI4NmXiQVNvJHkBaAj0ilVjvGdxXmkyyFsugt"
106 "IWOTZ8pSKdX1tmGFIon6Ko9+lBFkVkudA1ogAUbtTB8IcdeOlpK78T4SjdVMhY18"
107 "150YzSw6hRKlw52wBaDxtGZElvOth41K7TUcaDnQVzz5SBPW5MUhi7AWrdoSk17O"
108 "BozOzmB/jkYDVDnwLcbR89SLHEOle/idSYSDQUmab3y0JS8RyQV1+DB70mnFALnD"
109 "fLiL47nMQQCGxXgp5voQ2YmSXhevKmEJ9vvtC6C7yv2W6yomfS/weUEce9pvAgMB"
110 "AAGjggKCMIICfjCBiwYDVR0RBIGDMIGAghB3d3cudmVyaXNpZ24uY29tggx2ZXJp"
111 "c2lnbi5jb22CEHd3dy52ZXJpc2lnbi5uZXSCDHZlcmlzaWduLm5ldIIRd3d3LnZl"
112 "cmlzaWduLm1vYmmCDXZlcmlzaWduLm1vYmmCD3d3dy52ZXJpc2lnbi5ldYILdmVy"
113 "aXNpZ24uZXUwCQYDVR0TBAIwADAdBgNVHQ4EFgQU8oBwK/WBXCZDWi0dbuDgPyTK"
114 "iJIwCwYDVR0PBAQDAgWgMD4GA1UdHwQ3MDUwM6AxoC+GLWh0dHA6Ly9FVkludGwt"
115 "Y3JsLnZlcmlzaWduLmNvbS9FVkludGwyMDA2LmNybDBEBgNVHSAEPTA7MDkGC2CG"
116 "SAGG+EUBBxcGMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LnZlcmlzaWduLmNv"
117 "bS9ycGEwKAYDVR0lBCEwHwYIKwYBBQUHAwEGCCsGAQUFBwMCBglghkgBhvhCBAEw"
118 "HwYDVR0jBBgwFoAUTkPIHXbvN1N6T/JYb5TzOOLVvd8wdgYIKwYBBQUHAQEEajBo"
119 "MCsGCCsGAQUFBzABhh9odHRwOi8vRVZJbnRsLW9jc3AudmVyaXNpZ24uY29tMDkG"
120 "CCsGAQUFBzAChi1odHRwOi8vRVZJbnRsLWFpYS52ZXJpc2lnbi5jb20vRVZJbnRs"
121 "MjAwNi5jZXIwbgYIKwYBBQUHAQwEYjBgoV6gXDBaMFgwVhYJaW1hZ2UvZ2lmMCEw"
122 "HzAHBgUrDgMCGgQUS2u5KJYGDLvQUjibKaxLB4shBRgwJhYkaHR0cDovL2xvZ28u"
123 "dmVyaXNpZ24uY29tL3ZzbG9nbzEuZ2lmMA0GCSqGSIb3DQEBBQUAA4IBAQB9VZxB"
124 "wDMRGyhFWYkY5rwUVGuDJiGeas2xRJC0G4+riQ7IN7pz2a2BhktmZ5HbxXL4ZEY4"
125 "yMN68DEVErhtKiuL02ng27alhlngadKQzSL8pLdmQ+3jEwm9nva5C/7pbeqy+qGF"
126 "is4IWNYOc4HKNkABxXm5v0ouys8HPNkTLFLep0gLqRXW3gYN2XbKUWMs7z7hJpkY"
127 "GxP8YQSxi513O2dWVCXB8S6erIz9E/bcfdXoCPyQdn42y3IEoJvPvBS3S55fD4+Q"
128 "Q43GPhumSg9a6S3hnyw8DX5OiUGmqgQrtSeDRsNmWqtWizEQbe+fotZpEn/7zYTa"
129 "tk1ni/k5jDH/QeuG";
130
131 } // namespace anonymous
132
133 using namespace ValidationCore;
134
135 /*
136  * test: Class SignatureFinder
137  * description: SignatureFinder should search directory passed as
138  * param of constructor.
139  * expected: Signature finder should put information about 3
140  * signture files in SinatureFileInfoSet.
141  */
142 RUNNER_TEST(test01_signature_finder)
143 {
144     SignatureFileInfoSet signatureSet;
145     SignatureFinder signatureFinder(widget_path);
146     RUNNER_ASSERT_MSG(
147         SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
148         "SignatureFinder failed");
149     RUNNER_ASSERT_MSG(signatureSet.size() == 3, "Some signature has not been found");
150
151     int count = 0;
152
153     auto iter = signatureSet.begin();
154     SignatureFileInfo fileInfo = *iter++;
155     std::string fileName = fileInfo.getFileName();
156     int fileNum = fileInfo.getFileNumber();
157     if ((fileName.find("author-signature.xml") != std::string::npos && fileNum == -1)
158         || (fileName.find("signature1.xml") != std::string::npos && fileNum == 1)
159         || (fileName.find("signature22.xml") != std::string::npos && fileNum == 22))
160         count++;
161     RUNNER_ASSERT_MSG(iter != signatureSet.end(), "There should be more items");
162
163     fileInfo = *iter++;
164     fileName = fileInfo.getFileName();
165     fileNum = fileInfo.getFileNumber();
166     if ((fileName.find("author-signature.xml") != std::string::npos && fileNum == -1)
167         || (fileName.find("signature1.xml") != std::string::npos && fileNum == 1)
168         || (fileName.find("signature22.xml") != std::string::npos && fileNum == 22))
169         count++;
170     RUNNER_ASSERT_MSG(iter != signatureSet.end(), "There should be more items");
171
172     fileInfo = *iter++;
173     fileName = fileInfo.getFileName();
174     fileNum = fileInfo.getFileNumber();
175     if ((fileName.find("author-signature.xml") != std::string::npos && fileNum == -1)
176         || (fileName.find("signature1.xml") != std::string::npos && fileNum == 1)
177         || (fileName.find("signature22.xml") != std::string::npos && fileNum == 22))
178         count++;
179     RUNNER_ASSERT_MSG(iter == signatureSet.end(), "It should be last item");
180
181     RUNNER_ASSERT_MSG(count == 3, "Wrong signature file count.");
182 }
183
184 /*
185  * test: Integration test of SignatureFinder, SignatureReader,
186  * SignatureValidator
187  * description: Directory passed to SignatureFinded constructor should be searched
188  * and 3 signature should be find. All signature should be parsed and verified.
189  * expected: Verificator should DISREGARD author signature and VERIFY
190  * distrubutor signature.
191  */
192 RUNNER_TEST(test03t01_signature_validator)
193 {
194     SignatureFileInfoSet signatureSet;
195     SignatureFinder signatureFinder(widget_path);
196     RUNNER_ASSERT_MSG(
197         SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
198         "SignatureFinder failed");
199
200     for (SignatureFileInfoSet::reverse_iterator iter = signatureSet.rbegin();
201         iter != signatureSet.rend();
202         ++iter) {
203         SignatureData data;
204         SignatureValidator::Result valResult = SignatureValidator::check(
205                 *iter,
206                 widget_path,
207                 false,
208                 true,
209                 data);
210
211         if (data.isAuthorSignature())
212             RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_DISREGARD,
213                 "Validation failed");
214         else
215             if (data.getSignatureNumber() == 1)
216                 RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_DISREGARD,
217                     "Validation failed");
218             else
219                 RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_VERIFIED,
220                     "Validation failed");
221     }
222 }
223
224 RUNNER_TEST(test03t02_signature_validator_negative_hash_input)
225 {
226     SignatureFileInfoSet signatureSet;
227     SignatureFinder signatureFinder(widget_negative_hash_path);
228     RUNNER_ASSERT_MSG(
229         SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
230         "SignatureFinder failed");
231
232     for (SignatureFileInfoSet::reverse_iterator iter = signatureSet.rbegin();
233         iter != signatureSet.rend();
234         ++iter) {
235         SignatureData data;
236         SignatureValidator::Result valResult = SignatureValidator::check(
237                 *iter,
238                 widget_negative_hash_path,
239                 false,
240                 true,
241                 data);
242         if (!data.isAuthorSignature())
243             RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_INVALID,
244                 "Wrong input file but success.. Errorcode : " << validatorErrorToString(valResult));
245         else
246             RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_DISREGARD,
247                 "Wrong input file but success.. Errorcode : " << validatorErrorToString(valResult));
248     }
249 }
250
251 RUNNER_TEST(test03t03_signature_validator_negative_signature_input)
252 {
253     SignatureFileInfoSet signatureSet;
254     SignatureFinder signatureFinder(widget_negative_signature_path);
255     RUNNER_ASSERT_MSG(
256         SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
257         "SignatureFinder failed");
258
259     for (SignatureFileInfoSet::reverse_iterator iter = signatureSet.rbegin();
260         iter != signatureSet.rend();
261         ++iter) {
262         SignatureData data;
263         SignatureValidator::Result valResult = SignatureValidator::check(
264                 *iter,
265                 widget_negative_signature_path,
266                 false,
267                 true,
268                 data);
269
270         if (!data.isAuthorSignature())
271             RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_INVALID,
272                 "Wrong input file but success.. Errorcode : " << validatorErrorToString(valResult));
273         else
274             RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_DISREGARD,
275                 "Wrong input file but success.. Errorcode : " << validatorErrorToString(valResult));
276     }
277 }
278
279 RUNNER_TEST(test03t04_signature_validator_partner)
280 {
281     SignatureFileInfoSet signatureSet;
282     SignatureFinder signatureFinder(widget_partner_path);
283     RUNNER_ASSERT_MSG(
284         SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
285         "SignatureFinder failed");
286
287     for (SignatureFileInfoSet::reverse_iterator iter = signatureSet.rbegin();
288         iter != signatureSet.rend();
289         ++iter) {
290         SignatureData data;
291         SignatureValidator::Result valResult = SignatureValidator::check(
292                 *iter,
293                 widget_partner_path,
294                 false,
295                 true,
296                 data);
297
298         RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_VERIFIED,
299             "Wrong input file but success.. Errorcode : " << validatorErrorToString(valResult));
300         if (!data.isAuthorSignature()) {
301             RUNNER_ASSERT_MSG(
302                     data.getVisibilityLevel() == CertStoreId::VIS_PARTNER,
303                     "visibility check failed.");
304         }
305     }
306 }
307 /*
308  * test: Integration test of SignatureFinder, SignatureReader,
309  * SignatureValidator
310  * description: Directory passed to SignatureFinded constructor should be searched
311  * and 3 signature should be find. All signature should be parsed and verified.
312  * expected: Verificator should DISREGARD author signature and VERIFY
313  * distrubutor signature.
314  */
315 RUNNER_TEST(test04t01_signature_validator)
316 {
317     SignatureFileInfoSet signatureSet;
318     SignatureFinder signatureFinder(widget_path);
319     RUNNER_ASSERT_MSG(
320         SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
321         "SignatureFinder failed");
322
323     for (SignatureFileInfoSet::reverse_iterator iter = signatureSet.rbegin();
324         iter != signatureSet.rend();
325         ++iter) {
326         SignatureData data;
327         SignatureValidator::Result valResult = SignatureValidator::check(
328                 *iter,
329                 widget_path,
330                 false,
331                 false,
332                 data);
333
334         if (data.isAuthorSignature())
335             RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_DISREGARD,
336                 "Validation failed");
337         else
338             if (data.getSignatureNumber() == 1)
339                 RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_DISREGARD,
340                         "Validation failed");
341             else
342                 RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_VERIFIED,
343                         "Validation failed");
344     }
345 }
346
347 RUNNER_TEST(test04t02_signature_validator_negative_hash_input)
348 {
349     SignatureFileInfoSet signatureSet;
350     SignatureFinder signatureFinder(widget_negative_hash_path);
351     RUNNER_ASSERT_MSG(
352         SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
353         "SignatureFinder failed");
354
355     for (SignatureFileInfoSet::reverse_iterator iter = signatureSet.rbegin();
356         iter != signatureSet.rend();
357         ++iter) {
358         SignatureData data;
359         SignatureValidator::Result valResult = SignatureValidator::check(
360                 *iter,
361                 widget_negative_hash_path,
362                 false,
363                 false,
364                 data);
365
366         if (!data.isAuthorSignature())
367             RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_INVALID,
368                 "Wrong input file but success.. Errorcode : " << validatorErrorToString(valResult));
369         else
370             RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_DISREGARD,
371                 "Wrong input file but success.. Errorcode : " << validatorErrorToString(valResult));
372     }
373 }
374
375 RUNNER_TEST(test04t03_signature_validator_negative_signature_input)
376 {
377     SignatureFileInfoSet signatureSet;
378     SignatureFinder signatureFinder(widget_negative_signature_path);
379     RUNNER_ASSERT_MSG(
380         SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
381         "SignatureFinder failed");
382
383     for (SignatureFileInfoSet::reverse_iterator iter = signatureSet.rbegin();
384         iter != signatureSet.rend();
385         ++iter) {
386         SignatureData data;
387         SignatureValidator::Result valResult = SignatureValidator::check(
388                 *iter,
389                 widget_negative_signature_path,
390                 false,
391                 false,
392                 data);
393
394         if (!data.isAuthorSignature())
395             RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_INVALID,
396                 "Wrong input file but success.. Errorcode : " << validatorErrorToString(valResult));
397         else
398             RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_DISREGARD,
399                 "Wrong input file but success.. Errorcode : " << validatorErrorToString(valResult));
400     }
401 }
402
403 RUNNER_TEST(test04t04_signature_validator_partner)
404 {
405     SignatureFileInfoSet signatureSet;
406     SignatureFinder signatureFinder(widget_partner_path);
407     RUNNER_ASSERT_MSG(
408         SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
409         "SignatureFinder failed");
410
411     for (SignatureFileInfoSet::reverse_iterator iter = signatureSet.rbegin();
412         iter != signatureSet.rend();
413         ++iter) {
414         SignatureData data;
415         SignatureValidator::Result valResult = SignatureValidator::check(
416                 *iter,
417                 widget_partner_path,
418                 false,
419                 false,
420                 data);
421
422         RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_VERIFIED,
423             "Wrong input file but success.. Errorcode : " << validatorErrorToString(valResult));
424
425         if (!data.isAuthorSignature())
426             RUNNER_ASSERT_MSG(data.getVisibilityLevel() == CertStoreId::VIS_PARTNER,
427                 "visibility check failed.");
428     }
429 }
430
431 /*
432  * test: Integration test of SignatureFinder, SignatureReader,
433  * SignatureValidator, ReferenceValidator
434  * description: As above but this test also checks reference from signatures.
435  * expected: All reference checks should return NO_ERROR.
436  */
437 RUNNER_TEST(test05t01_signature_reference)
438 {
439     SignatureFileInfoSet signatureSet;
440     SignatureFinder signatureFinder(widget_path);
441     RUNNER_ASSERT_MSG(
442         SignatureFinder::NO_ERROR == signatureFinder.find(signatureSet),
443         "SignatureFinder failed");
444
445     for (SignatureFileInfoSet::reverse_iterator iter = signatureSet.rbegin();
446         iter != signatureSet.rend();
447         ++iter) {
448         SignatureData data;
449         SignatureValidator::Result valResult = SignatureValidator::check(
450                 *iter,
451                 widget_path,
452                 false,
453                 false,
454                 data);
455
456         if (data.isAuthorSignature())
457             RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_DISREGARD,
458                 "Validation failed");
459         else
460             if (data.getSignatureNumber() == 1)
461                 RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_DISREGARD,
462                     "Validation failed");
463             else
464                 RUNNER_ASSERT_MSG(valResult == SignatureValidator::SIGNATURE_VERIFIED,
465                     "Validation failed");
466
467 /*
468         ReferenceValidator val(widget_path);
469         int temp = val.checkReferences(data);
470         RUNNER_ASSERT_MSG(ReferenceValidator::NO_ERROR == temp,
471                 "File[" << iter->getFileName()
472                 << "] FileNumber[" << iter->getFileNumber()
473                 << "] Errorcode : " << refValidatorErrorToString(temp));
474 */
475     }
476 }
477
478 /*
479  * test: ReferenceValidator::checkReference
480  * description: Simple test. File "encoding test.empty" exists.
481  * expected: checkReference should return NO_ERROR.
482  */
483 /*
484 RUNNER_TEST(test05t02_signature_reference_encoding_dummy)
485 {
486     ReferenceSet referenceSet;
487     SignatureData data;
488     ReferenceValidator val("/usr/apps/widget/tests/reference");
489     referenceSet.insert("encoding test.empty");
490     data.setReference(referenceSet);
491
492     int temp = val.checkReferences(data);
493     RUNNER_ASSERT_MSG(ReferenceValidator::NO_ERROR == temp,
494             "Errorcode : " << refValidatorErrorToString(temp));
495 }
496 */
497
498 /*
499  * test: ReferenceValidator::checkReference
500  * description: Negative test. File "encoding test" does not exists.
501  * expected: checkReference should return ERROR_REFERENCE_NOT_FOUND
502  */
503 /*
504 RUNNER_TEST(test05t03_signature_reference_encoding_negative)
505 {
506     ReferenceSet referenceSet;
507     SignatureData data;
508     ReferenceValidator val("/usr/apps/widget/tests/reference");
509     referenceSet.insert("encoding test");
510     data.setReference(referenceSet);
511
512     int temp = val.checkReferences(data);
513     RUNNER_ASSERT_MSG(ReferenceValidator::ERROR_REFERENCE_NOT_FOUND == temp,
514             "Errorcode : " << refValidatorErrorToString(temp));
515 }
516 */
517
518 /*
519  * test: ReferenceValidator::checkReference, ReferenceValidator::decodeProcent
520  * description: File "encoding test.empty" exists. Name set in referenceSet must
521  * be encoded first by decodeProcent function.
522  * expected: checkReference should return NO_ERROR
523  */
524 /*
525 RUNNER_TEST(test05t04_signature_reference_encoding_space)
526 {
527     ReferenceSet referenceSet;
528     SignatureData data;
529     ReferenceValidator val("/usr/apps/widget/tests/reference");
530     referenceSet.insert("encoding%20test.empty");
531     data.setReference(referenceSet);
532
533     int temp = val.checkReferences(data);
534     RUNNER_ASSERT_MSG(ReferenceValidator::NO_ERROR == temp,
535             "Errorcode : " << refValidatorErrorToString(temp));
536 }
537 */
538
539 /*
540  * test: ReferenceValidator::checkReference, ReferenceValidator::decodeProcent
541  * description: Negative test. File "encoding test" does not exists. Name set in
542  * referenceSet must be encoded first by decodeProcent function.
543  * expected: checkReference should return ERROR_REFERENCE_NOT_FOUND
544  */
545 /*
546 RUNNER_TEST(test05t05_signature_reference_encoding_space_negative)
547 {
548     ReferenceSet referenceSet;
549     SignatureData data;
550     ReferenceValidator val("/usr/apps/widget/tests/reference");
551     referenceSet.insert("encoding%20test");
552     data.setReference(referenceSet);
553
554     int temp = val.checkReferences(data);
555     RUNNER_ASSERT_MSG(ReferenceValidator::ERROR_REFERENCE_NOT_FOUND == temp,
556             "Errorcode : " << refValidatorErrorToString(temp));
557 }
558 */
559
560 /*
561  * test: ReferenceValidator::checkReference, ReferenceValidator::decodeProcent
562  * description: File "encoding test.empty" exists. Name set in
563  * referenceSet must be encoded first by decodeProcent function.
564  * expected: checkReference should return NO_ERROR
565  */
566 /*
567 RUNNER_TEST(test05t06_signature_reference_encoding)
568 {
569     ReferenceSet referenceSet;
570     SignatureData data;
571     ReferenceValidator val("/usr/apps/widget/tests/reference");
572     referenceSet.insert("e%6Ec%6Fding%20te%73%74.e%6d%70ty");
573     data.setReference(referenceSet);
574
575     int temp = val.checkReferences(data);
576     RUNNER_ASSERT_MSG(ReferenceValidator::NO_ERROR == temp,
577             "Errorcode : " << refValidatorErrorToString(temp));
578 }
579 */
580
581 /*
582  * test: ReferenceValidator::checkReference, ReferenceValidator::decodeProcent
583  * description: Negative test. "%%" is illegal combination of char. decodeProcent
584  * should throw exception.
585  * expected: checkReference should return ERROR_DECODING_URL
586  */
587 /*
588 RUNNER_TEST(test05t07_signature_reference_encoding_negative)
589 {
590     ReferenceSet referenceSet;
591     SignatureData data;
592     ReferenceValidator val("/usr/apps/widget/tests/reference");
593     referenceSet.insert("e%6Ec%6Fding%%0test%2ete%73%74");
594     data.setReference(referenceSet);
595
596     int temp = val.checkReferences(data);
597     RUNNER_ASSERT_MSG(ReferenceValidator::ERROR_DECODING_URL == temp,
598             "Errorcode : " << refValidatorErrorToString(temp));
599 }
600 */
601
602 /*
603  * test: class Certificate
604  * description: Certificate should parse data passed to object constructor.
605  * expected: Getters should be able to return certificate information.
606  */
607 RUNNER_TEST(test08t01_Certificate)
608 {
609     Certificate cert(certVerisign, Certificate::FORM_BASE64);
610     std::string result;
611
612     result = cert.getCommonName(Certificate::FIELD_SUBJECT);
613     RUNNER_ASSERT_MSG(!result.empty(), "No common name");
614     RUNNER_ASSERT_MSG(!result.compare("www.verisign.com"), "CommonName mismatch");
615
616     result = cert.getCommonName(Certificate::FIELD_ISSUER);
617     RUNNER_ASSERT_MSG(!result.empty(), "No common name");
618     RUNNER_ASSERT_MSG(!result.compare("VeriSign Class 3 Extended Validation SSL SGC CA"),
619             "CommonName mismatch");
620
621     result = cert.getCountryName();
622     RUNNER_ASSERT_MSG(!result.empty(), "No country");
623     RUNNER_ASSERT_MSG(!result.compare("US"), "Country mismatch");
624 }
625
626 /*
627  * test: Certificate::getFingerprint
628  * description: Certificate should parse data passed to object constructor.
629  * expected: Function fingerprint should return valid fingerprint.
630  */
631 RUNNER_TEST(test08t02_Certificate)
632 {
633     Certificate cert(certVerisign, Certificate::FORM_BASE64);
634
635     Certificate::Fingerprint fin =
636         cert.getFingerprint(Certificate::FINGERPRINT_SHA1);
637
638     unsigned char buff[20] = {
639         0xb9, 0x72, 0x1e, 0xd5, 0x49,
640         0xed, 0xbf, 0x31, 0x84, 0xd8,
641         0x27, 0x0c, 0xfe, 0x03, 0x11,
642         0x19, 0xdf, 0xc2, 0x2b, 0x0a};
643     RUNNER_ASSERT_MSG(fin.size() == 20, "Wrong size of fingerprint");
644
645     for (size_t i = 0; i<20; ++i) {
646         RUNNER_ASSERT_MSG(fin[i] == buff[i], "Fingerprint mismatch");
647     }
648 }
649
650 /*
651  * test: Certificate::getAlternativeNameDNS
652  * description: Certificate should parse data passed to object constructor.
653  * expected: Function getAlternativeNameDNS should return list of
654  * alternativeNames hardcoded in certificate.
655  */
656 RUNNER_TEST(test08t03_Certificate)
657 {
658     Certificate cert(certVerisign, Certificate::FORM_BASE64);
659
660     Certificate::AltNameSet nameSet = cert.getAlternativeNameDNS();
661
662     RUNNER_ASSERT(nameSet.size() == 8);
663
664     std::string str("verisign.com");
665     RUNNER_ASSERT(nameSet.find(str) != nameSet.end());
666
667     str = std::string("fake.com");
668     RUNNER_ASSERT(nameSet.find(str) == nameSet.end());
669
670 }
671
672 /*
673  * test: Certificate::isCA
674  * description: Certificate should parse data passed to object constructor.
675  * expected: 1st and 2nd certificate should be identified as CA.
676  */
677 RUNNER_TEST(test08t04_Certificate_isCA)
678 {
679     Certificate cert1(googleCA, Certificate::FORM_BASE64);
680     RUNNER_ASSERT(cert1.isCA() > 0);
681
682     Certificate cert2(google2nd, Certificate::FORM_BASE64);
683     RUNNER_ASSERT(cert2.isCA() > 0);
684
685     Certificate cert3(google3rd, Certificate::FORM_BASE64);
686     RUNNER_ASSERT(cert3.isCA() == 0);
687 }