1 /*
2 ** Copyright 2013, The Android Open Source Project
3 **
4 ** Redistribution and use in source and binary forms, with or without
5 ** modification, are permitted provided that the following conditions are met:
6 **     * Redistributions of source code must retain the above copyright
7 **       notice, this list of conditions and the following disclaimer.
8 **     * Redistributions in binary form must reproduce the above copyright
9 **       notice, this list of conditions and the following disclaimer in the
10 **       documentation and/or other materials provided with the distribution.
11 **     * Neither the name of Google Inc. nor the names of its contributors may
12 **       be used to endorse or promote products derived from this software
13 **       without specific prior written permission.
14 **
15 ** THIS SOFTWARE IS PROVIDED BY Google Inc. ``AS IS'' AND ANY EXPRESS OR
16 ** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
17 ** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
18 ** EVENT SHALL Google Inc. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 ** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
21 ** OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
22 ** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23 ** OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
24 ** ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26 
27 #include <ctype.h>
28 #include <stdio.h>
29 #include <stdlib.h>
30 #include <string.h>
31 #include <sys/cdefs.h>
32 
33 #include "constrainedcrypto/rsa.h"
34 #include "constrainedcrypto/sha.h"
35 
36 #ifndef __unused
37 #define __unused __attribute__((unused))
38 #endif
39 
40 // RSA test data taken from:
41 //
42 //   ftp://ftp.rsa.com/pub/rsalabs/tmp/pkcs1v15sign-vectors.txt
43 
44 // This is the result (reformatted) of running DumpPublicKey on:
45 //
46 //   # Example 15: A 2048-bit RSA key pair
47 //   # -----------------------------------
48 //
49 //
50 //   # Public key
51 //   # ----------
52 //
53 //   # Modulus:
54 //   df 27 1f d2 5f 86 44 49 6b 0c 81 be 4b d5 02 97
55 //   ef 09 9b 00 2a 6f d6 77 27 eb 44 9c ea 56 6e d6
56 //   a3 98 1a 71 31 2a 14 1c ab c9 81 5c 12 09 e3 20
57 //   a2 5b 32 46 4e 99 99 f1 8c a1 3a 9f d3 89 25 58
58 //   f9 e0 ad ef dd 36 50 dd 23 a3 f0 36 d6 0f e3 98
59 //   84 37 06 a4 0b 0b 84 62 c8 be e3 bc e1 2f 1f 28
60 //   60 c2 44 4c dc 6a 44 47 6a 75 ff 4a a2 42 73 cc
61 //   be 3b f8 02 48 46 5f 8f f8 c3 a7 f3 36 7d fc 0d
62 //   f5 b6 50 9a 4f 82 81 1c ed d8 1c da aa 73 c4 91
63 //   da 41 21 70 d5 44 d4 ba 96 b9 7f 0a fc 80 65 49
64 //   8d 3a 49 fd 91 09 92 a1 f0 72 5b e2 4f 46 5c fe
65 //   7e 0e ab f6 78 99 6c 50 bc 5e 75 24 ab f7 3f 15
66 //   e5 be f7 d5 18 39 4e 31 38 ce 49 44 50 6a aa af
67 //   3f 9b 23 6d ca b8 fc 00 f8 7a f5 96 fd c3 d9 d6
68 //   c7 5c d5 08 36 2f ae 2c be dd cc 4c 74 50 b1 7b
69 //   77 6c 07 9e cc a1 f2 56 35 1a 43 b9 7d be 21 53
70 //
71 //   # Exponent:
72 //   01 00 01
73 
74 RSAPublicKey key_15 = {
75     .len = 64,
76     .n0inv = 0xf0053525,
77     .n = {2109612371u,890913721u,3433165398u,2003568542u,
78           1951445371u,3202206796u,909094444u,3344749832u,
79           4257470934u,4168807830u,3401120768u,1067131757u,
80           1349167791u,953043268u,406408753u,3854497749u,
81           2885107477u,3160306980u,2023320656u,2114890742u,
82           1330011390u,4034026466u,2433323681u,2369407485u,
83           4236272969u,2528739082u,3578057914u,3661701488u,
84           2859713681u,3990363354u,1333952796u,4122366106u,
85           914226189u,4173572083u,1212571535u,3191601154u,
86           2722264012u,1786117962u,3697951815u,1623344204u,
87           3777961768u,3367953340u,185304162u,2218198692u,
88           3591365528u,597946422u,3711324381u,4192251375u,
89           3548980568u,2359376543u,1318689265u,2723885638u,
90           302637856u,2882109788u,824841244u,2744654449u,
91           3931533014u,669729948u,711972471u,4010384128u,
92           1272251031u,1795981758u,1602634825u,3743883218u},
93     .rr = {820482522u,2494434288u,1082168230u,731376296u,
94            1306039452u,3139792975u,2575869288u,3874938710u,
95            3198185181u,153506080u,1236489694u,1061859740u,
96            1174461268u,115279508u,1782749185u,238124145u,
97            3587596076u,2259236093u,1112265915u,4048059865u,
98            3890381098u,999426242u,794481771u,3804065613u,
99            2786019148u,461403875u,3072256692u,4079652654u,
100            3056719901u,1871565394u,212974856u,3359008174u,
101            1397773937u,3796256698u,914342841u,1097174457u,
102            3322220191u,3170814748u,2439215020u,618719336u,
103            3629353460u,496817177u,317052742u,380264245u,
104            1976007217u,2697736152u,312540864u,4291855337u,
105            697006561u,4234182488u,3904590917u,2609582216u,
106            451424084u,1805773827u,776344974u,1064489733u,
107            2633377036u,1954826648u,3202815814u,2240368662u,
108            2618582484u,2211196815u,4107362845u,3640258615u},
109     .exponent = 65537,
110 };
111 
112 // PKCS#1 v1.5 Signature Example 15.1
113 
114 char* message_1 =
115     "f4 5d 55 f3 55 51 e9 75 d6 a8 dc 7e a9 f4 88 59"
116     "39 40 cc 75 69 4a 27 8f 27 e5 78 a1 63 d8 39 b3"
117     "40 40 84 18 08 cf 9c 58 c9 b8 72 8b f5 f9 ce 8e"
118     "e8 11 ea 91 71 4f 47 ba b9 2d 0f 6d 5a 26 fc fe"
119     "ea 6c d9 3b 91 0c 0a 2c 96 3e 64 eb 18 23 f1 02"
120     "75 3d 41 f0 33 59 10 ad 3a 97 71 04 f1 aa f6 c3"
121     "74 27 16 a9 75 5d 11 b8 ee d6 90 47 7f 44 5c 5d"
122     "27 20 8b 2e 28 43 30 fa 3d 30 14 23 fa 7f 2d 08"
123     "6e 0a d0 b8 92 b9 db 54 4e 45 6d 3f 0d ab 85 d9"
124     "53 c1 2d 34 0a a8 73 ed a7 27 c8 a6 49 db 7f a6"
125     "37 40 e2 5e 9a f1 53 3b 30 7e 61 32 99 93 11 0e"
126     "95 19 4e 03 93 99 c3 82 4d 24 c5 1f 22 b2 6b de"
127     "10 24 cd 39 59 58 a2 df eb 48 16 a6 e8 ad ed b5"
128     "0b 1f 6b 56 d0 b3 06 0f f0 f1 c4 cb 0d 0e 00 1d"
129     "d5 9d 73 be 12";
130 
131 char* signature_1 =
132     "b7 5a 54 66 b6 5d 0f 30 0e f5 38 33 f2 17 5c 8a"
133     "34 7a 38 04 fc 63 45 1d c9 02 f0 b7 1f 90 83 45"
134     "9e d3 7a 51 79 a3 b7 23 a5 3f 10 51 64 2d 77 37"
135     "4c 4c 6c 8d bb 1c a2 05 25 f5 c9 f3 2d b7 76 95"
136     "35 56 da 31 29 0e 22 19 74 82 ce b6 99 06 c4 6a"
137     "75 8f b0 e7 40 9b a8 01 07 7d 2a 0a 20 ea e7 d1"
138     "d6 d3 92 ab 49 57 e8 6b 76 f0 65 2d 68 b8 39 88"
139     "a7 8f 26 e1 11 72 ea 60 9b f8 49 fb bd 78 ad 7e"
140     "dc e2 1d e6 62 a0 81 36 8c 04 06 07 ce e2 9d b0"
141     "62 72 27 f4 49 63 ad 17 1d 22 93 b6 33 a3 92 e3"
142     "31 dc a5 4f e3 08 27 52 f4 3f 63 c1 61 b4 47 a4"
143     "c6 5a 68 75 67 0d 5f 66 00 fc c8 60 a1 ca eb 0a"
144     "88 f8 fd ec 4e 56 43 98 a5 c4 6c 87 f6 8c e0 70"
145     "01 f6 21 3a be 0a b5 62 5f 87 d1 90 25 f0 8d 81"
146     "da c7 bd 45 86 bc 93 82 19 1f 6d 28 80 f6 22 7e"
147     "5d f3 ee d2 1e 77 92 d2 49 48 04 87 f3 65 52 61";
148 
149 // PKCS#1 v1.5 Signature Example 15.2
150 
151 char *message_2 =
152     "c1 4b 4c 60 75 b2 f9 aa d6 61 de f4 ec fd 3c b9 "
153     "33 c6 23 f4 e6 3b f5 34 10 d2 f0 16 d1 ab 98 e2 "
154     "72 9e cc f8 00 6c d8 e0 80 50 73 7d 95 fd bf 29 "
155     "6b 66 f5 b9 79 2a 90 29 36 c4 f7 ac 69 f5 14 53 "
156     "ce 43 69 45 2d c2 2d 96 f0 37 74 81 14 66 20 00 "
157     "dd 9c d3 a5 e1 79 f4 e0 f8 1f a6 a0 31 1c a1 ae "
158     "e6 51 9a 0f 63 ce c7 8d 27 bb 72 63 93 fb 7f 1f "
159     "88 cd e7 c9 7f 8a 66 cd 66 30 12 81 da c3 f3 a4 "
160     "33 24 8c 75 d6 c2 dc d7 08 b6 a9 7b 0a 3f 32 5e "
161     "0b 29 64 f8 a5 81 9e 47 9b ";
162 
163 char* signature_2 =
164     "af a7 34 34 62 be a1 22 cc 14 9f ca 70 ab da e7"
165     "94 46 67 7d b5 37 36 66 af 7d c3 13 01 5f 4d e7"
166     "86 e6 e3 94 94 6f ad 3c c0 e2 b0 2b ed ba 50 47"
167     "fe 9e 2d 7d 09 97 05 e4 a3 9f 28 68 32 79 cf 0a"
168     "c8 5c 15 30 41 22 42 c0 e9 18 95 3b e0 00 e9 39"
169     "cf 3b f1 82 52 5e 19 93 70 fa 79 07 eb a6 9d 5d"
170     "b4 63 10 17 c0 e3 6d f7 03 79 b5 db 8d 4c 69 5a"
171     "97 9a 8e 61 73 22 40 65 d7 dc 15 13 2e f2 8c d8"
172     "22 79 51 63 06 3b 54 c6 51 14 1b e8 6d 36 e3 67"
173     "35 bc 61 f3 1f ca 57 4e 53 09 f3 a3 bb df 91 ef"
174     "f1 2b 99 e9 cc 17 44 f1 ee 9a 1b d2 2c 5b ad 96"
175     "ad 48 19 29 25 1f 03 43 fd 36 bc f0 ac de 7f 11"
176     "e5 ad 60 97 77 21 20 27 96 fe 06 1f 9a da 1f c4"
177     "c8 e0 0d 60 22 a8 35 75 85 ff e9 fd d5 93 31 a2"
178     "8c 4a a3 12 15 88 fb 6c f6 83 96 d8 ac 05 46 59"
179     "95 00 c9 70 85 00 a5 97 2b d5 4f 72 cf 8d b0 c8";
180 
181 // PKCS#1 v1.5 Signature Example 15.3
182 
183 char* message_3 =
184     "d0 23 71 ad 7e e4 8b bf db 27 63 de 7a 84 3b 94 "
185     "08 ce 5e b5 ab f8 47 ca 3d 73 59 86 df 84 e9 06 "
186     "0b db cd d3 a5 5b a5 5d de 20 d4 76 1e 1a 21 d2 "
187     "25 c1 a1 86 f4 ac 4b 30 19 d3 ad f7 8f e6 33 46 "
188     "67 f5 6f 70 c9 01 a0 a2 70 0c 6f 0d 56 ad d7 19 "
189     "59 2d c8 8f 6d 23 06 c7 00 9f 6e 7a 63 5b 4c b3 "
190     "a5 02 df e6 8d dc 58 d0 3b e1 0a 11 70 00 4f e7 "
191     "4d d3 e4 6b 82 59 1f f7 54 14 f0 c4 a0 3e 60 5e "
192     "20 52 4f 24 16 f1 2e ca 58 9f 11 1b 75 d6 39 c6 "
193     "1b aa 80 ca fd 05 cf 35 00 24 4a 21 9e d9 ce d9 "
194     "f0 b1 02 97 18 2b 65 3b 52 6f 40 0f 29 53 ba 21 "
195     "4d 5b cd 47 88 41 32 87 2a e9 0d 4d 6b 1f 42 15 "
196     "39 f9 f3 46 62 a5 6d c0 e7 b4 b9 23 b6 23 1e 30 "
197     "d2 67 67 97 81 7f 7c 33 7b 5a c8 24 ba 93 14 3b "
198     "33 81 fa 3d ce 0e 6a eb d3 8e 67 73 51 87 b1 eb "
199     "d9 5c 02 ";
200 
201 char* signature_3 =
202     "3b ac 63 f8 6e 3b 70 27 12 03 10 6b 9c 79 aa bd"
203     "9f 47 7c 56 e4 ee 58 a4 fc e5 ba f2 ca b4 96 0f"
204     "88 39 1c 9c 23 69 8b e7 5c 99 ae df 9e 1a bf 17"
205     "05 be 1d ac 33 14 0a db 48 eb 31 f4 50 bb 9e fe"
206     "83 b7 b9 0d b7 f1 57 6d 33 f4 0c 1c ba 4b 8d 6b"
207     "1d 33 23 56 4b 0f 17 74 11 4f a7 c0 8e 6d 1e 20"
208     "dd 8f bb a9 b6 ac 7a d4 1e 26 b4 56 8f 4a 8a ac"
209     "bf d1 78 a8 f8 d2 c9 d5 f5 b8 81 12 93 5a 8b c9"
210     "ae 32 cd a4 0b 8d 20 37 55 10 73 50 96 53 68 18"
211     "ce 2b 2d b7 1a 97 72 c9 b0 dd a0 9a e1 01 52 fa"
212     "11 46 62 18 d0 91 b5 3d 92 54 30 61 b7 29 4a 55"
213     "be 82 ff 35 d5 c3 2f a2 33 f0 5a aa c7 58 50 30"
214     "7e cf 81 38 3c 11 16 74 39 7b 1a 1b 9d 3b f7 61"
215     "2c cb e5 ba cd 2b 38 f0 a9 83 97 b2 4c 83 65 8f"
216     "b6 c0 b4 14 0e f1 19 70 c4 63 0d 44 34 4e 76 ea"
217     "ed 74 dc be e8 11 db f6 57 59 41 f0 8a 65 23 b8";
218 
219 // PKCS#1 v1.5 Signature Example 15.4
220 
221 char* message_4 =
222     "29 03 55 84 ab 7e 02 26 a9 ec 4b 02 e8 dc f1 27 "
223     "2d c9 a4 1d 73 e2 82 00 07 b0 f6 e2 1f ec cd 5b "
224     "d9 db b9 ef 88 cd 67 58 76 9e e1 f9 56 da 7a d1 "
225     "84 41 de 6f ab 83 86 db c6 93 ";
226 
227 char* signature_4 =
228     "28 d8 e3 fc d5 dd db 21 ff bd 8d f1 63 0d 73 77"
229     "aa 26 51 e1 4c ad 1c 0e 43 cc c5 2f 90 7f 94 6d"
230     "66 de 72 54 e2 7a 6c 19 0e b0 22 ee 89 ec f6 22"
231     "4b 09 7b 71 06 8c d6 07 28 a1 ae d6 4b 80 e5 45"
232     "7b d3 10 6d d9 17 06 c9 37 c9 79 5f 2b 36 36 7f"
233     "f1 53 dc 25 19 a8 db 9b df 2c 80 74 30 c4 51 de"
234     "17 bb cd 0c e7 82 b3 e8 f1 02 4d 90 62 4d ea 7f"
235     "1e ed c7 42 0b 7e 7c aa 65 77 ce f4 31 41 a7 26"
236     "42 06 58 0e 44 a1 67 df 5e 41 ee a0 e6 9a 80 54"
237     "54 c4 0e ef c1 3f 48 e4 23 d7 a3 2d 02 ed 42 c0"
238     "ab 03 d0 a7 cf 70 c5 86 0a c9 2e 03 ee 00 5b 60"
239     "ff 35 03 42 4b 98 cc 89 45 68 c7 c5 6a 02 33 55"
240     "1c eb e5 88 cf 8b 01 67 b7 df 13 ad ca d8 28 67"
241     "68 10 49 9c 70 4d a7 ae 23 41 4d 69 e3 c0 d2 db"
242     "5d cb c2 61 3b c1 20 42 1f 9e 36 53 c5 a8 76 72"
243     "97 64 3c 7e 07 40 de 01 63 55 45 3d 6c 95 ae 72";
244 
245 // PKCS#1 v1.5 Signature Example 15.5
246 
247 char* message_5 =
248     "bd a3 a1 c7 90 59 ea e5 98 30 8d 3d f6 09 ";
249 
250 char* signature_5 =
251     "a1 56 17 6c b9 67 77 c7 fb 96 10 5d bd 91 3b c4"
252     "f7 40 54 f6 80 7c 60 08 a1 a9 56 ea 92 c1 f8 1c"
253     "b8 97 dc 4b 92 ef 9f 4e 40 66 8d c7 c5 56 90 1a"
254     "cb 6c f2 69 fe 61 5b 0f b7 2b 30 a5 13 38 69 23"
255     "14 b0 e5 87 8a 88 c2 c7 77 4b d1 69 39 b5 ab d8"
256     "2b 44 29 d6 7b d7 ac 8e 5e a7 fe 92 4e 20 a6 ec"
257     "66 22 91 f2 54 8d 73 4f 66 34 86 8b 03 9a a5 f9"
258     "d4 d9 06 b2 d0 cb 85 85 bf 42 85 47 af c9 1c 6e"
259     "20 52 dd cd 00 1c 3e f8 c8 ee fc 3b 6b 2a 82 b6"
260     "f9 c8 8c 56 f2 e2 c3 cb 0b e4 b8 0d a9 5e ba 37"
261     "1d 8b 5f 60 f9 25 38 74 3d db b5 da 29 72 c7 1f"
262     "e7 b9 f1 b7 90 26 8a 0e 77 0f c5 eb 4d 5d d8 52"
263     "47 d4 8a e2 ec 3f 26 25 5a 39 85 52 02 06 a1 f2"
264     "68 e4 83 e9 db b1 d5 ca b1 90 91 76 06 de 31 e7"
265     "c5 18 2d 8f 15 1b f4 1d fe cc ae d7 cd e6 90 b2"
266     "16 47 10 6b 49 0c 72 9d 54 a8 fe 28 02 a6 d1 26";
267 
268 // PKCS#1 v1.5 Signature Example 15.6
269 
270 char* message_6 =
271     "c1 87 91 5e 4e 87 da 81 c0 8e d4 35 6a 0c ce ac "
272     "1c 4f b5 c0 46 b4 52 81 b3 87 ec 28 f1 ab fd 56 "
273     "7e 54 6b 23 6b 37 d0 1a e7 1d 3b 28 34 36 5d 3d "
274     "f3 80 b7 50 61 b7 36 b0 13 0b 07 0b e5 8a e8 a4 "
275     "6d 12 16 63 61 b6 13 db c4 7d fa eb 4c a7 46 45 "
276     "6c 2e 88 83 85 52 5c ca 9d d1 c3 c7 a9 ad a7 6d "
277     "6c ";;
278 
279 char* signature_6 =
280     "9c ab 74 16 36 08 66 9f 75 55 a3 33 cf 19 6f e3"
281     "a0 e9 e5 eb 1a 32 d3 4b b5 c8 5f f6 89 aa ab 0e"
282     "3e 65 66 8e d3 b1 15 3f 94 eb 3d 8b e3 79 b8 ee"
283     "f0 07 c4 a0 2c 70 71 ce 30 d8 bb 34 1e 58 c6 20"
284     "f7 3d 37 b4 ec bf 48 be 29 4f 6c 9e 0e cb 5e 63"
285     "fe c4 1f 12 0e 55 53 df a0 eb eb bb 72 64 0a 95"
286     "37 ba dc b4 51 33 02 29 d9 f7 10 f6 2e 3e d8 ec"
287     "78 4e 50 ee 1d 92 62 b4 26 71 34 00 11 d7 d0 98"
288     "c6 f2 55 7b 21 31 fa 9b d0 25 46 36 59 7e 88 ec"
289     "b3 5a 24 0e f0 fd 85 95 71 24 df 80 80 fe e1 e1"
290     "49 af 93 99 89 e8 6b 26 c8 5a 58 81 fa e8 67 3d"
291     "9f d4 08 00 dd 13 4e b9 bd b6 41 0f 42 0b 0a a9"
292     "7b 20 ef cf 2e b0 c8 07 fa eb 83 a3 cc d9 b5 1d"
293     "45 53 e4 1d fc 0d f6 ca 80 a1 e8 1d c2 34 bb 83"
294     "89 dd 19 5a 38 b4 2d e4 ed c4 9d 34 64 78 b9 f1"
295     "1f 05 57 20 5f 5b 0b d7 ff e9 c8 50 f3 96 d7 c4";;
296 
297 // PKCS#1 v1.5 Signature Example 15.7
298 
299 char* message_7 =
300     "ab fa 2e cb 7d 29 bd 5b cb 99 31 ce 2b ad 2f 74 "
301     "38 3e 95 68 3c ee 11 02 2f 08 e8 e7 d0 b8 fa 05 "
302     "8b f9 eb 7e b5 f9 88 68 b5 bb 1f b5 c3 1c ed a3 "
303     "a6 4f 1a 12 cd f2 0f cd 0e 5a 24 6d 7a 17 73 d8 "
304     "db a0 e3 b2 77 54 5b ab e5 8f 2b 96 e3 f4 ed c1 "
305     "8e ab f5 cd 2a 56 0f ca 75 fe 96 e0 7d 85 9d ef "
306     "b2 56 4f 3a 34 f1 6f 11 e9 1b 3a 71 7b 41 af 53 "
307     "f6 60 53 23 00 1a a4 06 c6 ";
308 
309 char* signature_7 =
310     "c4 b4 37 bc f7 03 f3 52 e1 fa f7 4e b9 62 20 39"
311     "42 6b 56 72 ca f2 a7 b3 81 c6 c4 f0 19 1e 7e 4a"
312     "98 f0 ee bc d6 f4 17 84 c2 53 7f f0 f9 9e 74 98"
313     "2c 87 20 1b fb c6 5e ae 83 2d b7 1d 16 da ca db"
314     "09 77 e5 c5 04 67 9e 40 be 0f 9d b0 6f fd 84 8d"
315     "d2 e5 c3 8a 7e c0 21 e7 f6 8c 47 df d3 8c c3 54"
316     "49 3d 53 39 b4 59 5a 5b f3 1e 3f 8f 13 81 68 07"
317     "37 3d f6 ad 0d c7 e7 31 e5 1a d1 9e b4 75 4b 13"
318     "44 85 84 2f e7 09 d3 78 44 4d 8e 36 b1 72 4a 4f"
319     "da 21 ca fe e6 53 ab 80 74 7f 79 52 ee 80 4d ea"
320     "b1 03 9d 84 13 99 45 bb f4 be 82 00 87 53 f3 c5"
321     "4c 78 21 a1 d2 41 f4 21 79 c7 94 ef 70 42 bb f9"
322     "95 56 56 22 2e 45 c3 43 69 a3 84 69 7b 6a e7 42"
323     "e1 8f a5 ca 7a ba d2 7d 9f e7 10 52 e3 31 0d 0f"
324     "52 c8 d1 2e a3 3b f0 53 a3 00 f4 af c4 f0 98 df"
325     "4e 6d 88 67 79 d6 45 94 d3 69 15 8f db c1 f6 94";
326 
327 // PKCS#1 v1.5 Signature Example 15.8
328 
329 char* message_8 =
330     "df 40 44 a8 9a 83 e9 fc bf 12 62 54 0a e3 03 8b "
331     "bc 90 f2 b2 62 8b f2 a4 46 7a c6 77 22 d8 54 6b "
332     "3a 71 cb 0e a4 16 69 d5 b4 d6 18 59 c1 b4 e4 7c "
333     "ec c5 93 3f 75 7e c8 6d b0 64 4e 31 18 12 d0 0f "
334     "b8 02 f0 34 00 63 9c 0e 36 4d ae 5a eb c5 79 1b "
335     "c6 55 76 23 61 bc 43 c5 3d 3c 78 86 76 8f 79 68 "
336     "c1 c5 44 c6 f7 9f 7b e8 20 c7 e2 bd 2f 9d 73 e6 "
337     "2d ed 6d 2e 93 7e 6a 6d ae f9 0e e3 7a 1a 52 a5 "
338     "4f 00 e3 1a dd d6 48 94 cf 4c 02 e1 60 99 e2 9f "
339     "9e b7 f1 a7 bb 7f 84 c4 7a 2b 59 48 13 be 02 a1 "
340     "7b 7f c4 3b 34 c2 2c 91 92 52 64 12 6c 89 f8 6b "
341     "b4 d8 7f 3e f1 31 29 6c 53 a3 08 e0 33 1d ac 8b "
342     "af 3b 63 42 22 66 ec ef 2b 90 78 15 35 db da 41 "
343     "cb d0 cf 22 a8 cb fb 53 2e c6 8f c6 af b2 ac 06 ";
344 
345 char* signature_8 =
346     "14 14 b3 85 67 ae 6d 97 3e de 4a 06 84 2d cc 0e"
347     "05 59 b1 9e 65 a4 88 9b db ab d0 fd 02 80 68 29"
348     "13 ba cd 5d c2 f0 1b 30 bb 19 eb 81 0b 7d 9d ed"
349     "32 b2 84 f1 47 bb e7 71 c9 30 c6 05 2a a7 34 13"
350     "90 a8 49 f8 1d a9 cd 11 e5 ec cf 24 6d ba e9 5f"
351     "a9 58 28 e9 ae 0c a3 55 03 25 32 6d ee f9 f4 95"
352     "30 ba 44 1b ed 4a c2 9c 02 9c 9a 27 36 b1 a4 19"
353     "0b 85 08 4a d1 50 42 6b 46 d7 f8 5b d7 02 f4 8d"
354     "ac 5f 71 33 0b c4 23 a7 66 c6 5c c1 dc ab 20 d3"
355     "d3 bb a7 2b 63 b3 ef 82 44 d4 2f 15 7c b7 e3 a8"
356     "ba 5c 05 27 2c 64 cc 1a d2 1a 13 49 3c 39 11 f6"
357     "0b 4e 9f 4e cc 99 00 eb 05 6e e5 9d 6f e4 b8 ff"
358     "6e 80 48 cc c0 f3 8f 28 36 fd 3d fe 91 bf 4a 38"
359     "6e 1e cc 2c 32 83 9f 0c a4 d1 b2 7a 56 8f a9 40"
360     "dd 64 ad 16 bd 01 25 d0 34 8e 38 30 85 f0 88 94"
361     "86 1c a1 89 87 22 7d 37 b4 2b 58 4a 83 57 cb 04";
362 
363 // PKCS#1 v1.5 Signature Example 15.9
364 
365 char* message_9 =
366     "ea 94 1f f0 6f 86 c2 26 92 7f cf 0e 3b 11 b0 87 "
367     "26 76 17 0c 1b fc 33 bd a8 e2 65 c7 77 71 f9 d0 "
368     "85 01 64 a5 ee cb cc 5c e8 27 fb fa 07 c8 52 14 "
369     "79 6d 81 27 e8 ca a8 18 94 ea 61 ce b1 44 9e 72 "
370     "fe a0 a4 c9 43 b2 da 6d 9b 10 5f e0 53 b9 03 9a "
371     "9c c5 3d 42 0b 75 39 fa b2 23 9c 6b 51 d1 7e 69 "
372     "4c 95 7d 4b 0f 09 84 46 18 79 a0 75 9c 44 01 be "
373     "ec d4 c6 06 a0 af bd 7a 07 6f 50 a2 df c2 80 7f "
374     "24 f1 91 9b aa 77 46 d3 a6 4e 26 8e d3 f5 f8 e6 "
375     "da 83 a2 a5 c9 15 2f 83 7c b0 78 12 bd 5b a7 d3 "
376     "a0 79 85 de 88 11 3c 17 96 e9 b4 66 ec 29 9c 5a "
377     "c1 05 9e 27 f0 94 15 ";
378 
379 char* signature_9 =
380     "ce eb 84 cc b4 e9 09 92 65 65 07 21 ee a0 e8 ec"
381     "89 ca 25 bd 35 4d 4f 64 56 49 67 be 9d 4b 08 b3"
382     "f1 c0 18 53 9c 9d 37 1c f8 96 1f 22 91 fb e0 dc"
383     "2f 2f 95 fe a4 7b 63 9f 1e 12 f4 bc 38 1c ef 0c"
384     "2b 7a 7b 95 c3 ad f2 76 05 b7 f6 39 98 c3 cb ad"
385     "54 28 08 c3 82 2e 06 4d 4a d1 40 93 67 9e 6e 01"
386     "41 8a 6d 5c 05 96 84 cd 56 e3 4e d6 5a b6 05 b8"
387     "de 4f cf a6 40 47 4a 54 a8 25 1b bb 73 26 a4 2d"
388     "08 58 5c fc fc 95 67 69 b1 5b 6d 7f df 7d a8 4f"
389     "81 97 6e aa 41 d6 92 38 0f f1 0e ae cf e0 a5 79"
390     "68 29 09 b5 52 1f ad e8 54 d7 97 b8 a0 34 5b 9a"
391     "86 4e 05 88 f6 ca dd bf 65 f1 77 99 8e 18 0d 1f"
392     "10 24 43 e6 dc a5 3a 94 82 3c aa 9c 3b 35 f3 22"
393     "58 3c 70 3a f6 74 76 15 9e c7 ec 93 d1 76 9b 30"
394     "0a f0 e7 15 7d c2 98 c6 cd 2d ee 22 62 f8 cd dc"
395     "10 f1 1e 01 74 14 71 bb fd 65 18 a1 75 73 45 75";
396 
397 // PKCS#1 v1.5 Signature Example 15.10
398 
399 char* message_10 =
400     "d8 b8 16 45 c1 3c d7 ec f5 d0 0e d2 c9 1b 9a cd "
401     "46 c1 55 68 e5 30 3c 4a 97 75 ed e7 6b 48 40 3d "
402     "6b e5 6c 05 b6 b1 cf 77 c6 e7 5d e0 96 c5 cb 35 "
403     "51 cb 6f a9 64 f3 c8 79 cf 58 9d 28 e1 da 2f 9d "
404     "ec ";
405 
406 char* signature_10 =
407     "27 45 07 4c a9 71 75 d9 92 e2 b4 47 91 c3 23 c5"
408     "71 67 16 5c dd 8d a5 79 cd ef 46 86 b9 bb 40 4b"
409     "d3 6a 56 50 4e b1 fd 77 0f 60 bf a1 88 a7 b2 4b"
410     "0c 91 e8 81 c2 4e 35 b0 4d c4 dd 4c e3 85 66 bc"
411     "c9 ce 54 f4 9a 17 5f c9 d0 b2 25 22 d9 57 90 47"
412     "f9 ed 42 ec a8 3f 76 4a 10 16 39 97 94 7e 7d 2b"
413     "52 ff 08 98 0e 7e 7c 22 57 93 7b 23 f3 d2 79 d4"
414     "cd 17 d6 f4 95 54 63 73 d9 83 d5 36 ef d7 d1 b6"
415     "71 81 ca 2c b5 0a c6 16 c5 c7 ab fb b9 26 0b 91"
416     "b1 a3 8e 47 24 20 01 ff 45 2f 8d e1 0c a6 ea ea"
417     "dc af 9e dc 28 95 6f 28 a7 11 29 1f c9 a8 08 78"
418     "b8 ba 4c fe 25 b8 28 1c b8 0b c9 cd 6d 2b d1 82"
419     "52 46 ee be 25 2d 99 57 ef 93 70 73 52 08 4e 6d"
420     "36 d4 23 55 1b f2 66 a8 53 40 fb 4a 6a f3 70 88"
421     "0a ab 07 15 3d 01 f4 8d 08 6d f0 bf be c0 5e 7b"
422     "44 3b 97 e7 17 18 97 0e 2f 4b f6 20 23 e9 5b 67";
423 
424 // PKCS#1 v1.5 Signature Example 15.11
425 
426 char* message_11 =
427     "e5 73 9b 6c 14 c9 2d 51 0d 95 b8 26 93 33 37 ff "
428     "0d 24 ef 72 1a c4 ef 64 c2 ba d2 64 be 8b 44 ef "
429     "a1 51 6e 08 a2 7e b6 b6 11 d3 30 1d f0 06 2d ae "
430     "fc 73 a8 c0 d9 2e 2c 52 1f ac bc 7b 26 47 38 76 "
431     "7e a6 fc 97 d5 88 a0 ba f6 ce 50 ad f7 9e 60 0b "
432     "d2 9e 34 5f cb 1d ba 71 ac 5c 02 89 02 3f e4 a8 "
433     "2b 46 a5 40 77 19 19 7d 2e 95 8e 35 31 fd 54 ae "
434     "f9 03 aa bb 43 55 f8 83 18 99 4e d3 c3 dd 62 f4 "
435     "20 a7 ";
436 
437 char* signature_11 =
438     "be 40 a5 fb 94 f1 13 e1 b3 ef f6 b6 a3 39 86 f2"
439     "02 e3 63 f0 74 83 b7 92 e6 8d fa 55 54 df 04 66"
440     "cc 32 15 09 50 78 3b 4d 96 8b 63 9a 04 fd 2f b9"
441     "7f 6e b9 67 02 1f 5a dc cb 9f ca 95 ac c8 f2 cd"
442     "88 5a 38 0b 0a 4e 82 bc 76 07 64 db ab 88 c1 e6"
443     "c0 25 5c aa 94 f2 32 19 9d 6f 59 7c c9 14 5b 00"
444     "e3 d4 ba 34 6b 55 9a 88 33 ad 15 16 ad 51 63 f0"
445     "16 af 6a 59 83 1c 82 ea 13 c8 22 4d 84 d0 76 5a"
446     "9d 12 38 4d a4 60 a8 53 1b 4c 40 7e 04 f4 f3 50"
447     "70 9e b9 f0 8f 5b 22 0f fb 45 ab f6 b7 5d 15 79"
448     "fd 3f 1e b5 5f c7 5b 00 af 8b a3 b0 87 82 7f e9"
449     "ae 9f b4 f6 c5 fa 63 03 1f e5 82 85 2f e2 83 4f"
450     "9c 89 bf f5 3e 25 52 21 6b c7 c1 d4 a3 d5 dc 2b"
451     "a6 95 5c d9 b1 7d 13 63 e7 fe e8 ed 76 29 75 3f"
452     "f3 12 5e dd 48 52 1a e3 b9 b0 32 17 f4 49 6d 0d"
453     "8e de 57 ac bc 5b d4 de ae 74 a5 6f 86 67 1d e2";
454 
455 // PKCS#1 v1.5 Signature Example 15.12
456 
457 char* message_12 =
458     "7a f4 28 35 91 7a 88 d6 b3 c6 71 6b a2 f5 b0 d5 "
459     "b2 0b d4 e2 e6 e5 74 e0 6a f1 ee f7 c8 11 31 be "
460     "22 bf 81 28 b9 cb c6 ec 00 27 5b a8 02 94 a5 d1 "
461     "17 2d 08 24 a7 9e 8f dd 83 01 83 e4 c0 0b 96 78 "
462     "28 67 b1 22 7f ea 24 9a ad 32 ff c5 fe 00 7b c5 "
463     "1f 21 79 2f 72 8d ed a8 b5 70 8a a9 9c ab ab 20 "
464     "a4 aa 78 3e d8 6f 0f 27 b5 d5 63 f4 2e 07 15 8c "
465     "ea 72 d0 97 aa 68 87 ec 41 1d d0 12 91 2a 5e 03 "
466     "2b bf a6 78 50 71 44 bc c9 5f 39 b5 8b e7 bf d1 "
467     "75 9a db 9a 91 fa 1d 6d 82 26 a8 34 3a 8b 84 9d "
468     "ae 76 f7 b9 82 24 d5 9e 28 f7 81 f1 3e ce 60 5f "
469     "84 f6 c9 0b ae 5f 8c f3 78 81 6f 40 20 a7 dd a1 "
470     "be d9 0c 92 a2 36 34 d2 03 fa c3 fc d8 6d 68 d3 "
471     "18 2a 7d 9c ca be 7b 07 95 f5 c6 55 e9 ac c4 e3 "
472     "ec 18 51 40 d1 0c ef 05 34 64 ab 17 5c 83 bd 83 "
473     "93 5e 3d ab af 34 62 ee be 63 d1 5f 57 3d 26 9a ";
474 
475 char* signature_12 =
476     "4e 78 c5 90 2b 80 79 14 d1 2f a5 37 ae 68 71 c8"
477     "6d b8 02 1e 55 d1 ad b8 eb 0c cf 1b 8f 36 ab 7d"
478     "ad 1f 68 2e 94 7a 62 70 72 f0 3e 62 73 71 78 1d"
479     "33 22 1d 17 4a be 46 0d bd 88 56 0c 22 f6 90 11"
480     "6e 2f bb e6 e9 64 36 3a 3e 52 83 bb 5d 94 6e f1"
481     "c0 04 7e ba 03 8c 75 6c 40 be 79 23 05 58 09 b0"
482     "e9 f3 4a 03 a5 88 15 eb dd e7 67 93 1f 01 8f 6f"
483     "18 78 f2 ef 4f 47 dd 37 40 51 dd 48 68 5d ed 6e"
484     "fb 3e a8 02 1f 44 be 1d 7d 14 93 98 f9 8e a9 c0"
485     "8d 62 88 8e bb 56 19 2d 17 74 7b 6b 8e 17 09 54"
486     "31 f1 25 a8 a8 e9 96 2a a3 1c 28 52 64 e0 8f b2"
487     "1a ac 33 6c e6 c3 8a a3 75 e4 2b c9 2a b0 ab 91"
488     "03 84 31 e1 f9 2c 39 d2 af 5d ed 7e 43 bc 15 1e"
489     "6e be a4 c3 e2 58 3a f3 43 7e 82 c4 3c 5e 3b 5b"
490     "07 cf 03 59 68 3d 22 98 e3 59 48 ed 80 6c 06 3c"
491     "60 6e a1 78 15 0b 1e fc 15 85 69 34 c7 25 5c fe";
492 
493 // PKCS#1 v1.5 Signature Example 15.13
494 
495 char* message_13 =
496     "eb ae f3 f9 f2 3b df e5 fa 6b 8a f4 c2 08 c1 89 "
497     "f2 25 1b f3 2f 5f 13 7b 9d e4 40 63 78 68 6b 3f "
498     "07 21 f6 2d 24 cb 86 88 d6 fc 41 a2 7c ba e2 1d "
499     "30 e4 29 fe ac c7 11 19 41 c2 77 ";
500 
501 char* signature_13 =
502     "c4 8d be f5 07 11 4f 03 c9 5f af be b4 df 1b fa"
503     "88 e0 18 4a 33 cc 4f 8a 9a 10 35 ff 7f 82 2a 5e"
504     "38 cd a1 87 23 91 5f f0 78 24 44 29 e0 f6 08 1c"
505     "14 fd 83 33 1f a6 5c 6b a7 bb 9a 12 db f6 62 23"
506     "74 cd 0c a5 7d e3 77 4e 2b d7 ae 82 36 77 d0 61"
507     "d5 3a e9 c4 04 0d 2d a7 ef 70 14 f3 bb dc 95 a3"
508     "61 a4 38 55 c8 ce 9b 97 ec ab ce 17 4d 92 62 85"
509     "14 2b 53 4a 30 87 f9 f4 ef 74 51 1e c7 42 b0 d5"
510     "68 56 03 fa f4 03 b5 07 2b 98 5d f4 6a df 2d 25"
511     "29 a0 2d 40 71 1e 21 90 91 70 52 37 1b 79 b7 49"
512     "b8 3a bf 0a e2 94 86 c3 f2 f6 24 77 b2 bd 36 2b"
513     "03 9c 01 3c 0c 50 76 ef 52 0d bb 40 5f 42 ce e9"
514     "54 25 c3 73 a9 75 e1 cd d0 32 c4 96 22 c8 50 79"
515     "b0 9e 88 da b2 b1 39 69 ef 7a 72 39 73 78 10 40"
516     "45 9f 57 d5 01 36 38 48 3d e2 d9 1c b3 c4 90 da"
517     "81 c4 6d e6 cd 76 ea 8a 0c 8f 6f e3 31 71 2d 24";
518 
519 // PKCS#1 v1.5 Signature Example 15.14
520 
521 char* message_14 =
522     "c5 a2 71 12 78 76 1d fc dd 4f 0c 99 e6 f5 61 9d "
523     "6c 48 b5 d4 c1 a8 09 82 fa a6 b4 cf 1c f7 a6 0f "
524     "f3 27 ab ef 93 c8 01 42 9e fd e0 86 40 85 81 46 "
525     "10 56 ac c3 3f 3d 04 f5 ad a2 12 16 ca cd 5f d1 "
526     "f9 ed 83 20 3e 0e 2f e6 13 8e 3e ae 84 24 e5 91 "
527     "5a 08 3f 3f 7a b7 60 52 c8 be 55 ae 88 2d 6e c1 "
528     "48 2b 1e 45 c5 da e9 f4 10 15 40 53 27 02 2e c3 "
529     "2f 0e a2 42 97 63 b2 55 04 3b 19 58 ee 3c f6 d6 "
530     "39 83 59 6e b3 85 84 4f 85 28 cc 9a 98 65 83 5d "
531     "c5 11 3c 02 b8 0d 0f ca 68 aa 25 e7 2b ca ae b3 "
532     "cf 9d 79 d8 4f 98 4f d4 17 ";
533 
534 char* signature_14 =
535     "6b d5 25 7a a0 66 11 fb 46 60 08 7c b4 bc 4a 9e"
536     "44 91 59 d3 16 52 bd 98 08 44 da f3 b1 c7 b3 53"
537     "f8 e5 61 42 f7 ea 98 57 43 3b 18 57 3b 4d ee de"
538     "81 8a 93 b0 29 02 97 78 3f 1a 2f 23 cb c7 27 97"
539     "a6 72 53 7f 01 f6 24 84 cd 41 62 c3 21 4b 9a c6"
540     "28 22 4c 5d e0 1f 32 bb 9b 76 b2 73 54 f2 b1 51"
541     "d0 e8 c4 21 3e 46 15 ad 0b c7 1f 51 5e 30 0d 6a"
542     "64 c6 74 34 11 ff fd e8 e5 ff 19 0e 54 92 30 43"
543     "12 6e cf c4 c4 53 90 22 66 8f b6 75 f2 5c 07 e2"
544     "00 99 ee 31 5b 98 d6 af ec 4b 1a 9a 93 dc 33 49"
545     "6a 15 bd 6f de 16 63 a7 d4 9b 9f 1e 63 9d 38 66"
546     "4b 37 a0 10 b1 f3 5e 65 86 82 d9 cd 63 e5 7d e0"
547     "f1 5e 8b dd 09 65 58 f0 7e c0 ca a2 18 a8 c0 6f"
548     "47 88 45 39 40 28 7c 9d 34 b6 d4 0a 3f 09 bf 77"
549     "99 fe 98 ae 4e b4 9f 3f f4 1c 50 40 a5 0c ef c9"
550     "bd f2 39 4b 74 9c f1 64 48 0d f1 ab 68 80 27 3b";
551 
552 // PKCS#1 v1.5 Signature Example 15.15
553 
554 char* message_15 =
555     "9b f8 aa 25 3b 87 2e a7 7a 7e 23 47 6b e2 6b 23 "
556     "29 57 8c f6 ac 9e a2 80 5b 35 7f 6f c3 ad 13 0d "
557     "ba eb 3d 86 9a 13 cc e7 a8 08 bb bb c9 69 85 7e "
558     "03 94 5c 7b b6 1d f1 b5 c2 58 9b 8e 04 6c 2a 5d "
559     "7e 40 57 b1 a7 4f 24 c7 11 21 63 64 28 85 29 ec "
560     "95 70 f2 51 97 21 3b e1 f5 c2 e5 96 f8 bf 8b 2c "
561     "f3 cb 38 aa 56 ff e5 e3 1d f7 39 58 20 e9 4e cf "
562     "3b 11 89 a9 65 dc f9 a9 cb 42 98 d3 c8 8b 29 23 "
563     "c1 9f c6 bc 34 aa ce ca d4 e0 93 1a 7c 4e 5d 73 "
564     "dc 86 df a7 98 a8 47 6d 82 46 3e ef aa 90 a8 a9 "
565     "19 2a b0 8b 23 08 8d d5 8e 12 80 f7 d7 2e 45 48 "
566     "39 6b aa c1 12 25 2d d5 c5 34 6a db 20 04 a2 f7 "
567     "10 1c cc 89 9c c7 fa fa e8 bb e2 95 73 88 96 a5 "
568     "b2 01 22 85 01 4e f6 ";
569 
570 char* signature_15 =
571     "27 f7 f4 da 9b d6 10 10 6e f5 7d 32 38 3a 44 8a"
572     "8a 62 45 c8 3d c1 30 9c 6d 77 0d 35 7b a8 9e 73"
573     "f2 ad 08 32 06 2e b0 fe 0a c9 15 57 5b cd 6b 8b"
574     "ca db 4e 2b a6 fa 9d a7 3a 59 17 51 52 b2 d4 fe"
575     "72 b0 70 c9 b7 37 9e 50 00 0e 55 e6 c2 69 f6 65"
576     "8c 93 79 72 79 7d 3a dd 69 f1 30 e3 4b 85 bd ec"
577     "9f 3a 9b 39 22 02 d6 f3 e4 30 d0 9c ac a8 22 77"
578     "59 ab 82 5f 70 12 d2 ff 4b 5b 62 c8 50 4d ba d8"
579     "55 c0 5e dd 5c ab 5a 4c cc dc 67 f0 1d d6 51 7c"
580     "7d 41 c4 3e 2a 49 57 af f1 9d b6 f1 8b 17 85 9a"
581     "f0 bc 84 ab 67 14 6e c1 a4 a6 0a 17 d7 e0 5f 8b"
582     "4f 9c ed 6a d1 09 08 d8 d7 8f 7f c8 8b 76 ad c8"
583     "29 0f 87 da f2 a7 be 10 ae 40 85 21 39 5d 54 ed"
584     "25 56 fb 76 61 85 4a 73 0c e3 d8 2c 71 a8 d4 93"
585     "ec 49 a3 78 ac 8a 3c 74 43 9f 7c c5 55 ba 13 f8"
586     "59 07 08 90 ee 18 ff 65 8f a4 d7 41 96 9d 70 a5";
587 
588 // PKCS#1 v1.5 Signature Example 15.16
589 
590 char* message_16 =
591     "32 47 48 30 e2 20 37 54 c8 bf 06 81 dc 4f 84 2a "
592     "fe 36 09 30 37 86 16 c1 08 e8 33 65 6e 56 40 c8 "
593     "68 56 88 5b b0 5d 1e b9 43 8e fe de 67 92 63 de "
594     "07 cb 39 55 3f 6a 25 e0 06 b0 a5 23 11 a0 63 ca "
595     "08 82 66 d2 56 4f f6 49 0c 46 b5 60 98 18 54 8f "
596     "88 76 4d ad 34 a2 5e 3a 85 d5 75 02 3f 0b 9e 66 "
597     "50 48 a0 3c 35 05 79 a9 d3 24 46 c7 bb 96 cc 92 "
598     "e0 65 ab 94 d3 c8 95 2e 8d f6 8e f0 d9 fa 45 6b "
599     "3a 06 bb 80 e3 bb c4 b2 8e 6a 94 b6 d0 ff 76 96 "
600     "a6 4e fe 05 e7 35 fe a0 25 d7 bd bc 41 39 f3 a3 "
601     "b5 46 07 5c ba 7e fa 94 73 74 d3 f0 ac 80 a6 8d "
602     "76 5f 5d f6 21 0b ca 06 9a 2d 88 64 7a f7 ea 04 "
603     "2d ac 69 0c b5 73 78 ec 07 77 61 4f b8 b6 5f f4 "
604     "53 ca 6b 7d ce 60 98 45 1a 2f 8c 0d a9 bf ec f1 "
605     "fd f3 91 bb aa 4e 2a 91 ca 18 a1 12 1a 75 23 a2 "
606     "ab d4 25 14 f4 89 e8 ";
607 
608 char* signature_16 =
609     "69 17 43 72 57 c2 2c cb 54 03 29 0c 3d ee 82 d9"
610     "cf 75 50 b3 1b d3 1c 51 bd 57 bf d3 5d 45 2a b4"
611     "db 7c 4b e6 b2 e2 5a c9 a5 9a 1d 2a 7f eb 62 7f"
612     "0a fd 49 76 b3 00 3c c9 cf fd 88 96 50 5e c3 82"
613     "f2 65 10 4d 4c f8 c9 32 fa 9f e8 6e 00 87 07 95"
614     "99 12 38 9d a4 b2 d6 b3 69 b3 6a 5e 72 e2 9d 24"
615     "c9 a9 8c 9d 31 a3 ab 44 e6 43 e6 94 12 66 a4 7a"
616     "45 e3 44 6c e8 77 6a be 24 1a 8f 5f c6 42 3b 24"
617     "b1 ff 25 0d c2 c3 a8 17 23 53 56 10 77 e8 50 a7"
618     "69 b2 5f 03 25 da c8 89 65 a3 b9 b4 72 c4 94 e9"
619     "5f 71 9b 4e ac 33 2c aa 7a 65 c7 df e4 6d 9a a7"
620     "e6 e0 0f 52 5f 30 3d d6 3a b7 91 92 18 90 18 68"
621     "f9 33 7f 8c d2 6a af e6 f3 3b 7f b2 c9 88 10 af"
622     "19 f7 fc b2 82 ba 15 77 91 2c 1d 36 89 75 fd 5d"
623     "44 0b 86 e1 0c 19 97 15 fa 0b 6f 42 50 b5 33 73"
624     "2d 0b ef e1 54 51 50 fc 47 b8 76 de 09 b0 0a 94";
625 
626 // PKCS#1 v1.5 Signature Example 15.17
627 
628 char* message_17 =
629     "00 8e 59 50 5e af b5 50 aa e5 e8 45 58 4c eb b0 "
630     "0b 6d e1 73 3e 9f 95 d4 2c 88 2a 5b be b5 ce 1c "
631     "57 e1 19 e7 c0 d4 da ca 9f 1f f7 87 02 17 f7 cf "
632     "d8 a6 b3 73 97 7c ac 9c ab 8e 71 e4 20 ";
633 
634 char* signature_17 =
635     "92 25 03 b6 73 ee 5f 3e 69 1e 1c a8 5e 9f f4 17"
636     "3c f7 2b 05 ac 2c 13 1d a5 60 35 93 e3 bc 25 9c"
637     "94 c1 f7 d3 a0 6a 5b 98 91 bf 11 3f a3 9e 59 ff"
638     "7c 1e d6 46 5e 90 80 49 cb 89 e4 e1 25 cd 37 d2"
639     "ff d9 22 7a 41 b4 a0 a1 9c 0a 44 fb bf 3d e5 5b"
640     "ab 80 20 87 a3 bb 8d 4f f6 68 ee 6b bb 8a d8 9e"
641     "68 57 a7 9a 9c 72 78 19 90 df cf 92 cd 51 94 04"
642     "c9 50 f1 3d 11 43 c3 18 4f 1d 25 0c 90 e1 7a c6"
643     "ce 36 16 3b 98 95 62 7a d6 ff ec 14 22 44 1f 55"
644     "e4 49 9d ba 9b e8 95 46 ae 8b c6 3c ca 01 dd 08"
645     "46 3a e7 f1 fc e3 d8 93 99 69 38 77 8c 18 12 e6"
646     "74 ad 9c 30 9c 5a cc a3 fd e4 4e 7d d8 69 59 93"
647     "e9 c1 fa 87 ac da 99 ec e5 c8 49 9e 46 89 57 ad"
648     "66 35 9b f1 2a 51 ad be 78 d3 a2 13 b4 49 bf 0b"
649     "5f 8d 4d 49 6a cf 03 d3 03 3b 7c cd 19 6b c2 2f"
650     "68 fb 7b ef 4f 69 7c 5e a2 b3 50 62 f4 8a 36 dd";
651 
652 // PKCS#1 v1.5 Signature Example 15.18
653 
654 char* message_18 =
655     "6a bc 54 cf 8d 1d ff 1f 53 b1 7d 81 60 36 88 78 "
656     "a8 78 8c c6 d2 2f a5 c2 25 8c 88 e6 60 b0 9a 89 "
657     "33 f9 f2 c0 50 4d da dc 21 f6 e7 5e 0b 83 3b eb "
658     "55 52 29 de e6 56 b9 04 7b 92 f6 2e 76 b8 ff cc "
659     "60 da b0 6b 80 ";
660 
661 char* signature_18 =
662     "0b 6d af 42 f7 a8 62 14 7e 41 74 93 c2 c4 01 ef"
663     "ae 32 63 6a b4 cb d4 41 92 bb f5 f1 95 b5 0a e0"
664     "96 a4 75 a1 61 4f 0a 9f a8 f7 a0 26 cb 46 c6 50"
665     "6e 51 8e 33 d8 3e 56 47 7a 87 5a ca 8c 7e 71 4c"
666     "e1 bd bd 61 ef 5d 53 52 39 b3 3f 2b fd d6 17 71"
667     "ba b6 27 76 d7 81 71 a1 42 3c ea 87 31 f8 2e 60"
668     "76 6d 64 54 26 56 20 b1 5f 5c 5a 58 4f 55 f9 5b"
669     "80 2f e7 8c 57 4e d5 da cf c8 31 f3 cf 2b 05 02"
670     "c0 b2 98 f2 5c cf 11 f9 73 b3 1f 85 e4 74 42 19"
671     "85 f3 cf f7 02 df 39 46 ef 0a 66 05 68 21 11 b2"
672     "f5 5b 1f 8a b0 d2 ea 3a 68 3c 69 98 5e ad 93 ed"
673     "44 9e a4 8f 03 58 dd f7 08 02 cb 41 de 2f d8 3f"
674     "3c 80 80 82 d8 49 36 94 8e 0c 84 a1 31 b4 92 78"
675     "27 46 05 27 bb 5c d2 4b fa b7 b4 8e 07 1b 24 17"
676     "19 30 f9 97 63 27 2f 97 97 bc b7 6f 1d 24 81 57"
677     "55 58 fc f2 60 b1 f0 e5 54 eb b3 df 3c fc b9 58";
678 
679 // PKCS#1 v1.5 Signature Example 15.19
680 
681 char* message_19 =
682     "af 2d 78 15 2c f1 0e fe 01 d2 74 f2 17 b1 77 f6 "
683     "b0 1b 5e 74 9f 15 67 71 5d a3 24 85 9c d3 dd 88 "
684     "db 84 8e c7 9f 48 db ba 7b 6f 1d 33 11 1e f3 1b "
685     "64 89 9e 73 91 c2 bf fd 69 f4 90 25 cf 20 1f c5 "
686     "85 db d1 54 2c 1c 77 8a 2c e7 a7 ee 10 8a 30 9f "
687     "ec a2 6d 13 3a 5f fe dc 4e 86 9d cd 76 56 59 6a "
688     "c8 42 7e a3 ef 6e 3f d7 8f e9 9d 8d dc 71 d8 39 "
689     "f6 78 6e 0d a6 e7 86 bd 62 b3 a4 f1 9b 89 1a 56 "
690     "15 7a 55 4e c2 a2 b3 9e 25 a1 d7 c7 d3 73 21 c7 "
691     "a1 d9 46 cf 4f be 75 8d 92 76 f0 85 63 44 9d 67 "
692     "41 4a 2c 03 0f 42 51 cf e2 21 3d 04 a5 41 06 37 "
693     "87 ";
694 
695 char* signature_19 =
696     "20 9c 61 15 78 57 38 7b 71 e2 4b f3 dd 56 41 45"
697     "50 50 3b ec 18 0f f5 3b dd 9b ac 06 2a 2d 49 95"
698     "09 bf 99 12 81 b7 95 27 df 91 36 61 5b 7a 6d 9d"
699     "b3 a1 03 b5 35 e0 20 2a 2c ac a1 97 a7 b7 4e 53"
700     "56 f3 dd 59 5b 49 ac fd 9d 30 04 9a 98 ca 88 f6"
701     "25 bc a1 d5 f2 2a 39 2d 8a 74 9e fb 6e ed 9b 78"
702     "21 d3 11 0a c0 d2 44 19 9e cb 4a a3 d7 35 a8 3a"
703     "2e 88 93 c6 bf 85 81 38 3c ca ee 83 46 35 b7 fa"
704     "1f af fa 45 b1 3d 15 c1 da 33 af 71 e8 93 03 d6"
705     "80 90 ff 62 ee 61 5f df 5a 84 d1 20 71 1d a5 3c"
706     "28 89 19 8a b3 83 17 a9 73 4a b2 7d 67 92 4c ea"
707     "74 15 6f f9 9b ef 98 76 bb 5c 33 9e 93 74 52 83"
708     "e1 b3 4e 07 22 26 b8 80 45 e0 17 e9 f0 5b 2a 8c"
709     "41 67 40 25 8e 22 3b 26 90 02 74 91 73 22 73 f3"
710     "22 9d 9e f2 b1 b3 80 7e 32 10 18 92 0a d3 e5 3d"
711     "ae 47 e6 d9 39 5c 18 4b 93 a3 74 c6 71 fa a2 ce";
712 
713 // PKCS#1 v1.5 Signature Example 15.20
714 
715 char* message_20 =
716     "40 ee 99 24 58 d6 f6 14 86 d2 56 76 a9 6d d2 cb "
717     "93 a3 7f 04 b1 78 48 2f 2b 18 6c f8 82 15 27 0d "
718     "ba 29 d7 86 d7 74 b0 c5 e7 8c 7f 6e 56 a9 56 e7 "
719     "f7 39 50 a2 b0 c0 c1 0a 08 db cd 67 e5 b2 10 bb "
720     "21 c5 8e 27 67 d4 4f 7d d4 01 4e 39 66 14 3b f7 "
721     "e3 d6 6f f0 c0 9b e4 c5 5f 93 b3 99 94 b8 51 8d "
722     "9c 1d 76 d5 b4 73 74 de a0 8f 15 7d 57 d7 06 34 "
723     "97 8f 38 56 e0 e5 b4 81 af bb db 5a 3a c4 8d 48 "
724     "4b e9 2c 93 de 22 91 78 35 4c 2d e5 26 e9 c6 5a "
725     "31 ed e1 ef 68 cb 63 98 d7 91 16 84 fe c0 ba bc "
726     "3a 78 1a 66 66 07 83 50 69 74 d0 e1 48 25 10 1c "
727     "3b fa ea ";
728 
729 char* signature_20 =
730     "92 75 02 b8 24 af c4 25 13 ca 65 70 de 33 8b 8a"
731     "64 c3 a8 5e b8 28 d3 19 36 24 f2 7e 8b 10 29 c5"
732     "5c 11 9c 97 33 b1 8f 58 49 b3 50 09 18 bc c0 05"
733     "51 d9 a8 fd f5 3a 97 74 9f a8 dc 48 0d 6f e9 74"
734     "2a 58 71 f9 73 92 65 28 97 2a 1a f4 9e 39 25 b0"
735     "ad f1 4a 84 27 19 b4 a5 a2 d8 9f a9 c0 b6 60 5d"
736     "21 2b ed 1e 67 23 b9 34 06 ad 30 e8 68 29 a5 c7"
737     "19 b8 90 b3 89 30 6d c5 50 64 86 ee 2f 36 a8 df"
738     "e0 a9 6a f6 78 c9 cb d6 af f3 97 ca 20 0e 3e dc"
739     "1e 36 bd 2f 08 b3 1d 54 0c 0c b2 82 a9 55 9e 4a"
740     "dd 4f c9 e6 49 2e ed 0c cb d3 a6 98 2e 5f aa 2d"
741     "dd 17 be 47 41 7c 80 b4 e5 45 2d 31 f7 24 01 a0"
742     "42 32 51 09 54 4d 95 4c 01 93 90 79 d4 09 a5 c3"
743     "78 d7 51 2d fc 2d 2a 71 ef cc 34 32 a7 65 d1 c6"
744     "a5 2c fc e8 99 cd 79 b1 5b 4f c3 72 36 41 ef 6b"
745     "d0 0a cc 10 40 7e 5d f5 8d d1 c3 c5 c5 59 a5 06";
746 
747 
parsehex(char * str,int * len)748 unsigned char* parsehex(char* str, int* len) {
749     // result can't be longer than input
750     unsigned char* result = malloc(strlen(str));
751 
752     unsigned char* p = result;
753     *len = 0;
754 
755     while (*str) {
756         int b;
757 
758         while (isspace(*str)) str++;
759 
760         switch (*str) {
761             case '0': case '1': case '2': case '3': case '4':
762             case '5': case '6': case '7': case '8': case '9':
763                 b = (*str - '0') << 4; break;
764             case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
765                 b = (*str - 'a' + 10) << 4; break;
766             case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
767                 b = (*str - 'A' + 10) << 4; break;
768             case '\0':
769                 return result;
770             default:
771                 return NULL;
772         }
773         str++;
774 
775         while (isspace(*str)) str++;
776 
777         switch (*str) {
778             case '0': case '1': case '2': case '3': case '4':
779             case '5': case '6': case '7': case '8': case '9':
780                 b |= *str - '0'; break;
781             case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
782                 b |= *str - 'a' + 10; break;
783             case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
784                 b |= *str - 'A' + 10; break;
785             default:
786                 return NULL;
787         }
788         str++;
789 
790         *p++ = b;
791         ++*len;
792     }
793 
794     return result;
795 }
796 
797 
main(int arg __unused,char ** argv __unused)798 int main(int arg __unused, char** argv __unused) {
799 
800     unsigned char hash[SHA_DIGEST_SIZE];
801 
802     unsigned char* message;
803     int mlen;
804     unsigned char* signature;
805     int slen;
806 
807 #define TEST_MESSAGE(n) do {\
808     message = parsehex(message_##n, &mlen); \
809     SHA_hash(message, mlen, hash); \
810     signature = parsehex(signature_##n, &slen); \
811     int result = RSA_verify(&key_15, signature, slen, hash, sizeof(hash)); \
812     printf("message %d: %s\n", n, result ? "verified" : "not verified"); \
813     success = success && result; \
814     } while(0)
815 
816     int success = 1;
817 
818     TEST_MESSAGE(1);
819     TEST_MESSAGE(2);
820     TEST_MESSAGE(3);
821     TEST_MESSAGE(4);
822     TEST_MESSAGE(5);
823     TEST_MESSAGE(6);
824     TEST_MESSAGE(7);
825     TEST_MESSAGE(8);
826     TEST_MESSAGE(9);
827     TEST_MESSAGE(10);
828     TEST_MESSAGE(11);
829     TEST_MESSAGE(12);
830     TEST_MESSAGE(13);
831     TEST_MESSAGE(14);
832     TEST_MESSAGE(15);
833     TEST_MESSAGE(16);
834     TEST_MESSAGE(17);
835     TEST_MESSAGE(18);
836     TEST_MESSAGE(19);
837     TEST_MESSAGE(20);
838 
839     printf("\n%s\n\n", success ? "PASS" : "FAIL");
840 
841     return !success;
842 }
843