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 "mincrypt/rsa.h"
34#include "mincrypt/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
74RSAPublicKey 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
114char* 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
131char* 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
151char *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
163char* 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
183char* 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
201char* 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
221char* 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
227char* 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
247char* message_5 =
248    "bd a3 a1 c7 90 59 ea e5 98 30 8d 3d f6 09 ";
249
250char* 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
270char* 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
279char* 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
299char* 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
309char* 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
329char* 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
345char* 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
365char* 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
379char* 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
399char* 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
406char* 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
426char* 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
437char* 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
457char* 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
475char* 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
495char* 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
501char* 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
521char* 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
534char* 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
554char* 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
570char* 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
590char* 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
608char* 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
628char* 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
634char* 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
654char* 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
661char* 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
681char* 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
695char* 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
715char* 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
729char* 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
748unsigned 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
798int 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