• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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