1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "crypto/signature_verifier.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h"
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(SignatureVerifierTest, BasicTest) {
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The input data in this test comes from real certificates.
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // tbs_certificate ("to-be-signed certificate", the part of a certificate
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // that is signed), signature_algorithm, and algorithm come from the
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // certificate of bugs.webkit.org.
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // public_key_info comes from the certificate of the issuer, Go Daddy Secure
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Certification Authority.
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The bytes in the array initializers are formatted to expose the DER
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // encoding of the ASN.1 structures.
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The data that is signed is the following ASN.1 structure:
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //    TBSCertificate  ::=  SEQUENCE  {
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //        ...  -- omitted, not important
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //        }
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const uint8 tbs_certificate[1017] = {
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x30, 0x82, 0x03, 0xf5,  // a SEQUENCE of length 1013 (0x3f5)
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x03, 0x43, 0xdd, 0x63, 0x30, 0x0d,
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05,
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x00, 0x30, 0x81, 0xca, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55,
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x04, 0x08, 0x13, 0x07, 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31,
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x53, 0x63,
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x1a, 0x30, 0x18,
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, 0x47, 0x6f, 0x44, 0x61, 0x64,
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e,
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x31, 0x33, 0x30, 0x31, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2a, 0x68,
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66,
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64,
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73,
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x69, 0x74, 0x6f, 0x72, 0x79, 0x31, 0x30, 0x30, 0x2e, 0x06, 0x03, 0x55,
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x04, 0x03, 0x13, 0x27, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, 0x79,
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74,
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75,
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x11, 0x30, 0x0f, 0x06,
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x03, 0x55, 0x04, 0x05, 0x13, 0x08, 0x30, 0x37, 0x39, 0x36, 0x39, 0x32,
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x38, 0x37, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x30, 0x33, 0x31, 0x38,
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x32, 0x33, 0x33, 0x35, 0x31, 0x39, 0x5a, 0x17, 0x0d, 0x31, 0x31, 0x30,
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x33, 0x31, 0x38, 0x32, 0x33, 0x33, 0x35, 0x31, 0x39, 0x5a, 0x30, 0x79,
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55,
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a,
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x43, 0x61, 0x6c, 0x69, 0x66, 0x6f, 0x72, 0x6e, 0x69, 0x61, 0x31, 0x12,
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x09, 0x43, 0x75, 0x70,
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x65, 0x72, 0x74, 0x69, 0x6e, 0x6f, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03,
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x55, 0x04, 0x0a, 0x13, 0x0a, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x49,
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x6e, 0x63, 0x2e, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0b,
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x13, 0x0c, 0x4d, 0x61, 0x63, 0x20, 0x4f, 0x53, 0x20, 0x46, 0x6f, 0x72,
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x67, 0x65, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x0c, 0x2a, 0x2e, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2e, 0x6f, 0x72,
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x67, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30,
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xa7, 0x62, 0x79, 0x41, 0xda, 0x28,
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0xf2, 0xc0, 0x4f, 0xe0, 0x25, 0xaa, 0xa1, 0x2e, 0x3b, 0x30, 0x94, 0xb5,
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0xc9, 0x26, 0x3a, 0x1b, 0xe2, 0xd0, 0xcc, 0xa2, 0x95, 0xe2, 0x91, 0xc0,
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0xf0, 0x40, 0x9e, 0x27, 0x6e, 0xbd, 0x6e, 0xde, 0x7c, 0xb6, 0x30, 0x5c,
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0xb8, 0x9b, 0x01, 0x2f, 0x92, 0x04, 0xa1, 0xef, 0x4a, 0xb1, 0x6c, 0xb1,
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x7e, 0x8e, 0xcd, 0xa6, 0xf4, 0x40, 0x73, 0x1f, 0x2c, 0x96, 0xad, 0xff,
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x2a, 0x6d, 0x0e, 0xba, 0x52, 0x84, 0x83, 0xb0, 0x39, 0xee, 0xc9, 0x39,
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0xdc, 0x1e, 0x34, 0xd0, 0xd8, 0x5d, 0x7a, 0x09, 0xac, 0xa9, 0xee, 0xca,
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x65, 0xf6, 0x85, 0x3a, 0x6b, 0xee, 0xe4, 0x5c, 0x5e, 0xf8, 0xda, 0xd1,
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0xce, 0x88, 0x47, 0xcd, 0x06, 0x21, 0xe0, 0xb9, 0x4b, 0xe4, 0x07, 0xcb,
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x57, 0xdc, 0xca, 0x99, 0x54, 0xf7, 0x0e, 0xd5, 0x17, 0x95, 0x05, 0x2e,
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0xe9, 0xb1, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0xce, 0x30,
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x82, 0x01, 0xca, 0x30, 0x09, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x02,
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x30, 0x00, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03,
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x02, 0x05, 0xa0, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x16,
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x30, 0x14, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01,
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02, 0x30, 0x57,
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x50, 0x30, 0x4e, 0x30, 0x4c, 0xa0,
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x4a, 0xa0, 0x48, 0x86, 0x46, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73,
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d,
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f,
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x65, 0x78, 0x74, 0x65, 0x6e,
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x64, 0x65, 0x64, 0x69, 0x73, 0x73, 0x75, 0x69, 0x6e, 0x67, 0x33, 0x2e,
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x63, 0x72, 0x6c, 0x30, 0x52, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x4b,
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x30, 0x49, 0x30, 0x47, 0x06, 0x0b, 0x60, 0x86, 0x48, 0x01, 0x86, 0xfd,
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x6d, 0x01, 0x07, 0x17, 0x02, 0x30, 0x38, 0x30, 0x36, 0x06, 0x08, 0x2b,
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x2a, 0x68, 0x74, 0x74,
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x61, 0x74, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79,
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74,
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x6f, 0x72, 0x79, 0x30, 0x7f, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05,
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x07, 0x01, 0x01, 0x04, 0x73, 0x30, 0x71, 0x30, 0x23, 0x06, 0x08, 0x2b,
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x17, 0x68, 0x74, 0x74,
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x70, 0x3a, 0x2f, 0x2f, 0x6f, 0x63, 0x73, 0x70, 0x2e, 0x67, 0x6f, 0x64,
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x4a, 0x06, 0x08,
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x3e, 0x68, 0x74,
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64,
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69,
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x74, 0x6f, 0x72, 0x79, 0x2f, 0x67, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x65,
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x2e, 0x63, 0x72, 0x74,
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x48,
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0xdf, 0x60, 0x32, 0xcc, 0x89, 0x01, 0xb6, 0xdc, 0x2f, 0xe3, 0x73, 0xb5,
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x9c, 0x16, 0x58, 0x32, 0x68, 0xa9, 0xc3, 0x30, 0x1f, 0x06, 0x03, 0x55,
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xfd, 0xac, 0x61, 0x32,
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x93, 0x6c, 0x45, 0xd6, 0xe2, 0xee, 0x85, 0x5f, 0x9a, 0xba, 0xe7, 0x76,
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x99, 0x68, 0xcc, 0xe7, 0x30, 0x23, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04,
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x1c, 0x30, 0x1a, 0x82, 0x0c, 0x2a, 0x2e, 0x77, 0x65, 0x62, 0x6b, 0x69,
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x74, 0x2e, 0x6f, 0x72, 0x67, 0x82, 0x0a, 0x77, 0x65, 0x62, 0x6b, 0x69,
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x74, 0x2e, 0x6f, 0x72, 0x67
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The signature algorithm is specified as the following ASN.1 structure:
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //    AlgorithmIdentifier  ::=  SEQUENCE  {
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //        algorithm               OBJECT IDENTIFIER,
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //        parameters              ANY DEFINED BY algorithm OPTIONAL  }
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const uint8 signature_algorithm[15] = {
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x30, 0x0d,  // a SEQUENCE of length 13 (0xd)
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      0x06, 0x09,  // an OBJECT IDENTIFIER of length 9
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        // 1.2.840.113549.1.1.5 - sha1WithRSAEncryption
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05,
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      0x05, 0x00,  // a NULL of length 0
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // RSA signature, a big integer in the big-endian byte order.
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const uint8 signature[256] = {
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x1e, 0x6a, 0xe7, 0xe0, 0x4f, 0xe7, 0x4d, 0xd0, 0x69, 0x7c, 0xf8, 0x8f,
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x99, 0xb4, 0x18, 0x95, 0x36, 0x24, 0x0f, 0x0e, 0xa3, 0xea, 0x34, 0x37,
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0xf4, 0x7d, 0xd5, 0x92, 0x35, 0x53, 0x72, 0x76, 0x3f, 0x69, 0xf0, 0x82,
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x56, 0xe3, 0x94, 0x7a, 0x1d, 0x1a, 0x81, 0xaf, 0x9f, 0xc7, 0x43, 0x01,
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x64, 0xd3, 0x7c, 0x0d, 0xc8, 0x11, 0x4e, 0x4a, 0xe6, 0x1a, 0xc3, 0x01,
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x74, 0xe8, 0x35, 0x87, 0x5c, 0x61, 0xaa, 0x8a, 0x46, 0x06, 0xbe, 0x98,
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x95, 0x24, 0x9e, 0x01, 0xe3, 0xe6, 0xa0, 0x98, 0xee, 0x36, 0x44, 0x56,
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x8d, 0x23, 0x9c, 0x65, 0xea, 0x55, 0x6a, 0xdf, 0x66, 0xee, 0x45, 0xe8,
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0xa0, 0xe9, 0x7d, 0x9a, 0xba, 0x94, 0xc5, 0xc8, 0xc4, 0x4b, 0x98, 0xff,
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x9a, 0x01, 0x31, 0x6d, 0xf9, 0x2b, 0x58, 0xe7, 0xe7, 0x2a, 0xc5, 0x4d,
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0xbb, 0xbb, 0xcd, 0x0d, 0x70, 0xe1, 0xad, 0x03, 0xf5, 0xfe, 0xf4, 0x84,
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x71, 0x08, 0xd2, 0xbc, 0x04, 0x7b, 0x26, 0x1c, 0xa8, 0x0f, 0x9c, 0xd8,
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x12, 0x6a, 0x6f, 0x2b, 0x67, 0xa1, 0x03, 0x80, 0x9a, 0x11, 0x0b, 0xe9,
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0xe0, 0xb5, 0xb3, 0xb8, 0x19, 0x4e, 0x0c, 0xa4, 0xd9, 0x2b, 0x3b, 0xc2,
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0xca, 0x20, 0xd3, 0x0c, 0xa4, 0xff, 0x93, 0x13, 0x1f, 0xfc, 0xba, 0x94,
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x93, 0x8c, 0x64, 0x15, 0x2e, 0x28, 0xa9, 0x55, 0x8c, 0x2c, 0x48, 0xd3,
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0xd3, 0xc1, 0x50, 0x69, 0x19, 0xe8, 0x34, 0xd3, 0xf1, 0x04, 0x9f, 0x0a,
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x7a, 0x21, 0x87, 0xbf, 0xb9, 0x59, 0x37, 0x2e, 0xf4, 0x71, 0xa5, 0x3e,
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0xbe, 0xcd, 0x70, 0x83, 0x18, 0xf8, 0x8a, 0x72, 0x85, 0x45, 0x1f, 0x08,
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x01, 0x6f, 0x37, 0xf5, 0x2b, 0x7b, 0xea, 0xb9, 0x8b, 0xa3, 0xcc, 0xfd,
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x35, 0x52, 0xdd, 0x66, 0xde, 0x4f, 0x30, 0xc5, 0x73, 0x81, 0xb6, 0xe8,
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x3c, 0xd8, 0x48, 0x8a
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The public key is specified as the following ASN.1 structure:
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //   SubjectPublicKeyInfo  ::=  SEQUENCE  {
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //       algorithm            AlgorithmIdentifier,
156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  //       subjectPublicKey     BIT STRING  }
157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const uint8 public_key_info[294] = {
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    0x30, 0x82, 0x01, 0x22,  // a SEQUENCE of length 290 (0x122)
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      // algorithm
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      0x30, 0x0d,  // a SEQUENCE of length 13
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        0x06, 0x09,  // an OBJECT IDENTIFIER of length 9
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,
163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        0x05, 0x00,  // a NULL of length 0
164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      // subjectPublicKey
165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      0x03, 0x82, 0x01, 0x0f,  // a BIT STRING of length 271 (0x10f)
166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        0x00,  // number of unused bits
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        0x30, 0x82, 0x01, 0x0a,  // a SEQUENCE of length 266 (0x10a)
168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          // modulus
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          0x02, 0x82, 0x01, 0x01,  // an INTEGER of length 257 (0x101)
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0x00, 0xc4, 0x2d, 0xd5, 0x15, 0x8c, 0x9c, 0x26, 0x4c, 0xec,
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0x32, 0x35, 0xeb, 0x5f, 0xb8, 0x59, 0x01, 0x5a, 0xa6, 0x61,
172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0x81, 0x59, 0x3b, 0x70, 0x63, 0xab, 0xe3, 0xdc, 0x3d, 0xc7,
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0x2a, 0xb8, 0xc9, 0x33, 0xd3, 0x79, 0xe4, 0x3a, 0xed, 0x3c,
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0x30, 0x23, 0x84, 0x8e, 0xb3, 0x30, 0x14, 0xb6, 0xb2, 0x87,
175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0xc3, 0x3d, 0x95, 0x54, 0x04, 0x9e, 0xdf, 0x99, 0xdd, 0x0b,
176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0x25, 0x1e, 0x21, 0xde, 0x65, 0x29, 0x7e, 0x35, 0xa8, 0xa9,
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0x54, 0xeb, 0xf6, 0xf7, 0x32, 0x39, 0xd4, 0x26, 0x55, 0x95,
178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0xad, 0xef, 0xfb, 0xfe, 0x58, 0x86, 0xd7, 0x9e, 0xf4, 0x00,
179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0x8d, 0x8c, 0x2a, 0x0c, 0xbd, 0x42, 0x04, 0xce, 0xa7, 0x3f,
180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0x04, 0xf6, 0xee, 0x80, 0xf2, 0xaa, 0xef, 0x52, 0xa1, 0x69,
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0x66, 0xda, 0xbe, 0x1a, 0xad, 0x5d, 0xda, 0x2c, 0x66, 0xea,
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0x1a, 0x6b, 0xbb, 0xe5, 0x1a, 0x51, 0x4a, 0x00, 0x2f, 0x48,
183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0xc7, 0x98, 0x75, 0xd8, 0xb9, 0x29, 0xc8, 0xee, 0xf8, 0x66,
184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0x6d, 0x0a, 0x9c, 0xb3, 0xf3, 0xfc, 0x78, 0x7c, 0xa2, 0xf8,
185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0xa3, 0xf2, 0xb5, 0xc3, 0xf3, 0xb9, 0x7a, 0x91, 0xc1, 0xa7,
186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0xe6, 0x25, 0x2e, 0x9c, 0xa8, 0xed, 0x12, 0x65, 0x6e, 0x6a,
187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0xf6, 0x12, 0x44, 0x53, 0x70, 0x30, 0x95, 0xc3, 0x9c, 0x2b,
188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0x58, 0x2b, 0x3d, 0x08, 0x74, 0x4a, 0xf2, 0xbe, 0x51, 0xb0,
189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0xbf, 0x87, 0xd0, 0x4c, 0x27, 0x58, 0x6b, 0xb5, 0x35, 0xc5,
190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0x9d, 0xaf, 0x17, 0x31, 0xf8, 0x0b, 0x8f, 0xee, 0xad, 0x81,
191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0x36, 0x05, 0x89, 0x08, 0x98, 0xcf, 0x3a, 0xaf, 0x25, 0x87,
192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0xc0, 0x49, 0xea, 0xa7, 0xfd, 0x67, 0xf7, 0x45, 0x8e, 0x97,
193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0xcc, 0x14, 0x39, 0xe2, 0x36, 0x85, 0xb5, 0x7e, 0x1a, 0x37,
194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0xfd, 0x16, 0xf6, 0x71, 0x11, 0x9a, 0x74, 0x30, 0x16, 0xfe,
195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            0x13, 0x94, 0xa3, 0x3f, 0x84, 0x0d, 0x4f,
196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          // public exponent
197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          0x02, 0x03,  // an INTEGER of length 3
198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott             0x01, 0x00, 0x01
199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // We use the signature verifier to perform four signature verification
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // tests.
203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  crypto::SignatureVerifier verifier;
204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool ok;
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test 1: feed all of the data to the verifier at once (a single
207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // VerifyUpdate call).
208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ok = verifier.VerifyInit(signature_algorithm,
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                           sizeof(signature_algorithm),
210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                           signature, sizeof(signature),
211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                           public_key_info, sizeof(public_key_info));
212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ok);
213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  verifier.VerifyUpdate(tbs_certificate, sizeof(tbs_certificate));
214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ok = verifier.VerifyFinal();
215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ok);
216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test 2: feed the data to the verifier in three parts (three VerifyUpdate
218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // calls).
219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ok = verifier.VerifyInit(signature_algorithm,
220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                           sizeof(signature_algorithm),
221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                           signature, sizeof(signature),
222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                           public_key_info, sizeof(public_key_info));
223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ok);
224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  verifier.VerifyUpdate(tbs_certificate,       256);
225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  verifier.VerifyUpdate(tbs_certificate + 256, 256);
226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  verifier.VerifyUpdate(tbs_certificate + 512, sizeof(tbs_certificate) - 512);
227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ok = verifier.VerifyFinal();
228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ok);
229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test 3: verify the signature with incorrect data.
231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  uint8 bad_tbs_certificate[sizeof(tbs_certificate)];
232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  memcpy(bad_tbs_certificate, tbs_certificate, sizeof(tbs_certificate));
233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bad_tbs_certificate[10] += 1;  // Corrupt one byte of the data.
234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ok = verifier.VerifyInit(signature_algorithm,
235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                           sizeof(signature_algorithm),
236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                           signature, sizeof(signature),
237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                           public_key_info, sizeof(public_key_info));
238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ok);
239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  verifier.VerifyUpdate(bad_tbs_certificate, sizeof(bad_tbs_certificate));
240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ok = verifier.VerifyFinal();
241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Purify disables digital signature verification, causing the Windows
243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // CryptoAPI function CryptVerifySignature to always succeed.  So we can't
244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // check the signature verification results of the negative tests when
245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // running inside Purify.  See http://crbug.com/10031.
246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef PURIFY
247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(ok);
248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test 4: verify a bad signature.
251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  uint8 bad_signature[sizeof(signature)];
252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  memcpy(bad_signature, signature, sizeof(signature));
253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bad_signature[10] += 1;  // Corrupt one byte of the signature.
254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ok = verifier.VerifyInit(signature_algorithm,
255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                           sizeof(signature_algorithm),
256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                           bad_signature, sizeof(bad_signature),
257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                           public_key_info, sizeof(public_key_info));
258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // A crypto library (e.g., NSS) may detect that the signature is corrupted
260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // and cause VerifyInit to return false, so it is fine for 'ok' to be false.
261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (ok) {
262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    verifier.VerifyUpdate(tbs_certificate, sizeof(tbs_certificate));
263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ok = verifier.VerifyFinal();
264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef PURIFY
265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_FALSE(ok);
266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
269