1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "crypto/signature_verifier.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
8*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Worker #include "base/numerics/safe_conversions.h"
11*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
12*6777b538SAndroid Build Coastguard Worker
TEST(SignatureVerifierTest,BasicTest)13*6777b538SAndroid Build Coastguard Worker TEST(SignatureVerifierTest, BasicTest) {
14*6777b538SAndroid Build Coastguard Worker // The input data in this test comes from real certificates.
15*6777b538SAndroid Build Coastguard Worker //
16*6777b538SAndroid Build Coastguard Worker // tbs_certificate ("to-be-signed certificate", the part of a certificate that
17*6777b538SAndroid Build Coastguard Worker // is signed), signature, and algorithm come from the certificate of
18*6777b538SAndroid Build Coastguard Worker // bugs.webkit.org.
19*6777b538SAndroid Build Coastguard Worker //
20*6777b538SAndroid Build Coastguard Worker // public_key_info comes from the certificate of the issuer, Go Daddy Secure
21*6777b538SAndroid Build Coastguard Worker // Certification Authority.
22*6777b538SAndroid Build Coastguard Worker //
23*6777b538SAndroid Build Coastguard Worker // The bytes in the array initializers are formatted to expose the DER
24*6777b538SAndroid Build Coastguard Worker // encoding of the ASN.1 structures.
25*6777b538SAndroid Build Coastguard Worker
26*6777b538SAndroid Build Coastguard Worker // The data that is signed is the following ASN.1 structure:
27*6777b538SAndroid Build Coastguard Worker // TBSCertificate ::= SEQUENCE {
28*6777b538SAndroid Build Coastguard Worker // ... -- omitted, not important
29*6777b538SAndroid Build Coastguard Worker // }
30*6777b538SAndroid Build Coastguard Worker const uint8_t tbs_certificate[1017] = {
31*6777b538SAndroid Build Coastguard Worker 0x30, 0x82, 0x03, 0xf5, // a SEQUENCE of length 1013 (0x3f5)
32*6777b538SAndroid Build Coastguard Worker 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x03, 0x43, 0xdd, 0x63, 0x30, 0x0d,
33*6777b538SAndroid Build Coastguard Worker 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05,
34*6777b538SAndroid Build Coastguard Worker 0x00, 0x30, 0x81, 0xca, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,
35*6777b538SAndroid Build Coastguard Worker 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55,
36*6777b538SAndroid Build Coastguard Worker 0x04, 0x08, 0x13, 0x07, 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31,
37*6777b538SAndroid Build Coastguard Worker 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x53, 0x63,
38*6777b538SAndroid Build Coastguard Worker 0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x1a, 0x30, 0x18,
39*6777b538SAndroid Build Coastguard Worker 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, 0x47, 0x6f, 0x44, 0x61, 0x64,
40*6777b538SAndroid Build Coastguard Worker 0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e,
41*6777b538SAndroid Build Coastguard Worker 0x31, 0x33, 0x30, 0x31, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2a, 0x68,
42*6777b538SAndroid Build Coastguard Worker 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66,
43*6777b538SAndroid Build Coastguard Worker 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64,
44*6777b538SAndroid Build Coastguard Worker 0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73,
45*6777b538SAndroid Build Coastguard Worker 0x69, 0x74, 0x6f, 0x72, 0x79, 0x31, 0x30, 0x30, 0x2e, 0x06, 0x03, 0x55,
46*6777b538SAndroid Build Coastguard Worker 0x04, 0x03, 0x13, 0x27, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, 0x79,
47*6777b538SAndroid Build Coastguard Worker 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74,
48*6777b538SAndroid Build Coastguard Worker 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75,
49*6777b538SAndroid Build Coastguard Worker 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x11, 0x30, 0x0f, 0x06,
50*6777b538SAndroid Build Coastguard Worker 0x03, 0x55, 0x04, 0x05, 0x13, 0x08, 0x30, 0x37, 0x39, 0x36, 0x39, 0x32,
51*6777b538SAndroid Build Coastguard Worker 0x38, 0x37, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x30, 0x33, 0x31, 0x38,
52*6777b538SAndroid Build Coastguard Worker 0x32, 0x33, 0x33, 0x35, 0x31, 0x39, 0x5a, 0x17, 0x0d, 0x31, 0x31, 0x30,
53*6777b538SAndroid Build Coastguard Worker 0x33, 0x31, 0x38, 0x32, 0x33, 0x33, 0x35, 0x31, 0x39, 0x5a, 0x30, 0x79,
54*6777b538SAndroid Build Coastguard Worker 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55,
55*6777b538SAndroid Build Coastguard Worker 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a,
56*6777b538SAndroid Build Coastguard Worker 0x43, 0x61, 0x6c, 0x69, 0x66, 0x6f, 0x72, 0x6e, 0x69, 0x61, 0x31, 0x12,
57*6777b538SAndroid Build Coastguard Worker 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x09, 0x43, 0x75, 0x70,
58*6777b538SAndroid Build Coastguard Worker 0x65, 0x72, 0x74, 0x69, 0x6e, 0x6f, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03,
59*6777b538SAndroid Build Coastguard Worker 0x55, 0x04, 0x0a, 0x13, 0x0a, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x49,
60*6777b538SAndroid Build Coastguard Worker 0x6e, 0x63, 0x2e, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0b,
61*6777b538SAndroid Build Coastguard Worker 0x13, 0x0c, 0x4d, 0x61, 0x63, 0x20, 0x4f, 0x53, 0x20, 0x46, 0x6f, 0x72,
62*6777b538SAndroid Build Coastguard Worker 0x67, 0x65, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,
63*6777b538SAndroid Build Coastguard Worker 0x0c, 0x2a, 0x2e, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2e, 0x6f, 0x72,
64*6777b538SAndroid Build Coastguard Worker 0x67, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
65*6777b538SAndroid Build Coastguard Worker 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30,
66*6777b538SAndroid Build Coastguard Worker 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xa7, 0x62, 0x79, 0x41, 0xda, 0x28,
67*6777b538SAndroid Build Coastguard Worker 0xf2, 0xc0, 0x4f, 0xe0, 0x25, 0xaa, 0xa1, 0x2e, 0x3b, 0x30, 0x94, 0xb5,
68*6777b538SAndroid Build Coastguard Worker 0xc9, 0x26, 0x3a, 0x1b, 0xe2, 0xd0, 0xcc, 0xa2, 0x95, 0xe2, 0x91, 0xc0,
69*6777b538SAndroid Build Coastguard Worker 0xf0, 0x40, 0x9e, 0x27, 0x6e, 0xbd, 0x6e, 0xde, 0x7c, 0xb6, 0x30, 0x5c,
70*6777b538SAndroid Build Coastguard Worker 0xb8, 0x9b, 0x01, 0x2f, 0x92, 0x04, 0xa1, 0xef, 0x4a, 0xb1, 0x6c, 0xb1,
71*6777b538SAndroid Build Coastguard Worker 0x7e, 0x8e, 0xcd, 0xa6, 0xf4, 0x40, 0x73, 0x1f, 0x2c, 0x96, 0xad, 0xff,
72*6777b538SAndroid Build Coastguard Worker 0x2a, 0x6d, 0x0e, 0xba, 0x52, 0x84, 0x83, 0xb0, 0x39, 0xee, 0xc9, 0x39,
73*6777b538SAndroid Build Coastguard Worker 0xdc, 0x1e, 0x34, 0xd0, 0xd8, 0x5d, 0x7a, 0x09, 0xac, 0xa9, 0xee, 0xca,
74*6777b538SAndroid Build Coastguard Worker 0x65, 0xf6, 0x85, 0x3a, 0x6b, 0xee, 0xe4, 0x5c, 0x5e, 0xf8, 0xda, 0xd1,
75*6777b538SAndroid Build Coastguard Worker 0xce, 0x88, 0x47, 0xcd, 0x06, 0x21, 0xe0, 0xb9, 0x4b, 0xe4, 0x07, 0xcb,
76*6777b538SAndroid Build Coastguard Worker 0x57, 0xdc, 0xca, 0x99, 0x54, 0xf7, 0x0e, 0xd5, 0x17, 0x95, 0x05, 0x2e,
77*6777b538SAndroid Build Coastguard Worker 0xe9, 0xb1, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0xce, 0x30,
78*6777b538SAndroid Build Coastguard Worker 0x82, 0x01, 0xca, 0x30, 0x09, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x02,
79*6777b538SAndroid Build Coastguard Worker 0x30, 0x00, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03,
80*6777b538SAndroid Build Coastguard Worker 0x02, 0x05, 0xa0, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x16,
81*6777b538SAndroid Build Coastguard Worker 0x30, 0x14, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01,
82*6777b538SAndroid Build Coastguard Worker 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02, 0x30, 0x57,
83*6777b538SAndroid Build Coastguard Worker 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x50, 0x30, 0x4e, 0x30, 0x4c, 0xa0,
84*6777b538SAndroid Build Coastguard Worker 0x4a, 0xa0, 0x48, 0x86, 0x46, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
85*6777b538SAndroid Build Coastguard Worker 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73,
86*6777b538SAndroid Build Coastguard Worker 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d,
87*6777b538SAndroid Build Coastguard Worker 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f,
88*6777b538SAndroid Build Coastguard Worker 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x65, 0x78, 0x74, 0x65, 0x6e,
89*6777b538SAndroid Build Coastguard Worker 0x64, 0x65, 0x64, 0x69, 0x73, 0x73, 0x75, 0x69, 0x6e, 0x67, 0x33, 0x2e,
90*6777b538SAndroid Build Coastguard Worker 0x63, 0x72, 0x6c, 0x30, 0x52, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x4b,
91*6777b538SAndroid Build Coastguard Worker 0x30, 0x49, 0x30, 0x47, 0x06, 0x0b, 0x60, 0x86, 0x48, 0x01, 0x86, 0xfd,
92*6777b538SAndroid Build Coastguard Worker 0x6d, 0x01, 0x07, 0x17, 0x02, 0x30, 0x38, 0x30, 0x36, 0x06, 0x08, 0x2b,
93*6777b538SAndroid Build Coastguard Worker 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x2a, 0x68, 0x74, 0x74,
94*6777b538SAndroid Build Coastguard Worker 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,
95*6777b538SAndroid Build Coastguard Worker 0x61, 0x74, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79,
96*6777b538SAndroid Build Coastguard Worker 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74,
97*6777b538SAndroid Build Coastguard Worker 0x6f, 0x72, 0x79, 0x30, 0x7f, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05,
98*6777b538SAndroid Build Coastguard Worker 0x07, 0x01, 0x01, 0x04, 0x73, 0x30, 0x71, 0x30, 0x23, 0x06, 0x08, 0x2b,
99*6777b538SAndroid Build Coastguard Worker 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x17, 0x68, 0x74, 0x74,
100*6777b538SAndroid Build Coastguard Worker 0x70, 0x3a, 0x2f, 0x2f, 0x6f, 0x63, 0x73, 0x70, 0x2e, 0x67, 0x6f, 0x64,
101*6777b538SAndroid Build Coastguard Worker 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x4a, 0x06, 0x08,
102*6777b538SAndroid Build Coastguard Worker 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x3e, 0x68, 0x74,
103*6777b538SAndroid Build Coastguard Worker 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,
104*6777b538SAndroid Build Coastguard Worker 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64,
105*6777b538SAndroid Build Coastguard Worker 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69,
106*6777b538SAndroid Build Coastguard Worker 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x67, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x65,
107*6777b538SAndroid Build Coastguard Worker 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x2e, 0x63, 0x72, 0x74,
108*6777b538SAndroid Build Coastguard Worker 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x48,
109*6777b538SAndroid Build Coastguard Worker 0xdf, 0x60, 0x32, 0xcc, 0x89, 0x01, 0xb6, 0xdc, 0x2f, 0xe3, 0x73, 0xb5,
110*6777b538SAndroid Build Coastguard Worker 0x9c, 0x16, 0x58, 0x32, 0x68, 0xa9, 0xc3, 0x30, 0x1f, 0x06, 0x03, 0x55,
111*6777b538SAndroid Build Coastguard Worker 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xfd, 0xac, 0x61, 0x32,
112*6777b538SAndroid Build Coastguard Worker 0x93, 0x6c, 0x45, 0xd6, 0xe2, 0xee, 0x85, 0x5f, 0x9a, 0xba, 0xe7, 0x76,
113*6777b538SAndroid Build Coastguard Worker 0x99, 0x68, 0xcc, 0xe7, 0x30, 0x23, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04,
114*6777b538SAndroid Build Coastguard Worker 0x1c, 0x30, 0x1a, 0x82, 0x0c, 0x2a, 0x2e, 0x77, 0x65, 0x62, 0x6b, 0x69,
115*6777b538SAndroid Build Coastguard Worker 0x74, 0x2e, 0x6f, 0x72, 0x67, 0x82, 0x0a, 0x77, 0x65, 0x62, 0x6b, 0x69,
116*6777b538SAndroid Build Coastguard Worker 0x74, 0x2e, 0x6f, 0x72, 0x67};
117*6777b538SAndroid Build Coastguard Worker
118*6777b538SAndroid Build Coastguard Worker // RSA signature, a big integer in the big-endian byte order.
119*6777b538SAndroid Build Coastguard Worker const uint8_t signature[256] = {
120*6777b538SAndroid Build Coastguard Worker 0x1e, 0x6a, 0xe7, 0xe0, 0x4f, 0xe7, 0x4d, 0xd0, 0x69, 0x7c, 0xf8, 0x8f,
121*6777b538SAndroid Build Coastguard Worker 0x99, 0xb4, 0x18, 0x95, 0x36, 0x24, 0x0f, 0x0e, 0xa3, 0xea, 0x34, 0x37,
122*6777b538SAndroid Build Coastguard Worker 0xf4, 0x7d, 0xd5, 0x92, 0x35, 0x53, 0x72, 0x76, 0x3f, 0x69, 0xf0, 0x82,
123*6777b538SAndroid Build Coastguard Worker 0x56, 0xe3, 0x94, 0x7a, 0x1d, 0x1a, 0x81, 0xaf, 0x9f, 0xc7, 0x43, 0x01,
124*6777b538SAndroid Build Coastguard Worker 0x64, 0xd3, 0x7c, 0x0d, 0xc8, 0x11, 0x4e, 0x4a, 0xe6, 0x1a, 0xc3, 0x01,
125*6777b538SAndroid Build Coastguard Worker 0x74, 0xe8, 0x35, 0x87, 0x5c, 0x61, 0xaa, 0x8a, 0x46, 0x06, 0xbe, 0x98,
126*6777b538SAndroid Build Coastguard Worker 0x95, 0x24, 0x9e, 0x01, 0xe3, 0xe6, 0xa0, 0x98, 0xee, 0x36, 0x44, 0x56,
127*6777b538SAndroid Build Coastguard Worker 0x8d, 0x23, 0x9c, 0x65, 0xea, 0x55, 0x6a, 0xdf, 0x66, 0xee, 0x45, 0xe8,
128*6777b538SAndroid Build Coastguard Worker 0xa0, 0xe9, 0x7d, 0x9a, 0xba, 0x94, 0xc5, 0xc8, 0xc4, 0x4b, 0x98, 0xff,
129*6777b538SAndroid Build Coastguard Worker 0x9a, 0x01, 0x31, 0x6d, 0xf9, 0x2b, 0x58, 0xe7, 0xe7, 0x2a, 0xc5, 0x4d,
130*6777b538SAndroid Build Coastguard Worker 0xbb, 0xbb, 0xcd, 0x0d, 0x70, 0xe1, 0xad, 0x03, 0xf5, 0xfe, 0xf4, 0x84,
131*6777b538SAndroid Build Coastguard Worker 0x71, 0x08, 0xd2, 0xbc, 0x04, 0x7b, 0x26, 0x1c, 0xa8, 0x0f, 0x9c, 0xd8,
132*6777b538SAndroid Build Coastguard Worker 0x12, 0x6a, 0x6f, 0x2b, 0x67, 0xa1, 0x03, 0x80, 0x9a, 0x11, 0x0b, 0xe9,
133*6777b538SAndroid Build Coastguard Worker 0xe0, 0xb5, 0xb3, 0xb8, 0x19, 0x4e, 0x0c, 0xa4, 0xd9, 0x2b, 0x3b, 0xc2,
134*6777b538SAndroid Build Coastguard Worker 0xca, 0x20, 0xd3, 0x0c, 0xa4, 0xff, 0x93, 0x13, 0x1f, 0xfc, 0xba, 0x94,
135*6777b538SAndroid Build Coastguard Worker 0x93, 0x8c, 0x64, 0x15, 0x2e, 0x28, 0xa9, 0x55, 0x8c, 0x2c, 0x48, 0xd3,
136*6777b538SAndroid Build Coastguard Worker 0xd3, 0xc1, 0x50, 0x69, 0x19, 0xe8, 0x34, 0xd3, 0xf1, 0x04, 0x9f, 0x0a,
137*6777b538SAndroid Build Coastguard Worker 0x7a, 0x21, 0x87, 0xbf, 0xb9, 0x59, 0x37, 0x2e, 0xf4, 0x71, 0xa5, 0x3e,
138*6777b538SAndroid Build Coastguard Worker 0xbe, 0xcd, 0x70, 0x83, 0x18, 0xf8, 0x8a, 0x72, 0x85, 0x45, 0x1f, 0x08,
139*6777b538SAndroid Build Coastguard Worker 0x01, 0x6f, 0x37, 0xf5, 0x2b, 0x7b, 0xea, 0xb9, 0x8b, 0xa3, 0xcc, 0xfd,
140*6777b538SAndroid Build Coastguard Worker 0x35, 0x52, 0xdd, 0x66, 0xde, 0x4f, 0x30, 0xc5, 0x73, 0x81, 0xb6, 0xe8,
141*6777b538SAndroid Build Coastguard Worker 0x3c, 0xd8, 0x48, 0x8a};
142*6777b538SAndroid Build Coastguard Worker
143*6777b538SAndroid Build Coastguard Worker // The public key is specified as the following ASN.1 structure:
144*6777b538SAndroid Build Coastguard Worker // SubjectPublicKeyInfo ::= SEQUENCE {
145*6777b538SAndroid Build Coastguard Worker // algorithm AlgorithmIdentifier,
146*6777b538SAndroid Build Coastguard Worker // subjectPublicKey BIT STRING }
147*6777b538SAndroid Build Coastguard Worker const uint8_t public_key_info[294] = {
148*6777b538SAndroid Build Coastguard Worker 0x30, 0x82, 0x01, 0x22, // a SEQUENCE of length 290 (0x122)
149*6777b538SAndroid Build Coastguard Worker // algorithm
150*6777b538SAndroid Build Coastguard Worker 0x30, 0x0d, // a SEQUENCE of length 13
151*6777b538SAndroid Build Coastguard Worker 0x06, 0x09, // an OBJECT IDENTIFIER of length 9
152*6777b538SAndroid Build Coastguard Worker 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,
153*6777b538SAndroid Build Coastguard Worker 0x00, // a NULL of length 0
154*6777b538SAndroid Build Coastguard Worker // subjectPublicKey
155*6777b538SAndroid Build Coastguard Worker 0x03, 0x82, 0x01, 0x0f, // a BIT STRING of length 271 (0x10f)
156*6777b538SAndroid Build Coastguard Worker 0x00, // number of unused bits
157*6777b538SAndroid Build Coastguard Worker 0x30, 0x82, 0x01, 0x0a, // a SEQUENCE of length 266 (0x10a)
158*6777b538SAndroid Build Coastguard Worker // modulus
159*6777b538SAndroid Build Coastguard Worker 0x02, 0x82, 0x01, 0x01, // an INTEGER of length 257 (0x101)
160*6777b538SAndroid Build Coastguard Worker 0x00, 0xc4, 0x2d, 0xd5, 0x15, 0x8c, 0x9c, 0x26, 0x4c, 0xec, 0x32, 0x35,
161*6777b538SAndroid Build Coastguard Worker 0xeb, 0x5f, 0xb8, 0x59, 0x01, 0x5a, 0xa6, 0x61, 0x81, 0x59, 0x3b, 0x70,
162*6777b538SAndroid Build Coastguard Worker 0x63, 0xab, 0xe3, 0xdc, 0x3d, 0xc7, 0x2a, 0xb8, 0xc9, 0x33, 0xd3, 0x79,
163*6777b538SAndroid Build Coastguard Worker 0xe4, 0x3a, 0xed, 0x3c, 0x30, 0x23, 0x84, 0x8e, 0xb3, 0x30, 0x14, 0xb6,
164*6777b538SAndroid Build Coastguard Worker 0xb2, 0x87, 0xc3, 0x3d, 0x95, 0x54, 0x04, 0x9e, 0xdf, 0x99, 0xdd, 0x0b,
165*6777b538SAndroid Build Coastguard Worker 0x25, 0x1e, 0x21, 0xde, 0x65, 0x29, 0x7e, 0x35, 0xa8, 0xa9, 0x54, 0xeb,
166*6777b538SAndroid Build Coastguard Worker 0xf6, 0xf7, 0x32, 0x39, 0xd4, 0x26, 0x55, 0x95, 0xad, 0xef, 0xfb, 0xfe,
167*6777b538SAndroid Build Coastguard Worker 0x58, 0x86, 0xd7, 0x9e, 0xf4, 0x00, 0x8d, 0x8c, 0x2a, 0x0c, 0xbd, 0x42,
168*6777b538SAndroid Build Coastguard Worker 0x04, 0xce, 0xa7, 0x3f, 0x04, 0xf6, 0xee, 0x80, 0xf2, 0xaa, 0xef, 0x52,
169*6777b538SAndroid Build Coastguard Worker 0xa1, 0x69, 0x66, 0xda, 0xbe, 0x1a, 0xad, 0x5d, 0xda, 0x2c, 0x66, 0xea,
170*6777b538SAndroid Build Coastguard Worker 0x1a, 0x6b, 0xbb, 0xe5, 0x1a, 0x51, 0x4a, 0x00, 0x2f, 0x48, 0xc7, 0x98,
171*6777b538SAndroid Build Coastguard Worker 0x75, 0xd8, 0xb9, 0x29, 0xc8, 0xee, 0xf8, 0x66, 0x6d, 0x0a, 0x9c, 0xb3,
172*6777b538SAndroid Build Coastguard Worker 0xf3, 0xfc, 0x78, 0x7c, 0xa2, 0xf8, 0xa3, 0xf2, 0xb5, 0xc3, 0xf3, 0xb9,
173*6777b538SAndroid Build Coastguard Worker 0x7a, 0x91, 0xc1, 0xa7, 0xe6, 0x25, 0x2e, 0x9c, 0xa8, 0xed, 0x12, 0x65,
174*6777b538SAndroid Build Coastguard Worker 0x6e, 0x6a, 0xf6, 0x12, 0x44, 0x53, 0x70, 0x30, 0x95, 0xc3, 0x9c, 0x2b,
175*6777b538SAndroid Build Coastguard Worker 0x58, 0x2b, 0x3d, 0x08, 0x74, 0x4a, 0xf2, 0xbe, 0x51, 0xb0, 0xbf, 0x87,
176*6777b538SAndroid Build Coastguard Worker 0xd0, 0x4c, 0x27, 0x58, 0x6b, 0xb5, 0x35, 0xc5, 0x9d, 0xaf, 0x17, 0x31,
177*6777b538SAndroid Build Coastguard Worker 0xf8, 0x0b, 0x8f, 0xee, 0xad, 0x81, 0x36, 0x05, 0x89, 0x08, 0x98, 0xcf,
178*6777b538SAndroid Build Coastguard Worker 0x3a, 0xaf, 0x25, 0x87, 0xc0, 0x49, 0xea, 0xa7, 0xfd, 0x67, 0xf7, 0x45,
179*6777b538SAndroid Build Coastguard Worker 0x8e, 0x97, 0xcc, 0x14, 0x39, 0xe2, 0x36, 0x85, 0xb5, 0x7e, 0x1a, 0x37,
180*6777b538SAndroid Build Coastguard Worker 0xfd, 0x16, 0xf6, 0x71, 0x11, 0x9a, 0x74, 0x30, 0x16, 0xfe, 0x13, 0x94,
181*6777b538SAndroid Build Coastguard Worker 0xa3, 0x3f, 0x84, 0x0d, 0x4f,
182*6777b538SAndroid Build Coastguard Worker // public exponent
183*6777b538SAndroid Build Coastguard Worker 0x02, 0x03, // an INTEGER of length 3
184*6777b538SAndroid Build Coastguard Worker 0x01, 0x00, 0x01};
185*6777b538SAndroid Build Coastguard Worker
186*6777b538SAndroid Build Coastguard Worker // We use the signature verifier to perform four signature verification
187*6777b538SAndroid Build Coastguard Worker // tests.
188*6777b538SAndroid Build Coastguard Worker crypto::SignatureVerifier verifier;
189*6777b538SAndroid Build Coastguard Worker
190*6777b538SAndroid Build Coastguard Worker // Test 1: feed all of the data to the verifier at once (a single
191*6777b538SAndroid Build Coastguard Worker // VerifyUpdate call).
192*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1,
193*6777b538SAndroid Build Coastguard Worker signature, public_key_info));
194*6777b538SAndroid Build Coastguard Worker verifier.VerifyUpdate(tbs_certificate);
195*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(verifier.VerifyFinal());
196*6777b538SAndroid Build Coastguard Worker
197*6777b538SAndroid Build Coastguard Worker // Test 2: feed the data to the verifier in three parts (three VerifyUpdate
198*6777b538SAndroid Build Coastguard Worker // calls).
199*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1,
200*6777b538SAndroid Build Coastguard Worker signature, public_key_info));
201*6777b538SAndroid Build Coastguard Worker auto tbs_certificate_span = base::make_span(tbs_certificate);
202*6777b538SAndroid Build Coastguard Worker
203*6777b538SAndroid Build Coastguard Worker verifier.VerifyUpdate(tbs_certificate_span.first(256u));
204*6777b538SAndroid Build Coastguard Worker verifier.VerifyUpdate(tbs_certificate_span.subspan(256, 256));
205*6777b538SAndroid Build Coastguard Worker verifier.VerifyUpdate(tbs_certificate_span.subspan(512));
206*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(verifier.VerifyFinal());
207*6777b538SAndroid Build Coastguard Worker
208*6777b538SAndroid Build Coastguard Worker // Test 3: verify the signature with incorrect data.
209*6777b538SAndroid Build Coastguard Worker uint8_t bad_tbs_certificate[sizeof(tbs_certificate)];
210*6777b538SAndroid Build Coastguard Worker memcpy(bad_tbs_certificate, tbs_certificate, sizeof(tbs_certificate));
211*6777b538SAndroid Build Coastguard Worker bad_tbs_certificate[10] += 1; // Corrupt one byte of the data.
212*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1,
213*6777b538SAndroid Build Coastguard Worker signature, public_key_info));
214*6777b538SAndroid Build Coastguard Worker verifier.VerifyUpdate(bad_tbs_certificate);
215*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(verifier.VerifyFinal());
216*6777b538SAndroid Build Coastguard Worker
217*6777b538SAndroid Build Coastguard Worker // Test 4: verify a bad signature.
218*6777b538SAndroid Build Coastguard Worker uint8_t bad_signature[sizeof(signature)];
219*6777b538SAndroid Build Coastguard Worker memcpy(bad_signature, signature, sizeof(signature));
220*6777b538SAndroid Build Coastguard Worker bad_signature[10] += 1; // Corrupt one byte of the signature.
221*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1,
222*6777b538SAndroid Build Coastguard Worker bad_signature, public_key_info));
223*6777b538SAndroid Build Coastguard Worker verifier.VerifyUpdate(tbs_certificate);
224*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(verifier.VerifyFinal());
225*6777b538SAndroid Build Coastguard Worker
226*6777b538SAndroid Build Coastguard Worker // Test 5: import an invalid key.
227*6777b538SAndroid Build Coastguard Worker uint8_t bad_public_key_info[sizeof(public_key_info)];
228*6777b538SAndroid Build Coastguard Worker memcpy(bad_public_key_info, public_key_info, sizeof(public_key_info));
229*6777b538SAndroid Build Coastguard Worker bad_public_key_info[0] += 1; // Corrupt part of the SPKI syntax.
230*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1,
231*6777b538SAndroid Build Coastguard Worker signature, bad_public_key_info));
232*6777b538SAndroid Build Coastguard Worker
233*6777b538SAndroid Build Coastguard Worker // Test 6: import a key with extra data.
234*6777b538SAndroid Build Coastguard Worker uint8_t long_public_key_info[sizeof(public_key_info) + 5];
235*6777b538SAndroid Build Coastguard Worker memset(long_public_key_info, 0, sizeof(long_public_key_info));
236*6777b538SAndroid Build Coastguard Worker memcpy(long_public_key_info, public_key_info, sizeof(public_key_info));
237*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1,
238*6777b538SAndroid Build Coastguard Worker signature, long_public_key_info));
239*6777b538SAndroid Build Coastguard Worker }
240*6777b538SAndroid Build Coastguard Worker
241*6777b538SAndroid Build Coastguard Worker // The following RSA-PSS tests were generated via the following OpenSSL
242*6777b538SAndroid Build Coastguard Worker // commands:
243*6777b538SAndroid Build Coastguard Worker //
244*6777b538SAndroid Build Coastguard Worker // clang-format off
245*6777b538SAndroid Build Coastguard Worker // openssl genrsa -f4 -out key.pem 2048
246*6777b538SAndroid Build Coastguard Worker // openssl rsa -in key.pem -pubout -outform der | xxd -i > spki.txt
247*6777b538SAndroid Build Coastguard Worker // openssl rand -out message 50
248*6777b538SAndroid Build Coastguard Worker // xxd -i message > message.txt
249*6777b538SAndroid Build Coastguard Worker // openssl dgst -sign key.pem -sha256 -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:32 < message | xxd -i > sig-good.txt
250*6777b538SAndroid Build Coastguard Worker // openssl dgst -sign key.pem -sha256 -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:33 < message | xxd -i > sig-bad-saltlen.txt
251*6777b538SAndroid Build Coastguard Worker // clang-format on
252*6777b538SAndroid Build Coastguard Worker
253*6777b538SAndroid Build Coastguard Worker namespace {
254*6777b538SAndroid Build Coastguard Worker
255*6777b538SAndroid Build Coastguard Worker // This is the public key corresponding to the following private key.
256*6777b538SAndroid Build Coastguard Worker //
257*6777b538SAndroid Build Coastguard Worker // -----BEGIN RSA PRIVATE KEY-----
258*6777b538SAndroid Build Coastguard Worker // MIIEowIBAAKCAQEArg5NXFRQQ5QU7dcqqIjZwL4qy4AaJNSPfSPvXmFbK0hDXdp6
259*6777b538SAndroid Build Coastguard Worker // PdOZ2Wd+lQLZwb7ZQ2ZdqHVK3kZ2sVUlFmngIoEXNhVg+gW2zGPZ1YemwBMdZ/NW
260*6777b538SAndroid Build Coastguard Worker // V2xTX7Y3RrdR/kSccd9ByRTHKb+BCJ2XN5pHu91+LFchahW0lVPHz9DkBPUCThM2
261*6777b538SAndroid Build Coastguard Worker // I4ZosM3+AcO93RrrcbiQdpuY60Lfg9ZX7+1clM7zhiuOjWNY+FLN4+j4Ec8isiis
262*6777b538SAndroid Build Coastguard Worker // /V1LQyxRZ2t29kto47UJKu0Li7gUvEE1PS/nXBVgEqcSEBBKXa4ahsTqKWJAwvEH
263*6777b538SAndroid Build Coastguard Worker // xaH1t2qhVO1IHcf9FSv5k1T47H7XMLpO2OCPrwIDAQABAoIBAQCXA4exTOHa0Dcc
264*6777b538SAndroid Build Coastguard Worker // aGv1j87GAPimWX3VaKsaGzyKuZNdSTRR0MXwsI+yZa4Y4UFHbSuZ483s499SXPaM
265*6777b538SAndroid Build Coastguard Worker // Q2CLQs8ZgME/xmq+YojIavXL4wcVbUA9OY43CaCI0VLCQzmbj7HgxqCQMzvdh+8P
266*6777b538SAndroid Build Coastguard Worker // J5PUxUHpyHG5TNuL7EsiqG8bapT7ip2+IpKrKjr18gn3k0k9mLNJxK9Qr+CJphwo
267*6777b538SAndroid Build Coastguard Worker // eJgq0Kcjx3bfgDEpPzyvdd+J3e+jclOTYbk2HwJ0FVCrfgJedHFIWUytZoM5783g
268*6777b538SAndroid Build Coastguard Worker // knXzgDyKs65aUDjc/opidXp3WOqfNJUPSiofPYPdYQ26UI0vztL5MBkWCpl+d/55
269*6777b538SAndroid Build Coastguard Worker // BqxCdDlhAoGBANm90DFUca+7LdnDgj8mWtUIzr+XVzSD9tzOIpcjiPwEnxk8RHrM
270*6777b538SAndroid Build Coastguard Worker // aMHCAKZpbsnX/ikdc2I1OsirPgNFh1q30xgL7oCadzxlwfXnEM0Nff8RJKtN+yI6
271*6777b538SAndroid Build Coastguard Worker // +nRoOCDGCHBsaa2wyMYRbnanyRDLPIOP4eGQ6Hz/LQJBvhjRyTXlrUU/AoGBAMyj
272*6777b538SAndroid Build Coastguard Worker // ec1ySnlJ2S0JqPBCk14dRsEs/zStgFz1Wdmk7TMRBPUMyhWf8JwNrU5Ppm9biJMo
273*6777b538SAndroid Build Coastguard Worker // MKwkiFjzv/us4ne3wFRsTiKj4uiIwfji7/N2VpbEXSDGtonrX7hES4wQ/s+qr8XJ
274*6777b538SAndroid Build Coastguard Worker // 8ykHrZ9rPOY2lBhxOo+VYE3U6aspAY/qwK8WyumRAoGAMdl+/Iw0quLTkHNuMj75
275*6777b538SAndroid Build Coastguard Worker // tKQbkUl4sZE0x0B6Mtfz2J7GPeTKWMLLiPB9bZvdvWAx0//mFqnRF3f87orQfjhv
276*6777b538SAndroid Build Coastguard Worker // n6W7qL20ZqN1UHLiKc/Y9LhcCMwFnsSZ6mSh1P8Bl5t6ZkV+8bmz7H5lTe75n7Ul
277*6777b538SAndroid Build Coastguard Worker // JZsjXtqc11NtzgjZY/l9PckCgYAH6ZI+FVs30VkqWqNDlu9nxi4ELh84BDVgYsQ0
278*6777b538SAndroid Build Coastguard Worker // nCHnxZKxfusZZvPAtO6shnvi9mETf4xSO59iARq9OnQPOPWgzgc/Y6LUZuVJIE0y
279*6777b538SAndroid Build Coastguard Worker // 1rKGZdVL/SL1tjofP9TD96xCj1D4jtRuE7Ps5BKYvCeBwm8HOjldCQx357/9to/4
280*6777b538SAndroid Build Coastguard Worker // tSLnYQKBgG7STr94Slb3/BzzMxdMLCum1PH73/+IFxu1J0cXxYLP2zEhcSgqGIwm
281*6777b538SAndroid Build Coastguard Worker // aMgdu1L9eE6lJM99AWTEkpcUz8UFwNt+hZW+lZZpex77RMgRl9VCiwid1BNBSU/o
282*6777b538SAndroid Build Coastguard Worker // +lT1mlpDrPCNOge9n6Qvy5waBugB8uNS86w0UImYiKZr+8IQ4EdE
283*6777b538SAndroid Build Coastguard Worker // -----END RSA PRIVATE KEY-----
284*6777b538SAndroid Build Coastguard Worker const uint8_t kPSSPublicKey[] = {
285*6777b538SAndroid Build Coastguard Worker 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
286*6777b538SAndroid Build Coastguard Worker 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00,
287*6777b538SAndroid Build Coastguard Worker 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xae, 0x0e, 0x4d,
288*6777b538SAndroid Build Coastguard Worker 0x5c, 0x54, 0x50, 0x43, 0x94, 0x14, 0xed, 0xd7, 0x2a, 0xa8, 0x88, 0xd9,
289*6777b538SAndroid Build Coastguard Worker 0xc0, 0xbe, 0x2a, 0xcb, 0x80, 0x1a, 0x24, 0xd4, 0x8f, 0x7d, 0x23, 0xef,
290*6777b538SAndroid Build Coastguard Worker 0x5e, 0x61, 0x5b, 0x2b, 0x48, 0x43, 0x5d, 0xda, 0x7a, 0x3d, 0xd3, 0x99,
291*6777b538SAndroid Build Coastguard Worker 0xd9, 0x67, 0x7e, 0x95, 0x02, 0xd9, 0xc1, 0xbe, 0xd9, 0x43, 0x66, 0x5d,
292*6777b538SAndroid Build Coastguard Worker 0xa8, 0x75, 0x4a, 0xde, 0x46, 0x76, 0xb1, 0x55, 0x25, 0x16, 0x69, 0xe0,
293*6777b538SAndroid Build Coastguard Worker 0x22, 0x81, 0x17, 0x36, 0x15, 0x60, 0xfa, 0x05, 0xb6, 0xcc, 0x63, 0xd9,
294*6777b538SAndroid Build Coastguard Worker 0xd5, 0x87, 0xa6, 0xc0, 0x13, 0x1d, 0x67, 0xf3, 0x56, 0x57, 0x6c, 0x53,
295*6777b538SAndroid Build Coastguard Worker 0x5f, 0xb6, 0x37, 0x46, 0xb7, 0x51, 0xfe, 0x44, 0x9c, 0x71, 0xdf, 0x41,
296*6777b538SAndroid Build Coastguard Worker 0xc9, 0x14, 0xc7, 0x29, 0xbf, 0x81, 0x08, 0x9d, 0x97, 0x37, 0x9a, 0x47,
297*6777b538SAndroid Build Coastguard Worker 0xbb, 0xdd, 0x7e, 0x2c, 0x57, 0x21, 0x6a, 0x15, 0xb4, 0x95, 0x53, 0xc7,
298*6777b538SAndroid Build Coastguard Worker 0xcf, 0xd0, 0xe4, 0x04, 0xf5, 0x02, 0x4e, 0x13, 0x36, 0x23, 0x86, 0x68,
299*6777b538SAndroid Build Coastguard Worker 0xb0, 0xcd, 0xfe, 0x01, 0xc3, 0xbd, 0xdd, 0x1a, 0xeb, 0x71, 0xb8, 0x90,
300*6777b538SAndroid Build Coastguard Worker 0x76, 0x9b, 0x98, 0xeb, 0x42, 0xdf, 0x83, 0xd6, 0x57, 0xef, 0xed, 0x5c,
301*6777b538SAndroid Build Coastguard Worker 0x94, 0xce, 0xf3, 0x86, 0x2b, 0x8e, 0x8d, 0x63, 0x58, 0xf8, 0x52, 0xcd,
302*6777b538SAndroid Build Coastguard Worker 0xe3, 0xe8, 0xf8, 0x11, 0xcf, 0x22, 0xb2, 0x28, 0xac, 0xfd, 0x5d, 0x4b,
303*6777b538SAndroid Build Coastguard Worker 0x43, 0x2c, 0x51, 0x67, 0x6b, 0x76, 0xf6, 0x4b, 0x68, 0xe3, 0xb5, 0x09,
304*6777b538SAndroid Build Coastguard Worker 0x2a, 0xed, 0x0b, 0x8b, 0xb8, 0x14, 0xbc, 0x41, 0x35, 0x3d, 0x2f, 0xe7,
305*6777b538SAndroid Build Coastguard Worker 0x5c, 0x15, 0x60, 0x12, 0xa7, 0x12, 0x10, 0x10, 0x4a, 0x5d, 0xae, 0x1a,
306*6777b538SAndroid Build Coastguard Worker 0x86, 0xc4, 0xea, 0x29, 0x62, 0x40, 0xc2, 0xf1, 0x07, 0xc5, 0xa1, 0xf5,
307*6777b538SAndroid Build Coastguard Worker 0xb7, 0x6a, 0xa1, 0x54, 0xed, 0x48, 0x1d, 0xc7, 0xfd, 0x15, 0x2b, 0xf9,
308*6777b538SAndroid Build Coastguard Worker 0x93, 0x54, 0xf8, 0xec, 0x7e, 0xd7, 0x30, 0xba, 0x4e, 0xd8, 0xe0, 0x8f,
309*6777b538SAndroid Build Coastguard Worker 0xaf, 0x02, 0x03, 0x01, 0x00, 0x01,
310*6777b538SAndroid Build Coastguard Worker };
311*6777b538SAndroid Build Coastguard Worker
312*6777b538SAndroid Build Coastguard Worker const uint8_t kPSSMessage[] = {
313*6777b538SAndroid Build Coastguard Worker 0x1e, 0x70, 0xbd, 0xeb, 0x24, 0xf2, 0x9d, 0x05, 0xc5, 0xb5,
314*6777b538SAndroid Build Coastguard Worker 0xf4, 0xca, 0xe6, 0x1d, 0x01, 0x97, 0x29, 0xf4, 0xe0, 0x7c,
315*6777b538SAndroid Build Coastguard Worker 0xfd, 0xcc, 0x97, 0x8d, 0xc2, 0xbb, 0x2d, 0x9b, 0x6b, 0x45,
316*6777b538SAndroid Build Coastguard Worker 0x06, 0xbd, 0x2c, 0x66, 0x10, 0x42, 0x73, 0x8d, 0x88, 0x9b,
317*6777b538SAndroid Build Coastguard Worker 0x18, 0xcc, 0xcb, 0x7e, 0x43, 0x23, 0x06, 0xe9, 0x8f, 0x8f,
318*6777b538SAndroid Build Coastguard Worker };
319*6777b538SAndroid Build Coastguard Worker
320*6777b538SAndroid Build Coastguard Worker const uint8_t kPSSSignatureGood[] = {
321*6777b538SAndroid Build Coastguard Worker 0x12, 0xa7, 0x6d, 0x9e, 0x8a, 0xea, 0x28, 0xe0, 0x3f, 0x6f, 0x5a, 0xa4,
322*6777b538SAndroid Build Coastguard Worker 0x1b, 0x6a, 0x0a, 0x14, 0xba, 0xfa, 0x84, 0xf6, 0xb7, 0x3c, 0xc9, 0xd6,
323*6777b538SAndroid Build Coastguard Worker 0x84, 0xab, 0x1e, 0x77, 0x88, 0x53, 0x95, 0x43, 0x8e, 0x73, 0xe4, 0x21,
324*6777b538SAndroid Build Coastguard Worker 0xab, 0x69, 0xb2, 0x0c, 0x73, 0x4d, 0x98, 0x42, 0xbd, 0x65, 0xa2, 0x95,
325*6777b538SAndroid Build Coastguard Worker 0x0d, 0x76, 0xb2, 0xbd, 0xe5, 0x9a, 0x6e, 0x9f, 0x72, 0x7f, 0xdd, 0x1e,
326*6777b538SAndroid Build Coastguard Worker 0x9f, 0xda, 0xc8, 0x2e, 0xa3, 0xe6, 0x28, 0x03, 0x98, 0x5c, 0x13, 0xa7,
327*6777b538SAndroid Build Coastguard Worker 0x7d, 0x4e, 0xde, 0xea, 0x35, 0x1b, 0x35, 0x7e, 0xaa, 0x14, 0xf9, 0xfb,
328*6777b538SAndroid Build Coastguard Worker 0xac, 0x61, 0xd0, 0x44, 0x20, 0xd5, 0x52, 0x5b, 0x92, 0x8f, 0xe7, 0x37,
329*6777b538SAndroid Build Coastguard Worker 0xa2, 0x72, 0x7d, 0xe6, 0x0d, 0x81, 0x63, 0xcc, 0x0f, 0xbd, 0xde, 0x25,
330*6777b538SAndroid Build Coastguard Worker 0xe3, 0x3f, 0x89, 0x1b, 0x39, 0x64, 0xfa, 0x21, 0x1d, 0x0f, 0x9b, 0x8a,
331*6777b538SAndroid Build Coastguard Worker 0xc1, 0xad, 0x03, 0x49, 0x96, 0xff, 0x9f, 0x2d, 0x83, 0xee, 0x2d, 0x2a,
332*6777b538SAndroid Build Coastguard Worker 0x1e, 0xc5, 0x73, 0x9f, 0x5b, 0xde, 0xcb, 0xaf, 0x02, 0xbd, 0xc5, 0x9b,
333*6777b538SAndroid Build Coastguard Worker 0x78, 0xb9, 0x8e, 0x01, 0x75, 0x3c, 0xc9, 0x6e, 0x7d, 0x3e, 0x61, 0x62,
334*6777b538SAndroid Build Coastguard Worker 0xc4, 0x8c, 0x9e, 0x76, 0xed, 0x52, 0x5e, 0x80, 0x89, 0xa7, 0x75, 0x5e,
335*6777b538SAndroid Build Coastguard Worker 0xc6, 0x34, 0x97, 0x22, 0x40, 0xb5, 0x0c, 0x77, 0x09, 0x8c, 0xa8, 0xe9,
336*6777b538SAndroid Build Coastguard Worker 0xf6, 0x8d, 0xc0, 0x10, 0x78, 0x92, 0xa9, 0xc6, 0x68, 0xa3, 0x57, 0x6e,
337*6777b538SAndroid Build Coastguard Worker 0x73, 0xb5, 0x73, 0x8d, 0x8e, 0x21, 0xb1, 0xf3, 0xd0, 0x0a, 0x40, 0x68,
338*6777b538SAndroid Build Coastguard Worker 0xfc, 0x3c, 0xeb, 0xd3, 0x48, 0x4a, 0x44, 0xbd, 0xc0, 0x40, 0x5d, 0x9b,
339*6777b538SAndroid Build Coastguard Worker 0x40, 0x6f, 0x45, 0x98, 0x2b, 0xae, 0x58, 0xe8, 0x9d, 0x34, 0x49, 0xd2,
340*6777b538SAndroid Build Coastguard Worker 0xec, 0xdc, 0xd5, 0x98, 0xb4, 0x87, 0x8a, 0xcc, 0x41, 0x3e, 0xd7, 0xe6,
341*6777b538SAndroid Build Coastguard Worker 0x21, 0xd6, 0x4c, 0x89, 0xf1, 0xf4, 0x77, 0x40, 0x3f, 0x9a, 0x28, 0x25,
342*6777b538SAndroid Build Coastguard Worker 0x55, 0x7c, 0xf5, 0x0c,
343*6777b538SAndroid Build Coastguard Worker };
344*6777b538SAndroid Build Coastguard Worker
345*6777b538SAndroid Build Coastguard Worker const uint8_t kPSSSignatureBadSaltLength[] = {
346*6777b538SAndroid Build Coastguard Worker 0x6e, 0x61, 0xbe, 0x8a, 0x82, 0xbd, 0xed, 0xc6, 0xe4, 0x33, 0x91, 0xa4,
347*6777b538SAndroid Build Coastguard Worker 0x43, 0x57, 0x51, 0x7e, 0xa8, 0x18, 0xbf, 0x20, 0x98, 0xbc, 0x04, 0x50,
348*6777b538SAndroid Build Coastguard Worker 0x06, 0x1b, 0x0b, 0xb6, 0x43, 0xde, 0x58, 0x7f, 0x6b, 0xa5, 0x5e, 0x9d,
349*6777b538SAndroid Build Coastguard Worker 0xd1, 0x75, 0x03, 0xf5, 0x19, 0x8d, 0xdb, 0x2c, 0xd2, 0x9a, 0xf9, 0xbd,
350*6777b538SAndroid Build Coastguard Worker 0x82, 0x8d, 0x32, 0x9d, 0x7d, 0x70, 0x6f, 0x81, 0x95, 0x60, 0x1d, 0x62,
351*6777b538SAndroid Build Coastguard Worker 0x72, 0xf3, 0x95, 0x5b, 0x7a, 0x66, 0x7f, 0x45, 0x94, 0x0c, 0x07, 0xc8,
352*6777b538SAndroid Build Coastguard Worker 0xa7, 0x64, 0x38, 0x57, 0x1a, 0x64, 0x64, 0xf1, 0xe0, 0x45, 0xfe, 0x00,
353*6777b538SAndroid Build Coastguard Worker 0x11, 0x90, 0x57, 0x95, 0x15, 0x21, 0x10, 0x85, 0xc0, 0xbe, 0x53, 0x5b,
354*6777b538SAndroid Build Coastguard Worker 0x3b, 0xa3, 0x57, 0x99, 0x2b, 0x94, 0x6b, 0xbf, 0xa5, 0x55, 0x7d, 0x5a,
355*6777b538SAndroid Build Coastguard Worker 0xcb, 0xa2, 0x73, 0x6b, 0x5f, 0x7b, 0x3f, 0x10, 0x90, 0xd1, 0x26, 0x72,
356*6777b538SAndroid Build Coastguard Worker 0x5e, 0xad, 0xd1, 0x34, 0xe8, 0x8a, 0x33, 0xeb, 0xd2, 0xbf, 0x54, 0x92,
357*6777b538SAndroid Build Coastguard Worker 0xeb, 0x7c, 0xb9, 0x97, 0x80, 0x5a, 0x46, 0xc4, 0xbd, 0xf5, 0x7e, 0xd6,
358*6777b538SAndroid Build Coastguard Worker 0x20, 0x90, 0x92, 0xcb, 0x37, 0x85, 0x9d, 0x81, 0x0a, 0xd0, 0xa5, 0x73,
359*6777b538SAndroid Build Coastguard Worker 0x17, 0x7e, 0xe2, 0x91, 0xef, 0x35, 0x55, 0xc9, 0x5e, 0x87, 0x84, 0x11,
360*6777b538SAndroid Build Coastguard Worker 0xa4, 0x36, 0xf0, 0x2a, 0xa7, 0x7a, 0x83, 0x1d, 0x7a, 0x90, 0x69, 0x22,
361*6777b538SAndroid Build Coastguard Worker 0x5d, 0x3b, 0x30, 0x48, 0x46, 0xd2, 0xd3, 0x49, 0x23, 0x64, 0xa4, 0x6d,
362*6777b538SAndroid Build Coastguard Worker 0xd1, 0xef, 0xb9, 0x1b, 0xa4, 0xd1, 0x92, 0xdd, 0x8c, 0xb2, 0xaa, 0x9f,
363*6777b538SAndroid Build Coastguard Worker 0x6a, 0x2c, 0xc9, 0xdb, 0xa7, 0x35, 0x66, 0x92, 0x8b, 0x73, 0x11, 0x70,
364*6777b538SAndroid Build Coastguard Worker 0x2b, 0xf4, 0x34, 0x3f, 0x9e, 0x15, 0x3e, 0xc0, 0xac, 0x78, 0x6f, 0x74,
365*6777b538SAndroid Build Coastguard Worker 0x8a, 0x6b, 0xe4, 0xf2, 0x7b, 0x10, 0xca, 0x01, 0x3a, 0x3a, 0x88, 0x39,
366*6777b538SAndroid Build Coastguard Worker 0x34, 0xa8, 0x52, 0x4a, 0x76, 0x50, 0xef, 0xdb, 0x91, 0x3c, 0x4a, 0x5c,
367*6777b538SAndroid Build Coastguard Worker 0xe5, 0x43, 0x6f, 0x8e,
368*6777b538SAndroid Build Coastguard Worker };
369*6777b538SAndroid Build Coastguard Worker
370*6777b538SAndroid Build Coastguard Worker } // namespace
371*6777b538SAndroid Build Coastguard Worker
TEST(SignatureVerifierTest,VerifyRSAPSS)372*6777b538SAndroid Build Coastguard Worker TEST(SignatureVerifierTest, VerifyRSAPSS) {
373*6777b538SAndroid Build Coastguard Worker // Verify the test vector.
374*6777b538SAndroid Build Coastguard Worker crypto::SignatureVerifier verifier;
375*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(verifier.VerifyInit(crypto::SignatureVerifier::RSA_PSS_SHA256,
376*6777b538SAndroid Build Coastguard Worker kPSSSignatureGood, kPSSPublicKey));
377*6777b538SAndroid Build Coastguard Worker verifier.VerifyUpdate(kPSSMessage);
378*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(verifier.VerifyFinal());
379*6777b538SAndroid Build Coastguard Worker
380*6777b538SAndroid Build Coastguard Worker // Verify the test vector byte-by-byte.
381*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(verifier.VerifyInit(crypto::SignatureVerifier::RSA_PSS_SHA256,
382*6777b538SAndroid Build Coastguard Worker kPSSSignatureGood, kPSSPublicKey));
383*6777b538SAndroid Build Coastguard Worker for (uint8_t b : kPSSMessage) {
384*6777b538SAndroid Build Coastguard Worker verifier.VerifyUpdate(base::make_span(&b, 1u));
385*6777b538SAndroid Build Coastguard Worker }
386*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(verifier.VerifyFinal());
387*6777b538SAndroid Build Coastguard Worker
388*6777b538SAndroid Build Coastguard Worker // The bad salt length does not verify.
389*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(verifier.VerifyInit(crypto::SignatureVerifier::RSA_PSS_SHA256,
390*6777b538SAndroid Build Coastguard Worker kPSSSignatureBadSaltLength, kPSSPublicKey));
391*6777b538SAndroid Build Coastguard Worker verifier.VerifyUpdate(kPSSMessage);
392*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(verifier.VerifyFinal());
393*6777b538SAndroid Build Coastguard Worker
394*6777b538SAndroid Build Coastguard Worker // Corrupt the message.
395*6777b538SAndroid Build Coastguard Worker std::vector<uint8_t> message(std::begin(kPSSMessage), std::end(kPSSMessage));
396*6777b538SAndroid Build Coastguard Worker message[0] ^= 1;
397*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(verifier.VerifyInit(crypto::SignatureVerifier::RSA_PSS_SHA256,
398*6777b538SAndroid Build Coastguard Worker kPSSSignatureGood, kPSSPublicKey));
399*6777b538SAndroid Build Coastguard Worker verifier.VerifyUpdate(message);
400*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(verifier.VerifyFinal());
401*6777b538SAndroid Build Coastguard Worker
402*6777b538SAndroid Build Coastguard Worker // Corrupt the signature.
403*6777b538SAndroid Build Coastguard Worker std::vector<uint8_t> signature(std::begin(kPSSSignatureGood),
404*6777b538SAndroid Build Coastguard Worker std::end(kPSSSignatureGood));
405*6777b538SAndroid Build Coastguard Worker signature[0] ^= 1;
406*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(verifier.VerifyInit(crypto::SignatureVerifier::RSA_PSS_SHA256,
407*6777b538SAndroid Build Coastguard Worker signature, kPSSPublicKey));
408*6777b538SAndroid Build Coastguard Worker verifier.VerifyUpdate(kPSSMessage);
409*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(verifier.VerifyFinal());
410*6777b538SAndroid Build Coastguard Worker }
411