1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ppapi/tests/test_x509_certificate_private.h"
6
7#include <cmath>
8#include <limits>
9
10#include "ppapi/cpp/private/x509_certificate_private.h"
11#include "ppapi/cpp/var_array_buffer.h"
12#include "ppapi/cpp/var.h"
13#include "ppapi/tests/testing_instance.h"
14
15REGISTER_TEST_CASE(X509CertificatePrivate);
16
17namespace {
18
19bool FieldMatchesString(
20    const pp::X509CertificatePrivate& certificate,
21    PP_X509Certificate_Private_Field field,
22    const std::string& expected) {
23  pp::Var field_value = certificate.GetField(field);
24  if (!field_value.is_string())
25    return false;
26  return field_value.AsString() == expected;
27}
28
29bool FieldMatchesDouble(
30    const pp::X509CertificatePrivate& certificate,
31    PP_X509Certificate_Private_Field field,
32    double expected) {
33  pp::Var field_value = certificate.GetField(field);
34  if (!field_value.is_double())
35    return false;
36  return std::fabs(field_value.AsDouble() - expected) <=
37      std::numeric_limits<double>::epsilon();
38}
39
40bool FieldMatchesBuffer(
41    const pp::X509CertificatePrivate& certificate,
42    PP_X509Certificate_Private_Field field,
43    const char* expected,
44    uint32_t expected_length) {
45  pp::Var field_value = certificate.GetField(field);
46  if (!field_value.is_array_buffer())
47    return false;
48  pp::VarArrayBuffer array_buffer(field_value);
49  char* bytes = static_cast<char*>(array_buffer.Map());
50  uint32_t length = array_buffer.ByteLength();
51  if (length != expected_length)
52    return false;
53  return std::equal(expected, expected + expected_length, bytes);
54}
55
56bool FieldIsNull(
57    const pp::X509CertificatePrivate& certificate,
58    PP_X509Certificate_Private_Field field) {
59  return certificate.GetField(field).is_null();
60}
61
62// Google's cert.
63const unsigned char kGoogleDer[] = {
64  0x30, 0x82, 0x03, 0x21, 0x30, 0x82, 0x02, 0x8a, 0xa0, 0x03, 0x02, 0x01,
65  0x02, 0x02, 0x10, 0x01, 0x2a, 0x39, 0x76, 0x0d, 0x3f, 0x4f, 0xc9, 0x0b,
66  0xe7, 0xbd, 0x2b, 0xcf, 0x95, 0x2e, 0x7a, 0x30, 0x0d, 0x06, 0x09, 0x2a,
67  0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x4c,
68  0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x5a,
69  0x41, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c,
70  0x54, 0x68, 0x61, 0x77, 0x74, 0x65, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x75,
71  0x6c, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x50, 0x74, 0x79, 0x29, 0x20,
72  0x4c, 0x74, 0x64, 0x2e, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04,
73  0x03, 0x13, 0x0d, 0x54, 0x68, 0x61, 0x77, 0x74, 0x65, 0x20, 0x53, 0x47,
74  0x43, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x39, 0x30, 0x33,
75  0x32, 0x37, 0x32, 0x32, 0x32, 0x30, 0x30, 0x37, 0x5a, 0x17, 0x0d, 0x31,
76  0x30, 0x30, 0x33, 0x32, 0x37, 0x32, 0x32, 0x32, 0x30, 0x30, 0x37, 0x5a,
77  0x30, 0x68, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
78  0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08,
79  0x13, 0x0a, 0x43, 0x61, 0x6c, 0x69, 0x66, 0x6f, 0x72, 0x6e, 0x69, 0x61,
80  0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0d, 0x4d,
81  0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x56, 0x69, 0x65, 0x77,
82  0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x47,
83  0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x17, 0x30,
84  0x15, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0e, 0x77, 0x77, 0x77, 0x2e,
85  0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x81,
86  0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
87  0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02,
88  0x81, 0x81, 0x00, 0xd6, 0xb9, 0xe1, 0xad, 0xb8, 0x61, 0x0b, 0x1f, 0x4e,
89  0xb6, 0x3c, 0x09, 0x3d, 0xab, 0xe8, 0xe3, 0x2b, 0xb6, 0xe8, 0xa4, 0x3a,
90  0x78, 0x2f, 0xd3, 0x51, 0x20, 0x22, 0x45, 0x95, 0xd8, 0x00, 0x91, 0x33,
91  0x9a, 0xa7, 0xa2, 0x48, 0xea, 0x30, 0x57, 0x26, 0x97, 0x66, 0xc7, 0x5a,
92  0xef, 0xf1, 0x9b, 0x0c, 0x3f, 0xe1, 0xb9, 0x7f, 0x7b, 0xc3, 0xc7, 0xcc,
93  0xaf, 0x9c, 0xd0, 0x1f, 0x3c, 0x81, 0x15, 0x10, 0x58, 0xfc, 0x06, 0xb3,
94  0xbf, 0xbc, 0x9c, 0x02, 0xb9, 0x51, 0xdc, 0xfb, 0xa6, 0xb9, 0x17, 0x42,
95  0xe6, 0x46, 0xe7, 0x22, 0xcf, 0x6c, 0x27, 0x10, 0xfe, 0x54, 0xe6, 0x92,
96  0x6c, 0x0c, 0x60, 0x76, 0x9a, 0xce, 0xf8, 0x7f, 0xac, 0xb8, 0x5a, 0x08,
97  0x4a, 0xdc, 0xb1, 0x64, 0xbd, 0xa0, 0x74, 0x41, 0xb2, 0xac, 0x8f, 0x86,
98  0x9d, 0x1a, 0xde, 0x58, 0x09, 0xfd, 0x6c, 0x0a, 0x25, 0xe0, 0x79, 0x02,
99  0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xe7, 0x30, 0x81, 0xe4, 0x30, 0x28,
100  0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x21, 0x30, 0x1f, 0x06, 0x08, 0x2b,
101  0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x06, 0x08, 0x2b, 0x06, 0x01,
102  0x05, 0x05, 0x07, 0x03, 0x02, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86,
103  0xf8, 0x42, 0x04, 0x01, 0x30, 0x36, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04,
104  0x2f, 0x30, 0x2d, 0x30, 0x2b, 0xa0, 0x29, 0xa0, 0x27, 0x86, 0x25, 0x68,
105  0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x74, 0x68,
106  0x61, 0x77, 0x74, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x68, 0x61,
107  0x77, 0x74, 0x65, 0x53, 0x47, 0x43, 0x43, 0x41, 0x2e, 0x63, 0x72, 0x6c,
108  0x30, 0x72, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01,
109  0x04, 0x66, 0x30, 0x64, 0x30, 0x22, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05,
110  0x05, 0x07, 0x30, 0x01, 0x86, 0x16, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
111  0x2f, 0x6f, 0x63, 0x73, 0x70, 0x2e, 0x74, 0x68, 0x61, 0x77, 0x74, 0x65,
112  0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x3e, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05,
113  0x05, 0x07, 0x30, 0x02, 0x86, 0x32, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
114  0x2f, 0x77, 0x77, 0x77, 0x2e, 0x74, 0x68, 0x61, 0x77, 0x74, 0x65, 0x2e,
115  0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f,
116  0x72, 0x79, 0x2f, 0x54, 0x68, 0x61, 0x77, 0x74, 0x65, 0x5f, 0x53, 0x47,
117  0x43, 0x5f, 0x43, 0x41, 0x2e, 0x63, 0x72, 0x74, 0x30, 0x0c, 0x06, 0x03,
118  0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x02, 0x30, 0x00, 0x30, 0x0d,
119  0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05,
120  0x00, 0x03, 0x81, 0x81, 0x00, 0x39, 0xb6, 0xfb, 0x11, 0xbc, 0x33, 0x2c,
121  0xc3, 0x90, 0x48, 0xe3, 0x6e, 0xc3, 0x9b, 0x38, 0xb1, 0x42, 0xd1, 0x00,
122  0x09, 0x58, 0x63, 0xa0, 0xe1, 0x98, 0x1c, 0x85, 0xf2, 0xef, 0x10, 0x1d,
123  0x60, 0x4e, 0x51, 0x09, 0x62, 0xf5, 0x05, 0xbd, 0x9d, 0x4f, 0x87, 0x6c,
124  0x98, 0x72, 0x07, 0x80, 0xc3, 0x59, 0x48, 0x14, 0xe2, 0xd6, 0xef, 0xd0,
125  0x8f, 0x33, 0x6a, 0x68, 0x31, 0xfa, 0xb7, 0xbb, 0x85, 0xcc, 0xf7, 0xc7,
126  0x47, 0x7b, 0x67, 0x93, 0x3c, 0xc3, 0x16, 0x51, 0x9b, 0x6f, 0x87, 0x20,
127  0xfd, 0x67, 0x4c, 0x2b, 0xea, 0x6a, 0x49, 0xdb, 0x11, 0xd1, 0xbd, 0xd7,
128  0x95, 0x22, 0x43, 0x7a, 0x06, 0x7b, 0x4e, 0xf6, 0x37, 0x8e, 0xa2, 0xb9,
129  0xcf, 0x1f, 0xa5, 0xd2, 0xbd, 0x3b, 0x04, 0x97, 0x39, 0xb3, 0x0f, 0xfa,
130  0x38, 0xb5, 0xaf, 0x55, 0x20, 0x88, 0x60, 0x93, 0xf2, 0xde, 0xdb, 0xff,
131  0xdf
132};
133
134}  // namespace
135
136TestX509CertificatePrivate::TestX509CertificatePrivate(
137    TestingInstance* instance)
138    : TestCase(instance) {
139}
140
141bool TestX509CertificatePrivate::Init() {
142  if (!pp::X509CertificatePrivate::IsAvailable())
143    return false;
144
145  return true;
146}
147
148void TestX509CertificatePrivate::RunTests(const std::string& filter) {
149  RUN_TEST_FORCEASYNC_AND_NOT(ValidCertificate, filter);
150  RUN_TEST_FORCEASYNC_AND_NOT(InvalidCertificate, filter);
151}
152
153std::string TestX509CertificatePrivate::TestValidCertificate() {
154  pp::X509CertificatePrivate certificate(instance_);
155  bool successful = certificate.Initialize(
156      reinterpret_cast<const char*>(kGoogleDer), sizeof(kGoogleDer));
157  ASSERT_TRUE(successful);
158
159  ASSERT_TRUE(FieldMatchesString(certificate,
160      PP_X509CERTIFICATE_PRIVATE_SUBJECT_COMMON_NAME, "www.google.com"));
161  ASSERT_TRUE(FieldMatchesString(certificate,
162      PP_X509CERTIFICATE_PRIVATE_SUBJECT_LOCALITY_NAME, "Mountain View"));
163  ASSERT_TRUE(FieldMatchesString(certificate,
164      PP_X509CERTIFICATE_PRIVATE_SUBJECT_STATE_OR_PROVINCE_NAME, "California"));
165  ASSERT_TRUE(FieldMatchesString(certificate,
166      PP_X509CERTIFICATE_PRIVATE_SUBJECT_COUNTRY_NAME, "US"));
167  ASSERT_TRUE(FieldMatchesString(certificate,
168      PP_X509CERTIFICATE_PRIVATE_SUBJECT_ORGANIZATION_NAME, "Google Inc"));
169  ASSERT_TRUE(FieldMatchesString(
170      certificate,
171      PP_X509CERTIFICATE_PRIVATE_SUBJECT_ORGANIZATION_UNIT_NAME,
172      std::string()));
173
174  ASSERT_TRUE(FieldMatchesString(certificate,
175      PP_X509CERTIFICATE_PRIVATE_ISSUER_COMMON_NAME, "Thawte SGC CA"));
176  ASSERT_TRUE(
177      FieldMatchesString(certificate,
178                         PP_X509CERTIFICATE_PRIVATE_ISSUER_LOCALITY_NAME,
179                         std::string()));
180  ASSERT_TRUE(FieldMatchesString(
181      certificate,
182      PP_X509CERTIFICATE_PRIVATE_ISSUER_STATE_OR_PROVINCE_NAME,
183      std::string()));
184  ASSERT_TRUE(FieldMatchesString(
185      certificate, PP_X509CERTIFICATE_PRIVATE_ISSUER_COUNTRY_NAME, "ZA"));
186  ASSERT_TRUE(FieldMatchesString(certificate,
187      PP_X509CERTIFICATE_PRIVATE_ISSUER_ORGANIZATION_NAME,
188      "Thawte Consulting (Pty) Ltd."));
189  ASSERT_TRUE(FieldMatchesString(
190      certificate,
191      PP_X509CERTIFICATE_PRIVATE_ISSUER_ORGANIZATION_UNIT_NAME,
192      std::string()));
193
194  ASSERT_FALSE(FieldIsNull(certificate,
195      PP_X509CERTIFICATE_PRIVATE_SERIAL_NUMBER));
196  ASSERT_TRUE(FieldMatchesDouble(certificate,
197      PP_X509CERTIFICATE_PRIVATE_VALIDITY_NOT_BEFORE, 1238192407));
198  ASSERT_TRUE(FieldMatchesDouble(certificate,
199      PP_X509CERTIFICATE_PRIVATE_VALIDITY_NOT_AFTER, 1269728407));
200  ASSERT_TRUE(FieldMatchesBuffer(certificate,
201      PP_X509CERTIFICATE_PRIVATE_RAW,
202      reinterpret_cast<const char*>(kGoogleDer), sizeof(kGoogleDer)));
203
204  // Check unimplemented fields return null.
205  ASSERT_TRUE(FieldIsNull(certificate,
206      PP_X509CERTIFICATE_PRIVATE_SUBJECT_UNIQUE_ID));
207  ASSERT_TRUE(FieldIsNull(certificate,
208      PP_X509CERTIFICATE_PRIVATE_ISSUER_UNIQUE_ID));
209  ASSERT_TRUE(FieldIsNull(certificate,
210      PP_X509CERTIFICATE_PRIVATE_SUBJECT_DISTINGUISHED_NAME));
211  ASSERT_TRUE(FieldIsNull(certificate,
212      PP_X509CERTIFICATE_PRIVATE_ISSUER_DISTINGUISHED_NAME));
213  ASSERT_TRUE(FieldIsNull(certificate,
214      PP_X509CERTIFICATE_PRIVATE_VERSION));
215  ASSERT_TRUE(FieldIsNull(certificate,
216      PP_X509CERTIFICATE_PRIVATE_SIGNATURE_ALGORITHM_OID));
217  ASSERT_TRUE(FieldIsNull(certificate,
218      PP_X509CERTIFICATE_PRIVATE_SIGNATURE_ALGORITHM_PARAMATERS_RAW));
219  ASSERT_TRUE(FieldIsNull(certificate,
220      PP_X509CERTIFICATE_PRIVATE_SUBJECT_PUBLIC_KEY));
221
222  PASS();
223}
224
225std::string TestX509CertificatePrivate::TestInvalidCertificate() {
226  bool successful;
227  pp::X509CertificatePrivate null_certificate(instance_);
228  successful = null_certificate.Initialize(NULL, 0);
229  ASSERT_FALSE(successful);
230
231  pp::X509CertificatePrivate bad_certificate(instance_);
232  successful = bad_certificate.Initialize("acbde", 0);
233  ASSERT_FALSE(successful);
234
235  PASS();
236}
237