1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "crypto/signature_verifier.h"
6 
7 #include <stddef.h>
8 #include <stdint.h>
9 
10 #include "base/logging.h"
11 #include "base/macros.h"
12 #include "base/numerics/safe_conversions.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14 
TEST(SignatureVerifierTest,BasicTest)15 TEST(SignatureVerifierTest, BasicTest) {
16   // The input data in this test comes from real certificates.
17   //
18   // tbs_certificate ("to-be-signed certificate", the part of a certificate that
19   // is signed), signature, and algorithm come from the certificate of
20   // bugs.webkit.org.
21   //
22   // public_key_info comes from the certificate of the issuer, Go Daddy Secure
23   // Certification Authority.
24   //
25   // The bytes in the array initializers are formatted to expose the DER
26   // encoding of the ASN.1 structures.
27 
28   // The data that is signed is the following ASN.1 structure:
29   //    TBSCertificate  ::=  SEQUENCE  {
30   //        ...  -- omitted, not important
31   //        }
32   const uint8_t tbs_certificate[1017] = {
33       0x30, 0x82, 0x03, 0xf5,  // a SEQUENCE of length 1013 (0x3f5)
34       0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x03, 0x43, 0xdd, 0x63, 0x30, 0x0d,
35       0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05,
36       0x00, 0x30, 0x81, 0xca, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,
37       0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55,
38       0x04, 0x08, 0x13, 0x07, 0x41, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x61, 0x31,
39       0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0a, 0x53, 0x63,
40       0x6f, 0x74, 0x74, 0x73, 0x64, 0x61, 0x6c, 0x65, 0x31, 0x1a, 0x30, 0x18,
41       0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x11, 0x47, 0x6f, 0x44, 0x61, 0x64,
42       0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e,
43       0x31, 0x33, 0x30, 0x31, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x2a, 0x68,
44       0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66,
45       0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64,
46       0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73,
47       0x69, 0x74, 0x6f, 0x72, 0x79, 0x31, 0x30, 0x30, 0x2e, 0x06, 0x03, 0x55,
48       0x04, 0x03, 0x13, 0x27, 0x47, 0x6f, 0x20, 0x44, 0x61, 0x64, 0x64, 0x79,
49       0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74,
50       0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75,
51       0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x11, 0x30, 0x0f, 0x06,
52       0x03, 0x55, 0x04, 0x05, 0x13, 0x08, 0x30, 0x37, 0x39, 0x36, 0x39, 0x32,
53       0x38, 0x37, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x38, 0x30, 0x33, 0x31, 0x38,
54       0x32, 0x33, 0x33, 0x35, 0x31, 0x39, 0x5a, 0x17, 0x0d, 0x31, 0x31, 0x30,
55       0x33, 0x31, 0x38, 0x32, 0x33, 0x33, 0x35, 0x31, 0x39, 0x5a, 0x30, 0x79,
56       0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55,
57       0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a,
58       0x43, 0x61, 0x6c, 0x69, 0x66, 0x6f, 0x72, 0x6e, 0x69, 0x61, 0x31, 0x12,
59       0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x09, 0x43, 0x75, 0x70,
60       0x65, 0x72, 0x74, 0x69, 0x6e, 0x6f, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03,
61       0x55, 0x04, 0x0a, 0x13, 0x0a, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x49,
62       0x6e, 0x63, 0x2e, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x0b,
63       0x13, 0x0c, 0x4d, 0x61, 0x63, 0x20, 0x4f, 0x53, 0x20, 0x46, 0x6f, 0x72,
64       0x67, 0x65, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,
65       0x0c, 0x2a, 0x2e, 0x77, 0x65, 0x62, 0x6b, 0x69, 0x74, 0x2e, 0x6f, 0x72,
66       0x67, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
67       0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30,
68       0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xa7, 0x62, 0x79, 0x41, 0xda, 0x28,
69       0xf2, 0xc0, 0x4f, 0xe0, 0x25, 0xaa, 0xa1, 0x2e, 0x3b, 0x30, 0x94, 0xb5,
70       0xc9, 0x26, 0x3a, 0x1b, 0xe2, 0xd0, 0xcc, 0xa2, 0x95, 0xe2, 0x91, 0xc0,
71       0xf0, 0x40, 0x9e, 0x27, 0x6e, 0xbd, 0x6e, 0xde, 0x7c, 0xb6, 0x30, 0x5c,
72       0xb8, 0x9b, 0x01, 0x2f, 0x92, 0x04, 0xa1, 0xef, 0x4a, 0xb1, 0x6c, 0xb1,
73       0x7e, 0x8e, 0xcd, 0xa6, 0xf4, 0x40, 0x73, 0x1f, 0x2c, 0x96, 0xad, 0xff,
74       0x2a, 0x6d, 0x0e, 0xba, 0x52, 0x84, 0x83, 0xb0, 0x39, 0xee, 0xc9, 0x39,
75       0xdc, 0x1e, 0x34, 0xd0, 0xd8, 0x5d, 0x7a, 0x09, 0xac, 0xa9, 0xee, 0xca,
76       0x65, 0xf6, 0x85, 0x3a, 0x6b, 0xee, 0xe4, 0x5c, 0x5e, 0xf8, 0xda, 0xd1,
77       0xce, 0x88, 0x47, 0xcd, 0x06, 0x21, 0xe0, 0xb9, 0x4b, 0xe4, 0x07, 0xcb,
78       0x57, 0xdc, 0xca, 0x99, 0x54, 0xf7, 0x0e, 0xd5, 0x17, 0x95, 0x05, 0x2e,
79       0xe9, 0xb1, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0xce, 0x30,
80       0x82, 0x01, 0xca, 0x30, 0x09, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x02,
81       0x30, 0x00, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03,
82       0x02, 0x05, 0xa0, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x16,
83       0x30, 0x14, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01,
84       0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02, 0x30, 0x57,
85       0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x50, 0x30, 0x4e, 0x30, 0x4c, 0xa0,
86       0x4a, 0xa0, 0x48, 0x86, 0x46, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
87       0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73,
88       0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d,
89       0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x2f,
90       0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79, 0x65, 0x78, 0x74, 0x65, 0x6e,
91       0x64, 0x65, 0x64, 0x69, 0x73, 0x73, 0x75, 0x69, 0x6e, 0x67, 0x33, 0x2e,
92       0x63, 0x72, 0x6c, 0x30, 0x52, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x4b,
93       0x30, 0x49, 0x30, 0x47, 0x06, 0x0b, 0x60, 0x86, 0x48, 0x01, 0x86, 0xfd,
94       0x6d, 0x01, 0x07, 0x17, 0x02, 0x30, 0x38, 0x30, 0x36, 0x06, 0x08, 0x2b,
95       0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x2a, 0x68, 0x74, 0x74,
96       0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63,
97       0x61, 0x74, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64, 0x79,
98       0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74,
99       0x6f, 0x72, 0x79, 0x30, 0x7f, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05,
100       0x07, 0x01, 0x01, 0x04, 0x73, 0x30, 0x71, 0x30, 0x23, 0x06, 0x08, 0x2b,
101       0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x17, 0x68, 0x74, 0x74,
102       0x70, 0x3a, 0x2f, 0x2f, 0x6f, 0x63, 0x73, 0x70, 0x2e, 0x67, 0x6f, 0x64,
103       0x61, 0x64, 0x64, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x4a, 0x06, 0x08,
104       0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x3e, 0x68, 0x74,
105       0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,
106       0x63, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x67, 0x6f, 0x64, 0x61, 0x64, 0x64,
107       0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69,
108       0x74, 0x6f, 0x72, 0x79, 0x2f, 0x67, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x65,
109       0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x2e, 0x63, 0x72, 0x74,
110       0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x48,
111       0xdf, 0x60, 0x32, 0xcc, 0x89, 0x01, 0xb6, 0xdc, 0x2f, 0xe3, 0x73, 0xb5,
112       0x9c, 0x16, 0x58, 0x32, 0x68, 0xa9, 0xc3, 0x30, 0x1f, 0x06, 0x03, 0x55,
113       0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xfd, 0xac, 0x61, 0x32,
114       0x93, 0x6c, 0x45, 0xd6, 0xe2, 0xee, 0x85, 0x5f, 0x9a, 0xba, 0xe7, 0x76,
115       0x99, 0x68, 0xcc, 0xe7, 0x30, 0x23, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04,
116       0x1c, 0x30, 0x1a, 0x82, 0x0c, 0x2a, 0x2e, 0x77, 0x65, 0x62, 0x6b, 0x69,
117       0x74, 0x2e, 0x6f, 0x72, 0x67, 0x82, 0x0a, 0x77, 0x65, 0x62, 0x6b, 0x69,
118       0x74, 0x2e, 0x6f, 0x72, 0x67};
119 
120   // RSA signature, a big integer in the big-endian byte order.
121   const uint8_t signature[256] = {
122       0x1e, 0x6a, 0xe7, 0xe0, 0x4f, 0xe7, 0x4d, 0xd0, 0x69, 0x7c, 0xf8, 0x8f,
123       0x99, 0xb4, 0x18, 0x95, 0x36, 0x24, 0x0f, 0x0e, 0xa3, 0xea, 0x34, 0x37,
124       0xf4, 0x7d, 0xd5, 0x92, 0x35, 0x53, 0x72, 0x76, 0x3f, 0x69, 0xf0, 0x82,
125       0x56, 0xe3, 0x94, 0x7a, 0x1d, 0x1a, 0x81, 0xaf, 0x9f, 0xc7, 0x43, 0x01,
126       0x64, 0xd3, 0x7c, 0x0d, 0xc8, 0x11, 0x4e, 0x4a, 0xe6, 0x1a, 0xc3, 0x01,
127       0x74, 0xe8, 0x35, 0x87, 0x5c, 0x61, 0xaa, 0x8a, 0x46, 0x06, 0xbe, 0x98,
128       0x95, 0x24, 0x9e, 0x01, 0xe3, 0xe6, 0xa0, 0x98, 0xee, 0x36, 0x44, 0x56,
129       0x8d, 0x23, 0x9c, 0x65, 0xea, 0x55, 0x6a, 0xdf, 0x66, 0xee, 0x45, 0xe8,
130       0xa0, 0xe9, 0x7d, 0x9a, 0xba, 0x94, 0xc5, 0xc8, 0xc4, 0x4b, 0x98, 0xff,
131       0x9a, 0x01, 0x31, 0x6d, 0xf9, 0x2b, 0x58, 0xe7, 0xe7, 0x2a, 0xc5, 0x4d,
132       0xbb, 0xbb, 0xcd, 0x0d, 0x70, 0xe1, 0xad, 0x03, 0xf5, 0xfe, 0xf4, 0x84,
133       0x71, 0x08, 0xd2, 0xbc, 0x04, 0x7b, 0x26, 0x1c, 0xa8, 0x0f, 0x9c, 0xd8,
134       0x12, 0x6a, 0x6f, 0x2b, 0x67, 0xa1, 0x03, 0x80, 0x9a, 0x11, 0x0b, 0xe9,
135       0xe0, 0xb5, 0xb3, 0xb8, 0x19, 0x4e, 0x0c, 0xa4, 0xd9, 0x2b, 0x3b, 0xc2,
136       0xca, 0x20, 0xd3, 0x0c, 0xa4, 0xff, 0x93, 0x13, 0x1f, 0xfc, 0xba, 0x94,
137       0x93, 0x8c, 0x64, 0x15, 0x2e, 0x28, 0xa9, 0x55, 0x8c, 0x2c, 0x48, 0xd3,
138       0xd3, 0xc1, 0x50, 0x69, 0x19, 0xe8, 0x34, 0xd3, 0xf1, 0x04, 0x9f, 0x0a,
139       0x7a, 0x21, 0x87, 0xbf, 0xb9, 0x59, 0x37, 0x2e, 0xf4, 0x71, 0xa5, 0x3e,
140       0xbe, 0xcd, 0x70, 0x83, 0x18, 0xf8, 0x8a, 0x72, 0x85, 0x45, 0x1f, 0x08,
141       0x01, 0x6f, 0x37, 0xf5, 0x2b, 0x7b, 0xea, 0xb9, 0x8b, 0xa3, 0xcc, 0xfd,
142       0x35, 0x52, 0xdd, 0x66, 0xde, 0x4f, 0x30, 0xc5, 0x73, 0x81, 0xb6, 0xe8,
143       0x3c, 0xd8, 0x48, 0x8a};
144 
145   // The public key is specified as the following ASN.1 structure:
146   //   SubjectPublicKeyInfo  ::=  SEQUENCE  {
147   //       algorithm            AlgorithmIdentifier,
148   //       subjectPublicKey     BIT STRING  }
149   const uint8_t public_key_info[294] = {
150       0x30, 0x82, 0x01, 0x22,  // a SEQUENCE of length 290 (0x122)
151       // algorithm
152       0x30, 0x0d,  // a SEQUENCE of length 13
153       0x06, 0x09,  // an OBJECT IDENTIFIER of length 9
154       0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,
155       0x00,  // a NULL of length 0
156       // subjectPublicKey
157       0x03, 0x82, 0x01, 0x0f,  // a BIT STRING of length 271 (0x10f)
158       0x00,                    // number of unused bits
159       0x30, 0x82, 0x01, 0x0a,  // a SEQUENCE of length 266 (0x10a)
160       // modulus
161       0x02, 0x82, 0x01, 0x01,  // an INTEGER of length 257 (0x101)
162       0x00, 0xc4, 0x2d, 0xd5, 0x15, 0x8c, 0x9c, 0x26, 0x4c, 0xec, 0x32, 0x35,
163       0xeb, 0x5f, 0xb8, 0x59, 0x01, 0x5a, 0xa6, 0x61, 0x81, 0x59, 0x3b, 0x70,
164       0x63, 0xab, 0xe3, 0xdc, 0x3d, 0xc7, 0x2a, 0xb8, 0xc9, 0x33, 0xd3, 0x79,
165       0xe4, 0x3a, 0xed, 0x3c, 0x30, 0x23, 0x84, 0x8e, 0xb3, 0x30, 0x14, 0xb6,
166       0xb2, 0x87, 0xc3, 0x3d, 0x95, 0x54, 0x04, 0x9e, 0xdf, 0x99, 0xdd, 0x0b,
167       0x25, 0x1e, 0x21, 0xde, 0x65, 0x29, 0x7e, 0x35, 0xa8, 0xa9, 0x54, 0xeb,
168       0xf6, 0xf7, 0x32, 0x39, 0xd4, 0x26, 0x55, 0x95, 0xad, 0xef, 0xfb, 0xfe,
169       0x58, 0x86, 0xd7, 0x9e, 0xf4, 0x00, 0x8d, 0x8c, 0x2a, 0x0c, 0xbd, 0x42,
170       0x04, 0xce, 0xa7, 0x3f, 0x04, 0xf6, 0xee, 0x80, 0xf2, 0xaa, 0xef, 0x52,
171       0xa1, 0x69, 0x66, 0xda, 0xbe, 0x1a, 0xad, 0x5d, 0xda, 0x2c, 0x66, 0xea,
172       0x1a, 0x6b, 0xbb, 0xe5, 0x1a, 0x51, 0x4a, 0x00, 0x2f, 0x48, 0xc7, 0x98,
173       0x75, 0xd8, 0xb9, 0x29, 0xc8, 0xee, 0xf8, 0x66, 0x6d, 0x0a, 0x9c, 0xb3,
174       0xf3, 0xfc, 0x78, 0x7c, 0xa2, 0xf8, 0xa3, 0xf2, 0xb5, 0xc3, 0xf3, 0xb9,
175       0x7a, 0x91, 0xc1, 0xa7, 0xe6, 0x25, 0x2e, 0x9c, 0xa8, 0xed, 0x12, 0x65,
176       0x6e, 0x6a, 0xf6, 0x12, 0x44, 0x53, 0x70, 0x30, 0x95, 0xc3, 0x9c, 0x2b,
177       0x58, 0x2b, 0x3d, 0x08, 0x74, 0x4a, 0xf2, 0xbe, 0x51, 0xb0, 0xbf, 0x87,
178       0xd0, 0x4c, 0x27, 0x58, 0x6b, 0xb5, 0x35, 0xc5, 0x9d, 0xaf, 0x17, 0x31,
179       0xf8, 0x0b, 0x8f, 0xee, 0xad, 0x81, 0x36, 0x05, 0x89, 0x08, 0x98, 0xcf,
180       0x3a, 0xaf, 0x25, 0x87, 0xc0, 0x49, 0xea, 0xa7, 0xfd, 0x67, 0xf7, 0x45,
181       0x8e, 0x97, 0xcc, 0x14, 0x39, 0xe2, 0x36, 0x85, 0xb5, 0x7e, 0x1a, 0x37,
182       0xfd, 0x16, 0xf6, 0x71, 0x11, 0x9a, 0x74, 0x30, 0x16, 0xfe, 0x13, 0x94,
183       0xa3, 0x3f, 0x84, 0x0d, 0x4f,
184       // public exponent
185       0x02, 0x03,  // an INTEGER of length 3
186       0x01, 0x00, 0x01};
187 
188   // We use the signature verifier to perform four signature verification
189   // tests.
190   crypto::SignatureVerifier verifier;
191   bool ok;
192 
193   // Test  1: feed all of the data to the verifier at once (a single
194   // VerifyUpdate call).
195   ok = verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1, signature,
196                            sizeof(signature), public_key_info,
197                            sizeof(public_key_info));
198   EXPECT_TRUE(ok);
199   verifier.VerifyUpdate(tbs_certificate, sizeof(tbs_certificate));
200   ok = verifier.VerifyFinal();
201   EXPECT_TRUE(ok);
202 
203   // Test 2: feed the data to the verifier in three parts (three VerifyUpdate
204   // calls).
205   ok = verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1, signature,
206                            sizeof(signature), public_key_info,
207                            sizeof(public_key_info));
208   EXPECT_TRUE(ok);
209   verifier.VerifyUpdate(tbs_certificate, 256);
210   verifier.VerifyUpdate(tbs_certificate + 256, 256);
211   verifier.VerifyUpdate(tbs_certificate + 512, sizeof(tbs_certificate) - 512);
212   ok = verifier.VerifyFinal();
213   EXPECT_TRUE(ok);
214 
215   // Test 3: verify the signature with incorrect data.
216   uint8_t bad_tbs_certificate[sizeof(tbs_certificate)];
217   memcpy(bad_tbs_certificate, tbs_certificate, sizeof(tbs_certificate));
218   bad_tbs_certificate[10] += 1;  // Corrupt one byte of the data.
219   ok = verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1, signature,
220                            sizeof(signature), public_key_info,
221                            sizeof(public_key_info));
222   EXPECT_TRUE(ok);
223   verifier.VerifyUpdate(bad_tbs_certificate, sizeof(bad_tbs_certificate));
224   ok = verifier.VerifyFinal();
225   EXPECT_FALSE(ok);
226 
227   // Test 4: verify a bad signature.
228   uint8_t bad_signature[sizeof(signature)];
229   memcpy(bad_signature, signature, sizeof(signature));
230   bad_signature[10] += 1;  // Corrupt one byte of the signature.
231   ok = verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1,
232                            bad_signature, sizeof(bad_signature),
233                            public_key_info, sizeof(public_key_info));
234 
235   // A crypto library (e.g., NSS) may detect that the signature is corrupted
236   // and cause VerifyInit to return false, so it is fine for 'ok' to be false.
237   if (ok) {
238     verifier.VerifyUpdate(tbs_certificate, sizeof(tbs_certificate));
239     ok = verifier.VerifyFinal();
240     EXPECT_FALSE(ok);
241   }
242 
243   // Test 5: import an invalid key.
244   uint8_t bad_public_key_info[sizeof(public_key_info)];
245   memcpy(bad_public_key_info, public_key_info, sizeof(public_key_info));
246   bad_public_key_info[0] += 1;  // Corrupt part of the SPKI syntax.
247   ok = verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1, signature,
248                            sizeof(signature), bad_public_key_info,
249                            sizeof(bad_public_key_info));
250   EXPECT_FALSE(ok);
251 
252   // Test 6: import a key with extra data.
253   uint8_t long_public_key_info[sizeof(public_key_info) + 5];
254   memset(long_public_key_info, 0, sizeof(long_public_key_info));
255   memcpy(long_public_key_info, public_key_info, sizeof(public_key_info));
256   ok = verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1, signature,
257                            sizeof(signature), long_public_key_info,
258                            sizeof(long_public_key_info));
259   EXPECT_FALSE(ok);
260 }
261 
262 //////////////////////////////////////////////////////////////////////
263 //
264 // RSA-PSS signature verification known answer test
265 //
266 //////////////////////////////////////////////////////////////////////
267 
268 // The following RSA-PSS signature test vectors come from the pss-vect.txt
269 // file downloaded from
270 // ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1-vec.zip.
271 //
272 // For each key, 6 random messages of length between 1 and 256 octets have
273 // been RSASSA-PSS signed.
274 //
275 // Hash function: SHA-1
276 // Mask generation function: MGF1 with SHA-1
277 // Salt length: 20 octets
278 
279 // Example 1: A 1024-bit RSA Key Pair"
280 
281 // RSA modulus n:
282 static const char rsa_modulus_n_1[] =
283   "a5 6e 4a 0e 70 10 17 58 9a 51 87 dc 7e a8 41 d1 "
284   "56 f2 ec 0e 36 ad 52 a4 4d fe b1 e6 1f 7a d9 91 "
285   "d8 c5 10 56 ff ed b1 62 b4 c0 f2 83 a1 2a 88 a3 "
286   "94 df f5 26 ab 72 91 cb b3 07 ce ab fc e0 b1 df "
287   "d5 cd 95 08 09 6d 5b 2b 8b 6d f5 d6 71 ef 63 77 "
288   "c0 92 1c b2 3c 27 0a 70 e2 59 8e 6f f8 9d 19 f1 "
289   "05 ac c2 d3 f0 cb 35 f2 92 80 e1 38 6b 6f 64 c4 "
290   "ef 22 e1 e1 f2 0d 0c e8 cf fb 22 49 bd 9a 21 37 ";
291 // RSA public exponent e: "
292 static const char rsa_public_exponent_e_1[] =
293   "01 00 01 ";
294 
295 // RSASSA-PSS Signature Example 1.1
296 // Message to be signed:
297 static const char message_1_1[] =
298   "cd c8 7d a2 23 d7 86 df 3b 45 e0 bb bc 72 13 26 "
299   "d1 ee 2a f8 06 cc 31 54 75 cc 6f 0d 9c 66 e1 b6 "
300   "23 71 d4 5c e2 39 2e 1a c9 28 44 c3 10 10 2f 15 "
301   "6a 0d 8d 52 c1 f4 c4 0b a3 aa 65 09 57 86 cb 76 "
302   "97 57 a6 56 3b a9 58 fe d0 bc c9 84 e8 b5 17 a3 "
303   "d5 f5 15 b2 3b 8a 41 e7 4a a8 67 69 3f 90 df b0 "
304   "61 a6 e8 6d fa ae e6 44 72 c0 0e 5f 20 94 57 29 "
305   "cb eb e7 7f 06 ce 78 e0 8f 40 98 fb a4 1f 9d 61 "
306   "93 c0 31 7e 8b 60 d4 b6 08 4a cb 42 d2 9e 38 08 "
307   "a3 bc 37 2d 85 e3 31 17 0f cb f7 cc 72 d0 b7 1c "
308   "29 66 48 b3 a4 d1 0f 41 62 95 d0 80 7a a6 25 ca "
309   "b2 74 4f d9 ea 8f d2 23 c4 25 37 02 98 28 bd 16 "
310   "be 02 54 6f 13 0f d2 e3 3b 93 6d 26 76 e0 8a ed "
311   "1b 73 31 8b 75 0a 01 67 d0 ";
312 // Salt:
313 static const char salt_1_1[] =
314   "de e9 59 c7 e0 64 11 36 14 20 ff 80 18 5e d5 7f "
315   "3e 67 76 af ";
316 // Signature:
317 static const char signature_1_1[] =
318   "90 74 30 8f b5 98 e9 70 1b 22 94 38 8e 52 f9 71 "
319   "fa ac 2b 60 a5 14 5a f1 85 df 52 87 b5 ed 28 87 "
320   "e5 7c e7 fd 44 dc 86 34 e4 07 c8 e0 e4 36 0b c2 "
321   "26 f3 ec 22 7f 9d 9e 54 63 8e 8d 31 f5 05 12 15 "
322   "df 6e bb 9c 2f 95 79 aa 77 59 8a 38 f9 14 b5 b9 "
323   "c1 bd 83 c4 e2 f9 f3 82 a0 d0 aa 35 42 ff ee 65 "
324   "98 4a 60 1b c6 9e b2 8d eb 27 dc a1 2c 82 c2 d4 "
325   "c3 f6 6c d5 00 f1 ff 2b 99 4d 8a 4e 30 cb b3 3c ";
326 
327 // RSASSA-PSS Signature Example 1.2
328 // Message to be signed:
329 static const char message_1_2[] =
330   "85 13 84 cd fe 81 9c 22 ed 6c 4c cb 30 da eb 5c "
331   "f0 59 bc 8e 11 66 b7 e3 53 0c 4c 23 3e 2b 5f 8f "
332   "71 a1 cc a5 82 d4 3e cc 72 b1 bc a1 6d fc 70 13 "
333   "22 6b 9e ";
334 // Salt:
335 static const char salt_1_2[] =
336   "ef 28 69 fa 40 c3 46 cb 18 3d ab 3d 7b ff c9 8f "
337   "d5 6d f4 2d ";
338 // Signature:
339 static const char signature_1_2[] =
340   "3e f7 f4 6e 83 1b f9 2b 32 27 41 42 a5 85 ff ce "
341   "fb dc a7 b3 2a e9 0d 10 fb 0f 0c 72 99 84 f0 4e "
342   "f2 9a 9d f0 78 07 75 ce 43 73 9b 97 83 83 90 db "
343   "0a 55 05 e6 3d e9 27 02 8d 9d 29 b2 19 ca 2c 45 "
344   "17 83 25 58 a5 5d 69 4a 6d 25 b9 da b6 60 03 c4 "
345   "cc cd 90 78 02 19 3b e5 17 0d 26 14 7d 37 b9 35 "
346   "90 24 1b e5 1c 25 05 5f 47 ef 62 75 2c fb e2 14 "
347   "18 fa fe 98 c2 2c 4d 4d 47 72 4f db 56 69 e8 43 ";
348 
349 // RSASSA-PSS Signature Example 1.3
350 // Message to be signed:
351 static const char message_1_3[] =
352   "a4 b1 59 94 17 61 c4 0c 6a 82 f2 b8 0d 1b 94 f5 "
353   "aa 26 54 fd 17 e1 2d 58 88 64 67 9b 54 cd 04 ef "
354   "8b d0 30 12 be 8d c3 7f 4b 83 af 79 63 fa ff 0d "
355   "fa 22 54 77 43 7c 48 01 7f f2 be 81 91 cf 39 55 "
356   "fc 07 35 6e ab 3f 32 2f 7f 62 0e 21 d2 54 e5 db "
357   "43 24 27 9f e0 67 e0 91 0e 2e 81 ca 2c ab 31 c7 "
358   "45 e6 7a 54 05 8e b5 0d 99 3c db 9e d0 b4 d0 29 "
359   "c0 6d 21 a9 4c a6 61 c3 ce 27 fa e1 d6 cb 20 f4 "
360   "56 4d 66 ce 47 67 58 3d 0e 5f 06 02 15 b5 90 17 "
361   "be 85 ea 84 89 39 12 7b d8 c9 c4 d4 7b 51 05 6c "
362   "03 1c f3 36 f1 7c 99 80 f3 b8 f5 b9 b6 87 8e 8b "
363   "79 7a a4 3b 88 26 84 33 3e 17 89 3f e9 ca a6 aa "
364   "29 9f 7e d1 a1 8e e2 c5 48 64 b7 b2 b9 9b 72 61 "
365   "8f b0 25 74 d1 39 ef 50 f0 19 c9 ee f4 16 97 13 "
366   "38 e7 d4 70 ";
367 // Salt:
368 static const char salt_1_3[] =
369   "71 0b 9c 47 47 d8 00 d4 de 87 f1 2a fd ce 6d f1 "
370   "81 07 cc 77 ";
371 // Signature:
372 static const char signature_1_3[] =
373   "66 60 26 fb a7 1b d3 e7 cf 13 15 7c c2 c5 1a 8e "
374   "4a a6 84 af 97 78 f9 18 49 f3 43 35 d1 41 c0 01 "
375   "54 c4 19 76 21 f9 62 4a 67 5b 5a bc 22 ee 7d 5b "
376   "aa ff aa e1 c9 ba ca 2c c3 73 b3 f3 3e 78 e6 14 "
377   "3c 39 5a 91 aa 7f ac a6 64 eb 73 3a fd 14 d8 82 "
378   "72 59 d9 9a 75 50 fa ca 50 1e f2 b0 4e 33 c2 3a "
379   "a5 1f 4b 9e 82 82 ef db 72 8c c0 ab 09 40 5a 91 "
380   "60 7c 63 69 96 1b c8 27 0d 2d 4f 39 fc e6 12 b1 ";
381 
382 // RSASSA-PSS Signature Example 1.4
383 // Message to be signed:
384 static const char message_1_4[] =
385   "bc 65 67 47 fa 9e af b3 f0 ";
386 // Salt:
387 static const char salt_1_4[] =
388   "05 6f 00 98 5d e1 4d 8e f5 ce a9 e8 2f 8c 27 be "
389   "f7 20 33 5e ";
390 // Signature:
391 static const char signature_1_4[] =
392   "46 09 79 3b 23 e9 d0 93 62 dc 21 bb 47 da 0b 4f "
393   "3a 76 22 64 9a 47 d4 64 01 9b 9a ea fe 53 35 9c "
394   "17 8c 91 cd 58 ba 6b cb 78 be 03 46 a7 bc 63 7f "
395   "4b 87 3d 4b ab 38 ee 66 1f 19 96 34 c5 47 a1 ad "
396   "84 42 e0 3d a0 15 b1 36 e5 43 f7 ab 07 c0 c1 3e "
397   "42 25 b8 de 8c ce 25 d4 f6 eb 84 00 f8 1f 7e 18 "
398   "33 b7 ee 6e 33 4d 37 09 64 ca 79 fd b8 72 b4 d7 "
399   "52 23 b5 ee b0 81 01 59 1f b5 32 d1 55 a6 de 87 ";
400 
401 // RSASSA-PSS Signature Example 1.5
402 // Message to be signed:
403 static const char message_1_5[] =
404   "b4 55 81 54 7e 54 27 77 0c 76 8e 8b 82 b7 55 64 "
405   "e0 ea 4e 9c 32 59 4d 6b ff 70 65 44 de 0a 87 76 "
406   "c7 a8 0b 45 76 55 0e ee 1b 2a ca bc 7e 8b 7d 3e "
407   "f7 bb 5b 03 e4 62 c1 10 47 ea dd 00 62 9a e5 75 "
408   "48 0a c1 47 0f e0 46 f1 3a 2b f5 af 17 92 1d c4 "
409   "b0 aa 8b 02 be e6 33 49 11 65 1d 7f 85 25 d1 0f "
410   "32 b5 1d 33 be 52 0d 3d df 5a 70 99 55 a3 df e7 "
411   "82 83 b9 e0 ab 54 04 6d 15 0c 17 7f 03 7f dc cc "
412   "5b e4 ea 5f 68 b5 e5 a3 8c 9d 7e dc cc c4 97 5f "
413   "45 5a 69 09 b4 ";
414 // Salt:
415 static const char salt_1_5[] =
416   "80 e7 0f f8 6a 08 de 3e c6 09 72 b3 9b 4f bf dc "
417   "ea 67 ae 8e ";
418 // Signature:
419 static const char signature_1_5[] =
420   "1d 2a ad 22 1c a4 d3 1d df 13 50 92 39 01 93 98 "
421   "e3 d1 4b 32 dc 34 dc 5a f4 ae ae a3 c0 95 af 73 "
422   "47 9c f0 a4 5e 56 29 63 5a 53 a0 18 37 76 15 b1 "
423   "6c b9 b1 3b 3e 09 d6 71 eb 71 e3 87 b8 54 5c 59 "
424   "60 da 5a 64 77 6e 76 8e 82 b2 c9 35 83 bf 10 4c "
425   "3f db 23 51 2b 7b 4e 89 f6 33 dd 00 63 a5 30 db "
426   "45 24 b0 1c 3f 38 4c 09 31 0e 31 5a 79 dc d3 d6 "
427   "84 02 2a 7f 31 c8 65 a6 64 e3 16 97 8b 75 9f ad ";
428 
429 // RSASSA-PSS Signature Example 1.6
430 // Message to be signed:
431 static const char message_1_6[] =
432   "10 aa e9 a0 ab 0b 59 5d 08 41 20 7b 70 0d 48 d7 "
433   "5f ae dd e3 b7 75 cd 6b 4c c8 8a e0 6e 46 94 ec "
434   "74 ba 18 f8 52 0d 4f 5e a6 9c bb e7 cc 2b eb a4 "
435   "3e fd c1 02 15 ac 4e b3 2d c3 02 a1 f5 3d c6 c4 "
436   "35 22 67 e7 93 6c fe bf 7c 8d 67 03 57 84 a3 90 "
437   "9f a8 59 c7 b7 b5 9b 8e 39 c5 c2 34 9f 18 86 b7 "
438   "05 a3 02 67 d4 02 f7 48 6a b4 f5 8c ad 5d 69 ad "
439   "b1 7a b8 cd 0c e1 ca f5 02 5a f4 ae 24 b1 fb 87 "
440   "94 c6 07 0c c0 9a 51 e2 f9 91 13 11 e3 87 7d 00 "
441   "44 c7 1c 57 a9 93 39 50 08 80 6b 72 3a c3 83 73 "
442   "d3 95 48 18 18 52 8c 1e 70 53 73 92 82 05 35 29 "
443   "51 0e 93 5c d0 fa 77 b8 fa 53 cc 2d 47 4b d4 fb "
444   "3c c5 c6 72 d6 ff dc 90 a0 0f 98 48 71 2c 4b cf "
445   "e4 6c 60 57 36 59 b1 1e 64 57 e8 61 f0 f6 04 b6 "
446   "13 8d 14 4f 8c e4 e2 da 73 ";
447 // Salt:
448 static const char salt_1_6[] =
449   "a8 ab 69 dd 80 1f 00 74 c2 a1 fc 60 64 98 36 c6 "
450   "16 d9 96 81 ";
451 // Signature:
452 static const char signature_1_6[] =
453   "2a 34 f6 12 5e 1f 6b 0b f9 71 e8 4f bd 41 c6 32 "
454   "be 8f 2c 2a ce 7d e8 b6 92 6e 31 ff 93 e9 af 98 "
455   "7f bc 06 e5 1e 9b e1 4f 51 98 f9 1f 3f 95 3b d6 "
456   "7d a6 0a 9d f5 97 64 c3 dc 0f e0 8e 1c be f0 b7 "
457   "5f 86 8d 10 ad 3f ba 74 9f ef 59 fb 6d ac 46 a0 "
458   "d6 e5 04 36 93 31 58 6f 58 e4 62 8f 39 aa 27 89 "
459   "82 54 3b c0 ee b5 37 dc 61 95 80 19 b3 94 fb 27 "
460   "3f 21 58 58 a0 a0 1a c4 d6 50 b9 55 c6 7f 4c 58 ";
461 
462 // Example 9: A 1536-bit RSA Key Pair
463 
464 // RSA modulus n:
465 static const char rsa_modulus_n_9[] =
466   "e6 bd 69 2a c9 66 45 79 04 03 fd d0 f5 be b8 b9 "
467   "bf 92 ed 10 00 7f c3 65 04 64 19 dd 06 c0 5c 5b "
468   "5b 2f 48 ec f9 89 e4 ce 26 91 09 97 9c bb 40 b4 "
469   "a0 ad 24 d2 24 83 d1 ee 31 5a d4 cc b1 53 42 68 "
470   "35 26 91 c5 24 f6 dd 8e 6c 29 d2 24 cf 24 69 73 "
471   "ae c8 6c 5b f6 b1 40 1a 85 0d 1b 9a d1 bb 8c bc "
472   "ec 47 b0 6f 0f 8c 7f 45 d3 fc 8f 31 92 99 c5 43 "
473   "3d db c2 b3 05 3b 47 de d2 ec d4 a4 ca ef d6 14 "
474   "83 3d c8 bb 62 2f 31 7e d0 76 b8 05 7f e8 de 3f "
475   "84 48 0a d5 e8 3e 4a 61 90 4a 4f 24 8f b3 97 02 "
476   "73 57 e1 d3 0e 46 31 39 81 5c 6f d4 fd 5a c5 b8 "
477   "17 2a 45 23 0e cb 63 18 a0 4f 14 55 d8 4e 5a 8b ";
478 // RSA public exponent e:
479 static const char rsa_public_exponent_e_9[] =
480   "01 00 01 ";
481 
482 // RSASSA-PSS Signature Example 9.1
483 // Message to be signed:
484 static const char message_9_1[] =
485   "a8 8e 26 58 55 e9 d7 ca 36 c6 87 95 f0 b3 1b 59 "
486   "1c d6 58 7c 71 d0 60 a0 b3 f7 f3 ea ef 43 79 59 "
487   "22 02 8b c2 b6 ad 46 7c fc 2d 7f 65 9c 53 85 aa "
488   "70 ba 36 72 cd de 4c fe 49 70 cc 79 04 60 1b 27 "
489   "88 72 bf 51 32 1c 4a 97 2f 3c 95 57 0f 34 45 d4 "
490   "f5 79 80 e0 f2 0d f5 48 46 e6 a5 2c 66 8f 12 88 "
491   "c0 3f 95 00 6e a3 2f 56 2d 40 d5 2a f9 fe b3 2f "
492   "0f a0 6d b6 5b 58 8a 23 7b 34 e5 92 d5 5c f9 79 "
493   "f9 03 a6 42 ef 64 d2 ed 54 2a a8 c7 7d c1 dd 76 "
494   "2f 45 a5 93 03 ed 75 e5 41 ca 27 1e 2b 60 ca 70 "
495   "9e 44 fa 06 61 13 1e 8d 5d 41 63 fd 8d 39 85 66 "
496   "ce 26 de 87 30 e7 2f 9c ca 73 76 41 c2 44 15 94 "
497   "20 63 70 28 df 0a 18 07 9d 62 08 ea 8b 47 11 a2 "
498   "c7 50 f5 ";
499 // Salt:
500 static const char salt_9_1[] =
501   "c0 a4 25 31 3d f8 d7 56 4b d2 43 4d 31 15 23 d5 "
502   "25 7e ed 80 ";
503 // Signature:
504 static const char signature_9_1[] =
505   "58 61 07 22 6c 3c e0 13 a7 c8 f0 4d 1a 6a 29 59 "
506   "bb 4b 8e 20 5b a4 3a 27 b5 0f 12 41 11 bc 35 ef "
507   "58 9b 03 9f 59 32 18 7c b6 96 d7 d9 a3 2c 0c 38 "
508   "30 0a 5c dd a4 83 4b 62 d2 eb 24 0a f3 3f 79 d1 "
509   "3d fb f0 95 bf 59 9e 0d 96 86 94 8c 19 64 74 7b "
510   "67 e8 9c 9a ba 5c d8 50 16 23 6f 56 6c c5 80 2c "
511   "b1 3e ad 51 bc 7c a6 be f3 b9 4d cb db b1 d5 70 "
512   "46 97 71 df 0e 00 b1 a8 a0 67 77 47 2d 23 16 27 "
513   "9e da e8 64 74 66 8d 4e 1e ff f9 5f 1d e6 1c 60 "
514   "20 da 32 ae 92 bb f1 65 20 fe f3 cf 4d 88 f6 11 "
515   "21 f2 4b bd 9f e9 1b 59 ca f1 23 5b 2a 93 ff 81 "
516   "fc 40 3a dd f4 eb de a8 49 34 a9 cd af 8e 1a 9e ";
517 
518 // RSASSA-PSS Signature Example 9.2
519 // Message to be signed:
520 static const char message_9_2[] =
521   "c8 c9 c6 af 04 ac da 41 4d 22 7e f2 3e 08 20 c3 "
522   "73 2c 50 0d c8 72 75 e9 5b 0d 09 54 13 99 3c 26 "
523   "58 bc 1d 98 85 81 ba 87 9c 2d 20 1f 14 cb 88 ce "
524   "d1 53 a0 19 69 a7 bf 0a 7b e7 9c 84 c1 48 6b c1 "
525   "2b 3f a6 c5 98 71 b6 82 7c 8c e2 53 ca 5f ef a8 "
526   "a8 c6 90 bf 32 6e 8e 37 cd b9 6d 90 a8 2e ba b6 "
527   "9f 86 35 0e 18 22 e8 bd 53 6a 2e ";
528 // Salt:
529 static const char salt_9_2[] =
530   "b3 07 c4 3b 48 50 a8 da c2 f1 5f 32 e3 78 39 ef "
531   "8c 5c 0e 91 ";
532 // Signature:
533 static const char signature_9_2[] =
534   "80 b6 d6 43 25 52 09 f0 a4 56 76 38 97 ac 9e d2 "
535   "59 d4 59 b4 9c 28 87 e5 88 2e cb 44 34 cf d6 6d "
536   "d7 e1 69 93 75 38 1e 51 cd 7f 55 4f 2c 27 17 04 "
537   "b3 99 d4 2b 4b e2 54 0a 0e ca 61 95 1f 55 26 7f "
538   "7c 28 78 c1 22 84 2d ad b2 8b 01 bd 5f 8c 02 5f "
539   "7e 22 84 18 a6 73 c0 3d 6b c0 c7 36 d0 a2 95 46 "
540   "bd 67 f7 86 d9 d6 92 cc ea 77 8d 71 d9 8c 20 63 "
541   "b7 a7 10 92 18 7a 4d 35 af 10 81 11 d8 3e 83 ea "
542   "e4 6c 46 aa 34 27 7e 06 04 45 89 90 37 88 f1 d5 "
543   "e7 ce e2 5f b4 85 e9 29 49 11 88 14 d6 f2 c3 ee "
544   "36 14 89 01 6f 32 7f b5 bc 51 7e b5 04 70 bf fa "
545   "1a fa 5f 4c e9 aa 0c e5 b8 ee 19 bf 55 01 b9 58 ";
546 
547 // RSASSA-PSS Signature Example 9.3
548 // Message to be signed:
549 static const char message_9_3[] =
550   "0a fa d4 2c cd 4f c6 06 54 a5 50 02 d2 28 f5 2a "
551   "4a 5f e0 3b 8b bb 08 ca 82 da ca 55 8b 44 db e1 "
552   "26 6e 50 c0 e7 45 a3 6d 9d 29 04 e3 40 8a bc d1 "
553   "fd 56 99 94 06 3f 4a 75 cc 72 f2 fe e2 a0 cd 89 "
554   "3a 43 af 1c 5b 8b 48 7d f0 a7 16 10 02 4e 4f 6d "
555   "df 9f 28 ad 08 13 c1 aa b9 1b cb 3c 90 64 d5 ff "
556   "74 2d ef fe a6 57 09 41 39 36 9e 5e a6 f4 a9 63 "
557   "19 a5 cc 82 24 14 5b 54 50 62 75 8f ef d1 fe 34 "
558   "09 ae 16 92 59 c6 cd fd 6b 5f 29 58 e3 14 fa ec "
559   "be 69 d2 ca ce 58 ee 55 17 9a b9 b3 e6 d1 ec c1 "
560   "4a 55 7c 5f eb e9 88 59 52 64 fc 5d a1 c5 71 46 "
561   "2e ca 79 8a 18 a1 a4 94 0c da b4 a3 e9 20 09 cc "
562   "d4 2e 1e 94 7b 13 14 e3 22 38 a2 de ce 7d 23 a8 "
563   "9b 5b 30 c7 51 fd 0a 4a 43 0d 2c 54 85 94 ";
564 // Salt:
565 static const char salt_9_3[] =
566   "9a 2b 00 7e 80 97 8b bb 19 2c 35 4e b7 da 9a ed "
567   "fc 74 db f5 ";
568 // Signature:
569 static const char signature_9_3[] =
570   "48 44 08 f3 89 8c d5 f5 34 83 f8 08 19 ef bf 27 "
571   "08 c3 4d 27 a8 b2 a6 fa e8 b3 22 f9 24 02 37 f9 "
572   "81 81 7a ca 18 46 f1 08 4d aa 6d 7c 07 95 f6 e5 "
573   "bf 1a f5 9c 38 e1 85 84 37 ce 1f 7e c4 19 b9 8c "
574   "87 36 ad f6 dd 9a 00 b1 80 6d 2b d3 ad 0a 73 77 "
575   "5e 05 f5 2d fe f3 a5 9a b4 b0 81 43 f0 df 05 cd "
576   "1a d9 d0 4b ec ec a6 da a4 a2 12 98 03 e2 00 cb "
577   "c7 77 87 ca f4 c1 d0 66 3a 6c 59 87 b6 05 95 20 "
578   "19 78 2c af 2e c1 42 6d 68 fb 94 ed 1d 4b e8 16 "
579   "a7 ed 08 1b 77 e6 ab 33 0b 3f fc 07 38 20 fe cd "
580   "e3 72 7f cb e2 95 ee 61 a0 50 a3 43 65 86 37 c3 "
581   "fd 65 9c fb 63 73 6d e3 2d 9f 90 d3 c2 f6 3e ca ";
582 
583 // RSASSA-PSS Signature Example 9.4
584 // Message to be signed:
585 static const char message_9_4[] =
586   "1d fd 43 b4 6c 93 db 82 62 9b da e2 bd 0a 12 b8 "
587   "82 ea 04 c3 b4 65 f5 cf 93 02 3f 01 05 96 26 db "
588   "be 99 f2 6b b1 be 94 9d dd d1 6d c7 f3 de bb 19 "
589   "a1 94 62 7f 0b 22 44 34 df 7d 87 00 e9 e9 8b 06 "
590   "e3 60 c1 2f db e3 d1 9f 51 c9 68 4e b9 08 9e cb "
591   "b0 a2 f0 45 03 99 d3 f5 9e ac 72 94 08 5d 04 4f "
592   "53 93 c6 ce 73 74 23 d8 b8 6c 41 53 70 d3 89 e3 "
593   "0b 9f 0a 3c 02 d2 5d 00 82 e8 ad 6f 3f 1e f2 4a "
594   "45 c3 cf 82 b3 83 36 70 63 a4 d4 61 3e 42 64 f0 "
595   "1b 2d ac 2e 5a a4 20 43 f8 fb 5f 69 fa 87 1d 14 "
596   "fb 27 3e 76 7a 53 1c 40 f0 2f 34 3b c2 fb 45 a0 "
597   "c7 e0 f6 be 25 61 92 3a 77 21 1d 66 a6 e2 db b4 "
598   "3c 36 63 50 be ae 22 da 3a c2 c1 f5 07 70 96 fc "
599   "b5 c4 bf 25 5f 75 74 35 1a e0 b1 e1 f0 36 32 81 "
600   "7c 08 56 d4 a8 ba 97 af bd c8 b8 58 55 40 2b c5 "
601   "69 26 fc ec 20 9f 9e a8 ";
602 // Salt:
603 static const char salt_9_4[] =
604   "70 f3 82 bd df 4d 5d 2d d8 8b 3b c7 b7 30 8b e6 "
605   "32 b8 40 45 ";
606 // Signature:
607 static const char signature_9_4[] =
608   "84 eb eb 48 1b e5 98 45 b4 64 68 ba fb 47 1c 01 "
609   "12 e0 2b 23 5d 84 b5 d9 11 cb d1 92 6e e5 07 4a "
610   "e0 42 44 95 cb 20 e8 23 08 b8 eb b6 5f 41 9a 03 "
611   "fb 40 e7 2b 78 98 1d 88 aa d1 43 05 36 85 17 2c "
612   "97 b2 9c 8b 7b f0 ae 73 b5 b2 26 3c 40 3d a0 ed "
613   "2f 80 ff 74 50 af 78 28 eb 8b 86 f0 02 8b d2 a8 "
614   "b1 76 a4 d2 28 cc ce a1 83 94 f2 38 b0 9f f7 58 "
615   "cc 00 bc 04 30 11 52 35 57 42 f2 82 b5 4e 66 3a "
616   "91 9e 70 9d 8d a2 4a de 55 00 a7 b9 aa 50 22 6e "
617   "0c a5 29 23 e6 c2 d8 60 ec 50 ff 48 0f a5 74 77 "
618   "e8 2b 05 65 f4 37 9f 79 c7 72 d5 c2 da 80 af 9f "
619   "bf 32 5e ce 6f c2 0b 00 96 16 14 be e8 9a 18 3e ";
620 
621 // RSASSA-PSS Signature Example 9.5
622 // Message to be signed:
623 static const char message_9_5[] =
624   "1b dc 6e 7c 98 fb 8c f5 4e 9b 09 7b 66 a8 31 e9 "
625   "cf e5 2d 9d 48 88 44 8e e4 b0 97 80 93 ba 1d 7d "
626   "73 ae 78 b3 a6 2b a4 ad 95 cd 28 9c cb 9e 00 52 "
627   "26 bb 3d 17 8b cc aa 82 1f b0 44 a4 e2 1e e9 76 "
628   "96 c1 4d 06 78 c9 4c 2d ae 93 b0 ad 73 92 22 18 "
629   "55 3d aa 7e 44 eb e5 77 25 a7 a4 5c c7 2b 9b 21 "
630   "38 a6 b1 7c 8d b4 11 ce 82 79 ee 12 41 af f0 a8 "
631   "be c6 f7 7f 87 ed b0 c6 9c b2 72 36 e3 43 5a 80 "
632   "0b 19 2e 4f 11 e5 19 e3 fe 30 fc 30 ea cc ca 4f "
633   "bb 41 76 90 29 bf 70 8e 81 7a 9e 68 38 05 be 67 "
634   "fa 10 09 84 68 3b 74 83 8e 3b cf fa 79 36 6e ed "
635   "1d 48 1c 76 72 91 18 83 8f 31 ba 8a 04 8a 93 c1 "
636   "be 44 24 59 8e 8d f6 32 8b 7a 77 88 0a 3f 9c 7e "
637   "2e 8d fc a8 eb 5a 26 fb 86 bd c5 56 d4 2b be 01 "
638   "d9 fa 6e d8 06 46 49 1c 93 41 ";
639 // Salt:
640 static const char salt_9_5[] =
641   "d6 89 25 7a 86 ef fa 68 21 2c 5e 0c 61 9e ca 29 "
642   "5f b9 1b 67 ";
643 // Signature:
644 static const char signature_9_5[] =
645   "82 10 2d f8 cb 91 e7 17 99 19 a0 4d 26 d3 35 d6 "
646   "4f bc 2f 87 2c 44 83 39 43 24 1d e8 45 48 10 27 "
647   "4c df 3d b5 f4 2d 42 3d b1 52 af 71 35 f7 01 42 "
648   "0e 39 b4 94 a6 7c bf d1 9f 91 19 da 23 3a 23 da "
649   "5c 64 39 b5 ba 0d 2b c3 73 ee e3 50 70 01 37 8d "
650   "4a 40 73 85 6b 7f e2 ab a0 b5 ee 93 b2 7f 4a fe "
651   "c7 d4 d1 20 92 1c 83 f6 06 76 5b 02 c1 9e 4d 6a "
652   "1a 3b 95 fa 4c 42 29 51 be 4f 52 13 10 77 ef 17 "
653   "17 97 29 cd df bd b5 69 50 db ac ee fe 78 cb 16 "
654   "64 0a 09 9e a5 6d 24 38 9e ef 10 f8 fe cb 31 ba "
655   "3e a3 b2 27 c0 a8 66 98 bb 89 e3 e9 36 39 05 bf "
656   "22 77 7b 2a 3a a5 21 b6 5b 4c ef 76 d8 3b de 4c ";
657 
658 // RSASSA-PSS Signature Example 9.6
659 // Message to be signed:
660 static const char message_9_6[] =
661   "88 c7 a9 f1 36 04 01 d9 0e 53 b1 01 b6 1c 53 25 "
662   "c3 c7 5d b1 b4 11 fb eb 8e 83 0b 75 e9 6b 56 67 "
663   "0a d2 45 40 4e 16 79 35 44 ee 35 4b c6 13 a9 0c "
664   "c9 84 87 15 a7 3d b5 89 3e 7f 6d 27 98 15 c0 c1 "
665   "de 83 ef 8e 29 56 e3 a5 6e d2 6a 88 8d 7a 9c dc "
666   "d0 42 f4 b1 6b 7f a5 1e f1 a0 57 36 62 d1 6a 30 "
667   "2d 0e c5 b2 85 d2 e0 3a d9 65 29 c8 7b 3d 37 4d "
668   "b3 72 d9 5b 24 43 d0 61 b6 b1 a3 50 ba 87 80 7e "
669   "d0 83 af d1 eb 05 c3 f5 2f 4e ba 5e d2 22 77 14 "
670   "fd b5 0b 9d 9d 9d d6 81 4f 62 f6 27 2f cd 5c db "
671   "ce 7a 9e f7 97 ";
672 // Salt:
673 static const char salt_9_6[] =
674   "c2 5f 13 bf 67 d0 81 67 1a 04 81 a1 f1 82 0d 61 "
675   "3b ba 22 76 ";
676 // Signature:
677 static const char signature_9_6[] =
678   "a7 fd b0 d2 59 16 5c a2 c8 8d 00 bb f1 02 8a 86 "
679   "7d 33 76 99 d0 61 19 3b 17 a9 64 8e 14 cc bb aa "
680   "de ac aa cd ec 81 5e 75 71 29 4e bb 8a 11 7a f2 "
681   "05 fa 07 8b 47 b0 71 2c 19 9e 3a d0 51 35 c5 04 "
682   "c2 4b 81 70 51 15 74 08 02 48 79 92 ff d5 11 d4 "
683   "af c6 b8 54 49 1e b3 f0 dd 52 31 39 54 2f f1 5c "
684   "31 01 ee 85 54 35 17 c6 a3 c7 94 17 c6 7e 2d d9 "
685   "aa 74 1e 9a 29 b0 6d cb 59 3c 23 36 b3 67 0a e3 "
686   "af ba c7 c3 e7 6e 21 54 73 e8 66 e3 38 ca 24 4d "
687   "e0 0b 62 62 4d 6b 94 26 82 2c ea e9 f8 cc 46 08 "
688   "95 f4 12 50 07 3f d4 5c 5a 1e 7b 42 5c 20 4a 42 "
689   "3a 69 91 59 f6 90 3e 71 0b 37 a7 bb 2b c8 04 9f ";
690 
691 // Example 10: A 2048-bit RSA Key Pair
692 
693 // RSA modulus n:
694 static const char rsa_modulus_n_10[] =
695   "a5 dd 86 7a c4 cb 02 f9 0b 94 57 d4 8c 14 a7 70 "
696   "ef 99 1c 56 c3 9c 0e c6 5f d1 1a fa 89 37 ce a5 "
697   "7b 9b e7 ac 73 b4 5c 00 17 61 5b 82 d6 22 e3 18 "
698   "75 3b 60 27 c0 fd 15 7b e1 2f 80 90 fe e2 a7 ad "
699   "cd 0e ef 75 9f 88 ba 49 97 c7 a4 2d 58 c9 aa 12 "
700   "cb 99 ae 00 1f e5 21 c1 3b b5 43 14 45 a8 d5 ae "
701   "4f 5e 4c 7e 94 8a c2 27 d3 60 40 71 f2 0e 57 7e "
702   "90 5f be b1 5d fa f0 6d 1d e5 ae 62 53 d6 3a 6a "
703   "21 20 b3 1a 5d a5 da bc 95 50 60 0e 20 f2 7d 37 "
704   "39 e2 62 79 25 fe a3 cc 50 9f 21 df f0 4e 6e ea "
705   "45 49 c5 40 d6 80 9f f9 30 7e ed e9 1f ff 58 73 "
706   "3d 83 85 a2 37 d6 d3 70 5a 33 e3 91 90 09 92 07 "
707   "0d f7 ad f1 35 7c f7 e3 70 0c e3 66 7d e8 3f 17 "
708   "b8 df 17 78 db 38 1d ce 09 cb 4a d0 58 a5 11 00 "
709   "1a 73 81 98 ee 27 cf 55 a1 3b 75 45 39 90 65 82 "
710   "ec 8b 17 4b d5 8d 5d 1f 3d 76 7c 61 37 21 ae 05 ";
711 // RSA public exponent e:
712 static const char rsa_public_exponent_e_10[] =
713   "01 00 01 ";
714 
715 // RSASSA-PSS Signature Example 10.1
716 // Message to be signed:
717 static const char message_10_1[] =
718   "88 31 77 e5 12 6b 9b e2 d9 a9 68 03 27 d5 37 0c "
719   "6f 26 86 1f 58 20 c4 3d a6 7a 3a d6 09 ";
720 // Salt:
721 static const char salt_10_1[] =
722   "04 e2 15 ee 6f f9 34 b9 da 70 d7 73 0c 87 34 ab "
723   "fc ec de 89 ";
724 // Signature:
725 static const char signature_10_1[] =
726   "82 c2 b1 60 09 3b 8a a3 c0 f7 52 2b 19 f8 73 54 "
727   "06 6c 77 84 7a bf 2a 9f ce 54 2d 0e 84 e9 20 c5 "
728   "af b4 9f fd fd ac e1 65 60 ee 94 a1 36 96 01 14 "
729   "8e ba d7 a0 e1 51 cf 16 33 17 91 a5 72 7d 05 f2 "
730   "1e 74 e7 eb 81 14 40 20 69 35 d7 44 76 5a 15 e7 "
731   "9f 01 5c b6 6c 53 2c 87 a6 a0 59 61 c8 bf ad 74 "
732   "1a 9a 66 57 02 28 94 39 3e 72 23 73 97 96 c0 2a "
733   "77 45 5d 0f 55 5b 0e c0 1d df 25 9b 62 07 fd 0f "
734   "d5 76 14 ce f1 a5 57 3b aa ff 4e c0 00 69 95 16 "
735   "59 b8 5f 24 30 0a 25 16 0c a8 52 2d c6 e6 72 7e "
736   "57 d0 19 d7 e6 36 29 b8 fe 5e 89 e2 5c c1 5b eb "
737   "3a 64 75 77 55 92 99 28 0b 9b 28 f7 9b 04 09 00 "
738   "0b e2 5b bd 96 40 8b a3 b4 3c c4 86 18 4d d1 c8 "
739   "e6 25 53 fa 1a f4 04 0f 60 66 3d e7 f5 e4 9c 04 "
740   "38 8e 25 7f 1c e8 9c 95 da b4 8a 31 5d 9b 66 b1 "
741   "b7 62 82 33 87 6f f2 38 52 30 d0 70 d0 7e 16 66 ";
742 
743 // RSASSA-PSS Signature Example 10.2
744 // Message to be signed:
745 static const char message_10_2[] =
746   "dd 67 0a 01 46 58 68 ad c9 3f 26 13 19 57 a5 0c "
747   "52 fb 77 7c db aa 30 89 2c 9e 12 36 11 64 ec 13 "
748   "97 9d 43 04 81 18 e4 44 5d b8 7b ee 58 dd 98 7b "
749   "34 25 d0 20 71 d8 db ae 80 70 8b 03 9d bb 64 db "
750   "d1 de 56 57 d9 fe d0 c1 18 a5 41 43 74 2e 0f f3 "
751   "c8 7f 74 e4 58 57 64 7a f3 f7 9e b0 a1 4c 9d 75 "
752   "ea 9a 1a 04 b7 cf 47 8a 89 7a 70 8f d9 88 f4 8e "
753   "80 1e db 0b 70 39 df 8c 23 bb 3c 56 f4 e8 21 ac ";
754 // Salt:
755 static const char salt_10_2[] =
756   "8b 2b dd 4b 40 fa f5 45 c7 78 dd f9 bc 1a 49 cb "
757   "57 f9 b7 1b ";
758 // Signature:
759 static const char signature_10_2[] =
760   "14 ae 35 d9 dd 06 ba 92 f7 f3 b8 97 97 8a ed 7c "
761   "d4 bf 5f f0 b5 85 a4 0b d4 6c e1 b4 2c d2 70 30 "
762   "53 bb 90 44 d6 4e 81 3d 8f 96 db 2d d7 00 7d 10 "
763   "11 8f 6f 8f 84 96 09 7a d7 5e 1f f6 92 34 1b 28 "
764   "92 ad 55 a6 33 a1 c5 5e 7f 0a 0a d5 9a 0e 20 3a "
765   "5b 82 78 ae c5 4d d8 62 2e 28 31 d8 71 74 f8 ca "
766   "ff 43 ee 6c 46 44 53 45 d8 4a 59 65 9b fb 92 ec "
767   "d4 c8 18 66 86 95 f3 47 06 f6 68 28 a8 99 59 63 "
768   "7f 2b f3 e3 25 1c 24 bd ba 4d 4b 76 49 da 00 22 "
769   "21 8b 11 9c 84 e7 9a 65 27 ec 5b 8a 5f 86 1c 15 "
770   "99 52 e2 3e c0 5e 1e 71 73 46 fa ef e8 b1 68 68 "
771   "25 bd 2b 26 2f b2 53 10 66 c0 de 09 ac de 2e 42 "
772   "31 69 07 28 b5 d8 5e 11 5a 2f 6b 92 b7 9c 25 ab "
773   "c9 bd 93 99 ff 8b cf 82 5a 52 ea 1f 56 ea 76 dd "
774   "26 f4 3b aa fa 18 bf a9 2a 50 4c bd 35 69 9e 26 "
775   "d1 dc c5 a2 88 73 85 f3 c6 32 32 f0 6f 32 44 c3 ";
776 
777 // RSASSA-PSS Signature Example 10.3
778 // Message to be signed:
779 static const char message_10_3[] =
780   "48 b2 b6 a5 7a 63 c8 4c ea 85 9d 65 c6 68 28 4b "
781   "08 d9 6b dc aa be 25 2d b0 e4 a9 6c b1 ba c6 01 "
782   "93 41 db 6f be fb 8d 10 6b 0e 90 ed a6 bc c6 c6 "
783   "26 2f 37 e7 ea 9c 7e 5d 22 6b d7 df 85 ec 5e 71 "
784   "ef ff 2f 54 c5 db 57 7f f7 29 ff 91 b8 42 49 1d "
785   "e2 74 1d 0c 63 16 07 df 58 6b 90 5b 23 b9 1a f1 "
786   "3d a1 23 04 bf 83 ec a8 a7 3e 87 1f f9 db ";
787 // Salt:
788 static const char salt_10_3[] =
789   "4e 96 fc 1b 39 8f 92 b4 46 71 01 0c 0d c3 ef d6 "
790   "e2 0c 2d 73 ";
791 // Signature:
792 static const char signature_10_3[] =
793   "6e 3e 4d 7b 6b 15 d2 fb 46 01 3b 89 00 aa 5b bb "
794   "39 39 cf 2c 09 57 17 98 70 42 02 6e e6 2c 74 c5 "
795   "4c ff d5 d7 d5 7e fb bf 95 0a 0f 5c 57 4f a0 9d "
796   "3f c1 c9 f5 13 b0 5b 4f f5 0d d8 df 7e df a2 01 "
797   "02 85 4c 35 e5 92 18 01 19 a7 0c e5 b0 85 18 2a "
798   "a0 2d 9e a2 aa 90 d1 df 03 f2 da ae 88 5b a2 f5 "
799   "d0 5a fd ac 97 47 6f 06 b9 3b 5b c9 4a 1a 80 aa "
800   "91 16 c4 d6 15 f3 33 b0 98 89 2b 25 ff ac e2 66 "
801   "f5 db 5a 5a 3b cc 10 a8 24 ed 55 aa d3 5b 72 78 "
802   "34 fb 8c 07 da 28 fc f4 16 a5 d9 b2 22 4f 1f 8b "
803   "44 2b 36 f9 1e 45 6f de a2 d7 cf e3 36 72 68 de "
804   "03 07 a4 c7 4e 92 41 59 ed 33 39 3d 5e 06 55 53 "
805   "1c 77 32 7b 89 82 1b de df 88 01 61 c7 8c d4 19 "
806   "6b 54 19 f7 ac c3 f1 3e 5e bf 16 1b 6e 7c 67 24 "
807   "71 6c a3 3b 85 c2 e2 56 40 19 2a c2 85 96 51 d5 "
808   "0b de 7e b9 76 e5 1c ec 82 8b 98 b6 56 3b 86 bb ";
809 
810 // RSASSA-PSS Signature Example 10.4
811 // Message to be signed:
812 static const char message_10_4[] =
813   "0b 87 77 c7 f8 39 ba f0 a6 4b bb db c5 ce 79 75 "
814   "5c 57 a2 05 b8 45 c1 74 e2 d2 e9 05 46 a0 89 c4 "
815   "e6 ec 8a df fa 23 a7 ea 97 ba e6 b6 5d 78 2b 82 "
816   "db 5d 2b 5a 56 d2 2a 29 a0 5e 7c 44 33 e2 b8 2a "
817   "62 1a bb a9 0a dd 05 ce 39 3f c4 8a 84 05 42 45 "
818   "1a ";
819 // Salt:
820 static const char salt_10_4[] =
821   "c7 cd 69 8d 84 b6 51 28 d8 83 5e 3a 8b 1e b0 e0 "
822   "1c b5 41 ec ";
823 // Signature:
824 static const char signature_10_4[] =
825   "34 04 7f f9 6c 4d c0 dc 90 b2 d4 ff 59 a1 a3 61 "
826   "a4 75 4b 25 5d 2e e0 af 7d 8b f8 7c 9b c9 e7 dd "
827   "ee de 33 93 4c 63 ca 1c 0e 3d 26 2c b1 45 ef 93 "
828   "2a 1f 2c 0a 99 7a a6 a3 4f 8e ae e7 47 7d 82 cc "
829   "f0 90 95 a6 b8 ac ad 38 d4 ee c9 fb 7e ab 7a d0 "
830   "2d a1 d1 1d 8e 54 c1 82 5e 55 bf 58 c2 a2 32 34 "
831   "b9 02 be 12 4f 9e 90 38 a8 f6 8f a4 5d ab 72 f6 "
832   "6e 09 45 bf 1d 8b ac c9 04 4c 6f 07 09 8c 9f ce "
833   "c5 8a 3a ab 10 0c 80 51 78 15 5f 03 0a 12 4c 45 "
834   "0e 5a cb da 47 d0 e4 f1 0b 80 a2 3f 80 3e 77 4d "
835   "02 3b 00 15 c2 0b 9f 9b be 7c 91 29 63 38 d5 ec "
836   "b4 71 ca fb 03 20 07 b6 7a 60 be 5f 69 50 4a 9f "
837   "01 ab b3 cb 46 7b 26 0e 2b ce 86 0b e8 d9 5b f9 "
838   "2c 0c 8e 14 96 ed 1e 52 85 93 a4 ab b6 df 46 2d "
839   "de 8a 09 68 df fe 46 83 11 68 57 a2 32 f5 eb f6 "
840   "c8 5b e2 38 74 5a d0 f3 8f 76 7a 5f db f4 86 fb ";
841 
842 // RSASSA-PSS Signature Example 10.5
843 // Message to be signed:
844 static const char message_10_5[] =
845   "f1 03 6e 00 8e 71 e9 64 da dc 92 19 ed 30 e1 7f "
846   "06 b4 b6 8a 95 5c 16 b3 12 b1 ed df 02 8b 74 97 "
847   "6b ed 6b 3f 6a 63 d4 e7 78 59 24 3c 9c cc dc 98 "
848   "01 65 23 ab b0 24 83 b3 55 91 c3 3a ad 81 21 3b "
849   "b7 c7 bb 1a 47 0a ab c1 0d 44 25 6c 4d 45 59 d9 "
850   "16 ";
851 // Salt:
852 static const char salt_10_5[] =
853   "ef a8 bf f9 62 12 b2 f4 a3 f3 71 a1 0d 57 41 52 "
854   "65 5f 5d fb ";
855 // Signature:
856 static const char signature_10_5[] =
857   "7e 09 35 ea 18 f4 d6 c1 d1 7c e8 2e b2 b3 83 6c "
858   "55 b3 84 58 9c e1 9d fe 74 33 63 ac 99 48 d1 f3 "
859   "46 b7 bf dd fe 92 ef d7 8a db 21 fa ef c8 9a de "
860   "42 b1 0f 37 40 03 fe 12 2e 67 42 9a 1c b8 cb d1 "
861   "f8 d9 01 45 64 c4 4d 12 01 16 f4 99 0f 1a 6e 38 "
862   "77 4c 19 4b d1 b8 21 32 86 b0 77 b0 49 9d 2e 7b "
863   "3f 43 4a b1 22 89 c5 56 68 4d ee d7 81 31 93 4b "
864   "b3 dd 65 37 23 6f 7c 6f 3d cb 09 d4 76 be 07 72 "
865   "1e 37 e1 ce ed 9b 2f 7b 40 68 87 bd 53 15 73 05 "
866   "e1 c8 b4 f8 4d 73 3b c1 e1 86 fe 06 cc 59 b6 ed "
867   "b8 f4 bd 7f fe fd f4 f7 ba 9c fb 9d 57 06 89 b5 "
868   "a1 a4 10 9a 74 6a 69 08 93 db 37 99 25 5a 0c b9 "
869   "21 5d 2d 1c d4 90 59 0e 95 2e 8c 87 86 aa 00 11 "
870   "26 52 52 47 0c 04 1d fb c3 ee c7 c3 cb f7 1c 24 "
871   "86 9d 11 5c 0c b4 a9 56 f5 6d 53 0b 80 ab 58 9a "
872   "cf ef c6 90 75 1d df 36 e8 d3 83 f8 3c ed d2 cc ";
873 
874 // RSASSA-PSS Signature Example 10.6
875 // Message to be signed:
876 static const char message_10_6[] =
877   "25 f1 08 95 a8 77 16 c1 37 45 0b b9 51 9d fa a1 "
878   "f2 07 fa a9 42 ea 88 ab f7 1e 9c 17 98 00 85 b5 "
879   "55 ae ba b7 62 64 ae 2a 3a b9 3c 2d 12 98 11 91 "
880   "dd ac 6f b5 94 9e b3 6a ee 3c 5d a9 40 f0 07 52 "
881   "c9 16 d9 46 08 fa 7d 97 ba 6a 29 15 b6 88 f2 03 "
882   "23 d4 e9 d9 68 01 d8 9a 72 ab 58 92 dc 21 17 c0 "
883   "74 34 fc f9 72 e0 58 cf 8c 41 ca 4b 4f f5 54 f7 "
884   "d5 06 8a d3 15 5f ce d0 f3 12 5b c0 4f 91 93 37 "
885   "8a 8f 5c 4c 3b 8c b4 dd 6d 1c c6 9d 30 ec ca 6e "
886   "aa 51 e3 6a 05 73 0e 9e 34 2e 85 5b af 09 9d ef "
887   "b8 af d7 ";
888 // Salt:
889 static const char salt_10_6[] =
890   "ad 8b 15 23 70 36 46 22 4b 66 0b 55 08 85 91 7c "
891   "a2 d1 df 28 ";
892 // Signature:
893 static const char signature_10_6[] =
894   "6d 3b 5b 87 f6 7e a6 57 af 21 f7 54 41 97 7d 21 "
895   "80 f9 1b 2c 5f 69 2d e8 29 55 69 6a 68 67 30 d9 "
896   "b9 77 8d 97 07 58 cc b2 60 71 c2 20 9f fb d6 12 "
897   "5b e2 e9 6e a8 1b 67 cb 9b 93 08 23 9f da 17 f7 "
898   "b2 b6 4e cd a0 96 b6 b9 35 64 0a 5a 1c b4 2a 91 "
899   "55 b1 c9 ef 7a 63 3a 02 c5 9f 0d 6e e5 9b 85 2c "
900   "43 b3 50 29 e7 3c 94 0f f0 41 0e 8f 11 4e ed 46 "
901   "bb d0 fa e1 65 e4 2b e2 52 8a 40 1c 3b 28 fd 81 "
902   "8e f3 23 2d ca 9f 4d 2a 0f 51 66 ec 59 c4 23 96 "
903   "d6 c1 1d bc 12 15 a5 6f a1 71 69 db 95 75 34 3e "
904   "f3 4f 9d e3 2a 49 cd c3 17 49 22 f2 29 c2 3e 18 "
905   "e4 5d f9 35 31 19 ec 43 19 ce dc e7 a1 7c 64 08 "
906   "8c 1f 6f 52 be 29 63 41 00 b3 91 9d 38 f3 d1 ed "
907   "94 e6 89 1e 66 a7 3b 8f b8 49 f5 87 4d f5 94 59 "
908   "e2 98 c7 bb ce 2e ee 78 2a 19 5a a6 6f e2 d0 73 "
909   "2b 25 e5 95 f5 7d 3e 06 1b 1f c3 e4 06 3b f9 8f ";
910 
911 struct SignatureExample {
912   const char* message;
913   const char* salt;
914   const char* signature;
915 };
916 
917 struct PSSTestVector {
918   const char* modulus_n;
919   const char* public_exponent_e;
920   SignatureExample example[6];
921 };
922 
923 static const PSSTestVector pss_test[] = {
924   {
925     rsa_modulus_n_1,
926     rsa_public_exponent_e_1,
927     {
928       { message_1_1, salt_1_1, signature_1_1 },
929       { message_1_2, salt_1_2, signature_1_2 },
930       { message_1_3, salt_1_3, signature_1_3 },
931       { message_1_4, salt_1_4, signature_1_4 },
932       { message_1_5, salt_1_5, signature_1_5 },
933       { message_1_6, salt_1_6, signature_1_6 },
934     }
935   },
936   {
937     rsa_modulus_n_9,
938     rsa_public_exponent_e_9,
939     {
940       { message_9_1, salt_9_1, signature_9_1 },
941       { message_9_2, salt_9_2, signature_9_2 },
942       { message_9_3, salt_9_3, signature_9_3 },
943       { message_9_4, salt_9_4, signature_9_4 },
944       { message_9_5, salt_9_5, signature_9_5 },
945       { message_9_6, salt_9_6, signature_9_6 },
946     }
947   },
948   {
949     rsa_modulus_n_10,
950     rsa_public_exponent_e_10,
951     {
952       { message_10_1, salt_10_1, signature_10_1 },
953       { message_10_2, salt_10_2, signature_10_2 },
954       { message_10_3, salt_10_3, signature_10_3 },
955       { message_10_4, salt_10_4, signature_10_4 },
956       { message_10_5, salt_10_5, signature_10_5 },
957       { message_10_6, salt_10_6, signature_10_6 },
958     }
959   },
960 };
961 
HexDigitValue(char digit)962 static uint8_t HexDigitValue(char digit) {
963   if ('0' <= digit && digit <= '9')
964     return digit - '0';
965   if ('a' <= digit && digit <= 'f')
966     return digit - 'a' + 10;
967   return digit - 'A' + 10;
968 }
969 
DecodeTestInput(const char * in,std::vector<uint8_t> * out)970 static bool DecodeTestInput(const char* in, std::vector<uint8_t>* out) {
971   out->clear();
972   while (in[0] != '\0') {
973     if (!isxdigit(in[0]) || !isxdigit(in[1]) || in[2] != ' ')
974       return false;
975     uint8_t octet = HexDigitValue(in[0]) * 16 + HexDigitValue(in[1]);
976     out->push_back(octet);
977     in += 3;
978   }
979   return true;
980 }
981 
982 // PrependASN1Length prepends an ASN.1 serialized length to the beginning of
983 // |out|.
PrependASN1Length(std::vector<uint8_t> * out,size_t len)984 static void PrependASN1Length(std::vector<uint8_t>* out, size_t len) {
985   if (len < 128) {
986     out->insert(out->begin(), static_cast<uint8_t>(len));
987   } else if (len < 256) {
988     out->insert(out->begin(), static_cast<uint8_t>(len));
989     out->insert(out->begin(), 0x81);
990   } else if (len < 0x10000) {
991     out->insert(out->begin(), static_cast<uint8_t>(len));
992     out->insert(out->begin(), static_cast<uint8_t>(len >> 8));
993     out->insert(out->begin(), 0x82);
994   } else {
995     CHECK(false) << "ASN.1 length not handled: " << len;
996   }
997 }
998 
EncodeRSAPublicKey(const std::vector<uint8_t> & modulus_n,const std::vector<uint8_t> & public_exponent_e,std::vector<uint8_t> * public_key_info)999 static bool EncodeRSAPublicKey(const std::vector<uint8_t>& modulus_n,
1000                                const std::vector<uint8_t>& public_exponent_e,
1001                                std::vector<uint8_t>* public_key_info) {
1002   // The public key is specified as the following ASN.1 structure:
1003   //   SubjectPublicKeyInfo  ::=  SEQUENCE  {
1004   //       algorithm            AlgorithmIdentifier,
1005   //       subjectPublicKey     BIT STRING  }
1006   //
1007   // The algorithm is specified as the following ASN.1 structure:
1008   //    AlgorithmIdentifier  ::=  SEQUENCE  {
1009   //        algorithm               OBJECT IDENTIFIER,
1010   //        parameters              ANY DEFINED BY algorithm OPTIONAL  }
1011   //
1012   // An RSA public key is specified as the following ASN.1 structure:
1013   //    RSAPublicKey ::= SEQUENCE {
1014   //        modulus           INTEGER,  -- n
1015   //        publicExponent    INTEGER   -- e
1016   //    }
1017   static const uint8_t kIntegerTag = 0x02;
1018   static const uint8_t kBitStringTag = 0x03;
1019   static const uint8_t kSequenceTag = 0x30;
1020   public_key_info->clear();
1021 
1022   // Encode the public exponent e as an INTEGER.
1023   public_key_info->insert(public_key_info->begin(),
1024                           public_exponent_e.begin(),
1025                           public_exponent_e.end());
1026   PrependASN1Length(public_key_info, public_exponent_e.size());
1027   public_key_info->insert(public_key_info->begin(), kIntegerTag);
1028 
1029   // Encode the modulus n as an INTEGER.
1030   public_key_info->insert(public_key_info->begin(),
1031                           modulus_n.begin(), modulus_n.end());
1032   size_t modulus_size = modulus_n.size();
1033   if (modulus_n[0] & 0x80) {
1034     public_key_info->insert(public_key_info->begin(), 0x00);
1035     modulus_size++;
1036   }
1037   PrependASN1Length(public_key_info, modulus_size);
1038   public_key_info->insert(public_key_info->begin(), kIntegerTag);
1039 
1040   // Encode the RSAPublicKey SEQUENCE.
1041   PrependASN1Length(public_key_info, public_key_info->size());
1042   public_key_info->insert(public_key_info->begin(), kSequenceTag);
1043 
1044   // Encode the BIT STRING.
1045   // Number of unused bits.
1046   public_key_info->insert(public_key_info->begin(), 0x00);
1047   PrependASN1Length(public_key_info, public_key_info->size());
1048   public_key_info->insert(public_key_info->begin(), kBitStringTag);
1049 
1050   // Encode the AlgorithmIdentifier.
1051   static const uint8_t algorithm[] = {
1052       0x30, 0x0d,  // a SEQUENCE of length 13
1053       0x06, 0x09,  // an OBJECT IDENTIFIER of length 9
1054       0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00,
1055   };
1056   public_key_info->insert(public_key_info->begin(),
1057                           algorithm, algorithm + sizeof(algorithm));
1058 
1059   // Encode the outermost SEQUENCE.
1060   PrependASN1Length(public_key_info, public_key_info->size());
1061   public_key_info->insert(public_key_info->begin(), kSequenceTag);
1062 
1063   return true;
1064 }
1065 
TEST(SignatureVerifierTest,VerifyRSAPSS)1066 TEST(SignatureVerifierTest, VerifyRSAPSS) {
1067   for (unsigned int i = 0; i < arraysize(pss_test); i++) {
1068     SCOPED_TRACE(i);
1069     std::vector<uint8_t> modulus_n;
1070     std::vector<uint8_t> public_exponent_e;
1071     ASSERT_TRUE(DecodeTestInput(pss_test[i].modulus_n, &modulus_n));
1072     ASSERT_TRUE(DecodeTestInput(pss_test[i].public_exponent_e,
1073                                 &public_exponent_e));
1074     std::vector<uint8_t> public_key_info;
1075     ASSERT_TRUE(EncodeRSAPublicKey(modulus_n, public_exponent_e,
1076                                    &public_key_info));
1077 
1078     for (unsigned int j = 0; j < arraysize(pss_test[i].example); j++) {
1079       SCOPED_TRACE(j);
1080       std::vector<uint8_t> message;
1081       std::vector<uint8_t> salt;
1082       std::vector<uint8_t> signature;
1083       ASSERT_TRUE(DecodeTestInput(pss_test[i].example[j].message, &message));
1084       ASSERT_TRUE(DecodeTestInput(pss_test[i].example[j].salt, &salt));
1085       ASSERT_TRUE(DecodeTestInput(pss_test[i].example[j].signature,
1086                                   &signature));
1087 
1088       crypto::SignatureVerifier verifier;
1089       bool ok;
1090 
1091       // Positive test.
1092       ok = verifier.VerifyInitRSAPSS(crypto::SignatureVerifier::SHA1,
1093                                      crypto::SignatureVerifier::SHA1,
1094                                      salt.size(),
1095                                      &signature[0], signature.size(),
1096                                      &public_key_info[0],
1097                                      public_key_info.size());
1098       ASSERT_TRUE(ok);
1099       verifier.VerifyUpdate(&message[0], message.size());
1100       ok = verifier.VerifyFinal();
1101       EXPECT_TRUE(ok);
1102 
1103       // Modify the first byte of the message.
1104       ok = verifier.VerifyInitRSAPSS(crypto::SignatureVerifier::SHA1,
1105                                      crypto::SignatureVerifier::SHA1,
1106                                      salt.size(),
1107                                      &signature[0], signature.size(),
1108                                      &public_key_info[0],
1109                                      public_key_info.size());
1110       ASSERT_TRUE(ok);
1111       message[0] += 1;
1112       verifier.VerifyUpdate(&message[0], message.size());
1113       message[0] -= 1;
1114       ok = verifier.VerifyFinal();
1115       EXPECT_FALSE(ok);
1116 
1117       // Truncate the message.
1118       ASSERT_FALSE(message.empty());
1119       ok = verifier.VerifyInitRSAPSS(crypto::SignatureVerifier::SHA1,
1120                                      crypto::SignatureVerifier::SHA1,
1121                                      salt.size(),
1122                                      &signature[0], signature.size(),
1123                                      &public_key_info[0],
1124                                      public_key_info.size());
1125       ASSERT_TRUE(ok);
1126       verifier.VerifyUpdate(&message[0], message.size() - 1);
1127       ok = verifier.VerifyFinal();
1128       EXPECT_FALSE(ok);
1129 
1130       // Corrupt the signature.
1131       signature[0] += 1;
1132       ok = verifier.VerifyInitRSAPSS(crypto::SignatureVerifier::SHA1,
1133                                      crypto::SignatureVerifier::SHA1,
1134                                      salt.size(),
1135                                      &signature[0], signature.size(),
1136                                      &public_key_info[0],
1137                                      public_key_info.size());
1138       signature[0] -= 1;
1139       ASSERT_TRUE(ok);
1140       verifier.VerifyUpdate(&message[0], message.size());
1141       ok = verifier.VerifyFinal();
1142       EXPECT_FALSE(ok);
1143     }
1144   }
1145 }
1146