1 /*
2  * QEMU Crypto cipher algorithms
3  *
4  * Copyright (c) 2022 Bytedance
5  * Author: lei he <helei.sig11@bytedance.com>
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
19  *
20  */
21 
22 #include "qemu/osdep.h"
23 
24 #include "crypto/init.h"
25 #include "crypto/akcipher.h"
26 #include "qapi/error.h"
27 
28 static const uint8_t rsa1024_private_key[] = {
29     0x30, 0x82, 0x02, 0x5c, 0x02, 0x01, 0x00, 0x02,
30     0x81, 0x81, 0x00, 0xe6, 0x4d, 0x76, 0x4f, 0xb2,
31     0x97, 0x09, 0xad, 0x9d, 0x17, 0x33, 0xf2, 0x30,
32     0x42, 0x83, 0xa9, 0xcb, 0x49, 0xa4, 0x2e, 0x59,
33     0x5e, 0x75, 0x51, 0xd1, 0xac, 0xc8, 0x86, 0x3e,
34     0xdb, 0x72, 0x2e, 0xb2, 0xf7, 0xc3, 0x5b, 0xc7,
35     0xea, 0xed, 0x30, 0xd1, 0xf7, 0x37, 0xee, 0x9d,
36     0x36, 0x59, 0x6f, 0xf8, 0xce, 0xc0, 0x5c, 0x82,
37     0x80, 0x37, 0x83, 0xd7, 0x45, 0x6a, 0xe9, 0xea,
38     0xc5, 0x3a, 0x59, 0x6b, 0x34, 0x31, 0x44, 0x00,
39     0x74, 0xa7, 0x29, 0xab, 0x79, 0x4a, 0xbd, 0xe8,
40     0x25, 0x35, 0x01, 0x11, 0x40, 0xbf, 0x31, 0xbd,
41     0xd3, 0xe0, 0x68, 0x1e, 0xd5, 0x5b, 0x2f, 0xe9,
42     0x20, 0xf2, 0x9f, 0x46, 0x35, 0x30, 0xa8, 0xf1,
43     0xfe, 0xef, 0xd8, 0x76, 0x23, 0x46, 0x34, 0x70,
44     0xa1, 0xce, 0xc6, 0x65, 0x6d, 0xb0, 0x94, 0x7e,
45     0xe5, 0x92, 0x45, 0x7b, 0xaa, 0xbb, 0x95, 0x97,
46     0x77, 0xcd, 0xd3, 0x02, 0x03, 0x01, 0x00, 0x01,
47     0x02, 0x81, 0x80, 0x30, 0x6a, 0xc4, 0x9e, 0xc8,
48     0xba, 0xfc, 0x2b, 0xe5, 0xc4, 0xc5, 0x04, 0xfb,
49     0xa4, 0x60, 0x2d, 0xc8, 0x31, 0x39, 0x35, 0x0d,
50     0x50, 0xd0, 0x75, 0x5d, 0x11, 0x68, 0x2e, 0xe0,
51     0xf4, 0x1d, 0xb3, 0x37, 0xa8, 0xe3, 0x07, 0x5e,
52     0xa6, 0x43, 0x2b, 0x6a, 0x59, 0x01, 0x07, 0x47,
53     0x41, 0xef, 0xd7, 0x9c, 0x85, 0x4a, 0xe7, 0xa7,
54     0xff, 0xf0, 0xab, 0xe5, 0x0c, 0x11, 0x08, 0x10,
55     0x75, 0x5a, 0x68, 0xa0, 0x08, 0x03, 0xc9, 0x40,
56     0x79, 0x67, 0x1d, 0x65, 0x89, 0x2d, 0x08, 0xf9,
57     0xb5, 0x1b, 0x7d, 0xd2, 0x41, 0x3b, 0x33, 0xf2,
58     0x47, 0x2f, 0x9c, 0x0b, 0xd5, 0xaf, 0xcb, 0xdb,
59     0xbb, 0x37, 0x63, 0x03, 0xf8, 0xe7, 0x2e, 0xc7,
60     0x3c, 0x86, 0x9f, 0xc2, 0x9b, 0xb4, 0x70, 0x6a,
61     0x4d, 0x7c, 0xe4, 0x1b, 0x3a, 0xa9, 0xae, 0xd7,
62     0xce, 0x7f, 0x56, 0xc2, 0x73, 0x5e, 0x58, 0x63,
63     0xd5, 0x86, 0x41, 0x02, 0x41, 0x00, 0xf6, 0x56,
64     0x69, 0xec, 0xef, 0x65, 0x95, 0xdc, 0x25, 0x47,
65     0xe0, 0x6f, 0xb0, 0x4f, 0x79, 0x77, 0x0a, 0x5e,
66     0x46, 0xcb, 0xbd, 0x0b, 0x71, 0x51, 0x2a, 0xa4,
67     0x65, 0x29, 0x18, 0xc6, 0x30, 0xa0, 0x95, 0x4c,
68     0x4b, 0xbe, 0x8c, 0x40, 0xe3, 0x9c, 0x23, 0x02,
69     0x14, 0x43, 0xe9, 0x64, 0xea, 0xe3, 0xa8, 0xe2,
70     0x1a, 0xd5, 0xf9, 0x5c, 0xe0, 0x36, 0x2c, 0x97,
71     0xda, 0xd5, 0xc7, 0x46, 0xce, 0x11, 0x02, 0x41,
72     0x00, 0xef, 0x56, 0x08, 0xb8, 0x29, 0xa5, 0xa6,
73     0x7c, 0xf7, 0x5f, 0xb4, 0xf5, 0x63, 0xe7, 0xeb,
74     0x45, 0xfd, 0x89, 0xaa, 0x94, 0xa6, 0x3d, 0x0b,
75     0xd9, 0x04, 0x6f, 0x78, 0xe0, 0xbb, 0xa2, 0xd4,
76     0x29, 0x83, 0x17, 0x95, 0x6f, 0x50, 0x3d, 0x40,
77     0x5d, 0xe5, 0x24, 0xda, 0xc2, 0x23, 0x50, 0x86,
78     0xa8, 0x34, 0xc8, 0x6f, 0xec, 0x7f, 0xb6, 0x45,
79     0x3a, 0xdd, 0x78, 0x9b, 0xee, 0xa1, 0xe4, 0x09,
80     0xa3, 0x02, 0x40, 0x5c, 0xd6, 0x66, 0x67, 0x58,
81     0x35, 0xc5, 0xcb, 0xc8, 0xf5, 0x14, 0xbd, 0xa3,
82     0x09, 0xe0, 0xb2, 0x1f, 0x63, 0x36, 0x75, 0x34,
83     0x52, 0xea, 0xaa, 0xf7, 0x52, 0x2b, 0x99, 0xd8,
84     0x6f, 0x61, 0x06, 0x34, 0x1e, 0x23, 0xf1, 0xb5,
85     0x34, 0x03, 0x53, 0xe5, 0xd1, 0xb3, 0xc7, 0x80,
86     0x5f, 0x7b, 0x32, 0xbf, 0x84, 0x2f, 0x2e, 0xf3,
87     0x22, 0xb0, 0x91, 0x5a, 0x2f, 0x04, 0xd7, 0x4a,
88     0x9a, 0x01, 0xb1, 0x02, 0x40, 0x34, 0x0b, 0x26,
89     0x4c, 0x3d, 0xaa, 0x2a, 0xc0, 0xe3, 0xdd, 0xe8,
90     0xf0, 0xaf, 0x6f, 0xe0, 0x06, 0x51, 0x32, 0x9d,
91     0x68, 0x43, 0x99, 0xe4, 0xb8, 0xa5, 0x31, 0x44,
92     0x3c, 0xc2, 0x30, 0x8f, 0x28, 0x13, 0xbc, 0x8e,
93     0x1f, 0x2d, 0x78, 0x94, 0x45, 0x96, 0xad, 0x63,
94     0xf0, 0x71, 0x53, 0x72, 0x64, 0xa3, 0x4d, 0xae,
95     0xa0, 0xe3, 0xc8, 0x93, 0xd7, 0x50, 0x0f, 0x89,
96     0x00, 0xe4, 0x2d, 0x3d, 0x37, 0x02, 0x41, 0x00,
97     0xbe, 0xa6, 0x08, 0xe0, 0xc8, 0x15, 0x2a, 0x47,
98     0xcb, 0xd5, 0xec, 0x93, 0xd3, 0xaa, 0x12, 0x82,
99     0xaf, 0xac, 0x51, 0x5a, 0x5b, 0xa7, 0x93, 0x4b,
100     0xb9, 0xab, 0x00, 0xfa, 0x5a, 0xea, 0x34, 0xe4,
101     0x80, 0xf1, 0x44, 0x6a, 0x65, 0xe4, 0x33, 0x99,
102     0xfb, 0x54, 0xd7, 0x89, 0x5a, 0x1b, 0xd6, 0x2b,
103     0xcc, 0x6e, 0x4b, 0x19, 0xa0, 0x6d, 0x93, 0x9f,
104     0xc3, 0x91, 0x7a, 0xa5, 0xd8, 0x59, 0x0e, 0x9e,
105 };
106 
107 static const uint8_t rsa1024_public_key[] = {
108     0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xe6,
109     0x4d, 0x76, 0x4f, 0xb2, 0x97, 0x09, 0xad, 0x9d,
110     0x17, 0x33, 0xf2, 0x30, 0x42, 0x83, 0xa9, 0xcb,
111     0x49, 0xa4, 0x2e, 0x59, 0x5e, 0x75, 0x51, 0xd1,
112     0xac, 0xc8, 0x86, 0x3e, 0xdb, 0x72, 0x2e, 0xb2,
113     0xf7, 0xc3, 0x5b, 0xc7, 0xea, 0xed, 0x30, 0xd1,
114     0xf7, 0x37, 0xee, 0x9d, 0x36, 0x59, 0x6f, 0xf8,
115     0xce, 0xc0, 0x5c, 0x82, 0x80, 0x37, 0x83, 0xd7,
116     0x45, 0x6a, 0xe9, 0xea, 0xc5, 0x3a, 0x59, 0x6b,
117     0x34, 0x31, 0x44, 0x00, 0x74, 0xa7, 0x29, 0xab,
118     0x79, 0x4a, 0xbd, 0xe8, 0x25, 0x35, 0x01, 0x11,
119     0x40, 0xbf, 0x31, 0xbd, 0xd3, 0xe0, 0x68, 0x1e,
120     0xd5, 0x5b, 0x2f, 0xe9, 0x20, 0xf2, 0x9f, 0x46,
121     0x35, 0x30, 0xa8, 0xf1, 0xfe, 0xef, 0xd8, 0x76,
122     0x23, 0x46, 0x34, 0x70, 0xa1, 0xce, 0xc6, 0x65,
123     0x6d, 0xb0, 0x94, 0x7e, 0xe5, 0x92, 0x45, 0x7b,
124     0xaa, 0xbb, 0x95, 0x97, 0x77, 0xcd, 0xd3, 0x02,
125     0x03, 0x01, 0x00, 0x01,
126 };
127 
128 static const uint8_t rsa2048_private_key[] = {
129     0x30, 0x82, 0x04, 0xa4, 0x02, 0x01, 0x00, 0x02,
130     0x82, 0x01, 0x01, 0x00, 0xbd, 0x9c, 0x83, 0x6b,
131     0x0e, 0x8e, 0xcf, 0xfa, 0xaa, 0x4f, 0x6a, 0xf4,
132     0xe3, 0x52, 0x0f, 0xa5, 0xd0, 0xbe, 0x5e, 0x7f,
133     0x08, 0x24, 0xba, 0x87, 0x46, 0xfb, 0x28, 0x93,
134     0xe5, 0xe5, 0x81, 0x42, 0xc0, 0xf9, 0x17, 0xc7,
135     0x81, 0x01, 0xf4, 0x18, 0x6a, 0x17, 0xf5, 0x57,
136     0x20, 0x37, 0xcf, 0xf9, 0x74, 0x5e, 0xe1, 0x48,
137     0x6a, 0x71, 0x0a, 0x0f, 0x79, 0x72, 0x2b, 0x46,
138     0x10, 0x53, 0xdc, 0x14, 0x43, 0xbd, 0xbc, 0x6d,
139     0x15, 0x6f, 0x15, 0x4e, 0xf0, 0x0d, 0x89, 0x39,
140     0x02, 0xc3, 0x68, 0x5c, 0xa8, 0xfc, 0xed, 0x64,
141     0x9d, 0x98, 0xb7, 0xcd, 0x83, 0x66, 0x93, 0xc3,
142     0xd9, 0x57, 0xa0, 0x21, 0x93, 0xad, 0x5c, 0x75,
143     0x69, 0x88, 0x9e, 0x81, 0xdc, 0x7f, 0x1d, 0xd5,
144     0xbd, 0x1c, 0xc1, 0x30, 0x56, 0xa5, 0xda, 0x99,
145     0x46, 0xa6, 0x6d, 0x0e, 0x6f, 0x5e, 0x51, 0x34,
146     0x49, 0x73, 0xc3, 0x67, 0x49, 0x7e, 0x21, 0x2a,
147     0x20, 0xa7, 0x2b, 0x92, 0x73, 0x1d, 0xa5, 0x25,
148     0x2a, 0xd0, 0x3a, 0x89, 0x75, 0xb2, 0xbb, 0x19,
149     0x37, 0x78, 0x48, 0xd2, 0xf2, 0x2a, 0x6d, 0x9e,
150     0xc6, 0x26, 0xca, 0x46, 0x8c, 0xf1, 0x42, 0x2a,
151     0x31, 0xb2, 0xfc, 0xe7, 0x55, 0x51, 0xff, 0x07,
152     0x13, 0x5b, 0x36, 0x59, 0x2b, 0x43, 0x30, 0x4b,
153     0x05, 0x5c, 0xd2, 0x45, 0xa0, 0xa0, 0x7c, 0x17,
154     0x5b, 0x07, 0xbb, 0x5d, 0x83, 0x80, 0x92, 0x6d,
155     0x87, 0x1a, 0x43, 0xac, 0xc7, 0x6b, 0x8d, 0x11,
156     0x60, 0x27, 0xd2, 0xdf, 0xdb, 0x71, 0x02, 0x55,
157     0x6e, 0xb5, 0xca, 0x4d, 0xda, 0x59, 0x0d, 0xb8,
158     0x8c, 0xcd, 0xd3, 0x0e, 0x55, 0xa0, 0xa4, 0x8d,
159     0xa0, 0x14, 0x10, 0x48, 0x42, 0x35, 0x56, 0x08,
160     0xf7, 0x29, 0x5f, 0xa2, 0xea, 0xa4, 0x5e, 0x8e,
161     0x99, 0x56, 0xaa, 0x5a, 0x8c, 0x23, 0x8f, 0x35,
162     0x22, 0x8a, 0xff, 0xed, 0x02, 0x03, 0x01, 0x00,
163     0x01, 0x02, 0x82, 0x01, 0x00, 0x4e, 0x4a, 0xf3,
164     0x44, 0xe0, 0x64, 0xfd, 0xe1, 0xde, 0x33, 0x1e,
165     0xd1, 0xf1, 0x8f, 0x6f, 0xe0, 0xa2, 0xfa, 0x08,
166     0x60, 0xe1, 0xc6, 0xf0, 0xb2, 0x6d, 0x0f, 0xc6,
167     0x28, 0x93, 0xb4, 0x19, 0x94, 0xab, 0xc3, 0xef,
168     0x1a, 0xb4, 0xdd, 0x4e, 0xa2, 0x4a, 0x24, 0x8c,
169     0x6c, 0xa6, 0x64, 0x05, 0x5f, 0x56, 0xba, 0xda,
170     0xc1, 0x21, 0x1a, 0x7d, 0xf1, 0xf7, 0xce, 0xb9,
171     0xa9, 0x9b, 0x92, 0x54, 0xfc, 0x95, 0x20, 0x22,
172     0x4e, 0xd4, 0x9b, 0xe2, 0xab, 0x8e, 0x99, 0xb8,
173     0x40, 0xaf, 0x30, 0x6a, 0xc6, 0x60, 0x0c, 0xd8,
174     0x25, 0x44, 0xa1, 0xcb, 0xbb, 0x73, 0x77, 0x86,
175     0xaa, 0x46, 0xf3, 0x54, 0xae, 0xa8, 0xa0, 0xdb,
176     0xdd, 0xab, 0x6e, 0xfb, 0x2c, 0x5a, 0x14, 0xaf,
177     0x08, 0x13, 0xa7, 0x6c, 0xe9, 0xfd, 0xcd, 0x4c,
178     0x1f, 0x20, 0x3a, 0x16, 0x2b, 0xf0, 0xb6, 0x7c,
179     0x47, 0x5f, 0xd1, 0x0a, 0x2c, 0xc4, 0xa5, 0x68,
180     0xd0, 0x43, 0x75, 0x6b, 0x65, 0xaa, 0x32, 0xc6,
181     0x99, 0x06, 0xcb, 0x8f, 0xe6, 0x8d, 0xce, 0xbf,
182     0x4d, 0x0d, 0x7b, 0x22, 0x2a, 0x8a, 0xcb, 0x7d,
183     0x7f, 0x16, 0x48, 0x85, 0xf1, 0x86, 0xcb, 0x54,
184     0xb9, 0x39, 0xd4, 0xbc, 0xe3, 0x2d, 0x27, 0x59,
185     0xf6, 0x81, 0x5e, 0x94, 0x45, 0xdf, 0xb9, 0x22,
186     0xaf, 0x64, 0x0d, 0x14, 0xec, 0x8c, 0xeb, 0x71,
187     0xac, 0xee, 0x09, 0x4c, 0xbf, 0x34, 0xf9, 0xf4,
188     0x66, 0x77, 0x36, 0x3b, 0x41, 0x74, 0x01, 0x4f,
189     0xfc, 0x56, 0x83, 0xba, 0x14, 0xb0, 0x2f, 0xdd,
190     0x4d, 0xb9, 0x3f, 0xdf, 0x71, 0xbe, 0x7b, 0xba,
191     0x66, 0xc8, 0xc5, 0x42, 0xc9, 0xba, 0x18, 0x63,
192     0x45, 0x07, 0x2f, 0x84, 0x3e, 0xc3, 0xfb, 0x47,
193     0xda, 0xd4, 0x1d, 0x0e, 0x9d, 0x96, 0xc0, 0xea,
194     0xee, 0x45, 0x2f, 0xe1, 0x62, 0x23, 0xee, 0xef,
195     0x3d, 0x5e, 0x55, 0xa1, 0x0d, 0x02, 0x81, 0x81,
196     0x00, 0xeb, 0x76, 0x88, 0xd3, 0xae, 0x3f, 0x1d,
197     0xf2, 0x49, 0xe0, 0x37, 0x49, 0x83, 0x82, 0x6c,
198     0xf7, 0xf1, 0x17, 0x30, 0x75, 0x2e, 0x89, 0x06,
199     0x88, 0x56, 0x32, 0xf6, 0xfa, 0x58, 0xcb, 0x3c,
200     0x98, 0x67, 0xc3, 0xde, 0x10, 0x82, 0xe5, 0xfa,
201     0xfa, 0x52, 0x47, 0x8d, 0xd7, 0x00, 0xc6, 0xcb,
202     0xf7, 0xf6, 0x57, 0x9b, 0x6e, 0x0c, 0xac, 0xe8,
203     0x3b, 0xd1, 0xde, 0xb5, 0x34, 0xaf, 0x8b, 0x2a,
204     0xb0, 0x2d, 0x01, 0xeb, 0x7c, 0xa0, 0x42, 0x26,
205     0xbb, 0x2b, 0x43, 0x0e, 0x1d, 0xe2, 0x4e, 0xc9,
206     0xc1, 0x0a, 0x67, 0x1d, 0xfc, 0x83, 0x25, 0xce,
207     0xb2, 0x18, 0xd9, 0x0d, 0x70, 0xf5, 0xa3, 0x5a,
208     0x9c, 0x99, 0xdd, 0x47, 0xa1, 0x57, 0xe7, 0x20,
209     0xde, 0xa1, 0x29, 0x8d, 0x96, 0x62, 0xf9, 0x26,
210     0x95, 0x51, 0xa6, 0xe7, 0x09, 0x8b, 0xba, 0x16,
211     0x8b, 0x19, 0x5b, 0xf9, 0x27, 0x0d, 0xc5, 0xd6,
212     0x5f, 0x02, 0x81, 0x81, 0x00, 0xce, 0x26, 0x31,
213     0xb5, 0x43, 0x53, 0x95, 0x39, 0xdd, 0x01, 0x98,
214     0x8b, 0x3d, 0x27, 0xeb, 0x0b, 0x87, 0x1c, 0x95,
215     0xfc, 0x3e, 0x36, 0x51, 0x31, 0xb5, 0xea, 0x59,
216     0x56, 0xc0, 0x97, 0x62, 0xf0, 0x63, 0x2b, 0xb6,
217     0x30, 0x9b, 0xdf, 0x19, 0x10, 0xe9, 0xa0, 0x3d,
218     0xea, 0x54, 0x5a, 0xe6, 0xc6, 0x9e, 0x7e, 0xb5,
219     0xf0, 0xb0, 0x54, 0xef, 0xc3, 0xe1, 0x47, 0xa6,
220     0x95, 0xc7, 0xe4, 0xa3, 0x4a, 0x30, 0x68, 0x24,
221     0x98, 0x7d, 0xc1, 0x34, 0xa9, 0xcb, 0xbc, 0x3c,
222     0x08, 0x9c, 0x7d, 0x0c, 0xa2, 0xb7, 0x60, 0xaa,
223     0x38, 0x08, 0x16, 0xa6, 0x7f, 0xdb, 0xd2, 0xb1,
224     0x67, 0xe7, 0x93, 0x8e, 0xbb, 0x7e, 0xb9, 0xb5,
225     0xd0, 0xd0, 0x9f, 0x7b, 0xcc, 0x46, 0xe6, 0x74,
226     0x78, 0x1a, 0x96, 0xd6, 0xd7, 0x74, 0x34, 0x54,
227     0x3b, 0x54, 0x55, 0x7f, 0x89, 0x81, 0xbc, 0x40,
228     0x55, 0x87, 0x24, 0x95, 0x33, 0x02, 0x81, 0x81,
229     0x00, 0xb0, 0x18, 0x5d, 0x2a, 0x1a, 0x95, 0x9f,
230     0x9a, 0xd5, 0x3f, 0x37, 0x79, 0xe6, 0x3d, 0x83,
231     0xab, 0x46, 0x86, 0x36, 0x3a, 0x5d, 0x0c, 0x23,
232     0x73, 0x91, 0x2b, 0xda, 0x63, 0xce, 0x46, 0x68,
233     0xd1, 0xfe, 0x40, 0x90, 0xf2, 0x3e, 0x43, 0x2b,
234     0x19, 0x4c, 0xb1, 0xb0, 0xd5, 0x8c, 0x02, 0x21,
235     0x07, 0x18, 0x17, 0xda, 0xe9, 0x49, 0xd7, 0x82,
236     0x73, 0x42, 0x78, 0xd1, 0x82, 0x4e, 0x8a, 0xc0,
237     0xe9, 0x33, 0x2f, 0xcd, 0x62, 0xce, 0x23, 0xca,
238     0xfd, 0x8d, 0xd4, 0x3f, 0x59, 0x80, 0x27, 0xb6,
239     0x61, 0x85, 0x9b, 0x2a, 0xe4, 0xef, 0x5c, 0x36,
240     0x22, 0x21, 0xcd, 0x2a, 0x6d, 0x41, 0x77, 0xe2,
241     0xcb, 0x5d, 0x93, 0x0d, 0x00, 0x10, 0x52, 0x8d,
242     0xd5, 0x92, 0x28, 0x16, 0x78, 0xd3, 0x1a, 0x4c,
243     0x8d, 0xbd, 0x9c, 0x1a, 0x0b, 0x9c, 0x91, 0x16,
244     0x4c, 0xff, 0x31, 0x36, 0xbb, 0xcb, 0x64, 0x1a,
245     0xf7, 0x02, 0x81, 0x80, 0x32, 0x65, 0x09, 0xdf,
246     0xca, 0xee, 0xa2, 0xdb, 0x3b, 0x58, 0xc9, 0x86,
247     0xb8, 0x53, 0x8a, 0xd5, 0x0d, 0x99, 0x82, 0x5c,
248     0xe0, 0x84, 0x7c, 0xc2, 0xcf, 0x3a, 0xd3, 0xce,
249     0x2e, 0x54, 0x93, 0xbe, 0x3a, 0x30, 0x14, 0x60,
250     0xbb, 0xaa, 0x05, 0x41, 0xaa, 0x2b, 0x1f, 0x17,
251     0xaa, 0xb9, 0x72, 0x12, 0xf9, 0xe9, 0xf5, 0xe6,
252     0x39, 0xe4, 0xf9, 0x9c, 0x03, 0xf5, 0x75, 0x16,
253     0xc6, 0x7f, 0xf1, 0x1f, 0x10, 0xc8, 0x54, 0xb1,
254     0xe6, 0x84, 0x15, 0xb0, 0xb0, 0x7a, 0x7a, 0x9e,
255     0x8c, 0x4a, 0xd1, 0x8c, 0xf1, 0x91, 0x32, 0xeb,
256     0x71, 0xa6, 0xbf, 0xdb, 0x1f, 0xcc, 0xd8, 0xcb,
257     0x92, 0xc3, 0xf2, 0xaf, 0x89, 0x22, 0x32, 0xfd,
258     0x32, 0x12, 0xda, 0xbb, 0xac, 0x55, 0x68, 0x01,
259     0x78, 0x56, 0x89, 0x7c, 0xb0, 0x0e, 0x9e, 0xcc,
260     0xc6, 0x28, 0x04, 0x7e, 0x83, 0xf5, 0x96, 0x30,
261     0x92, 0x51, 0xf2, 0x1b, 0x02, 0x81, 0x81, 0x00,
262     0x83, 0x6d, 0xd1, 0x98, 0x90, 0x41, 0x8c, 0xa7,
263     0x92, 0x83, 0xac, 0x89, 0x05, 0x0c, 0x79, 0x67,
264     0x90, 0xb6, 0xa1, 0xf3, 0x2f, 0xca, 0xf0, 0x15,
265     0xe0, 0x30, 0x58, 0xe9, 0x4f, 0xcb, 0x4c, 0x56,
266     0x56, 0x56, 0x14, 0x3f, 0x1b, 0x79, 0xb6, 0xef,
267     0x57, 0x4b, 0x28, 0xbd, 0xb0, 0xe6, 0x0c, 0x49,
268     0x4b, 0xbe, 0xe1, 0x57, 0x28, 0x2a, 0x23, 0x5e,
269     0xc4, 0xa2, 0x19, 0x4b, 0x00, 0x67, 0x78, 0xd9,
270     0x26, 0x6e, 0x17, 0x25, 0xce, 0xe4, 0xfd, 0xde,
271     0x86, 0xa8, 0x5a, 0x67, 0x47, 0x6b, 0x15, 0x09,
272     0xe1, 0xec, 0x8e, 0x62, 0x98, 0x91, 0x6f, 0xc0,
273     0x98, 0x0c, 0x70, 0x0e, 0x7d, 0xbe, 0x63, 0xbd,
274     0x12, 0x5a, 0x98, 0x1c, 0xe3, 0x0c, 0xfb, 0xc7,
275     0xfb, 0x1b, 0xbd, 0x02, 0x87, 0xcc, 0x0c, 0xbb,
276     0xc2, 0xd4, 0xb6, 0xc1, 0xa1, 0x23, 0xd3, 0x1e,
277     0x21, 0x6f, 0x48, 0xba, 0x0e, 0x2e, 0xc7, 0x42
278 };
279 
280 static const uint8_t rsa2048_public_key[] = {
281     0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01,
282     0x00, 0xbd, 0x9c, 0x83, 0x6b, 0x0e, 0x8e, 0xcf,
283     0xfa, 0xaa, 0x4f, 0x6a, 0xf4, 0xe3, 0x52, 0x0f,
284     0xa5, 0xd0, 0xbe, 0x5e, 0x7f, 0x08, 0x24, 0xba,
285     0x87, 0x46, 0xfb, 0x28, 0x93, 0xe5, 0xe5, 0x81,
286     0x42, 0xc0, 0xf9, 0x17, 0xc7, 0x81, 0x01, 0xf4,
287     0x18, 0x6a, 0x17, 0xf5, 0x57, 0x20, 0x37, 0xcf,
288     0xf9, 0x74, 0x5e, 0xe1, 0x48, 0x6a, 0x71, 0x0a,
289     0x0f, 0x79, 0x72, 0x2b, 0x46, 0x10, 0x53, 0xdc,
290     0x14, 0x43, 0xbd, 0xbc, 0x6d, 0x15, 0x6f, 0x15,
291     0x4e, 0xf0, 0x0d, 0x89, 0x39, 0x02, 0xc3, 0x68,
292     0x5c, 0xa8, 0xfc, 0xed, 0x64, 0x9d, 0x98, 0xb7,
293     0xcd, 0x83, 0x66, 0x93, 0xc3, 0xd9, 0x57, 0xa0,
294     0x21, 0x93, 0xad, 0x5c, 0x75, 0x69, 0x88, 0x9e,
295     0x81, 0xdc, 0x7f, 0x1d, 0xd5, 0xbd, 0x1c, 0xc1,
296     0x30, 0x56, 0xa5, 0xda, 0x99, 0x46, 0xa6, 0x6d,
297     0x0e, 0x6f, 0x5e, 0x51, 0x34, 0x49, 0x73, 0xc3,
298     0x67, 0x49, 0x7e, 0x21, 0x2a, 0x20, 0xa7, 0x2b,
299     0x92, 0x73, 0x1d, 0xa5, 0x25, 0x2a, 0xd0, 0x3a,
300     0x89, 0x75, 0xb2, 0xbb, 0x19, 0x37, 0x78, 0x48,
301     0xd2, 0xf2, 0x2a, 0x6d, 0x9e, 0xc6, 0x26, 0xca,
302     0x46, 0x8c, 0xf1, 0x42, 0x2a, 0x31, 0xb2, 0xfc,
303     0xe7, 0x55, 0x51, 0xff, 0x07, 0x13, 0x5b, 0x36,
304     0x59, 0x2b, 0x43, 0x30, 0x4b, 0x05, 0x5c, 0xd2,
305     0x45, 0xa0, 0xa0, 0x7c, 0x17, 0x5b, 0x07, 0xbb,
306     0x5d, 0x83, 0x80, 0x92, 0x6d, 0x87, 0x1a, 0x43,
307     0xac, 0xc7, 0x6b, 0x8d, 0x11, 0x60, 0x27, 0xd2,
308     0xdf, 0xdb, 0x71, 0x02, 0x55, 0x6e, 0xb5, 0xca,
309     0x4d, 0xda, 0x59, 0x0d, 0xb8, 0x8c, 0xcd, 0xd3,
310     0x0e, 0x55, 0xa0, 0xa4, 0x8d, 0xa0, 0x14, 0x10,
311     0x48, 0x42, 0x35, 0x56, 0x08, 0xf7, 0x29, 0x5f,
312     0xa2, 0xea, 0xa4, 0x5e, 0x8e, 0x99, 0x56, 0xaa,
313     0x5a, 0x8c, 0x23, 0x8f, 0x35, 0x22, 0x8a, 0xff,
314     0xed, 0x02, 0x03, 0x01, 0x00, 0x01
315 };
316 
317 static const uint8_t test_sha1_dgst[] = {
318     0x3c, 0x05, 0x19, 0x34, 0x29, 0x19, 0xc7, 0xe0,
319     0x87, 0xb6, 0x24, 0xf9, 0x58, 0xac, 0xa4, 0xd4,
320     0xb2, 0xd9, 0x03, 0x9e,
321 };
322 
323 static const uint8_t exp_signature_rsa2048_pkcs1[] = {
324     0x4e, 0x82, 0x56, 0x4c, 0x84, 0x66, 0xca, 0x1e,
325     0xc6, 0x92, 0x46, 0x20, 0x02, 0x6b, 0x64, 0x46,
326     0x15, 0x6b, 0x24, 0xf2, 0xbb, 0xfa, 0x44, 0x3c,
327     0xaf, 0x42, 0xc8, 0x41, 0xfd, 0xce, 0xed, 0x95,
328     0x34, 0xaf, 0x25, 0x09, 0xd1, 0x06, 0x94, 0xaa,
329     0x52, 0xd4, 0x29, 0xc8, 0x52, 0x34, 0x67, 0x59,
330     0x4f, 0x5a, 0xfd, 0x23, 0x30, 0x5e, 0xc7, 0x1e,
331     0xa6, 0xe0, 0x1b, 0x23, 0xca, 0x82, 0x47, 0x9a,
332     0x2e, 0x2c, 0x66, 0x45, 0x5a, 0x12, 0xa9, 0x15,
333     0xbf, 0xd6, 0xd6, 0xfa, 0x8d, 0x60, 0x99, 0x89,
334     0x91, 0x39, 0x06, 0xb7, 0xd3, 0x9a, 0xef, 0x15,
335     0x7b, 0x95, 0x87, 0x77, 0x2c, 0x41, 0xd4, 0x71,
336     0xd5, 0xdf, 0x22, 0x7b, 0x01, 0xe2, 0xc1, 0xfb,
337     0xb9, 0x4e, 0x0c, 0x9b, 0xd5, 0x04, 0xed, 0x2b,
338     0x7e, 0x73, 0x53, 0xaa, 0x33, 0x89, 0x9d, 0x95,
339     0x28, 0x8f, 0x8b, 0x80, 0x34, 0x7a, 0xea, 0xe3,
340     0x66, 0x8a, 0xa8, 0xad, 0xed, 0x91, 0x43, 0xdd,
341     0x77, 0xe5, 0xd7, 0x16, 0xda, 0xa8, 0x00, 0x29,
342     0x3f, 0x9f, 0xe0, 0x1d, 0x42, 0x9d, 0x35, 0x5d,
343     0x0f, 0xf3, 0x90, 0x27, 0x3a, 0x8c, 0x46, 0x13,
344     0x53, 0x3e, 0x3b, 0x38, 0x77, 0xf8, 0x57, 0x61,
345     0xbc, 0xc4, 0x54, 0x68, 0x48, 0xae, 0x58, 0x03,
346     0x33, 0x94, 0x3f, 0x18, 0x1e, 0xb3, 0x3f, 0x79,
347     0xa7, 0x26, 0x92, 0x5d, 0x32, 0x2a, 0xdb, 0xe6,
348     0x3a, 0xe8, 0xd7, 0xaa, 0x91, 0xfe, 0x9f, 0x06,
349     0x26, 0x68, 0x8c, 0x27, 0x31, 0xb0, 0x04, 0x9e,
350     0x94, 0x79, 0x63, 0xa1, 0xc7, 0xe8, 0x5b, 0x8c,
351     0xd3, 0xf1, 0x88, 0x58, 0x31, 0x2f, 0x4e, 0x11,
352     0x00, 0xfe, 0x29, 0xad, 0x2c, 0xa9, 0x8e, 0x63,
353     0xd8, 0x7d, 0xc5, 0xa1, 0x71, 0xfa, 0x08, 0x29,
354     0xea, 0xd6, 0x6c, 0x53, 0x00, 0x52, 0xa0, 0xed,
355     0x6b, 0x7c, 0x67, 0x50, 0x71, 0x2d, 0x96, 0x7a,
356 };
357 
358 static const uint8_t exp_signature_rsa1024_pkcs1[] = {
359     0x6b, 0x5b, 0xbb, 0x3b, 0x1f, 0x08, 0xd8, 0xc0,
360     0x4a, 0xf1, 0x5a, 0x12, 0xc2, 0x39, 0x14, 0x65,
361     0x4f, 0xda, 0x79, 0x67, 0xf2, 0x89, 0x25, 0xad,
362     0x9e, 0x7e, 0xba, 0xa8, 0x34, 0x15, 0x03, 0xdd,
363     0x80, 0x6b, 0x01, 0xd7, 0x4a, 0xf3, 0xd6, 0xef,
364     0x1e, 0x48, 0xf3, 0xbc, 0x75, 0x1a, 0xc4, 0x2c,
365     0x90, 0x15, 0x9f, 0x21, 0x24, 0x98, 0x21, 0xef,
366     0x6d, 0x3b, 0xf3, 0x82, 0x8f, 0x8d, 0xd8, 0x48,
367     0x37, 0x16, 0x19, 0x8e, 0x3c, 0x64, 0xa0, 0x9e,
368     0xf7, 0x0c, 0xd9, 0x5c, 0xc6, 0x13, 0xc4, 0x5f,
369     0xf8, 0xf3, 0x59, 0x5b, 0xd0, 0x33, 0x95, 0x98,
370     0xde, 0x67, 0x25, 0x58, 0x46, 0xba, 0xee, 0x0f,
371     0x47, 0x7a, 0x7f, 0xd0, 0xe4, 0x77, 0x09, 0x17,
372     0xe9, 0x81, 0x6e, 0x2d, 0x33, 0x9b, 0x13, 0x0b,
373     0xc9, 0xb2, 0x0c, 0x2c, 0xb5, 0xdf, 0x52, 0x8f,
374     0xab, 0x0d, 0xc6, 0x59, 0x1d, 0xc7, 0x33, 0x7b,
375 };
376 
377 static const uint8_t test_plaintext[] = {
378     0x00, 0x44, 0xbc, 0x6f, 0x77, 0xfb, 0xe2, 0xa4,
379     0x98, 0x9e, 0xf5, 0x33, 0xa0, 0xbd, 0x81, 0xb9,
380     0xf1, 0x44, 0x7f, 0x79, 0x89, 0x23, 0xe5, 0x46,
381     0x66, 0x9f, 0x98, 0x95, 0x6f, 0x56, 0x78, 0xf6,
382     0xf5, 0xac, 0x9c, 0xda, 0xc2, 0x79, 0x59, 0xf0,
383     0x1b, 0x03, 0xfa, 0x46, 0x1c, 0x1f, 0x18, 0x07,
384     0xce, 0xad, 0xed, 0x3d, 0x11, 0xf9, 0x1b, 0x26,
385     0x4a, 0x97, 0x28, 0x71, 0x5f, 0x2c, 0x5e, 0x58,
386     0xf0, 0xd6, 0xbf, 0xa4, 0x12, 0xd0, 0x1d, 0x07,
387     0xcb, 0x73, 0x66, 0xb6, 0xa4, 0x09, 0xaf, 0x5d,
388     0xe9, 0x14, 0x14, 0xaf, 0x69, 0xd6, 0xee, 0x0a,
389     0xfc, 0xca, 0xac, 0x94, 0x47, 0xd5, 0x9d, 0x5b,
390     0x2b, 0xfb, 0xce, 0x9d, 0x04, 0xc1, 0xaf, 0xa5,
391     0xa1, 0x8d, 0xa9, 0x48, 0xa8, 0x65, 0xe6, 0x9f,
392     0x74, 0x78, 0x16, 0x32, 0x93, 0xb5, 0x21, 0xb9,
393     0x9f, 0x3f, 0xc1, 0xe5, 0xa2, 0x50, 0x8b, 0x12,
394     0xfb, 0x3e, 0xb0, 0x8a, 0x00, 0xc7, 0x20, 0x56,
395     0xb3, 0xb1, 0x29, 0x95, 0x89, 0xd6, 0x50, 0xf5,
396     0x37, 0x38, 0x8e, 0x12, 0xf1, 0xba, 0x82, 0x37,
397     0x34, 0x68, 0x4b, 0xe8, 0xe3, 0x11, 0x1c, 0x46,
398     0xf9, 0x63, 0x3a, 0xd6, 0xf3, 0x3f, 0x55, 0xa6,
399     0xbd, 0x89, 0xf1, 0x2d, 0x38, 0x91, 0x7c, 0xc2,
400     0x4d, 0xf1, 0x69, 0x82, 0x6d, 0x71, 0x77, 0xf4,
401     0xfc, 0x43, 0x20, 0x6f, 0x43, 0xb9, 0x43, 0xd1,
402     0x65, 0xbd, 0xca, 0xb1, 0x43, 0x87, 0xf8, 0xc8,
403     0x76, 0x21, 0xa9, 0xeb, 0x3e, 0x9a, 0xef, 0xc9,
404     0x0e, 0x79, 0xbc, 0xf0, 0xf8, 0xc8, 0xe2, 0xbc,
405     0x33, 0x35, 0x3e, 0xfc, 0xf9, 0x44, 0x69, 0x06,
406     0x7c, 0x7f, 0x5d, 0xa2, 0x9e, 0xab, 0xc2, 0x82,
407     0xa0, 0xfb, 0xc5, 0x79, 0x57, 0x8c, 0xf1, 0x1c,
408     0x51, 0x64, 0x4c, 0x56, 0x08, 0x80, 0x32, 0xf4,
409     0x97, 0x8f, 0x6f, 0xb2, 0x16, 0xa6, 0x9d, 0x71,
410 };
411 
412 static const uint8_t exp_ciphertext_rsa1024_raw[] = {
413     0x01, 0xa0, 0xc2, 0x94, 0x9f, 0xd6, 0xbe, 0x8d,
414     0xe9, 0x24, 0xaa, 0x9c, 0x67, 0xd7, 0xe3, 0x04,
415     0x34, 0xbf, 0xd3, 0x27, 0xa1, 0x43, 0xeb, 0x60,
416     0x6b, 0x5b, 0x64, 0x15, 0x55, 0x16, 0x98, 0x35,
417     0xc2, 0x59, 0xa7, 0xf7, 0x24, 0xf7, 0x05, 0xb9,
418     0xe8, 0x56, 0x6f, 0xf2, 0x7d, 0x8b, 0x3c, 0xcb,
419     0xa6, 0xc2, 0xac, 0x0c, 0x37, 0x8c, 0x70, 0x70,
420     0x55, 0x05, 0x07, 0x0d, 0x63, 0x6b, 0x7d, 0x5f,
421     0xae, 0x03, 0x1e, 0x55, 0x05, 0xbb, 0xa8, 0xe7,
422     0xff, 0xa0, 0x8c, 0x5b, 0x6b, 0x01, 0x48, 0x2e,
423     0x4f, 0x7f, 0xe2, 0x74, 0xc6, 0x32, 0xa7, 0x2d,
424     0xdb, 0x91, 0x9b, 0x67, 0x4d, 0x71, 0xf9, 0x8c,
425     0x42, 0x43, 0x75, 0x4e, 0xd0, 0x0e, 0x7c, 0xa0,
426     0x97, 0x1a, 0x5f, 0x8e, 0x6f, 0xe4, 0xfa, 0x16,
427     0x1d, 0x59, 0x0e, 0x0b, 0x11, 0x12, 0xa3, 0x0c,
428     0xa6, 0x55, 0xe6, 0xdb, 0xa7, 0x71, 0xa6, 0xff,
429 };
430 
431 static const uint8_t exp_ciphertext_rsa1024_pkcs1[] = {
432     0x93, 0x78, 0x6a, 0x76, 0xb8, 0x94, 0xea, 0xe4,
433     0x32, 0x79, 0x01, 0x8b, 0xc1, 0xcb, 0x2e, 0x2d,
434     0xfe, 0xdc, 0x9b, 0xe3, 0xe9, 0x23, 0xe4, 0x0a,
435     0xb0, 0x6b, 0x9f, 0x6b, 0x62, 0xf5, 0x3d, 0xf0,
436     0x78, 0x84, 0x77, 0x21, 0xad, 0x0b, 0x30, 0x30,
437     0x94, 0xe2, 0x18, 0xc4, 0x9b, 0x12, 0x06, 0xc8,
438     0xaa, 0xf7, 0x30, 0xe4, 0xc8, 0x64, 0xe7, 0x51,
439     0xf1, 0x6a, 0xe1, 0xa2, 0x58, 0x7a, 0x02, 0x9c,
440     0x8e, 0xf0, 0x2d, 0x25, 0x6b, 0xb7, 0x25, 0x5e,
441     0x05, 0xaf, 0x38, 0xb2, 0x69, 0x5e, 0x6c, 0x75,
442     0x6e, 0x27, 0xba, 0x5d, 0x7d, 0x35, 0x72, 0xb7,
443     0x25, 0xd4, 0xaa, 0xb2, 0x4b, 0x9e, 0x6b, 0x82,
444     0xb2, 0x32, 0xe2, 0x13, 0x1d, 0x00, 0x21, 0x08,
445     0xae, 0x14, 0xbb, 0xc0, 0x40, 0xb7, 0x0d, 0xd5,
446     0x0e, 0x4d, 0x6d, 0x9a, 0x70, 0x86, 0xe9, 0xfc,
447     0x67, 0x2b, 0xa4, 0x11, 0x45, 0xb6, 0xc4, 0x2f,
448 };
449 
450 static const uint8_t exp_ciphertext_rsa2048_raw[] = {
451     0x09, 0x7b, 0x9e, 0x7c, 0x10, 0x1f, 0x73, 0xb4,
452     0x5f, 0xdb, 0x4f, 0x05, 0xe7, 0xfc, 0x9e, 0x35,
453     0x48, 0xd8, 0xc8, 0xf5, 0xac, 0x6d, 0xb4, 0xb0,
454     0xd4, 0xf7, 0x69, 0x0f, 0x30, 0x78, 0xbb, 0x55,
455     0x67, 0x66, 0x66, 0x05, 0xf4, 0x77, 0xe2, 0x30,
456     0xa5, 0x94, 0x10, 0xa3, 0xcb, 0xee, 0x13, 0x9f,
457     0x47, 0x1b, 0x2e, 0xf9, 0xfd, 0x94, 0x09, 0xbd,
458     0x26, 0x6e, 0x84, 0xc7, 0x5c, 0x42, 0x20, 0x76,
459     0x72, 0x83, 0x75, 0x68, 0xa4, 0x18, 0x2d, 0x76,
460     0x62, 0xc3, 0xab, 0xc0, 0xc9, 0x36, 0x59, 0xe0,
461     0xa9, 0x70, 0x1f, 0xff, 0x97, 0x07, 0x0d, 0x88,
462     0xc2, 0xd8, 0x51, 0x35, 0xf7, 0xb0, 0x50, 0xe4,
463     0x9f, 0x3d, 0xd4, 0x71, 0x8b, 0x40, 0x89, 0x71,
464     0x6c, 0xd8, 0xc2, 0x63, 0xb6, 0x3a, 0xce, 0xb1,
465     0x32, 0xf1, 0xc6, 0x11, 0x31, 0x25, 0x48, 0xcf,
466     0xeb, 0xbc, 0xd3, 0x9b, 0xc5, 0xbd, 0xd2, 0x57,
467     0x73, 0x9b, 0x20, 0xb8, 0xdf, 0xbe, 0xb8, 0x40,
468     0xb6, 0xac, 0x24, 0xdb, 0x94, 0x6a, 0x93, 0x43,
469     0x4a, 0xa8, 0xa3, 0xcf, 0xd5, 0x61, 0x1b, 0x46,
470     0x1d, 0x6f, 0x57, 0xec, 0xa6, 0xd0, 0x44, 0x05,
471     0x48, 0xb8, 0x90, 0x80, 0x23, 0x8e, 0x5f, 0xb0,
472     0x4b, 0x6f, 0xe3, 0xf9, 0xb0, 0x04, 0x60, 0xae,
473     0x80, 0xcf, 0xa5, 0x5c, 0x11, 0xe4, 0xce, 0x57,
474     0x5b, 0xbb, 0xde, 0x92, 0xfc, 0xe7, 0x3f, 0xe0,
475     0xfc, 0x06, 0xc8, 0xf3, 0x8c, 0xac, 0x86, 0x09,
476     0x31, 0xe5, 0x7e, 0xfb, 0x5d, 0xa7, 0x57, 0xf8,
477     0x1d, 0x23, 0x9d, 0xa3, 0xeb, 0x53, 0x28, 0xde,
478     0xbf, 0x53, 0xef, 0x35, 0x3c, 0x7e, 0x3c, 0x1b,
479     0x76, 0x9d, 0x09, 0x25, 0x43, 0xd4, 0x8b, 0xca,
480     0xda, 0x45, 0x5b, 0xdc, 0x9f, 0x57, 0x5a, 0x30,
481     0x2e, 0xe9, 0x73, 0x68, 0x28, 0xfa, 0x40, 0xb0,
482     0x7c, 0x31, 0xd7, 0x8b, 0x4e, 0x99, 0x94, 0xf1,
483 };
484 
485 static const uint8_t exp_ciphertext_rsa2048_pkcs1[] = {
486     0xa5, 0x19, 0x19, 0x34, 0xad, 0xf6, 0xd2, 0xbe,
487     0xed, 0x8f, 0xe5, 0xfe, 0xa2, 0xa5, 0x20, 0x08,
488     0x15, 0x53, 0x7c, 0x68, 0x28, 0xae, 0x07, 0xb2,
489     0x4c, 0x5d, 0xee, 0xc1, 0xc6, 0xdc, 0xd6, 0x8b,
490     0xc6, 0xba, 0x46, 0xe1, 0x16, 0xa9, 0x04, 0x72,
491     0xdf, 0x8f, 0x1e, 0x97, 0x2a, 0x55, 0xe7, 0xac,
492     0x08, 0x0d, 0x61, 0xe8, 0x64, 0x8b, 0x6f, 0x96,
493     0x0e, 0xbb, 0x8a, 0x30, 0xb3, 0x73, 0x28, 0x61,
494     0x16, 0x89, 0x90, 0x88, 0x8e, 0xda, 0x22, 0xe6,
495     0x42, 0x16, 0xc7, 0xe8, 0x30, 0x0d, 0x7f, 0x44,
496     0x1e, 0xef, 0xe6, 0xdb, 0x78, 0x54, 0x89, 0xa5,
497     0x60, 0x67, 0xb3, 0x35, 0x2d, 0x79, 0x49, 0xcf,
498     0xe6, 0x8f, 0xf3, 0x64, 0x52, 0x1c, 0x6c, 0x43,
499     0x7e, 0xb0, 0xde, 0x55, 0xdf, 0xbe, 0xb7, 0xb1,
500     0xdb, 0x02, 0xee, 0x76, 0x96, 0xcc, 0x0b, 0x97,
501     0x8c, 0x23, 0xaa, 0x7d, 0x4c, 0x47, 0x28, 0x41,
502     0x7a, 0x20, 0x39, 0x1f, 0x64, 0x0b, 0xf1, 0x74,
503     0xf1, 0x29, 0xda, 0xe9, 0x3a, 0x36, 0xa6, 0x88,
504     0xb8, 0xc0, 0x21, 0xb8, 0x9b, 0x5d, 0x90, 0x85,
505     0xa3, 0x30, 0x61, 0x17, 0x8c, 0x74, 0x63, 0xd5,
506     0x0f, 0x95, 0xdc, 0xc8, 0x4f, 0xa7, 0x24, 0x55,
507     0x40, 0xe2, 0x84, 0x57, 0x65, 0x06, 0x11, 0x30,
508     0x2b, 0x9e, 0x32, 0x95, 0x39, 0xf2, 0x1a, 0x3f,
509     0xab, 0xcd, 0x7b, 0x7f, 0x9c, 0xf0, 0x00, 0x50,
510     0x7c, 0xf4, 0xbe, 0xcb, 0x80, 0xea, 0x66, 0xba,
511     0x0e, 0x7b, 0x46, 0x0b, 0x25, 0xe0, 0xc1, 0x03,
512     0x29, 0x11, 0x2d, 0x69, 0x4f, 0x21, 0xa2, 0x58,
513     0x37, 0x4b, 0x84, 0x15, 0xb3, 0x65, 0x3a, 0xac,
514     0xd4, 0xd0, 0xf6, 0xdf, 0x4b, 0x82, 0xca, 0x9e,
515     0xbb, 0xbe, 0x3c, 0x4d, 0xd5, 0xbf, 0x00, 0xd6,
516     0x12, 0x48, 0x72, 0x0b, 0xc7, 0xf8, 0xe1, 0xcd,
517     0xd0, 0x28, 0x03, 0x19, 0xa6, 0x06, 0x13, 0x45,
518 };
519 
520 static const uint8_t rsa_private_key_lack_element[] = {
521     /* RSAPrivateKey, offset: 0, length: 176 */
522     0x30, 0x81, 0xb0,
523     /* version, offset: 4, length: 1 */
524     0x02, 0x01, 0x00,
525     /* n, offset: 7, length: 65 */
526     0x02, 0x41,
527     0x00, 0xb9, 0xe1, 0x22, 0xdb, 0x56, 0x2f, 0xb6,
528     0xf7, 0xf0, 0x0a, 0x87, 0x43, 0x07, 0x12, 0xdb,
529     0x6d, 0xb6, 0x2b, 0x41, 0x8d, 0x2c, 0x3c, 0xa5,
530     0xdd, 0x78, 0x9a, 0x8f, 0xab, 0x8e, 0xf2, 0x4a,
531     0xc8, 0x34, 0x0c, 0x12, 0x4f, 0x11, 0x90, 0xc6,
532     0xc2, 0xa5, 0xd0, 0xcd, 0xfb, 0xfc, 0x2c, 0x95,
533     0x56, 0x82, 0xdf, 0x39, 0xf3, 0x3b, 0x1d, 0x62,
534     0x26, 0x97, 0xb7, 0x93, 0x25, 0xc7, 0xec, 0x7e,
535     0xf7,
536     /* e, offset: 74, length: 3 */
537     0x02, 0x03, 0x01, 0x00, 0x01,
538     /* d, offset: 79, length: 64 */
539     0x02, 0x40,
540     0x1e, 0x80, 0xfe, 0xda, 0x65, 0xdb, 0x70, 0xb8,
541     0x61, 0x91, 0x28, 0xbf, 0x6c, 0x32, 0xc1, 0x05,
542     0xd1, 0x26, 0x6a, 0x1c, 0x83, 0xcc, 0xf4, 0x1f,
543     0x53, 0x42, 0x72, 0x1f, 0x62, 0x57, 0x0a, 0xc4,
544     0x66, 0x76, 0x30, 0x87, 0xb9, 0xb1, 0xb9, 0x6a,
545     0x63, 0xfd, 0x8f, 0x3e, 0xfc, 0x35, 0x3f, 0xd6,
546     0x2e, 0x6c, 0xc8, 0x70, 0x8a, 0x17, 0xc1, 0x28,
547     0x6a, 0xfe, 0x51, 0x56, 0xb3, 0x92, 0x6f, 0x09,
548     /* p, offset: 145, length: 33 */
549     0x02, 0x21,
550     0x00, 0xe3, 0x2e, 0x2d, 0x8d, 0xba, 0x1c, 0x34,
551     0x4c, 0x49, 0x9f, 0xc1, 0xa6, 0xdd, 0xd7, 0x13,
552     0x8d, 0x05, 0x48, 0xdd, 0xff, 0x5c, 0x30, 0xbc,
553     0x6b, 0xc4, 0x18, 0x9d, 0xfc, 0xa2, 0xd0, 0x9b,
554     0x4d,
555     /* q, offset: 180, length: 33 */
556     0x02, 0x21,
557     0x00, 0xd1, 0x75, 0xaf, 0x4b, 0xc6, 0x1a, 0xb0,
558     0x98, 0x14, 0x42, 0xae, 0x33, 0xf3, 0x44, 0xde,
559     0x21, 0xcb, 0x04, 0xda, 0xfb, 0x1e, 0x35, 0x92,
560     0xcd, 0x69, 0xc0, 0x83, 0x06, 0x83, 0x8e, 0x39,
561     0x53,
562     /* lack element: dp, dq, u */
563 };
564 
565 static const uint8_t rsa_public_key_lack_element[] = {
566     /* RSAPublicKey, offset: 0, length: 67 */
567     0x30, 0x81, 0x43,
568     /* n, offset: 7, length: 65 */
569     0x02, 0x41,
570     0x00, 0xb9, 0xe1, 0x22, 0xdb, 0x56, 0x2f, 0xb6,
571     0xf7, 0xf0, 0x0a, 0x87, 0x43, 0x07, 0x12, 0xdb,
572     0x6d, 0xb6, 0x2b, 0x41, 0x8d, 0x2c, 0x3c, 0xa5,
573     0xdd, 0x78, 0x9a, 0x8f, 0xab, 0x8e, 0xf2, 0x4a,
574     0xc8, 0x34, 0x0c, 0x12, 0x4f, 0x11, 0x90, 0xc6,
575     0xc2, 0xa5, 0xd0, 0xcd, 0xfb, 0xfc, 0x2c, 0x95,
576     0x56, 0x82, 0xdf, 0x39, 0xf3, 0x3b, 0x1d, 0x62,
577     0x26, 0x97, 0xb7, 0x93, 0x25, 0xc7, 0xec, 0x7e,
578     0xf7,
579     /* lack element: e */
580 };
581 
582 static const uint8_t rsa_public_key_empty_element[] = {
583     /* RSAPublicKey, offset: 0, length: 69 */
584     0x30, 0x81, 0x45,
585     /* n, offset: 7, length: 65 */
586     0x02, 0x41,
587     0x00, 0xb9, 0xe1, 0x22, 0xdb, 0x56, 0x2f, 0xb6,
588     0xf7, 0xf0, 0x0a, 0x87, 0x43, 0x07, 0x12, 0xdb,
589     0x6d, 0xb6, 0x2b, 0x41, 0x8d, 0x2c, 0x3c, 0xa5,
590     0xdd, 0x78, 0x9a, 0x8f, 0xab, 0x8e, 0xf2, 0x4a,
591     0xc8, 0x34, 0x0c, 0x12, 0x4f, 0x11, 0x90, 0xc6,
592     0xc2, 0xa5, 0xd0, 0xcd, 0xfb, 0xfc, 0x2c, 0x95,
593     0x56, 0x82, 0xdf, 0x39, 0xf3, 0x3b, 0x1d, 0x62,
594     0x26, 0x97, 0xb7, 0x93, 0x25, 0xc7, 0xec, 0x7e,
595     0xf7,
596     /* e: empty element */
597     0x02, 0x00,
598 };
599 
600 static const uint8_t rsa_private_key_empty_element[] = {
601     /* RSAPrivateKey, offset: 0, length: 19 */
602     0x30, 0x81, 0x13,
603     /* version, offset: 4, length: 1 */
604     0x02, 0x01, 0x00,
605     /* n: empty element */
606     0x02, 0x00,
607     /* e: empty element */
608     0x02, 0x00,
609     /* d: empty element */
610     0x02, 0x00,
611     /* p: empty element */
612     0x02, 0x00,
613     /* q: empty element */
614     0x02, 0x00,
615     /* dp: empty element */
616     0x02, 0x00,
617     /* dq: empty element */
618     0x02, 0x00,
619     /* u: empty element */
620     0x02, 0x00,
621 };
622 
623 static const uint8_t rsa_public_key_invalid_length_val[] = {
624     /* RSAPublicKey, INVALID length: 313 */
625     0x30, 0x82, 0x01, 0x39,
626     /* n, offset: 7, length: 65 */
627     0x02, 0x41,
628     0x00, 0xb9, 0xe1, 0x22, 0xdb, 0x56, 0x2f, 0xb6,
629     0xf7, 0xf0, 0x0a, 0x87, 0x43, 0x07, 0x12, 0xdb,
630     0x6d, 0xb6, 0x2b, 0x41, 0x8d, 0x2c, 0x3c, 0xa5,
631     0xdd, 0x78, 0x9a, 0x8f, 0xab, 0x8e, 0xf2, 0x4a,
632     0xc8, 0x34, 0x0c, 0x12, 0x4f, 0x11, 0x90, 0xc6,
633     0xc2, 0xa5, 0xd0, 0xcd, 0xfb, 0xfc, 0x2c, 0x95,
634     0x56, 0x82, 0xdf, 0x39, 0xf3, 0x3b, 0x1d, 0x62,
635     0x26, 0x97, 0xb7, 0x93, 0x25, 0xc7, 0xec, 0x7e,
636     0xf7,
637     /* e, */
638     0x02, 0x03, 0x01, 0x00, 0x01,  /* INTEGER, offset: 74, length: 3 */
639 };
640 
641 static const uint8_t rsa_public_key_extra_elem[] = {
642     /* RSAPublicKey, length: 80 */
643     0x30, 0x81, 0x50,
644     /* n, offset: 7, length: 65 */
645     0x02, 0x41,
646     0x00, 0xb9, 0xe1, 0x22, 0xdb, 0x56, 0x2f, 0xb6,
647     0xf7, 0xf0, 0x0a, 0x87, 0x43, 0x07, 0x12, 0xdb,
648     0x6d, 0xb6, 0x2b, 0x41, 0x8d, 0x2c, 0x3c, 0xa5,
649     0xdd, 0x78, 0x9a, 0x8f, 0xab, 0x8e, 0xf2, 0x4a,
650     0xc8, 0x34, 0x0c, 0x12, 0x4f, 0x11, 0x90, 0xc6,
651     0xc2, 0xa5, 0xd0, 0xcd, 0xfb, 0xfc, 0x2c, 0x95,
652     0x56, 0x82, 0xdf, 0x39, 0xf3, 0x3b, 0x1d, 0x62,
653     0x26, 0x97, 0xb7, 0x93, 0x25, 0xc7, 0xec, 0x7e,
654     0xf7,
655     /* e, offset: 74, length: 3 */
656     0x02, 0x03, 0x01, 0x00, 0x01,
657     /* Additional integer field, length 3 */
658     0x02, 0x06, 0xe1, 0x22, 0xdb, 0xe1, 0x22, 0xdb,
659 };
660 
661 typedef struct QCryptoRSAKeyTestData QCryptoRSAKeyTestData;
662 struct QCryptoRSAKeyTestData {
663     const char *path;
664     QCryptoAkCipherKeyType key_type;
665     QCryptoAkCipherOptions opt;
666     const uint8_t *key;
667     size_t keylen;
668     bool is_valid_key;
669     size_t exp_key_len;
670 };
671 
672 typedef struct QCryptoAkCipherTestData QCryptoAkCipherTestData;
673 struct QCryptoAkCipherTestData {
674     const char *path;
675     QCryptoAkCipherOptions opt;
676 
677     const uint8_t *priv_key;
678     size_t priv_key_len;
679     const uint8_t *pub_key;
680     size_t pub_key_len;
681 
682     const uint8_t *plaintext;
683     size_t plen;
684     const uint8_t *ciphertext;
685     size_t clen;
686     const uint8_t *dgst;
687     size_t dlen;
688     const uint8_t *signature;
689     size_t slen;
690 };
691 
692 static QCryptoRSAKeyTestData rsakey_test_data[] = {
693     {
694         .path = "/crypto/akcipher/rsakey-1024-public",
695         .key_type = QCRYPTO_AK_CIPHER_KEY_TYPE_PUBLIC,
696         .key = rsa1024_public_key,
697         .keylen = sizeof(rsa1024_public_key),
698         .is_valid_key = true,
699         .exp_key_len = 128,
700     },
701     {
702         .path = "/crypto/akcipher/rsakey-1024-private",
703         .key_type = QCRYPTO_AK_CIPHER_KEY_TYPE_PRIVATE,
704         .key = rsa1024_private_key,
705         .keylen = sizeof(rsa1024_private_key),
706         .is_valid_key = true,
707         .exp_key_len = 128,
708     },
709     {
710         .path = "/crypto/akcipher/rsakey-2048-public",
711         .key_type = QCRYPTO_AK_CIPHER_KEY_TYPE_PUBLIC,
712         .key = rsa2048_public_key,
713         .keylen = sizeof(rsa2048_public_key),
714         .is_valid_key = true,
715         .exp_key_len = 256,
716     },
717     {
718         .path = "/crypto/akcipher/rsakey-2048-private",
719         .key_type = QCRYPTO_AK_CIPHER_KEY_TYPE_PRIVATE,
720         .key = rsa2048_private_key,
721         .keylen = sizeof(rsa2048_private_key),
722         .is_valid_key = true,
723         .exp_key_len = 256,
724     },
725     {
726         .path = "/crypto/akcipher/rsakey-public-lack-elem",
727         .key_type = QCRYPTO_AK_CIPHER_KEY_TYPE_PUBLIC,
728         .key = rsa_public_key_lack_element,
729         .keylen = sizeof(rsa_public_key_lack_element),
730         .is_valid_key = false,
731     },
732     {
733         .path = "/crypto/akcipher/rsakey-private-lack-elem",
734         .key_type = QCRYPTO_AK_CIPHER_KEY_TYPE_PRIVATE,
735         .key = rsa_private_key_lack_element,
736         .keylen = sizeof(rsa_private_key_lack_element),
737         .is_valid_key = false,
738     },
739     {
740         .path = "/crypto/akcipher/rsakey-public-empty-elem",
741         .key_type = QCRYPTO_AK_CIPHER_KEY_TYPE_PUBLIC,
742         .key = rsa_public_key_empty_element,
743         .keylen = sizeof(rsa_public_key_empty_element),
744         .is_valid_key = false,
745     },
746     {
747         .path = "/crypto/akcipher/rsakey-private-empty-elem",
748         .key_type = QCRYPTO_AK_CIPHER_KEY_TYPE_PRIVATE,
749         .key = rsa_private_key_empty_element,
750         .keylen = sizeof(rsa_private_key_empty_element),
751         .is_valid_key = false,
752     },
753     {
754         .path = "/crypto/akcipher/rsakey-public-empty-key",
755         .key_type = QCRYPTO_AK_CIPHER_KEY_TYPE_PUBLIC,
756         .key = NULL,
757         .keylen = 0,
758         .is_valid_key = false,
759     },
760     {
761         .path = "/crypto/akcipher/rsakey-private-empty-key",
762         .key_type = QCRYPTO_AK_CIPHER_KEY_TYPE_PRIVATE,
763         .key = NULL,
764         .keylen = 0,
765         .is_valid_key = false,
766     },
767     {
768         .path = "/crypto/akcipher/rsakey-public-invalid-length-val",
769         .key_type = QCRYPTO_AK_CIPHER_KEY_TYPE_PUBLIC,
770         .key = rsa_public_key_invalid_length_val,
771         .keylen = sizeof(rsa_public_key_invalid_length_val),
772         .is_valid_key = false,
773     },
774     {
775         .path = "/crypto/akcipher/rsakey-public-extra-elem",
776         .key_type = QCRYPTO_AK_CIPHER_KEY_TYPE_PUBLIC,
777         .key = rsa_public_key_extra_elem,
778         .keylen = sizeof(rsa_public_key_extra_elem),
779         .is_valid_key = false,
780     },
781 };
782 
783 static QCryptoAkCipherTestData akcipher_test_data[] = {
784     /* rsa1024 with raw padding */
785     {
786         .path = "/crypto/akcipher/rsa1024-raw",
787         .opt = {
788             .alg = QCRYPTO_AK_CIPHER_ALGO_RSA,
789             .u.rsa = {
790                 .padding_alg = QCRYPTO_RSA_PADDING_ALGO_RAW,
791             },
792         },
793         .pub_key = rsa1024_public_key,
794         .pub_key_len = sizeof(rsa1024_public_key),
795         .priv_key = rsa1024_private_key,
796         .priv_key_len = sizeof(rsa1024_private_key),
797 
798         .plaintext = test_plaintext,
799         .plen = 128,
800         .ciphertext = exp_ciphertext_rsa1024_raw,
801         .clen = sizeof(exp_ciphertext_rsa1024_raw),
802     },
803 
804     /* rsa1024 with pkcs1 padding */
805     {
806         .path = "/crypto/akcipher/rsa1024-pkcs1",
807         .opt = {
808             .alg = QCRYPTO_AK_CIPHER_ALGO_RSA,
809             .u.rsa = {
810                 .padding_alg = QCRYPTO_RSA_PADDING_ALGO_PKCS1,
811                 .hash_alg = QCRYPTO_HASH_ALGO_SHA1,
812             },
813         },
814         .pub_key = rsa1024_public_key,
815         .pub_key_len = sizeof(rsa1024_public_key),
816         .priv_key = rsa1024_private_key,
817         .priv_key_len = sizeof(rsa1024_private_key),
818 
819         .plaintext = test_plaintext,
820         .plen = 64,
821         .ciphertext = exp_ciphertext_rsa1024_pkcs1,
822         .clen = sizeof(exp_ciphertext_rsa1024_pkcs1),
823         .dgst = test_sha1_dgst,
824         .dlen = sizeof(test_sha1_dgst),
825         .signature = exp_signature_rsa1024_pkcs1,
826         .slen = sizeof(exp_signature_rsa1024_pkcs1),
827     },
828 
829     /* rsa2048 with raw padding */
830     {
831         .path = "/crypto/akcipher/rsa2048-raw",
832         .opt = {
833             .alg = QCRYPTO_AK_CIPHER_ALGO_RSA,
834             .u.rsa = {
835                 .padding_alg = QCRYPTO_RSA_PADDING_ALGO_RAW,
836             },
837         },
838         .pub_key = rsa2048_public_key,
839         .pub_key_len = sizeof(rsa2048_public_key),
840         .priv_key = rsa2048_private_key,
841         .priv_key_len = sizeof(rsa2048_private_key),
842 
843         .plaintext = test_plaintext,
844         .plen = 256,
845         .ciphertext = exp_ciphertext_rsa2048_raw,
846         .clen = sizeof(exp_ciphertext_rsa2048_raw),
847     },
848 
849     /* rsa2048 with pkcs1 padding */
850     {
851         .path = "/crypto/akcipher/rsa2048-pkcs1",
852         .opt = {
853             .alg = QCRYPTO_AK_CIPHER_ALGO_RSA,
854             .u.rsa = {
855                 .padding_alg = QCRYPTO_RSA_PADDING_ALGO_PKCS1,
856                 .hash_alg = QCRYPTO_HASH_ALGO_SHA1,
857             },
858         },
859         .pub_key = rsa2048_public_key,
860         .pub_key_len = sizeof(rsa2048_public_key),
861         .priv_key = rsa2048_private_key,
862         .priv_key_len = sizeof(rsa2048_private_key),
863 
864         .plaintext = test_plaintext,
865         .plen = 128,
866         .ciphertext = exp_ciphertext_rsa2048_pkcs1,
867         .clen = sizeof(exp_ciphertext_rsa2048_pkcs1),
868         .dgst = test_sha1_dgst,
869         .dlen = sizeof(test_sha1_dgst),
870         .signature = exp_signature_rsa2048_pkcs1,
871         .slen = sizeof(exp_signature_rsa2048_pkcs1),
872     },
873 
874 };
875 
876 static void test_akcipher(const void *opaque)
877 {
878     const QCryptoAkCipherTestData *data = opaque;
879     g_autofree uint8_t *plaintext = NULL;
880     g_autofree uint8_t *ciphertext = NULL;
881     g_autofree uint8_t *signature = NULL;
882     QCryptoAkCipher *pub_key, *priv_key;
883 
884     if (!qcrypto_akcipher_supports((QCryptoAkCipherOptions *)&data->opt)) {
885         return;
886     }
887     pub_key = qcrypto_akcipher_new(&data->opt,
888                                    QCRYPTO_AK_CIPHER_KEY_TYPE_PUBLIC,
889                                    data->pub_key, data->pub_key_len,
890                                    &error_abort);
891     g_assert(pub_key != NULL);
892     priv_key = qcrypto_akcipher_new(&data->opt,
893                                     QCRYPTO_AK_CIPHER_KEY_TYPE_PRIVATE,
894                                     data->priv_key, data->priv_key_len,
895                                     &error_abort);
896     g_assert(priv_key != NULL);
897 
898     if (data->plaintext != NULL) {
899 
900         ciphertext = g_new0(uint8_t, data->clen);
901         g_assert(qcrypto_akcipher_encrypt(pub_key, data->plaintext, data->plen,
902                                           ciphertext, data->clen,
903                                           &error_abort) > 0);
904 
905         /**
906          * In the asymmetric encryption algorithms, the ciphertext generated
907          * each time may be different, here only compare the decrypted
908          * plaintext
909          */
910         plaintext = g_new0(uint8_t, data->clen);
911         g_assert(qcrypto_akcipher_decrypt(priv_key, ciphertext,
912                                           data->clen, plaintext,
913                                           data->plen,
914                                           &error_abort) == data->plen);
915         g_assert(!memcmp(plaintext, data->plaintext, data->plen));
916     }
917 
918     if (data->signature != NULL) {
919         signature = g_new(uint8_t, data->slen);
920         g_assert(qcrypto_akcipher_sign(priv_key, data->dgst, data->dlen,
921                                        signature, data->slen,
922                                        &error_abort) > 0);
923         /**
924          * The signature generated each time may be different, here only check
925          * the verification.
926          */
927         g_assert(qcrypto_akcipher_verify(pub_key, data->signature, data->slen,
928                                          data->dgst, data->dlen,
929                                          &error_abort) == 0);
930         g_assert(qcrypto_akcipher_verify(pub_key, signature, data->slen,
931                                          data->dgst, data->dlen,
932                                          &error_abort) == 0);
933         ++signature[0];
934         /* Here error should be ignored */
935         g_assert(qcrypto_akcipher_verify(pub_key, signature, data->slen,
936                                          data->dgst, data->dlen, NULL) != 0);
937     }
938 
939     qcrypto_akcipher_free(pub_key);
940     qcrypto_akcipher_free(priv_key);
941 }
942 
943 static void test_rsakey(const void *opaque)
944 {
945     const QCryptoRSAKeyTestData *data = (const QCryptoRSAKeyTestData *)opaque;
946     QCryptoAkCipherOptions opt = {
947         .alg = QCRYPTO_AK_CIPHER_ALGO_RSA,
948         .u.rsa = {
949             .padding_alg = QCRYPTO_RSA_PADDING_ALGO_PKCS1,
950             .hash_alg = QCRYPTO_HASH_ALGO_SHA1,
951         }
952     };
953     g_autoptr(QCryptoAkCipher) key = qcrypto_akcipher_new(
954         &opt, data->key_type, data->key, data->keylen, NULL);
955 
956     if (!qcrypto_akcipher_supports(&opt)) {
957         return;
958     }
959 
960     if (!data->is_valid_key) {
961         g_assert(key == NULL);
962         return;
963     }
964 
965     g_assert(key != NULL);
966     g_assert(qcrypto_akcipher_max_ciphertext_len(key) == data->exp_key_len);
967     g_assert(qcrypto_akcipher_max_plaintext_len(key) == data->exp_key_len);
968     g_assert(qcrypto_akcipher_max_signature_len(key) == data->exp_key_len);
969     g_assert(qcrypto_akcipher_max_dgst_len(key) == data->exp_key_len);
970 }
971 
972 int main(int argc, char **argv)
973 {
974     size_t i;
975     g_test_init(&argc, &argv, NULL);
976     g_assert(qcrypto_init(NULL) == 0);
977 
978     for (i = 0; i < G_N_ELEMENTS(akcipher_test_data); i++) {
979         g_test_add_data_func(akcipher_test_data[i].path,
980                              &akcipher_test_data[i],
981                              test_akcipher);
982     }
983     for (i = 0; i < G_N_ELEMENTS(rsakey_test_data); i++) {
984         g_test_add_data_func(rsakey_test_data[i].path,
985                              &rsakey_test_data[i],
986                              test_rsakey);
987     }
988 
989     return g_test_run();
990 }
991