1 use cipher::{NewCipher, StreamCipher};
2 use digest::{self, Digest, ExtendableOutput};
3 use hex_literal::hex;
4 use tor_llcrypto as ll;
5 
6 use std::convert::TryInto;
7 
8 #[test]
tv_curve25519()9 fn tv_curve25519() {
10     use ll::pk::curve25519::*;
11 
12     // Test vectors from RFC 7748
13     let s1 = hex!(
14         "a546e36bf0527c9d3b16154b82465edd
15                    62144c0ac1fc5a18506a2244ba449ac4"
16     );
17     let u1 = hex!(
18         "e6db6867583030db3594c1a424b15f7c
19                    726624ec26b3353b10a903a6d0ab1c4c"
20     );
21     let o1 = hex!(
22         "c3da55379de9c6908e94ea4df28d084f
23                    32eccf03491c71f754b4075577a28552"
24     );
25 
26     let s1 = StaticSecret::from(s1);
27     let u1 = PublicKey::from(u1);
28     let ss = s1.diffie_hellman(&u1);
29     assert_eq!(ss.as_bytes(), &o1);
30 
31     let s2 = hex!(
32         "4b66e9d4d1b4673c5ad22691957d6af5
33                    c11b6421e0ea01d42ca4169e7918ba0d"
34     );
35     let u2 = hex!(
36         "e5210f12786811d3f4b7959d0538ae2c
37                    31dbe7106fc03c3efc4cd549c715a493"
38     );
39     let o2 = hex!(
40         "95cbde9476e8907d7aade45cb4b873f8
41                    8b595a68799fa152e6f8f7647aac7957"
42     );
43 
44     let s2 = StaticSecret::from(s2);
45     let u2 = PublicKey::from(u2);
46     let ss = s2.diffie_hellman(&u2);
47     assert_eq!(ss.as_bytes(), &o2);
48 }
49 
50 #[test]
tv_ed25519()51 fn tv_ed25519() {
52     use ll::pk::ed25519::*;
53     use signature::{Signer, Verifier};
54     // Test vectors from RFC 8032.
55 
56     // TEST 1
57     let sk = SecretKey::from_bytes(&hex!(
58         "9d61b19deffd5a60ba844af492ec2cc4
59                4449c5697b326919703bac031cae7f60"
60     ))
61     .expect("Bad value");
62 
63     let pk_bytes = hex!("d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a");
64     let pk: PublicKey = (&sk).into();
65 
66     assert_eq!(pk.as_bytes(), &pk_bytes);
67 
68     let pk_as_id = Ed25519Identity::new(pk_bytes);
69     assert_eq!(
70         format!("{}", pk_as_id),
71         "11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo"
72     );
73     assert_eq!(
74         format!("{:?}", pk_as_id),
75         "Ed25519Identity { 11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo }"
76     );
77     let pk_again: PublicKey = (&pk_as_id).try_into().unwrap();
78     assert_eq!(pk_again, pk);
79 
80     let kp = Keypair {
81         public: pk,
82         secret: sk,
83     };
84     let sig = kp.sign(&b""[..]);
85     assert_eq!(
86         &sig.to_bytes()[..],
87         &hex!(
88             "e5564300c360ac729086e2cc806e828a
89                       84877f1eb8e5d974d873e06522490155
90                       5fb8821590a33bacc61e39701cf9b46b
91                       d25bf5f0595bbe24655141438e7a100b"
92         )[..]
93     );
94 
95     assert!(kp.public.verify(&b""[..], &sig).is_ok());
96 
97     // TEST 3
98     let sk = SecretKey::from_bytes(&hex!(
99         "c5aa8df43f9f837bedb7442f31dcb7b1
100                66d38535076f094b85ce3a2e0b4458f7"
101     ))
102     .expect("Bad value");
103 
104     let pk: PublicKey = (&sk).into();
105 
106     assert_eq!(
107         pk.as_bytes(),
108         &hex!(
109             "fc51cd8e6218a1a38da47ed00230f058
110                       0816ed13ba3303ac5deb911548908025"
111         )
112     );
113 
114     let kp = Keypair {
115         public: pk,
116         secret: sk,
117     };
118     let sig = kp.sign(&hex!("af82"));
119     assert_eq!(
120         &sig.to_bytes()[..],
121         &hex!(
122             "6291d657deec24024827e69c3abe01a3
123                       0ce548a284743a445e3680d7db5ac3ac
124                       18ff9b538d16f290ae67f760984dc659
125                       4a7c15e9716ed28dc027beceea1ec40a"
126         )[..]
127     );
128 
129     assert!(kp.public.verify(&hex!("af82"), &sig).is_ok());
130 
131     assert!(kp.public.verify(&hex!(""), &sig).is_err());
132 }
133 
134 #[cfg(feature = "relay")]
135 #[test]
tv_ed25519_convert()136 fn tv_ed25519_convert() {
137     fn edconv_single_test(curve_sk: [u8; 32], ed_sk: &[u8], signbit: u8, ed_pk: &[u8]) {
138         use tor_llcrypto::pk::curve25519;
139         use tor_llcrypto::pk::ed25519;
140         use tor_llcrypto::pk::keymanip;
141 
142         let curve_sk: curve25519::StaticSecret = curve_sk.into();
143         let curve_pk = curve25519::PublicKey::from(&curve_sk);
144         let (got_sk, got_signbit) =
145             keymanip::convert_curve25519_to_ed25519_private(&curve_sk).unwrap();
146         assert_eq!(&got_sk.to_bytes()[..], ed_sk);
147         assert_eq!(got_signbit, signbit);
148         let got_pk1: ed25519::PublicKey = (&got_sk).into();
149         let got_pk2 = keymanip::convert_curve25519_to_ed25519_public(&curve_pk, signbit).unwrap();
150         assert_eq!(got_pk1.as_bytes(), ed_pk);
151         assert_eq!(got_pk2.as_bytes(), ed_pk);
152     }
153 
154     // These values are not standardized; they were hand-generated by Tor.
155     edconv_single_test(
156         hex!("58BAF4E701F9D7DB78C1788153E2991FBDE53C8DA1BB436965C5AE4E45CC3355"),
157         &hex!(
158             "58BAF4E701F9D7DB78C1788153E2991FBDE53C8DA1BB436965C5AE4E45CC3355
159                2DAB3E0841D2F0E4CD84CA9F6EE4D20B4D31F6EC3DDDDBC9D822D11F4BBD3220"
160         ),
161         1,
162         &hex!("B440EEDB32D5C89EF21D6B16BE85A658774CE5992355737411678EE1041BDFBA"),
163     );
164     edconv_single_test(
165         hex!("88D5751F95FE48358D3DBDD73851E43F48E95A9ECAFE3FC6D1FBB37A8A0B9E5C"),
166         &hex!(
167             "88D5751F95FE48358D3DBDD73851E43F48E95A9ECAFE3FC6D1FBB37A8A0B9E5C
168                19B5DC44D58F3BE44E8AC5F8BBB91AE58122B97B33B82A5C1B65CA260E9354D5"
169         ),
170         0,
171         &hex!("4B94D95130446F0A7C3A7BB77D5F959F60C68C643AE029FBA1D82F65CD88F071"),
172     );
173     edconv_single_test(
174         hex!("78415DAFFC828D32C4A480094B8AAE49D0CFC35AFA3AAB50DD661AC1CB22B171"),
175         &hex!("78415DAFFC828D32C4A480094B8AAE49D0CFC35AFA3AAB50DD661AC1CB22B171 1ED559A2974308F21982A14EE79B7D18323679B0A36CADEB55F55313A9BF0DE3"),
176         1,
177         &hex!("F72CD9A204E57F2911761DD704B5B180433D385CFA5EB17904BC8705FA387CC4"));
178 
179     edconv_single_test(
180         hex!("70897D1BC3DBFA27A6501F33718A28F2B3950E1AD914F3724D61BB4E2B95EC5E"),
181         &hex!("70897D1BC3DBFA27A6501F33718A28F2B3950E1AD914F3724D61BB4E2B95EC5ECB25D9A33F177C90B257789F7FE078A4289547CEC12CA401290552EDFF866B94"),
182         0,
183         &hex!("8A9AA5F8ED4656E18949CDC8E8BA8FDF6B1132F67E8A9D81E7A47B62F26F3549"));
184 }
185 
186 #[test]
tv_aes128_ctr()187 fn tv_aes128_ctr() {
188     // From NIST Special Publication 800-38A.
189     // https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf
190     use ll::cipher::aes::Aes128Ctr;
191 
192     let k1 = hex!("2b7e151628aed2a6abf7158809cf4f3c").into();
193     let ctr1 = hex!("f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff").into();
194 
195     let mut cipher = Aes128Ctr::new(&k1, &ctr1);
196     let mut data = hex!(
197         "6bc1bee22e409f96e93d7e117393172a
198          ae2d8a571e03ac9c9eb76fac45af8e51
199          30c81c46a35ce411e5fbc1191a0a52ef
200          f69f2445df4f9b17ad2b417be66c3710"
201     );
202 
203     cipher.apply_keystream(&mut data);
204 
205     assert_eq!(
206         &data[..],
207         &hex!(
208             "874d6191b620e3261bef6864990db6ce
209              9806f66b7970fdff8617187bb9fffdff
210              5ae4df3edbd5d35e5b4f09020db03eab
211              1e031dda2fbe03d1792170a0f3009cee"
212         )[..]
213     );
214 }
215 
216 #[test]
tv_aes256_ctr()217 fn tv_aes256_ctr() {
218     // From NIST Special Publication 800-38A.
219     // https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf
220 
221     use ll::cipher::aes::Aes256Ctr;
222 
223     let k1 = hex!(
224         "603deb1015ca71be2b73aef0857d7781
225          1f352c073b6108d72d9810a30914dff4"
226     )
227     .into();
228     let ctr1 = hex!("f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff").into();
229 
230     let mut cipher = Aes256Ctr::new(&k1, &ctr1);
231     let mut data = hex!(
232         "6bc1bee22e409f96e93d7e117393172a
233          ae2d8a571e03ac9c9eb76fac45af8e51
234          30c81c46a35ce411e5fbc1191a0a52ef
235          f69f2445df4f9b17ad2b417be66c3710"
236     );
237 
238     cipher.apply_keystream(&mut data);
239 
240     assert_eq!(
241         &data[..],
242         &hex!(
243             "601ec313775789a5b7a7f504bbf3d228
244              f443e3ca4d62b59aca84e990cacaf5c5
245              2b0930daa23de94ce87017ba2d84988d
246              dfc9c58db67aada613c2dd08457941a6"
247         )[..]
248     );
249 }
250 
251 #[test]
tv_sha1()252 fn tv_sha1() {
253     // From RFC 3174, extracted from the example C code.
254     use ll::d::Sha1;
255 
256     fn run_test(inp: &[u8], repeatcount: usize, expect: &[u8]) {
257         let mut d = Sha1::new();
258         for _ in 0..repeatcount {
259             d.update(inp);
260         }
261         let res = d.finalize();
262         assert_eq!(&res[..], expect);
263     }
264 
265     run_test(
266         b"abc",
267         1,
268         &hex!(
269             "A9 99 3E 36 47 06 81 6A BA 3E
270              25 71 78 50 C2 6C 9C D0 D8 9D"
271         )[..],
272     );
273     run_test(
274         b"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
275         1,
276         &hex!(
277             "84 98 3E 44 1C 3B D2 6E BA AE
278              4A A1 F9 51 29 E5 E5 46 70 F1"
279         )[..],
280     );
281     run_test(
282         b"a",
283         1000000,
284         &hex!(
285             "34 AA 97 3C D4 C4 DA A4 F6 1E
286              EB 2B DB AD 27 31 65 34 01 6F"
287         )[..],
288     );
289     run_test(
290         b"0123456701234567012345670123456701234567012345670123456701234567",
291         10,
292         &hex!(
293             "DE A3 56 A2 CD DD 90 C7 A7 EC
294              ED C5 EB B5 63 93 4F 46 04 52"
295         )[..],
296     );
297 }
298 
299 #[test]
tv_sha256()300 fn tv_sha256() {
301     // From https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf
302 
303     let d = ll::d::Sha256::digest(b"abc");
304     assert_eq!(
305         &d[..],
306         hex!(
307             "BA7816BF 8F01CFEA 414140DE 5DAE2223
308              B00361A3 96177A9C B410FF61 F20015AD"
309         )
310     );
311 
312     let d = ll::d::Sha256::digest(b"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq");
313     assert_eq!(
314         &d[..],
315         hex!(
316             "248D6A61 D20638B8 E5C02693 0C3E6039
317              A33CE459 64FF2167 F6ECEDD4 19DB06C1"
318         )
319     );
320 }
321 
322 #[test]
tv_sha512()323 fn tv_sha512() {
324     // From https://csrc.nist.gov/csrc/media/projects/cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf
325 
326     let d = ll::d::Sha512::digest(b"abc");
327     assert_eq!(
328         &d[..],
329         &hex!(
330             "DDAF35A1 93617ABA CC417349 AE204131 12E6FA4E 89A97EA2
331              0A9EEEE6 4B55D39A 2192992A 274FC1A8 36BA3C23 A3FEEBBD
332              454D4423 643CE80E 2A9AC94F A54CA49F"
333         )[..]
334     );
335 
336     let d = ll::d::Sha512::digest(b"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu");
337     assert_eq!(
338         &d[..],
339         &hex!(
340             "8E959B75 DAE313DA 8CF4F728 14FC143F 8F7779C6 EB9F7FA1
341              7299AEAD B6889018 501D289E 4900F7E4 331B99DE C4B5433A
342              C7D329EE B6DD2654 5E96E55B 874BE909"
343         )[..]
344     );
345 }
346 
347 #[test]
tv_sha3_256()348 fn tv_sha3_256() {
349     // From https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/sha3/sha-3bytetestvectors.zip
350 
351     let d = ll::d::Sha3_256::digest(b"");
352     assert_eq!(
353         &d[..],
354         &hex!("a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a")
355     );
356 
357     let d = ll::d::Sha3_256::digest(&hex!("e9"));
358     assert_eq!(
359         &d[..],
360         &hex!("f0d04dd1e6cfc29a4460d521796852f25d9ef8d28b44ee91ff5b759d72c1e6d6")
361     );
362 
363     let d = ll::d::Sha3_256::digest(&hex!("d16d978dfbaecf2c8a04090f6eebdb421a5a711137a6"));
364     assert_eq!(
365         &d[..],
366         &hex!("7f497913318defdc60c924b3704b65ada7ca3ba203f23fb918c6fb03d4b0c0da")
367     );
368 
369     let d = ll::d::Sha3_256::digest(&hex!(
370         "3341ca020d4835838b0d6c8f93aaaebb7af60730d208c85283f6369f1ee27fd96d38f2674f
371 316ef9c29c1b6b42dd59ec5236f65f5845a401adceaa4cf5bbd91cac61c21102052634e99faedd6c
372 dddcd4426b42b6a372f29a5a5f35f51ce580bb1845a3c7cfcd447d269e8caeb9b320bb731f53fe5c
373 969a65b12f40603a685afed86bfe53"
374     ));
375     assert_eq!(
376         &d[..],
377         &hex!("6c3e93f2b49f493344cc3eb1e9454f79363032beee2f7ea65b3d994b5cae438f")
378     );
379 }
380 
xof_helper<X: ExtendableOutput + digest::Update>(mut x: X, input: &[u8], output: &[u8])381 fn xof_helper<X: ExtendableOutput + digest::Update>(mut x: X, input: &[u8], output: &[u8]) {
382     use digest::XofReader;
383     x.update(input);
384     let mut r = x.finalize_xof();
385     let mut buf = vec![0; output.len()];
386     r.read(&mut buf);
387     assert_eq!(&buf[..], output);
388 }
389 
390 #[test]
tv_shake128()391 fn tv_shake128() {
392     // From https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/sha3/shakebytetestvectors.zip
393 
394     xof_helper(
395         ll::d::Shake128::default(),
396         &hex!("ca12721a7a44544d9518aa0d4e407529"),
397         &hex!("25904657e9903ce960b56bcc42a4e9ff7b33"),
398     );
399 
400     xof_helper(
401         ll::d::Shake128::default(),
402         &hex!("981f4788c57eb8d064805357024d3128"),
403         &hex!("4c206447e85a2cbd4fab891ef3140806a32a89"),
404     );
405 
406     xof_helper(
407         ll::d::Shake128::default(),
408         &hex!("e118cecce029b40f7883805eb19d1c09"),
409         &hex!(
410             "6e8f5de5c92a474a1f96bf89798a11c96637c05e6f1d21940c07
411                       783b2d5da11c8f592446c12189eabfc9be2561855fa7c7c1b7fe"
412         ),
413     );
414 
415     xof_helper(
416         ll::d::Shake128::default(),
417         &hex!("c60a221c975e14bf835827c1103a2906"),
418         &hex!(
419             "0db7f7196eee8dd6994a16ded19cb09f05f89ccd2464333df2c0
420                       17c6ca041fa0d54a4832a74ce86ce9b41d8e523e66ce6ef9df7c
421                       20aa70e0ac00f54eb072a472ef46cf2a933df0d5f9fafab6388a
422                       206f6bd1df50b0836500c758c557c8ac965733fdaaa59f5ed661
423                       a1bda61e2952886a60f9568157e3d72e49b6e061fc08f3f1caf1
424                       59e8eff77ea5221565d2"
425         ),
426     );
427 
428     xof_helper(
429         ll::d::Shake128::default(),
430         &hex!(
431             "c521710a951c7f1fda05ddf7b78366976ce6f8ee7abbbf0c089d
432                       b690854e6a5f8f06029c130a7cd4b68139787483bc918774af"
433         ),
434         &hex!("65fa398b3a99fa2c9a122f46a4ac4896"),
435     );
436 }
437 
438 #[test]
tv_shake256()439 fn tv_shake256() {
440     // From https://csrc.nist.gov/CSRC/media/Projects/Cryptographic-Algorithm-Validation-Program/documents/sha3/shakebytetestvectors.zip
441 
442     xof_helper(
443         ll::d::Shake256::default(),
444         &hex!(
445             "c61a9188812ae73994bc0d6d4021e31bf124dc72669749111232da
446                       7ac29e61c4"
447         ),
448         &hex!("23ce"),
449     );
450 
451     xof_helper(
452         ll::d::Shake256::default(),
453         &hex!(
454             "76891a7bcc6c04490035b743152f64a8dd2ea18ab472b8d36ecf45
455                       858d0b0046"
456         ),
457         &hex!(
458             "e8447df87d01beeb724c9a2a38ab00fcc24e9bd17860e673b02122
459                       2d621a7810e5d3"
460         ),
461     );
462 
463     xof_helper(
464         ll::d::Shake256::default(),
465         &hex!(
466             "7d9312ffe94845ac51056c63eb3bff4a94626aafb7470ff86fa88f
467                       d8f0fe45c9"
468         ),
469         &hex!(
470             "de489392796fd3b530c506e482936afcfe6b72dcf7e9def0549538
471                       42ff19076908c8a1d6a4e7639e0fdbfa1b5201095051aac3e39977
472                       79e588377eac979313e39c3721dc9f912cf7fdf1a9038cbaba8e9f
473                       3d95951a5d819bffd0b080319fcd12da0516baf54b779e79e437d3
474                       ec565c64eb5752825f54050f93"
475         ),
476     );
477 
478     xof_helper(
479         ll::d::Shake256::default(),
480         &hex!(
481             "1b6facbbeb3206ff68214b3ad5c0fcbcd37ae9e2d84347dfde7c02
482                       bc5817559e6afb974859aa58e04121acf60600c7c28ceacaad2b2f
483                       dd145da87e48bae318d92780d8144adbbcca41eced53936b4ed366
484                       3755bcf3f81a943803adf9ec7fade2b8c61627a40e5b44d0"
485         ),
486         &hex!(
487             "1d8599e06e505fea435eb7699b1effdc3fe76864abce4ea446824f
488                       ff7869ad26"
489         ),
490     );
491 }
492 
493 #[test]
tv_known_rsa()494 fn tv_known_rsa() {
495     // These vectors are taken from a chutney installation, not a standard
496     // source.
497 
498     let sk_pem = "
499 MIICXQIBAAKBgQDVJ7bGPW6B05wyipTOFX3M3AROsa2MIQycniJIe0z63m1AQb0Q
500 Rpplfj2CvADPYqw7apkkflc7VMEMR/XchJsKzNoDHspvbl3IVnf3bexJ/yTS/LK1
501 iH+xJaogR0QRm7ZBf0XuaW+N/Bwvwhsrro6eN6GdwlGKLCTn2P1/rA9GlQIDAQAB
502 AoGADZDgfg9s2BBqsYDGZbNSdVZPY97FB9UWo2UhE3HdfV3ooB1O9hk4PFtjeM2U
503 U56ZDZMEOiFcVedX/fsad7Vs1I5VUxwZqXdhRgqJllD5RPifSSpt3lnYNE0O/WN5
504 DJIUR2yxJ2cXj2D2MUh56T5RnqC17lXWEOmUUlM7u2/po8ECQQD6HVmhcclRWWP8
505 /IuSu8rD/2kjjuoAhg1ptfSyzSIp0ipS7xYcru13dDkFG8WllosEt0eu+FIL+Vnz
506 VtxyBErRAkEA2iu5yiRSVRHOud2SHtn1wUx2M8pSdB3XtCQjkpiwhsSij20eYFVv
507 clS5A6E0D4txRK4flnwYqVTdxlh271fohQJBAMKZ+XX6oWeRBJH/MN1/DZmH7RcE
508 iB7WLjN0pipEHvOpGNMkQPEaTZsmq4LFA/f9dLa7n6OMg9HbNdh2WdjAbDECQFqT
509 9tG23LvW5dYC6KyIX2C+ZwC/ihYNYcW3j1FItVluf/M+IXNrZRa5mAqqvduKUB9s
510 j07B/Ncold7IUbCy9aUCQQDew08R5vjl8n+I44u/KIZ4RR1ntggrnDfKnCD8nNR4
511 LnZEGsos1BCJkS31lYl7Jae1QVooa6522Rz8ORo+GfbZ";
512     let pk_pem = "
513 MIGJAoGBANUntsY9boHTnDKKlM4VfczcBE6xrYwhDJyeIkh7TPrebUBBvRBGmmV+
514 PYK8AM9irDtqmSR+VztUwQxH9dyEmwrM2gMeym9uXchWd/dt7En/JNL8srWIf7El
515 qiBHRBGbtkF/Re5pb438HC/CGyuujp43oZ3CUYosJOfY/X+sD0aVAgMBAAE=";
516     fn to_der(s: &str) -> Vec<u8> {
517         let mut r = Vec::new();
518         for line in s.lines() {
519             r.extend(base64::decode(line).unwrap());
520         }
521         r
522     }
523 
524     use tor_llcrypto::pk::{rsa, ValidatableSignature};
525 
526     let secret = rsa::PrivateKey::from_der(&to_der(sk_pem)).unwrap();
527     let expect_public = rsa::PublicKey::from_der(&to_der(pk_pem)).unwrap();
528 
529     let public = secret.to_public_key();
530     assert_eq!(public.to_rsa_identity(), expect_public.to_rsa_identity());
531     assert_eq!(
532         format!("{}", public.to_rsa_identity()),
533         "$9367f9781da8eabbf96b691175f0e701b43c602e"
534     );
535     assert_eq!(
536         format!("{:?}", public.to_rsa_identity()),
537         "RsaIdentity { $9367f9781da8eabbf96b691175f0e701b43c602e }"
538     );
539 
540     assert_eq!(
541         rsa::RsaIdentity::from_bytes(&hex!("9367f9781da8eabbf96b691175f0e701b43c602e")).unwrap(),
542         public.to_rsa_identity()
543     );
544     assert_eq!(
545         &hex!("9367f9781da8eabbf96b691175f0e701b43c602e"),
546         public.to_rsa_identity().as_bytes()
547     );
548 
549     assert!(
550         rsa::RsaIdentity::from_bytes(&hex!("67f9781da8eabbf96b691175f0e701b43c602e")).is_none()
551     );
552     assert!(
553         rsa::RsaIdentity::from_bytes(&hex!("67f9781da8eabbf96b691175f0e701b43c602effff")).is_none()
554     );
555 
556     assert_eq!(public.to_der(), to_der(pk_pem));
557     assert_eq!(public.bits(), 1024);
558     assert!(public.exponent_is(65537));
559     assert!(!public.exponent_is(3));
560 
561     let digest = hex!("8c28f494a3ca4522926b177124a51158a790bec0");
562     let wrong_digest = hex!("8c28f494a3ca4522926b177124a51158a790bec1");
563     let sig = "
564 i7BWpY6EgPCYQQQRL8yIba+2C/sASVWMmcD5x/aSlGVeuwna4h15SrOKAMZUBecE
565 JtAqSDuSzXGn6FP9WXNdi+xe5GQznb1D3wjParTno1y/kYtJiRA5MrJ0E1cWhLl5
566 rI2rzhqqBIhzFFaYuxyRAhkSBxCKTdl6X0k74ahT3MM=
567 ";
568 
569     assert!(public.verify(&digest, &to_der(sig)).is_ok());
570     assert!(!public.verify(&wrong_digest, &to_der(sig)).is_ok());
571 
572     let val = rsa::ValidatableRsaSignature::new(&public, &to_der(sig), &digest);
573 
574     assert!(val.is_valid());
575 }
576