1/*
2 * Copyright (C) 2018 Sony Interactive Entertainment Inc.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "config.h"
27
28#if USE(CURL)
29
30#include "WTFStringUtilities.h"
31#include <WebKit/WKCertificateInfo.h>
32#include <WebKit/WKCertificateInfoCurl.h>
33#include <WebKit/WKRetainPtr.h>
34#include <WebKit/WKSharedAPICast.h>
35
36using namespace WebCore;
37
38namespace TestWebKitAPI {
39
40namespace Curl {
41
42static const char* PEM1 =
43 "-----BEGIN CERTIFICATE-----\n"
44 "MIIBsjCCAVygAwIBAgIJALO5qdAF7ldHMA0GCSqGSIb3DQEBCwUAMDMxCzAJBgNV\n"
45 "BAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMQ8wDQYDVQQKDAZXZWJLaXQwHhcN\n"
46 "MTgxMTE2MDEwMDM4WhcNMjgwODE1MDEwMDM4WjAzMQswCQYDVQQGEwJVUzETMBEG\n"
47 "A1UECAwKQ2FsaWZvcm5pYTEPMA0GA1UECgwGV2ViS2l0MFwwDQYJKoZIhvcNAQEB\n"
48 "BQADSwAwSAJBAOfoq7BspXakZ1EFEIkw+PqcX0KkichT0DK/6ghxdbcS5TDGnUOM\n"
49 "rfYhnI/vzKMcrvOXmqyYRGj7FwthWkX9FfMCAwEAAaNTMFEwHQYDVR0OBBYEFArX\n"
50 "jKITLym24m6IwYv6F5Gg5yw3MB8GA1UdIwQYMBaAFArXjKITLym24m6IwYv6F5Gg\n"
51 "5yw3MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADQQC8pO97bNmeMb0P\n"
52 "m+Yvc7eI6Vu2eXpNUIUSHHn7f+Hj584ZeG7gMgCeJqlEeFs9zM3uQMhn4+Nd7pDa\n"
53 "GdGdcOzA\n"
54 "-----END CERTIFICATE-----\n";
55
56static const char* PEM2 =
57 "-----BEGIN CERTIFICATE-----\n"
58 "MIIBVDCB/wIJAPATaMb5RLofMA0GCSqGSIb3DQEBCwUAMDMxCzAJBgNVBAYTAlVT\n"
59 "MRMwEQYDVQQIDApDYWxpZm9ybmlhMQ8wDQYDVQQKDAZXZWJLaXQwHhcNMTgxMTE2\n"
60 "MDEwNDAxWhcNMjgxMTEzMDEwNDAxWjAwMQswCQYDVQQGEwJKUDEOMAwGA1UECAwF\n"
61 "VG9reW8xETAPBgNVBAoMCFdlYktpdEpQMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJB\n"
62 "AK9SYK8fewlFAFU9EMnE6zQSNlqVMhaKiaxBFK8qdoK5iFdEffC+4may1sdSujNr\n"
63 "m4uOGBpgTMcjeDWjorItMMECAwEAATANBgkqhkiG9w0BAQsFAANBACsY4D8ieDvJ\n"
64 "gdTpbzgAqF0YyNGbWAWQ75ELVhZS3RJgwV5jTe+wc7zB12BIyzexoHzzlWpqU6Y5\n"
65 "iA28XceqQR0=\n"
66 "-----END CERTIFICATE-----\n";
67
68static auto makeCertificateInfo(std::vector<const char*> pems)
69{
70 auto certificateChain = adoptWK(WKMutableArrayCreate());
71
72 for (auto pem : pems) {
73 auto data = adoptWK(WKDataCreate(reinterpret_cast<const uint8_t*>(pem), std::strlen(pem)));
74 WKArrayAppendItem(certificateChain.get(), data.get());
75 }
76
77 return WKCertificateInfoCreateWithCertficateChain(certificateChain.get());
78}
79
80static bool isSamePEM(WKDataRef data, const char* pem)
81{
82 size_t size = std::strlen(pem);
83 if (size != WKDataGetSize(data))
84 return false;
85
86 return !std::memcmp(WKDataGetBytes(data), pem, size);
87}
88
89TEST(Curl, CertificateAPI)
90{
91 auto certificateInfo = adoptWK(makeCertificateInfo({ PEM1, PEM2 }));
92
93 auto size = WKCertificateInfoGetCertificateChainSize(certificateInfo.get());
94 ASSERT_EQ(size, 2);
95 ASSERT_TRUE(isSamePEM(WKCertificateInfoCopyCertificateAtIndex(certificateInfo.get(), 0), PEM1));
96 ASSERT_TRUE(isSamePEM(WKCertificateInfoCopyCertificateAtIndex(certificateInfo.get(), 1), PEM2));
97}
98
99}
100
101} // namespace TestWebKitAPI
102
103#endif // USE(CURL)