15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/x509_util.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/ref_counted.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/scoped_ptr.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "crypto/rsa_private_key.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/x509_certificate.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace x509_util {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(X509UtilTest, SortClientCertificates) {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CertificateList certs;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::Time now = base::Time::Now();
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::TimeDelta five_days = base::TimeDelta::FromDays(5);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  certs.push_back(scoped_refptr<X509Certificate>(NULL));
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  certs.push_back(new X509Certificate(
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "expired", "expired",
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Time::UnixEpoch(), base::Time::UnixEpoch()));
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  certs.push_back(new X509Certificate(
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "not yet valid", "not yet valid",
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Time::Max(), base::Time::Max()));
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  certs.push_back(new X509Certificate(
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "older cert", "older cert",
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      now - five_days, now + five_days));
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  certs.push_back(scoped_refptr<X509Certificate>(NULL));
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  certs.push_back(new X509Certificate(
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "newer cert", "newer cert",
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      now - base::TimeDelta::FromDays(3), now + five_days));
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::sort(certs.begin(), certs.end(), ClientCertSorter());
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(certs[0].get());
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("newer cert", certs[0]->subject().common_name);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(certs[1].get());
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("older cert", certs[1]->subject().common_name);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(certs[2].get());
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("not yet valid", certs[2]->subject().common_name);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(certs[3].get());
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("expired", certs[3]->subject().common_name);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(certs[4].get());
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(certs[5].get());
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// This test creates a self-signed cert and a private key and then verifies the
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// content of the certificate.
570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)TEST(X509UtilTest, CreateKeyAndSelfSigned) {
580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<crypto::RSAPrivateKey> private_key;
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::string der_cert;
610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ASSERT_TRUE(x509_util::CreateKeyAndSelfSignedCert(
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "CN=subject",
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      1,
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Time::Now(),
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Time::Now() + base::TimeDelta::FromDays(1),
660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      &private_key,
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      &der_cert));
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ASSERT_TRUE(private_key.get());
700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_refptr<X509Certificate> cert(X509Certificate::CreateFromBytes(
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      der_cert.data(), der_cert.size()));
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(cert.get());
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("subject", cert->subject().GetDisplayName());
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(cert->HasExpired());
770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// This test creates a self-signed cert from a private key and then verifies the
800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// content of the certificate.
810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)TEST(X509UtilTest, CreateSelfSigned) {
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const uint8 private_key_info[] = {
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x30, 0x82, 0x02, 0x78, 0x02, 0x01, 0x00, 0x30,
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x02, 0x62, 0x30, 0x82, 0x02, 0x5e, 0x02, 0x01,
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x00, 0x02, 0x81, 0x81, 0x00, 0xb8, 0x7f, 0x2b,
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x20, 0xdc, 0x7c, 0x9b, 0x0c, 0xdc, 0x51, 0x61,
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x99, 0x0d, 0x36, 0x0f, 0xd4, 0x66, 0x88, 0x08,
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x55, 0x84, 0xd5, 0x3a, 0xbf, 0x2b, 0xa4, 0x64,
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x85, 0x7b, 0x0c, 0x04, 0x13, 0x3f, 0x8d, 0xf4,
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xbc, 0x38, 0x0d, 0x49, 0xfe, 0x6b, 0xc4, 0x5a,
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xb0, 0x40, 0x53, 0x3a, 0xd7, 0x66, 0x09, 0x0f,
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x9e, 0x36, 0x74, 0x30, 0xda, 0x8a, 0x31, 0x4f,
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x1f, 0x14, 0x50, 0xd7, 0xc7, 0x20, 0x94, 0x17,
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xde, 0x4e, 0xb9, 0x57, 0x5e, 0x7e, 0x0a, 0xe5,
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xb2, 0x65, 0x7a, 0x89, 0x4e, 0xb6, 0x47, 0xff,
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x1c, 0xbd, 0xb7, 0x38, 0x13, 0xaf, 0x47, 0x85,
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x84, 0x32, 0x33, 0xf3, 0x17, 0x49, 0xbf, 0xe9,
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x96, 0xd0, 0xd6, 0x14, 0x6f, 0x13, 0x8d, 0xc5,
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xfc, 0x2c, 0x72, 0xba, 0xac, 0xea, 0x7e, 0x18,
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x53, 0x56, 0xa6, 0x83, 0xa2, 0xce, 0x93, 0x93,
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xe7, 0x1f, 0x0f, 0xe6, 0x0f, 0x02, 0x03, 0x01,
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x00, 0x01, 0x02, 0x81, 0x80, 0x03, 0x61, 0x89,
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x37, 0xcb, 0xf2, 0x98, 0xa0, 0xce, 0xb4, 0xcb,
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x16, 0x13, 0xf0, 0xe6, 0xaf, 0x5c, 0xc5, 0xa7,
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x69, 0x71, 0xca, 0xba, 0x8d, 0xe0, 0x4d, 0xdd,
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xed, 0xb8, 0x48, 0x8b, 0x16, 0x93, 0x36, 0x95,
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xc2, 0x91, 0x40, 0x65, 0x17, 0xbd, 0x7f, 0xd6,
110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xad, 0x9e, 0x30, 0x28, 0x46, 0xe4, 0x3e, 0xcc,
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x43, 0x78, 0xf9, 0xfe, 0x1f, 0x33, 0x23, 0x1e,
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x31, 0x12, 0x9d, 0x3c, 0xa7, 0x08, 0x82, 0x7b,
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x7d, 0x25, 0x4e, 0x5e, 0x19, 0xa8, 0x9b, 0xed,
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x86, 0xb2, 0xcb, 0x3c, 0xfe, 0x4e, 0xa1, 0xfa,
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x62, 0x87, 0x3a, 0x17, 0xf7, 0x60, 0xec, 0x38,
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x29, 0xe8, 0x4f, 0x34, 0x9f, 0x76, 0x9d, 0xee,
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xa3, 0xf6, 0x85, 0x6b, 0x84, 0x43, 0xc9, 0x1e,
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x01, 0xff, 0xfd, 0xd0, 0x29, 0x4c, 0xfa, 0x8e,
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x57, 0x0c, 0xc0, 0x71, 0xa5, 0xbb, 0x88, 0x46,
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x29, 0x5c, 0xc0, 0x4f, 0x01, 0x02, 0x41, 0x00,
121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xf5, 0x83, 0xa4, 0x64, 0x4a, 0xf2, 0xdd, 0x8c,
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x2c, 0xed, 0xa8, 0xd5, 0x60, 0x5a, 0xe4, 0xc7,
123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xcc, 0x61, 0xcd, 0x38, 0x42, 0x20, 0xd3, 0x82,
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x18, 0xf2, 0x35, 0x00, 0x72, 0x2d, 0xf7, 0x89,
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x80, 0x67, 0xb5, 0x93, 0x05, 0x5f, 0xdd, 0x42,
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xba, 0x16, 0x1a, 0xea, 0x15, 0xc6, 0xf0, 0xb8,
127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x8c, 0xbc, 0xbf, 0x54, 0x9e, 0xf1, 0xc1, 0xb2,
128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xb3, 0x8b, 0xb6, 0x26, 0x02, 0x30, 0xc4, 0x81,
129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x02, 0x41, 0x00, 0xc0, 0x60, 0x62, 0x80, 0xe1,
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x22, 0x78, 0xf6, 0x9d, 0x83, 0x18, 0xeb, 0x72,
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x45, 0xd7, 0xc8, 0x01, 0x7f, 0xa9, 0xca, 0x8f,
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x7d, 0xd6, 0xb8, 0x31, 0x2b, 0x84, 0x7f, 0x62,
133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xd9, 0xa9, 0x22, 0x17, 0x7d, 0x06, 0x35, 0x6c,
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xf3, 0xc1, 0x94, 0x17, 0x85, 0x5a, 0xaf, 0x9c,
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x5c, 0x09, 0x3c, 0xcf, 0x2f, 0x44, 0x9d, 0xb6,
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x52, 0x68, 0x5f, 0xf9, 0x59, 0xc8, 0x84, 0x2b,
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x39, 0x22, 0x8f, 0x02, 0x41, 0x00, 0xb2, 0x04,
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xe2, 0x0e, 0x56, 0xca, 0x03, 0x1a, 0xc0, 0xf9,
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x12, 0x92, 0xa5, 0x6b, 0x42, 0xb8, 0x1c, 0xda,
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x4d, 0x93, 0x9d, 0x5f, 0x6f, 0xfd, 0xc5, 0x58,
141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xda, 0x55, 0x98, 0x74, 0xfc, 0x28, 0x17, 0x93,
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x1b, 0x75, 0x9f, 0x50, 0x03, 0x7f, 0x7e, 0xae,
143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xc8, 0x95, 0x33, 0x75, 0x2c, 0xd6, 0xa4, 0x35,
144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xb8, 0x06, 0x03, 0xba, 0x08, 0x59, 0x2b, 0x17,
145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x02, 0xdc, 0x4c, 0x7a, 0x50, 0x01, 0x02, 0x41,
146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x00, 0x9d, 0xdb, 0x39, 0x59, 0x09, 0xe4, 0x30,
147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xa0, 0x24, 0xf5, 0xdb, 0x2f, 0xf0, 0x2f, 0xf1,
148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x75, 0x74, 0x0d, 0x5e, 0xb5, 0x11, 0x73, 0xb0,
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x0a, 0xaa, 0x86, 0x4c, 0x0d, 0xff, 0x7e, 0x1d,
150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xb4, 0x14, 0xd4, 0x09, 0x91, 0x33, 0x5a, 0xfd,
151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xa0, 0x58, 0x80, 0x9b, 0xbe, 0x78, 0x2e, 0x69,
152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x82, 0x15, 0x7c, 0x72, 0xf0, 0x7b, 0x18, 0x39,
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xff, 0x6e, 0xeb, 0xc6, 0x86, 0xf5, 0xb4, 0xc7,
154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x6f, 0x02, 0x41, 0x00, 0x8d, 0x1a, 0x37, 0x0f,
155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x76, 0xc4, 0x82, 0xfa, 0x5c, 0xc3, 0x79, 0x35,
156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x3e, 0x70, 0x8a, 0xbf, 0x27, 0x49, 0xb0, 0x99,
157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x63, 0xcb, 0x77, 0x5f, 0xa8, 0x82, 0x65, 0xf6,
158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x03, 0x52, 0x51, 0xf1, 0xae, 0x2e, 0x05, 0xb3,
159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xc6, 0xa4, 0x92, 0xd1, 0xce, 0x6c, 0x72, 0xfb,
160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x21, 0xb3, 0x02, 0x87, 0xe4, 0xfd, 0x61, 0xca,
161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0x00, 0x42, 0x19, 0xf0, 0xda, 0x5a, 0x53, 0xe3,
162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    0xb1, 0xc5, 0x15, 0xf3
163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector<uint8> input;
166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  input.resize(sizeof(private_key_info));
167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  memcpy(&input.front(), private_key_info, sizeof(private_key_info));
168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_ptr<crypto::RSAPrivateKey> private_key(
1700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(input));
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(private_key.get());
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  std::string der_cert;
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(x509_util::CreateSelfSignedCert(
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      private_key.get(),
1760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      x509_util::DIGEST_SHA1,
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "CN=subject",
178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      1,
179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Time::Now(),
180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      base::Time::Now() + base::TimeDelta::FromDays(1),
181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      &der_cert));
182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_refptr<X509Certificate> cert =
1840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      X509Certificate::CreateFromBytes(der_cert.data(), der_cert.size());
185eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ASSERT_TRUE(cert.get());
186eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ("subject", cert->subject().GetDisplayName());
188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_FALSE(cert->HasExpired());
189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace x509_util
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
194