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