jwt-simple 0.15.0

JWT authentication with JSON Web Token signing and verification (JWS), encryption (JWE), and custom claims. Supports RSA, ECDSA, Ed25519, and ML-DSA.
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
//! RSA fixtures for key size and exponent limits.
//!
//! They were generated with `openssl genpkey` (OpenSSL 3.6.4), except the 4097-bit key.
//! OpenSSL rounds 4097 bits down to 4096, so that key was made with Python's
//! `cryptography` 46.0.3.

pub(crate) struct TestKey {
    pub bits: usize,
    pub e: u64,
    pub private_pem: &'static str,
    pub public_pem: &'static str,
}

impl TestKey {
    pub fn is_allowed(&self) -> bool {
        (2048..=4096).contains(&self.bits) && self.e == 65537
    }

    pub fn is_policy_error(&self, error: &crate::JWTError, private: bool) -> bool {
        use crate::JWTError;
        match error {
            JWTError::WeakKey => self.bits < 2048,
            JWTError::UnsupportedRSAModulus => self.bits > 4096,
            JWTError::InvalidKeyPair => private && self.e != 65537,
            JWTError::InvalidPublicKey => !private && self.e != 65537,
            _ => false,
        }
    }

    /// Larger public keys fail in the pure-Rust backend before our size check.
    pub fn backend_rejects_public_key(&self) -> bool {
        cfg!(any(
            feature = "pure-rust",
            target_arch = "wasm32",
            target_arch = "wasm64"
        )) && self.bits > 4096
    }
}

pub(crate) fn key_2048() -> &'static TestKey {
    KEYS.iter()
        .find(|key| key.bits == 2048 && key.e == 65537)
        .unwrap()
}

pub(crate) fn der_from_pem(pem: &str) -> Vec<u8> {
    use ct_codecs::{Base64, Decoder};
    let b64: String = pem.lines().filter(|l| !l.starts_with("-----")).collect();
    Base64::decode_to_vec(b64, None).unwrap()
}

/// An RS256 token signed by `openssl dgst -sha256 -sign` with the 1024-bit key.
pub(crate) const OPENSSL_RS256_JWT_1024: &str = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJvcGVuc3NsIiwic3ViIjoiMTAyNC1iaXQga2V5In0.szQ6LdQJexuCWf3awq-dKKUyJrRkyhup6nBmDOxN3n3CJjoILAx50L2L2Y6fCl1USmFo9zgVXrhGdyXXh60s7gGZshK0wSdFMvF1yUOx9fRdDgLhxKgoC1XojRnc7yfds8LiZlxN8mK9Oi_FbBhyc11IKCYZSuy0srflWmQKtw8";

pub(crate) const KEYS: &[TestKey] = &[
    TestKey {
        bits: 1024,
        e: 65537,
        private_pem: "-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDmj+sfBOoYd/YLGdnsz6tKtL3Awv/+mvkXQD05vAnZEmEFhu1Z
QKw2W5bq32e64pAH95spLsgvfEEsu4+IU+MACbff92H2ZD2eUBzzqFhhnYv9Z/13
eWQXYUVDmtA/VSftZdPLnCGQn3A1BBDC63KvNqh6bIIPT5uWAj3tIX9C2QIDAQAB
AoGAPux8QMT4lqD2t2Tgwu6SUxssxlTxxKzK2nufuggFsAaCEB4Y3Mj3twYcFBHQ
n4KByIrc/8pSvBLvPqQZsh0i0DU3ovGtHsyfYHOKneCjZNQ5aXvK8Bh8qNg+sBWh
ZZ0iQOD6x9VzOkb0jTqbGCq221fSAK169WUah6PiqhvmlRkCQQD2JWGPsOq8u5Wk
0KZ34ZXXoX7t7i4EsYzuRuCa/pspiCYwMFQzbsHq5A29n1KZx+LZwXYZEWBYuhcs
pdV5JVTXAkEA78rTsOL9mk8X4ofLS96LFZtKclMhrJ8OZqJSVaV0NvY6S8VnqVlM
dJ1E24zLPLLQC8H/Ju6ucr7Y/962Um9/zwJALSYcKBQmamnp/+o5rqGVL5EyzAe1
Ly02EXq0thlfcpXDk3E58JkvPpuIHbD8oLJ2XMTMmbqDNqMjnw/oASmkzwJBANyE
bSsVhF0c8X0snkOWU9e56Lu8QZKK72ZpTkhfEMHerHuz/YGakpoHayRwlRKr6nF1
pVy7UQhLBCpCOO8UhLcCQQDjKuS6WJ+5ieK6Bx4hkbOSUYxID6IP2G+CApeXDmQ7
PxiqFf+BaLJyRFAaECeux6cROTLHy01EWoTRmOQt8FYm
-----END RSA PRIVATE KEY-----",
        public_pem: "-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDmj+sfBOoYd/YLGdnsz6tKtL3A
wv/+mvkXQD05vAnZEmEFhu1ZQKw2W5bq32e64pAH95spLsgvfEEsu4+IU+MACbff
92H2ZD2eUBzzqFhhnYv9Z/13eWQXYUVDmtA/VSftZdPLnCGQn3A1BBDC63KvNqh6
bIIPT5uWAj3tIX9C2QIDAQAB
-----END PUBLIC KEY-----",
    },
    TestKey {
        bits: 2047,
        e: 65537,
        private_pem: "-----BEGIN RSA PRIVATE KEY-----
MIIEoAIBAAKCAQBU/6Chp+AZecaQsqh4b28d8TNbjY3d8LYmIGKHXJtP76eJCMqf
iWWC+8gW38IUZR4ciQ6MlLuMCtD7EHULOS/2q0fhumiOri0u6erS31EBLR7w4FxO
wrOKzmNiZ/nd2Ai8jUWf4H6kdRrOi7Vd+J1n0AYnKYG0js/QT1f1JnAigMbb3CBa
AmsVexUqQN8K0Pmsf4KKs1lX9od16wbz/YcOnYWx/M1B8I0ETh1G5ddOArKp8Gs7
g8VXVjv22Pw00q7YMZdSEuoAh3UmkSUUa2jIxiBAqw67Fn1RRBloVaYSm+at8qMM
KrBfuJupOpzdm8Bg2/uRvO6ltXcSJiodBmlhAgMBAAECggEAUp1fsKAt1jUhhbTQ
wLZ2xyCQbXUppcV4FZi2i6C8KLbkHPJZlzUBYI1+zpTP2+jomo2wgX1yyMwekVhO
mwkLkHKsXD9FryCmNAoSPsHlxwHnJ/K6ZaciwVCXEqfDGhgHbdTWDm4ySYC0/HqY
XuzteWCdCmVyd1+zp2HnORUSOsXD7eI51FzXkB64Zjg88cJmzFxHqCe+P+vhp3Mg
j8D2ouIAM38aEB+oYPPd6s+lp5F55VSUjF0oJQgTsEpHpj/bbDzMYAOiVcN8NEQD
vAjKL6FwBUEa8MPHmDX7beKdMVh6xgeO82H4adY+Er5uM3sjKBq2PGi3wPpcWriR
jNcHjQKBgQDUhdLcCdXZOhfZKVhbeivmFAZnhwIElhan1qloaDOxJfksGUmzCS5R
GMeqcK4od600sZbc+zB3ZVhXRj04R/75WxR9EWTBhWj7SWvaHvdIOKypRLoJ62Ex
PIVEgqdkbygoFfFxSBmeLpwVYyeD+dwiR3bfdhn6XCmKE5Gu/dtRHwKBgGZjJS3k
tLr9l2O9GUppiA/VuY571xVAgnKk7IHJim6MGJ/ffckSNu3LTPd9bf8dKqQDiVpa
/OyXNToHny+HcKwnBh648R6iDg0Ics4r9bpUEQ8DK8U0aTKmQ3X5rK9IRcmzMPJy
xc1Hz8KEYbHyIoMbdxjXEPR3IOWlx1bMGnV/AoGAXn0JXQ96ZtRvWfwJ7tIIxojM
uCbMfOGGPSUxuNvrb62kdTjhDZrdXu0XiO4EYLWk6rKykpmT2OHUPylZerZ35MHc
ACdFls0L+f2Q2C/AXfnkunV2CYb/dXalAerdJchOIFRxPp6B1VR/zPqCzSi/+PWx
InVN44Qqa9t7gEQZyJ0CgYALKs0nUEaWDoqwijNz9kas03bFn6Q54StZLbvN/Blp
LUaSSWICyEXNcdsXM0sIBDpeYTRd8oabl3JqveIS4Qbc//Se7TT/TlWR/lXnPswy
YnDp3kKr46eFqrS47V50T8Gs2iqAhxwj4605Xg75xZsWCazXvL1QrJ2d7pLrWJ+a
KQKBgFnREQBm6JZ9ACWl14adp68i9ekZ0fgr1uAT/CeazMVe8+GuMGQcwCjGp77R
QZhh0wLg5WrBpI+YxQ00i5hwHd6MWeYl0n/kAuk85hJ4Il66li8yXQXi+0xFv3nR
MENBIa5x7eO+O49Ka45pB/uPDiHOBnQDy0yP7oc30zrQLWso
-----END RSA PRIVATE KEY-----",
        public_pem: "-----BEGIN PUBLIC KEY-----
MIIBITANBgkqhkiG9w0BAQEFAAOCAQ4AMIIBCQKCAQBU/6Chp+AZecaQsqh4b28d
8TNbjY3d8LYmIGKHXJtP76eJCMqfiWWC+8gW38IUZR4ciQ6MlLuMCtD7EHULOS/2
q0fhumiOri0u6erS31EBLR7w4FxOwrOKzmNiZ/nd2Ai8jUWf4H6kdRrOi7Vd+J1n
0AYnKYG0js/QT1f1JnAigMbb3CBaAmsVexUqQN8K0Pmsf4KKs1lX9od16wbz/YcO
nYWx/M1B8I0ETh1G5ddOArKp8Gs7g8VXVjv22Pw00q7YMZdSEuoAh3UmkSUUa2jI
xiBAqw67Fn1RRBloVaYSm+at8qMMKrBfuJupOpzdm8Bg2/uRvO6ltXcSJiodBmlh
AgMBAAE=
-----END PUBLIC KEY-----",
    },
    TestKey {
        bits: 2048,
        e: 65537,
        private_pem: "-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAr+2Ie7pHyxTqjnpJ/E9VBD0hJ8Q/FWDBl8CULlPcXCxgkOs/
ofggLD1a3k3C72z33mpXYpYz5iNxmZrL6JZ5lj8Vu1O2CwsJPfaSRoylJr6CPS26
1xT6aEFb3RCgM9yIHJlP+S9sJdcxbm+KcSNn/R4TFUu42uQlTuy2o4SzFbxB/fu2
pqgyPeSc7HkPBNb/XiuzT6PHk0ibHXIK/D6reA8TIp7VBor+7addkbAFvVCgMasZ
kvnqUi+mzf3KejOct44MLmevOuUKxY6lHw+rWLeS7VhpYfU42Sv+TKVqm2BuGEqd
SjDe85TzMPaxWUAPjcHdOmMhA7jcLP2uUGiTDwIDAQABAoIBAEh5O/5scOLyTOZA
7nWoYMeMPzpYl/xAjb/sL58eIOs/xNAueVpKE0bmR6bItgNYCoxvlmwgoGSwOT4k
DNhWFOSWPGedRqMp+rax+vRhQC/Dz3dQfWXZWIbWVfetv7FdqhzN86odpRm5mr15
6bhN86rMVuQw+4gA8HWhAmQ+aGANLI1MJqQepCq8ysqbQD7k3N7Vnx65YwnYv9HN
/6r1uSk/df857/ix1xY7KINc1XKaBgukuq1hHQsmlyegf0QDNCcI6y4Vm3xOEY4t
STk/VPv37v487CQuwdvx/0LjTKuDUh2goP+YcwQD7cp4DlfJz0vzx/RMMBsZAHRc
mnkUPOECgYEA4tNei+SqfVQT16lFwTQZl5R1HQICLxVpJjcsAbmgxPXUhpyTrWv7
hqZw1LaZAB1lEHDsNUJligXe96JbRFBoE9e0ZgF8k/LkrY5EEbty7amqtKP3WeVS
Nnb+OS7a8gF+CS3RzPdYkP9hXwoms2cAghzAvyKtV11i65bnVtUmsgcCgYEAxo5D
2G5O3xiSkmfgiQ8G/Ulz2hj7OTjTXEwm4fnWWy/vuQHrYMZ70yedtnDz2razjboU
8vkjCoUPXjp8vRRI9qNORyeLQ8VhC7lIuRD11VbICZmBICo/PMSkpWskKGSh6ztF
pFfWembocZhCPp3CsyUUbJXcF4YzFmhCY1ZTtLkCgYAEv6APFa5sCUKRFT4cmVaf
0b/R56TcD3qwDh+huZ0gAnV8i/KbgtM1Mm7SRTBWzEa9XV/UjZtKlGziikeW2ogT
QkTIjedpwYAAEiZiqKXzS8YDGhuniiF6emtADzcOMfHNh2QJAnScNHx5XOEKiHF+
R9PRLIysc4wKmpIlQzkYKQKBgQCODiqsJf93zfTPmlIivQWbIXoph8X1YpqVZkZL
VpvuEZXJH35vdpIQuD810AonaJ99vqxOScCwPhKIr/+ep2ysSJowfjI9AnI0GRPW
lDPNtpDXjWO8x30G1QmW79imrZjK21UwB0gDuqyC2RRMCELMOLMsHOuiSPk0BtO4
joLEwQKBgQClvhuLsdsD1mtwZZTsOzZzahlAhczUePZ3kkbwHKAQOocw+g2LE7vt
MUBkM2WJrx5P6qouAKD0+g6l9m6wofAL1BnBxmtPJrOIZpeo08M0oIaAOHzs5/mG
mCEkoS9XxaQr4xCj2eb8mwAdPbdMwU19B4ksffVt5f9nSbVGRoGQGA==
-----END RSA PRIVATE KEY-----",
        public_pem: "-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr+2Ie7pHyxTqjnpJ/E9V
BD0hJ8Q/FWDBl8CULlPcXCxgkOs/ofggLD1a3k3C72z33mpXYpYz5iNxmZrL6JZ5
lj8Vu1O2CwsJPfaSRoylJr6CPS261xT6aEFb3RCgM9yIHJlP+S9sJdcxbm+KcSNn
/R4TFUu42uQlTuy2o4SzFbxB/fu2pqgyPeSc7HkPBNb/XiuzT6PHk0ibHXIK/D6r
eA8TIp7VBor+7addkbAFvVCgMasZkvnqUi+mzf3KejOct44MLmevOuUKxY6lHw+r
WLeS7VhpYfU42Sv+TKVqm2BuGEqdSjDe85TzMPaxWUAPjcHdOmMhA7jcLP2uUGiT
DwIDAQAB
-----END PUBLIC KEY-----",
    },
    TestKey {
        bits: 2560,
        e: 65537,
        private_pem: "-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----",
        public_pem: "-----BEGIN PUBLIC KEY-----
MIIBYjANBgkqhkiG9w0BAQEFAAOCAU8AMIIBSgKCAUEA5W/mEgfu46dkNaGVVrt1
Aa7Nx8SRbjdzD/frFLSbKue2SpIINN4tkCRLwEdmFCHa3Gq8H8qBbzKrjyIXnmsD
klKZSB1ey7SDv9Tw1D4B1BaKU9JGiVoe6wu+1PIj/QswN3zA+bpv43OUdKdjL6vG
rw7O+t9WwT2Qfv1XnL2FRs78pkCyu/MSqmYIyRCrEGrNczYn8Ha9bIqvU3beQW3f
oRphAcckovUWR9PevtVKJfvmR6PUY1fi2FfirRo6K2Tx9D/HPh7G+oqWEK2X2nsj
zEVQMb6gOYofCyGwEmXaJoWDcnkPwyCgkyBi9AlLWF6Aazx3uDonIVEAz5huoi6U
cBojprxguEgPe7M08npaONBK7yx/3XArKI3Fixixv8IqxE2tYndDhvjfiBvpph3f
5kvWq/62d8aceN9Pzys5/ZcCAwEAAQ==
-----END PUBLIC KEY-----",
    },
    TestKey {
        bits: 3072,
        e: 65537,
        private_pem: "-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----",
        public_pem: "-----BEGIN PUBLIC KEY-----
MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAkz66HjRPMBOPeRWe4GIB
uyjMOg8/7PZJryT1UDWQLScOSSBemIqyUTn5ExD4GthYWRYhB3Oz5GI4HVm/qrNW
L8iag341zh9LR7/jeFezoVjHHymxDmcB0GoN2LJ9JhjNnozCc1gZcXbkOshWET+S
lNYIR9O6duomRlJ2UoBZactOgSbPZctwrH87g9/v1Ny+jl4zaktsoKWWVdCjQfOL
husNInyCB/HSIvxx3g1ymcomRIEyzkVt4SAk/2k20ICSqQP+7JNhX089s3LIXPqa
AMtBjAzHp4r9YERComRgUjvUc4E0xwLCE4oVQrGPuOkuNzP29SNWat/N6yO7xwc9
ITrjg/fsZFCD1YNbfjutp2gSBRj4yqUcZge5OjRgTRC1s+NZIuTEkx2gFtBMJthx
4b4loQMmzKRTWkK4QToen7b9w9lcAutMbv4fHFeITm5oifp++FBjqvc0TBIJSYHg
6wh95HjIWAlZiBFLjOD9xxtJnC79Uo8dMxnIK+53e2crAgMBAAE=
-----END PUBLIC KEY-----",
    },
    TestKey {
        bits: 4096,
        e: 65537,
        private_pem: "-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----",
        public_pem: "-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvIjWJtMmbAVq4Z17Mlpe
sOVVr4CrdPn7PmsY4BPr8JktHOdKx6DROQ25XBYOkYTVlm63CDJCW8uYFNym3Xvu
Om5y2nOgrjBbcru4zEN+4zA5uycJju1mPKJ+84pH+KUEz20h+dSSyYRrUtSC57qB
yTSFEjPaCM1fpH7Pm0L1U7fKNY14uvihl4OdN79tiwzoWpzhBMCm/5oEgCr4Yukh
87kUeJyOX5IGM0Su1kKDiZcEA2iwgm95yuIbAj0N14/iC/7Knfd/NHnSdujPWnN6
oNMFlXXmQmK/STUsgIJCC6df58dvx56vi0ldpYt4Gvx7xN3nbm0IDwlHIqNadtnJ
z9ADCl5yIpANShCG4AJB5Aylg84JjeSKLuCQyuEgR5OIAw28iUPcui8QcB2L3ZK7
ziTkf1YOG/MqDlPmPSfQk5MgN9b5rpvNeCtyIO/vmnadfZrq2xO1qyiPO/cxQbut
yj/2r8+j6kUrDMj2I6i/EI0Bai+KOrmMkzasHd+h4NOdMQo8ZXJ40Qg1zzaqrP+u
bqcWv3e8L8srjwx7Skn8h3UaM2kmXtJGHIIef1lNzsT5Dak3nIw29fdHEW3KBVgA
/Mv//eLpOP06ZN2vG+i+PGZdhBNOZUHu77AqfYr1LTJTui4R8UV//83R0wxDfgR6
axlgeduzsVXsL+SihWaR/j8CAwEAAQ==
-----END PUBLIC KEY-----",
    },
    TestKey {
        bits: 4097,
        e: 65537,
        private_pem: "-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----",
        public_pem: "-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEBbzIrh34ev9h2SEXV2H2u
CxenAT4ppKpq5+kmxZRWJk1xAFOgsrVL1L9Ir5LmzzAWBWJPBzb3gy1g8JUuJU6F
xdlupwsRnMLH3TtB2ik5yK+QK31QTxsarqQ9RgMTYk7HkpghRwkJULjfkxTJpwT2
hwGgqqG1hxzokAqSAer2TJ4i3XaN2hCox4n5cQXhlxPTagy4ANgZCj24lJu2shav
nW93MuLn7vXFq75Agta/xWEZG3Ru/1aPaenmEC42px8TTJlUc3tVCdodN80Ef7Nr
IDv7wnG/4vij7BpH3Y1Mnu9ij3whgEuIyXRdK9mT5aIlOL7+5FAjX+JANoVmM7na
F4Q84l/UFodUXCLbINB8bupGF1/eW4IHwZwsoj+Pw2PU2LLEDqyHJXVmojf6XCNF
boaSGcHJMNia/e5Kvi5U15fKNNVyRwX3i5cnSDKEIE7BMGRbjO9GmebscRn6c2FL
muWTE5UQvKUU/xXcMlwtYIYfPqHbNySPyyZWYz2PwASiJMA/4RWZ6WrWHU9z5ucR
Jlap06SOxHCnwhC2A8RUjCL09LM1oEtbeXAfah3TvSJg7XwtdzouXqu0K2OhCAEO
L7pscrqtHhW3f0wodwe66sUG4icCY3cIyHyBBEzbHGRBhRUhSqTdrQVxLxojDREc
oa8ooWS+oZ8yyz6/ZMu4XoMCAwEAAQ==
-----END PUBLIC KEY-----",
    },
    TestKey {
        bits: 8192,
        e: 65537,
        private_pem: "-----BEGIN RSA PRIVATE KEY-----
MIISKAIBAAKCBAEArCCh03POPyDTU2PisWvNtvgWT4rLYK9oZfU0p/Sk7pcRmM3T
X1+nbU7ERQLoRpxtzxiTqPBrupLtBbuw0MwEQ88CO/+EOUFoZ69jl3ib7ezpLPM4
Cy6v9zR1Aj1zppSTE9cKiyVqGXQOFs6T7WbCJx3wT4rCF7bsrd2ve5/Z28wQOqlQ
ZrQQwjUwIRS0acyMcL7dhY2UjmvbKGDdzS2vUEao6z+QXP3gBYlFUGPbkaMmkByQ
KmDoIwPHGklbO4Is1vGKomzPr3GYq7Fvqy7uyfahC/wg9pWbnGmPXr0HBYtyGqCB
+8GBJI5+tx4Fo0DizrvdREAHCo5vcDSYHYcZkIUqB3DZNF9x9l5DMALMBdyvCJzL
823LdiFRBQ5ve8vuIzEEv04PM6BZonx9cFXh4R2XMkeCSQI/+PWdcXWy9NRVX5RY
XWSx1YIKmVeyDwfI5vFVJ8r2QoNLScf0FbMDc4Jie6OVpQKJ9D5Hl/1IO0n5Sna1
tqc2gQrVv/0PN5xGzP3SwXKmhQH6lHh6lkLO8lu7Q7h6Ao7w74uF9NgN9Jv2rkzC
/Fjdammn7mAFFCN1qlDk8gZIdDLcDhjLO7NHGFO3wAQH7CBM+zK2uoO4ID4+PicI
gR0Vh0Tr+NbBb2I6diXNAnzQvlMbun/EiG8wqNAIJ8JXYhXtJRb62frdXDzE268f
J8W11ijCjjEvxhmbaVi3N8KXTMiQIsiIMnJl2Og2G8v/R6M7JTvRkQ3GZszJUCQ5
wZnxzduMpmy1ggSbuRj7Sqin74OTQ6MJAKwpP2JWARlofKgL+FLGmMIVqAAAPlps
MsIzAaQROiVFMd75kydaZndgfrK5HAJxv8TiBI8XTrwe1TNuyaBBkRnuHKXGr7pR
rJgUweOKeb5/8K8oVTX34Q3E/M4X25VcYn99jTZBav5Ls+zuSbxmIXdit59mWHCn
ldv9oxRoqmpjHTmHglAw7CTC6MxSYM0S0AFxODHmjoRHTp9SO4+wHoh+ZTLju7jU
/7uqUqojB3YW2DWVRQBkU5B0663KrMapW1KNGmA30n0RQ+Mx8ovd98owFm1gfxPa
3HuHRP8V61qY8OWL+jkw4sFKlRafRKdwX/gbkACIjtxEaBvU9/RvQYTCgA59iOGd
lnrmZkdZxxcHQuMwDCBuDZCZdCKdsMDdoJr+9GtTTa+PCA9Z96i7MdA5uBAhIKAP
0VVYBKwkXeromkaWMihWdnQ7VXIktsOrO/LqeBAgrnYyFmQ63fFs5se1WLVBMSEY
0PTzOjvV8LG0ZXOXQliVyb7S9NrZA2SP0fKG2DRLDOYGEnn6zYfEJMSulOtx1BuB
Kt4YeH3nE5A5fSvSC/4GrvVsr3vLLf127RuMwQIDAQABAoIEABG5cICCKchFXI13
OSY06COBq2Z4b9Xeah0poUj0P7GT28uE0lG9W1O9qydCE+IFhKcxLC9WxnkZXQ/c
kmoFwCCtZdkAyEBPFG2s2VAFKuVWonIu/2PjZFpLzAq1gj2yieyelabbbO//C95c
Wk41aSO3CQJf0vm3K+sBa2sK/FeOTVOFENLqktk0ueaGJ8fHOOT5On1gpV3/DDu9
sclJfYaCKC3FR1vUBqf7SShsh/UYvEVVs6CxhuXoIy35RMw9bNmbWL+9/arewy5W
4J1bgVpJq668wTYzFKmIEyvZwinXgKHuSkQ+2koF5FV94W28pj5MiQ3YnAEBxsbi
m5Fa0o6Xr8rBW5RxiZ4pebitaQ3nehykbLn94dghuSKQqHkyeCymhQsgAh+6UNCT
CiWxqkdQkTursmZLNYQw4owG5y0f2kSz1V+UmV1XfTjqF1tF3XGugyrMUwxpUazg
yqkbXG0eDX8WyreJqeP9L8keWzxDs0hwLekHkey6zWTuLY136bB9KKEj6bLDj+aO
+2ySp5W8TW29Rs8RogzArMQYJWO9VasAG4n5qp8lDxZUS+GVfy3RE6o6bGaOwCsx
cWgN33HJWSAMKjat4s9xGvDc1G55ilZDFbSZ5pgdyEDA+H08O7Hj1Zb+fE5E55OO
SZIVBQk1FsnlULM4d8l8cstUckvniM8HlAMW4hJ9SeTbb7w/5Px8ya1arn2wWQ7p
VhRE5f4P9jo+WzPQFMc5VUwl/10enAwpO52G+oUfoyd+qefZwNvyzm0qgoBbHpQY
JavHEAQUhpJWLbffFr/LwkEzURcLfVPu3ceZKOO5+x/GzrPK3m4AocYqsc4n+uk4
xx9n3c5t7wcIuNT23ykOWpmnv7u+dkVJGxjVBS9OYBpXg1+Wy0GAzv1ZTg9IuZR/
LH/ww7+qWhNKy4KZZG9lh9Ck7aNyLLJ9EUqIM/6zkQVReR8lm+/jOMBjp3UkTiqJ
8fzIg6TNCf1Pp2bV4MUBJF7SHJ2u8pW1xjVzlefl0k3uijkykMiQJhrDT7yKzavS
L5lSHQ+yp49WpGmdgdjUc7tw31cXHwHYogeYv3kFfxnNKURngZ/2+q9deupPzATr
CX0Uhrbf/NutxuuNwSbEU2w4DxX9+vR4vhD/+l6W5W2UMnaGa8xR3im5bRlFatvS
I/BsvaV0tvJ6JgjaEUdHvnwi5lOhbWEJverPn9xfERkj4zVWv1JKwpw2HQUKnBhY
jnqkpeqV0tE8NtPv9Tp6MvEa/I8sKvOlWh8qt2uqmtlB2mTRZNiX+GdwE98Ucnz4
OdtULi3y4nvM54n2GU3Ocm5ZPaQas6HjGvWUe+G+jzD7+1t7dZTCZezKi8K3e2Xo
p2TtWxsCggIBANV4krSluLBcW3rfXjSNl7a5mSax/f69UXXcZ1RXLxCG9BnknI7j
ijLsPA9XobhQ0KrBlDXLSPO1Ivf6ca0oE7AlvlNBPoxNp2qiXKIq9yhI6E4M+DXs
5wLxkE2qOQTMYDtnQFNo/8wpEt7nxg4D3OFVLppm1CbX4fm63Wb4A5ewoi5ZhTuP
/ZKZ5vvj9FgtDr9n6X877VKueRD6UGdP+uTCQXq+WOR82T7Iu/KxfgZLH7Wp5NnO
+B6ZBZm2Aa4bmQHgh1yeoocbhXp6W9snIAPEsCjysxVS26cSAikOTj6EOJX+cEtU
Oq+Q2UTpegLYx2eoOal6QjILPN+XqVuPKtkcW5tNMEiyi/04zOsJl7FQ1ptw/m9c
I4XkUfNbvV/tJp1I36AH+USiABODUwEBuy9dv06elb3TR5mDCtQArM+sh4qN5fqY
fZJLBnqldVpXAlbB0QcoaCqhpHjuW5AxEBIEsn1OF4ebFVzpfI0IZhwVNWV+FdZ6
thaBh43laJrZpn7ATkmTa3817HD6EWJpJj7JN8SCO6CCofF3w8xsOrvvfb49jGpG
QjlmQuN1f9iwEbl4tczotzrrGRDpBpv3xKgioBvbW1Y0mWs0nsrB5UL7Z7E/Efb2
cDItCmbCXPzZ7jJBwwT96gm9CzxLydbeIusYGDxaOeECnJHC6JnI0u0DAoICAQDO
a3X6PCROlINP/CjmLdfJZbCmbJqW6klEwGZJP1qKCApKcyMrWBSvaCDWLbBuZZJ3
QZBsGeBTY1nUQ4QrSdAeNdbz+364Cmvk/CNg0zam+iLB4AiwmLbAHvYjFn8dtDUQ
e/nroOzjgKjCbLNzF97rzo5fHzM+eZY7NWFYPDue305db8B7E5p+xptpcrb0URyd
HKHTaOeuF01JncrH17i6JUPxTbaC+CQBaI1kfXY9VcWuAOjvMg/DKTa+OcaIa7Ql
NOjASvvWbmL0wTZ6buSS89iklQkPmMtPpTPu8eocXd/7hQiiQ4UabhjJjSjoArc6
um6nFYAE2GwZSDPBYj0EiFrJtgitW3YL8fYCiz/Sq9OmIVcJ1ewwgnIdJGawG62s
vKNYIC1mBOzCIl9LjQmy/SXag73org5I0OqIEqqJ1tBYn2PINva3MKhNA5CUrKOk
8vdg+KVMPRFXrUruZxYnbXdxkcvs0QJSsX4ZEz1mWE1p+1XMiyUF4Xuj7Hkg8c5x
yJ2H7sMIlgoqwvh7/3jRNzRmhS3ECIX+0o7ySHqJQ3v4EiboyouvP0uM3TANSNiO
w6e3PeJQVeMdf4OoLJiVoyHWzElNBgrvA+kTBAZ0n0lGTbC6sRO7PVuTQkl/uEhs
3KZodjASNqkzP2AZ6+C1U4fqMEw5q5Kv96BWQ1ep6wKCAgBq7eauzoRg8yJvvgu2
T2a7hOSOWYJdY/+2Bh1MRg+xO6hyf+1cNeY389Vx6fd8GB8uKaFQAPAeA5HsnWrr
zbNu/LkFgx0Nsqg15fZ41QTRDRQwZJbAjFZ7Rv19qdK98JITr3itT18yqTBmr7qp
so2l4cFiXjfO7Tyol03oEjvadAQJK5Zta4cdNDJb4qe2s3s7rZVswlvymqrSMlCs
L4gBpryd+1MTwOYhaPOccgQqqt7LZLrZz67BxOzlPiJBUFmocwva/St0efi2jSwN
7t8+g/upx0ilWcflPEQQxLW04w5lM/qUATEUWH484qbXXjckWUPo/PDDmJV5esK+
tkxETMwmUtfo0mcFBLrA0SFHFLMrUcJhjcnNe70BJecKcgRxrNs3kkbudieLnrCp
RHC7HT6C5zUizP6EivuVjnEB5e5PHR0iFdhwu1wXe2H5SrRFOPi3mSn0kNuOJ/d9
ltXx8KBn3AI1Tx24WMym6JodXxJMMIhH01f6lg+MqGlph7S6sSGGAW5LXnt9bAXh
QcKCmNBygrnTgRwVlGRjtaMGGMTn0nTPlzn8/phqz6Smqit2uFx4s+l0feckbVV+
MvIzNoT070AlQlvHM6iG7/EjSEN8qZcaGf/BYoZfSuTBU3jZe89wZLAjCKrkHSKR
mtvq3zrkoF11tJUw/mz8+3eMeQKCAgEAvnNxt76TtRjbiwnZ5n43kW9MrFCZ1VI2
5cMq3LwiWiaO8CAJO+2ZsDk/yrz/AuyeVX/ds4+wZN/OusTMhnAlICqGuDe7tCyR
XgWw0p4t16QEO6LsAZv1SY+Hg9o20H47U4k/jsK8ri9ABZrreu50VFcRDvyneCYQ
kXJv7UwtqijYkecQzb3JltzB+WnJGeRYpTEMshUhZYPEYH7A4N/NZZoKdPJBydcO
yWngwu3rES45JJFcWY1z85nsE1kVLztIS+fkM787Wp4gmThHfnEgXeG0ai3D3WsZ
ctO29eioGyIWDWeyDpyDi143aobeTiprSjlG7MwugMn5+t2eOvfb2nnAYkmc+e3g
HadSVwiJi2PT9HzgZIfG0v8YMIEsaaIv/KdTgnS1zmIO3BOAnyFy6H0e1t0kdDFb
pp1zNrcaN/FF6+6rzse/nEe9kMkQNcyPdBpkWkkvogbaIG4YK5xbWWdrhBKD92zk
Ws2+zX3t8abZTkaB5CYhs6pWPGlrXRUdZ+g0SH3n3t0oZknbn/SXUVlA9LI+Bpfi
obk+AJcUz96+26RL2A9BECEzILXXpvomLJqi/LORQpPr54SGQb1bzvxjtV5o5zMD
FYIjItNc7W8l2ULHI4lL7j7vZhAL5lZuJFr1An7BXZynQkxf66qxejumtFF5kuAV
iFvNyKl7kZ8CggIAVY31TnksJNUANy2hOc8wJTNI7PYttECchLoBL38H3l9YV9r/
j2T9vh5YZuFmJ7Mv5isilX36mUE+WG3ExEu+G9lkobfZngqclX+Um0yKp6eH+TIg
Md2YGLxkPOJTi7SIUf0nYlU+hvwn8npk9jyYHum59h5u5UOWbnzPru93Ea9y6hDY
/15d8GtQICYO9scouww2yu32QxfRhPQ2qk/jewjbIR0rF6y5sekuLrdqXm/EEVrc
72QGsbxJJ4W7BUSJCCLWMWOLTR6vugpKJlPjpYIjzKAo/LdN0Lkf22RSmwm95go5
o9N6nTBLU3iXkSjJg1DWO8zPcr2G3LBTwAayZ7ttKplzfDz5GZKDcsTn80PVj5O+
5YKqzRrWA+j4dNnBCdEOt6jTRSsiB/OQwLaC4uOxpBZVRZvXqDy8Ip4p/KtVlSV2
dZ2nPDykSN72vXoY8lkrpWSYgIWoU4+k2sAXvNDKLyamphF0XKx6iER4FN8fGATx
FCKjtyjYvc+3/OdKXzpebUAJjVap7FAYncdFSLLfE/JdYq/2SQXRJcVAd6tqiYVs
BI11K5N66I9LOpP6iQQSKq5oHLCsj+mPaA8mYhpJpDSti/eSLANQfptmSNhMJiQ5
kfb/oxzU4juPb2fZUV1jUbm4xiB1L1qCcpHuZwSAcCJ3vcJlDNp4Apf4dIE=
-----END RSA PRIVATE KEY-----",
        public_pem: "-----BEGIN PUBLIC KEY-----
MIIEIjANBgkqhkiG9w0BAQEFAAOCBA8AMIIECgKCBAEArCCh03POPyDTU2PisWvN
tvgWT4rLYK9oZfU0p/Sk7pcRmM3TX1+nbU7ERQLoRpxtzxiTqPBrupLtBbuw0MwE
Q88CO/+EOUFoZ69jl3ib7ezpLPM4Cy6v9zR1Aj1zppSTE9cKiyVqGXQOFs6T7WbC
Jx3wT4rCF7bsrd2ve5/Z28wQOqlQZrQQwjUwIRS0acyMcL7dhY2UjmvbKGDdzS2v
UEao6z+QXP3gBYlFUGPbkaMmkByQKmDoIwPHGklbO4Is1vGKomzPr3GYq7Fvqy7u
yfahC/wg9pWbnGmPXr0HBYtyGqCB+8GBJI5+tx4Fo0DizrvdREAHCo5vcDSYHYcZ
kIUqB3DZNF9x9l5DMALMBdyvCJzL823LdiFRBQ5ve8vuIzEEv04PM6BZonx9cFXh
4R2XMkeCSQI/+PWdcXWy9NRVX5RYXWSx1YIKmVeyDwfI5vFVJ8r2QoNLScf0FbMD
c4Jie6OVpQKJ9D5Hl/1IO0n5Sna1tqc2gQrVv/0PN5xGzP3SwXKmhQH6lHh6lkLO
8lu7Q7h6Ao7w74uF9NgN9Jv2rkzC/Fjdammn7mAFFCN1qlDk8gZIdDLcDhjLO7NH
GFO3wAQH7CBM+zK2uoO4ID4+PicIgR0Vh0Tr+NbBb2I6diXNAnzQvlMbun/EiG8w
qNAIJ8JXYhXtJRb62frdXDzE268fJ8W11ijCjjEvxhmbaVi3N8KXTMiQIsiIMnJl
2Og2G8v/R6M7JTvRkQ3GZszJUCQ5wZnxzduMpmy1ggSbuRj7Sqin74OTQ6MJAKwp
P2JWARlofKgL+FLGmMIVqAAAPlpsMsIzAaQROiVFMd75kydaZndgfrK5HAJxv8Ti
BI8XTrwe1TNuyaBBkRnuHKXGr7pRrJgUweOKeb5/8K8oVTX34Q3E/M4X25VcYn99
jTZBav5Ls+zuSbxmIXdit59mWHCnldv9oxRoqmpjHTmHglAw7CTC6MxSYM0S0AFx
ODHmjoRHTp9SO4+wHoh+ZTLju7jU/7uqUqojB3YW2DWVRQBkU5B0663KrMapW1KN
GmA30n0RQ+Mx8ovd98owFm1gfxPa3HuHRP8V61qY8OWL+jkw4sFKlRafRKdwX/gb
kACIjtxEaBvU9/RvQYTCgA59iOGdlnrmZkdZxxcHQuMwDCBuDZCZdCKdsMDdoJr+
9GtTTa+PCA9Z96i7MdA5uBAhIKAP0VVYBKwkXeromkaWMihWdnQ7VXIktsOrO/Lq
eBAgrnYyFmQ63fFs5se1WLVBMSEY0PTzOjvV8LG0ZXOXQliVyb7S9NrZA2SP0fKG
2DRLDOYGEnn6zYfEJMSulOtx1BuBKt4YeH3nE5A5fSvSC/4GrvVsr3vLLf127RuM
wQIDAQAB
-----END PUBLIC KEY-----",
    },
    TestKey {
        bits: 2048,
        e: 3,
        private_pem: "-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAwyrKhqjmHESrdJepEgz6s3fM0YU8JjOLlSfEmQj4XpyJmX0v
3s526QYo9hFV3H82K/573qsznX4SDqbgDsd4jX7QsUHvZn0WLq8SPAdvk7nVT7Du
shU8OSHE17sJ6MlKgxCXVxHcmMMCIGa5XldrI5CQHKT+bE5bpUGzPgdpYpswtWv/
XCZpf2b855FlTpYq+wQUJUKDQwA9QQuzA7PP7SXjQxHYDMxNKNp0iiQCVWrV+yn6
4GxDgYHR1bPzl8gxULqZJYxsN6CEUVdRkVct59TKZq+/B6LCW3UIA6TFHpIVxYWA
Fszdy3xWkFapXoyahl962+9hFoItHv+Pi/JCcwIBAwKCAQEAghyHBHCZaC3How/G
DAinIk/d4QN9bs0HuMUtu1tQPxMGZlN1PzRPRgQbTrY5PaokHVRSlHIiaP62tG9A
CdpQXlSLINafmai5dHS20q+ft9E438tJzA4oJhaDOnyxRduHAgsPj2E9uyysFZnQ
6Y+cwmBgExipnYmSbivM1ATw7GZJfqewBaMz59gxKjDJZBWN7t4yvM9VAFJHpsTP
55Ljg0Ic8XTTPtDf6KEOjOmoSTaaR9e8BzYHgnr6HniiVt3YgNQqX/iUPoJHlNNN
AxjVlznTt/JPgiZm1ykj6IJKg/IrE34HdiOpShAlFl2aVRpLAW67M6Uz+WCc12d2
uT9tWwKBgQD87q9q+7cqlOvd9GPN/2eoKtzLUfx9bJ3Y4Mpjb0J6kOqNG1y+Ljl/
3YDmU/yn+xlNJUjbjbdHix+VfE7kB223IAqCvOElvYYvNCPLykqzUh4E2xkb6x7c
hsOHdWXFq6IdJbonMqwPFofyNwMX/zxmNDpdGHsty2yjzIyYI+ymjwKBgQDFiMEM
V/pxDrbVM+RpOQ4t6dn8uA8GVeb45hoXuRUAF1gqvYXdAFl9bmf4Ysjd7H+hah2F
R+PwsqnFK7AcDg21b3HW2LZoHFbpvfaSQmc6MuAH96sr2UpLkfPKsXuPrQS4Ao5N
sutQxdwst8cp36jDz/8E9fxlVQSeD1fFUiZ33QKBgQConx+cp89xuJ0+ou0z/5pw
HJMyNqhTnb6QldxCSixRtfGzZ5MpdCZVPlXu4qhv/LuIw4Xns8+FB2pjqDSYBPPP
arGsfetufll0zW0yhtx3jBQDPLtn8hSTBIJaTkPZHRa+GSbEzHK0ua/2z1dlVNLu
zXw+EFIeh53CiF26wp3EXwKBgQCDsICy5VGgtHnjd+2be17JRpFTJV9Zjpn7RBFl
Jg4AD5Acflk+ADuo9EVQQds+naprnBOuL+1LIcaDcnVoCV549PaPOyRFaDnxKU8M
LETRd0AFT8dykNwyYU0xy6e1HgMlVwmJIfI12T1zJS9xP8XX3/9Yo/2Y41hpX4/Y
4W76kwKBgQDWE3h40W4XZ4n+W/6RfZmySQs42FZEyrU3EQGf2La9miujsXhbCj1C
gVr4S8PQnf9XpO3lkQg7m41udt/vI+CDilLRvJGwWvaXSu36TBkwTJLPr3uMqajD
zOnN4k8qsw60tZMehHYWT2vPVF2nAz9EPbD2ExbuwFBOkkGNK1n78A==
-----END RSA PRIVATE KEY-----",
        public_pem: "-----BEGIN PUBLIC KEY-----
MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAwyrKhqjmHESrdJepEgz6
s3fM0YU8JjOLlSfEmQj4XpyJmX0v3s526QYo9hFV3H82K/573qsznX4SDqbgDsd4
jX7QsUHvZn0WLq8SPAdvk7nVT7DushU8OSHE17sJ6MlKgxCXVxHcmMMCIGa5Xldr
I5CQHKT+bE5bpUGzPgdpYpswtWv/XCZpf2b855FlTpYq+wQUJUKDQwA9QQuzA7PP
7SXjQxHYDMxNKNp0iiQCVWrV+yn64GxDgYHR1bPzl8gxULqZJYxsN6CEUVdRkVct
59TKZq+/B6LCW3UIA6TFHpIVxYWAFszdy3xWkFapXoyahl962+9hFoItHv+Pi/JC
cwIBAw==
-----END PUBLIC KEY-----",
    },
    TestKey {
        bits: 2048,
        e: 17,
        private_pem: "-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAuSkcSrafPDej7qM42/hTehLH1j0V/8v/QnWxVtVh/zq552Rc
1WP1rgR69dcOct6zF0emMkktzNvGuCUGV9CuKdzrLrANhYyF5hYu+zYezZdeT5Ij
Z2hbIQYP3hSD3qDZqB99k5fFsk0CF9zeQxeMxeWdAhquvFuv4vpH34fr/eudJrA5
LLjbctAheKymEO7HhQtfvNsJLxX0Qu6Zu00xqb3KfCQroP+U9GiQmK/TsQb6+Olu
qO2JTV0zDWHN+xyXZ51cmtPLeTilYGiCLzRaaP5IOMvQGmYLxrk+6jsKrI3nUXIh
WacslRi8BMwXGNRL6uOm1jfvd4lnIBxMdE99/wIBEQKCAQBiBrSgBlRNDmXYsMO/
v7O5GQBiXJMtEaVBTV3irTPheXF6gG1h6aAu81AnzDTTZtdIj1f8gRg/Ryz4E5ny
QU0lOLi+XTRVwt15z4JIwkyK9ciEeos2vsbVP3HP7L5Ir4JJ8o3Gm6Tl7IijOLHn
SLPwTGIuSlyB1i/wop6FZhOGbMXtPxBn/FNmPvlOJfz3MADe1YIlFjuEow6VCyle
iVeCeK+O19fmerTjsFJ0u+LwuBx+vlpL+DpTqNf5wUClY0Qk4RA/qIbPkKOrHEoy
DceyTP8aAK88ILiF9F30gZSR2nld6Yq7zypQladeIOYeempSOrxhTk1URr+MVSEJ
bgA5AoGBAPAKP/UptraHWzldKf4huWl6eSQ/cHOPTUminAa7L8QCf1YJZR9i/lUZ
g/YP6nfakwu6f4tj5tBhYKWH5xFVNvHt51/WXjC5Xg+4t2Dy3yh6Wm9J4yc3Unw/
RdrnJIxl74N2/dZu3wcWZyICWV5IFmj25uMQEAKLX0Qso9OFMvhTAoGBAMV4wEF3
ety4jC2kV1hVMAcQVEWpJCUzeDm/r0TbxKvpr9OBYDuKp7FJQjesRgSBifJPAlUn
Tkq/vaA78UKJ8UE0DN4TU7iNHrXWQs36OyqBZ74vkgiN8jL8NAff6NdsAbd+ZdMW
QNWRJST7UQYlZOE8OHxjsHdM+dWVEI/dTL4lAoGBAMWuFo2p4cN+h1xq10nBa4QK
geGdp+ayP6YNcW70gbB6hvuPRDf3K82cisqjsghZpkXk4YHZzSQT9T0Ggg5GLT+0
3KlHIGRca5R6AG31MD9z0gFL6D5py3VhSJYnw77qiQLadrCXin5Or0kvHGvC5Udh
61GUweP6TnRg/2LmKfmtAoGAItkS3mBg+cY22uDEHqWfEE4s/Tv3UdvoCjDiscxu
ADhMNGIgCoHhW4VmCdMbajT6OdG1HhX+weWZ7xmjC739ZdwCRU60a9yrEQexb6Sh
B4A/e+pG8nNm+fBFas0pFvTxPn+3nbiiB5IVnR1KiJ0v64MZBuRqb2fv2mWZgsyz
MJ0CgYEAjPwMga1N2S1jqIHKLIXeQRnpICtQJNW9Xx1t7TaIWgbvjGjFhEeoMPLf
fNuSCS1fRlG73/pZuR0vxVP9ed/NU1f9MkBCoZH571Y3suzURlmXtfRH3BtI6zM/
WHMBtASpPUQjDnJE2m2WLQaITwzbE1TjQrGcxU55yFusTLogR1o=
-----END RSA PRIVATE KEY-----",
        public_pem: "-----BEGIN PUBLIC KEY-----
MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAuSkcSrafPDej7qM42/hT
ehLH1j0V/8v/QnWxVtVh/zq552Rc1WP1rgR69dcOct6zF0emMkktzNvGuCUGV9Cu
KdzrLrANhYyF5hYu+zYezZdeT5IjZ2hbIQYP3hSD3qDZqB99k5fFsk0CF9zeQxeM
xeWdAhquvFuv4vpH34fr/eudJrA5LLjbctAheKymEO7HhQtfvNsJLxX0Qu6Zu00x
qb3KfCQroP+U9GiQmK/TsQb6+OluqO2JTV0zDWHN+xyXZ51cmtPLeTilYGiCLzRa
aP5IOMvQGmYLxrk+6jsKrI3nUXIhWacslRi8BMwXGNRL6uOm1jfvd4lnIBxMdE99
/wIBEQ==
-----END PUBLIC KEY-----",
    },
    TestKey {
        bits: 2048,
        e: 4294967297,
        private_pem: "-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAyCaSJNqpX0Lnl00fWPmeLjwOSxgCnbM9zvswDbBAWpVP9rOv
OOWcz2Py8+mHCiRTWGidDknEFROlGSQW+OUbO2fXoxTc4bZP9NHQI95itiuwp2vE
MtxXXiCLHJGsWZ0Ouoom4XzunQVZZ7Bxejxms4iRViiXeOX26OZDSMcNGZDcRIj/
O8mzKjOaJO7QPcS+Ukesfa4M9FtG69PPvtfVegNHk9jwZXskNEW2V4vvig0SM6V8
tB2Cj8yiLRy2J4t8I/343Mr76ujpFyt1t2b2qX0iXpWKWkrfDAIvrLRRF97446/i
ia1ZWYhW9DMoByj4RAv5S7kNrPb8l18zGSbV0QIFAQAAAAECggEAAjiVPfyoQYwG
56q9FIRvGMmE861XKZ2+TbfKPmwDvRmmJE0IwRoWuoPjS54aKseahd4qdJZwsBFh
5+k0tufmfpPx1Om5ZlJETQiWv5FimD6noEIfcmMhRMs7CHwZjyonsWI4ZtSBspUi
RXAd1SeQWVtN/FCyPk3gXi/vsPkz8yXSpf9uX/QCGAoaxChueeyt0bkxUUUxnS1F
13EWV528YYsxiDbzIYAfYUt9Tq/0Z0NYTtO4RhPw/YyQZa2ZwtkxnHkfznQyEU4I
0zlqfsrdK0bZrvw0WrISS7zDtVqo5ZZ3tRTk1y9q/RfNx4t4bQDcPrW2LkFxd6Y7
9meYfiPV7wKBgQDyYBZtQ+uO7pU5GS1uSepFL4sIr2l0hRSHpkfwzZN/tC88JqA+
SsLRZ0tXcKU3xbe0ejwVpeg9DjrRlyQ0c7KbApqvb423O+kyjudMaj3z9u9UlZZj
+PRA1vKeWI20MYQvrnwRwN8PyfX9lT/QB9R0DDSVJ0AkeioIqvew+A9tXwKBgQDT
ZtjrTzvqZeqkG4XG6fUwSX8CMCI8eUKEf+/YpT4IFkkyYqlc0z7Ff1L1TkcSzKb0
yl2pOuBuE922Oql8pWgips1x59hhiigbdR9ZbnxBDxR1DXhHd+l0p0UTqAfDVKrD
TB7O6UOi0sd/pcfMSoY6Pyrxn70WbEv4IQ48eAZazwKBgGJmstgRVZij4ZQwPDIS
1YWFT9GRlyrSQgR1KgaIZNRiDdJT3QwvMEl5P53u09Gz0H3Wf+q2doF5xp3w50/F
eoBenPKGE9AGI6x2sshb+vx6bmYoM0+E0HpICkebfU2BZLFBqUuoB5Hio3MZFJ/O
2LTZqA8jZ9JZhf6jekbkYmbbAoGAOGEzsr+e3+ZXnM1mg/Ll0bMPpX3vu6iMTy0o
vRHuGUChyL9WWeUyP6tLtrRc60GbpRl1mQGV2fRMwYeUFc47dwmFsGz4iUEr8w9U
ffhaiSUILH3kAp9w0A67y5KFuERHmpiVtbidvKhPotRjkT5nWuiQSEY6NPAubWUA
qU3okJsCgYAOPLzIlCnYXbJvu1U/qnlqxL8kWMO8d789/A9OvY8YtfDVcY3SCyOB
TH1hLZZ2gRSFUPw03pEjokEpLQxQaRz7i/s76oQCGm2Y+35/kAvUH+7wBczaFOrt
H/P/BzU9RcnqfjqNHN217hFjuTzZLHCM8uzbo0b82J9xPrKNGw1cCg==
-----END RSA PRIVATE KEY-----",
        public_pem: "-----BEGIN PUBLIC KEY-----
MIIBJDANBgkqhkiG9w0BAQEFAAOCAREAMIIBDAKCAQEAyCaSJNqpX0Lnl00fWPme
LjwOSxgCnbM9zvswDbBAWpVP9rOvOOWcz2Py8+mHCiRTWGidDknEFROlGSQW+OUb
O2fXoxTc4bZP9NHQI95itiuwp2vEMtxXXiCLHJGsWZ0Ouoom4XzunQVZZ7Bxejxm
s4iRViiXeOX26OZDSMcNGZDcRIj/O8mzKjOaJO7QPcS+Ukesfa4M9FtG69PPvtfV
egNHk9jwZXskNEW2V4vvig0SM6V8tB2Cj8yiLRy2J4t8I/343Mr76ujpFyt1t2b2
qX0iXpWKWkrfDAIvrLRRF97446/iia1ZWYhW9DMoByj4RAv5S7kNrPb8l18zGSbV
0QIFAQAAAAE=
-----END PUBLIC KEY-----",
    },
];

/// A 2048-bit key with three primes (PKCS#1 version 1), from `openssl genpkey` with
/// `rsa_keygen_primes:3`.
pub(crate) const THREE_PRIME_PEM: &str = "-----BEGIN RSA PRIVATE KEY-----
MIIE2gIBAQKCAQEArThz/B6/4BqKKcjHp2qSS2FiCR0FkKMGAFpvSS7EYnvBJ2Mo
bSKgJW4MHSJj2jUUUf0uWzk4dAhkT92TAXEuk0aiHevWQpV+m4YPyqx+dzX37vUG
iKfm+CBcho4hZsntVfmIExsXWCLSwc2Tgmv3vhynfzwLw2uuBIQ1+im8FRRVmlIx
Tlgq21Z2OTjE7FTICSuzKY+z9jLUlQ7Kx30lKazEwfgn6DIctj9o/TxCPYjessVO
2O2gIJBTjWfA7FcY49NJ54nkMzYvJTyWBhLxvuiydLZi+8PB21kc9HHCEnSM1lIr
YItySD1Spi95XXpJ0j0L+ckgXOyis7Sew3tqzQIDAQABAoIBAQCKlS+19aPs107S
Px/8gPap+C9Gu0FIhiS3A6MlGZVkdT4DFQGyzpDxYSmv5WOdn/mx3qzHru/LZStb
+hkyfiqVCV2KMrQocRHpu0fHDlnfZf4F32JqgK27YooKiPEktIiABy9SGMuc7uc2
BTUTvKi3UZAklTPfVxeetiB3qC3RGdTSQueJaRGu5YL9i+pihYTLlik9UrmoKnjf
xdwTZXTi7azzopYEAYkEB8Jvq/pRnFkupk6fr0hltFNPlaiJclo6zp7Kw4QpYmNC
LC6u3FfJOU2SfmuZiKDCR0UJK+ozNQq0DXgZWqhvRi8mlyh1kaV5oSMvtsPnszBF
LBV3OFYBAlYH6acUmAd240JKfgKAr8+6LWuct37OD3sljqsIdYG5gsculkux36KE
8I2vavNQeCh7OZf4QajwKhYFMYEyzCe8oVmDDUS4NTa+TJFcDxyO6pAQeHv3EwJW
Bwf3vDdq6GdWkDxDqItf1lVh7pC0ef6aSUJFOI7kSXGmh7fAVZazeYUO+c44hfXs
xMCmps0/63pjTKAuFUDdncxgMboTSzOBPAHlX9j53J5F9NabcQcCVgFPc0jYyFuq
1N6LMZToCIl3XhvM02YCcE1O7Anxk7MJ8jxHzW8+bqZ/Q6dqGbMYwvNtHTqSfQyQ
m6buhMvJvUbinXUzbE7pGRC4k1XgdsVAGO1xVm4bAlYFk2D2xi+mWwR/Xvr8doIq
kw0VRXWJZMjvHXmNL2uDfnfkGmiQtvBehpDosouKWApJwMincA6nayfBxSimPAlC
sKb76CaStSZf8tT13DfQp0assV8VEwJWBMWQnStfoyWJ8CuI052e1rtS+XlCV/MY
27R7ODpQSphGyZGxNDHoioCl0ys3vvhHvIOb6S+EsoPpi7Ok5nzsfiJqFNFBnbqJ
XoaFaj//T3+Pv+5Of74wggEMMIIBCAJWAx0OqrY4fmVqhDplMKomScCpC5zx92hP
OnfFtbdhEiBbE9PIoMLl/SlRWGjkdR+Qn5C+oexDvUPAqYURCu1gEz/vF2P/US71
1id8WHAhJVv/d17mw6kCVgIxmiD8rceZa7jpcF0etkWnIzUUi4UYkSKQO9Vy9UmR
VLsesTFcwjJjx3Y0yiwgZoWXtkpfL8eOkpSfNsftQ5GsralcgwxPu1X+kmW59BDf
xpv0WUKpAlYCfh9tDj2N5ugOKkDBlwJC4bSy15PnxGAxYUoxy0AMHlw985ODrpR+
oyTdJyVUqDIB4PrfCB7JgBqyBKW+DfwabZ/ZtM0u6Fz4FEg+5xP6lX66euXnow==
-----END RSA PRIVATE KEY-----";