Home | History | Annotate | Download | only in tests
      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 
     15 REGISTER_TEST_CASE(X509CertificatePrivate);
     16 
     17 namespace {
     18 
     19 bool 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 
     29 bool 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 
     40 bool 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 
     56 bool 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.
     63 const 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 
    136 TestX509CertificatePrivate::TestX509CertificatePrivate(
    137     TestingInstance* instance)
    138     : TestCase(instance) {
    139 }
    140 
    141 bool TestX509CertificatePrivate::Init() {
    142   if (!pp::X509CertificatePrivate::IsAvailable())
    143     return false;
    144 
    145   return true;
    146 }
    147 
    148 void TestX509CertificatePrivate::RunTests(const std::string& filter) {
    149   RUN_TEST_FORCEASYNC_AND_NOT(ValidCertificate, filter);
    150   RUN_TEST_FORCEASYNC_AND_NOT(InvalidCertificate, filter);
    151 }
    152 
    153 std::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 
    225 std::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