Skip to main content

rsa_basic_quick_examples/
rsa_basic_quick_examples.rs

1// Copyright 2025 PARK Youngho.
2//
3// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option.
6// This file may not be copied, modified, or distributed
7// except according to those terms.
8
9// #![allow(missing_docs)]
10// #![allow(rustdoc::missing_doc_code_examples)]
11// #[allow(non_camel_case_types)]
12// #[allow(non_snake_case)]
13
14
15use std::sync::{Mutex, Arc};
16use std::sync::mpsc::channel;
17use std::thread::{ spawn, available_parallelism };
18
19fn do_simultaneously(jobs: Vec<fn()>)
20{
21    let number_of_threads: usize = match available_parallelism()
22    {
23        Ok(non_zero) => non_zero.get() as usize,
24        Err(_) => 1_usize,
25    };
26    
27    if number_of_threads == 1
28    {
29        for work in jobs
30            { work(); }
31        return;
32    }
33
34    let mut threads = Vec::new();
35    let (tx, rx) = channel::<fn()>();
36    let receiver = Arc::new(Mutex::new(rx));
37    for _ in 0..number_of_threads
38    {
39        let rxx = receiver.clone();
40        threads.push(spawn(move ||
41        {
42            loop
43            {
44                let r = rxx.lock().unwrap();
45                match r.recv()
46                {
47                    Ok(work) => { drop(r); work(); },
48                    _ => { return },
49                }
50            }
51        }));
52    }
53
54    for job in jobs
55        { tx.clone().send(job).unwrap(); }
56    drop(tx);
57    for thread in threads
58        { thread.join().unwrap(); }
59}
60
61
62pub fn main()
63{
64    rsa_quick_start();
65    rsa_new();
66    rsa_new_with_automatic_keys();
67    rsa_new_with_keys();
68    rsa_new_with_primes();
69    rsa_new_with_prepared_keys();
70    rsa_set_keys();
71    rsa_find_keys();
72    calculate_keys();
73    rsa_encrypt_biguint();
74    rsa_decrypt_biguint();
75    rsa_failure_decrypt_biguint();
76    rsa_decrypt_array_biguint();
77    rsa_decrypt_unit();
78    rsa_decrypt_array_unit();
79}
80
81fn rsa_quick_start()
82{
83    rsa_import();
84}
85
86#[allow(unused_imports)]
87fn rsa_import()
88{
89    println!("rsa_import");
90    use cryptocol::asymmetric::RSA_1024;
91    use cryptocol::asymmetric::RSA_2048;
92    use cryptocol::asymmetric::RSA_4096;
93    use cryptocol::asymmetric::RSA_Generic;
94    use cryptocol::asymmetric::RSA_1024_u128;
95    use cryptocol::asymmetric::RSA_2048_u128;
96    use cryptocol::asymmetric::RSA_4096_u128;
97    use cryptocol::asymmetric::RSA_1024_u64;
98    use cryptocol::asymmetric::RSA_2048_u64;
99    use cryptocol::asymmetric::RSA_4096_u64;
100    use cryptocol::asymmetric::RSA_1024_u32;
101    use cryptocol::asymmetric::RSA_2048_u32;
102    use cryptocol::asymmetric::RSA_4096_u32;
103    use cryptocol::asymmetric::RSA_1024_u16;
104    use cryptocol::asymmetric::RSA_2048_u16;
105    use cryptocol::asymmetric::RSA_4096_u16;
106    use cryptocol::asymmetric::RSA_1024_u8;
107    use cryptocol::asymmetric::RSA_2048_u8;
108    use cryptocol::asymmetric::RSA_4096_u8;
109    println!("-------------------------------");
110}
111
112fn rsa_new()
113{
114    println!("rsa_new");
115    
116    // Example for RSA_1024
117    use cryptocol::asymmetric::RSA_1024;
118    let _rsa = RSA_1024::new();
119    
120    // Example for RSA_2048
121    use cryptocol::asymmetric::RSA_2048;
122    let _rsa = RSA_2048::new();
123    
124    // Example for RSA_4096
125    use cryptocol::asymmetric::RSA_4096;
126    let _rsa = RSA_4096::new();
127    
128    // Example for RSA_Genric
129    use cryptocol::asymmetric::RSA_Generic;
130    let _rsa = RSA_Generic::<8, u32, 5>::new();
131    
132    // Example for RSA_1024_u128
133    use cryptocol::asymmetric::RSA_1024_u128;
134    let _rsa = RSA_1024_u128::new();
135    
136    // Example for RSA_2048_u128
137    use cryptocol::asymmetric::RSA_2048_u128;
138    let _rsa = RSA_2048_u128::new();
139    
140    // Example for RSA_4096_u128
141    use cryptocol::asymmetric::RSA_4096_u128;
142    let _rsa = RSA_4096_u128::new();
143    
144    // Example for RSA_1024_u64
145    use cryptocol::asymmetric::RSA_1024_u64;
146    let _rsa = RSA_1024_u64::new();
147    
148    // Example for RSA_2048_u64
149    use cryptocol::asymmetric::RSA_2048_u64;
150    let _rsa = RSA_2048_u64::new();
151    
152    // Example for RSA_4096_u64
153    use cryptocol::asymmetric::RSA_4096_u64;
154    let _rsa = RSA_4096_u64::new();
155    
156    // Example for RSA_1024_u32
157    use cryptocol::asymmetric::RSA_1024_u32;
158    let _rsa = RSA_1024_u32::new();
159    
160    // Example for RSA_2048_u32
161    use cryptocol::asymmetric::RSA_2048_u32;
162    let _rsa = RSA_2048_u32::new();
163    
164    // Example for RSA_4096_u32
165    use cryptocol::asymmetric::RSA_4096_u32;
166    let _rsa = RSA_4096_u32::new();
167    
168    // Example for RSA_1024_u16
169    use cryptocol::asymmetric::RSA_1024_u16;
170    let _rsa = RSA_1024_u16::new();
171    
172    // Example for RSA_2048_u16
173    use cryptocol::asymmetric::RSA_2048_u16;
174    let _rsa = RSA_2048_u16::new();
175    
176    // Example for RSA_4096_u16
177    use cryptocol::asymmetric::RSA_4096_u16;
178    let _rsa = RSA_4096_u16::new();
179    
180    // Example for RSA_1024_u8
181    use cryptocol::asymmetric::RSA_1024_u8;
182    let _rsa = RSA_1024_u8::new();
183    
184    // Example for RSA_2048_u8
185    use cryptocol::asymmetric::RSA_2048_u8;
186    let _rsa = RSA_2048_u8::new();
187    
188    // Example for RSA_4096_u8
189    use cryptocol::asymmetric::RSA_4096_u8;
190    let _rsa = RSA_4096_u8::new();
191    println!("-------------------------------");
192}
193
194fn rsa_new_with_automatic_keys()
195{
196    println!("rsa_new_with_automatic_keys");
197
198    let mut thread = Vec::<fn()>::new();
199    
200    // Example for RSA_1024
201    thread.push(||{
202        use cryptocol::asymmetric::RSA_1024;
203
204        let rsa = RSA_1024::new_with_automatic_keys();
205        let private_key = rsa.get_private_key();
206        let public_key = rsa.get_public_key();
207        let modulus = rsa.get_modulus();
208        println!("RSA_1024: private key = {:X}:{:x}", private_key, modulus);
209        println!("RSA_1024: public key = {:X}:{:x}", public_key, modulus);
210    });
211
212    // Example for RSA_2048
213    thread.push(||{
214        use cryptocol::asymmetric::RSA_2048;
215
216        let rsa = RSA_2048::new_with_automatic_keys();
217        let private_key = rsa.get_private_key();
218        let public_key = rsa.get_public_key();
219        let modulus = rsa.get_modulus();
220        println!("RSA_2048: private key = {:X}:{:x}", private_key, modulus);
221        println!("RSA_2048: public key = {:X}:{:x}", public_key, modulus);
222    });
223    
224    // Example for RSA_4096
225    thread.push(||{
226        use cryptocol::asymmetric::RSA_4096;
227
228        let rsa = RSA_4096::new_with_automatic_keys();
229        let private_key = rsa.get_private_key();
230        let public_key = rsa.get_public_key();
231        let modulus = rsa.get_modulus();
232        println!("RSA_4096: private key = {:X}:{:x}", private_key, modulus);
233        println!("RSA_4096: public key = {:X}:{:x}", public_key, modulus);
234    });
235    
236    // Example for RSA_Genric
237    thread.push(||{
238        use cryptocol::asymmetric::RSA_Generic;
239
240        let rsa = RSA_Generic::<8, u32, 5>::new_with_automatic_keys();
241        let private_key = rsa.get_private_key();
242        let public_key = rsa.get_public_key();
243        let modulus = rsa.get_modulus();
244        println!("RSA_Generic<8, u32, 5>: private key = {:X}:{:x}", private_key, modulus);
245        println!("RSA_Generic<8, u32, 5>: public key = {:X}:{:x}", public_key, modulus);
246    });
247    
248    // Example for RSA_1024_u128
249    thread.push(||{
250        use cryptocol::asymmetric::RSA_1024_u128;
251
252        let rsa = RSA_1024_u128::new_with_automatic_keys();
253        let private_key = rsa.get_private_key();
254        let public_key = rsa.get_public_key();
255        let modulus = rsa.get_modulus();
256        println!("RSA_1024_u128: private key = {:X}:{:x}", private_key, modulus);
257        println!("RSA_1024_u128: public key = {:X}:{:x}", public_key, modulus);
258    });
259
260    // Example for RSA_2048_u128
261    thread.push(||{
262        use cryptocol::asymmetric::RSA_2048_u128;
263
264        let rsa = RSA_2048_u128::new_with_automatic_keys();
265        let private_key = rsa.get_private_key();
266        let public_key = rsa.get_public_key();
267        let modulus = rsa.get_modulus();
268        println!("RSA_2048_u128: private key = {:X}:{:x}", private_key, modulus);
269        println!("RSA_2048_u128: public key = {:X}:{:x}", public_key, modulus);
270    });
271    
272    // Example for RSA_4096_u128
273    thread.push(||{
274        use cryptocol::asymmetric::RSA_4096_u128;
275
276        let rsa = RSA_4096_u128::new_with_automatic_keys();
277        let private_key = rsa.get_private_key();
278        let public_key = rsa.get_public_key();
279        let modulus = rsa.get_modulus();
280        println!("RSA_4096_u128: private key = {:X}:{:x}", private_key, modulus);
281        println!("RSA_4096_u128: public key = {:X}:{:x}", public_key, modulus);
282    });
283    
284    // Example for RSA_1024_u64
285    thread.push(||{
286        use cryptocol::asymmetric::RSA_1024_u64;
287
288        let rsa = RSA_1024_u64::new_with_automatic_keys();
289        let private_key = rsa.get_private_key();
290        let public_key = rsa.get_public_key();
291        let modulus = rsa.get_modulus();
292        println!("RSA_1024_u64: private key = {:X}:{:x}", private_key, modulus);
293        println!("RSA_1024_u64: public key = {:X}:{:x}", public_key, modulus);
294    });
295
296    // Example for RSA_2048_u64
297    thread.push(||{
298        use cryptocol::asymmetric::RSA_2048_u64;
299
300        let rsa = RSA_2048_u64::new_with_automatic_keys();
301        let private_key = rsa.get_private_key();
302        let public_key = rsa.get_public_key();
303        let modulus = rsa.get_modulus();
304        println!("RSA_2048_u64: private key = {:X}:{:x}", private_key, modulus);
305        println!("RSA_2048_u64: public key = {:X}:{:x}", public_key, modulus);
306    });
307    
308    // Example for RSA_4096_u64
309    thread.push(||{
310        use cryptocol::asymmetric::RSA_4096_u64;
311
312        let rsa = RSA_4096_u64::new_with_automatic_keys();
313        let private_key = rsa.get_private_key();
314        let public_key = rsa.get_public_key();
315        let modulus = rsa.get_modulus();
316        println!("RSA_4096_u64: private key = {:X}:{:x}", private_key, modulus);
317        println!("RSA_4096_u64: public key = {:X}:{:x}", public_key, modulus);
318    });
319    
320    // Example for RSA_1024_u32
321    thread.push(||{
322        use cryptocol::asymmetric::RSA_1024_u32;
323
324        let rsa = RSA_1024_u32::new_with_automatic_keys();
325        let private_key = rsa.get_private_key();
326        let public_key = rsa.get_public_key();
327        let modulus = rsa.get_modulus();
328        println!("RSA_1024_u32: private key = {:X}:{:x}", private_key, modulus);
329        println!("RSA_1024_u32: public key = {:X}:{:x}", public_key, modulus);
330    });
331
332    // Example for RSA_2048_u32
333    thread.push(||{
334        use cryptocol::asymmetric::RSA_2048_u32;
335
336        let rsa = RSA_2048_u32::new_with_automatic_keys();
337        let private_key = rsa.get_private_key();
338        let public_key = rsa.get_public_key();
339        let modulus = rsa.get_modulus();
340        println!("RSA_2048_u32: private key = {:X}:{:x}", private_key, modulus);
341        println!("RSA_2048_u32: public key = {:X}:{:x}", public_key, modulus);
342    });
343    
344    // Example for RSA_4096_u32
345    thread.push(||{
346        use cryptocol::asymmetric::RSA_4096_u32;
347
348        let rsa = RSA_4096_u32::new_with_automatic_keys();
349        let private_key = rsa.get_private_key();
350        let public_key = rsa.get_public_key();
351        let modulus = rsa.get_modulus();
352        println!("RSA_4096_u32: private key = {:X}:{:x}", private_key, modulus);
353        println!("RSA_4096_u32: public key = {:X}:{:x}", public_key, modulus);
354    });
355    
356    // Example for RSA_1024_u16
357    thread.push(||{
358        use cryptocol::asymmetric::RSA_1024_u16;
359
360        let rsa = RSA_1024_u16::new_with_automatic_keys();
361        let private_key = rsa.get_private_key();
362        let public_key = rsa.get_public_key();
363        let modulus = rsa.get_modulus();
364        println!("RSA_1024_u16: private key = {:X}:{:x}", private_key, modulus);
365        println!("RSA_1024_u16: public key = {:X}:{:x}", public_key, modulus);
366    });
367
368    // Example for RSA_2048_u16
369    thread.push(||{
370        use cryptocol::asymmetric::RSA_2048_u16;
371
372        let rsa = RSA_2048_u16::new_with_automatic_keys();
373        let private_key = rsa.get_private_key();
374        let public_key = rsa.get_public_key();
375        let modulus = rsa.get_modulus();
376        println!("RSA_2048_u16: private key = {:X}:{:x}", private_key, modulus);
377        println!("RSA_2048_u16: public key = {:X}:{:x}", public_key, modulus);
378    });
379    
380    // Example for RSA_4096_u16
381    thread.push(||{
382        use cryptocol::asymmetric::RSA_4096_u16;
383
384        let rsa = RSA_4096_u16::new_with_automatic_keys();
385        let private_key = rsa.get_private_key();
386        let public_key = rsa.get_public_key();
387        let modulus = rsa.get_modulus();
388        println!("RSA_4096_u16: private key = {:X}:{:x}", private_key, modulus);
389        println!("RSA_4096_u16: public key = {:X}:{:x}", public_key, modulus);
390    });
391    
392    // Example for RSA_1024_u8
393    thread.push(||{
394        use cryptocol::asymmetric::RSA_1024_u8;
395
396        let rsa = RSA_1024_u8::new_with_automatic_keys();
397        let private_key = rsa.get_private_key();
398        let public_key = rsa.get_public_key();
399        let modulus = rsa.get_modulus();
400        println!("RSA_1024_u8: private key = {:X}:{:x}", private_key, modulus);
401        println!("RSA_1024_u8: public key = {:X}:{:x}", public_key, modulus);
402    });
403
404    // Example for RSA_2048_u8
405    thread.push(||{
406        use cryptocol::asymmetric::RSA_2048_u8;
407
408        let rsa = RSA_2048_u8::new_with_automatic_keys();
409        let private_key = rsa.get_private_key();
410        let public_key = rsa.get_public_key();
411        let modulus = rsa.get_modulus();
412        println!("RSA_2048_u8: private key = {:X}:{:x}", private_key, modulus);
413        println!("RSA_2048_u8: public key = {:X}:{:x}", public_key, modulus);
414    });
415    
416    // Example for RSA_4096_u8
417    thread.push(||{
418        use cryptocol::asymmetric::RSA_4096_u8;
419
420        let rsa = RSA_4096_u8::new_with_automatic_keys();
421        let private_key = rsa.get_private_key();
422        let public_key = rsa.get_public_key();
423        let modulus = rsa.get_modulus();
424        println!("RSA_4096_u8: private key = {:X}:{:x}", private_key, modulus);
425        println!("RSA_4096_u8: public key = {:X}:{:x}", public_key, modulus);
426    });
427
428    do_simultaneously(thread);
429    println!("-------------------------------");
430}
431
432fn rsa_new_with_keys()
433{
434    println!("rsa_new_with_keys");
435    use cryptocol::define_utypes_with;
436    define_utypes_with!(u32);
437    
438    // Example for RSA_1024
439    use cryptocol::asymmetric::RSA_1024;
440
441    let private_key = U1024::from_str_radix("6F21015F58239A612E66501D445CC4F221AB05A16AD9BCD5F3494E44397BCDED845BA62788A4B6C4E008A120F0FD7D45E96CFDB6CC0EF621889A39BA55037EE32946DCB260FB638EF573CA2F4BB3C922A91EA2719E0BC1268410E862D1A2BDF7317970DBDA5AC089FFA1A74DC097AAF08AEEEFAF34DDB1DF172B0743D43B0B", 16).unwrap();
442    let public_key = U1024::from(7_u8);
443    let modulus = U1024::from_str_radix("c772e0c82db6549484796c056c18b9ee836f8504611a3792df4b71e78a65992e6366f1f3024dd571b591cdd2a7d7e19a52d1ff6ffff40ba2fda3229ead5e90f2af877de674a7443acfbbeb3a3e5b1968cef3f6bdf0639edaa94174fa8c6d4701fca2d46a041f6ea3e0e921c70434781fd49f1b31f6cc2970aeefc981490b47e5", 16).unwrap();
444
445    let rsa = RSA_1024::new_with_keys(public_key, private_key, modulus);
446    println!("RSA_1024: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
447    println!("RSA_1024: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
448
449    // Example for RSA_2048
450    use cryptocol::asymmetric::RSA_2048;
451
452    let private_key = U2048::from_str_radix("67EA9B746A1CD56D22A34A4B4CA0902596D39C7F7B88B2726B7757C1F82628F1F15B51F9A51B22CB932F1CFE59B34178CD6ED42571006CCECC23D2050D3189D4A9175E8BC1DFE77C55EF68E3036BED29BFA70CB76D51D74E54D3535B72CC676899C5FC60021929B939F57CFF92A471A48BFA806FDA2CF942515BC9012AAAE479303614EB9BA52EC8A76CA78AAEA820EC8214AADB70E12492C66060384B609F56395532879C06FA33D7242E55D30AD79BE7D6F8E97152405ABC7097AF6DBEF5B7D2DCD1D414BB29E387327025D66F6D32142C858DC33BC6861A7A95AF46431FDB6AD3B3108E7AA0387CCF99504DC882E2FB2E127CB981123421A629908EC4570B", 16).unwrap();
453    let public_key = U2048::from(3_u8);
454    let modulus = U2048::from_str_radix("9bdfe92e9f2b4023b3f4ef70f2f0d838623d6abf394d0baba13303a2f4393d6aea08faf677a8b4315cc6ab7d868ce23534263e382980a3363235bb0793ca4ebefda30dd1a2cfdb3a80e71d548521e3be9f7a931323fac2f57f3cfd092c329b1ce6a8fa900325be95d6f03b7f5bf6aa76d1f7c0a7c74375e37a09ad81c00056b7637cc194d65b80229e6fa2fa18106eb682877e4763bdf6aa0315332a8709dd120b407a9e5d48f90b0b361b8b5c85ca5c2578aa01abdf00361fa3fca45a180b3211abaae3642188c455af8147f7cf31ac1cbb9532aaabbaecb40eb96c24bea9bc0c8ca36d83a25d73f14b13bf45de7e6483c246de199f10d89bad30b81a0f887b", 16).unwrap();
455
456    let rsa = RSA_2048::new_with_keys(public_key, private_key, modulus);
457    println!("RSA_2048: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
458    println!("RSA_2048: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
459
460    // Example for RSA_4096
461    use cryptocol::asymmetric::RSA_4096;
462
463    let private_key = U4096::from_str_radix("16D9A2A76977853F423E2DDBA4AECBA372B95E082577329BCA5852F4400907D2B34366C1DD35B01EE9A2483E823E635EB7492797BE652252E131EADD6A68CCFA952B49A7F09B9AB2653386B2DEEF6874F2724392C4544BEF7D18E83E7CEF59E21F550C23CE848A05A19DE2D97347946E86F734FCA112938024608A9C5C1D72D658F369B49D3A4C77ADB6483C632AAE94F345791F9313D304277B1E4275F72F7C9B7C2DAB7DA91B94C807E5553FE534A923D22206F6A987CB9214FCA3EB78CE22A434CBAF7C3DF29010688F7930E9EB2BBF6113DE6A35F78EFCFC9A17A868277BAD58F432F097405E3F9415FE4E15D11D8D5376747F6046DF74AE76C5B50D28C5D972724F09E84FD057DAC07625C06ACE068A171480D73F51CAF7728F9EE0F0D4F794F81B2AFCD7C15898C7C5B964130F0D4EA1819999CDBC8E000C500DF8FECCEB9EB8AA75C16EAA6C02C61A3129B49472136E1231BB9D563BFAF93B1322DF047F9FF7CDB74610AF49E7ADD790746C5DB31B1D48888764511AE10FF2F22BF4D1CBFE809A9C716D9C4043C59120BC5EA9CC0CA20C06D6DF11B0574E534757F9BC78617CB484C988871A065348DF542869140D0D0F58EB3A76E2E1394C21D8FFEEC315CFA03DC70269234EACFD8AEFDBCDF0C0EAE6C743135FFA2B504F937BD9F473F10862C2D59C38FAAEDB9E930EB9264723B90923B40056594592A16D7D0D9D", 16).unwrap();
464    let public_key = U4096::from(5_u8);
465    let modulus = U4096::from_str_radix("c72dbd530230cce40abeb30a9a33b60708cd8c4ef63091dcfe3f16ae76e1e10436e7004154dd34a85dbd0f0813e36b8ccc0fae90f5b5f3f20e915e9e276f6dd78f1eeb77f5016e7f6cdba95b31866f2ef6519dfb1e855acfa27f815134aaf70f3af39af5013a1971bc9558e476e9fc4ef2b0938fe0c42036f569879441cbe44ff664b937de05120c57823398d91e7cb389319fa8d6c50470ae7c83540b1e467d93a1d77a7e543845b3735aaa9b5a93543e286172b02ff34843c5d9075f0d2586754a4858c675641dc293d431fe5df11f3f8e7be802b8d566226b497e9cdcae7ce988ae6d8747771ebfb2eb235c58b9f08984c25336695731e5a13044139baf6a84137b163fb48e30d63809adc3853559e92df2420167d8eab2907724cbd33f5d712080a97195557b5e492c4472aba6e3dd9afe5ca37f2ccdff168d89e2ae6640935eb32f07fbb29663d320e65f14602974ac30124f1030f331db97f94471772e7a4a62074d517ea8c38bfac2492ca54bfa565c06e70263eab20c5f682d78b01a446a7a074b6ec5b14844fb28649eb9f746d7936ba191d9a7890a1f96bb3f4caa06a97383da413042e9c2b898f4397a1628d236607a0e0c1e4ef32a3d3d9ac59b0aab6632e85420be5de39ceb11b01c5fe3ee45d40418d8f21e894b292df523f570f96419ed5c3c0d0382b73ccec1f57976d790544d4ece8ebd145be1c130e827", 16).unwrap();
466
467    let rsa = RSA_4096::new_with_keys(public_key, private_key, modulus);
468    println!("RSA_4096: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
469    println!("RSA_4096: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
470
471    // Example for RSA_Genric
472    use cryptocol::asymmetric::RSA_Generic;
473
474    let private_key = U512::from_str_radix("46CAC62F340DCC24A6FD1C603B57B4EE361C7C4370B01D769E53BC74CABC6153", 16).unwrap();
475    let public_key = U512::from(3_u8);
476    let modulus = U512::from_str_radix("6a302946ce14b236fa7baa9059038f669cf8c4f1988fe647d4583bd600fecf6d", 16).unwrap();
477
478    let rsa = RSA_Generic::<16, u32, 5>::new_with_keys(public_key, private_key, modulus);
479    println!("RSA_Generic: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
480    println!("RSA_Generic: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
481
482    // Example for RSA_1024_u128
483    use cryptocol::asymmetric::RSA_1024_u128;
484
485    let private_key = U1024::from_str_radix("6F21015F58239A612E66501D445CC4F221AB05A16AD9BCD5F3494E44397BCDED845BA62788A4B6C4E008A120F0FD7D45E96CFDB6CC0EF621889A39BA55037EE32946DCB260FB638EF573CA2F4BB3C922A91EA2719E0BC1268410E862D1A2BDF7317970DBDA5AC089FFA1A74DC097AAF08AEEEFAF34DDB1DF172B0743D43B0B", 16).unwrap();
486    let public_key = U1024::from(7_u8);
487    let modulus = U1024::from_str_radix("c772e0c82db6549484796c056c18b9ee836f8504611a3792df4b71e78a65992e6366f1f3024dd571b591cdd2a7d7e19a52d1ff6ffff40ba2fda3229ead5e90f2af877de674a7443acfbbeb3a3e5b1968cef3f6bdf0639edaa94174fa8c6d4701fca2d46a041f6ea3e0e921c70434781fd49f1b31f6cc2970aeefc981490b47e5", 16).unwrap();
488
489    let rsa = RSA_1024_u128::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
490    println!("RSA_1024_u128: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
491    println!("RSA_1024_u128: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
492
493    // Example for RSA_2048_u128
494    use cryptocol::asymmetric::RSA_2048_u128;
495
496    let private_key = U2048::from_str_radix("67EA9B746A1CD56D22A34A4B4CA0902596D39C7F7B88B2726B7757C1F82628F1F15B51F9A51B22CB932F1CFE59B34178CD6ED42571006CCECC23D2050D3189D4A9175E8BC1DFE77C55EF68E3036BED29BFA70CB76D51D74E54D3535B72CC676899C5FC60021929B939F57CFF92A471A48BFA806FDA2CF942515BC9012AAAE479303614EB9BA52EC8A76CA78AAEA820EC8214AADB70E12492C66060384B609F56395532879C06FA33D7242E55D30AD79BE7D6F8E97152405ABC7097AF6DBEF5B7D2DCD1D414BB29E387327025D66F6D32142C858DC33BC6861A7A95AF46431FDB6AD3B3108E7AA0387CCF99504DC882E2FB2E127CB981123421A629908EC4570B", 16).unwrap();
497    let public_key = U2048::from(3_u8);
498    let modulus = U2048::from_str_radix("9bdfe92e9f2b4023b3f4ef70f2f0d838623d6abf394d0baba13303a2f4393d6aea08faf677a8b4315cc6ab7d868ce23534263e382980a3363235bb0793ca4ebefda30dd1a2cfdb3a80e71d548521e3be9f7a931323fac2f57f3cfd092c329b1ce6a8fa900325be95d6f03b7f5bf6aa76d1f7c0a7c74375e37a09ad81c00056b7637cc194d65b80229e6fa2fa18106eb682877e4763bdf6aa0315332a8709dd120b407a9e5d48f90b0b361b8b5c85ca5c2578aa01abdf00361fa3fca45a180b3211abaae3642188c455af8147f7cf31ac1cbb9532aaabbaecb40eb96c24bea9bc0c8ca36d83a25d73f14b13bf45de7e6483c246de199f10d89bad30b81a0f887b", 16).unwrap();
499
500    let rsa = RSA_2048_u128::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
501    println!("RSA_2048_u128: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
502    println!("RSA_2048_u128: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
503
504    // Example for RSA_4096_u128
505    use cryptocol::asymmetric::RSA_4096_u128;
506
507    let private_key = U4096::from_str_radix("16D9A2A76977853F423E2DDBA4AECBA372B95E082577329BCA5852F4400907D2B34366C1DD35B01EE9A2483E823E635EB7492797BE652252E131EADD6A68CCFA952B49A7F09B9AB2653386B2DEEF6874F2724392C4544BEF7D18E83E7CEF59E21F550C23CE848A05A19DE2D97347946E86F734FCA112938024608A9C5C1D72D658F369B49D3A4C77ADB6483C632AAE94F345791F9313D304277B1E4275F72F7C9B7C2DAB7DA91B94C807E5553FE534A923D22206F6A987CB9214FCA3EB78CE22A434CBAF7C3DF29010688F7930E9EB2BBF6113DE6A35F78EFCFC9A17A868277BAD58F432F097405E3F9415FE4E15D11D8D5376747F6046DF74AE76C5B50D28C5D972724F09E84FD057DAC07625C06ACE068A171480D73F51CAF7728F9EE0F0D4F794F81B2AFCD7C15898C7C5B964130F0D4EA1819999CDBC8E000C500DF8FECCEB9EB8AA75C16EAA6C02C61A3129B49472136E1231BB9D563BFAF93B1322DF047F9FF7CDB74610AF49E7ADD790746C5DB31B1D48888764511AE10FF2F22BF4D1CBFE809A9C716D9C4043C59120BC5EA9CC0CA20C06D6DF11B0574E534757F9BC78617CB484C988871A065348DF542869140D0D0F58EB3A76E2E1394C21D8FFEEC315CFA03DC70269234EACFD8AEFDBCDF0C0EAE6C743135FFA2B504F937BD9F473F10862C2D59C38FAAEDB9E930EB9264723B90923B40056594592A16D7D0D9D", 16).unwrap();
508    let public_key = U4096::from(5_u8);
509    let modulus = U4096::from_str_radix("c72dbd530230cce40abeb30a9a33b60708cd8c4ef63091dcfe3f16ae76e1e10436e7004154dd34a85dbd0f0813e36b8ccc0fae90f5b5f3f20e915e9e276f6dd78f1eeb77f5016e7f6cdba95b31866f2ef6519dfb1e855acfa27f815134aaf70f3af39af5013a1971bc9558e476e9fc4ef2b0938fe0c42036f569879441cbe44ff664b937de05120c57823398d91e7cb389319fa8d6c50470ae7c83540b1e467d93a1d77a7e543845b3735aaa9b5a93543e286172b02ff34843c5d9075f0d2586754a4858c675641dc293d431fe5df11f3f8e7be802b8d566226b497e9cdcae7ce988ae6d8747771ebfb2eb235c58b9f08984c25336695731e5a13044139baf6a84137b163fb48e30d63809adc3853559e92df2420167d8eab2907724cbd33f5d712080a97195557b5e492c4472aba6e3dd9afe5ca37f2ccdff168d89e2ae6640935eb32f07fbb29663d320e65f14602974ac30124f1030f331db97f94471772e7a4a62074d517ea8c38bfac2492ca54bfa565c06e70263eab20c5f682d78b01a446a7a074b6ec5b14844fb28649eb9f746d7936ba191d9a7890a1f96bb3f4caa06a97383da413042e9c2b898f4397a1628d236607a0e0c1e4ef32a3d3d9ac59b0aab6632e85420be5de39ceb11b01c5fe3ee45d40418d8f21e894b292df523f570f96419ed5c3c0d0382b73ccec1f57976d790544d4ece8ebd145be1c130e827", 16).unwrap();
510
511    let rsa = RSA_4096_u128::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
512    println!("RSA_4096_u128: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
513    println!("RSA_4096_u128: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
514
515    // Example for RSA_1024_u64
516    use cryptocol::asymmetric::RSA_1024_u64;
517
518    let private_key = U1024::from_str_radix("6F21015F58239A612E66501D445CC4F221AB05A16AD9BCD5F3494E44397BCDED845BA62788A4B6C4E008A120F0FD7D45E96CFDB6CC0EF621889A39BA55037EE32946DCB260FB638EF573CA2F4BB3C922A91EA2719E0BC1268410E862D1A2BDF7317970DBDA5AC089FFA1A74DC097AAF08AEEEFAF34DDB1DF172B0743D43B0B", 16).unwrap();
519    let public_key = U1024::from(7_u8);
520    let modulus = U1024::from_str_radix("c772e0c82db6549484796c056c18b9ee836f8504611a3792df4b71e78a65992e6366f1f3024dd571b591cdd2a7d7e19a52d1ff6ffff40ba2fda3229ead5e90f2af877de674a7443acfbbeb3a3e5b1968cef3f6bdf0639edaa94174fa8c6d4701fca2d46a041f6ea3e0e921c70434781fd49f1b31f6cc2970aeefc981490b47e5", 16).unwrap();
521
522    let rsa = RSA_1024_u64::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
523    println!("RSA_1024_u64: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
524    println!("RSA_1024_u64: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
525
526    // Example for RSA_2048_u64
527    use cryptocol::asymmetric::RSA_2048_u64;
528
529    let private_key = U2048::from_str_radix("67EA9B746A1CD56D22A34A4B4CA0902596D39C7F7B88B2726B7757C1F82628F1F15B51F9A51B22CB932F1CFE59B34178CD6ED42571006CCECC23D2050D3189D4A9175E8BC1DFE77C55EF68E3036BED29BFA70CB76D51D74E54D3535B72CC676899C5FC60021929B939F57CFF92A471A48BFA806FDA2CF942515BC9012AAAE479303614EB9BA52EC8A76CA78AAEA820EC8214AADB70E12492C66060384B609F56395532879C06FA33D7242E55D30AD79BE7D6F8E97152405ABC7097AF6DBEF5B7D2DCD1D414BB29E387327025D66F6D32142C858DC33BC6861A7A95AF46431FDB6AD3B3108E7AA0387CCF99504DC882E2FB2E127CB981123421A629908EC4570B", 16).unwrap();
530    let public_key = U2048::from(3_u8);
531    let modulus = U2048::from_str_radix("9bdfe92e9f2b4023b3f4ef70f2f0d838623d6abf394d0baba13303a2f4393d6aea08faf677a8b4315cc6ab7d868ce23534263e382980a3363235bb0793ca4ebefda30dd1a2cfdb3a80e71d548521e3be9f7a931323fac2f57f3cfd092c329b1ce6a8fa900325be95d6f03b7f5bf6aa76d1f7c0a7c74375e37a09ad81c00056b7637cc194d65b80229e6fa2fa18106eb682877e4763bdf6aa0315332a8709dd120b407a9e5d48f90b0b361b8b5c85ca5c2578aa01abdf00361fa3fca45a180b3211abaae3642188c455af8147f7cf31ac1cbb9532aaabbaecb40eb96c24bea9bc0c8ca36d83a25d73f14b13bf45de7e6483c246de199f10d89bad30b81a0f887b", 16).unwrap();
532
533    let rsa = RSA_2048_u64::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
534    println!("RSA_2048_u64: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
535    println!("RSA_2048_u64: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
536
537    // Example for RSA_4096_u64
538    use cryptocol::asymmetric::RSA_4096_u64;
539
540    let private_key = U4096::from_str_radix("16D9A2A76977853F423E2DDBA4AECBA372B95E082577329BCA5852F4400907D2B34366C1DD35B01EE9A2483E823E635EB7492797BE652252E131EADD6A68CCFA952B49A7F09B9AB2653386B2DEEF6874F2724392C4544BEF7D18E83E7CEF59E21F550C23CE848A05A19DE2D97347946E86F734FCA112938024608A9C5C1D72D658F369B49D3A4C77ADB6483C632AAE94F345791F9313D304277B1E4275F72F7C9B7C2DAB7DA91B94C807E5553FE534A923D22206F6A987CB9214FCA3EB78CE22A434CBAF7C3DF29010688F7930E9EB2BBF6113DE6A35F78EFCFC9A17A868277BAD58F432F097405E3F9415FE4E15D11D8D5376747F6046DF74AE76C5B50D28C5D972724F09E84FD057DAC07625C06ACE068A171480D73F51CAF7728F9EE0F0D4F794F81B2AFCD7C15898C7C5B964130F0D4EA1819999CDBC8E000C500DF8FECCEB9EB8AA75C16EAA6C02C61A3129B49472136E1231BB9D563BFAF93B1322DF047F9FF7CDB74610AF49E7ADD790746C5DB31B1D48888764511AE10FF2F22BF4D1CBFE809A9C716D9C4043C59120BC5EA9CC0CA20C06D6DF11B0574E534757F9BC78617CB484C988871A065348DF542869140D0D0F58EB3A76E2E1394C21D8FFEEC315CFA03DC70269234EACFD8AEFDBCDF0C0EAE6C743135FFA2B504F937BD9F473F10862C2D59C38FAAEDB9E930EB9264723B90923B40056594592A16D7D0D9D", 16).unwrap();
541    let public_key = U4096::from(5_u8);
542    let modulus = U4096::from_str_radix("c72dbd530230cce40abeb30a9a33b60708cd8c4ef63091dcfe3f16ae76e1e10436e7004154dd34a85dbd0f0813e36b8ccc0fae90f5b5f3f20e915e9e276f6dd78f1eeb77f5016e7f6cdba95b31866f2ef6519dfb1e855acfa27f815134aaf70f3af39af5013a1971bc9558e476e9fc4ef2b0938fe0c42036f569879441cbe44ff664b937de05120c57823398d91e7cb389319fa8d6c50470ae7c83540b1e467d93a1d77a7e543845b3735aaa9b5a93543e286172b02ff34843c5d9075f0d2586754a4858c675641dc293d431fe5df11f3f8e7be802b8d566226b497e9cdcae7ce988ae6d8747771ebfb2eb235c58b9f08984c25336695731e5a13044139baf6a84137b163fb48e30d63809adc3853559e92df2420167d8eab2907724cbd33f5d712080a97195557b5e492c4472aba6e3dd9afe5ca37f2ccdff168d89e2ae6640935eb32f07fbb29663d320e65f14602974ac30124f1030f331db97f94471772e7a4a62074d517ea8c38bfac2492ca54bfa565c06e70263eab20c5f682d78b01a446a7a074b6ec5b14844fb28649eb9f746d7936ba191d9a7890a1f96bb3f4caa06a97383da413042e9c2b898f4397a1628d236607a0e0c1e4ef32a3d3d9ac59b0aab6632e85420be5de39ceb11b01c5fe3ee45d40418d8f21e894b292df523f570f96419ed5c3c0d0382b73ccec1f57976d790544d4ece8ebd145be1c130e827", 16).unwrap();
543
544    let rsa = RSA_4096_u64::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
545    println!("RSA_4096_u64: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
546    println!("RSA_4096_u64: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
547
548    // Example for RSA_1024_u32
549    use cryptocol::asymmetric::RSA_1024_u32;
550
551    let private_key = U1024::from_str_radix("6F21015F58239A612E66501D445CC4F221AB05A16AD9BCD5F3494E44397BCDED845BA62788A4B6C4E008A120F0FD7D45E96CFDB6CC0EF621889A39BA55037EE32946DCB260FB638EF573CA2F4BB3C922A91EA2719E0BC1268410E862D1A2BDF7317970DBDA5AC089FFA1A74DC097AAF08AEEEFAF34DDB1DF172B0743D43B0B", 16).unwrap();
552    let public_key = U1024::from(7_u8);
553    let modulus = U1024::from_str_radix("c772e0c82db6549484796c056c18b9ee836f8504611a3792df4b71e78a65992e6366f1f3024dd571b591cdd2a7d7e19a52d1ff6ffff40ba2fda3229ead5e90f2af877de674a7443acfbbeb3a3e5b1968cef3f6bdf0639edaa94174fa8c6d4701fca2d46a041f6ea3e0e921c70434781fd49f1b31f6cc2970aeefc981490b47e5", 16).unwrap();
554
555    let rsa = RSA_1024_u32::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
556    println!("RSA_1024_u32: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
557    println!("RSA_1024_u32: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
558
559    // Example for RSA_2048_u32
560    use cryptocol::asymmetric::RSA_2048_u32;
561
562    let private_key = U2048::from_str_radix("67EA9B746A1CD56D22A34A4B4CA0902596D39C7F7B88B2726B7757C1F82628F1F15B51F9A51B22CB932F1CFE59B34178CD6ED42571006CCECC23D2050D3189D4A9175E8BC1DFE77C55EF68E3036BED29BFA70CB76D51D74E54D3535B72CC676899C5FC60021929B939F57CFF92A471A48BFA806FDA2CF942515BC9012AAAE479303614EB9BA52EC8A76CA78AAEA820EC8214AADB70E12492C66060384B609F56395532879C06FA33D7242E55D30AD79BE7D6F8E97152405ABC7097AF6DBEF5B7D2DCD1D414BB29E387327025D66F6D32142C858DC33BC6861A7A95AF46431FDB6AD3B3108E7AA0387CCF99504DC882E2FB2E127CB981123421A629908EC4570B", 16).unwrap();
563    let public_key = U2048::from(3_u8);
564    let modulus = U2048::from_str_radix("9bdfe92e9f2b4023b3f4ef70f2f0d838623d6abf394d0baba13303a2f4393d6aea08faf677a8b4315cc6ab7d868ce23534263e382980a3363235bb0793ca4ebefda30dd1a2cfdb3a80e71d548521e3be9f7a931323fac2f57f3cfd092c329b1ce6a8fa900325be95d6f03b7f5bf6aa76d1f7c0a7c74375e37a09ad81c00056b7637cc194d65b80229e6fa2fa18106eb682877e4763bdf6aa0315332a8709dd120b407a9e5d48f90b0b361b8b5c85ca5c2578aa01abdf00361fa3fca45a180b3211abaae3642188c455af8147f7cf31ac1cbb9532aaabbaecb40eb96c24bea9bc0c8ca36d83a25d73f14b13bf45de7e6483c246de199f10d89bad30b81a0f887b", 16).unwrap();
565
566    let rsa = RSA_2048_u32::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
567    println!("RSA_2048_u32: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
568    println!("RSA_2048_u32: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
569
570    // Example for RSA_4096_u32
571    use cryptocol::asymmetric::RSA_4096_u32;
572
573    let private_key = U4096::from_str_radix("16D9A2A76977853F423E2DDBA4AECBA372B95E082577329BCA5852F4400907D2B34366C1DD35B01EE9A2483E823E635EB7492797BE652252E131EADD6A68CCFA952B49A7F09B9AB2653386B2DEEF6874F2724392C4544BEF7D18E83E7CEF59E21F550C23CE848A05A19DE2D97347946E86F734FCA112938024608A9C5C1D72D658F369B49D3A4C77ADB6483C632AAE94F345791F9313D304277B1E4275F72F7C9B7C2DAB7DA91B94C807E5553FE534A923D22206F6A987CB9214FCA3EB78CE22A434CBAF7C3DF29010688F7930E9EB2BBF6113DE6A35F78EFCFC9A17A868277BAD58F432F097405E3F9415FE4E15D11D8D5376747F6046DF74AE76C5B50D28C5D972724F09E84FD057DAC07625C06ACE068A171480D73F51CAF7728F9EE0F0D4F794F81B2AFCD7C15898C7C5B964130F0D4EA1819999CDBC8E000C500DF8FECCEB9EB8AA75C16EAA6C02C61A3129B49472136E1231BB9D563BFAF93B1322DF047F9FF7CDB74610AF49E7ADD790746C5DB31B1D48888764511AE10FF2F22BF4D1CBFE809A9C716D9C4043C59120BC5EA9CC0CA20C06D6DF11B0574E534757F9BC78617CB484C988871A065348DF542869140D0D0F58EB3A76E2E1394C21D8FFEEC315CFA03DC70269234EACFD8AEFDBCDF0C0EAE6C743135FFA2B504F937BD9F473F10862C2D59C38FAAEDB9E930EB9264723B90923B40056594592A16D7D0D9D", 16).unwrap();
574    let public_key = U4096::from(5_u8);
575    let modulus = U4096::from_str_radix("c72dbd530230cce40abeb30a9a33b60708cd8c4ef63091dcfe3f16ae76e1e10436e7004154dd34a85dbd0f0813e36b8ccc0fae90f5b5f3f20e915e9e276f6dd78f1eeb77f5016e7f6cdba95b31866f2ef6519dfb1e855acfa27f815134aaf70f3af39af5013a1971bc9558e476e9fc4ef2b0938fe0c42036f569879441cbe44ff664b937de05120c57823398d91e7cb389319fa8d6c50470ae7c83540b1e467d93a1d77a7e543845b3735aaa9b5a93543e286172b02ff34843c5d9075f0d2586754a4858c675641dc293d431fe5df11f3f8e7be802b8d566226b497e9cdcae7ce988ae6d8747771ebfb2eb235c58b9f08984c25336695731e5a13044139baf6a84137b163fb48e30d63809adc3853559e92df2420167d8eab2907724cbd33f5d712080a97195557b5e492c4472aba6e3dd9afe5ca37f2ccdff168d89e2ae6640935eb32f07fbb29663d320e65f14602974ac30124f1030f331db97f94471772e7a4a62074d517ea8c38bfac2492ca54bfa565c06e70263eab20c5f682d78b01a446a7a074b6ec5b14844fb28649eb9f746d7936ba191d9a7890a1f96bb3f4caa06a97383da413042e9c2b898f4397a1628d236607a0e0c1e4ef32a3d3d9ac59b0aab6632e85420be5de39ceb11b01c5fe3ee45d40418d8f21e894b292df523f570f96419ed5c3c0d0382b73ccec1f57976d790544d4ece8ebd145be1c130e827", 16).unwrap();
576
577    let rsa = RSA_4096_u32::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
578    println!("RSA_4096_u32: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
579    println!("RSA_4096_u32: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
580
581    // Example for RSA_1024_u16
582    use cryptocol::asymmetric::RSA_1024_u16;
583
584    let private_key = U1024::from_str_radix("6F21015F58239A612E66501D445CC4F221AB05A16AD9BCD5F3494E44397BCDED845BA62788A4B6C4E008A120F0FD7D45E96CFDB6CC0EF621889A39BA55037EE32946DCB260FB638EF573CA2F4BB3C922A91EA2719E0BC1268410E862D1A2BDF7317970DBDA5AC089FFA1A74DC097AAF08AEEEFAF34DDB1DF172B0743D43B0B", 16).unwrap();
585    let public_key = U1024::from(7_u8);
586    let modulus = U1024::from_str_radix("c772e0c82db6549484796c056c18b9ee836f8504611a3792df4b71e78a65992e6366f1f3024dd571b591cdd2a7d7e19a52d1ff6ffff40ba2fda3229ead5e90f2af877de674a7443acfbbeb3a3e5b1968cef3f6bdf0639edaa94174fa8c6d4701fca2d46a041f6ea3e0e921c70434781fd49f1b31f6cc2970aeefc981490b47e5", 16).unwrap();
587
588    let rsa = RSA_1024_u16::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
589    println!("RSA_1024_u16: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
590    println!("RSA_1024_u16: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
591
592    // Example for RSA_2048_u16
593    use cryptocol::asymmetric::RSA_2048_u16;
594
595    let private_key = U2048::from_str_radix("67EA9B746A1CD56D22A34A4B4CA0902596D39C7F7B88B2726B7757C1F82628F1F15B51F9A51B22CB932F1CFE59B34178CD6ED42571006CCECC23D2050D3189D4A9175E8BC1DFE77C55EF68E3036BED29BFA70CB76D51D74E54D3535B72CC676899C5FC60021929B939F57CFF92A471A48BFA806FDA2CF942515BC9012AAAE479303614EB9BA52EC8A76CA78AAEA820EC8214AADB70E12492C66060384B609F56395532879C06FA33D7242E55D30AD79BE7D6F8E97152405ABC7097AF6DBEF5B7D2DCD1D414BB29E387327025D66F6D32142C858DC33BC6861A7A95AF46431FDB6AD3B3108E7AA0387CCF99504DC882E2FB2E127CB981123421A629908EC4570B", 16).unwrap();
596    let public_key = U2048::from(3_u8);
597    let modulus = U2048::from_str_radix("9bdfe92e9f2b4023b3f4ef70f2f0d838623d6abf394d0baba13303a2f4393d6aea08faf677a8b4315cc6ab7d868ce23534263e382980a3363235bb0793ca4ebefda30dd1a2cfdb3a80e71d548521e3be9f7a931323fac2f57f3cfd092c329b1ce6a8fa900325be95d6f03b7f5bf6aa76d1f7c0a7c74375e37a09ad81c00056b7637cc194d65b80229e6fa2fa18106eb682877e4763bdf6aa0315332a8709dd120b407a9e5d48f90b0b361b8b5c85ca5c2578aa01abdf00361fa3fca45a180b3211abaae3642188c455af8147f7cf31ac1cbb9532aaabbaecb40eb96c24bea9bc0c8ca36d83a25d73f14b13bf45de7e6483c246de199f10d89bad30b81a0f887b", 16).unwrap();
598
599    let rsa = RSA_2048_u16::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
600    println!("RSA_2048_u16: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
601    println!("RSA_2048_u16: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
602
603    // Example for RSA_4096_u16
604    use cryptocol::asymmetric::RSA_4096_u16;
605
606    let private_key = U4096::from_str_radix("16D9A2A76977853F423E2DDBA4AECBA372B95E082577329BCA5852F4400907D2B34366C1DD35B01EE9A2483E823E635EB7492797BE652252E131EADD6A68CCFA952B49A7F09B9AB2653386B2DEEF6874F2724392C4544BEF7D18E83E7CEF59E21F550C23CE848A05A19DE2D97347946E86F734FCA112938024608A9C5C1D72D658F369B49D3A4C77ADB6483C632AAE94F345791F9313D304277B1E4275F72F7C9B7C2DAB7DA91B94C807E5553FE534A923D22206F6A987CB9214FCA3EB78CE22A434CBAF7C3DF29010688F7930E9EB2BBF6113DE6A35F78EFCFC9A17A868277BAD58F432F097405E3F9415FE4E15D11D8D5376747F6046DF74AE76C5B50D28C5D972724F09E84FD057DAC07625C06ACE068A171480D73F51CAF7728F9EE0F0D4F794F81B2AFCD7C15898C7C5B964130F0D4EA1819999CDBC8E000C500DF8FECCEB9EB8AA75C16EAA6C02C61A3129B49472136E1231BB9D563BFAF93B1322DF047F9FF7CDB74610AF49E7ADD790746C5DB31B1D48888764511AE10FF2F22BF4D1CBFE809A9C716D9C4043C59120BC5EA9CC0CA20C06D6DF11B0574E534757F9BC78617CB484C988871A065348DF542869140D0D0F58EB3A76E2E1394C21D8FFEEC315CFA03DC70269234EACFD8AEFDBCDF0C0EAE6C743135FFA2B504F937BD9F473F10862C2D59C38FAAEDB9E930EB9264723B90923B40056594592A16D7D0D9D", 16).unwrap();
607    let public_key = U4096::from(5_u8);
608    let modulus = U4096::from_str_radix("c72dbd530230cce40abeb30a9a33b60708cd8c4ef63091dcfe3f16ae76e1e10436e7004154dd34a85dbd0f0813e36b8ccc0fae90f5b5f3f20e915e9e276f6dd78f1eeb77f5016e7f6cdba95b31866f2ef6519dfb1e855acfa27f815134aaf70f3af39af5013a1971bc9558e476e9fc4ef2b0938fe0c42036f569879441cbe44ff664b937de05120c57823398d91e7cb389319fa8d6c50470ae7c83540b1e467d93a1d77a7e543845b3735aaa9b5a93543e286172b02ff34843c5d9075f0d2586754a4858c675641dc293d431fe5df11f3f8e7be802b8d566226b497e9cdcae7ce988ae6d8747771ebfb2eb235c58b9f08984c25336695731e5a13044139baf6a84137b163fb48e30d63809adc3853559e92df2420167d8eab2907724cbd33f5d712080a97195557b5e492c4472aba6e3dd9afe5ca37f2ccdff168d89e2ae6640935eb32f07fbb29663d320e65f14602974ac30124f1030f331db97f94471772e7a4a62074d517ea8c38bfac2492ca54bfa565c06e70263eab20c5f682d78b01a446a7a074b6ec5b14844fb28649eb9f746d7936ba191d9a7890a1f96bb3f4caa06a97383da413042e9c2b898f4397a1628d236607a0e0c1e4ef32a3d3d9ac59b0aab6632e85420be5de39ceb11b01c5fe3ee45d40418d8f21e894b292df523f570f96419ed5c3c0d0382b73ccec1f57976d790544d4ece8ebd145be1c130e827", 16).unwrap();
609
610    let rsa = RSA_4096_u16::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
611    println!("RSA_4096_u16: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
612    println!("RSA_4096_u16: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
613
614    // Example for RSA_1024_u8
615    use cryptocol::asymmetric::RSA_1024_u8;
616
617    let private_key = U1024::from_str_radix("6F21015F58239A612E66501D445CC4F221AB05A16AD9BCD5F3494E44397BCDED845BA62788A4B6C4E008A120F0FD7D45E96CFDB6CC0EF621889A39BA55037EE32946DCB260FB638EF573CA2F4BB3C922A91EA2719E0BC1268410E862D1A2BDF7317970DBDA5AC089FFA1A74DC097AAF08AEEEFAF34DDB1DF172B0743D43B0B", 16).unwrap();
618    let public_key = U1024::from(7_u8);
619    let modulus = U1024::from_str_radix("c772e0c82db6549484796c056c18b9ee836f8504611a3792df4b71e78a65992e6366f1f3024dd571b591cdd2a7d7e19a52d1ff6ffff40ba2fda3229ead5e90f2af877de674a7443acfbbeb3a3e5b1968cef3f6bdf0639edaa94174fa8c6d4701fca2d46a041f6ea3e0e921c70434781fd49f1b31f6cc2970aeefc981490b47e5", 16).unwrap();
620
621    let rsa = RSA_1024_u8::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
622    println!("RSA_1024_u8: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
623    println!("RSA_1024_u8: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
624
625    // Example for RSA_2048_u8
626    use cryptocol::asymmetric::RSA_2048_u8;
627
628    let private_key = U2048::from_str_radix("67EA9B746A1CD56D22A34A4B4CA0902596D39C7F7B88B2726B7757C1F82628F1F15B51F9A51B22CB932F1CFE59B34178CD6ED42571006CCECC23D2050D3189D4A9175E8BC1DFE77C55EF68E3036BED29BFA70CB76D51D74E54D3535B72CC676899C5FC60021929B939F57CFF92A471A48BFA806FDA2CF942515BC9012AAAE479303614EB9BA52EC8A76CA78AAEA820EC8214AADB70E12492C66060384B609F56395532879C06FA33D7242E55D30AD79BE7D6F8E97152405ABC7097AF6DBEF5B7D2DCD1D414BB29E387327025D66F6D32142C858DC33BC6861A7A95AF46431FDB6AD3B3108E7AA0387CCF99504DC882E2FB2E127CB981123421A629908EC4570B", 16).unwrap();
629    let public_key = U2048::from(3_u8);
630    let modulus = U2048::from_str_radix("9bdfe92e9f2b4023b3f4ef70f2f0d838623d6abf394d0baba13303a2f4393d6aea08faf677a8b4315cc6ab7d868ce23534263e382980a3363235bb0793ca4ebefda30dd1a2cfdb3a80e71d548521e3be9f7a931323fac2f57f3cfd092c329b1ce6a8fa900325be95d6f03b7f5bf6aa76d1f7c0a7c74375e37a09ad81c00056b7637cc194d65b80229e6fa2fa18106eb682877e4763bdf6aa0315332a8709dd120b407a9e5d48f90b0b361b8b5c85ca5c2578aa01abdf00361fa3fca45a180b3211abaae3642188c455af8147f7cf31ac1cbb9532aaabbaecb40eb96c24bea9bc0c8ca36d83a25d73f14b13bf45de7e6483c246de199f10d89bad30b81a0f887b", 16).unwrap();
631
632    let rsa = RSA_2048_u8::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
633    println!("RSA_2048_u8: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
634    println!("RSA_2048_u8: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
635
636    // Example for RSA_4096_u8
637    use cryptocol::asymmetric::RSA_4096_u8;
638
639    let private_key = U4096::from_str_radix("16D9A2A76977853F423E2DDBA4AECBA372B95E082577329BCA5852F4400907D2B34366C1DD35B01EE9A2483E823E635EB7492797BE652252E131EADD6A68CCFA952B49A7F09B9AB2653386B2DEEF6874F2724392C4544BEF7D18E83E7CEF59E21F550C23CE848A05A19DE2D97347946E86F734FCA112938024608A9C5C1D72D658F369B49D3A4C77ADB6483C632AAE94F345791F9313D304277B1E4275F72F7C9B7C2DAB7DA91B94C807E5553FE534A923D22206F6A987CB9214FCA3EB78CE22A434CBAF7C3DF29010688F7930E9EB2BBF6113DE6A35F78EFCFC9A17A868277BAD58F432F097405E3F9415FE4E15D11D8D5376747F6046DF74AE76C5B50D28C5D972724F09E84FD057DAC07625C06ACE068A171480D73F51CAF7728F9EE0F0D4F794F81B2AFCD7C15898C7C5B964130F0D4EA1819999CDBC8E000C500DF8FECCEB9EB8AA75C16EAA6C02C61A3129B49472136E1231BB9D563BFAF93B1322DF047F9FF7CDB74610AF49E7ADD790746C5DB31B1D48888764511AE10FF2F22BF4D1CBFE809A9C716D9C4043C59120BC5EA9CC0CA20C06D6DF11B0574E534757F9BC78617CB484C988871A065348DF542869140D0D0F58EB3A76E2E1394C21D8FFEEC315CFA03DC70269234EACFD8AEFDBCDF0C0EAE6C743135FFA2B504F937BD9F473F10862C2D59C38FAAEDB9E930EB9264723B90923B40056594592A16D7D0D9D", 16).unwrap();
640    let public_key = U4096::from(5_u8);
641    let modulus = U4096::from_str_radix("c72dbd530230cce40abeb30a9a33b60708cd8c4ef63091dcfe3f16ae76e1e10436e7004154dd34a85dbd0f0813e36b8ccc0fae90f5b5f3f20e915e9e276f6dd78f1eeb77f5016e7f6cdba95b31866f2ef6519dfb1e855acfa27f815134aaf70f3af39af5013a1971bc9558e476e9fc4ef2b0938fe0c42036f569879441cbe44ff664b937de05120c57823398d91e7cb389319fa8d6c50470ae7c83540b1e467d93a1d77a7e543845b3735aaa9b5a93543e286172b02ff34843c5d9075f0d2586754a4858c675641dc293d431fe5df11f3f8e7be802b8d566226b497e9cdcae7ce988ae6d8747771ebfb2eb235c58b9f08984c25336695731e5a13044139baf6a84137b163fb48e30d63809adc3853559e92df2420167d8eab2907724cbd33f5d712080a97195557b5e492c4472aba6e3dd9afe5ca37f2ccdff168d89e2ae6640935eb32f07fbb29663d320e65f14602974ac30124f1030f331db97f94471772e7a4a62074d517ea8c38bfac2492ca54bfa565c06e70263eab20c5f682d78b01a446a7a074b6ec5b14844fb28649eb9f746d7936ba191d9a7890a1f96bb3f4caa06a97383da413042e9c2b898f4397a1628d236607a0e0c1e4ef32a3d3d9ac59b0aab6632e85420be5de39ceb11b01c5fe3ee45d40418d8f21e894b292df523f570f96419ed5c3c0d0382b73ccec1f57976d790544d4ece8ebd145be1c130e827", 16).unwrap();
642
643    let rsa = RSA_4096_u8::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
644    println!("RSA_4096_u8: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
645    println!("RSA_4096_u8: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
646    println!("-------------------------------");
647}
648
649fn rsa_new_with_primes()
650{
651    println!("rsa_new_with_primes");
652    use cryptocol::define_utypes_with;
653    define_utypes_with!(u16);
654
655    let mut thread = Vec::<fn()>::new();
656    
657    // Example for RSA_1024
658    thread.push(||{
659        use cryptocol::asymmetric::RSA_1024;
660
661        let prime1 = U512::from_str_radix("FF119CE47EE8EBDC06F87902569A80FBB66DF6514FB6CFAE8210ADBD4F9D4071", 16).unwrap();
662        let prime2 = U512::from_str_radix("975BA2539AA5CE0A8AFB43EDDDBDE7EE6432274E8DC17F6A3543DFBBAA3ED30B", 16).unwrap();
663
664        let rsa = RSA_1024::new_with_primes(prime1.into_biguint(), prime2.into_biguint());
665        println!("RSA_1024: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
666        println!("RSA_1024: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
667    });
668
669    // Example for RSA_2048
670    thread.push(||{
671        use cryptocol::asymmetric::RSA_2048;
672
673        let prime1 = U1024::from_str_radix("FFA2F7E4403DB8E0E647FACC4B514D4D7F8108EE7F7AF0ED6796A2BE34F535B81F229AE4765B5773478F40BED7E78CEC7181344512D11497C68B2F5EC3E66EA9", 16).unwrap();
674        let prime2 = U1024::from_str_radix("DD94ECE66B19E7201B165E79C6A63F5FAF1207A3F75EECB1CAF944CB06F47D4610163F46035834981B419A64AAD2C39575F4D10FBFF01DFAFAB3C1106E2D0E97", 16).unwrap();
675
676        let rsa = RSA_2048::new_with_primes(prime1.into_biguint(), prime2.into_biguint());
677        println!("RSA_2048: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
678        println!("RSA_2048: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
679    });
680    
681    // Example for RSA_4096
682    thread.push(||{
683        use cryptocol::asymmetric::RSA_4096;
684
685        let prime1 = U2048::from_str_radix("9EEA9259F72AB061072A91DD5BB8A5C8C0ED450C427A235B3123F331DB9229C826AD0440E3CA467B1A139134224574133594CBDB74A14A79BBDB148F56405BAFAD66B9912B492928BD0568E3E1530D17164C30AD1EC791B835DCE536233A76405E249B1B735A22892F16B670B5A61007814FF79A85AA69E6251F9BED3CE8170B", 16).unwrap();
686        let prime2 = U2048::from_str_radix("94A16F977E8532F43A8A87C2EDC63A8B6D9930F99AA80EE1BC0E38C088B5128EC6539B32420D513757E16D41C338146A13A9107730BCC7C53CA73BC5FC2D9D3685806610C8602158BA28DF64AC0D27A66195EEC59FB424B21DA52D0A5B78034299C7CF14207175C856AC0171BA0AADDA6B75651554627C8A4BD028F43E81DC8F", 16).unwrap();
687
688        let rsa = RSA_4096::new_with_primes(prime1.into_biguint(), prime2.into_biguint());
689        println!("RSA_4096: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
690        println!("RSA_4096: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
691    });
692    
693    // Example for RSA_Genric
694    thread.push(||{
695        use cryptocol::asymmetric::RSA_Generic;
696
697        let prime1 = U512::from_str_radix("83CD305566CAC6013CC9A4230B040C64CFA7E50948208099BFB2744DD0DE8307", 16).unwrap();
698        let prime2 = U512::from_str_radix("EA2A0C0B9696A6249323A66E5B4C2A8DD2E3417D3F9B3F48E603AD85943547DF", 16).unwrap();
699
700        let rsa = RSA_Generic::<32, u16, 5>::new_with_primes(prime1, prime2);
701        println!("RSA_Generic: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
702        println!("RSA_Generic: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
703    });
704    
705    // Example for RSA_1024_u128
706    thread.push(||{
707        use cryptocol::asymmetric::RSA_1024_u128;
708
709        let prime1 = U512::from_str_radix("FF119CE47EE8EBDC06F87902569A80FBB66DF6514FB6CFAE8210ADBD4F9D4071", 16).unwrap();
710        let prime2 = U512::from_str_radix("975BA2539AA5CE0A8AFB43EDDDBDE7EE6432274E8DC17F6A3543DFBBAA3ED30B", 16).unwrap();
711
712        let rsa = RSA_1024_u128::new_with_primes(prime1.into_biguint(), prime2.into_biguint());
713        println!("RSA_1024_u128: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
714        println!("RSA_1024_u128: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
715    });
716
717    // Example for RSA_2048_u128
718    thread.push(||{
719        use cryptocol::asymmetric::RSA_2048_u128;
720
721        let prime1 = U1024::from_str_radix("FFA2F7E4403DB8E0E647FACC4B514D4D7F8108EE7F7AF0ED6796A2BE34F535B81F229AE4765B5773478F40BED7E78CEC7181344512D11497C68B2F5EC3E66EA9", 16).unwrap();
722        let prime2 = U1024::from_str_radix("DD94ECE66B19E7201B165E79C6A63F5FAF1207A3F75EECB1CAF944CB06F47D4610163F46035834981B419A64AAD2C39575F4D10FBFF01DFAFAB3C1106E2D0E97", 16).unwrap();
723
724        let rsa = RSA_2048_u128::new_with_primes(prime1.into_biguint(), prime2.into_biguint());
725        println!("RSA_2048_u128: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
726        println!("RSA_2048_u128: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
727    });
728    
729    // Example for RSA_4096_u128
730    thread.push(||{
731        use cryptocol::asymmetric::RSA_4096_u128;
732
733        let prime1 = U2048::from_str_radix("9EEA9259F72AB061072A91DD5BB8A5C8C0ED450C427A235B3123F331DB9229C826AD0440E3CA467B1A139134224574133594CBDB74A14A79BBDB148F56405BAFAD66B9912B492928BD0568E3E1530D17164C30AD1EC791B835DCE536233A76405E249B1B735A22892F16B670B5A61007814FF79A85AA69E6251F9BED3CE8170B", 16).unwrap();
734        let prime2 = U2048::from_str_radix("94A16F977E8532F43A8A87C2EDC63A8B6D9930F99AA80EE1BC0E38C088B5128EC6539B32420D513757E16D41C338146A13A9107730BCC7C53CA73BC5FC2D9D3685806610C8602158BA28DF64AC0D27A66195EEC59FB424B21DA52D0A5B78034299C7CF14207175C856AC0171BA0AADDA6B75651554627C8A4BD028F43E81DC8F", 16).unwrap();
735
736        let rsa = RSA_4096_u128::new_with_primes(prime1.into_biguint(), prime2.into_biguint());
737        println!("RSA_4096_u128: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
738        println!("RSA_4096_u128: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
739    });
740    
741    // Example for RSA_1024_u64
742    thread.push(||{
743        use cryptocol::asymmetric::RSA_1024_u64;
744
745        let prime1 = U512::from_str_radix("FF119CE47EE8EBDC06F87902569A80FBB66DF6514FB6CFAE8210ADBD4F9D4071", 16).unwrap();
746        let prime2 = U512::from_str_radix("975BA2539AA5CE0A8AFB43EDDDBDE7EE6432274E8DC17F6A3543DFBBAA3ED30B", 16).unwrap();
747
748        let rsa = RSA_1024_u64::new_with_primes(prime1.into_biguint(), prime2.into_biguint());
749        println!("RSA_1024_u64: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
750        println!("RSA_1024_u64: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
751    });
752
753    // Example for RSA_2048_u64
754    thread.push(||{
755        use cryptocol::asymmetric::RSA_2048_u64;
756
757        let prime1 = U1024::from_str_radix("FFA2F7E4403DB8E0E647FACC4B514D4D7F8108EE7F7AF0ED6796A2BE34F535B81F229AE4765B5773478F40BED7E78CEC7181344512D11497C68B2F5EC3E66EA9", 16).unwrap();
758        let prime2 = U1024::from_str_radix("DD94ECE66B19E7201B165E79C6A63F5FAF1207A3F75EECB1CAF944CB06F47D4610163F46035834981B419A64AAD2C39575F4D10FBFF01DFAFAB3C1106E2D0E97", 16).unwrap();
759
760        let rsa = RSA_2048_u64::new_with_primes(prime1.into_biguint(), prime2.into_biguint());
761        println!("RSA_2048_u64: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
762        println!("RSA_2048_u64: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
763    });
764    
765    // Example for RSA_4096_u64
766    thread.push(||{
767        use cryptocol::asymmetric::RSA_4096_u64;
768
769        let prime1 = U2048::from_str_radix("9EEA9259F72AB061072A91DD5BB8A5C8C0ED450C427A235B3123F331DB9229C826AD0440E3CA467B1A139134224574133594CBDB74A14A79BBDB148F56405BAFAD66B9912B492928BD0568E3E1530D17164C30AD1EC791B835DCE536233A76405E249B1B735A22892F16B670B5A61007814FF79A85AA69E6251F9BED3CE8170B", 16).unwrap();
770        let prime2 = U2048::from_str_radix("94A16F977E8532F43A8A87C2EDC63A8B6D9930F99AA80EE1BC0E38C088B5128EC6539B32420D513757E16D41C338146A13A9107730BCC7C53CA73BC5FC2D9D3685806610C8602158BA28DF64AC0D27A66195EEC59FB424B21DA52D0A5B78034299C7CF14207175C856AC0171BA0AADDA6B75651554627C8A4BD028F43E81DC8F", 16).unwrap();
771
772        let rsa = RSA_4096_u64::new_with_primes(prime1.into_biguint(), prime2.into_biguint());
773        println!("RSA_4096_u64: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
774        println!("RSA_4096_u64: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
775    });
776    
777    // Example for RSA_1024_u32
778    thread.push(||{
779        use cryptocol::asymmetric::RSA_1024_u32;
780
781        let prime1 = U512::from_str_radix("FF119CE47EE8EBDC06F87902569A80FBB66DF6514FB6CFAE8210ADBD4F9D4071", 16).unwrap();
782        let prime2 = U512::from_str_radix("975BA2539AA5CE0A8AFB43EDDDBDE7EE6432274E8DC17F6A3543DFBBAA3ED30B", 16).unwrap();
783
784        let rsa = RSA_1024_u32::new_with_primes(prime1.into_biguint(), prime2.into_biguint());
785        println!("RSA_1024_u32: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
786        println!("RSA_1024_u32: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
787    });
788
789    // Example for RSA_2048_u32
790    thread.push(||{
791        use cryptocol::asymmetric::RSA_2048_u32;
792
793        let prime1 = U1024::from_str_radix("FFA2F7E4403DB8E0E647FACC4B514D4D7F8108EE7F7AF0ED6796A2BE34F535B81F229AE4765B5773478F40BED7E78CEC7181344512D11497C68B2F5EC3E66EA9", 16).unwrap();
794        let prime2 = U1024::from_str_radix("DD94ECE66B19E7201B165E79C6A63F5FAF1207A3F75EECB1CAF944CB06F47D4610163F46035834981B419A64AAD2C39575F4D10FBFF01DFAFAB3C1106E2D0E97", 16).unwrap();
795
796        let rsa = RSA_2048_u32::new_with_primes(prime1.into_biguint(), prime2.into_biguint());
797        println!("RSA_2048_u32: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
798        println!("RSA_2048_u32: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
799    });
800    
801    // Example for RSA_4096_u32
802    thread.push(||{
803        use cryptocol::asymmetric::RSA_4096_u32;
804
805        let prime1 = U2048::from_str_radix("9EEA9259F72AB061072A91DD5BB8A5C8C0ED450C427A235B3123F331DB9229C826AD0440E3CA467B1A139134224574133594CBDB74A14A79BBDB148F56405BAFAD66B9912B492928BD0568E3E1530D17164C30AD1EC791B835DCE536233A76405E249B1B735A22892F16B670B5A61007814FF79A85AA69E6251F9BED3CE8170B", 16).unwrap();
806        let prime2 = U2048::from_str_radix("94A16F977E8532F43A8A87C2EDC63A8B6D9930F99AA80EE1BC0E38C088B5128EC6539B32420D513757E16D41C338146A13A9107730BCC7C53CA73BC5FC2D9D3685806610C8602158BA28DF64AC0D27A66195EEC59FB424B21DA52D0A5B78034299C7CF14207175C856AC0171BA0AADDA6B75651554627C8A4BD028F43E81DC8F", 16).unwrap();
807
808        let rsa = RSA_4096_u32::new_with_primes(prime1.into_biguint(), prime2.into_biguint());
809        println!("RSA_4096_u32: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
810        println!("RSA_4096_u32: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
811    });
812    
813    // Example for RSA_1024_u16
814    thread.push(||{
815        use cryptocol::asymmetric::RSA_1024_u16;
816
817        let prime1 = U512::from_str_radix("FF119CE47EE8EBDC06F87902569A80FBB66DF6514FB6CFAE8210ADBD4F9D4071", 16).unwrap();
818        let prime2 = U512::from_str_radix("975BA2539AA5CE0A8AFB43EDDDBDE7EE6432274E8DC17F6A3543DFBBAA3ED30B", 16).unwrap();
819
820        let rsa = RSA_1024_u16::new_with_primes(prime1.into_biguint(), prime2.into_biguint());
821        println!("RSA_1024_u16: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
822        println!("RSA_1024_u16: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
823    });
824
825    // Example for RSA_2048_u16
826    thread.push(||{
827        use cryptocol::asymmetric::RSA_2048_u16;
828
829        let prime1 = U1024::from_str_radix("FFA2F7E4403DB8E0E647FACC4B514D4D7F8108EE7F7AF0ED6796A2BE34F535B81F229AE4765B5773478F40BED7E78CEC7181344512D11497C68B2F5EC3E66EA9", 16).unwrap();
830        let prime2 = U1024::from_str_radix("DD94ECE66B19E7201B165E79C6A63F5FAF1207A3F75EECB1CAF944CB06F47D4610163F46035834981B419A64AAD2C39575F4D10FBFF01DFAFAB3C1106E2D0E97", 16).unwrap();
831
832        let rsa = RSA_2048_u16::new_with_primes(prime1.into_biguint(), prime2.into_biguint());
833        println!("RSA_2048_u16: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
834        println!("RSA_2048_u16: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
835    });
836    
837    // Example for RSA_4096_u16
838    thread.push(||{
839        use cryptocol::asymmetric::RSA_4096_u16;
840
841        let prime1 = U2048::from_str_radix("9EEA9259F72AB061072A91DD5BB8A5C8C0ED450C427A235B3123F331DB9229C826AD0440E3CA467B1A139134224574133594CBDB74A14A79BBDB148F56405BAFAD66B9912B492928BD0568E3E1530D17164C30AD1EC791B835DCE536233A76405E249B1B735A22892F16B670B5A61007814FF79A85AA69E6251F9BED3CE8170B", 16).unwrap();
842        let prime2 = U2048::from_str_radix("94A16F977E8532F43A8A87C2EDC63A8B6D9930F99AA80EE1BC0E38C088B5128EC6539B32420D513757E16D41C338146A13A9107730BCC7C53CA73BC5FC2D9D3685806610C8602158BA28DF64AC0D27A66195EEC59FB424B21DA52D0A5B78034299C7CF14207175C856AC0171BA0AADDA6B75651554627C8A4BD028F43E81DC8F", 16).unwrap();
843
844        let rsa = RSA_4096_u16::new_with_primes(prime1.into_biguint(), prime2.into_biguint());
845        println!("RSA_4096_u16: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
846        println!("RSA_4096_u16: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
847    });
848    
849    // Example for RSA_1024_u8
850    thread.push(||{
851        use cryptocol::asymmetric::RSA_1024_u8;
852
853        let prime1 = U512::from_str_radix("FF119CE47EE8EBDC06F87902569A80FBB66DF6514FB6CFAE8210ADBD4F9D4071", 16).unwrap();
854        let prime2 = U512::from_str_radix("975BA2539AA5CE0A8AFB43EDDDBDE7EE6432274E8DC17F6A3543DFBBAA3ED30B", 16).unwrap();
855
856        let rsa = RSA_1024_u8::new_with_primes(prime1.into_biguint(), prime2.into_biguint());
857        println!("RSA_1024_u8: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
858        println!("RSA_1024_u8: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
859    });
860
861    // Example for RSA_2048_u8
862    thread.push(||{
863        use cryptocol::asymmetric::RSA_2048_u8;
864
865        let prime1 = U1024::from_str_radix("FFA2F7E4403DB8E0E647FACC4B514D4D7F8108EE7F7AF0ED6796A2BE34F535B81F229AE4765B5773478F40BED7E78CEC7181344512D11497C68B2F5EC3E66EA9", 16).unwrap();
866        let prime2 = U1024::from_str_radix("DD94ECE66B19E7201B165E79C6A63F5FAF1207A3F75EECB1CAF944CB06F47D4610163F46035834981B419A64AAD2C39575F4D10FBFF01DFAFAB3C1106E2D0E97", 16).unwrap();
867
868        let rsa = RSA_2048_u8::new_with_primes(prime1.into_biguint(), prime2.into_biguint());
869        println!("RSA_2048_u8: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
870        println!("RSA_2048_u8: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
871    });
872    
873    // Example for RSA_4096_u8
874    thread.push(||{
875        use cryptocol::asymmetric::RSA_4096_u8;
876
877        let prime1 = U2048::from_str_radix("9EEA9259F72AB061072A91DD5BB8A5C8C0ED450C427A235B3123F331DB9229C826AD0440E3CA467B1A139134224574133594CBDB74A14A79BBDB148F56405BAFAD66B9912B492928BD0568E3E1530D17164C30AD1EC791B835DCE536233A76405E249B1B735A22892F16B670B5A61007814FF79A85AA69E6251F9BED3CE8170B", 16).unwrap();
878        let prime2 = U2048::from_str_radix("94A16F977E8532F43A8A87C2EDC63A8B6D9930F99AA80EE1BC0E38C088B5128EC6539B32420D513757E16D41C338146A13A9107730BCC7C53CA73BC5FC2D9D3685806610C8602158BA28DF64AC0D27A66195EEC59FB424B21DA52D0A5B78034299C7CF14207175C856AC0171BA0AADDA6B75651554627C8A4BD028F43E81DC8F", 16).unwrap();
879
880        let rsa = RSA_4096_u8::new_with_primes(prime1.into_biguint(), prime2.into_biguint());
881        println!("RSA_4096_u8: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
882        println!("RSA_4096_u8: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
883    });
884
885    do_simultaneously(thread);
886    println!("-------------------------------");
887}
888
889fn rsa_new_with_prepared_keys()
890{
891    println!("rsa_new_with_prepared_keys");
892    
893    // Example for RSA_1024
894    use cryptocol::asymmetric::RSA_1024;
895
896    let rsa = RSA_1024::new_with_prepared_keys();
897    let private_key = rsa.get_private_key();
898    let public_key = rsa.get_public_key();
899    let modulus = rsa.get_modulus();
900    println!("RSA_1024: private key = {:X}:{:x}", private_key, modulus);
901    println!("RSA_1024: public key = {:X}:{:x}", public_key, modulus);
902    
903    // Example for RSA_2048
904    use cryptocol::asymmetric::RSA_2048;
905
906    let rsa = RSA_2048::new_with_prepared_keys();
907    let private_key = rsa.get_private_key();
908    let public_key = rsa.get_public_key();
909    let modulus = rsa.get_modulus();
910    println!("RSA_2048: private key = {:X}:{:x}", private_key, modulus);
911    println!("RSA_2048: public key = {:X}:{:x}", public_key, modulus);
912    
913    // Example for RSA_4096
914    use cryptocol::asymmetric::RSA_4096;
915
916    let rsa = RSA_4096::new_with_prepared_keys();
917    let private_key = rsa.get_private_key();
918    let public_key = rsa.get_public_key();
919    let modulus = rsa.get_modulus();
920    println!("RSA_4096: private key = {:X}:{:x}", private_key, modulus);
921    println!("RSA_4096: public key = {:X}:{:x}", public_key, modulus);
922    
923    // Example for RSA_Genric
924    use cryptocol::asymmetric::RSA_Generic;
925
926    let rsa = RSA_Generic::<8, u32, 5>::new_with_prepared_keys();
927    let private_key = rsa.get_private_key();
928    let public_key = rsa.get_public_key();
929    let modulus = rsa.get_modulus();
930    println!("RSA_Generic<8, u32, 5>: private key = {:X}:{:x}", private_key, modulus);
931    println!("RSA_Generic<8, u32, 5>: public key = {:X}:{:x}", public_key, modulus);
932    
933    // Example for RSA_1024_u128
934    use cryptocol::asymmetric::RSA_1024_u128;
935
936    let rsa = RSA_1024_u128::new_with_prepared_keys();
937    let private_key = rsa.get_private_key();
938    let public_key = rsa.get_public_key();
939    let modulus = rsa.get_modulus();
940    println!("RSA_1024_u128: private key = {:X}:{:x}", private_key, modulus);
941    println!("RSA_1024_u128: public key = {:X}:{:x}", public_key, modulus);
942
943    // Example for RSA_2048_u128
944    use cryptocol::asymmetric::RSA_2048_u128;
945
946    let rsa = RSA_2048_u128::new_with_prepared_keys();
947    let private_key = rsa.get_private_key();
948    let public_key = rsa.get_public_key();
949    let modulus = rsa.get_modulus();
950    println!("RSA_2048_u128: private key = {:X}:{:x}", private_key, modulus);
951    println!("RSA_2048_u128: public key = {:X}:{:x}", public_key, modulus);
952    
953    // Example for RSA_4096_u128
954    use cryptocol::asymmetric::RSA_4096_u128;
955
956    let rsa = RSA_4096_u128::new_with_prepared_keys();
957    let private_key = rsa.get_private_key();
958    let public_key = rsa.get_public_key();
959    let modulus = rsa.get_modulus();
960    println!("RSA_4096_u128: private key = {:X}:{:x}", private_key, modulus);
961    println!("RSA_4096_u128: public key = {:X}:{:x}", public_key, modulus);
962    
963    // Example for RSA_1024_u64
964    use cryptocol::asymmetric::RSA_1024_u64;
965
966    let rsa = RSA_1024_u64::new_with_prepared_keys();
967    let private_key = rsa.get_private_key();
968    let public_key = rsa.get_public_key();
969    let modulus = rsa.get_modulus();
970    println!("RSA_1024_u64: private key = {:X}:{:x}", private_key, modulus);
971    println!("RSA_1024_u64: public key = {:X}:{:x}", public_key, modulus);
972
973    // Example for RSA_2048_u64
974    use cryptocol::asymmetric::RSA_2048_u64;
975
976    let rsa = RSA_2048_u64::new_with_prepared_keys();
977    let private_key = rsa.get_private_key();
978    let public_key = rsa.get_public_key();
979    let modulus = rsa.get_modulus();
980    println!("RSA_2048_u64: private key = {:X}:{:x}", private_key, modulus);
981    println!("RSA_2048_u64: public key = {:X}:{:x}", public_key, modulus);
982    
983    // Example for RSA_4096_u64
984    use cryptocol::asymmetric::RSA_4096_u64;
985
986    let rsa = RSA_4096_u64::new_with_prepared_keys();
987    let private_key = rsa.get_private_key();
988    let public_key = rsa.get_public_key();
989    let modulus = rsa.get_modulus();
990    println!("RSA_4096_u64: private key = {:X}:{:x}", private_key, modulus);
991    println!("RSA_4096_u64: public key = {:X}:{:x}", public_key, modulus);
992    
993    // Example for RSA_1024_u32
994    use cryptocol::asymmetric::RSA_1024_u32;
995
996    let rsa = RSA_1024_u32::new_with_prepared_keys();
997    let private_key = rsa.get_private_key();
998    let public_key = rsa.get_public_key();
999    let modulus = rsa.get_modulus();
1000    println!("RSA_1024_u32: private key = {:X}:{:x}", private_key, modulus);
1001    println!("RSA_1024_u32: public key = {:X}:{:x}", public_key, modulus);
1002
1003    // Example for RSA_2048_u32
1004    use cryptocol::asymmetric::RSA_2048_u32;
1005
1006    let rsa = RSA_2048_u32::new_with_prepared_keys();
1007    let private_key = rsa.get_private_key();
1008    let public_key = rsa.get_public_key();
1009    let modulus = rsa.get_modulus();
1010    println!("RSA_2048_u32: private key = {:X}:{:x}", private_key, modulus);
1011    println!("RSA_2048_u32: public key = {:X}:{:x}", public_key, modulus);
1012    
1013    // Example for RSA_4096_u32
1014    use cryptocol::asymmetric::RSA_4096_u32;
1015
1016    let rsa = RSA_4096_u32::new_with_prepared_keys();
1017    let private_key = rsa.get_private_key();
1018    let public_key = rsa.get_public_key();
1019    let modulus = rsa.get_modulus();
1020    println!("RSA_4096_u32: private key = {:X}:{:x}", private_key, modulus);
1021    println!("RSA_4096_u32: public key = {:X}:{:x}", public_key, modulus);
1022    
1023    // Example for RSA_1024_u16
1024    use cryptocol::asymmetric::RSA_1024_u16;
1025
1026    let rsa = RSA_1024_u16::new_with_prepared_keys();
1027    let private_key = rsa.get_private_key();
1028    let public_key = rsa.get_public_key();
1029    let modulus = rsa.get_modulus();
1030    println!("RSA_1024_u16: private key = {:X}:{:x}", private_key, modulus);
1031    println!("RSA_1024_u16: public key = {:X}:{:x}", public_key, modulus);
1032
1033    // Example for RSA_2048_u16
1034    use cryptocol::asymmetric::RSA_2048_u16;
1035
1036    let rsa = RSA_2048_u16::new_with_prepared_keys();
1037    let private_key = rsa.get_private_key();
1038    let public_key = rsa.get_public_key();
1039    let modulus = rsa.get_modulus();
1040    println!("RSA_2048_u16: private key = {:X}:{:x}", private_key, modulus);
1041    println!("RSA_2048_u16: public key = {:X}:{:x}", public_key, modulus);
1042    
1043    // Example for RSA_4096_u16
1044    use cryptocol::asymmetric::RSA_4096_u16;
1045
1046    let rsa = RSA_4096_u16::new_with_prepared_keys();
1047    let private_key = rsa.get_private_key();
1048    let public_key = rsa.get_public_key();
1049    let modulus = rsa.get_modulus();
1050    println!("RSA_4096_u16: private key = {:X}:{:x}", private_key, modulus);
1051    println!("RSA_4096_u16: public key = {:X}:{:x}", public_key, modulus);
1052    
1053    // Example for RSA_1024_u8
1054    use cryptocol::asymmetric::RSA_1024_u8;
1055
1056    let rsa = RSA_1024_u8::new_with_prepared_keys();
1057    let private_key = rsa.get_private_key();
1058    let public_key = rsa.get_public_key();
1059    let modulus = rsa.get_modulus();
1060    println!("RSA_1024_u8: private key = {:X}:{:x}", private_key, modulus);
1061    println!("RSA_1024_u8: public key = {:X}:{:x}", public_key, modulus);
1062
1063    // Example for RSA_2048_u8
1064    use cryptocol::asymmetric::RSA_2048_u8;
1065
1066    let rsa = RSA_2048_u8::new_with_prepared_keys();
1067    let private_key = rsa.get_private_key();
1068    let public_key = rsa.get_public_key();
1069    let modulus = rsa.get_modulus();
1070    println!("RSA_2048_u8: private key = {:X}:{:x}", private_key, modulus);
1071    println!("RSA_2048_u8: public key = {:X}:{:x}", public_key, modulus);
1072    
1073    // Example for RSA_4096_u8
1074    use cryptocol::asymmetric::RSA_4096_u8;
1075
1076    let rsa = RSA_4096_u8::new_with_prepared_keys();
1077    let private_key = rsa.get_private_key();
1078    let public_key = rsa.get_public_key();
1079    let modulus = rsa.get_modulus();
1080    println!("RSA_4096_u8: private key = {:X}:{:x}", private_key, modulus);
1081    println!("RSA_4096_u8: public key = {:X}:{:x}", public_key, modulus);
1082    println!("-------------------------------");
1083}
1084
1085fn rsa_set_keys()
1086{
1087    println!("rsa_find_keys");
1088    use cryptocol::number::BigUInt;
1089    use cryptocol::define_utypes_with;
1090    define_utypes_with!(u32);
1091    
1092    // Example for RSA_1024
1093    use cryptocol::asymmetric::RSA_1024;
1094
1095    let mut rsa = RSA_1024::new();
1096    rsa.set_public_key(U1024::from(7_u8));
1097    rsa.set_private_key(U1024::from_str_radix("6F21015F58239A612E66501D445CC4F221AB05A16AD9BCD5F3494E44397BCDED845BA62788A4B6C4E008A120F0FD7D45E96CFDB6CC0EF621889A39BA55037EE32946DCB260FB638EF573CA2F4BB3C922A91EA2719E0BC1268410E862D1A2BDF7317970DBDA5AC089FFA1A74DC097AAF08AEEEFAF34DDB1DF172B0743D43B0B", 16).unwrap());
1098    rsa.set_modulus(U1024::from_str_radix("c772e0c82db6549484796c056c18b9ee836f8504611a3792df4b71e78a65992e6366f1f3024dd571b591cdd2a7d7e19a52d1ff6ffff40ba2fda3229ead5e90f2af877de674a7443acfbbeb3a3e5b1968cef3f6bdf0639edaa94174fa8c6d4701fca2d46a041f6ea3e0e921c70434781fd49f1b31f6cc2970aeefc981490b47e5", 16).unwrap());
1099    let private_key = rsa.get_private_key();
1100    let public_key = rsa.get_public_key();
1101    let modulus = rsa.get_modulus();
1102    println!("RSA_1024: private key = {:X}:{:x}", private_key, modulus);
1103    println!("RSA_1024: public key = {:X}:{:x}", public_key, modulus);
1104
1105    // Example for RSA_2048
1106    use cryptocol::asymmetric::RSA_2048;
1107
1108    let mut rsa = RSA_2048::new();
1109    rsa.set_public_key(U2048::from(7_u8));
1110    rsa.set_private_key(U2048::from_str_radix("67EA9B746A1CD56D22A34A4B4CA0902596D39C7F7B88B2726B7757C1F82628F1F15B51F9A51B22CB932F1CFE59B34178CD6ED42571006CCECC23D2050D3189D4A9175E8BC1DFE77C55EF68E3036BED29BFA70CB76D51D74E54D3535B72CC676899C5FC60021929B939F57CFF92A471A48BFA806FDA2CF942515BC9012AAAE479303614EB9BA52EC8A76CA78AAEA820EC8214AADB70E12492C66060384B609F56395532879C06FA33D7242E55D30AD79BE7D6F8E97152405ABC7097AF6DBEF5B7D2DCD1D414BB29E387327025D66F6D32142C858DC33BC6861A7A95AF46431FDB6AD3B3108E7AA0387CCF99504DC882E2FB2E127CB981123421A629908EC4570B", 16).unwrap());
1111    rsa.set_modulus(U2048::from_str_radix("9bdfe92e9f2b4023b3f4ef70f2f0d838623d6abf394d0baba13303a2f4393d6aea08faf677a8b4315cc6ab7d868ce23534263e382980a3363235bb0793ca4ebefda30dd1a2cfdb3a80e71d548521e3be9f7a931323fac2f57f3cfd092c329b1ce6a8fa900325be95d6f03b7f5bf6aa76d1f7c0a7c74375e37a09ad81c00056b7637cc194d65b80229e6fa2fa18106eb682877e4763bdf6aa0315332a8709dd120b407a9e5d48f90b0b361b8b5c85ca5c2578aa01abdf00361fa3fca45a180b3211abaae3642188c455af8147f7cf31ac1cbb9532aaabbaecb40eb96c24bea9bc0c8ca36d83a25d73f14b13bf45de7e6483c246de199f10d89bad30b81a0f887b", 16).unwrap());
1112    let private_key = rsa.get_private_key();
1113    let public_key = rsa.get_public_key();
1114    let modulus = rsa.get_modulus();
1115    println!("RSA_2048: private key = {:X}:{:x}", private_key, modulus);
1116    println!("RSA_2048: public key = {:X}:{:x}", public_key, modulus);
1117    
1118    // Example for RSA_4096
1119    use cryptocol::asymmetric::RSA_4096;
1120
1121    let mut rsa = RSA_4096::new();
1122    rsa.set_public_key(U4096::from(5_u8));
1123    rsa.set_private_key(U4096::from_str_radix("16D9A2A76977853F423E2DDBA4AECBA372B95E082577329BCA5852F4400907D2B34366C1DD35B01EE9A2483E823E635EB7492797BE652252E131EADD6A68CCFA952B49A7F09B9AB2653386B2DEEF6874F2724392C4544BEF7D18E83E7CEF59E21F550C23CE848A05A19DE2D97347946E86F734FCA112938024608A9C5C1D72D658F369B49D3A4C77ADB6483C632AAE94F345791F9313D304277B1E4275F72F7C9B7C2DAB7DA91B94C807E5553FE534A923D22206F6A987CB9214FCA3EB78CE22A434CBAF7C3DF29010688F7930E9EB2BBF6113DE6A35F78EFCFC9A17A868277BAD58F432F097405E3F9415FE4E15D11D8D5376747F6046DF74AE76C5B50D28C5D972724F09E84FD057DAC07625C06ACE068A171480D73F51CAF7728F9EE0F0D4F794F81B2AFCD7C15898C7C5B964130F0D4EA1819999CDBC8E000C500DF8FECCEB9EB8AA75C16EAA6C02C61A3129B49472136E1231BB9D563BFAF93B1322DF047F9FF7CDB74610AF49E7ADD790746C5DB31B1D48888764511AE10FF2F22BF4D1CBFE809A9C716D9C4043C59120BC5EA9CC0CA20C06D6DF11B0574E534757F9BC78617CB484C988871A065348DF542869140D0D0F58EB3A76E2E1394C21D8FFEEC315CFA03DC70269234EACFD8AEFDBCDF0C0EAE6C743135FFA2B504F937BD9F473F10862C2D59C38FAAEDB9E930EB9264723B90923B40056594592A16D7D0D9D", 16).unwrap());
1124    rsa.set_modulus(U4096::from_str_radix("c72dbd530230cce40abeb30a9a33b60708cd8c4ef63091dcfe3f16ae76e1e10436e7004154dd34a85dbd0f0813e36b8ccc0fae90f5b5f3f20e915e9e276f6dd78f1eeb77f5016e7f6cdba95b31866f2ef6519dfb1e855acfa27f815134aaf70f3af39af5013a1971bc9558e476e9fc4ef2b0938fe0c42036f569879441cbe44ff664b937de05120c57823398d91e7cb389319fa8d6c50470ae7c83540b1e467d93a1d77a7e543845b3735aaa9b5a93543e286172b02ff34843c5d9075f0d2586754a4858c675641dc293d431fe5df11f3f8e7be802b8d566226b497e9cdcae7ce988ae6d8747771ebfb2eb235c58b9f08984c25336695731e5a13044139baf6a84137b163fb48e30d63809adc3853559e92df2420167d8eab2907724cbd33f5d712080a97195557b5e492c4472aba6e3dd9afe5ca37f2ccdff168d89e2ae6640935eb32f07fbb29663d320e65f14602974ac30124f1030f331db97f94471772e7a4a62074d517ea8c38bfac2492ca54bfa565c06e70263eab20c5f682d78b01a446a7a074b6ec5b14844fb28649eb9f746d7936ba191d9a7890a1f96bb3f4caa06a97383da413042e9c2b898f4397a1628d236607a0e0c1e4ef32a3d3d9ac59b0aab6632e85420be5de39ceb11b01c5fe3ee45d40418d8f21e894b292df523f570f96419ed5c3c0d0382b73ccec1f57976d790544d4ece8ebd145be1c130e827", 16).unwrap());
1125    let private_key = rsa.get_private_key();
1126    let public_key = rsa.get_public_key();
1127    let modulus = rsa.get_modulus();
1128    println!("RSA_4096: private key = {:X}:{:x}", private_key, modulus);
1129    println!("RSA_4096: public key = {:X}:{:x}", public_key, modulus);
1130    
1131    // Example for RSA_Genric
1132    use cryptocol::asymmetric::RSA_Generic;
1133
1134    let mut rsa = RSA_Generic::<8, u32, 5>::new();
1135    rsa.set_public_key(BigUInt::<u32, 8>::from(3_u8));
1136    rsa.set_private_key(BigUInt::<u32, 8>::from_str_radix("46CAC62F340DCC24A6FD1C603B57B4EE361C7C4370B01D769E53BC74CABC6153", 16).unwrap());
1137    rsa.set_modulus(BigUInt::<u32, 8>::from_str_radix("6a302946ce14b236fa7baa9059038f669cf8c4f1988fe647d4583bd600fecf6d", 16).unwrap());
1138    let private_key = rsa.get_private_key();
1139    let public_key = rsa.get_public_key();
1140    let modulus = rsa.get_modulus();
1141    println!("RSA_Generic<8, u32, 5>: private key = {:X}:{:x}", private_key, modulus);
1142    println!("RSA_Generic<8, u32, 5>: public key = {:X}:{:x}", public_key, modulus);
1143    
1144    // Example for RSA_1024_u128
1145    use cryptocol::asymmetric::RSA_1024_u128;
1146
1147    let mut rsa = RSA_1024_u128::new();
1148    rsa.set_public_key(U1024::from(7_u8).into_biguint());
1149    rsa.set_private_key(U1024::from_str_radix("6F21015F58239A612E66501D445CC4F221AB05A16AD9BCD5F3494E44397BCDED845BA62788A4B6C4E008A120F0FD7D45E96CFDB6CC0EF621889A39BA55037EE32946DCB260FB638EF573CA2F4BB3C922A91EA2719E0BC1268410E862D1A2BDF7317970DBDA5AC089FFA1A74DC097AAF08AEEEFAF34DDB1DF172B0743D43B0B", 16).unwrap().into_biguint());
1150    rsa.set_modulus(U1024::from_str_radix("c772e0c82db6549484796c056c18b9ee836f8504611a3792df4b71e78a65992e6366f1f3024dd571b591cdd2a7d7e19a52d1ff6ffff40ba2fda3229ead5e90f2af877de674a7443acfbbeb3a3e5b1968cef3f6bdf0639edaa94174fa8c6d4701fca2d46a041f6ea3e0e921c70434781fd49f1b31f6cc2970aeefc981490b47e5", 16).unwrap().into_biguint());
1151    let private_key = rsa.get_private_key();
1152    let public_key = rsa.get_public_key();
1153    let modulus = rsa.get_modulus();
1154    println!("RSA_1024_u128: private key = {:X}:{:x}", private_key, modulus);
1155    println!("RSA_1024_u128: public key = {:X}:{:x}", public_key, modulus);
1156    
1157    // Example for RSA_2048_u128
1158    use cryptocol::asymmetric::RSA_2048_u128;
1159
1160    let mut rsa = RSA_2048_u128::new();
1161    rsa.set_public_key(U2048::from(7_u8).into_biguint());
1162    rsa.set_private_key(U2048::from_str_radix("67EA9B746A1CD56D22A34A4B4CA0902596D39C7F7B88B2726B7757C1F82628F1F15B51F9A51B22CB932F1CFE59B34178CD6ED42571006CCECC23D2050D3189D4A9175E8BC1DFE77C55EF68E3036BED29BFA70CB76D51D74E54D3535B72CC676899C5FC60021929B939F57CFF92A471A48BFA806FDA2CF942515BC9012AAAE479303614EB9BA52EC8A76CA78AAEA820EC8214AADB70E12492C66060384B609F56395532879C06FA33D7242E55D30AD79BE7D6F8E97152405ABC7097AF6DBEF5B7D2DCD1D414BB29E387327025D66F6D32142C858DC33BC6861A7A95AF46431FDB6AD3B3108E7AA0387CCF99504DC882E2FB2E127CB981123421A629908EC4570B", 16).unwrap().into_biguint());
1163    rsa.set_modulus(U2048::from_str_radix("9bdfe92e9f2b4023b3f4ef70f2f0d838623d6abf394d0baba13303a2f4393d6aea08faf677a8b4315cc6ab7d868ce23534263e382980a3363235bb0793ca4ebefda30dd1a2cfdb3a80e71d548521e3be9f7a931323fac2f57f3cfd092c329b1ce6a8fa900325be95d6f03b7f5bf6aa76d1f7c0a7c74375e37a09ad81c00056b7637cc194d65b80229e6fa2fa18106eb682877e4763bdf6aa0315332a8709dd120b407a9e5d48f90b0b361b8b5c85ca5c2578aa01abdf00361fa3fca45a180b3211abaae3642188c455af8147f7cf31ac1cbb9532aaabbaecb40eb96c24bea9bc0c8ca36d83a25d73f14b13bf45de7e6483c246de199f10d89bad30b81a0f887b", 16).unwrap().into_biguint());
1164    let private_key = rsa.get_private_key();
1165    let public_key = rsa.get_public_key();
1166    let modulus = rsa.get_modulus();
1167    println!("RSA_2048_u128: private key = {:X}:{:x}", private_key, modulus);
1168    println!("RSA_2048_u128: public key = {:X}:{:x}", public_key, modulus);
1169    
1170    // Example for RSA_4096
1171    use cryptocol::asymmetric::RSA_4096_u128;
1172
1173    let mut rsa = RSA_4096_u128::new();
1174    rsa.set_public_key(U4096::from(5_u8).into_biguint());
1175    rsa.set_private_key(U4096::from_str_radix("16D9A2A76977853F423E2DDBA4AECBA372B95E082577329BCA5852F4400907D2B34366C1DD35B01EE9A2483E823E635EB7492797BE652252E131EADD6A68CCFA952B49A7F09B9AB2653386B2DEEF6874F2724392C4544BEF7D18E83E7CEF59E21F550C23CE848A05A19DE2D97347946E86F734FCA112938024608A9C5C1D72D658F369B49D3A4C77ADB6483C632AAE94F345791F9313D304277B1E4275F72F7C9B7C2DAB7DA91B94C807E5553FE534A923D22206F6A987CB9214FCA3EB78CE22A434CBAF7C3DF29010688F7930E9EB2BBF6113DE6A35F78EFCFC9A17A868277BAD58F432F097405E3F9415FE4E15D11D8D5376747F6046DF74AE76C5B50D28C5D972724F09E84FD057DAC07625C06ACE068A171480D73F51CAF7728F9EE0F0D4F794F81B2AFCD7C15898C7C5B964130F0D4EA1819999CDBC8E000C500DF8FECCEB9EB8AA75C16EAA6C02C61A3129B49472136E1231BB9D563BFAF93B1322DF047F9FF7CDB74610AF49E7ADD790746C5DB31B1D48888764511AE10FF2F22BF4D1CBFE809A9C716D9C4043C59120BC5EA9CC0CA20C06D6DF11B0574E534757F9BC78617CB484C988871A065348DF542869140D0D0F58EB3A76E2E1394C21D8FFEEC315CFA03DC70269234EACFD8AEFDBCDF0C0EAE6C743135FFA2B504F937BD9F473F10862C2D59C38FAAEDB9E930EB9264723B90923B40056594592A16D7D0D9D", 16).unwrap().into_biguint());
1176    rsa.set_modulus(U4096::from_str_radix("c72dbd530230cce40abeb30a9a33b60708cd8c4ef63091dcfe3f16ae76e1e10436e7004154dd34a85dbd0f0813e36b8ccc0fae90f5b5f3f20e915e9e276f6dd78f1eeb77f5016e7f6cdba95b31866f2ef6519dfb1e855acfa27f815134aaf70f3af39af5013a1971bc9558e476e9fc4ef2b0938fe0c42036f569879441cbe44ff664b937de05120c57823398d91e7cb389319fa8d6c50470ae7c83540b1e467d93a1d77a7e543845b3735aaa9b5a93543e286172b02ff34843c5d9075f0d2586754a4858c675641dc293d431fe5df11f3f8e7be802b8d566226b497e9cdcae7ce988ae6d8747771ebfb2eb235c58b9f08984c25336695731e5a13044139baf6a84137b163fb48e30d63809adc3853559e92df2420167d8eab2907724cbd33f5d712080a97195557b5e492c4472aba6e3dd9afe5ca37f2ccdff168d89e2ae6640935eb32f07fbb29663d320e65f14602974ac30124f1030f331db97f94471772e7a4a62074d517ea8c38bfac2492ca54bfa565c06e70263eab20c5f682d78b01a446a7a074b6ec5b14844fb28649eb9f746d7936ba191d9a7890a1f96bb3f4caa06a97383da413042e9c2b898f4397a1628d236607a0e0c1e4ef32a3d3d9ac59b0aab6632e85420be5de39ceb11b01c5fe3ee45d40418d8f21e894b292df523f570f96419ed5c3c0d0382b73ccec1f57976d790544d4ece8ebd145be1c130e827", 16).unwrap().into_biguint());
1177    let private_key = rsa.get_private_key();
1178    let public_key = rsa.get_public_key();
1179    let modulus = rsa.get_modulus();
1180    println!("RSA_4096_u128: private key = {:X}:{:x}", private_key, modulus);
1181    println!("RSA_4096_u128: public key = {:X}:{:x}", public_key, modulus);
1182    
1183    // Example for RSA_1024_u64
1184    use cryptocol::asymmetric::RSA_1024_u64;
1185
1186    let mut rsa = RSA_1024_u64::new();
1187    rsa.set_public_key(U1024::from(7_u8).into_biguint());
1188    rsa.set_private_key(U1024::from_str_radix("6F21015F58239A612E66501D445CC4F221AB05A16AD9BCD5F3494E44397BCDED845BA62788A4B6C4E008A120F0FD7D45E96CFDB6CC0EF621889A39BA55037EE32946DCB260FB638EF573CA2F4BB3C922A91EA2719E0BC1268410E862D1A2BDF7317970DBDA5AC089FFA1A74DC097AAF08AEEEFAF34DDB1DF172B0743D43B0B", 16).unwrap().into_biguint());
1189    rsa.set_modulus(U1024::from_str_radix("c772e0c82db6549484796c056c18b9ee836f8504611a3792df4b71e78a65992e6366f1f3024dd571b591cdd2a7d7e19a52d1ff6ffff40ba2fda3229ead5e90f2af877de674a7443acfbbeb3a3e5b1968cef3f6bdf0639edaa94174fa8c6d4701fca2d46a041f6ea3e0e921c70434781fd49f1b31f6cc2970aeefc981490b47e5", 16).unwrap().into_biguint());
1190    let private_key = rsa.get_private_key();
1191    let public_key = rsa.get_public_key();
1192    let modulus = rsa.get_modulus();
1193    println!("RSA_1024_u64: private key = {:X}:{:x}", private_key, modulus);
1194    println!("RSA_1024_u64: public key = {:X}:{:x}", public_key, modulus);
1195    
1196    // Example for RSA_2048_u64
1197    use cryptocol::asymmetric::RSA_2048_u64;
1198
1199    let mut rsa = RSA_2048_u64::new();
1200    rsa.set_public_key(U2048::from(7_u8).into_biguint());
1201    rsa.set_private_key(U2048::from_str_radix("67EA9B746A1CD56D22A34A4B4CA0902596D39C7F7B88B2726B7757C1F82628F1F15B51F9A51B22CB932F1CFE59B34178CD6ED42571006CCECC23D2050D3189D4A9175E8BC1DFE77C55EF68E3036BED29BFA70CB76D51D74E54D3535B72CC676899C5FC60021929B939F57CFF92A471A48BFA806FDA2CF942515BC9012AAAE479303614EB9BA52EC8A76CA78AAEA820EC8214AADB70E12492C66060384B609F56395532879C06FA33D7242E55D30AD79BE7D6F8E97152405ABC7097AF6DBEF5B7D2DCD1D414BB29E387327025D66F6D32142C858DC33BC6861A7A95AF46431FDB6AD3B3108E7AA0387CCF99504DC882E2FB2E127CB981123421A629908EC4570B", 16).unwrap().into_biguint());
1202    rsa.set_modulus(U2048::from_str_radix("9bdfe92e9f2b4023b3f4ef70f2f0d838623d6abf394d0baba13303a2f4393d6aea08faf677a8b4315cc6ab7d868ce23534263e382980a3363235bb0793ca4ebefda30dd1a2cfdb3a80e71d548521e3be9f7a931323fac2f57f3cfd092c329b1ce6a8fa900325be95d6f03b7f5bf6aa76d1f7c0a7c74375e37a09ad81c00056b7637cc194d65b80229e6fa2fa18106eb682877e4763bdf6aa0315332a8709dd120b407a9e5d48f90b0b361b8b5c85ca5c2578aa01abdf00361fa3fca45a180b3211abaae3642188c455af8147f7cf31ac1cbb9532aaabbaecb40eb96c24bea9bc0c8ca36d83a25d73f14b13bf45de7e6483c246de199f10d89bad30b81a0f887b", 16).unwrap().into_biguint());
1203    let private_key = rsa.get_private_key();
1204    let public_key = rsa.get_public_key();
1205    let modulus = rsa.get_modulus();
1206    println!("RSA_2048_u64: private key = {:X}:{:x}", private_key, modulus);
1207    println!("RSA_2048_u64: public key = {:X}:{:x}", public_key, modulus);
1208    
1209    // Example for RSA_4096_u64
1210    use cryptocol::asymmetric::RSA_4096_u64;
1211
1212    let mut rsa = RSA_4096_u64::new();
1213    rsa.set_public_key(U4096::from(5_u8).into_biguint());
1214    rsa.set_private_key(U4096::from_str_radix("16D9A2A76977853F423E2DDBA4AECBA372B95E082577329BCA5852F4400907D2B34366C1DD35B01EE9A2483E823E635EB7492797BE652252E131EADD6A68CCFA952B49A7F09B9AB2653386B2DEEF6874F2724392C4544BEF7D18E83E7CEF59E21F550C23CE848A05A19DE2D97347946E86F734FCA112938024608A9C5C1D72D658F369B49D3A4C77ADB6483C632AAE94F345791F9313D304277B1E4275F72F7C9B7C2DAB7DA91B94C807E5553FE534A923D22206F6A987CB9214FCA3EB78CE22A434CBAF7C3DF29010688F7930E9EB2BBF6113DE6A35F78EFCFC9A17A868277BAD58F432F097405E3F9415FE4E15D11D8D5376747F6046DF74AE76C5B50D28C5D972724F09E84FD057DAC07625C06ACE068A171480D73F51CAF7728F9EE0F0D4F794F81B2AFCD7C15898C7C5B964130F0D4EA1819999CDBC8E000C500DF8FECCEB9EB8AA75C16EAA6C02C61A3129B49472136E1231BB9D563BFAF93B1322DF047F9FF7CDB74610AF49E7ADD790746C5DB31B1D48888764511AE10FF2F22BF4D1CBFE809A9C716D9C4043C59120BC5EA9CC0CA20C06D6DF11B0574E534757F9BC78617CB484C988871A065348DF542869140D0D0F58EB3A76E2E1394C21D8FFEEC315CFA03DC70269234EACFD8AEFDBCDF0C0EAE6C743135FFA2B504F937BD9F473F10862C2D59C38FAAEDB9E930EB9264723B90923B40056594592A16D7D0D9D", 16).unwrap().into_biguint());
1215    rsa.set_modulus(U4096::from_str_radix("c72dbd530230cce40abeb30a9a33b60708cd8c4ef63091dcfe3f16ae76e1e10436e7004154dd34a85dbd0f0813e36b8ccc0fae90f5b5f3f20e915e9e276f6dd78f1eeb77f5016e7f6cdba95b31866f2ef6519dfb1e855acfa27f815134aaf70f3af39af5013a1971bc9558e476e9fc4ef2b0938fe0c42036f569879441cbe44ff664b937de05120c57823398d91e7cb389319fa8d6c50470ae7c83540b1e467d93a1d77a7e543845b3735aaa9b5a93543e286172b02ff34843c5d9075f0d2586754a4858c675641dc293d431fe5df11f3f8e7be802b8d566226b497e9cdcae7ce988ae6d8747771ebfb2eb235c58b9f08984c25336695731e5a13044139baf6a84137b163fb48e30d63809adc3853559e92df2420167d8eab2907724cbd33f5d712080a97195557b5e492c4472aba6e3dd9afe5ca37f2ccdff168d89e2ae6640935eb32f07fbb29663d320e65f14602974ac30124f1030f331db97f94471772e7a4a62074d517ea8c38bfac2492ca54bfa565c06e70263eab20c5f682d78b01a446a7a074b6ec5b14844fb28649eb9f746d7936ba191d9a7890a1f96bb3f4caa06a97383da413042e9c2b898f4397a1628d236607a0e0c1e4ef32a3d3d9ac59b0aab6632e85420be5de39ceb11b01c5fe3ee45d40418d8f21e894b292df523f570f96419ed5c3c0d0382b73ccec1f57976d790544d4ece8ebd145be1c130e827", 16).unwrap().into_biguint());
1216    let private_key = rsa.get_private_key();
1217    let public_key = rsa.get_public_key();
1218    let modulus = rsa.get_modulus();
1219    println!("RSA_4096_u64: private key = {:X}:{:x}", private_key, modulus);
1220    println!("RSA_4096_u64: public key = {:X}:{:x}", public_key, modulus);
1221    
1222    // Example for RSA_1024_u32
1223    use cryptocol::asymmetric::RSA_1024_u32;
1224
1225    let mut rsa = RSA_1024_u32::new();
1226    rsa.set_public_key(U1024::from(7_u8).into_biguint());
1227    rsa.set_private_key(U1024::from_str_radix("6F21015F58239A612E66501D445CC4F221AB05A16AD9BCD5F3494E44397BCDED845BA62788A4B6C4E008A120F0FD7D45E96CFDB6CC0EF621889A39BA55037EE32946DCB260FB638EF573CA2F4BB3C922A91EA2719E0BC1268410E862D1A2BDF7317970DBDA5AC089FFA1A74DC097AAF08AEEEFAF34DDB1DF172B0743D43B0B", 16).unwrap().into_biguint());
1228    rsa.set_modulus(U1024::from_str_radix("c772e0c82db6549484796c056c18b9ee836f8504611a3792df4b71e78a65992e6366f1f3024dd571b591cdd2a7d7e19a52d1ff6ffff40ba2fda3229ead5e90f2af877de674a7443acfbbeb3a3e5b1968cef3f6bdf0639edaa94174fa8c6d4701fca2d46a041f6ea3e0e921c70434781fd49f1b31f6cc2970aeefc981490b47e5", 16).unwrap().into_biguint());
1229    let private_key = rsa.get_private_key();
1230    let public_key = rsa.get_public_key();
1231    let modulus = rsa.get_modulus();
1232    println!("RSA_1024_u32: private key = {:X}:{:x}", private_key, modulus);
1233    println!("RSA_1024_u32: public key = {:X}:{:x}", public_key, modulus);
1234    
1235    // Example for RSA_2048_u32
1236    use cryptocol::asymmetric::RSA_2048_u32;
1237
1238    let mut rsa = RSA_2048_u32::new();
1239    rsa.set_public_key(U2048::from(7_u8).into_biguint());
1240    rsa.set_private_key(U2048::from_str_radix("67EA9B746A1CD56D22A34A4B4CA0902596D39C7F7B88B2726B7757C1F82628F1F15B51F9A51B22CB932F1CFE59B34178CD6ED42571006CCECC23D2050D3189D4A9175E8BC1DFE77C55EF68E3036BED29BFA70CB76D51D74E54D3535B72CC676899C5FC60021929B939F57CFF92A471A48BFA806FDA2CF942515BC9012AAAE479303614EB9BA52EC8A76CA78AAEA820EC8214AADB70E12492C66060384B609F56395532879C06FA33D7242E55D30AD79BE7D6F8E97152405ABC7097AF6DBEF5B7D2DCD1D414BB29E387327025D66F6D32142C858DC33BC6861A7A95AF46431FDB6AD3B3108E7AA0387CCF99504DC882E2FB2E127CB981123421A629908EC4570B", 16).unwrap().into_biguint());
1241    rsa.set_modulus(U2048::from_str_radix("9bdfe92e9f2b4023b3f4ef70f2f0d838623d6abf394d0baba13303a2f4393d6aea08faf677a8b4315cc6ab7d868ce23534263e382980a3363235bb0793ca4ebefda30dd1a2cfdb3a80e71d548521e3be9f7a931323fac2f57f3cfd092c329b1ce6a8fa900325be95d6f03b7f5bf6aa76d1f7c0a7c74375e37a09ad81c00056b7637cc194d65b80229e6fa2fa18106eb682877e4763bdf6aa0315332a8709dd120b407a9e5d48f90b0b361b8b5c85ca5c2578aa01abdf00361fa3fca45a180b3211abaae3642188c455af8147f7cf31ac1cbb9532aaabbaecb40eb96c24bea9bc0c8ca36d83a25d73f14b13bf45de7e6483c246de199f10d89bad30b81a0f887b", 16).unwrap().into_biguint());
1242    let private_key = rsa.get_private_key();
1243    let public_key = rsa.get_public_key();
1244    let modulus = rsa.get_modulus();
1245    println!("RSA_2048_u32: private key = {:X}:{:x}", private_key, modulus);
1246    println!("RSA_2048_u32: public key = {:X}:{:x}", public_key, modulus);
1247    
1248    // Example for RSA_4096_u32
1249    use cryptocol::asymmetric::RSA_4096_u32;
1250
1251    let mut rsa = RSA_4096_u32::new();
1252    rsa.set_public_key(U4096::from(5_u8).into_biguint());
1253    rsa.set_private_key(U4096::from_str_radix("16D9A2A76977853F423E2DDBA4AECBA372B95E082577329BCA5852F4400907D2B34366C1DD35B01EE9A2483E823E635EB7492797BE652252E131EADD6A68CCFA952B49A7F09B9AB2653386B2DEEF6874F2724392C4544BEF7D18E83E7CEF59E21F550C23CE848A05A19DE2D97347946E86F734FCA112938024608A9C5C1D72D658F369B49D3A4C77ADB6483C632AAE94F345791F9313D304277B1E4275F72F7C9B7C2DAB7DA91B94C807E5553FE534A923D22206F6A987CB9214FCA3EB78CE22A434CBAF7C3DF29010688F7930E9EB2BBF6113DE6A35F78EFCFC9A17A868277BAD58F432F097405E3F9415FE4E15D11D8D5376747F6046DF74AE76C5B50D28C5D972724F09E84FD057DAC07625C06ACE068A171480D73F51CAF7728F9EE0F0D4F794F81B2AFCD7C15898C7C5B964130F0D4EA1819999CDBC8E000C500DF8FECCEB9EB8AA75C16EAA6C02C61A3129B49472136E1231BB9D563BFAF93B1322DF047F9FF7CDB74610AF49E7ADD790746C5DB31B1D48888764511AE10FF2F22BF4D1CBFE809A9C716D9C4043C59120BC5EA9CC0CA20C06D6DF11B0574E534757F9BC78617CB484C988871A065348DF542869140D0D0F58EB3A76E2E1394C21D8FFEEC315CFA03DC70269234EACFD8AEFDBCDF0C0EAE6C743135FFA2B504F937BD9F473F10862C2D59C38FAAEDB9E930EB9264723B90923B40056594592A16D7D0D9D", 16).unwrap().into_biguint());
1254    rsa.set_modulus(U4096::from_str_radix("c72dbd530230cce40abeb30a9a33b60708cd8c4ef63091dcfe3f16ae76e1e10436e7004154dd34a85dbd0f0813e36b8ccc0fae90f5b5f3f20e915e9e276f6dd78f1eeb77f5016e7f6cdba95b31866f2ef6519dfb1e855acfa27f815134aaf70f3af39af5013a1971bc9558e476e9fc4ef2b0938fe0c42036f569879441cbe44ff664b937de05120c57823398d91e7cb389319fa8d6c50470ae7c83540b1e467d93a1d77a7e543845b3735aaa9b5a93543e286172b02ff34843c5d9075f0d2586754a4858c675641dc293d431fe5df11f3f8e7be802b8d566226b497e9cdcae7ce988ae6d8747771ebfb2eb235c58b9f08984c25336695731e5a13044139baf6a84137b163fb48e30d63809adc3853559e92df2420167d8eab2907724cbd33f5d712080a97195557b5e492c4472aba6e3dd9afe5ca37f2ccdff168d89e2ae6640935eb32f07fbb29663d320e65f14602974ac30124f1030f331db97f94471772e7a4a62074d517ea8c38bfac2492ca54bfa565c06e70263eab20c5f682d78b01a446a7a074b6ec5b14844fb28649eb9f746d7936ba191d9a7890a1f96bb3f4caa06a97383da413042e9c2b898f4397a1628d236607a0e0c1e4ef32a3d3d9ac59b0aab6632e85420be5de39ceb11b01c5fe3ee45d40418d8f21e894b292df523f570f96419ed5c3c0d0382b73ccec1f57976d790544d4ece8ebd145be1c130e827", 16).unwrap().into_biguint());
1255    let private_key = rsa.get_private_key();
1256    let public_key = rsa.get_public_key();
1257    let modulus = rsa.get_modulus();
1258    println!("RSA_4096_u32: private key = {:X}:{:x}", private_key, modulus);
1259    println!("RSA_4096_u32: public key = {:X}:{:x}", public_key, modulus);
1260    
1261    // Example for RSA_1024_u16
1262    use cryptocol::asymmetric::RSA_1024_u16;
1263
1264    let mut rsa = RSA_1024_u16::new();
1265    rsa.set_public_key(U1024::from(7_u8).into_biguint());
1266    rsa.set_private_key(U1024::from_str_radix("6F21015F58239A612E66501D445CC4F221AB05A16AD9BCD5F3494E44397BCDED845BA62788A4B6C4E008A120F0FD7D45E96CFDB6CC0EF621889A39BA55037EE32946DCB260FB638EF573CA2F4BB3C922A91EA2719E0BC1268410E862D1A2BDF7317970DBDA5AC089FFA1A74DC097AAF08AEEEFAF34DDB1DF172B0743D43B0B", 16).unwrap().into_biguint());
1267    rsa.set_modulus(U1024::from_str_radix("c772e0c82db6549484796c056c18b9ee836f8504611a3792df4b71e78a65992e6366f1f3024dd571b591cdd2a7d7e19a52d1ff6ffff40ba2fda3229ead5e90f2af877de674a7443acfbbeb3a3e5b1968cef3f6bdf0639edaa94174fa8c6d4701fca2d46a041f6ea3e0e921c70434781fd49f1b31f6cc2970aeefc981490b47e5", 16).unwrap().into_biguint());
1268    let private_key = rsa.get_private_key();
1269    let public_key = rsa.get_public_key();
1270    let modulus = rsa.get_modulus();
1271    println!("RSA_1024_u16: private key = {:X}:{:x}", private_key, modulus);
1272    println!("RSA_1024_u16: public key = {:X}:{:x}", public_key, modulus);
1273    
1274    // Example for RSA_2048_u16
1275    use cryptocol::asymmetric::RSA_2048_u16;
1276
1277    let mut rsa = RSA_2048_u16::new();
1278    rsa.set_public_key(U2048::from(7_u8).into_biguint());
1279    rsa.set_private_key(U2048::from_str_radix("67EA9B746A1CD56D22A34A4B4CA0902596D39C7F7B88B2726B7757C1F82628F1F15B51F9A51B22CB932F1CFE59B34178CD6ED42571006CCECC23D2050D3189D4A9175E8BC1DFE77C55EF68E3036BED29BFA70CB76D51D74E54D3535B72CC676899C5FC60021929B939F57CFF92A471A48BFA806FDA2CF942515BC9012AAAE479303614EB9BA52EC8A76CA78AAEA820EC8214AADB70E12492C66060384B609F56395532879C06FA33D7242E55D30AD79BE7D6F8E97152405ABC7097AF6DBEF5B7D2DCD1D414BB29E387327025D66F6D32142C858DC33BC6861A7A95AF46431FDB6AD3B3108E7AA0387CCF99504DC882E2FB2E127CB981123421A629908EC4570B", 16).unwrap().into_biguint());
1280    rsa.set_modulus(U2048::from_str_radix("9bdfe92e9f2b4023b3f4ef70f2f0d838623d6abf394d0baba13303a2f4393d6aea08faf677a8b4315cc6ab7d868ce23534263e382980a3363235bb0793ca4ebefda30dd1a2cfdb3a80e71d548521e3be9f7a931323fac2f57f3cfd092c329b1ce6a8fa900325be95d6f03b7f5bf6aa76d1f7c0a7c74375e37a09ad81c00056b7637cc194d65b80229e6fa2fa18106eb682877e4763bdf6aa0315332a8709dd120b407a9e5d48f90b0b361b8b5c85ca5c2578aa01abdf00361fa3fca45a180b3211abaae3642188c455af8147f7cf31ac1cbb9532aaabbaecb40eb96c24bea9bc0c8ca36d83a25d73f14b13bf45de7e6483c246de199f10d89bad30b81a0f887b", 16).unwrap().into_biguint());
1281    let private_key = rsa.get_private_key();
1282    let public_key = rsa.get_public_key();
1283    let modulus = rsa.get_modulus();
1284    println!("RSA_2048_u16: private key = {:X}:{:x}", private_key, modulus);
1285    println!("RSA_2048_u16: public key = {:X}:{:x}", public_key, modulus);
1286    
1287    // Example for RSA_4096_u16
1288    use cryptocol::asymmetric::RSA_4096_u16;
1289
1290    let mut rsa = RSA_4096_u16::new();
1291    rsa.set_public_key(U4096::from(5_u8).into_biguint());
1292    rsa.set_private_key(U4096::from_str_radix("16D9A2A76977853F423E2DDBA4AECBA372B95E082577329BCA5852F4400907D2B34366C1DD35B01EE9A2483E823E635EB7492797BE652252E131EADD6A68CCFA952B49A7F09B9AB2653386B2DEEF6874F2724392C4544BEF7D18E83E7CEF59E21F550C23CE848A05A19DE2D97347946E86F734FCA112938024608A9C5C1D72D658F369B49D3A4C77ADB6483C632AAE94F345791F9313D304277B1E4275F72F7C9B7C2DAB7DA91B94C807E5553FE534A923D22206F6A987CB9214FCA3EB78CE22A434CBAF7C3DF29010688F7930E9EB2BBF6113DE6A35F78EFCFC9A17A868277BAD58F432F097405E3F9415FE4E15D11D8D5376747F6046DF74AE76C5B50D28C5D972724F09E84FD057DAC07625C06ACE068A171480D73F51CAF7728F9EE0F0D4F794F81B2AFCD7C15898C7C5B964130F0D4EA1819999CDBC8E000C500DF8FECCEB9EB8AA75C16EAA6C02C61A3129B49472136E1231BB9D563BFAF93B1322DF047F9FF7CDB74610AF49E7ADD790746C5DB31B1D48888764511AE10FF2F22BF4D1CBFE809A9C716D9C4043C59120BC5EA9CC0CA20C06D6DF11B0574E534757F9BC78617CB484C988871A065348DF542869140D0D0F58EB3A76E2E1394C21D8FFEEC315CFA03DC70269234EACFD8AEFDBCDF0C0EAE6C743135FFA2B504F937BD9F473F10862C2D59C38FAAEDB9E930EB9264723B90923B40056594592A16D7D0D9D", 16).unwrap().into_biguint());
1293    rsa.set_modulus(U4096::from_str_radix("c72dbd530230cce40abeb30a9a33b60708cd8c4ef63091dcfe3f16ae76e1e10436e7004154dd34a85dbd0f0813e36b8ccc0fae90f5b5f3f20e915e9e276f6dd78f1eeb77f5016e7f6cdba95b31866f2ef6519dfb1e855acfa27f815134aaf70f3af39af5013a1971bc9558e476e9fc4ef2b0938fe0c42036f569879441cbe44ff664b937de05120c57823398d91e7cb389319fa8d6c50470ae7c83540b1e467d93a1d77a7e543845b3735aaa9b5a93543e286172b02ff34843c5d9075f0d2586754a4858c675641dc293d431fe5df11f3f8e7be802b8d566226b497e9cdcae7ce988ae6d8747771ebfb2eb235c58b9f08984c25336695731e5a13044139baf6a84137b163fb48e30d63809adc3853559e92df2420167d8eab2907724cbd33f5d712080a97195557b5e492c4472aba6e3dd9afe5ca37f2ccdff168d89e2ae6640935eb32f07fbb29663d320e65f14602974ac30124f1030f331db97f94471772e7a4a62074d517ea8c38bfac2492ca54bfa565c06e70263eab20c5f682d78b01a446a7a074b6ec5b14844fb28649eb9f746d7936ba191d9a7890a1f96bb3f4caa06a97383da413042e9c2b898f4397a1628d236607a0e0c1e4ef32a3d3d9ac59b0aab6632e85420be5de39ceb11b01c5fe3ee45d40418d8f21e894b292df523f570f96419ed5c3c0d0382b73ccec1f57976d790544d4ece8ebd145be1c130e827", 16).unwrap().into_biguint());
1294    let private_key = rsa.get_private_key();
1295    let public_key = rsa.get_public_key();
1296    let modulus = rsa.get_modulus();
1297    println!("RSA_4096_u16: private key = {:X}:{:x}", private_key, modulus);
1298    println!("RSA_4096_u16: public key = {:X}:{:x}", public_key, modulus);
1299    
1300    // Example for RSA_1024_u8
1301    use cryptocol::asymmetric::RSA_1024_u8;
1302
1303    let mut rsa = RSA_1024_u8::new();
1304    rsa.set_public_key(U1024::from(7_u8).into_biguint());
1305    rsa.set_private_key(U1024::from_str_radix("6F21015F58239A612E66501D445CC4F221AB05A16AD9BCD5F3494E44397BCDED845BA62788A4B6C4E008A120F0FD7D45E96CFDB6CC0EF621889A39BA55037EE32946DCB260FB638EF573CA2F4BB3C922A91EA2719E0BC1268410E862D1A2BDF7317970DBDA5AC089FFA1A74DC097AAF08AEEEFAF34DDB1DF172B0743D43B0B", 16).unwrap().into_biguint());
1306    rsa.set_modulus(U1024::from_str_radix("c772e0c82db6549484796c056c18b9ee836f8504611a3792df4b71e78a65992e6366f1f3024dd571b591cdd2a7d7e19a52d1ff6ffff40ba2fda3229ead5e90f2af877de674a7443acfbbeb3a3e5b1968cef3f6bdf0639edaa94174fa8c6d4701fca2d46a041f6ea3e0e921c70434781fd49f1b31f6cc2970aeefc981490b47e5", 16).unwrap().into_biguint());
1307    let private_key = rsa.get_private_key();
1308    let public_key = rsa.get_public_key();
1309    let modulus = rsa.get_modulus();
1310    println!("RSA_1024_u8: private key = {:X}:{:x}", private_key, modulus);
1311    println!("RSA_1024_u8: public key = {:X}:{:x}", public_key, modulus);
1312    
1313    // Example for RSA_2048_u8
1314    use cryptocol::asymmetric::RSA_2048_u8;
1315
1316    let mut rsa = RSA_2048_u8::new();
1317    rsa.set_public_key(U2048::from(7_u8).into_biguint());
1318    rsa.set_private_key(U2048::from_str_radix("67EA9B746A1CD56D22A34A4B4CA0902596D39C7F7B88B2726B7757C1F82628F1F15B51F9A51B22CB932F1CFE59B34178CD6ED42571006CCECC23D2050D3189D4A9175E8BC1DFE77C55EF68E3036BED29BFA70CB76D51D74E54D3535B72CC676899C5FC60021929B939F57CFF92A471A48BFA806FDA2CF942515BC9012AAAE479303614EB9BA52EC8A76CA78AAEA820EC8214AADB70E12492C66060384B609F56395532879C06FA33D7242E55D30AD79BE7D6F8E97152405ABC7097AF6DBEF5B7D2DCD1D414BB29E387327025D66F6D32142C858DC33BC6861A7A95AF46431FDB6AD3B3108E7AA0387CCF99504DC882E2FB2E127CB981123421A629908EC4570B", 16).unwrap().into_biguint());
1319    rsa.set_modulus(U2048::from_str_radix("9bdfe92e9f2b4023b3f4ef70f2f0d838623d6abf394d0baba13303a2f4393d6aea08faf677a8b4315cc6ab7d868ce23534263e382980a3363235bb0793ca4ebefda30dd1a2cfdb3a80e71d548521e3be9f7a931323fac2f57f3cfd092c329b1ce6a8fa900325be95d6f03b7f5bf6aa76d1f7c0a7c74375e37a09ad81c00056b7637cc194d65b80229e6fa2fa18106eb682877e4763bdf6aa0315332a8709dd120b407a9e5d48f90b0b361b8b5c85ca5c2578aa01abdf00361fa3fca45a180b3211abaae3642188c455af8147f7cf31ac1cbb9532aaabbaecb40eb96c24bea9bc0c8ca36d83a25d73f14b13bf45de7e6483c246de199f10d89bad30b81a0f887b", 16).unwrap().into_biguint());
1320    let private_key = rsa.get_private_key();
1321    let public_key = rsa.get_public_key();
1322    let modulus = rsa.get_modulus();
1323    println!("RSA_2048_u8: private key = {:X}:{:x}", private_key, modulus);
1324    println!("RSA_2048_u8: public key = {:X}:{:x}", public_key, modulus);
1325    
1326    // Example for RSA_4096_u8
1327    use cryptocol::asymmetric::RSA_4096_u8;
1328
1329    let mut rsa = RSA_4096_u8::new();
1330    rsa.set_public_key(U4096::from(5_u8).into_biguint());
1331    rsa.set_private_key(U4096::from_str_radix("16D9A2A76977853F423E2DDBA4AECBA372B95E082577329BCA5852F4400907D2B34366C1DD35B01EE9A2483E823E635EB7492797BE652252E131EADD6A68CCFA952B49A7F09B9AB2653386B2DEEF6874F2724392C4544BEF7D18E83E7CEF59E21F550C23CE848A05A19DE2D97347946E86F734FCA112938024608A9C5C1D72D658F369B49D3A4C77ADB6483C632AAE94F345791F9313D304277B1E4275F72F7C9B7C2DAB7DA91B94C807E5553FE534A923D22206F6A987CB9214FCA3EB78CE22A434CBAF7C3DF29010688F7930E9EB2BBF6113DE6A35F78EFCFC9A17A868277BAD58F432F097405E3F9415FE4E15D11D8D5376747F6046DF74AE76C5B50D28C5D972724F09E84FD057DAC07625C06ACE068A171480D73F51CAF7728F9EE0F0D4F794F81B2AFCD7C15898C7C5B964130F0D4EA1819999CDBC8E000C500DF8FECCEB9EB8AA75C16EAA6C02C61A3129B49472136E1231BB9D563BFAF93B1322DF047F9FF7CDB74610AF49E7ADD790746C5DB31B1D48888764511AE10FF2F22BF4D1CBFE809A9C716D9C4043C59120BC5EA9CC0CA20C06D6DF11B0574E534757F9BC78617CB484C988871A065348DF542869140D0D0F58EB3A76E2E1394C21D8FFEEC315CFA03DC70269234EACFD8AEFDBCDF0C0EAE6C743135FFA2B504F937BD9F473F10862C2D59C38FAAEDB9E930EB9264723B90923B40056594592A16D7D0D9D", 16).unwrap().into_biguint());
1332    rsa.set_modulus(U4096::from_str_radix("c72dbd530230cce40abeb30a9a33b60708cd8c4ef63091dcfe3f16ae76e1e10436e7004154dd34a85dbd0f0813e36b8ccc0fae90f5b5f3f20e915e9e276f6dd78f1eeb77f5016e7f6cdba95b31866f2ef6519dfb1e855acfa27f815134aaf70f3af39af5013a1971bc9558e476e9fc4ef2b0938fe0c42036f569879441cbe44ff664b937de05120c57823398d91e7cb389319fa8d6c50470ae7c83540b1e467d93a1d77a7e543845b3735aaa9b5a93543e286172b02ff34843c5d9075f0d2586754a4858c675641dc293d431fe5df11f3f8e7be802b8d566226b497e9cdcae7ce988ae6d8747771ebfb2eb235c58b9f08984c25336695731e5a13044139baf6a84137b163fb48e30d63809adc3853559e92df2420167d8eab2907724cbd33f5d712080a97195557b5e492c4472aba6e3dd9afe5ca37f2ccdff168d89e2ae6640935eb32f07fbb29663d320e65f14602974ac30124f1030f331db97f94471772e7a4a62074d517ea8c38bfac2492ca54bfa565c06e70263eab20c5f682d78b01a446a7a074b6ec5b14844fb28649eb9f746d7936ba191d9a7890a1f96bb3f4caa06a97383da413042e9c2b898f4397a1628d236607a0e0c1e4ef32a3d3d9ac59b0aab6632e85420be5de39ceb11b01c5fe3ee45d40418d8f21e894b292df523f570f96419ed5c3c0d0382b73ccec1f57976d790544d4ece8ebd145be1c130e827", 16).unwrap().into_biguint());
1333    let private_key = rsa.get_private_key();
1334    let public_key = rsa.get_public_key();
1335    let modulus = rsa.get_modulus();
1336    println!("RSA_4096_u8: private key = {:X}:{:x}", private_key, modulus);
1337    println!("RSA_4096_u8: public key = {:X}:{:x}", public_key, modulus);
1338    println!("-------------------------------");
1339}
1340
1341fn rsa_find_keys()
1342{
1343    println!("rsa_find_keys");
1344
1345    let mut thread = Vec::<fn()>::new();
1346    
1347    // Example for RSA_1024
1348    thread.push(||{
1349        use cryptocol::asymmetric::RSA_1024;
1350
1351        let mut rsa = RSA_1024::new();
1352        rsa.find_keys();
1353        let private_key = rsa.get_private_key();
1354        let public_key = rsa.get_public_key();
1355        let modulus = rsa.get_modulus();
1356        println!("RSA_1024: private key = {:X}:{:x}", private_key, modulus);
1357        println!("RSA_1024: public key = {:X}:{:x}", public_key, modulus);
1358    });
1359
1360    // Example for RSA_2048
1361    thread.push(||{
1362        use cryptocol::asymmetric::RSA_2048;
1363
1364        let mut rsa = RSA_2048::new();
1365        rsa.find_keys();
1366        let private_key = rsa.get_private_key();
1367        let public_key = rsa.get_public_key();
1368        let modulus = rsa.get_modulus();
1369        println!("RSA_2048: private key = {:X}:{:x}", private_key, modulus);
1370        println!("RSA_2048: public key = {:X}:{:x}", public_key, modulus);
1371    });
1372    
1373    // Example for RSA_4096
1374    thread.push(||{
1375        use cryptocol::asymmetric::RSA_4096;
1376
1377        let mut rsa = RSA_4096::new();
1378        rsa.find_keys();
1379        let private_key = rsa.get_private_key();
1380        let public_key = rsa.get_public_key();
1381        let modulus = rsa.get_modulus();
1382        println!("RSA_4096: private key = {:X}:{:x}", private_key, modulus);
1383        println!("RSA_4096: public key = {:X}:{:x}", public_key, modulus);
1384    });
1385    
1386    // Example for RSA_Genric
1387    thread.push(||{
1388        use cryptocol::asymmetric::RSA_Generic;
1389
1390        let mut rsa = RSA_Generic::<8, u32, 5>::new();
1391        rsa.find_keys();
1392        let private_key = rsa.get_private_key();
1393        let public_key = rsa.get_public_key();
1394        let modulus = rsa.get_modulus();
1395        println!("RSA_Generic<8, u32, 5>: private key = {:X}:{:x}", private_key, modulus);
1396        println!("RSA_Generic<8, u32, 5>: public key = {:X}:{:x}", public_key, modulus);
1397    });
1398    
1399    // Example for RSA_1024_u128
1400    thread.push(||{
1401        use cryptocol::asymmetric::RSA_1024_u128;
1402
1403        let mut rsa = RSA_1024_u128::new();
1404        rsa.find_keys();
1405        let private_key = rsa.get_private_key();
1406        let public_key = rsa.get_public_key();
1407        let modulus = rsa.get_modulus();
1408        println!("RSA_1024_u128: private key = {:X}:{:x}", private_key, modulus);
1409        println!("RSA_1024_u128: public key = {:X}:{:x}", public_key, modulus);
1410    });
1411
1412    // Example for RSA_2048_u128
1413    thread.push(||{
1414        use cryptocol::asymmetric::RSA_2048_u128;
1415
1416        let mut rsa = RSA_2048_u128::new();
1417        rsa.find_keys();
1418        let private_key = rsa.get_private_key();
1419        let public_key = rsa.get_public_key();
1420        let modulus = rsa.get_modulus();
1421        println!("RSA_2048_u128: private key = {:X}:{:x}", private_key, modulus);
1422        println!("RSA_2048_u128: public key = {:X}:{:x}", public_key, modulus);
1423    });
1424    
1425    // Example for RSA_4096_u128
1426    thread.push(||{
1427        use cryptocol::asymmetric::RSA_4096_u128;
1428
1429        let mut rsa = RSA_4096_u128::new();
1430        rsa.find_keys();
1431        let private_key = rsa.get_private_key();
1432        let public_key = rsa.get_public_key();
1433        let modulus = rsa.get_modulus();
1434        println!("RSA_4096_u128: private key = {:X}:{:x}", private_key, modulus);
1435        println!("RSA_4096_u128: public key = {:X}:{:x}", public_key, modulus);
1436    });
1437    
1438    // Example for RSA_1024_u64
1439    thread.push(||{
1440        use cryptocol::asymmetric::RSA_1024_u64;
1441
1442        let mut rsa = RSA_1024_u64::new();
1443        rsa.find_keys();
1444        let private_key = rsa.get_private_key();
1445        let public_key = rsa.get_public_key();
1446        let modulus = rsa.get_modulus();
1447        println!("RSA_1024_u64: private key = {:X}:{:x}", private_key, modulus);
1448        println!("RSA_1024_u64: public key = {:X}:{:x}", public_key, modulus);
1449    });
1450
1451    // Example for RSA_2048_u64
1452    thread.push(||{
1453        use cryptocol::asymmetric::RSA_2048_u64;
1454
1455        let mut rsa = RSA_2048_u64::new();
1456        rsa.find_keys();
1457        let private_key = rsa.get_private_key();
1458        let public_key = rsa.get_public_key();
1459        let modulus = rsa.get_modulus();
1460        println!("RSA_2048_u64: private key = {:X}:{:x}", private_key, modulus);
1461        println!("RSA_2048_u64: public key = {:X}:{:x}", public_key, modulus);
1462    });
1463    
1464    // Example for RSA_4096_u64
1465    thread.push(||{
1466        use cryptocol::asymmetric::RSA_4096_u64;
1467
1468        let mut rsa = RSA_4096_u64::new();
1469        rsa.find_keys();
1470        let private_key = rsa.get_private_key();
1471        let public_key = rsa.get_public_key();
1472        let modulus = rsa.get_modulus();
1473        println!("RSA_4096_u64: private key = {:X}:{:x}", private_key, modulus);
1474        println!("RSA_4096_u64: public key = {:X}:{:x}", public_key, modulus);
1475    });
1476    
1477    // Example for RSA_1024_u32
1478    thread.push(||{
1479        use cryptocol::asymmetric::RSA_1024_u32;
1480
1481        let mut rsa = RSA_1024_u32::new();
1482        rsa.find_keys();
1483        let private_key = rsa.get_private_key();
1484        let public_key = rsa.get_public_key();
1485        let modulus = rsa.get_modulus();
1486        println!("RSA_1024_u32: private key = {:X}:{:x}", private_key, modulus);
1487        println!("RSA_1024_u32: public key = {:X}:{:x}", public_key, modulus);
1488    });
1489
1490    // Example for RSA_2048_u32
1491    thread.push(||{
1492        use cryptocol::asymmetric::RSA_2048_u32;
1493
1494        let mut rsa = RSA_2048_u32::new();
1495        rsa.find_keys();
1496        let private_key = rsa.get_private_key();
1497        let public_key = rsa.get_public_key();
1498        let modulus = rsa.get_modulus();
1499        println!("RSA_2048_u32: private key = {:X}:{:x}", private_key, modulus);
1500        println!("RSA_2048_u32: public key = {:X}:{:x}", public_key, modulus);
1501    });
1502    
1503    // Example for RSA_4096_u32
1504    thread.push(||{
1505        use cryptocol::asymmetric::RSA_4096_u32;
1506
1507        let mut rsa = RSA_4096_u32::new();
1508        rsa.find_keys();
1509        let private_key = rsa.get_private_key();
1510        let public_key = rsa.get_public_key();
1511        let modulus = rsa.get_modulus();
1512        println!("RSA_4096_u32: private key = {:X}:{:x}", private_key, modulus);
1513        println!("RSA_4096_u32: public key = {:X}:{:x}", public_key, modulus);
1514    });
1515    
1516    // Example for RSA_1024_u16
1517    thread.push(||{
1518        use cryptocol::asymmetric::RSA_1024_u16;
1519
1520        let mut rsa = RSA_1024_u16::new();
1521        rsa.find_keys();
1522        let private_key = rsa.get_private_key();
1523        let public_key = rsa.get_public_key();
1524        let modulus = rsa.get_modulus();
1525        println!("RSA_1024_u16: private key = {:X}:{:x}", private_key, modulus);
1526        println!("RSA_1024_u16: public key = {:X}:{:x}", public_key, modulus);
1527    });
1528
1529    // Example for RSA_2048_u16
1530    thread.push(||{
1531        use cryptocol::asymmetric::RSA_2048_u16;
1532
1533        let mut rsa = RSA_2048_u16::new();
1534        rsa.find_keys();
1535        let private_key = rsa.get_private_key();
1536        let public_key = rsa.get_public_key();
1537        let modulus = rsa.get_modulus();
1538        println!("RSA_2048_u16: private key = {:X}:{:x}", private_key, modulus);
1539        println!("RSA_2048_u16: public key = {:X}:{:x}", public_key, modulus);
1540    });
1541    
1542    // Example for RSA_4096_u16
1543    thread.push(||{
1544        use cryptocol::asymmetric::RSA_4096_u16;
1545
1546        let mut rsa = RSA_4096_u16::new();
1547        rsa.find_keys();
1548        let private_key = rsa.get_private_key();
1549        let public_key = rsa.get_public_key();
1550        let modulus = rsa.get_modulus();
1551        println!("RSA_4096_u16: private key = {:X}:{:x}", private_key, modulus);
1552        println!("RSA_4096_u16: public key = {:X}:{:x}", public_key, modulus);
1553    });
1554    
1555    // Example for RSA_1024_u8
1556    thread.push(||{
1557        use cryptocol::asymmetric::RSA_1024_u8;
1558
1559        let mut rsa = RSA_1024_u8::new();
1560        rsa.find_keys();
1561        let private_key = rsa.get_private_key();
1562        let public_key = rsa.get_public_key();
1563        let modulus = rsa.get_modulus();
1564        println!("RSA_1024_u8: private key = {:X}:{:x}", private_key, modulus);
1565        println!("RSA_1024_u8: public key = {:X}:{:x}", public_key, modulus);
1566    });
1567
1568    // Example for RSA_2048_u8
1569    thread.push(||{
1570        use cryptocol::asymmetric::RSA_2048_u8;
1571
1572        let mut rsa = RSA_2048_u8::new();
1573        rsa.find_keys();
1574        let private_key = rsa.get_private_key();
1575        let public_key = rsa.get_public_key();
1576        let modulus = rsa.get_modulus();
1577        println!("RSA_2048_u8: private key = {:X}:{:x}", private_key, modulus);
1578        println!("RSA_2048_u8: public key = {:X}:{:x}", public_key, modulus);
1579    });
1580    
1581    // Example for RSA_4096_u8
1582    thread.push(||{
1583        use cryptocol::asymmetric::RSA_4096_u8;
1584
1585        let mut rsa = RSA_4096_u8::new();
1586        rsa.find_keys();
1587        let private_key = rsa.get_private_key();
1588        let public_key = rsa.get_public_key();
1589        let modulus = rsa.get_modulus();
1590        println!("RSA_4096_u8: private key = {:X}:{:x}", private_key, modulus);
1591        println!("RSA_4096_u8: public key = {:X}:{:x}", public_key, modulus);
1592    });
1593
1594    do_simultaneously(thread);
1595    println!("-------------------------------");
1596}
1597
1598fn calculate_keys()
1599{
1600    println!("calculate_keys");
1601    use cryptocol::define_utypes_with;
1602    define_utypes_with!(u128);
1603
1604    let mut thread = Vec::<fn()>::new();
1605    
1606    // Example for RSA_1024
1607    thread.push(||{
1608        use cryptocol::asymmetric::RSA_1024;
1609
1610        let mut rsa = RSA_1024::new();
1611        let prime1 = U512::from_str_radix("9696CB197B606EE02CCA95643546AF6EBDB3D58EF0382F2BA46BAF9089490A5856AD6E6DC3169C7B1AE4E6CDBB7B18BC9CFABDCCB5157649D475B3396A893B59", 16).unwrap();
1612        let prime2 = U512::from_str_radix("8821AE888CFE44FB3667C54A1C40452D02309B64940AE5FA957390F250BDC919DC350E4DB6B4E5CF05F393D9B4DF89E55BB5F7DFC114F465A250EF55284BF793", 16).unwrap();
1613
1614        rsa.calculate_keys(prime1.into_biguint(), prime2.into_biguint());
1615        println!("RSA_1024: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1616        println!("RSA_1024: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1617    });
1618
1619    // Example for RSA_2048
1620    thread.push(||{
1621        use cryptocol::asymmetric::RSA_2048;
1622
1623        let mut rsa = RSA_2048::new();
1624        let prime1 = U1024::from_str_radix("AD302C104ACE9E6BF8ADACC4BD0F3FDF141BB9B0A7285E9948B009F5A276F1D3F22C84199CB84D94BB41AD4BF2A9173D9A26132174E766F963F9655281B27AC265C17AEE34BEF077CED4F1EE13428DEF58AD5184D37C4169FDF3D922B678E65C4D8C64A870607C869C6328B790F4418D7425A0A92E169CB3609D28B5CC647D2D", 16).unwrap();
1625        let prime2 = U1024::from_str_radix("91B307B767F9BDE99AB167625F41A0396E3B06CC6C1059E5EACF42342013C99EBE230B7AD380577521F242E3A84AD15B2F7B96F95B5C35FA409FE60410457A8DB1CBF45D2592509DFA83A4B4EDBEE35075B79EA36B4B99B5F88F5AEC40CB0CD5C1B2D9853EA830CF08FAE6E5232F47F5BCE755AC8F3A0DFD861F1124BE3457C9", 16).unwrap();
1626
1627        rsa.calculate_keys(prime1.into_biguint(), prime2.into_biguint());
1628        println!("RSA_2048: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1629        println!("RSA_2048: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1630    });
1631    
1632    // Example for RSA_4096
1633    thread.push(||{
1634        use cryptocol::asymmetric::RSA_4096;
1635
1636        let mut rsa = RSA_4096::new();
1637        let prime1 = U2048::from_str_radix("E12DC76D28508F586A9C5812D8B17C9CE12AE362AB83E61D2BAB87B5C4C479E11A4429EEB3E72A8505F63F8DE53EF128C60DF09C2A301EFFD54A3D820F5DDC8A523AD6A73ED3DBFB8B3CE060FDCDEA86179EA426DFA7EFF2916848A4AF76E102A4152964FD49CEB0E7EA824CD6362E1EF2E10290B8D0DE717776C4100AD5150100E35F0F7DAA34B983A462DE0A2243659856A2C2B6A321E3FDFA3DFC0B5F6F027839300BA97A4FDE103DC0AE936D8263E9E9825959AE643E3DD2D44130EEA2E879D8EAA3852A740E65DE824ABF39FAEE7A75E08A5AB53C7F65A0DA865638C8DCE407E1BA5441E2223F0654848D0FB2689A99FF29E9A73C4F6658BF6657DD275F", 16).unwrap();
1638        let prime2 = U2048::from_str_radix("D29FC14636D944F57043C63461D40846452C3211654B3C68F77C1C8F28D8E4E323F27779B1F4F6BC2C3D245F77D18CDEEAAB8FCA778991608D6A10D1C7A1F36F2B143EF89A463AC998098116E7024790DE0FA381120986FEC53A659AC6F0D2B1D7EAC64466F6F62CA409B683DF9882980DE906BC1CC105C60134841D29356F731A6ABB832215AEE148D9E1DE35EAB9E61A289C1EC811F615502954088BDFAFDFF9902505E41EB4C896727D1032D795B1B315104536F8F9EE6757360E5E3E4B80D1E62D355C4DB2C59C9F8B66CADF0781C3D9211E71471CB93F79489EDDDF5C1E546ADA8EB42BF27960E4EB75EDD90A3B3A32C815A6879886A82D107E150587CD", 16).unwrap();
1639
1640        rsa.calculate_keys(prime1.into_biguint(), prime2.into_biguint());
1641        println!("RSA_4096: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1642        println!("RSA_4096: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1643    });
1644    
1645    // Example for RSA_Genric
1646    thread.push(||{
1647        use cryptocol::asymmetric::RSA_Generic;
1648
1649        let mut rsa = RSA_Generic::<4, u128, 5>::new();
1650        let prime1 = U512::from_str_radix("F294849D5E617CC84E12A5F7E27B9D9E7DB99AE139694062D50C3243BC0DCC03", 16).unwrap();
1651        let prime2 = U512::from_str_radix("97A3CE282F1D1497870F3120D24216F9EE7BA23B50326416A7A67EEB250E8579", 16).unwrap();
1652
1653        rsa.calculate_keys(prime1, prime2);
1654        println!("RSA_Generic: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1655        println!("RSA_Generic: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1656    });
1657    
1658    // Example for RSA_1024_u128
1659    thread.push(||{
1660        use cryptocol::asymmetric::RSA_1024_u128;
1661
1662        let mut rsa = RSA_1024_u128::new();
1663        let prime1 = U512::from_str_radix("9696CB197B606EE02CCA95643546AF6EBDB3D58EF0382F2BA46BAF9089490A5856AD6E6DC3169C7B1AE4E6CDBB7B18BC9CFABDCCB5157649D475B3396A893B59", 16).unwrap();
1664        let prime2 = U512::from_str_radix("8821AE888CFE44FB3667C54A1C40452D02309B64940AE5FA957390F250BDC919DC350E4DB6B4E5CF05F393D9B4DF89E55BB5F7DFC114F465A250EF55284BF793", 16).unwrap();
1665
1666        rsa.calculate_keys(prime1.into_biguint(), prime2.into_biguint());
1667        println!("RSA_1024_u128: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1668        println!("RSA_1024_u128: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1669    });
1670
1671    // Example for RSA_2048_u128
1672    thread.push(||{
1673        use cryptocol::asymmetric::RSA_2048_u128;
1674
1675        let mut rsa = RSA_2048_u128::new();
1676        let prime1 = U1024::from_str_radix("AD302C104ACE9E6BF8ADACC4BD0F3FDF141BB9B0A7285E9948B009F5A276F1D3F22C84199CB84D94BB41AD4BF2A9173D9A26132174E766F963F9655281B27AC265C17AEE34BEF077CED4F1EE13428DEF58AD5184D37C4169FDF3D922B678E65C4D8C64A870607C869C6328B790F4418D7425A0A92E169CB3609D28B5CC647D2D", 16).unwrap();
1677        let prime2 = U1024::from_str_radix("91B307B767F9BDE99AB167625F41A0396E3B06CC6C1059E5EACF42342013C99EBE230B7AD380577521F242E3A84AD15B2F7B96F95B5C35FA409FE60410457A8DB1CBF45D2592509DFA83A4B4EDBEE35075B79EA36B4B99B5F88F5AEC40CB0CD5C1B2D9853EA830CF08FAE6E5232F47F5BCE755AC8F3A0DFD861F1124BE3457C9", 16).unwrap();
1678
1679        rsa.calculate_keys(prime1.into_biguint(), prime2.into_biguint());
1680        println!("RSA_2048_u128: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1681        println!("RSA_2048_u128: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1682    });
1683    
1684    // Example for RSA_4096_u128
1685    thread.push(||{
1686        use cryptocol::asymmetric::RSA_4096_u128;
1687
1688        let mut rsa = RSA_4096_u128::new();
1689        let prime1 = U2048::from_str_radix("E12DC76D28508F586A9C5812D8B17C9CE12AE362AB83E61D2BAB87B5C4C479E11A4429EEB3E72A8505F63F8DE53EF128C60DF09C2A301EFFD54A3D820F5DDC8A523AD6A73ED3DBFB8B3CE060FDCDEA86179EA426DFA7EFF2916848A4AF76E102A4152964FD49CEB0E7EA824CD6362E1EF2E10290B8D0DE717776C4100AD5150100E35F0F7DAA34B983A462DE0A2243659856A2C2B6A321E3FDFA3DFC0B5F6F027839300BA97A4FDE103DC0AE936D8263E9E9825959AE643E3DD2D44130EEA2E879D8EAA3852A740E65DE824ABF39FAEE7A75E08A5AB53C7F65A0DA865638C8DCE407E1BA5441E2223F0654848D0FB2689A99FF29E9A73C4F6658BF6657DD275F", 16).unwrap();
1690        let prime2 = U2048::from_str_radix("D29FC14636D944F57043C63461D40846452C3211654B3C68F77C1C8F28D8E4E323F27779B1F4F6BC2C3D245F77D18CDEEAAB8FCA778991608D6A10D1C7A1F36F2B143EF89A463AC998098116E7024790DE0FA381120986FEC53A659AC6F0D2B1D7EAC64466F6F62CA409B683DF9882980DE906BC1CC105C60134841D29356F731A6ABB832215AEE148D9E1DE35EAB9E61A289C1EC811F615502954088BDFAFDFF9902505E41EB4C896727D1032D795B1B315104536F8F9EE6757360E5E3E4B80D1E62D355C4DB2C59C9F8B66CADF0781C3D9211E71471CB93F79489EDDDF5C1E546ADA8EB42BF27960E4EB75EDD90A3B3A32C815A6879886A82D107E150587CD", 16).unwrap();
1691
1692        rsa.calculate_keys(prime1.into_biguint(), prime2.into_biguint());
1693        println!("RSA_4096_u128: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1694        println!("RSA_4096_u128: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1695    });
1696    
1697    // Example for RSA_1024_u64
1698    thread.push(||{
1699        use cryptocol::asymmetric::RSA_1024_u64;
1700
1701        let mut rsa = RSA_1024_u64::new();
1702        let prime1 = U512::from_str_radix("9696CB197B606EE02CCA95643546AF6EBDB3D58EF0382F2BA46BAF9089490A5856AD6E6DC3169C7B1AE4E6CDBB7B18BC9CFABDCCB5157649D475B3396A893B59", 16).unwrap();
1703        let prime2 = U512::from_str_radix("8821AE888CFE44FB3667C54A1C40452D02309B64940AE5FA957390F250BDC919DC350E4DB6B4E5CF05F393D9B4DF89E55BB5F7DFC114F465A250EF55284BF793", 16).unwrap();
1704
1705        rsa.calculate_keys(prime1.into_biguint(), prime2.into_biguint());
1706        println!("RSA_1024_u64: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1707        println!("RSA_1024_u64: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1708    });
1709
1710    // Example for RSA_2048_u64
1711    thread.push(||{
1712        use cryptocol::asymmetric::RSA_2048_u64;
1713
1714        let mut rsa = RSA_2048_u64::new();
1715        let prime1 = U1024::from_str_radix("AD302C104ACE9E6BF8ADACC4BD0F3FDF141BB9B0A7285E9948B009F5A276F1D3F22C84199CB84D94BB41AD4BF2A9173D9A26132174E766F963F9655281B27AC265C17AEE34BEF077CED4F1EE13428DEF58AD5184D37C4169FDF3D922B678E65C4D8C64A870607C869C6328B790F4418D7425A0A92E169CB3609D28B5CC647D2D", 16).unwrap();
1716        let prime2 = U1024::from_str_radix("91B307B767F9BDE99AB167625F41A0396E3B06CC6C1059E5EACF42342013C99EBE230B7AD380577521F242E3A84AD15B2F7B96F95B5C35FA409FE60410457A8DB1CBF45D2592509DFA83A4B4EDBEE35075B79EA36B4B99B5F88F5AEC40CB0CD5C1B2D9853EA830CF08FAE6E5232F47F5BCE755AC8F3A0DFD861F1124BE3457C9", 16).unwrap();
1717
1718        rsa.calculate_keys(prime1.into_biguint(), prime2.into_biguint());
1719        println!("RSA_2048_u64: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1720        println!("RSA_2048_u64: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1721    });
1722    
1723    // Example for RSA_4096_u64
1724    thread.push(||{
1725        use cryptocol::asymmetric::RSA_4096_u64;
1726
1727        let mut rsa = RSA_4096_u64::new();
1728        let prime1 = U2048::from_str_radix("E12DC76D28508F586A9C5812D8B17C9CE12AE362AB83E61D2BAB87B5C4C479E11A4429EEB3E72A8505F63F8DE53EF128C60DF09C2A301EFFD54A3D820F5DDC8A523AD6A73ED3DBFB8B3CE060FDCDEA86179EA426DFA7EFF2916848A4AF76E102A4152964FD49CEB0E7EA824CD6362E1EF2E10290B8D0DE717776C4100AD5150100E35F0F7DAA34B983A462DE0A2243659856A2C2B6A321E3FDFA3DFC0B5F6F027839300BA97A4FDE103DC0AE936D8263E9E9825959AE643E3DD2D44130EEA2E879D8EAA3852A740E65DE824ABF39FAEE7A75E08A5AB53C7F65A0DA865638C8DCE407E1BA5441E2223F0654848D0FB2689A99FF29E9A73C4F6658BF6657DD275F", 16).unwrap();
1729        let prime2 = U2048::from_str_radix("D29FC14636D944F57043C63461D40846452C3211654B3C68F77C1C8F28D8E4E323F27779B1F4F6BC2C3D245F77D18CDEEAAB8FCA778991608D6A10D1C7A1F36F2B143EF89A463AC998098116E7024790DE0FA381120986FEC53A659AC6F0D2B1D7EAC64466F6F62CA409B683DF9882980DE906BC1CC105C60134841D29356F731A6ABB832215AEE148D9E1DE35EAB9E61A289C1EC811F615502954088BDFAFDFF9902505E41EB4C896727D1032D795B1B315104536F8F9EE6757360E5E3E4B80D1E62D355C4DB2C59C9F8B66CADF0781C3D9211E71471CB93F79489EDDDF5C1E546ADA8EB42BF27960E4EB75EDD90A3B3A32C815A6879886A82D107E150587CD", 16).unwrap();
1730
1731        rsa.calculate_keys(prime1.into_biguint(), prime2.into_biguint());
1732        println!("RSA_4096_u64: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1733        println!("RSA_4096_u64: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1734    });
1735    
1736    // Example for RSA_1024_u32
1737    thread.push(||{
1738        use cryptocol::asymmetric::RSA_1024_u32;
1739
1740        let mut rsa = RSA_1024_u32::new();
1741        let prime1 = U512::from_str_radix("9696CB197B606EE02CCA95643546AF6EBDB3D58EF0382F2BA46BAF9089490A5856AD6E6DC3169C7B1AE4E6CDBB7B18BC9CFABDCCB5157649D475B3396A893B59", 16).unwrap();
1742        let prime2 = U512::from_str_radix("8821AE888CFE44FB3667C54A1C40452D02309B64940AE5FA957390F250BDC919DC350E4DB6B4E5CF05F393D9B4DF89E55BB5F7DFC114F465A250EF55284BF793", 16).unwrap();
1743
1744        rsa.calculate_keys(prime1.into_biguint(), prime2.into_biguint());
1745        println!("RSA_1024_u32: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1746        println!("RSA_1024_u32: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1747    });
1748
1749    // Example for RSA_2048_u32
1750    thread.push(||{
1751        use cryptocol::asymmetric::RSA_2048_u32;
1752
1753        let mut rsa = RSA_2048_u32::new();
1754        let prime1 = U1024::from_str_radix("AD302C104ACE9E6BF8ADACC4BD0F3FDF141BB9B0A7285E9948B009F5A276F1D3F22C84199CB84D94BB41AD4BF2A9173D9A26132174E766F963F9655281B27AC265C17AEE34BEF077CED4F1EE13428DEF58AD5184D37C4169FDF3D922B678E65C4D8C64A870607C869C6328B790F4418D7425A0A92E169CB3609D28B5CC647D2D", 16).unwrap();
1755        let prime2 = U1024::from_str_radix("91B307B767F9BDE99AB167625F41A0396E3B06CC6C1059E5EACF42342013C99EBE230B7AD380577521F242E3A84AD15B2F7B96F95B5C35FA409FE60410457A8DB1CBF45D2592509DFA83A4B4EDBEE35075B79EA36B4B99B5F88F5AEC40CB0CD5C1B2D9853EA830CF08FAE6E5232F47F5BCE755AC8F3A0DFD861F1124BE3457C9", 16).unwrap();
1756
1757        rsa.calculate_keys(prime1.into_biguint(), prime2.into_biguint());
1758        println!("RSA_2048_u32: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1759        println!("RSA_2048_u32: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1760    });
1761    
1762    // Example for RSA_4096_u32
1763    thread.push(||{
1764        use cryptocol::asymmetric::RSA_4096_u32;
1765
1766        let mut rsa = RSA_4096_u32::new();
1767        let prime1 = U2048::from_str_radix("E12DC76D28508F586A9C5812D8B17C9CE12AE362AB83E61D2BAB87B5C4C479E11A4429EEB3E72A8505F63F8DE53EF128C60DF09C2A301EFFD54A3D820F5DDC8A523AD6A73ED3DBFB8B3CE060FDCDEA86179EA426DFA7EFF2916848A4AF76E102A4152964FD49CEB0E7EA824CD6362E1EF2E10290B8D0DE717776C4100AD5150100E35F0F7DAA34B983A462DE0A2243659856A2C2B6A321E3FDFA3DFC0B5F6F027839300BA97A4FDE103DC0AE936D8263E9E9825959AE643E3DD2D44130EEA2E879D8EAA3852A740E65DE824ABF39FAEE7A75E08A5AB53C7F65A0DA865638C8DCE407E1BA5441E2223F0654848D0FB2689A99FF29E9A73C4F6658BF6657DD275F", 16).unwrap();
1768        let prime2 = U2048::from_str_radix("D29FC14636D944F57043C63461D40846452C3211654B3C68F77C1C8F28D8E4E323F27779B1F4F6BC2C3D245F77D18CDEEAAB8FCA778991608D6A10D1C7A1F36F2B143EF89A463AC998098116E7024790DE0FA381120986FEC53A659AC6F0D2B1D7EAC64466F6F62CA409B683DF9882980DE906BC1CC105C60134841D29356F731A6ABB832215AEE148D9E1DE35EAB9E61A289C1EC811F615502954088BDFAFDFF9902505E41EB4C896727D1032D795B1B315104536F8F9EE6757360E5E3E4B80D1E62D355C4DB2C59C9F8B66CADF0781C3D9211E71471CB93F79489EDDDF5C1E546ADA8EB42BF27960E4EB75EDD90A3B3A32C815A6879886A82D107E150587CD", 16).unwrap();
1769
1770        rsa.calculate_keys(prime1.into_biguint(), prime2.into_biguint());
1771        println!("RSA_4096_u32: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1772        println!("RSA_4096_u32: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1773    });
1774    
1775    // Example for RSA_1024_u16
1776    thread.push(||{
1777        use cryptocol::asymmetric::RSA_1024_u16;
1778
1779        let mut rsa = RSA_1024_u16::new();
1780        let prime1 = U512::from_str_radix("9696CB197B606EE02CCA95643546AF6EBDB3D58EF0382F2BA46BAF9089490A5856AD6E6DC3169C7B1AE4E6CDBB7B18BC9CFABDCCB5157649D475B3396A893B59", 16).unwrap();
1781        let prime2 = U512::from_str_radix("8821AE888CFE44FB3667C54A1C40452D02309B64940AE5FA957390F250BDC919DC350E4DB6B4E5CF05F393D9B4DF89E55BB5F7DFC114F465A250EF55284BF793", 16).unwrap();
1782
1783        rsa.calculate_keys(prime1.into_biguint(), prime2.into_biguint());
1784        println!("RSA_1024_u16: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1785        println!("RSA_1024_u16: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1786    });
1787
1788    // Example for RSA_2048_u16
1789    thread.push(||{
1790        use cryptocol::asymmetric::RSA_2048_u16;
1791
1792        let mut rsa = RSA_2048_u16::new();
1793        let prime1 = U1024::from_str_radix("AD302C104ACE9E6BF8ADACC4BD0F3FDF141BB9B0A7285E9948B009F5A276F1D3F22C84199CB84D94BB41AD4BF2A9173D9A26132174E766F963F9655281B27AC265C17AEE34BEF077CED4F1EE13428DEF58AD5184D37C4169FDF3D922B678E65C4D8C64A870607C869C6328B790F4418D7425A0A92E169CB3609D28B5CC647D2D", 16).unwrap();
1794        let prime2 = U1024::from_str_radix("91B307B767F9BDE99AB167625F41A0396E3B06CC6C1059E5EACF42342013C99EBE230B7AD380577521F242E3A84AD15B2F7B96F95B5C35FA409FE60410457A8DB1CBF45D2592509DFA83A4B4EDBEE35075B79EA36B4B99B5F88F5AEC40CB0CD5C1B2D9853EA830CF08FAE6E5232F47F5BCE755AC8F3A0DFD861F1124BE3457C9", 16).unwrap();
1795
1796        rsa.calculate_keys(prime1.into_biguint(), prime2.into_biguint());
1797        println!("RSA_2048_u16: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1798        println!("RSA_2048_u16: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1799    });
1800    
1801    // Example for RSA_4096_u16
1802    thread.push(||{
1803        use cryptocol::asymmetric::RSA_4096_u16;
1804
1805        let mut rsa = RSA_4096_u16::new();
1806        let prime1 = U2048::from_str_radix("E12DC76D28508F586A9C5812D8B17C9CE12AE362AB83E61D2BAB87B5C4C479E11A4429EEB3E72A8505F63F8DE53EF128C60DF09C2A301EFFD54A3D820F5DDC8A523AD6A73ED3DBFB8B3CE060FDCDEA86179EA426DFA7EFF2916848A4AF76E102A4152964FD49CEB0E7EA824CD6362E1EF2E10290B8D0DE717776C4100AD5150100E35F0F7DAA34B983A462DE0A2243659856A2C2B6A321E3FDFA3DFC0B5F6F027839300BA97A4FDE103DC0AE936D8263E9E9825959AE643E3DD2D44130EEA2E879D8EAA3852A740E65DE824ABF39FAEE7A75E08A5AB53C7F65A0DA865638C8DCE407E1BA5441E2223F0654848D0FB2689A99FF29E9A73C4F6658BF6657DD275F", 16).unwrap();
1807        let prime2 = U2048::from_str_radix("D29FC14636D944F57043C63461D40846452C3211654B3C68F77C1C8F28D8E4E323F27779B1F4F6BC2C3D245F77D18CDEEAAB8FCA778991608D6A10D1C7A1F36F2B143EF89A463AC998098116E7024790DE0FA381120986FEC53A659AC6F0D2B1D7EAC64466F6F62CA409B683DF9882980DE906BC1CC105C60134841D29356F731A6ABB832215AEE148D9E1DE35EAB9E61A289C1EC811F615502954088BDFAFDFF9902505E41EB4C896727D1032D795B1B315104536F8F9EE6757360E5E3E4B80D1E62D355C4DB2C59C9F8B66CADF0781C3D9211E71471CB93F79489EDDDF5C1E546ADA8EB42BF27960E4EB75EDD90A3B3A32C815A6879886A82D107E150587CD", 16).unwrap();
1808
1809        rsa.calculate_keys(prime1.into_biguint(), prime2.into_biguint());
1810        println!("RSA_4096_u16: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1811        println!("RSA_4096_u16: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1812    });
1813    
1814    // Example for RSA_1024_u8
1815    thread.push(||{
1816        use cryptocol::asymmetric::RSA_1024_u8;
1817
1818        let mut rsa = RSA_1024_u8::new();
1819        let prime1 = U512::from_str_radix("9696CB197B606EE02CCA95643546AF6EBDB3D58EF0382F2BA46BAF9089490A5856AD6E6DC3169C7B1AE4E6CDBB7B18BC9CFABDCCB5157649D475B3396A893B59", 16).unwrap();
1820        let prime2 = U512::from_str_radix("8821AE888CFE44FB3667C54A1C40452D02309B64940AE5FA957390F250BDC919DC350E4DB6B4E5CF05F393D9B4DF89E55BB5F7DFC114F465A250EF55284BF793", 16).unwrap();
1821
1822        rsa.calculate_keys(prime1.into_biguint(), prime2.into_biguint());
1823        println!("RSA_1024_u8: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1824        println!("RSA_1024_u8: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1825    });
1826
1827    // Example for RSA_2048_u8
1828    thread.push(||{
1829        use cryptocol::asymmetric::RSA_2048_u8;
1830
1831        let mut rsa = RSA_2048_u8::new();
1832        let prime1 = U1024::from_str_radix("AD302C104ACE9E6BF8ADACC4BD0F3FDF141BB9B0A7285E9948B009F5A276F1D3F22C84199CB84D94BB41AD4BF2A9173D9A26132174E766F963F9655281B27AC265C17AEE34BEF077CED4F1EE13428DEF58AD5184D37C4169FDF3D922B678E65C4D8C64A870607C869C6328B790F4418D7425A0A92E169CB3609D28B5CC647D2D", 16).unwrap();
1833        let prime2 = U1024::from_str_radix("91B307B767F9BDE99AB167625F41A0396E3B06CC6C1059E5EACF42342013C99EBE230B7AD380577521F242E3A84AD15B2F7B96F95B5C35FA409FE60410457A8DB1CBF45D2592509DFA83A4B4EDBEE35075B79EA36B4B99B5F88F5AEC40CB0CD5C1B2D9853EA830CF08FAE6E5232F47F5BCE755AC8F3A0DFD861F1124BE3457C9", 16).unwrap();
1834
1835        rsa.calculate_keys(prime1.into_biguint(), prime2.into_biguint());
1836        println!("RSA_2048_u8: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1837        println!("RSA_2048_u8: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1838    });
1839    
1840    // Example for RSA_4096_u8
1841    thread.push(||{
1842        use cryptocol::asymmetric::RSA_4096_u8;
1843
1844        let mut rsa = RSA_4096_u8::new();
1845        let prime1 = U2048::from_str_radix("E12DC76D28508F586A9C5812D8B17C9CE12AE362AB83E61D2BAB87B5C4C479E11A4429EEB3E72A8505F63F8DE53EF128C60DF09C2A301EFFD54A3D820F5DDC8A523AD6A73ED3DBFB8B3CE060FDCDEA86179EA426DFA7EFF2916848A4AF76E102A4152964FD49CEB0E7EA824CD6362E1EF2E10290B8D0DE717776C4100AD5150100E35F0F7DAA34B983A462DE0A2243659856A2C2B6A321E3FDFA3DFC0B5F6F027839300BA97A4FDE103DC0AE936D8263E9E9825959AE643E3DD2D44130EEA2E879D8EAA3852A740E65DE824ABF39FAEE7A75E08A5AB53C7F65A0DA865638C8DCE407E1BA5441E2223F0654848D0FB2689A99FF29E9A73C4F6658BF6657DD275F", 16).unwrap();
1846        let prime2 = U2048::from_str_radix("D29FC14636D944F57043C63461D40846452C3211654B3C68F77C1C8F28D8E4E323F27779B1F4F6BC2C3D245F77D18CDEEAAB8FCA778991608D6A10D1C7A1F36F2B143EF89A463AC998098116E7024790DE0FA381120986FEC53A659AC6F0D2B1D7EAC64466F6F62CA409B683DF9882980DE906BC1CC105C60134841D29356F731A6ABB832215AEE148D9E1DE35EAB9E61A289C1EC811F615502954088BDFAFDFF9902505E41EB4C896727D1032D795B1B315104536F8F9EE6757360E5E3E4B80D1E62D355C4DB2C59C9F8B66CADF0781C3D9211E71471CB93F79489EDDDF5C1E546ADA8EB42BF27960E4EB75EDD90A3B3A32C815A6879886A82D107E150587CD", 16).unwrap();
1847
1848        rsa.calculate_keys(prime1.into_biguint(), prime2.into_biguint());
1849        println!("RSA_4096_u8: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1850        println!("RSA_4096_u8: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1851    });
1852
1853    do_simultaneously(thread);
1854    println!("-------------------------------");
1855}
1856
1857fn rsa_encrypt_biguint()
1858{
1859    println!("rsa_encrypt_biguint");
1860    use cryptocol::number::BigUInt;
1861    use cryptocol::define_utypes_with;
1862    define_utypes_with!(u64);
1863
1864    // Example for RSA_1024
1865    use cryptocol::asymmetric::RSA_1024;
1866
1867    let public_key = U1024::from(7_u8);
1868    let private_key = U1024::from_str_radix("11A086687252F0D0ECE2E723F06808EEA5467A8EE1025EE5CAC299448454B33D1A9A97596144EBF52706CEEA13F427DF7000E05542DC34ABA46ECE12D1CF5D1286A9DCDE69407D78F699CF592CAFDF5741019FCA261BAA65529AB2FADC9D00F5712A14480C9724DA29C2354DB2DCABEDD89735A6B663984831B427061704E6D7", 16).unwrap();
1869    let modulus = U1024::from_str_radix("7b63acdb204495b67a3451fb92d83e8684ed59e8271098488b5230df9e50e6abba3a2371a8e273b4112fa8668bad171c10062254d40570b17f07a283bcab8b83252bdf633cc22120ec097748bc5f46e1492f2f4e4bf6ae1f1d88c0d5fdfea18474a7ba71b2e25f4624dbe6f8dac0f436092a8b375bf4816a231fac86564a9513", 16).unwrap();
1870    let rsa = RSA_1024::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
1871    let message = U1024::from_string("7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777").unwrap();
1872
1873    println!("RSA_1024: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1874    println!("RSA_1024: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1875    println!("RSA_1024: Message = {}", message);
1876
1877    let cipher = rsa.encrypt_biguint(&message.into_biguint());
1878    println!("RSA_1024: Cipher = {}", cipher);
1879    assert_eq!(cipher.to_string(), "18990444273600905180995060516989662905254261731195035701565206356299504237028371798240343074431853089671262075536405296229684167693688757404552244758551778537810033711541966014458437636847820750518338546544929478474442855272138237274277632124436569414527899485686220502485118890982309705646418471801278267757");
1880
1881    // Example for RSA_2048
1882    use cryptocol::asymmetric::RSA_2048;
1883
1884    let public_key = U2048::from(3_u8);
1885    let private_key = U2048::from_str_radix("701F1A22CF4EC7F8084FCE973A11B7C769D977C65E2CE023C8680270882A63AA5A1F591DBB7D9250CFE60485E22076BBF7112339393D3BB9E55A44B7584EF4A77C74040796B78464BF1E636A4033725D89B667CE27682731F2DA5A77662A7C39AF47E0078D9CFD8398DC67C20237758AE3E4CC3EE9A6364A5A70D6A886F7C5AD782D8E9700C462DC5550E884501351BF7CA151550F46724324548F2E83B7D1832A0F04B30314C14AE9FCE01E1D91B6ACF4EDAAADCD17298924B0B687DA02028B26F90A817EDFA1773396FDE0EA61A2E86C8ED519A38910F6974ABA4DDEEEF3F3D6420A62A6A7038B4DAA8D3CEB868FF4D79C2B0BF5B9D4E8A0F373AB963B3A3B", 16).unwrap();
1886    let modulus = U2048::from_str_radix("a82ea73436f62bf40c77b5e2d71a93ab1ec633a98d435035ac9c03a8cc3f957f872f05ac993c5b7937d906c8d330b219f299b4d5d5dbd996d807671304766efb3aae060b621346971ead951f604d2b8c4e919bb53b1c3acaec4787b3193fba5686ebd00b546b7c45654a9ba30353305055d7325e5e79516f87a941fcca73a885da9d96da9a86019b32e68bdca7737d4d24de47271efc65157108665b368414bb458c5646dde153694c78ee6e7a767e3d9f28801508dfb50c63a9aba588ca8c3db6d331754692ef56ffcb442649d207c50e4f860e62b4615bc15047f6d6f058ddda1788f43db6bcfe30b948ccb328a6374c24a9d6779f5e3f2e72b4d17795b39f", 16).unwrap();
1887    let rsa = RSA_2048::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
1888    let message = U2048::from_string("111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap();
1889
1890    println!("RSA_2048: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1891    println!("RSA_2048: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1892    println!("RSA_2048: Message = {}", message);
1893
1894    let cipher = rsa.encrypt_biguint(&message.into_biguint());
1895    println!("RSA_2048: Cipher = {}", cipher);
1896    assert_eq!(cipher.to_string(), "11826648665573892988392569847230424789544841077331225957148399871249268927154623470993762522900445434965023639973787631496464777431420694899592236563565553447397524662288366787064121938211894260367352462080016370592189375621911613195326192686816328076467380983986600488501826732392039921304723843353561979971845731242251071539539421583735299628338836052636445230864534605339617629402800559440180501290669969356432646609355691679827096191085790246438685484796134722878156083210208240925495334987760220950875141064570439965872317052753944644376506387327199045809671339203409748804852257989296314879619587232751200838815");
1897
1898    // Example for RSA_4096
1899    use cryptocol::asymmetric::RSA_4096;
1900
1901    let public_key = U4096::from(5_u8);
1902    let private_key = U4096::from_str_radix("65D454FB951A5CEFCA5203530570263DC58CA1F8C489801223754B92F3AFAFCF390C35A6C4F01FBFB6F70563146F1A5610816C34781F831871D946665E7752B92E522A1556DFD885332EC38E0A65A3D934C40C1B123A8181EFC7BE48657EC3437FED43EE8197E2E2F61F639DFEEBA157ED5F33B748A5ADE0881B8A377DFB4FD889732DE0F5DE07454E1845E64CD28321CF7D1B7EBACAE56F5B2EE12232927312A7D4113EACF69903245F86587EFDA359E19CAF07884D3DDD82482B1A8ACBA989933014EED53FAE4DB84A97F2CCD8CBC0C769E909CE918785EB8CA6C13232F0D88F8A0F2A124815BA1B6F5991D258B3262F012FE931BB50E90D1EB9FE3793CD8A18182768BCC1926552BDA2F452FFE5A25DADBF36F83D01FB072B463841A939F0EFAFD7E6564E7F71705CDCFB1281AF424D4EB6282F1F33ADD58DD862B3DE496D6F379BAD1E068893C3A2FFC75DDB1DC18042569AFA0F9DE44A582534BE73DA29D40E624A82A19F6D48609609600FF34BCA8E4D69F18101A3F0BAE655D5F389D568BB91E54465E5AA0FB52CA6E372A21BCDEB45EA16FC36FEFDBC9FF3F295B53C25458C75EE869755A4E4557BD639DE5D80AA9FDE709A53F4D6D135FD8611D0EED5CBB9430C13292C74DF5380BCDE17A4C3BF0E692E505683560CBA89C931934C76B4C499A5092C586EE014732761CEB7C9D67BF43472D89644D2250DAA0E82CD", 16).unwrap();
1903    let modulus = U4096::from_str_radix("7f496a3a7a60f42bbce68427c6cc2fcd36efca76f5abe016ac529e77b09b9bc3074f4310762c27afa4b4c6bbd98ae0eb94a1c741962763de8e4f97fff615276779e6b49aac97cea67ffa74718cff0ccf81f50f21d6c921e26bb9adda7ede74145fe894ea21fddb9bb3a73c857ea689ade8b700a51acf1958aa226cc55d7a23ceabcff95933558916a19e575fe00723ea435c625e697d9ecb31fa996abf370fd751c9158e58343f43ed7767ee9ebd0c305a03dac96a608d54e2da35e12d7e93ebf7fc1a2a8a8f99e1265d3def800efeb0f944634c4235e967666fd0717ebfad0eb36c92f496da1b28a24b2ff646eedfefbac17be37e2a25235066687dc578c0ee1a0790c4437f848078eefd7082f84fc343c1accf9cc24f5e8e0eb021f4dd25fd308c91a79c416639c63e8ad87d452a2d25b4d37356a8d8e70b82df6226fbda1fb7d5a6346d18a9ec79401d6bb3776fa2115eb1c6bc83213eef559f10d0cd21a6d159f3a8910fc13d3a2c031eb3394e7a7928df1d854122b0dc032cb3272adc131ed8bd6e82af43294db9b0640189ebf6da9922af531638f7f71282c240518559e3c839767d78b5b5031f1a88b13028a55587f15a047cd2f565bad97a9a50afab1699397dcc92f10bc0140d2a796686253eabf412ea85e70c0c1d47a22b803fcf94af4ad3dda0dca583ff830b57b2cf86e1c2c0dd15b2a26372f3e43a1300226d", 16).unwrap();
1904    let rsa = RSA_4096::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
1905    let message = U4096::from_string("222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap();
1906
1907    println!("RSA_4096: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1908    println!("RSA_4096: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1909    println!("RSA_4096: Message = {}", message);
1910
1911    let cipher = rsa.encrypt_biguint(&message.into_biguint());
1912    println!("RSA_4096: Cipher = {}", cipher);
1913    assert_eq!(cipher.to_string(), "306888388337466187282042307062704792652419569166337859961296761128522602783284171941314622434380020194218138738129324632968494397146631631568752167149366814328742864467558796468059168590183607048154820747334404657757306388818354135775667034077939707535729072254477687440326383413829184673485777354355593153355280000684319981409686640441919882399187403283001545508316655294832517432640860568986729894134362791743417711899828106270794047478495501030619345165383268394002700760718934742142793958715037000863729220391884324389876262174512194595764289919358407235812417445470095912470878283115657786217581619570857356292100179097109404807157489324367049867976992155866043576802494631549170761502725304142654782565627033872965724907731137654011229939774263227934571010082210703339879069398028070889488455929343451400703302388062601385983831754138909311641485104519487019661743420872116450935046792460451393530116569148009578799297083991851298476713329013797490297381294533747638243268187426309927081476470270764781262099702867717226556463217265238293512242449585754661504083025550479259607209149236813578913767448367431207086242762349794159228923175132222452502498030057987566531658182120131188295100537311716791771009234223633803366604959");
1914
1915    // Example for RSA_Genric
1916    use cryptocol::asymmetric::RSA_Generic;
1917
1918    let public_key = BigUInt::<u64, 4>::from(5_u8);
1919    let private_key = BigUInt::<u64, 4>::from_str_radix("56C852580B06FD2C819A2A2AB58017266A58A101105A4F2FF0A9D17BB746239D", 16).unwrap();
1920    let modulus = BigUInt::<u64, 4>::from_str_radix("90a333e81260fb4a2d5646472e802696ddd96c20e9c0faae3db46db413927641", 16).unwrap();
1921    let rsa = RSA_Generic::<4, u64, 5>::new_with_keys(public_key, private_key, modulus);
1922    let message = BigUInt::<u64, 4>::from_string("55555555555555555555555555555555555555555555555").unwrap();
1923
1924    println!("RSA_Generic<4, u64, 5>: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1925    println!("RSA_Generic<4, u64, 5>: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1926    println!("RSA_Generic<4, u64, 5>: Message = {}", message);
1927
1928    let cipher = rsa.encrypt_biguint(&message);
1929    println!("RSA_Generic<4, u64, 5>: Cipher = {}", cipher);
1930    assert_eq!(cipher.to_string(), "17457503729755083380415471913707555924530359885949510867590691646758707405421");
1931
1932    // Example for RSA_1024_u128
1933    use cryptocol::asymmetric::RSA_1024_u128;
1934
1935    let public_key = U1024::from(7_u8);
1936    let private_key = U1024::from_str_radix("11A086687252F0D0ECE2E723F06808EEA5467A8EE1025EE5CAC299448454B33D1A9A97596144EBF52706CEEA13F427DF7000E05542DC34ABA46ECE12D1CF5D1286A9DCDE69407D78F699CF592CAFDF5741019FCA261BAA65529AB2FADC9D00F5712A14480C9724DA29C2354DB2DCABEDD89735A6B663984831B427061704E6D7", 16).unwrap();
1937    let modulus = U1024::from_str_radix("7b63acdb204495b67a3451fb92d83e8684ed59e8271098488b5230df9e50e6abba3a2371a8e273b4112fa8668bad171c10062254d40570b17f07a283bcab8b83252bdf633cc22120ec097748bc5f46e1492f2f4e4bf6ae1f1d88c0d5fdfea18474a7ba71b2e25f4624dbe6f8dac0f436092a8b375bf4816a231fac86564a9513", 16).unwrap();
1938    let rsa = RSA_1024_u128::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
1939    let message = U1024::from_string("7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777").unwrap();
1940
1941    println!("RSA_1024_u128: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1942    println!("RSA_1024_u128: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1943    println!("RSA_1024_u128: Message = {}", message);
1944
1945    let cipher = rsa.encrypt_biguint(&message.into_biguint());
1946    println!("RSA_1024_u128: Cipher = {}", cipher);
1947    assert_eq!(cipher.to_string(), "18990444273600905180995060516989662905254261731195035701565206356299504237028371798240343074431853089671262075536405296229684167693688757404552244758551778537810033711541966014458437636847820750518338546544929478474442855272138237274277632124436569414527899485686220502485118890982309705646418471801278267757");
1948
1949    // Example for RSA_2048_u128
1950    use cryptocol::asymmetric::RSA_2048_u128;
1951
1952    let public_key = U2048::from(3_u8);
1953    let private_key = U2048::from_str_radix("701F1A22CF4EC7F8084FCE973A11B7C769D977C65E2CE023C8680270882A63AA5A1F591DBB7D9250CFE60485E22076BBF7112339393D3BB9E55A44B7584EF4A77C74040796B78464BF1E636A4033725D89B667CE27682731F2DA5A77662A7C39AF47E0078D9CFD8398DC67C20237758AE3E4CC3EE9A6364A5A70D6A886F7C5AD782D8E9700C462DC5550E884501351BF7CA151550F46724324548F2E83B7D1832A0F04B30314C14AE9FCE01E1D91B6ACF4EDAAADCD17298924B0B687DA02028B26F90A817EDFA1773396FDE0EA61A2E86C8ED519A38910F6974ABA4DDEEEF3F3D6420A62A6A7038B4DAA8D3CEB868FF4D79C2B0BF5B9D4E8A0F373AB963B3A3B", 16).unwrap();
1954    let modulus = U2048::from_str_radix("a82ea73436f62bf40c77b5e2d71a93ab1ec633a98d435035ac9c03a8cc3f957f872f05ac993c5b7937d906c8d330b219f299b4d5d5dbd996d807671304766efb3aae060b621346971ead951f604d2b8c4e919bb53b1c3acaec4787b3193fba5686ebd00b546b7c45654a9ba30353305055d7325e5e79516f87a941fcca73a885da9d96da9a86019b32e68bdca7737d4d24de47271efc65157108665b368414bb458c5646dde153694c78ee6e7a767e3d9f28801508dfb50c63a9aba588ca8c3db6d331754692ef56ffcb442649d207c50e4f860e62b4615bc15047f6d6f058ddda1788f43db6bcfe30b948ccb328a6374c24a9d6779f5e3f2e72b4d17795b39f", 16).unwrap();
1955    let rsa = RSA_2048_u128::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
1956    let message = U2048::from_string("111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap();
1957
1958    println!("RSA_2048_u128: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1959    println!("RSA_2048_u128: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1960    println!("RSA_2048_u128: Message = {}", message);
1961
1962    let cipher = rsa.encrypt_biguint(&message.into_biguint());
1963    println!("RSA_2048_u128: Cipher = {}", cipher);
1964    assert_eq!(cipher.to_string(), "11826648665573892988392569847230424789544841077331225957148399871249268927154623470993762522900445434965023639973787631496464777431420694899592236563565553447397524662288366787064121938211894260367352462080016370592189375621911613195326192686816328076467380983986600488501826732392039921304723843353561979971845731242251071539539421583735299628338836052636445230864534605339617629402800559440180501290669969356432646609355691679827096191085790246438685484796134722878156083210208240925495334987760220950875141064570439965872317052753944644376506387327199045809671339203409748804852257989296314879619587232751200838815");
1965
1966    // Example for RSA_4096_u128
1967    use cryptocol::asymmetric::RSA_4096_u128;
1968
1969    let public_key = U4096::from(5_u8);
1970    let private_key = U4096::from_str_radix("65D454FB951A5CEFCA5203530570263DC58CA1F8C489801223754B92F3AFAFCF390C35A6C4F01FBFB6F70563146F1A5610816C34781F831871D946665E7752B92E522A1556DFD885332EC38E0A65A3D934C40C1B123A8181EFC7BE48657EC3437FED43EE8197E2E2F61F639DFEEBA157ED5F33B748A5ADE0881B8A377DFB4FD889732DE0F5DE07454E1845E64CD28321CF7D1B7EBACAE56F5B2EE12232927312A7D4113EACF69903245F86587EFDA359E19CAF07884D3DDD82482B1A8ACBA989933014EED53FAE4DB84A97F2CCD8CBC0C769E909CE918785EB8CA6C13232F0D88F8A0F2A124815BA1B6F5991D258B3262F012FE931BB50E90D1EB9FE3793CD8A18182768BCC1926552BDA2F452FFE5A25DADBF36F83D01FB072B463841A939F0EFAFD7E6564E7F71705CDCFB1281AF424D4EB6282F1F33ADD58DD862B3DE496D6F379BAD1E068893C3A2FFC75DDB1DC18042569AFA0F9DE44A582534BE73DA29D40E624A82A19F6D48609609600FF34BCA8E4D69F18101A3F0BAE655D5F389D568BB91E54465E5AA0FB52CA6E372A21BCDEB45EA16FC36FEFDBC9FF3F295B53C25458C75EE869755A4E4557BD639DE5D80AA9FDE709A53F4D6D135FD8611D0EED5CBB9430C13292C74DF5380BCDE17A4C3BF0E692E505683560CBA89C931934C76B4C499A5092C586EE014732761CEB7C9D67BF43472D89644D2250DAA0E82CD", 16).unwrap();
1971    let modulus = U4096::from_str_radix("7f496a3a7a60f42bbce68427c6cc2fcd36efca76f5abe016ac529e77b09b9bc3074f4310762c27afa4b4c6bbd98ae0eb94a1c741962763de8e4f97fff615276779e6b49aac97cea67ffa74718cff0ccf81f50f21d6c921e26bb9adda7ede74145fe894ea21fddb9bb3a73c857ea689ade8b700a51acf1958aa226cc55d7a23ceabcff95933558916a19e575fe00723ea435c625e697d9ecb31fa996abf370fd751c9158e58343f43ed7767ee9ebd0c305a03dac96a608d54e2da35e12d7e93ebf7fc1a2a8a8f99e1265d3def800efeb0f944634c4235e967666fd0717ebfad0eb36c92f496da1b28a24b2ff646eedfefbac17be37e2a25235066687dc578c0ee1a0790c4437f848078eefd7082f84fc343c1accf9cc24f5e8e0eb021f4dd25fd308c91a79c416639c63e8ad87d452a2d25b4d37356a8d8e70b82df6226fbda1fb7d5a6346d18a9ec79401d6bb3776fa2115eb1c6bc83213eef559f10d0cd21a6d159f3a8910fc13d3a2c031eb3394e7a7928df1d854122b0dc032cb3272adc131ed8bd6e82af43294db9b0640189ebf6da9922af531638f7f71282c240518559e3c839767d78b5b5031f1a88b13028a55587f15a047cd2f565bad97a9a50afab1699397dcc92f10bc0140d2a796686253eabf412ea85e70c0c1d47a22b803fcf94af4ad3dda0dca583ff830b57b2cf86e1c2c0dd15b2a26372f3e43a1300226d", 16).unwrap();
1972    let rsa = RSA_4096_u128::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
1973    let message = U4096::from_string("222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap();
1974
1975    println!("RSA_4096_u128: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1976    println!("RSA_4096_u128: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1977    println!("RSA_4096_u128: Message = {}", message);
1978
1979    let cipher = rsa.encrypt_biguint(&message.into_biguint());
1980    println!("RSA_4096_u128: Cipher = {}", cipher);
1981    assert_eq!(cipher.to_string(), "306888388337466187282042307062704792652419569166337859961296761128522602783284171941314622434380020194218138738129324632968494397146631631568752167149366814328742864467558796468059168590183607048154820747334404657757306388818354135775667034077939707535729072254477687440326383413829184673485777354355593153355280000684319981409686640441919882399187403283001545508316655294832517432640860568986729894134362791743417711899828106270794047478495501030619345165383268394002700760718934742142793958715037000863729220391884324389876262174512194595764289919358407235812417445470095912470878283115657786217581619570857356292100179097109404807157489324367049867976992155866043576802494631549170761502725304142654782565627033872965724907731137654011229939774263227934571010082210703339879069398028070889488455929343451400703302388062601385983831754138909311641485104519487019661743420872116450935046792460451393530116569148009578799297083991851298476713329013797490297381294533747638243268187426309927081476470270764781262099702867717226556463217265238293512242449585754661504083025550479259607209149236813578913767448367431207086242762349794159228923175132222452502498030057987566531658182120131188295100537311716791771009234223633803366604959");
1982
1983    // Example for RSA_1024_u64
1984    use cryptocol::asymmetric::RSA_1024_u64;
1985
1986    let public_key = U1024::from(7_u8);
1987    let private_key = U1024::from_str_radix("11A086687252F0D0ECE2E723F06808EEA5467A8EE1025EE5CAC299448454B33D1A9A97596144EBF52706CEEA13F427DF7000E05542DC34ABA46ECE12D1CF5D1286A9DCDE69407D78F699CF592CAFDF5741019FCA261BAA65529AB2FADC9D00F5712A14480C9724DA29C2354DB2DCABEDD89735A6B663984831B427061704E6D7", 16).unwrap();
1988    let modulus = U1024::from_str_radix("7b63acdb204495b67a3451fb92d83e8684ed59e8271098488b5230df9e50e6abba3a2371a8e273b4112fa8668bad171c10062254d40570b17f07a283bcab8b83252bdf633cc22120ec097748bc5f46e1492f2f4e4bf6ae1f1d88c0d5fdfea18474a7ba71b2e25f4624dbe6f8dac0f436092a8b375bf4816a231fac86564a9513", 16).unwrap();
1989    let rsa = RSA_1024_u64::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
1990    let message = U1024::from_string("7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777").unwrap();
1991
1992    println!("RSA_1024_u64: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
1993    println!("RSA_1024_u64: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
1994    println!("RSA_1024_u64: Message = {}", message);
1995
1996    let cipher = rsa.encrypt_biguint(&message.into_biguint());
1997    println!("RSA_1024_u64: Cipher = {}", cipher);
1998    assert_eq!(cipher.to_string(), "18990444273600905180995060516989662905254261731195035701565206356299504237028371798240343074431853089671262075536405296229684167693688757404552244758551778537810033711541966014458437636847820750518338546544929478474442855272138237274277632124436569414527899485686220502485118890982309705646418471801278267757");
1999
2000    // Example for RSA_2048_u64
2001    use cryptocol::asymmetric::RSA_2048_u64;
2002
2003    let public_key = U2048::from(3_u8);
2004    let private_key = U2048::from_str_radix("701F1A22CF4EC7F8084FCE973A11B7C769D977C65E2CE023C8680270882A63AA5A1F591DBB7D9250CFE60485E22076BBF7112339393D3BB9E55A44B7584EF4A77C74040796B78464BF1E636A4033725D89B667CE27682731F2DA5A77662A7C39AF47E0078D9CFD8398DC67C20237758AE3E4CC3EE9A6364A5A70D6A886F7C5AD782D8E9700C462DC5550E884501351BF7CA151550F46724324548F2E83B7D1832A0F04B30314C14AE9FCE01E1D91B6ACF4EDAAADCD17298924B0B687DA02028B26F90A817EDFA1773396FDE0EA61A2E86C8ED519A38910F6974ABA4DDEEEF3F3D6420A62A6A7038B4DAA8D3CEB868FF4D79C2B0BF5B9D4E8A0F373AB963B3A3B", 16).unwrap();
2005    let modulus = U2048::from_str_radix("a82ea73436f62bf40c77b5e2d71a93ab1ec633a98d435035ac9c03a8cc3f957f872f05ac993c5b7937d906c8d330b219f299b4d5d5dbd996d807671304766efb3aae060b621346971ead951f604d2b8c4e919bb53b1c3acaec4787b3193fba5686ebd00b546b7c45654a9ba30353305055d7325e5e79516f87a941fcca73a885da9d96da9a86019b32e68bdca7737d4d24de47271efc65157108665b368414bb458c5646dde153694c78ee6e7a767e3d9f28801508dfb50c63a9aba588ca8c3db6d331754692ef56ffcb442649d207c50e4f860e62b4615bc15047f6d6f058ddda1788f43db6bcfe30b948ccb328a6374c24a9d6779f5e3f2e72b4d17795b39f", 16).unwrap();
2006    let rsa = RSA_2048_u64::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2007    let message = U2048::from_string("111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap();
2008
2009    println!("RSA_2048_u64: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2010    println!("RSA_2048_u64: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2011    println!("RSA_2048_u64: Message = {}", message);
2012
2013    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2014    println!("RSA_2048_u64: Cipher = {}", cipher);
2015    assert_eq!(cipher.to_string(), "11826648665573892988392569847230424789544841077331225957148399871249268927154623470993762522900445434965023639973787631496464777431420694899592236563565553447397524662288366787064121938211894260367352462080016370592189375621911613195326192686816328076467380983986600488501826732392039921304723843353561979971845731242251071539539421583735299628338836052636445230864534605339617629402800559440180501290669969356432646609355691679827096191085790246438685484796134722878156083210208240925495334987760220950875141064570439965872317052753944644376506387327199045809671339203409748804852257989296314879619587232751200838815");
2016
2017    // Example for RSA_4096_u64
2018    use cryptocol::asymmetric::RSA_4096_u64;
2019
2020    let public_key = U4096::from(5_u8);
2021    let private_key = U4096::from_str_radix("65D454FB951A5CEFCA5203530570263DC58CA1F8C489801223754B92F3AFAFCF390C35A6C4F01FBFB6F70563146F1A5610816C34781F831871D946665E7752B92E522A1556DFD885332EC38E0A65A3D934C40C1B123A8181EFC7BE48657EC3437FED43EE8197E2E2F61F639DFEEBA157ED5F33B748A5ADE0881B8A377DFB4FD889732DE0F5DE07454E1845E64CD28321CF7D1B7EBACAE56F5B2EE12232927312A7D4113EACF69903245F86587EFDA359E19CAF07884D3DDD82482B1A8ACBA989933014EED53FAE4DB84A97F2CCD8CBC0C769E909CE918785EB8CA6C13232F0D88F8A0F2A124815BA1B6F5991D258B3262F012FE931BB50E90D1EB9FE3793CD8A18182768BCC1926552BDA2F452FFE5A25DADBF36F83D01FB072B463841A939F0EFAFD7E6564E7F71705CDCFB1281AF424D4EB6282F1F33ADD58DD862B3DE496D6F379BAD1E068893C3A2FFC75DDB1DC18042569AFA0F9DE44A582534BE73DA29D40E624A82A19F6D48609609600FF34BCA8E4D69F18101A3F0BAE655D5F389D568BB91E54465E5AA0FB52CA6E372A21BCDEB45EA16FC36FEFDBC9FF3F295B53C25458C75EE869755A4E4557BD639DE5D80AA9FDE709A53F4D6D135FD8611D0EED5CBB9430C13292C74DF5380BCDE17A4C3BF0E692E505683560CBA89C931934C76B4C499A5092C586EE014732761CEB7C9D67BF43472D89644D2250DAA0E82CD", 16).unwrap();
2022    let modulus = U4096::from_str_radix("7f496a3a7a60f42bbce68427c6cc2fcd36efca76f5abe016ac529e77b09b9bc3074f4310762c27afa4b4c6bbd98ae0eb94a1c741962763de8e4f97fff615276779e6b49aac97cea67ffa74718cff0ccf81f50f21d6c921e26bb9adda7ede74145fe894ea21fddb9bb3a73c857ea689ade8b700a51acf1958aa226cc55d7a23ceabcff95933558916a19e575fe00723ea435c625e697d9ecb31fa996abf370fd751c9158e58343f43ed7767ee9ebd0c305a03dac96a608d54e2da35e12d7e93ebf7fc1a2a8a8f99e1265d3def800efeb0f944634c4235e967666fd0717ebfad0eb36c92f496da1b28a24b2ff646eedfefbac17be37e2a25235066687dc578c0ee1a0790c4437f848078eefd7082f84fc343c1accf9cc24f5e8e0eb021f4dd25fd308c91a79c416639c63e8ad87d452a2d25b4d37356a8d8e70b82df6226fbda1fb7d5a6346d18a9ec79401d6bb3776fa2115eb1c6bc83213eef559f10d0cd21a6d159f3a8910fc13d3a2c031eb3394e7a7928df1d854122b0dc032cb3272adc131ed8bd6e82af43294db9b0640189ebf6da9922af531638f7f71282c240518559e3c839767d78b5b5031f1a88b13028a55587f15a047cd2f565bad97a9a50afab1699397dcc92f10bc0140d2a796686253eabf412ea85e70c0c1d47a22b803fcf94af4ad3dda0dca583ff830b57b2cf86e1c2c0dd15b2a26372f3e43a1300226d", 16).unwrap();
2023    let rsa = RSA_4096_u64::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2024    let message = U4096::from_string("222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap();
2025
2026    println!("RSA_4096_u64: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2027    println!("RSA_4096_u64: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2028    println!("RSA_4096_u64: Message = {}", message);
2029
2030    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2031    println!("RSA_4096_u64: Cipher = {}", cipher);
2032    assert_eq!(cipher.to_string(), "306888388337466187282042307062704792652419569166337859961296761128522602783284171941314622434380020194218138738129324632968494397146631631568752167149366814328742864467558796468059168590183607048154820747334404657757306388818354135775667034077939707535729072254477687440326383413829184673485777354355593153355280000684319981409686640441919882399187403283001545508316655294832517432640860568986729894134362791743417711899828106270794047478495501030619345165383268394002700760718934742142793958715037000863729220391884324389876262174512194595764289919358407235812417445470095912470878283115657786217581619570857356292100179097109404807157489324367049867976992155866043576802494631549170761502725304142654782565627033872965724907731137654011229939774263227934571010082210703339879069398028070889488455929343451400703302388062601385983831754138909311641485104519487019661743420872116450935046792460451393530116569148009578799297083991851298476713329013797490297381294533747638243268187426309927081476470270764781262099702867717226556463217265238293512242449585754661504083025550479259607209149236813578913767448367431207086242762349794159228923175132222452502498030057987566531658182120131188295100537311716791771009234223633803366604959");
2033
2034    // Example for RSA_1024_u32
2035    use cryptocol::asymmetric::RSA_1024_u32;
2036
2037    let public_key = U1024::from(7_u8);
2038    let private_key = U1024::from_str_radix("11A086687252F0D0ECE2E723F06808EEA5467A8EE1025EE5CAC299448454B33D1A9A97596144EBF52706CEEA13F427DF7000E05542DC34ABA46ECE12D1CF5D1286A9DCDE69407D78F699CF592CAFDF5741019FCA261BAA65529AB2FADC9D00F5712A14480C9724DA29C2354DB2DCABEDD89735A6B663984831B427061704E6D7", 16).unwrap();
2039    let modulus = U1024::from_str_radix("7b63acdb204495b67a3451fb92d83e8684ed59e8271098488b5230df9e50e6abba3a2371a8e273b4112fa8668bad171c10062254d40570b17f07a283bcab8b83252bdf633cc22120ec097748bc5f46e1492f2f4e4bf6ae1f1d88c0d5fdfea18474a7ba71b2e25f4624dbe6f8dac0f436092a8b375bf4816a231fac86564a9513", 16).unwrap();
2040    let rsa = RSA_1024_u32::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2041    let message = U1024::from_string("7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777").unwrap();
2042
2043    println!("RSA_1024_u32: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2044    println!("RSA_1024_u32: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2045    println!("RSA_1024_u32: Message = {}", message);
2046
2047    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2048    println!("RSA_1024_u32: Cipher = {}", cipher);
2049    assert_eq!(cipher.to_string(), "18990444273600905180995060516989662905254261731195035701565206356299504237028371798240343074431853089671262075536405296229684167693688757404552244758551778537810033711541966014458437636847820750518338546544929478474442855272138237274277632124436569414527899485686220502485118890982309705646418471801278267757");
2050
2051    // Example for RSA_2048_u32
2052    use cryptocol::asymmetric::RSA_2048_u32;
2053
2054    let public_key = U2048::from(3_u8);
2055    let private_key = U2048::from_str_radix("701F1A22CF4EC7F8084FCE973A11B7C769D977C65E2CE023C8680270882A63AA5A1F591DBB7D9250CFE60485E22076BBF7112339393D3BB9E55A44B7584EF4A77C74040796B78464BF1E636A4033725D89B667CE27682731F2DA5A77662A7C39AF47E0078D9CFD8398DC67C20237758AE3E4CC3EE9A6364A5A70D6A886F7C5AD782D8E9700C462DC5550E884501351BF7CA151550F46724324548F2E83B7D1832A0F04B30314C14AE9FCE01E1D91B6ACF4EDAAADCD17298924B0B687DA02028B26F90A817EDFA1773396FDE0EA61A2E86C8ED519A38910F6974ABA4DDEEEF3F3D6420A62A6A7038B4DAA8D3CEB868FF4D79C2B0BF5B9D4E8A0F373AB963B3A3B", 16).unwrap();
2056    let modulus = U2048::from_str_radix("a82ea73436f62bf40c77b5e2d71a93ab1ec633a98d435035ac9c03a8cc3f957f872f05ac993c5b7937d906c8d330b219f299b4d5d5dbd996d807671304766efb3aae060b621346971ead951f604d2b8c4e919bb53b1c3acaec4787b3193fba5686ebd00b546b7c45654a9ba30353305055d7325e5e79516f87a941fcca73a885da9d96da9a86019b32e68bdca7737d4d24de47271efc65157108665b368414bb458c5646dde153694c78ee6e7a767e3d9f28801508dfb50c63a9aba588ca8c3db6d331754692ef56ffcb442649d207c50e4f860e62b4615bc15047f6d6f058ddda1788f43db6bcfe30b948ccb328a6374c24a9d6779f5e3f2e72b4d17795b39f", 16).unwrap();
2057    let rsa = RSA_2048_u32::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2058    let message = U2048::from_string("111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap();
2059
2060    println!("RSA_2048_u32: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2061    println!("RSA_2048_u32: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2062    println!("RSA_2048_u32: Message = {}", message);
2063
2064    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2065    println!("RSA_2048_u32: Cipher = {}", cipher);
2066    assert_eq!(cipher.to_string(), "11826648665573892988392569847230424789544841077331225957148399871249268927154623470993762522900445434965023639973787631496464777431420694899592236563565553447397524662288366787064121938211894260367352462080016370592189375621911613195326192686816328076467380983986600488501826732392039921304723843353561979971845731242251071539539421583735299628338836052636445230864534605339617629402800559440180501290669969356432646609355691679827096191085790246438685484796134722878156083210208240925495334987760220950875141064570439965872317052753944644376506387327199045809671339203409748804852257989296314879619587232751200838815");
2067
2068    // Example for RSA_4096_u32
2069    use cryptocol::asymmetric::RSA_4096_u32;
2070
2071    let public_key = U4096::from(5_u8);
2072    let private_key = U4096::from_str_radix("65D454FB951A5CEFCA5203530570263DC58CA1F8C489801223754B92F3AFAFCF390C35A6C4F01FBFB6F70563146F1A5610816C34781F831871D946665E7752B92E522A1556DFD885332EC38E0A65A3D934C40C1B123A8181EFC7BE48657EC3437FED43EE8197E2E2F61F639DFEEBA157ED5F33B748A5ADE0881B8A377DFB4FD889732DE0F5DE07454E1845E64CD28321CF7D1B7EBACAE56F5B2EE12232927312A7D4113EACF69903245F86587EFDA359E19CAF07884D3DDD82482B1A8ACBA989933014EED53FAE4DB84A97F2CCD8CBC0C769E909CE918785EB8CA6C13232F0D88F8A0F2A124815BA1B6F5991D258B3262F012FE931BB50E90D1EB9FE3793CD8A18182768BCC1926552BDA2F452FFE5A25DADBF36F83D01FB072B463841A939F0EFAFD7E6564E7F71705CDCFB1281AF424D4EB6282F1F33ADD58DD862B3DE496D6F379BAD1E068893C3A2FFC75DDB1DC18042569AFA0F9DE44A582534BE73DA29D40E624A82A19F6D48609609600FF34BCA8E4D69F18101A3F0BAE655D5F389D568BB91E54465E5AA0FB52CA6E372A21BCDEB45EA16FC36FEFDBC9FF3F295B53C25458C75EE869755A4E4557BD639DE5D80AA9FDE709A53F4D6D135FD8611D0EED5CBB9430C13292C74DF5380BCDE17A4C3BF0E692E505683560CBA89C931934C76B4C499A5092C586EE014732761CEB7C9D67BF43472D89644D2250DAA0E82CD", 16).unwrap();
2073    let modulus = U4096::from_str_radix("7f496a3a7a60f42bbce68427c6cc2fcd36efca76f5abe016ac529e77b09b9bc3074f4310762c27afa4b4c6bbd98ae0eb94a1c741962763de8e4f97fff615276779e6b49aac97cea67ffa74718cff0ccf81f50f21d6c921e26bb9adda7ede74145fe894ea21fddb9bb3a73c857ea689ade8b700a51acf1958aa226cc55d7a23ceabcff95933558916a19e575fe00723ea435c625e697d9ecb31fa996abf370fd751c9158e58343f43ed7767ee9ebd0c305a03dac96a608d54e2da35e12d7e93ebf7fc1a2a8a8f99e1265d3def800efeb0f944634c4235e967666fd0717ebfad0eb36c92f496da1b28a24b2ff646eedfefbac17be37e2a25235066687dc578c0ee1a0790c4437f848078eefd7082f84fc343c1accf9cc24f5e8e0eb021f4dd25fd308c91a79c416639c63e8ad87d452a2d25b4d37356a8d8e70b82df6226fbda1fb7d5a6346d18a9ec79401d6bb3776fa2115eb1c6bc83213eef559f10d0cd21a6d159f3a8910fc13d3a2c031eb3394e7a7928df1d854122b0dc032cb3272adc131ed8bd6e82af43294db9b0640189ebf6da9922af531638f7f71282c240518559e3c839767d78b5b5031f1a88b13028a55587f15a047cd2f565bad97a9a50afab1699397dcc92f10bc0140d2a796686253eabf412ea85e70c0c1d47a22b803fcf94af4ad3dda0dca583ff830b57b2cf86e1c2c0dd15b2a26372f3e43a1300226d", 16).unwrap();
2074    let rsa = RSA_4096_u32::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2075    let message = U4096::from_string("222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap();
2076
2077    println!("RSA_4096_u32: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2078    println!("RSA_4096_u32: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2079    println!("RSA_4096_u32: Message = {}", message);
2080
2081    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2082    println!("RSA_4096_u32: Cipher = {}", cipher);
2083    assert_eq!(cipher.to_string(), "306888388337466187282042307062704792652419569166337859961296761128522602783284171941314622434380020194218138738129324632968494397146631631568752167149366814328742864467558796468059168590183607048154820747334404657757306388818354135775667034077939707535729072254477687440326383413829184673485777354355593153355280000684319981409686640441919882399187403283001545508316655294832517432640860568986729894134362791743417711899828106270794047478495501030619345165383268394002700760718934742142793958715037000863729220391884324389876262174512194595764289919358407235812417445470095912470878283115657786217581619570857356292100179097109404807157489324367049867976992155866043576802494631549170761502725304142654782565627033872965724907731137654011229939774263227934571010082210703339879069398028070889488455929343451400703302388062601385983831754138909311641485104519487019661743420872116450935046792460451393530116569148009578799297083991851298476713329013797490297381294533747638243268187426309927081476470270764781262099702867717226556463217265238293512242449585754661504083025550479259607209149236813578913767448367431207086242762349794159228923175132222452502498030057987566531658182120131188295100537311716791771009234223633803366604959");
2084
2085    // Example for RSA_1024_u16
2086    use cryptocol::asymmetric::RSA_1024_u16;
2087
2088    let public_key = U1024::from(7_u8);
2089    let private_key = U1024::from_str_radix("11A086687252F0D0ECE2E723F06808EEA5467A8EE1025EE5CAC299448454B33D1A9A97596144EBF52706CEEA13F427DF7000E05542DC34ABA46ECE12D1CF5D1286A9DCDE69407D78F699CF592CAFDF5741019FCA261BAA65529AB2FADC9D00F5712A14480C9724DA29C2354DB2DCABEDD89735A6B663984831B427061704E6D7", 16).unwrap();
2090    let modulus = U1024::from_str_radix("7b63acdb204495b67a3451fb92d83e8684ed59e8271098488b5230df9e50e6abba3a2371a8e273b4112fa8668bad171c10062254d40570b17f07a283bcab8b83252bdf633cc22120ec097748bc5f46e1492f2f4e4bf6ae1f1d88c0d5fdfea18474a7ba71b2e25f4624dbe6f8dac0f436092a8b375bf4816a231fac86564a9513", 16).unwrap();
2091    let rsa = RSA_1024_u16::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2092    let message = U1024::from_string("7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777").unwrap();
2093
2094    println!("RSA_1024_u16: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2095    println!("RSA_1024_u16: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2096    println!("RSA_1024_u16: Message = {}", message);
2097
2098    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2099    println!("RSA_1024_u16: Cipher = {}", cipher);
2100    assert_eq!(cipher.to_string(), "18990444273600905180995060516989662905254261731195035701565206356299504237028371798240343074431853089671262075536405296229684167693688757404552244758551778537810033711541966014458437636847820750518338546544929478474442855272138237274277632124436569414527899485686220502485118890982309705646418471801278267757");
2101
2102    // Example for RSA_2048_u16
2103    use cryptocol::asymmetric::RSA_2048_u16;
2104
2105    let public_key = U2048::from(3_u8);
2106    let private_key = U2048::from_str_radix("701F1A22CF4EC7F8084FCE973A11B7C769D977C65E2CE023C8680270882A63AA5A1F591DBB7D9250CFE60485E22076BBF7112339393D3BB9E55A44B7584EF4A77C74040796B78464BF1E636A4033725D89B667CE27682731F2DA5A77662A7C39AF47E0078D9CFD8398DC67C20237758AE3E4CC3EE9A6364A5A70D6A886F7C5AD782D8E9700C462DC5550E884501351BF7CA151550F46724324548F2E83B7D1832A0F04B30314C14AE9FCE01E1D91B6ACF4EDAAADCD17298924B0B687DA02028B26F90A817EDFA1773396FDE0EA61A2E86C8ED519A38910F6974ABA4DDEEEF3F3D6420A62A6A7038B4DAA8D3CEB868FF4D79C2B0BF5B9D4E8A0F373AB963B3A3B", 16).unwrap();
2107    let modulus = U2048::from_str_radix("a82ea73436f62bf40c77b5e2d71a93ab1ec633a98d435035ac9c03a8cc3f957f872f05ac993c5b7937d906c8d330b219f299b4d5d5dbd996d807671304766efb3aae060b621346971ead951f604d2b8c4e919bb53b1c3acaec4787b3193fba5686ebd00b546b7c45654a9ba30353305055d7325e5e79516f87a941fcca73a885da9d96da9a86019b32e68bdca7737d4d24de47271efc65157108665b368414bb458c5646dde153694c78ee6e7a767e3d9f28801508dfb50c63a9aba588ca8c3db6d331754692ef56ffcb442649d207c50e4f860e62b4615bc15047f6d6f058ddda1788f43db6bcfe30b948ccb328a6374c24a9d6779f5e3f2e72b4d17795b39f", 16).unwrap();
2108    let rsa = RSA_2048_u16::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2109    let message = U2048::from_string("111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap();
2110
2111    println!("RSA_2048_u16: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2112    println!("RSA_2048_u16: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2113    println!("RSA_2048_u16: Message = {}", message);
2114
2115    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2116    println!("RSA_2048_u16: Cipher = {}", cipher);
2117    assert_eq!(cipher.to_string(), "11826648665573892988392569847230424789544841077331225957148399871249268927154623470993762522900445434965023639973787631496464777431420694899592236563565553447397524662288366787064121938211894260367352462080016370592189375621911613195326192686816328076467380983986600488501826732392039921304723843353561979971845731242251071539539421583735299628338836052636445230864534605339617629402800559440180501290669969356432646609355691679827096191085790246438685484796134722878156083210208240925495334987760220950875141064570439965872317052753944644376506387327199045809671339203409748804852257989296314879619587232751200838815");
2118
2119    // Example for RSA_4096_u16
2120    use cryptocol::asymmetric::RSA_4096_u16;
2121
2122    let public_key = U4096::from(5_u8);
2123    let private_key = U4096::from_str_radix("65D454FB951A5CEFCA5203530570263DC58CA1F8C489801223754B92F3AFAFCF390C35A6C4F01FBFB6F70563146F1A5610816C34781F831871D946665E7752B92E522A1556DFD885332EC38E0A65A3D934C40C1B123A8181EFC7BE48657EC3437FED43EE8197E2E2F61F639DFEEBA157ED5F33B748A5ADE0881B8A377DFB4FD889732DE0F5DE07454E1845E64CD28321CF7D1B7EBACAE56F5B2EE12232927312A7D4113EACF69903245F86587EFDA359E19CAF07884D3DDD82482B1A8ACBA989933014EED53FAE4DB84A97F2CCD8CBC0C769E909CE918785EB8CA6C13232F0D88F8A0F2A124815BA1B6F5991D258B3262F012FE931BB50E90D1EB9FE3793CD8A18182768BCC1926552BDA2F452FFE5A25DADBF36F83D01FB072B463841A939F0EFAFD7E6564E7F71705CDCFB1281AF424D4EB6282F1F33ADD58DD862B3DE496D6F379BAD1E068893C3A2FFC75DDB1DC18042569AFA0F9DE44A582534BE73DA29D40E624A82A19F6D48609609600FF34BCA8E4D69F18101A3F0BAE655D5F389D568BB91E54465E5AA0FB52CA6E372A21BCDEB45EA16FC36FEFDBC9FF3F295B53C25458C75EE869755A4E4557BD639DE5D80AA9FDE709A53F4D6D135FD8611D0EED5CBB9430C13292C74DF5380BCDE17A4C3BF0E692E505683560CBA89C931934C76B4C499A5092C586EE014732761CEB7C9D67BF43472D89644D2250DAA0E82CD", 16).unwrap();
2124    let modulus = U4096::from_str_radix("7f496a3a7a60f42bbce68427c6cc2fcd36efca76f5abe016ac529e77b09b9bc3074f4310762c27afa4b4c6bbd98ae0eb94a1c741962763de8e4f97fff615276779e6b49aac97cea67ffa74718cff0ccf81f50f21d6c921e26bb9adda7ede74145fe894ea21fddb9bb3a73c857ea689ade8b700a51acf1958aa226cc55d7a23ceabcff95933558916a19e575fe00723ea435c625e697d9ecb31fa996abf370fd751c9158e58343f43ed7767ee9ebd0c305a03dac96a608d54e2da35e12d7e93ebf7fc1a2a8a8f99e1265d3def800efeb0f944634c4235e967666fd0717ebfad0eb36c92f496da1b28a24b2ff646eedfefbac17be37e2a25235066687dc578c0ee1a0790c4437f848078eefd7082f84fc343c1accf9cc24f5e8e0eb021f4dd25fd308c91a79c416639c63e8ad87d452a2d25b4d37356a8d8e70b82df6226fbda1fb7d5a6346d18a9ec79401d6bb3776fa2115eb1c6bc83213eef559f10d0cd21a6d159f3a8910fc13d3a2c031eb3394e7a7928df1d854122b0dc032cb3272adc131ed8bd6e82af43294db9b0640189ebf6da9922af531638f7f71282c240518559e3c839767d78b5b5031f1a88b13028a55587f15a047cd2f565bad97a9a50afab1699397dcc92f10bc0140d2a796686253eabf412ea85e70c0c1d47a22b803fcf94af4ad3dda0dca583ff830b57b2cf86e1c2c0dd15b2a26372f3e43a1300226d", 16).unwrap();
2125    let rsa = RSA_4096_u16::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2126    let message = U4096::from_string("222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap();
2127
2128    println!("RSA_4096_u16: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2129    println!("RSA_4096_u16: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2130    println!("RSA_4096_u16: Message = {}", message);
2131
2132    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2133    println!("RSA_4096_u16: Cipher = {}", cipher);
2134    assert_eq!(cipher.to_string(), "306888388337466187282042307062704792652419569166337859961296761128522602783284171941314622434380020194218138738129324632968494397146631631568752167149366814328742864467558796468059168590183607048154820747334404657757306388818354135775667034077939707535729072254477687440326383413829184673485777354355593153355280000684319981409686640441919882399187403283001545508316655294832517432640860568986729894134362791743417711899828106270794047478495501030619345165383268394002700760718934742142793958715037000863729220391884324389876262174512194595764289919358407235812417445470095912470878283115657786217581619570857356292100179097109404807157489324367049867976992155866043576802494631549170761502725304142654782565627033872965724907731137654011229939774263227934571010082210703339879069398028070889488455929343451400703302388062601385983831754138909311641485104519487019661743420872116450935046792460451393530116569148009578799297083991851298476713329013797490297381294533747638243268187426309927081476470270764781262099702867717226556463217265238293512242449585754661504083025550479259607209149236813578913767448367431207086242762349794159228923175132222452502498030057987566531658182120131188295100537311716791771009234223633803366604959");
2135
2136    // Example for RSA_1024_u8
2137    use cryptocol::asymmetric::RSA_1024_u8;
2138
2139    let public_key = U1024::from(7_u8);
2140    let private_key = U1024::from_str_radix("11A086687252F0D0ECE2E723F06808EEA5467A8EE1025EE5CAC299448454B33D1A9A97596144EBF52706CEEA13F427DF7000E05542DC34ABA46ECE12D1CF5D1286A9DCDE69407D78F699CF592CAFDF5741019FCA261BAA65529AB2FADC9D00F5712A14480C9724DA29C2354DB2DCABEDD89735A6B663984831B427061704E6D7", 16).unwrap();
2141    let modulus = U1024::from_str_radix("7b63acdb204495b67a3451fb92d83e8684ed59e8271098488b5230df9e50e6abba3a2371a8e273b4112fa8668bad171c10062254d40570b17f07a283bcab8b83252bdf633cc22120ec097748bc5f46e1492f2f4e4bf6ae1f1d88c0d5fdfea18474a7ba71b2e25f4624dbe6f8dac0f436092a8b375bf4816a231fac86564a9513", 16).unwrap();
2142    let rsa = RSA_1024_u8::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2143    let message = U1024::from_string("7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777").unwrap();
2144
2145    println!("RSA_1024_u8: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2146    println!("RSA_1024_u8: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2147    println!("RSA_1024_u8: Message = {}", message);
2148
2149    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2150    println!("RSA_1024_u8: Cipher = {}", cipher);
2151    assert_eq!(cipher.to_string(), "18990444273600905180995060516989662905254261731195035701565206356299504237028371798240343074431853089671262075536405296229684167693688757404552244758551778537810033711541966014458437636847820750518338546544929478474442855272138237274277632124436569414527899485686220502485118890982309705646418471801278267757");
2152
2153    // Example for RSA_2048_u8
2154    use cryptocol::asymmetric::RSA_2048_u8;
2155
2156    let public_key = U2048::from(3_u8);
2157    let private_key = U2048::from_str_radix("701F1A22CF4EC7F8084FCE973A11B7C769D977C65E2CE023C8680270882A63AA5A1F591DBB7D9250CFE60485E22076BBF7112339393D3BB9E55A44B7584EF4A77C74040796B78464BF1E636A4033725D89B667CE27682731F2DA5A77662A7C39AF47E0078D9CFD8398DC67C20237758AE3E4CC3EE9A6364A5A70D6A886F7C5AD782D8E9700C462DC5550E884501351BF7CA151550F46724324548F2E83B7D1832A0F04B30314C14AE9FCE01E1D91B6ACF4EDAAADCD17298924B0B687DA02028B26F90A817EDFA1773396FDE0EA61A2E86C8ED519A38910F6974ABA4DDEEEF3F3D6420A62A6A7038B4DAA8D3CEB868FF4D79C2B0BF5B9D4E8A0F373AB963B3A3B", 16).unwrap();
2158    let modulus = U2048::from_str_radix("a82ea73436f62bf40c77b5e2d71a93ab1ec633a98d435035ac9c03a8cc3f957f872f05ac993c5b7937d906c8d330b219f299b4d5d5dbd996d807671304766efb3aae060b621346971ead951f604d2b8c4e919bb53b1c3acaec4787b3193fba5686ebd00b546b7c45654a9ba30353305055d7325e5e79516f87a941fcca73a885da9d96da9a86019b32e68bdca7737d4d24de47271efc65157108665b368414bb458c5646dde153694c78ee6e7a767e3d9f28801508dfb50c63a9aba588ca8c3db6d331754692ef56ffcb442649d207c50e4f860e62b4615bc15047f6d6f058ddda1788f43db6bcfe30b948ccb328a6374c24a9d6779f5e3f2e72b4d17795b39f", 16).unwrap();
2159    let rsa = RSA_2048_u8::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2160    let message = U2048::from_string("111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap();
2161
2162    println!("RSA_2048_u8: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2163    println!("RSA_2048_u8: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2164    println!("RSA_2048_u8: Message = {}", message);
2165
2166    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2167    println!("RSA_2048_u8: Cipher = {}", cipher);
2168    assert_eq!(cipher.to_string(), "11826648665573892988392569847230424789544841077331225957148399871249268927154623470993762522900445434965023639973787631496464777431420694899592236563565553447397524662288366787064121938211894260367352462080016370592189375621911613195326192686816328076467380983986600488501826732392039921304723843353561979971845731242251071539539421583735299628338836052636445230864534605339617629402800559440180501290669969356432646609355691679827096191085790246438685484796134722878156083210208240925495334987760220950875141064570439965872317052753944644376506387327199045809671339203409748804852257989296314879619587232751200838815");
2169
2170    // Example for RSA_4096_u8
2171    use cryptocol::asymmetric::RSA_4096_u8;
2172
2173    let public_key = U4096::from(5_u8);
2174    let private_key = U4096::from_str_radix("65D454FB951A5CEFCA5203530570263DC58CA1F8C489801223754B92F3AFAFCF390C35A6C4F01FBFB6F70563146F1A5610816C34781F831871D946665E7752B92E522A1556DFD885332EC38E0A65A3D934C40C1B123A8181EFC7BE48657EC3437FED43EE8197E2E2F61F639DFEEBA157ED5F33B748A5ADE0881B8A377DFB4FD889732DE0F5DE07454E1845E64CD28321CF7D1B7EBACAE56F5B2EE12232927312A7D4113EACF69903245F86587EFDA359E19CAF07884D3DDD82482B1A8ACBA989933014EED53FAE4DB84A97F2CCD8CBC0C769E909CE918785EB8CA6C13232F0D88F8A0F2A124815BA1B6F5991D258B3262F012FE931BB50E90D1EB9FE3793CD8A18182768BCC1926552BDA2F452FFE5A25DADBF36F83D01FB072B463841A939F0EFAFD7E6564E7F71705CDCFB1281AF424D4EB6282F1F33ADD58DD862B3DE496D6F379BAD1E068893C3A2FFC75DDB1DC18042569AFA0F9DE44A582534BE73DA29D40E624A82A19F6D48609609600FF34BCA8E4D69F18101A3F0BAE655D5F389D568BB91E54465E5AA0FB52CA6E372A21BCDEB45EA16FC36FEFDBC9FF3F295B53C25458C75EE869755A4E4557BD639DE5D80AA9FDE709A53F4D6D135FD8611D0EED5CBB9430C13292C74DF5380BCDE17A4C3BF0E692E505683560CBA89C931934C76B4C499A5092C586EE014732761CEB7C9D67BF43472D89644D2250DAA0E82CD", 16).unwrap();
2175    let modulus = U4096::from_str_radix("7f496a3a7a60f42bbce68427c6cc2fcd36efca76f5abe016ac529e77b09b9bc3074f4310762c27afa4b4c6bbd98ae0eb94a1c741962763de8e4f97fff615276779e6b49aac97cea67ffa74718cff0ccf81f50f21d6c921e26bb9adda7ede74145fe894ea21fddb9bb3a73c857ea689ade8b700a51acf1958aa226cc55d7a23ceabcff95933558916a19e575fe00723ea435c625e697d9ecb31fa996abf370fd751c9158e58343f43ed7767ee9ebd0c305a03dac96a608d54e2da35e12d7e93ebf7fc1a2a8a8f99e1265d3def800efeb0f944634c4235e967666fd0717ebfad0eb36c92f496da1b28a24b2ff646eedfefbac17be37e2a25235066687dc578c0ee1a0790c4437f848078eefd7082f84fc343c1accf9cc24f5e8e0eb021f4dd25fd308c91a79c416639c63e8ad87d452a2d25b4d37356a8d8e70b82df6226fbda1fb7d5a6346d18a9ec79401d6bb3776fa2115eb1c6bc83213eef559f10d0cd21a6d159f3a8910fc13d3a2c031eb3394e7a7928df1d854122b0dc032cb3272adc131ed8bd6e82af43294db9b0640189ebf6da9922af531638f7f71282c240518559e3c839767d78b5b5031f1a88b13028a55587f15a047cd2f565bad97a9a50afab1699397dcc92f10bc0140d2a796686253eabf412ea85e70c0c1d47a22b803fcf94af4ad3dda0dca583ff830b57b2cf86e1c2c0dd15b2a26372f3e43a1300226d", 16).unwrap();
2176    let rsa = RSA_4096_u8::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2177    let message = U4096::from_string("222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap();
2178
2179    println!("RSA_4096_u8: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2180    println!("RSA_4096_u8: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2181    println!("RSA_4096_u8: Message = {}", message);
2182
2183    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2184    println!("RSA_4096_u8: Cipher = {}", cipher);
2185    assert_eq!(cipher.to_string(), "306888388337466187282042307062704792652419569166337859961296761128522602783284171941314622434380020194218138738129324632968494397146631631568752167149366814328742864467558796468059168590183607048154820747334404657757306388818354135775667034077939707535729072254477687440326383413829184673485777354355593153355280000684319981409686640441919882399187403283001545508316655294832517432640860568986729894134362791743417711899828106270794047478495501030619345165383268394002700760718934742142793958715037000863729220391884324389876262174512194595764289919358407235812417445470095912470878283115657786217581619570857356292100179097109404807157489324367049867976992155866043576802494631549170761502725304142654782565627033872965724907731137654011229939774263227934571010082210703339879069398028070889488455929343451400703302388062601385983831754138909311641485104519487019661743420872116450935046792460451393530116569148009578799297083991851298476713329013797490297381294533747638243268187426309927081476470270764781262099702867717226556463217265238293512242449585754661504083025550479259607209149236813578913767448367431207086242762349794159228923175132222452502498030057987566531658182120131188295100537311716791771009234223633803366604959");
2186    println!("-------------------------------");
2187}
2188
2189fn rsa_decrypt_biguint()
2190{
2191    println!("rsa_decrypt_biguint");
2192    use cryptocol::number::BigUInt;
2193    use cryptocol::define_utypes_with;
2194    define_utypes_with!(u64);
2195
2196    // Example for RSA_1024
2197    use cryptocol::asymmetric::RSA_1024;
2198
2199    let public_key = U1024::from(5_u8);
2200    let private_key = U1024::from_str_radix("3D4990127949DDB062F2BE417E8EACAB79F3215C306217A0C5974FEE15D4CB6D9348A161523F49F83D1CD49CB261C98259F04FECED08E08F3F0C5EF1FE695A291782AA0B9500911299CDAE0297337E9CB219F71411133C4440184C349FAC497EE809ED6D1B472409AB88A99B843FD61DBBBBC4C9686871D5221D137F89AF64CD", 16).unwrap();
2201    let modulus = U1024::from_str_radix("9937e82e2f38aa38f75edba3bc64afacb0dfd36678f53b11edfa47d33693fc91f03593734d9e38ec98c81387bdf477c5e0d8c7d0509631661d9eed5cfc07616849dec988a75bd976cd83c7b6b38cb3573d776435a28b33f2dbbcebb09e693d911fff63ff88e4de8c730a5ee8023b1c6e18a1551e949ebca6b1fedeff1dec08a9", 16).unwrap();
2202    let rsa = RSA_1024::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2203    let message = U1024::from_string("7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777").unwrap();
2204
2205    println!("RSA_1024: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2206    println!("RSA_1024: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2207    println!("RSA_1024: Message = {}", message);
2208
2209    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2210    println!("RSA_1024: Cipher = {}", cipher);
2211    assert_eq!(cipher.to_string(), "14606510048253867029240420178508564108451783358298159314675299406727811512421137371598262884039995862707112191947061756986450584374674399814383778098601569518162693028818693718348755996275446231182729645715458251628617879799341412409848928638803776786415819193665392421517724782387829698801381262832285920668");
2212
2213    let recovered = rsa.decrypt_biguint(&cipher);
2214    println!("RSA_1024: Recovered = {}", recovered);
2215    assert_eq!(recovered, message.into_biguint());
2216
2217    // Example for RSA_2048
2218    use cryptocol::asymmetric::RSA_2048;
2219
2220    let public_key = U2048::from(7_u8);
2221    let private_key = U2048::from_str_radix("4935A7A0CA0F94101C34BC4A3180F18FE756C4CAFAFDED502AF6B7EC89E42D89C0163CFD43CC58F90F9CEA3045B565957732102340ACF51695E3F635FBD3AAEE83F71EB37103D234B108380932372E677200AD37074BBCEEC60FBEE4AB73C8F7030F712C8A70B43A05BD10700A0C50579CE8A8AEEF96D1D8BF7EDA7CF946F64A04F4C739591D41E2D0CD9E65FA6CED2AAEAE2BB3E9CE38BD0BA06DFF1847965DBE264447EE0C1AE7452638014AA2959B1FEAE409987C65321651C896732A62F0581F87A94DC41D85C3936C369A803DB0D6BD99B346C01A74295C24260E0055BFA97013967F9D6A868E57A67EBF17A6C9D7D5FB50BEFA4A4AD93BC558B8A78297", 16).unwrap();
2222    let modulus = U2048::from_str_radix("aad28721d779aed041d06202738233a51bca75d99efb29bb0eea57d297146a416ade8e4ef3877a45246e2270a2a7425cc0ca25a796e8e68a08693e7df6433981de95f24d5d08ea7af26882c01fd616f15f56e980665b638278cf6815900e2a405c795d67edb1a48762b9265ac21cbb7718c989982f0a944f1427fdce45a59403b080b68d260dafd1fb64b374aaac80bd1f595bd0ff175ca6108fdd2f83905774f66828ba84fab66412430666d46d1b94bb0da1c9d9c9062497677ea5b6b751f1e51651d86b6d377c3b44767134496a8fe2d7157e5f17281ad156d1a05eea359bc847d2d835474e1d4dc517902ffcfb036f7444bf296ad86ab0795f058a6a7a4f", 16).unwrap();
2223    let rsa = RSA_2048::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2224    let message = U2048::from_string("111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap();
2225
2226    println!("RSA_2048: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2227    println!("RSA_2048: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2228    println!("RSA_2048: Message = {}", message);
2229
2230    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2231    println!("RSA_2048: Cipher = {}", cipher);
2232    assert_eq!(cipher.to_string(), "1291365925956990209912301096206436401667136505494483326552892388697672421035786871295122243785492455365813633120609856123229759376007949983288196921350326580260085264651231909714016439201273309984156600534662061934819677352804108186913796503115103904740272641330383917375028485736726326961575966018344843544375111956896856459849745008491312504103267740859806938072560491882604981955826775714585411069204539358512084100532931709899505686043333904082157271127996483954201497588950610925938893405816546812856533512146469224967713898475743705008672515037488074806072422136954510678053632668629532542247787428389031452783");
2233
2234    let recovered = rsa.decrypt_biguint(&cipher);
2235    println!("RSA_2048: Recovered = {}", recovered);
2236    assert_eq!(recovered, message.into_biguint());
2237
2238    // Example for RSA_4096
2239    use cryptocol::asymmetric::RSA_4096;
2240
2241    let public_key = U4096::from(5_u8);
2242    let private_key = U4096::from_str_radix("65D454FB951A5CEFCA5203530570263DC58CA1F8C489801223754B92F3AFAFCF390C35A6C4F01FBFB6F70563146F1A5610816C34781F831871D946665E7752B92E522A1556DFD885332EC38E0A65A3D934C40C1B123A8181EFC7BE48657EC3437FED43EE8197E2E2F61F639DFEEBA157ED5F33B748A5ADE0881B8A377DFB4FD889732DE0F5DE07454E1845E64CD28321CF7D1B7EBACAE56F5B2EE12232927312A7D4113EACF69903245F86587EFDA359E19CAF07884D3DDD82482B1A8ACBA989933014EED53FAE4DB84A97F2CCD8CBC0C769E909CE918785EB8CA6C13232F0D88F8A0F2A124815BA1B6F5991D258B3262F012FE931BB50E90D1EB9FE3793CD8A18182768BCC1926552BDA2F452FFE5A25DADBF36F83D01FB072B463841A939F0EFAFD7E6564E7F71705CDCFB1281AF424D4EB6282F1F33ADD58DD862B3DE496D6F379BAD1E068893C3A2FFC75DDB1DC18042569AFA0F9DE44A582534BE73DA29D40E624A82A19F6D48609609600FF34BCA8E4D69F18101A3F0BAE655D5F389D568BB91E54465E5AA0FB52CA6E372A21BCDEB45EA16FC36FEFDBC9FF3F295B53C25458C75EE869755A4E4557BD639DE5D80AA9FDE709A53F4D6D135FD8611D0EED5CBB9430C13292C74DF5380BCDE17A4C3BF0E692E505683560CBA89C931934C76B4C499A5092C586EE014732761CEB7C9D67BF43472D89644D2250DAA0E82CD", 16).unwrap();
2243    let modulus = U4096::from_str_radix("7f496a3a7a60f42bbce68427c6cc2fcd36efca76f5abe016ac529e77b09b9bc3074f4310762c27afa4b4c6bbd98ae0eb94a1c741962763de8e4f97fff615276779e6b49aac97cea67ffa74718cff0ccf81f50f21d6c921e26bb9adda7ede74145fe894ea21fddb9bb3a73c857ea689ade8b700a51acf1958aa226cc55d7a23ceabcff95933558916a19e575fe00723ea435c625e697d9ecb31fa996abf370fd751c9158e58343f43ed7767ee9ebd0c305a03dac96a608d54e2da35e12d7e93ebf7fc1a2a8a8f99e1265d3def800efeb0f944634c4235e967666fd0717ebfad0eb36c92f496da1b28a24b2ff646eedfefbac17be37e2a25235066687dc578c0ee1a0790c4437f848078eefd7082f84fc343c1accf9cc24f5e8e0eb021f4dd25fd308c91a79c416639c63e8ad87d452a2d25b4d37356a8d8e70b82df6226fbda1fb7d5a6346d18a9ec79401d6bb3776fa2115eb1c6bc83213eef559f10d0cd21a6d159f3a8910fc13d3a2c031eb3394e7a7928df1d854122b0dc032cb3272adc131ed8bd6e82af43294db9b0640189ebf6da9922af531638f7f71282c240518559e3c839767d78b5b5031f1a88b13028a55587f15a047cd2f565bad97a9a50afab1699397dcc92f10bc0140d2a796686253eabf412ea85e70c0c1d47a22b803fcf94af4ad3dda0dca583ff830b57b2cf86e1c2c0dd15b2a26372f3e43a1300226d", 16).unwrap();
2244    let rsa = RSA_4096::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2245    let message = U4096::from_string("222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap();
2246
2247    println!("RSA_4096: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2248    println!("RSA_4096: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2249    println!("RSA_4096: Message = {}", message);
2250
2251    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2252    println!("RSA_4096: Cipher = {}", cipher);
2253    assert_eq!(cipher.to_string(), "306888388337466187282042307062704792652419569166337859961296761128522602783284171941314622434380020194218138738129324632968494397146631631568752167149366814328742864467558796468059168590183607048154820747334404657757306388818354135775667034077939707535729072254477687440326383413829184673485777354355593153355280000684319981409686640441919882399187403283001545508316655294832517432640860568986729894134362791743417711899828106270794047478495501030619345165383268394002700760718934742142793958715037000863729220391884324389876262174512194595764289919358407235812417445470095912470878283115657786217581619570857356292100179097109404807157489324367049867976992155866043576802494631549170761502725304142654782565627033872965724907731137654011229939774263227934571010082210703339879069398028070889488455929343451400703302388062601385983831754138909311641485104519487019661743420872116450935046792460451393530116569148009578799297083991851298476713329013797490297381294533747638243268187426309927081476470270764781262099702867717226556463217265238293512242449585754661504083025550479259607209149236813578913767448367431207086242762349794159228923175132222452502498030057987566531658182120131188295100537311716791771009234223633803366604959");
2254
2255    let recovered = rsa.decrypt_biguint(&cipher);
2256    println!("RSA_4096: Recovered = {}", recovered);
2257    assert_eq!(recovered, message.into_biguint());
2258
2259    // Example for RSA_Genric
2260    use cryptocol::asymmetric::RSA_Generic;
2261
2262    let public_key = BigUInt::<u64, 4>::from(0xD_u8);
2263    let private_key = BigUInt::<u64, 4>::from_str_radix("3F3597F1C44073A8D3C34F5FF1444665DAE8D8F268104A60C82825E1C3CD44D5", 16).unwrap();
2264    let modulus = BigUInt::<u64, 4>::from_str_radix("88f41e8bd3e0fa98757c814fe013edde379c41da169a91050fa4964a1141853b", 16).unwrap();
2265    let rsa = RSA_Generic::<4, u64, 5>::new_with_keys(public_key, private_key, modulus);
2266    let message = BigUInt::<u64, 4>::from_string("55555555555555555555555555555555555555555555555").unwrap();
2267
2268    println!("RSA_Generic<4, u64, 5>: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2269    println!("RSA_Generic<4, u64, 5>: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2270    println!("RSA_Generic<4, u64, 5>: Message = {}", message);
2271
2272    let cipher = rsa.encrypt_biguint(&message);
2273    println!("RSA_Generic<4, u64, 5>: Cipher = {}", cipher);
2274    assert_eq!(cipher.to_string(), "10674075484433295558572743933153491360572720800511665669089065789088032503360");
2275
2276    let recovered = rsa.decrypt_biguint(&cipher);
2277    println!("RSA_Generic<4, u64, 5>: Recovered = {}", recovered);
2278    assert_eq!(recovered, message.into_biguint());
2279
2280    // Example for RSA_1024_u128
2281    use cryptocol::asymmetric::RSA_1024_u128;
2282
2283    let public_key = U1024::from(5_u8);
2284    let private_key = U1024::from_str_radix("3D4990127949DDB062F2BE417E8EACAB79F3215C306217A0C5974FEE15D4CB6D9348A161523F49F83D1CD49CB261C98259F04FECED08E08F3F0C5EF1FE695A291782AA0B9500911299CDAE0297337E9CB219F71411133C4440184C349FAC497EE809ED6D1B472409AB88A99B843FD61DBBBBC4C9686871D5221D137F89AF64CD", 16).unwrap();
2285    let modulus = U1024::from_str_radix("9937e82e2f38aa38f75edba3bc64afacb0dfd36678f53b11edfa47d33693fc91f03593734d9e38ec98c81387bdf477c5e0d8c7d0509631661d9eed5cfc07616849dec988a75bd976cd83c7b6b38cb3573d776435a28b33f2dbbcebb09e693d911fff63ff88e4de8c730a5ee8023b1c6e18a1551e949ebca6b1fedeff1dec08a9", 16).unwrap();
2286    let rsa = RSA_1024_u128::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2287    let message = U1024::from_string("7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777").unwrap();
2288
2289    println!("RSA_1024_u128: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2290    println!("RSA_1024_u128: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2291    println!("RSA_1024_u128: Message = {}", message);
2292
2293    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2294    println!("RSA_1024_u128: Cipher = {}", cipher);
2295    assert_eq!(cipher.to_string(), "14606510048253867029240420178508564108451783358298159314675299406727811512421137371598262884039995862707112191947061756986450584374674399814383778098601569518162693028818693718348755996275446231182729645715458251628617879799341412409848928638803776786415819193665392421517724782387829698801381262832285920668");
2296
2297    let recovered = rsa.decrypt_biguint(&cipher);
2298    println!("RSA_1024_u128: Recovered = {}", recovered);
2299    assert_eq!(recovered, message.into_biguint());
2300
2301    // Example for RSA_2048_u128
2302    use cryptocol::asymmetric::RSA_2048_u128;
2303
2304    let public_key = U2048::from(7_u8);
2305    let private_key = U2048::from_str_radix("4935A7A0CA0F94101C34BC4A3180F18FE756C4CAFAFDED502AF6B7EC89E42D89C0163CFD43CC58F90F9CEA3045B565957732102340ACF51695E3F635FBD3AAEE83F71EB37103D234B108380932372E677200AD37074BBCEEC60FBEE4AB73C8F7030F712C8A70B43A05BD10700A0C50579CE8A8AEEF96D1D8BF7EDA7CF946F64A04F4C739591D41E2D0CD9E65FA6CED2AAEAE2BB3E9CE38BD0BA06DFF1847965DBE264447EE0C1AE7452638014AA2959B1FEAE409987C65321651C896732A62F0581F87A94DC41D85C3936C369A803DB0D6BD99B346C01A74295C24260E0055BFA97013967F9D6A868E57A67EBF17A6C9D7D5FB50BEFA4A4AD93BC558B8A78297", 16).unwrap();
2306    let modulus = U2048::from_str_radix("aad28721d779aed041d06202738233a51bca75d99efb29bb0eea57d297146a416ade8e4ef3877a45246e2270a2a7425cc0ca25a796e8e68a08693e7df6433981de95f24d5d08ea7af26882c01fd616f15f56e980665b638278cf6815900e2a405c795d67edb1a48762b9265ac21cbb7718c989982f0a944f1427fdce45a59403b080b68d260dafd1fb64b374aaac80bd1f595bd0ff175ca6108fdd2f83905774f66828ba84fab66412430666d46d1b94bb0da1c9d9c9062497677ea5b6b751f1e51651d86b6d377c3b44767134496a8fe2d7157e5f17281ad156d1a05eea359bc847d2d835474e1d4dc517902ffcfb036f7444bf296ad86ab0795f058a6a7a4f", 16).unwrap();
2307    let rsa = RSA_2048_u128::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2308    let message = U2048::from_string("111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap();
2309
2310    println!("RSA_2048_u128: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2311    println!("RSA_2048_u128: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2312    println!("RSA_2048_u128: Message = {}", message);
2313
2314    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2315    println!("RSA_2048_u128: Cipher = {}", cipher);
2316    assert_eq!(cipher.to_string(), "1291365925956990209912301096206436401667136505494483326552892388697672421035786871295122243785492455365813633120609856123229759376007949983288196921350326580260085264651231909714016439201273309984156600534662061934819677352804108186913796503115103904740272641330383917375028485736726326961575966018344843544375111956896856459849745008491312504103267740859806938072560491882604981955826775714585411069204539358512084100532931709899505686043333904082157271127996483954201497588950610925938893405816546812856533512146469224967713898475743705008672515037488074806072422136954510678053632668629532542247787428389031452783");
2317
2318    let recovered = rsa.decrypt_biguint(&cipher);
2319    println!("RSA_2048_u128: Recovered = {}", recovered);
2320    assert_eq!(recovered, message.into_biguint());
2321
2322    // Example for RSA_4096_u128
2323    use cryptocol::asymmetric::RSA_4096_u128;
2324
2325    let public_key = U4096::from(5_u8);
2326    let private_key = U4096::from_str_radix("65D454FB951A5CEFCA5203530570263DC58CA1F8C489801223754B92F3AFAFCF390C35A6C4F01FBFB6F70563146F1A5610816C34781F831871D946665E7752B92E522A1556DFD885332EC38E0A65A3D934C40C1B123A8181EFC7BE48657EC3437FED43EE8197E2E2F61F639DFEEBA157ED5F33B748A5ADE0881B8A377DFB4FD889732DE0F5DE07454E1845E64CD28321CF7D1B7EBACAE56F5B2EE12232927312A7D4113EACF69903245F86587EFDA359E19CAF07884D3DDD82482B1A8ACBA989933014EED53FAE4DB84A97F2CCD8CBC0C769E909CE918785EB8CA6C13232F0D88F8A0F2A124815BA1B6F5991D258B3262F012FE931BB50E90D1EB9FE3793CD8A18182768BCC1926552BDA2F452FFE5A25DADBF36F83D01FB072B463841A939F0EFAFD7E6564E7F71705CDCFB1281AF424D4EB6282F1F33ADD58DD862B3DE496D6F379BAD1E068893C3A2FFC75DDB1DC18042569AFA0F9DE44A582534BE73DA29D40E624A82A19F6D48609609600FF34BCA8E4D69F18101A3F0BAE655D5F389D568BB91E54465E5AA0FB52CA6E372A21BCDEB45EA16FC36FEFDBC9FF3F295B53C25458C75EE869755A4E4557BD639DE5D80AA9FDE709A53F4D6D135FD8611D0EED5CBB9430C13292C74DF5380BCDE17A4C3BF0E692E505683560CBA89C931934C76B4C499A5092C586EE014732761CEB7C9D67BF43472D89644D2250DAA0E82CD", 16).unwrap();
2327    let modulus = U4096::from_str_radix("7f496a3a7a60f42bbce68427c6cc2fcd36efca76f5abe016ac529e77b09b9bc3074f4310762c27afa4b4c6bbd98ae0eb94a1c741962763de8e4f97fff615276779e6b49aac97cea67ffa74718cff0ccf81f50f21d6c921e26bb9adda7ede74145fe894ea21fddb9bb3a73c857ea689ade8b700a51acf1958aa226cc55d7a23ceabcff95933558916a19e575fe00723ea435c625e697d9ecb31fa996abf370fd751c9158e58343f43ed7767ee9ebd0c305a03dac96a608d54e2da35e12d7e93ebf7fc1a2a8a8f99e1265d3def800efeb0f944634c4235e967666fd0717ebfad0eb36c92f496da1b28a24b2ff646eedfefbac17be37e2a25235066687dc578c0ee1a0790c4437f848078eefd7082f84fc343c1accf9cc24f5e8e0eb021f4dd25fd308c91a79c416639c63e8ad87d452a2d25b4d37356a8d8e70b82df6226fbda1fb7d5a6346d18a9ec79401d6bb3776fa2115eb1c6bc83213eef559f10d0cd21a6d159f3a8910fc13d3a2c031eb3394e7a7928df1d854122b0dc032cb3272adc131ed8bd6e82af43294db9b0640189ebf6da9922af531638f7f71282c240518559e3c839767d78b5b5031f1a88b13028a55587f15a047cd2f565bad97a9a50afab1699397dcc92f10bc0140d2a796686253eabf412ea85e70c0c1d47a22b803fcf94af4ad3dda0dca583ff830b57b2cf86e1c2c0dd15b2a26372f3e43a1300226d", 16).unwrap();
2328    let rsa = RSA_4096_u128::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2329    let message = U4096::from_string("222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap();
2330
2331    println!("RSA_4096_u128: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2332    println!("RSA_4096_u128: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2333    println!("RSA_4096_u128: Message = {}", message);
2334
2335    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2336    println!("RSA_4096_u128: Cipher = {}", cipher);
2337    assert_eq!(cipher.to_string(), "306888388337466187282042307062704792652419569166337859961296761128522602783284171941314622434380020194218138738129324632968494397146631631568752167149366814328742864467558796468059168590183607048154820747334404657757306388818354135775667034077939707535729072254477687440326383413829184673485777354355593153355280000684319981409686640441919882399187403283001545508316655294832517432640860568986729894134362791743417711899828106270794047478495501030619345165383268394002700760718934742142793958715037000863729220391884324389876262174512194595764289919358407235812417445470095912470878283115657786217581619570857356292100179097109404807157489324367049867976992155866043576802494631549170761502725304142654782565627033872965724907731137654011229939774263227934571010082210703339879069398028070889488455929343451400703302388062601385983831754138909311641485104519487019661743420872116450935046792460451393530116569148009578799297083991851298476713329013797490297381294533747638243268187426309927081476470270764781262099702867717226556463217265238293512242449585754661504083025550479259607209149236813578913767448367431207086242762349794159228923175132222452502498030057987566531658182120131188295100537311716791771009234223633803366604959");
2338
2339    let recovered = rsa.decrypt_biguint(&cipher);
2340    println!("RSA_4096_u128: Recovered = {}", recovered);
2341    assert_eq!(recovered, message.into_biguint());
2342
2343    // Example for RSA_1024_u64
2344    use cryptocol::asymmetric::RSA_1024_u64;
2345
2346    let public_key = U1024::from(5_u8);
2347    let private_key = U1024::from_str_radix("3D4990127949DDB062F2BE417E8EACAB79F3215C306217A0C5974FEE15D4CB6D9348A161523F49F83D1CD49CB261C98259F04FECED08E08F3F0C5EF1FE695A291782AA0B9500911299CDAE0297337E9CB219F71411133C4440184C349FAC497EE809ED6D1B472409AB88A99B843FD61DBBBBC4C9686871D5221D137F89AF64CD", 16).unwrap();
2348    let modulus = U1024::from_str_radix("9937e82e2f38aa38f75edba3bc64afacb0dfd36678f53b11edfa47d33693fc91f03593734d9e38ec98c81387bdf477c5e0d8c7d0509631661d9eed5cfc07616849dec988a75bd976cd83c7b6b38cb3573d776435a28b33f2dbbcebb09e693d911fff63ff88e4de8c730a5ee8023b1c6e18a1551e949ebca6b1fedeff1dec08a9", 16).unwrap();
2349    let rsa = RSA_1024_u64::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2350    let message = U1024::from_string("7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777").unwrap();
2351
2352    println!("RSA_1024_u64: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2353    println!("RSA_1024_u64: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2354    println!("RSA_1024_u64: Message = {}", message);
2355
2356    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2357    println!("RSA_1024_u64: Cipher = {}", cipher);
2358    assert_eq!(cipher.to_string(), "14606510048253867029240420178508564108451783358298159314675299406727811512421137371598262884039995862707112191947061756986450584374674399814383778098601569518162693028818693718348755996275446231182729645715458251628617879799341412409848928638803776786415819193665392421517724782387829698801381262832285920668");
2359
2360    let recovered = rsa.decrypt_biguint(&cipher);
2361    println!("RSA_1024_u64: Recovered = {}", recovered);
2362    assert_eq!(recovered, message.into_biguint());
2363
2364    // Example for RSA_2048_u64
2365    use cryptocol::asymmetric::RSA_2048_u64;
2366
2367    let public_key = U2048::from(7_u8);
2368    let private_key = U2048::from_str_radix("4935A7A0CA0F94101C34BC4A3180F18FE756C4CAFAFDED502AF6B7EC89E42D89C0163CFD43CC58F90F9CEA3045B565957732102340ACF51695E3F635FBD3AAEE83F71EB37103D234B108380932372E677200AD37074BBCEEC60FBEE4AB73C8F7030F712C8A70B43A05BD10700A0C50579CE8A8AEEF96D1D8BF7EDA7CF946F64A04F4C739591D41E2D0CD9E65FA6CED2AAEAE2BB3E9CE38BD0BA06DFF1847965DBE264447EE0C1AE7452638014AA2959B1FEAE409987C65321651C896732A62F0581F87A94DC41D85C3936C369A803DB0D6BD99B346C01A74295C24260E0055BFA97013967F9D6A868E57A67EBF17A6C9D7D5FB50BEFA4A4AD93BC558B8A78297", 16).unwrap();
2369    let modulus = U2048::from_str_radix("aad28721d779aed041d06202738233a51bca75d99efb29bb0eea57d297146a416ade8e4ef3877a45246e2270a2a7425cc0ca25a796e8e68a08693e7df6433981de95f24d5d08ea7af26882c01fd616f15f56e980665b638278cf6815900e2a405c795d67edb1a48762b9265ac21cbb7718c989982f0a944f1427fdce45a59403b080b68d260dafd1fb64b374aaac80bd1f595bd0ff175ca6108fdd2f83905774f66828ba84fab66412430666d46d1b94bb0da1c9d9c9062497677ea5b6b751f1e51651d86b6d377c3b44767134496a8fe2d7157e5f17281ad156d1a05eea359bc847d2d835474e1d4dc517902ffcfb036f7444bf296ad86ab0795f058a6a7a4f", 16).unwrap();
2370    let rsa = RSA_2048_u64::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2371    let message = U2048::from_string("111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap();
2372
2373    println!("RSA_2048_u64: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2374    println!("RSA_2048_u64: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2375    println!("RSA_2048_u64: Message = {}", message);
2376
2377    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2378    println!("RSA_2048_u64: Cipher = {}", cipher);
2379    assert_eq!(cipher.to_string(), "1291365925956990209912301096206436401667136505494483326552892388697672421035786871295122243785492455365813633120609856123229759376007949983288196921350326580260085264651231909714016439201273309984156600534662061934819677352804108186913796503115103904740272641330383917375028485736726326961575966018344843544375111956896856459849745008491312504103267740859806938072560491882604981955826775714585411069204539358512084100532931709899505686043333904082157271127996483954201497588950610925938893405816546812856533512146469224967713898475743705008672515037488074806072422136954510678053632668629532542247787428389031452783");
2380
2381    let recovered = rsa.decrypt_biguint(&cipher);
2382    println!("RSA_2048_u64: Recovered = {}", recovered);
2383    assert_eq!(recovered, message.into_biguint());
2384
2385    // Example for RSA_4096_u64
2386    use cryptocol::asymmetric::RSA_4096_u64;
2387
2388    let public_key = U4096::from(5_u8);
2389    let private_key = U4096::from_str_radix("65D454FB951A5CEFCA5203530570263DC58CA1F8C489801223754B92F3AFAFCF390C35A6C4F01FBFB6F70563146F1A5610816C34781F831871D946665E7752B92E522A1556DFD885332EC38E0A65A3D934C40C1B123A8181EFC7BE48657EC3437FED43EE8197E2E2F61F639DFEEBA157ED5F33B748A5ADE0881B8A377DFB4FD889732DE0F5DE07454E1845E64CD28321CF7D1B7EBACAE56F5B2EE12232927312A7D4113EACF69903245F86587EFDA359E19CAF07884D3DDD82482B1A8ACBA989933014EED53FAE4DB84A97F2CCD8CBC0C769E909CE918785EB8CA6C13232F0D88F8A0F2A124815BA1B6F5991D258B3262F012FE931BB50E90D1EB9FE3793CD8A18182768BCC1926552BDA2F452FFE5A25DADBF36F83D01FB072B463841A939F0EFAFD7E6564E7F71705CDCFB1281AF424D4EB6282F1F33ADD58DD862B3DE496D6F379BAD1E068893C3A2FFC75DDB1DC18042569AFA0F9DE44A582534BE73DA29D40E624A82A19F6D48609609600FF34BCA8E4D69F18101A3F0BAE655D5F389D568BB91E54465E5AA0FB52CA6E372A21BCDEB45EA16FC36FEFDBC9FF3F295B53C25458C75EE869755A4E4557BD639DE5D80AA9FDE709A53F4D6D135FD8611D0EED5CBB9430C13292C74DF5380BCDE17A4C3BF0E692E505683560CBA89C931934C76B4C499A5092C586EE014732761CEB7C9D67BF43472D89644D2250DAA0E82CD", 16).unwrap();
2390    let modulus = U4096::from_str_radix("7f496a3a7a60f42bbce68427c6cc2fcd36efca76f5abe016ac529e77b09b9bc3074f4310762c27afa4b4c6bbd98ae0eb94a1c741962763de8e4f97fff615276779e6b49aac97cea67ffa74718cff0ccf81f50f21d6c921e26bb9adda7ede74145fe894ea21fddb9bb3a73c857ea689ade8b700a51acf1958aa226cc55d7a23ceabcff95933558916a19e575fe00723ea435c625e697d9ecb31fa996abf370fd751c9158e58343f43ed7767ee9ebd0c305a03dac96a608d54e2da35e12d7e93ebf7fc1a2a8a8f99e1265d3def800efeb0f944634c4235e967666fd0717ebfad0eb36c92f496da1b28a24b2ff646eedfefbac17be37e2a25235066687dc578c0ee1a0790c4437f848078eefd7082f84fc343c1accf9cc24f5e8e0eb021f4dd25fd308c91a79c416639c63e8ad87d452a2d25b4d37356a8d8e70b82df6226fbda1fb7d5a6346d18a9ec79401d6bb3776fa2115eb1c6bc83213eef559f10d0cd21a6d159f3a8910fc13d3a2c031eb3394e7a7928df1d854122b0dc032cb3272adc131ed8bd6e82af43294db9b0640189ebf6da9922af531638f7f71282c240518559e3c839767d78b5b5031f1a88b13028a55587f15a047cd2f565bad97a9a50afab1699397dcc92f10bc0140d2a796686253eabf412ea85e70c0c1d47a22b803fcf94af4ad3dda0dca583ff830b57b2cf86e1c2c0dd15b2a26372f3e43a1300226d", 16).unwrap();
2391    let rsa = RSA_4096_u64::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2392    let message = U4096::from_string("222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap();
2393
2394    println!("RSA_4096_u64: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2395    println!("RSA_4096_u64: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2396    println!("RSA_4096_u64: Message = {}", message);
2397
2398    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2399    println!("RSA_4096_u64: Cipher = {}", cipher);
2400    assert_eq!(cipher.to_string(), "306888388337466187282042307062704792652419569166337859961296761128522602783284171941314622434380020194218138738129324632968494397146631631568752167149366814328742864467558796468059168590183607048154820747334404657757306388818354135775667034077939707535729072254477687440326383413829184673485777354355593153355280000684319981409686640441919882399187403283001545508316655294832517432640860568986729894134362791743417711899828106270794047478495501030619345165383268394002700760718934742142793958715037000863729220391884324389876262174512194595764289919358407235812417445470095912470878283115657786217581619570857356292100179097109404807157489324367049867976992155866043576802494631549170761502725304142654782565627033872965724907731137654011229939774263227934571010082210703339879069398028070889488455929343451400703302388062601385983831754138909311641485104519487019661743420872116450935046792460451393530116569148009578799297083991851298476713329013797490297381294533747638243268187426309927081476470270764781262099702867717226556463217265238293512242449585754661504083025550479259607209149236813578913767448367431207086242762349794159228923175132222452502498030057987566531658182120131188295100537311716791771009234223633803366604959");
2401
2402    let recovered = rsa.decrypt_biguint(&cipher);
2403    println!("RSA_4096_u64: Recovered = {}", recovered);
2404    assert_eq!(recovered, message.into_biguint());
2405
2406    // Example for RSA_1024_u32
2407    use cryptocol::asymmetric::RSA_1024_u32;
2408
2409    let public_key = U1024::from(7_u8);
2410    let private_key = U1024::from_str_radix("6F21015F58239A612E66501D445CC4F221AB05A16AD9BCD5F3494E44397BCDED845BA62788A4B6C4E008A120F0FD7D45E96CFDB6CC0EF621889A39BA55037EE32946DCB260FB638EF573CA2F4BB3C922A91EA2719E0BC1268410E862D1A2BDF7317970DBDA5AC089FFA1A74DC097AAF08AEEEFAF34DDB1DF172B0743D43B0B", 16).unwrap();
2411    let modulus = U1024::from_str_radix("c772e0c82db6549484796c056c18b9ee836f8504611a3792df4b71e78a65992e6366f1f3024dd571b591cdd2a7d7e19a52d1ff6ffff40ba2fda3229ead5e90f2af877de674a7443acfbbeb3a3e5b1968cef3f6bdf0639edaa94174fa8c6d4701fca2d46a041f6ea3e0e921c70434781fd49f1b31f6cc2970aeefc981490b47e5", 16).unwrap();
2412    let rsa = RSA_1024_u32::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2413    let message = U1024::from_string("7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777").unwrap();
2414
2415    println!("RSA_1024_u32: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2416    println!("RSA_1024_u32: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2417    println!("RSA_1024_u32: Message = {}", message);
2418
2419    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2420    println!("RSA_1024_u32: Cipher = {}", cipher);
2421    assert_eq!(cipher.to_string(), "99230296523159386700256526777425413629264442437576685721088524012075851202553740850680904664974658403571089264333361406651108391992097105729966644759559826283877160366748401717435051091667703209601257183162482151988604327001399793489756973079763602326808546529246854475734240062792376394092317599015107711947");
2422
2423    let recovered = rsa.decrypt_biguint(&cipher);
2424    println!("RSA_1024_u32: Recovered = {}", recovered);
2425    assert_eq!(recovered, message.into_biguint());
2426
2427    // Example for RSA_2048_u32
2428    use cryptocol::asymmetric::RSA_2048_u32;
2429
2430    let public_key = U2048::from(7_u8);
2431    let private_key = U2048::from_str_radix("67EA9B746A1CD56D22A34A4B4CA0902596D39C7F7B88B2726B7757C1F82628F1F15B51F9A51B22CB932F1CFE59B34178CD6ED42571006CCECC23D2050D3189D4A9175E8BC1DFE77C55EF68E3036BED29BFA70CB76D51D74E54D3535B72CC676899C5FC60021929B939F57CFF92A471A48BFA806FDA2CF942515BC9012AAAE479303614EB9BA52EC8A76CA78AAEA820EC8214AADB70E12492C66060384B609F56395532879C06FA33D7242E55D30AD79BE7D6F8E97152405ABC7097AF6DBEF5B7D2DCD1D414BB29E387327025D66F6D32142C858DC33BC6861A7A95AF46431FDB6AD3B3108E7AA0387CCF99504DC882E2FB2E127CB981123421A629908EC4570B", 16).unwrap();
2432    let modulus = U2048::from_str_radix("9bdfe92e9f2b4023b3f4ef70f2f0d838623d6abf394d0baba13303a2f4393d6aea08faf677a8b4315cc6ab7d868ce23534263e382980a3363235bb0793ca4ebefda30dd1a2cfdb3a80e71d548521e3be9f7a931323fac2f57f3cfd092c329b1ce6a8fa900325be95d6f03b7f5bf6aa76d1f7c0a7c74375e37a09ad81c00056b7637cc194d65b80229e6fa2fa18106eb682877e4763bdf6aa0315332a8709dd120b407a9e5d48f90b0b361b8b5c85ca5c2578aa01abdf00361fa3fca45a180b3211abaae3642188c455af8147f7cf31ac1cbb9532aaabbaecb40eb96c24bea9bc0c8ca36d83a25d73f14b13bf45de7e6483c246de199f10d89bad30b81a0f887b", 16).unwrap();
2433    let rsa = RSA_2048_u32::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2434    let message = U2048::from_string("111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap();
2435
2436    println!("RSA_2048_u32: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2437    println!("RSA_2048_u32: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2438    println!("RSA_2048_u32: Message = {}", message);
2439
2440    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2441    println!("RSA_2048_u32: Cipher = {}", cipher);
2442    assert_eq!(cipher.to_string(), "6180106008116400276245342989473103484764761872267721473950722696146864035043160806694184669077268275204061759540743444182870700294283652408790531856247230367206621614772324283033339732101308701625462278598358955098096071549412033247370175467126791060041591140852809756204638561991812268754504459016425658025047148020085334540544993003178022240015169047284794069056176504629864457506720140976699242277352908155246616754908811577987276741973732843633335393961024533898633724469015271255095085368975909406244117060091735137408760315631597584694291792267983563546529313740251663261748403753363958654232541375089577621616");
2443
2444    let recovered = rsa.decrypt_biguint(&cipher);
2445    println!("RSA_2048_u32: Recovered = {}", recovered);
2446    assert_eq!(recovered, message.into_biguint());
2447
2448    // Example for RSA_4096_u32
2449    use cryptocol::asymmetric::RSA_4096_u32;
2450
2451    let public_key = U4096::from(5_u8);
2452    let private_key = U4096::from_str_radix("16D9A2A76977853F423E2DDBA4AECBA372B95E082577329BCA5852F4400907D2B34366C1DD35B01EE9A2483E823E635EB7492797BE652252E131EADD6A68CCFA952B49A7F09B9AB2653386B2DEEF6874F2724392C4544BEF7D18E83E7CEF59E21F550C23CE848A05A19DE2D97347946E86F734FCA112938024608A9C5C1D72D658F369B49D3A4C77ADB6483C632AAE94F345791F9313D304277B1E4275F72F7C9B7C2DAB7DA91B94C807E5553FE534A923D22206F6A987CB9214FCA3EB78CE22A434CBAF7C3DF29010688F7930E9EB2BBF6113DE6A35F78EFCFC9A17A868277BAD58F432F097405E3F9415FE4E15D11D8D5376747F6046DF74AE76C5B50D28C5D972724F09E84FD057DAC07625C06ACE068A171480D73F51CAF7728F9EE0F0D4F794F81B2AFCD7C15898C7C5B964130F0D4EA1819999CDBC8E000C500DF8FECCEB9EB8AA75C16EAA6C02C61A3129B49472136E1231BB9D563BFAF93B1322DF047F9FF7CDB74610AF49E7ADD790746C5DB31B1D48888764511AE10FF2F22BF4D1CBFE809A9C716D9C4043C59120BC5EA9CC0CA20C06D6DF11B0574E534757F9BC78617CB484C988871A065348DF542869140D0D0F58EB3A76E2E1394C21D8FFEEC315CFA03DC70269234EACFD8AEFDBCDF0C0EAE6C743135FFA2B504F937BD9F473F10862C2D59C38FAAEDB9E930EB9264723B90923B40056594592A16D7D0D9D", 16).unwrap();
2453    let modulus = U4096::from_str_radix("c72dbd530230cce40abeb30a9a33b60708cd8c4ef63091dcfe3f16ae76e1e10436e7004154dd34a85dbd0f0813e36b8ccc0fae90f5b5f3f20e915e9e276f6dd78f1eeb77f5016e7f6cdba95b31866f2ef6519dfb1e855acfa27f815134aaf70f3af39af5013a1971bc9558e476e9fc4ef2b0938fe0c42036f569879441cbe44ff664b937de05120c57823398d91e7cb389319fa8d6c50470ae7c83540b1e467d93a1d77a7e543845b3735aaa9b5a93543e286172b02ff34843c5d9075f0d2586754a4858c675641dc293d431fe5df11f3f8e7be802b8d566226b497e9cdcae7ce988ae6d8747771ebfb2eb235c58b9f08984c25336695731e5a13044139baf6a84137b163fb48e30d63809adc3853559e92df2420167d8eab2907724cbd33f5d712080a97195557b5e492c4472aba6e3dd9afe5ca37f2ccdff168d89e2ae6640935eb32f07fbb29663d320e65f14602974ac30124f1030f331db97f94471772e7a4a62074d517ea8c38bfac2492ca54bfa565c06e70263eab20c5f682d78b01a446a7a074b6ec5b14844fb28649eb9f746d7936ba191d9a7890a1f96bb3f4caa06a97383da413042e9c2b898f4397a1628d236607a0e0c1e4ef32a3d3d9ac59b0aab6632e85420be5de39ceb11b01c5fe3ee45d40418d8f21e894b292df523f570f96419ed5c3c0d0382b73ccec1f57976d790544d4ece8ebd145be1c130e827", 16).unwrap();
2454    let rsa = RSA_4096_u32::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2455    let message = U4096::from_string("222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap();
2456
2457    println!("RSA_4096_u32: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2458    println!("RSA_4096_u32: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2459    println!("RSA_4096_u32: Message = {}", message);
2460
2461    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2462    println!("RSA_4096_u32: Cipher = {}", cipher);
2463    assert_eq!(cipher.to_string(), "374103778547092061962004288299115208376238320415950152369472097675929980153935401283925345495393450235206906720773160614616867222253137819577522888765833275561007893621096152233179171868886083460835425305117801157642091986349851413932705016493369007857870552243652087803382015694540662400578765207320399425048154146269581162065266583641548633891278741420175107121049522650466141596624367287590497133260408649273668727139433262055505123511164963693545573880831314381223431311081145504893254447162930451724660305799822259836914667838651280875559583209112473142570585350350615417988940095119386762044739541793817947934429176335870024385560095159386795033273614407369334003857709083012527420249947486898281210876194337051257649872331812976223032950323613439977681659861549325320693447666551984069525437252880368258280167539894135740654723284128996253012182985292335225328486391504159166101869356447735589666233694977344099218692858706630742326056159991482445749666805190877295673432692389657138426980184868183494023000749789723731848453658959105734519596827075324881824996533275662124645412829580548252866245777536895969022718423652423880459202825677905841662046792140571589175646463847633768079273417260356441398250086780413573340117792");
2464
2465    let recovered = rsa.decrypt_biguint(&cipher);
2466    println!("RSA_4096_u32: Recovered = {}", recovered);
2467    assert_eq!(recovered, message.into_biguint());
2468
2469    // Example for RSA_1024_u16
2470    use cryptocol::asymmetric::RSA_1024_u16;
2471
2472    let public_key = U1024::from(5_u8);
2473    let private_key = U1024::from_str_radix("3D4990127949DDB062F2BE417E8EACAB79F3215C306217A0C5974FEE15D4CB6D9348A161523F49F83D1CD49CB261C98259F04FECED08E08F3F0C5EF1FE695A291782AA0B9500911299CDAE0297337E9CB219F71411133C4440184C349FAC497EE809ED6D1B472409AB88A99B843FD61DBBBBC4C9686871D5221D137F89AF64CD", 16).unwrap();
2474    let modulus = U1024::from_str_radix("9937e82e2f38aa38f75edba3bc64afacb0dfd36678f53b11edfa47d33693fc91f03593734d9e38ec98c81387bdf477c5e0d8c7d0509631661d9eed5cfc07616849dec988a75bd976cd83c7b6b38cb3573d776435a28b33f2dbbcebb09e693d911fff63ff88e4de8c730a5ee8023b1c6e18a1551e949ebca6b1fedeff1dec08a9", 16).unwrap();
2475    let rsa = RSA_1024_u16::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2476    let message = U1024::from_string("7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777").unwrap();
2477
2478    println!("RSA_1024_u16: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2479    println!("RSA_1024_u16: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2480    println!("RSA_1024_u16: Message = {}", message);
2481
2482    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2483    println!("RSA_1024_u16: Cipher = {}", cipher);
2484    assert_eq!(cipher.to_string(), "14606510048253867029240420178508564108451783358298159314675299406727811512421137371598262884039995862707112191947061756986450584374674399814383778098601569518162693028818693718348755996275446231182729645715458251628617879799341412409848928638803776786415819193665392421517724782387829698801381262832285920668");
2485
2486    let recovered = rsa.decrypt_biguint(&cipher);
2487    println!("RSA_1024_u16: Recovered = {}", recovered);
2488    assert_eq!(recovered, message.into_biguint());
2489
2490    // Example for RSA_2048_u16
2491    use cryptocol::asymmetric::RSA_2048_u16;
2492
2493    let public_key = U2048::from(7_u8);
2494    let private_key = U2048::from_str_radix("4935A7A0CA0F94101C34BC4A3180F18FE756C4CAFAFDED502AF6B7EC89E42D89C0163CFD43CC58F90F9CEA3045B565957732102340ACF51695E3F635FBD3AAEE83F71EB37103D234B108380932372E677200AD37074BBCEEC60FBEE4AB73C8F7030F712C8A70B43A05BD10700A0C50579CE8A8AEEF96D1D8BF7EDA7CF946F64A04F4C739591D41E2D0CD9E65FA6CED2AAEAE2BB3E9CE38BD0BA06DFF1847965DBE264447EE0C1AE7452638014AA2959B1FEAE409987C65321651C896732A62F0581F87A94DC41D85C3936C369A803DB0D6BD99B346C01A74295C24260E0055BFA97013967F9D6A868E57A67EBF17A6C9D7D5FB50BEFA4A4AD93BC558B8A78297", 16).unwrap();
2495    let modulus = U2048::from_str_radix("aad28721d779aed041d06202738233a51bca75d99efb29bb0eea57d297146a416ade8e4ef3877a45246e2270a2a7425cc0ca25a796e8e68a08693e7df6433981de95f24d5d08ea7af26882c01fd616f15f56e980665b638278cf6815900e2a405c795d67edb1a48762b9265ac21cbb7718c989982f0a944f1427fdce45a59403b080b68d260dafd1fb64b374aaac80bd1f595bd0ff175ca6108fdd2f83905774f66828ba84fab66412430666d46d1b94bb0da1c9d9c9062497677ea5b6b751f1e51651d86b6d377c3b44767134496a8fe2d7157e5f17281ad156d1a05eea359bc847d2d835474e1d4dc517902ffcfb036f7444bf296ad86ab0795f058a6a7a4f", 16).unwrap();
2496    let rsa = RSA_2048_u16::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2497    let message = U2048::from_string("111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap();
2498
2499    println!("RSA_2048_u16: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2500    println!("RSA_2048_u16: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2501    println!("RSA_2048_u16: Message = {}", message);
2502
2503    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2504    println!("RSA_2048_u16: Cipher = {}", cipher);
2505    assert_eq!(cipher.to_string(), "1291365925956990209912301096206436401667136505494483326552892388697672421035786871295122243785492455365813633120609856123229759376007949983288196921350326580260085264651231909714016439201273309984156600534662061934819677352804108186913796503115103904740272641330383917375028485736726326961575966018344843544375111956896856459849745008491312504103267740859806938072560491882604981955826775714585411069204539358512084100532931709899505686043333904082157271127996483954201497588950610925938893405816546812856533512146469224967713898475743705008672515037488074806072422136954510678053632668629532542247787428389031452783");
2506
2507    let recovered = rsa.decrypt_biguint(&cipher);
2508    println!("RSA_2048_u16: Recovered = {}", recovered);
2509    assert_eq!(recovered, message.into_biguint());
2510
2511    // Example for RSA_4096_u16
2512    use cryptocol::asymmetric::RSA_4096_u16;
2513
2514    let public_key = U4096::from(5_u8);
2515    let private_key = U4096::from_str_radix("65D454FB951A5CEFCA5203530570263DC58CA1F8C489801223754B92F3AFAFCF390C35A6C4F01FBFB6F70563146F1A5610816C34781F831871D946665E7752B92E522A1556DFD885332EC38E0A65A3D934C40C1B123A8181EFC7BE48657EC3437FED43EE8197E2E2F61F639DFEEBA157ED5F33B748A5ADE0881B8A377DFB4FD889732DE0F5DE07454E1845E64CD28321CF7D1B7EBACAE56F5B2EE12232927312A7D4113EACF69903245F86587EFDA359E19CAF07884D3DDD82482B1A8ACBA989933014EED53FAE4DB84A97F2CCD8CBC0C769E909CE918785EB8CA6C13232F0D88F8A0F2A124815BA1B6F5991D258B3262F012FE931BB50E90D1EB9FE3793CD8A18182768BCC1926552BDA2F452FFE5A25DADBF36F83D01FB072B463841A939F0EFAFD7E6564E7F71705CDCFB1281AF424D4EB6282F1F33ADD58DD862B3DE496D6F379BAD1E068893C3A2FFC75DDB1DC18042569AFA0F9DE44A582534BE73DA29D40E624A82A19F6D48609609600FF34BCA8E4D69F18101A3F0BAE655D5F389D568BB91E54465E5AA0FB52CA6E372A21BCDEB45EA16FC36FEFDBC9FF3F295B53C25458C75EE869755A4E4557BD639DE5D80AA9FDE709A53F4D6D135FD8611D0EED5CBB9430C13292C74DF5380BCDE17A4C3BF0E692E505683560CBA89C931934C76B4C499A5092C586EE014732761CEB7C9D67BF43472D89644D2250DAA0E82CD", 16).unwrap();
2516    let modulus = U4096::from_str_radix("7f496a3a7a60f42bbce68427c6cc2fcd36efca76f5abe016ac529e77b09b9bc3074f4310762c27afa4b4c6bbd98ae0eb94a1c741962763de8e4f97fff615276779e6b49aac97cea67ffa74718cff0ccf81f50f21d6c921e26bb9adda7ede74145fe894ea21fddb9bb3a73c857ea689ade8b700a51acf1958aa226cc55d7a23ceabcff95933558916a19e575fe00723ea435c625e697d9ecb31fa996abf370fd751c9158e58343f43ed7767ee9ebd0c305a03dac96a608d54e2da35e12d7e93ebf7fc1a2a8a8f99e1265d3def800efeb0f944634c4235e967666fd0717ebfad0eb36c92f496da1b28a24b2ff646eedfefbac17be37e2a25235066687dc578c0ee1a0790c4437f848078eefd7082f84fc343c1accf9cc24f5e8e0eb021f4dd25fd308c91a79c416639c63e8ad87d452a2d25b4d37356a8d8e70b82df6226fbda1fb7d5a6346d18a9ec79401d6bb3776fa2115eb1c6bc83213eef559f10d0cd21a6d159f3a8910fc13d3a2c031eb3394e7a7928df1d854122b0dc032cb3272adc131ed8bd6e82af43294db9b0640189ebf6da9922af531638f7f71282c240518559e3c839767d78b5b5031f1a88b13028a55587f15a047cd2f565bad97a9a50afab1699397dcc92f10bc0140d2a796686253eabf412ea85e70c0c1d47a22b803fcf94af4ad3dda0dca583ff830b57b2cf86e1c2c0dd15b2a26372f3e43a1300226d", 16).unwrap();
2517    let rsa = RSA_4096_u16::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2518    let message = U4096::from_string("222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap();
2519
2520    println!("RSA_4096_u16: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2521    println!("RSA_4096_u16: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2522    println!("RSA_4096_u16: Message = {}", message);
2523
2524    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2525    println!("RSA_4096_u16: Cipher = {}", cipher);
2526    assert_eq!(cipher.to_string(), "306888388337466187282042307062704792652419569166337859961296761128522602783284171941314622434380020194218138738129324632968494397146631631568752167149366814328742864467558796468059168590183607048154820747334404657757306388818354135775667034077939707535729072254477687440326383413829184673485777354355593153355280000684319981409686640441919882399187403283001545508316655294832517432640860568986729894134362791743417711899828106270794047478495501030619345165383268394002700760718934742142793958715037000863729220391884324389876262174512194595764289919358407235812417445470095912470878283115657786217581619570857356292100179097109404807157489324367049867976992155866043576802494631549170761502725304142654782565627033872965724907731137654011229939774263227934571010082210703339879069398028070889488455929343451400703302388062601385983831754138909311641485104519487019661743420872116450935046792460451393530116569148009578799297083991851298476713329013797490297381294533747638243268187426309927081476470270764781262099702867717226556463217265238293512242449585754661504083025550479259607209149236813578913767448367431207086242762349794159228923175132222452502498030057987566531658182120131188295100537311716791771009234223633803366604959");
2527
2528    let recovered = rsa.decrypt_biguint(&cipher);
2529    println!("RSA_4096_u16: Recovered = {}", recovered);
2530    assert_eq!(recovered, message.into_biguint());
2531
2532    // Example for RSA_1024_u8
2533    use cryptocol::asymmetric::RSA_1024_u8;
2534
2535    let public_key = U1024::from(5_u8);
2536    let private_key = U1024::from_str_radix("3D4990127949DDB062F2BE417E8EACAB79F3215C306217A0C5974FEE15D4CB6D9348A161523F49F83D1CD49CB261C98259F04FECED08E08F3F0C5EF1FE695A291782AA0B9500911299CDAE0297337E9CB219F71411133C4440184C349FAC497EE809ED6D1B472409AB88A99B843FD61DBBBBC4C9686871D5221D137F89AF64CD", 16).unwrap();
2537    let modulus = U1024::from_str_radix("9937e82e2f38aa38f75edba3bc64afacb0dfd36678f53b11edfa47d33693fc91f03593734d9e38ec98c81387bdf477c5e0d8c7d0509631661d9eed5cfc07616849dec988a75bd976cd83c7b6b38cb3573d776435a28b33f2dbbcebb09e693d911fff63ff88e4de8c730a5ee8023b1c6e18a1551e949ebca6b1fedeff1dec08a9", 16).unwrap();
2538    let rsa = RSA_1024_u8::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2539    let message = U1024::from_string("7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777").unwrap();
2540
2541    println!("RSA_1024_u8: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2542    println!("RSA_1024_u8: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2543    println!("RSA_1024_u8: Message = {}", message);
2544
2545    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2546    println!("RSA_1024_u8: Cipher = {}", cipher);
2547    assert_eq!(cipher.to_string(), "14606510048253867029240420178508564108451783358298159314675299406727811512421137371598262884039995862707112191947061756986450584374674399814383778098601569518162693028818693718348755996275446231182729645715458251628617879799341412409848928638803776786415819193665392421517724782387829698801381262832285920668");
2548
2549    let recovered = rsa.decrypt_biguint(&cipher);
2550    println!("RSA_1024_u8: Recovered = {}", recovered);
2551    assert_eq!(recovered, message.into_biguint());
2552
2553    // Example for RSA_2048_u8
2554    use cryptocol::asymmetric::RSA_2048_u8;
2555
2556    let public_key = U2048::from(7_u8);
2557    let private_key = U2048::from_str_radix("4935A7A0CA0F94101C34BC4A3180F18FE756C4CAFAFDED502AF6B7EC89E42D89C0163CFD43CC58F90F9CEA3045B565957732102340ACF51695E3F635FBD3AAEE83F71EB37103D234B108380932372E677200AD37074BBCEEC60FBEE4AB73C8F7030F712C8A70B43A05BD10700A0C50579CE8A8AEEF96D1D8BF7EDA7CF946F64A04F4C739591D41E2D0CD9E65FA6CED2AAEAE2BB3E9CE38BD0BA06DFF1847965DBE264447EE0C1AE7452638014AA2959B1FEAE409987C65321651C896732A62F0581F87A94DC41D85C3936C369A803DB0D6BD99B346C01A74295C24260E0055BFA97013967F9D6A868E57A67EBF17A6C9D7D5FB50BEFA4A4AD93BC558B8A78297", 16).unwrap();
2558    let modulus = U2048::from_str_radix("aad28721d779aed041d06202738233a51bca75d99efb29bb0eea57d297146a416ade8e4ef3877a45246e2270a2a7425cc0ca25a796e8e68a08693e7df6433981de95f24d5d08ea7af26882c01fd616f15f56e980665b638278cf6815900e2a405c795d67edb1a48762b9265ac21cbb7718c989982f0a944f1427fdce45a59403b080b68d260dafd1fb64b374aaac80bd1f595bd0ff175ca6108fdd2f83905774f66828ba84fab66412430666d46d1b94bb0da1c9d9c9062497677ea5b6b751f1e51651d86b6d377c3b44767134496a8fe2d7157e5f17281ad156d1a05eea359bc847d2d835474e1d4dc517902ffcfb036f7444bf296ad86ab0795f058a6a7a4f", 16).unwrap();
2559    let rsa = RSA_2048_u8::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2560    let message = U2048::from_string("111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap();
2561
2562    println!("RSA_2048_u8: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2563    println!("RSA_2048_u8: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2564    println!("RSA_2048_u8: Message = {}", message);
2565
2566    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2567    println!("RSA_2048_u8: Cipher = {}", cipher);
2568    assert_eq!(cipher.to_string(), "1291365925956990209912301096206436401667136505494483326552892388697672421035786871295122243785492455365813633120609856123229759376007949983288196921350326580260085264651231909714016439201273309984156600534662061934819677352804108186913796503115103904740272641330383917375028485736726326961575966018344843544375111956896856459849745008491312504103267740859806938072560491882604981955826775714585411069204539358512084100532931709899505686043333904082157271127996483954201497588950610925938893405816546812856533512146469224967713898475743705008672515037488074806072422136954510678053632668629532542247787428389031452783");
2569
2570    let recovered = rsa.decrypt_biguint(&cipher);
2571    println!("RSA_2048_u8: Recovered = {}", recovered);
2572    assert_eq!(recovered, message.into_biguint());
2573
2574    // Example for RSA_4096_u8
2575    use cryptocol::asymmetric::RSA_4096_u8;
2576
2577    let public_key = U4096::from(5_u8);
2578    let private_key = U4096::from_str_radix("65D454FB951A5CEFCA5203530570263DC58CA1F8C489801223754B92F3AFAFCF390C35A6C4F01FBFB6F70563146F1A5610816C34781F831871D946665E7752B92E522A1556DFD885332EC38E0A65A3D934C40C1B123A8181EFC7BE48657EC3437FED43EE8197E2E2F61F639DFEEBA157ED5F33B748A5ADE0881B8A377DFB4FD889732DE0F5DE07454E1845E64CD28321CF7D1B7EBACAE56F5B2EE12232927312A7D4113EACF69903245F86587EFDA359E19CAF07884D3DDD82482B1A8ACBA989933014EED53FAE4DB84A97F2CCD8CBC0C769E909CE918785EB8CA6C13232F0D88F8A0F2A124815BA1B6F5991D258B3262F012FE931BB50E90D1EB9FE3793CD8A18182768BCC1926552BDA2F452FFE5A25DADBF36F83D01FB072B463841A939F0EFAFD7E6564E7F71705CDCFB1281AF424D4EB6282F1F33ADD58DD862B3DE496D6F379BAD1E068893C3A2FFC75DDB1DC18042569AFA0F9DE44A582534BE73DA29D40E624A82A19F6D48609609600FF34BCA8E4D69F18101A3F0BAE655D5F389D568BB91E54465E5AA0FB52CA6E372A21BCDEB45EA16FC36FEFDBC9FF3F295B53C25458C75EE869755A4E4557BD639DE5D80AA9FDE709A53F4D6D135FD8611D0EED5CBB9430C13292C74DF5380BCDE17A4C3BF0E692E505683560CBA89C931934C76B4C499A5092C586EE014732761CEB7C9D67BF43472D89644D2250DAA0E82CD", 16).unwrap();
2579    let modulus = U4096::from_str_radix("7f496a3a7a60f42bbce68427c6cc2fcd36efca76f5abe016ac529e77b09b9bc3074f4310762c27afa4b4c6bbd98ae0eb94a1c741962763de8e4f97fff615276779e6b49aac97cea67ffa74718cff0ccf81f50f21d6c921e26bb9adda7ede74145fe894ea21fddb9bb3a73c857ea689ade8b700a51acf1958aa226cc55d7a23ceabcff95933558916a19e575fe00723ea435c625e697d9ecb31fa996abf370fd751c9158e58343f43ed7767ee9ebd0c305a03dac96a608d54e2da35e12d7e93ebf7fc1a2a8a8f99e1265d3def800efeb0f944634c4235e967666fd0717ebfad0eb36c92f496da1b28a24b2ff646eedfefbac17be37e2a25235066687dc578c0ee1a0790c4437f848078eefd7082f84fc343c1accf9cc24f5e8e0eb021f4dd25fd308c91a79c416639c63e8ad87d452a2d25b4d37356a8d8e70b82df6226fbda1fb7d5a6346d18a9ec79401d6bb3776fa2115eb1c6bc83213eef559f10d0cd21a6d159f3a8910fc13d3a2c031eb3394e7a7928df1d854122b0dc032cb3272adc131ed8bd6e82af43294db9b0640189ebf6da9922af531638f7f71282c240518559e3c839767d78b5b5031f1a88b13028a55587f15a047cd2f565bad97a9a50afab1699397dcc92f10bc0140d2a796686253eabf412ea85e70c0c1d47a22b803fcf94af4ad3dda0dca583ff830b57b2cf86e1c2c0dd15b2a26372f3e43a1300226d", 16).unwrap();
2580    let rsa = RSA_4096_u8::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2581    let message = U4096::from_string("222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap();
2582
2583    println!("RSA_4096_u8: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2584    println!("RSA_4096_u8: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2585    println!("RSA_4096_u8: Message = {}", message);
2586
2587    let cipher = rsa.encrypt_biguint(&message.into_biguint());
2588    println!("RSA_4096_u8: Cipher = {}", cipher);
2589    assert_eq!(cipher.to_string(), "306888388337466187282042307062704792652419569166337859961296761128522602783284171941314622434380020194218138738129324632968494397146631631568752167149366814328742864467558796468059168590183607048154820747334404657757306388818354135775667034077939707535729072254477687440326383413829184673485777354355593153355280000684319981409686640441919882399187403283001545508316655294832517432640860568986729894134362791743417711899828106270794047478495501030619345165383268394002700760718934742142793958715037000863729220391884324389876262174512194595764289919358407235812417445470095912470878283115657786217581619570857356292100179097109404807157489324367049867976992155866043576802494631549170761502725304142654782565627033872965724907731137654011229939774263227934571010082210703339879069398028070889488455929343451400703302388062601385983831754138909311641485104519487019661743420872116450935046792460451393530116569148009578799297083991851298476713329013797490297381294533747638243268187426309927081476470270764781262099702867717226556463217265238293512242449585754661504083025550479259607209149236813578913767448367431207086242762349794159228923175132222452502498030057987566531658182120131188295100537311716791771009234223633803366604959");
2590
2591    let recovered = rsa.decrypt_biguint(&cipher);
2592    println!("RSA_4096_u8: Recovered = {}", recovered);
2593    assert_eq!(recovered, message.into_biguint());
2594    println!("-------------------------------");
2595}
2596
2597fn rsa_failure_decrypt_biguint()
2598{
2599    println!("rsa_failure_decrypt_biguint");
2600    use cryptocol::asymmetric::RSA_1024;
2601    use cryptocol::define_utypes_with;
2602    define_utypes_with!(u32);
2603
2604    let public_key = U1024::from(5_u8);
2605    let private_key = U1024::from_str_radix("3D4990127949DDB062F2BE417E8EACAB79F3215C306217A0C5974FEE15D4CB6D9348A161523F49F83D1CD49CB261C98259F04FECED08E08F3F0C5EF1FE695A291782AA0B9500911299CDAE0297337E9CB219F71411133C4440184C349FAC497EE809ED6D1B472409AB88A99B843FD61DBBBBC4C9686871D5221D137F89AF64CD", 16).unwrap();
2606    let modulus = U1024::from_str_radix("9937e82e2f38aa38f75edba3bc64afacb0dfd36678f53b11edfa47d33693fc91f03593734d9e38ec98c81387bdf477c5e0d8c7d0509631661d9eed5cfc07616849dec988a75bd976cd83c7b6b38cb3573d776435a28b33f2dbbcebb09e693d911fff63ff88e4de8c730a5ee8023b1c6e18a1551e949ebca6b1fedeff1dec08a9", 16).unwrap();
2607    let rsa = RSA_1024::new_with_keys(public_key.clone(), private_key.clone(), modulus.clone());
2608
2609    // Example for Message > self.modulus
2610    println!("Message > self.modulus");
2611    let message = modulus.wrapping_add_uint(1_u8);
2612    let distorted = U1024::one();
2613
2614    println!("RSA_1024: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2615    println!("RSA_1024: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2616    println!("RSA_1024: Message = {}", message);
2617    println!("RSA_1024: Distorted = {}", distorted);
2618
2619    let cipher = rsa.encrypt_biguint(&message);
2620    println!("RSA_1024: Cipher = {}", cipher);
2621    let cypher = rsa.encrypt_biguint(&distorted);
2622    println!("RSA_1024: Cypher = {}", cypher);
2623    assert_eq!(cipher.to_string(), "1");
2624    assert_eq!(cypher.to_string(), "1");
2625    assert_eq!(cipher, cypher);
2626
2627    let recovered = rsa.decrypt_biguint(&cipher);
2628    println!("RSA_1024: Recovered = {}", recovered);
2629    assert_ne!(recovered, message);
2630    let back = rsa.decrypt_biguint(&cypher);
2631    println!("RSA_1024: Back = {}", back);
2632    assert_ne!(back, message);
2633    assert_eq!(back, distorted);
2634    println!();
2635
2636    // Example for Message == self.modulus
2637    println!("Message == self.modulus");
2638    let message = modulus.clone();
2639    let distorted = U1024::zero();
2640
2641    println!("RSA_1024: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2642    println!("RSA_1024: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2643    println!("RSA_1024: Message = {}", message);
2644    println!("RSA_1024: Distorted = {}", distorted);
2645
2646    let cipher = rsa.encrypt_biguint(&message);
2647    println!("RSA_1024: Cipher = {}", cipher);
2648    let cypher = rsa.encrypt_biguint(&distorted);
2649    println!("RSA_1024: Cypher = {}", cypher);
2650    assert_eq!(cipher.to_string(), "0");
2651    assert_eq!(cypher.to_string(), "0");
2652    assert_eq!(cipher, cypher);
2653
2654    let recovered = rsa.decrypt_biguint(&cipher);
2655    println!("RSA_1024: Recovered = {}", recovered);
2656    assert_ne!(recovered, message);
2657    let back = rsa.decrypt_biguint(&cypher);
2658    println!("RSA_1024: Back = {}", back);
2659    assert_ne!(back, message);
2660    assert_eq!(back, distorted);
2661    println!();
2662
2663    // Example for Message < self.modulus
2664    println!("Message < self.modulus");
2665    let message = modulus.wrapping_sub_uint(1_u8);
2666    let undistorted = U1024::from_str_radix("9937e82e2f38aa38f75edba3bc64afacb0dfd36678f53b11edfa47d33693fc91f03593734d9e38ec98c81387bdf477c5e0d8c7d0509631661d9eed5cfc07616849dec988a75bd976cd83c7b6b38cb3573d776435a28b33f2dbbcebb09e693d911fff63ff88e4de8c730a5ee8023b1c6e18a1551e949ebca6b1fedeff1dec08a8", 16).unwrap();
2667
2668    println!("RSA_1024: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2669    println!("RSA_1024: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2670    println!("RSA_1024: Message = {}", message);
2671    println!("RSA_1024: Undistorted = {}", undistorted);
2672
2673    let cipher = rsa.encrypt_biguint(&message);
2674    println!("RSA_1024: Cipher = {}", cipher);
2675    let cypher = rsa.encrypt_biguint(&undistorted);
2676    println!("RSA_1024: Cypher = {}", cypher);
2677    assert_eq!(cipher.to_string(), "107593610008203780612632479874283724612849929433287325474357706755534020189965489050824167197114399993039200600891832987535334998852663448632692843291036287305929545774864548523913837119097088255084765151875474264208848513096610739812512238075122468981229742553101403587095991215625906902923820467139749087400");
2678    assert_eq!(cypher.to_string(), "107593610008203780612632479874283724612849929433287325474357706755534020189965489050824167197114399993039200600891832987535334998852663448632692843291036287305929545774864548523913837119097088255084765151875474264208848513096610739812512238075122468981229742553101403587095991215625906902923820467139749087400");
2679    assert_eq!(cipher, cypher);
2680
2681    let recovered = rsa.decrypt_biguint(&cipher);
2682    println!("RSA_1024: Recovered = {}", recovered);
2683    assert!(recovered == message);
2684    let back = rsa.decrypt_biguint(&cypher);
2685    println!("RSA_1024: Back = {}", back);
2686    assert!(back == message);
2687    assert!(back == undistorted);
2688    println!("-------------------------------");
2689}
2690
2691fn rsa_decrypt_array_biguint()
2692{
2693    println!("rsa_decrypt_array_biguint");
2694    use cryptocol::number::BigUInt;
2695    use cryptocol::define_utypes_with;
2696    define_utypes_with!(u8);
2697    
2698    // Example for RSA_1024
2699    use cryptocol::asymmetric::RSA_1024;
2700
2701    let public_key = U1024::from(5_u8);
2702    let private_key = U1024::from_str_radix("3D4990127949DDB062F2BE417E8EACAB79F3215C306217A0C5974FEE15D4CB6D9348A161523F49F83D1CD49CB261C98259F04FECED08E08F3F0C5EF1FE695A291782AA0B9500911299CDAE0297337E9CB219F71411133C4440184C349FAC497EE809ED6D1B472409AB88A99B843FD61DBBBBC4C9686871D5221D137F89AF64CD", 16).unwrap();
2703    let modulus = U1024::from_str_radix("9937e82e2f38aa38f75edba3bc64afacb0dfd36678f53b11edfa47d33693fc91f03593734d9e38ec98c81387bdf477c5e0d8c7d0509631661d9eed5cfc07616849dec988a75bd976cd83c7b6b38cb3573d776435a28b33f2dbbcebb09e693d911fff63ff88e4de8c730a5ee8023b1c6e18a1551e949ebca6b1fedeff1dec08a9", 16).unwrap();
2704    let rsa = RSA_1024::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2705    let message = [U1024::from_string("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap(),
2706                    U1024::from_string("2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap(),
2707                    U1024::from_string("3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333").unwrap()];
2708
2709    println!("RSA_1024: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2710    println!("RSA_1024: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2711    println!("RSA_1024: Message = {}-{}-{}", message[0], message[1], message[2]);
2712
2713    let cipher = rsa.encrypt_array_biguint(&[message[0].into_biguint(), message[1].into_biguint(), message[2].into_biguint()]);
2714    println!("RSA_1024: Cipher = {}-{}-{}", cipher[0], cipher[1], cipher[2]);
2715    assert_eq!(cipher[0].to_string(), "11498347717307207939984362127351227343891647828020606575311543799151890764127473045317534512340185778744636841280042786182569650057937658603208825508942688973104517576288781331746748391854265838779283687892786769606159370940757555192222397126885152499974714907155577213949301954426519701752245072900923522752");
2716    assert_eq!(cipher[1].to_string(), "45166296929219312241602148452388101165982942196797433986896281306258443882182670297688602803542744940710777118285870195236223805296014729404603886413057185221555925116647357044154437182045242075682782556942753834770554330814409546713579993834957473055501649369674260085089688894770909747300380931410305465861");
2717    assert_eq!(cipher[2].to_string(), "104258245100557014100388000089255129244422186376824260941762474305558950933838723741556706570805144408966737408754572353981049992762264824762423516397166237816159126666560150516613931243159392446246807361060328409075514311188817416397236549955030332963112158611270173312280594534996614952700041036430688843711");
2718
2719    let recovered = rsa.decrypt_array_biguint(&cipher);
2720    println!("RSA_1024: Recovered = {}-{}-{}", recovered[0], recovered[1], recovered[2]);
2721    assert_eq!(recovered[0], message[0].into_biguint());
2722    assert_eq!(recovered[1], message[1].into_biguint());
2723    assert_eq!(recovered[2], message[2].into_biguint());
2724
2725    // Example for RSA_2048
2726    use cryptocol::asymmetric::RSA_2048;
2727
2728    let public_key = U2048::from(7_u8);
2729    let private_key = U2048::from_str_radix("4935A7A0CA0F94101C34BC4A3180F18FE756C4CAFAFDED502AF6B7EC89E42D89C0163CFD43CC58F90F9CEA3045B565957732102340ACF51695E3F635FBD3AAEE83F71EB37103D234B108380932372E677200AD37074BBCEEC60FBEE4AB73C8F7030F712C8A70B43A05BD10700A0C50579CE8A8AEEF96D1D8BF7EDA7CF946F64A04F4C739591D41E2D0CD9E65FA6CED2AAEAE2BB3E9CE38BD0BA06DFF1847965DBE264447EE0C1AE7452638014AA2959B1FEAE409987C65321651C896732A62F0581F87A94DC41D85C3936C369A803DB0D6BD99B346C01A74295C24260E0055BFA97013967F9D6A868E57A67EBF17A6C9D7D5FB50BEFA4A4AD93BC558B8A78297", 16).unwrap();
2730    let modulus = U2048::from_str_radix("aad28721d779aed041d06202738233a51bca75d99efb29bb0eea57d297146a416ade8e4ef3877a45246e2270a2a7425cc0ca25a796e8e68a08693e7df6433981de95f24d5d08ea7af26882c01fd616f15f56e980665b638278cf6815900e2a405c795d67edb1a48762b9265ac21cbb7718c989982f0a944f1427fdce45a59403b080b68d260dafd1fb64b374aaac80bd1f595bd0ff175ca6108fdd2f83905774f66828ba84fab66412430666d46d1b94bb0da1c9d9c9062497677ea5b6b751f1e51651d86b6d377c3b44767134496a8fe2d7157e5f17281ad156d1a05eea359bc847d2d835474e1d4dc517902ffcfb036f7444bf296ad86ab0795f058a6a7a4f", 16).unwrap();
2731    let rsa = RSA_2048::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2732    let message = [U2048::from_string("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap(),
2733                    U2048::from_string("22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap(),
2734                    U2048::from_string("33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333").unwrap()];
2735
2736    println!("RSA_2048: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2737    println!("RSA_2048: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2738    println!("RSA_2048: Message = {}-{}-{}", message[0], message[1], message[2]);
2739
2740    let cipher = rsa.encrypt_array_biguint(&[message[0].into_biguint(), message[1].into_biguint(), message[2].into_biguint()]);
2741    println!("RSA_2048: Cipher = {}-{}-{}", cipher[0], cipher[1], cipher[2]);
2742    assert_eq!(cipher[0].to_string(), "19222624061359673250846359059739843853420634451448389991163689366334342051370657105636882731845894634918805671425622270152257383139670767434742531576389209205471554857350405398176392673609145359240099506218157452818844010262047559375358378002428435697834074559358972665165014579261334313265387506189805058027311828755496605900175422002860565918262405898991726046385746431718588466318613122627318460097165106135557737414837339967603607946756100252603428997909207374469669014045491975776570237713303509787189577741351064528943707348455591901381015422856571578745503309804988710845868795458723379943018626701026619580904");
2743    assert_eq!(cipher[1].to_string(), "2162601705197266388430407067468432039384013235712826322894856463766187033358723916690576103616208021235118086892704527157675665923187607693853175631923961500069870836826565615537684511580445390403335706835152446778962609842260014842938385695677464053437897083002342473290905366555201087408506088286024071657223370958139726526658613908350434381933078613256245009076381433448776545677230225375345485184663906559997314931625379179728845765913371880777924776671070365050266168791435461962831816750003484563263566103101048540393850384009497837363571269795809614594215419935841678869610883053048459763096376368303543057618");
2744    assert_eq!(cipher[2].to_string(), "11005496648948092196671263853474018345023369218256547760376027065480788176360278240016253379330891750962711210125748191463703823515643414126048153016279497771873322920552753976875286327495435794501104988281718167000843412300082848991944943057029810023543981865177927105338265914121416097511479737861674883541423933061998681507286171218723416306799646568348207996021600555324586523788204283964397436578478311759288379296955383037548813806708090848554801088192089524689822235188613606104977142437789920233100836515577891822546346199757457300078280962387025576467704769692869917952700145348667083921490956402329000033669");
2745
2746    let recovered = rsa.decrypt_array_biguint(&cipher);
2747    println!("RSA_2048: Recovered = {}-{}-{}", recovered[0], recovered[1], recovered[2]);
2748    assert_eq!(recovered[0], message[0].into_biguint());
2749    assert_eq!(recovered[1], message[1].into_biguint());
2750    assert_eq!(recovered[2], message[2].into_biguint());
2751
2752    // Example for RSA_4096
2753    use cryptocol::asymmetric::RSA_4096;
2754
2755    let public_key = U4096::from(5_u8);
2756    let private_key = U4096::from_str_radix("65D454FB951A5CEFCA5203530570263DC58CA1F8C489801223754B92F3AFAFCF390C35A6C4F01FBFB6F70563146F1A5610816C34781F831871D946665E7752B92E522A1556DFD885332EC38E0A65A3D934C40C1B123A8181EFC7BE48657EC3437FED43EE8197E2E2F61F639DFEEBA157ED5F33B748A5ADE0881B8A377DFB4FD889732DE0F5DE07454E1845E64CD28321CF7D1B7EBACAE56F5B2EE12232927312A7D4113EACF69903245F86587EFDA359E19CAF07884D3DDD82482B1A8ACBA989933014EED53FAE4DB84A97F2CCD8CBC0C769E909CE918785EB8CA6C13232F0D88F8A0F2A124815BA1B6F5991D258B3262F012FE931BB50E90D1EB9FE3793CD8A18182768BCC1926552BDA2F452FFE5A25DADBF36F83D01FB072B463841A939F0EFAFD7E6564E7F71705CDCFB1281AF424D4EB6282F1F33ADD58DD862B3DE496D6F379BAD1E068893C3A2FFC75DDB1DC18042569AFA0F9DE44A582534BE73DA29D40E624A82A19F6D48609609600FF34BCA8E4D69F18101A3F0BAE655D5F389D568BB91E54465E5AA0FB52CA6E372A21BCDEB45EA16FC36FEFDBC9FF3F295B53C25458C75EE869755A4E4557BD639DE5D80AA9FDE709A53F4D6D135FD8611D0EED5CBB9430C13292C74DF5380BCDE17A4C3BF0E692E505683560CBA89C931934C76B4C499A5092C586EE014732761CEB7C9D67BF43472D89644D2250DAA0E82CD", 16).unwrap();
2757    let modulus = U4096::from_str_radix("7f496a3a7a60f42bbce68427c6cc2fcd36efca76f5abe016ac529e77b09b9bc3074f4310762c27afa4b4c6bbd98ae0eb94a1c741962763de8e4f97fff615276779e6b49aac97cea67ffa74718cff0ccf81f50f21d6c921e26bb9adda7ede74145fe894ea21fddb9bb3a73c857ea689ade8b700a51acf1958aa226cc55d7a23ceabcff95933558916a19e575fe00723ea435c625e697d9ecb31fa996abf370fd751c9158e58343f43ed7767ee9ebd0c305a03dac96a608d54e2da35e12d7e93ebf7fc1a2a8a8f99e1265d3def800efeb0f944634c4235e967666fd0717ebfad0eb36c92f496da1b28a24b2ff646eedfefbac17be37e2a25235066687dc578c0ee1a0790c4437f848078eefd7082f84fc343c1accf9cc24f5e8e0eb021f4dd25fd308c91a79c416639c63e8ad87d452a2d25b4d37356a8d8e70b82df6226fbda1fb7d5a6346d18a9ec79401d6bb3776fa2115eb1c6bc83213eef559f10d0cd21a6d159f3a8910fc13d3a2c031eb3394e7a7928df1d854122b0dc032cb3272adc131ed8bd6e82af43294db9b0640189ebf6da9922af531638f7f71282c240518559e3c839767d78b5b5031f1a88b13028a55587f15a047cd2f565bad97a9a50afab1699397dcc92f10bc0140d2a796686253eabf412ea85e70c0c1d47a22b803fcf94af4ad3dda0dca583ff830b57b2cf86e1c2c0dd15b2a26372f3e43a1300226d", 16).unwrap();
2758    let rsa = RSA_4096::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2759    let message = [U4096::from_string("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap(),
2760                    U4096::from_string("2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap(),
2761                    U4096::from_string("3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333").unwrap()];
2762
2763    println!("RSA_4096: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2764    println!("RSA_4096: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2765    println!("RSA_4096: Message = {}-{}-{}", message[0], message[1], message[2]);
2766
2767    let cipher = rsa.encrypt_array_biguint(&[message[0].into_biguint(), message[1].into_biguint(), message[2].into_biguint()]);
2768    println!("RSA_4096: Cipher = {}-{}-{}", cipher[0], cipher[1], cipher[2]);
2769    assert_eq!(cipher[0].to_string(), "482480559007706139120435280808635896009433629588335984384927715221286241221693386397964558645023125644387584377108048840919363748179067815556343522612009226536244646018841314849644563703567121309251931243104536248830409306764441218940707735488174389293011516384299039172989527209791652903206065174607465242127258473463449897381586375165158262679436131223964565287682877733440561251733628268289938957295135308390468247660146474573679954253402229925356718786306318712335967935544719625339452930957199350386947670968898258607047286750312571697576971474019840700563054069610571790835804735603849906670776683787524123334029659362618326992712141061257613414324296166006594978236006676084553601587664366122587386278129925060768375788485986602763782980169513776316287742616158875810163725010461579433100067994550624723427286094489426319062692258967640187754398048428613760189298914444204926481463733838943736719093910153478487926462136253769740147515107152461575428182350390686729098858398529816214835849111530826241152472252076472917684397765104370104272368489696053079777801388987696516172596260735578907952952459711577927570207745725289641141609304276024163405203474353382102713816313135307667770197490398260668967746483598882575518327870");
2770    assert_eq!(cipher[1].to_string(), "380120271426728247273769594446426641238838574667066484492143825438199540746259333734898815839113476807946344674781852498015750187211946722686817140378127692602596973237535781766036917217014439840298935296104792388923935389140007930758417023287106240377236524088212457735840517977835282307935378303691528124337422295542861244981251202817035532847360174307949160666481423592218164303960867236056117050624200788667329124296084136158402380660016117503455576500836950136532659050275799351693675963408739507550453651080705341452109450531835286543627282055447987805443778346211402384761807314384195838018252816026053966001141868460018268757844053788682677555437718750833050059731042394824540328543797043564501760327576307307355931319658681398516269273687097684141437367423611622209771531132413287920345638854815045079343370332832839457765574775484259542386378149003148326014739675786806590309375655758321160305411682476757937244509127945920548992083112247444836804339957942255918239364228741912091347528452773593332640033742044746411180874088216225474181184840821497671566688088032569517704444379135001484669795569619902101545075816910203604438757433894421722427813437974178973513107314677953578676777016943686788116194436463496787358425447");
2771    assert_eq!(cipher[2].to_string(), "403708122166717805212812440921541454803287378381881151718566217059934543482388343843574347969379105455056108349254666875616590987975539200841837849153148937087547866812511369840092694040775151853507412463054629015063201331777319928369501610686490431829222617691381034382645478686717780175687315400539711928636188622663308476599958801157371748300079694552482160722166897070092451616412069071181575031872050871255427968090224828478189746473554664127514715116670586818360179040472853498418648045879823744470657856376457526201599706788452275951271097481060745828920788111970622502535466247898449235637174171943825913108633880035293325538963948968316813709719634673738870061012948875675340444118678854664035378384510021029569760389132667739424199676333150729497633898277251965456673950972150625131498563419556536557513225945879539695884910650410670631396971797107947173943230798002349278205019698905650667265388286337528525078132653138115630367203064184429904843606583697672829370055741098908264941689234822140860264804737667847796895993509920072611623938284873822582637972665248640500313543359063164177031112994089881032048285300304361927726006864552178984319375585107683011215008616994395932187400440737780861175121938401991141425571085");
2772
2773    let recovered = rsa.decrypt_array_biguint(&cipher);
2774    println!("RSA_4096: Recovered = {}-{}-{}", recovered[0], recovered[1], recovered[2]);
2775    assert_eq!(recovered[0], message[0].into_biguint());
2776    assert_eq!(recovered[1], message[1].into_biguint());
2777    assert_eq!(recovered[2], message[2].into_biguint());
2778
2779    // Example for RSA_Genric
2780    use cryptocol::asymmetric::RSA_Generic;
2781
2782    let public_key = BigUInt::<u8, 32>::from(0xD_u8);
2783    let private_key = BigUInt::<u8, 32>::from_str_radix("3F3597F1C44073A8D3C34F5FF1444665DAE8D8F268104A60C82825E1C3CD44D5", 16).unwrap();
2784    let modulus = BigUInt::<u8, 32>::from_str_radix("88f41e8bd3e0fa98757c814fe013edde379c41da169a91050fa4964a1141853b", 16).unwrap();
2785    let rsa = RSA_Generic::<32, u8, 5>::new_with_keys(public_key, private_key, modulus);
2786    let message = [BigUInt::<u8, 32>::from_string("111111111111111111111111111111111111111111111111").unwrap(),
2787                    BigUInt::<u8, 32>::from_string("22222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap(),
2788                    BigUInt::<u8, 32>::from_string("33333333333333333333333333333333333333333333333333333333333333333333333333333").unwrap()];
2789
2790    println!("RSA_Generic::<32, u8, 5>: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2791    println!("RSA_Generic::<32, u8, 5>: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2792    println!("RSA_Generic::<32, u8, 5>: Message = {}-{}-{}", message[0], message[1], message[2]);
2793
2794    let cipher = rsa.encrypt_array_biguint(&[message[0].into_biguint(), message[1].into_biguint(), message[2].into_biguint()]);
2795    println!("RSA_Generic::<32, u8, 5>: Cipher = {}-{}-{}", cipher[0], cipher[1], cipher[2]);
2796    assert_eq!(cipher[0].to_string(), "51720491092447519507074683521365241726426520130311862375451081363728566503113");
2797    assert_eq!(cipher[1].to_string(), "23629251217471383540783659092109414281325061527006739986059075736051020827090");
2798    assert_eq!(cipher[2].to_string(), "43982897865412306355287000322072606109839286077564333327205434569348156907984");
2799
2800    let recovered = rsa.decrypt_array_biguint(&cipher);
2801    println!("RSA_Generic::<32, u8, 5>: Recovered = {}-{}-{}", recovered[0], recovered[1], recovered[2]);
2802    assert_eq!(recovered[0], message[0].into_biguint());
2803    assert_eq!(recovered[1], message[1].into_biguint());
2804    assert_eq!(recovered[2], message[2].into_biguint());
2805    
2806    // Example for RSA_1024_u128
2807    use cryptocol::asymmetric::RSA_1024_u128;
2808
2809    let public_key = U1024::from(5_u8);
2810    let private_key = U1024::from_str_radix("3D4990127949DDB062F2BE417E8EACAB79F3215C306217A0C5974FEE15D4CB6D9348A161523F49F83D1CD49CB261C98259F04FECED08E08F3F0C5EF1FE695A291782AA0B9500911299CDAE0297337E9CB219F71411133C4440184C349FAC497EE809ED6D1B472409AB88A99B843FD61DBBBBC4C9686871D5221D137F89AF64CD", 16).unwrap();
2811    let modulus = U1024::from_str_radix("9937e82e2f38aa38f75edba3bc64afacb0dfd36678f53b11edfa47d33693fc91f03593734d9e38ec98c81387bdf477c5e0d8c7d0509631661d9eed5cfc07616849dec988a75bd976cd83c7b6b38cb3573d776435a28b33f2dbbcebb09e693d911fff63ff88e4de8c730a5ee8023b1c6e18a1551e949ebca6b1fedeff1dec08a9", 16).unwrap();
2812    let rsa = RSA_1024_u128::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2813    let message = [U1024::from_string("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap(),
2814                    U1024::from_string("2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap(),
2815                    U1024::from_string("3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333").unwrap()];
2816
2817    println!("RSA_1024_u128: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2818    println!("RSA_1024_u128: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2819    println!("RSA_1024_u128: Message = {}-{}-{}", message[0], message[1], message[2]);
2820
2821    let cipher = rsa.encrypt_array_biguint(&[message[0].into_biguint(), message[1].into_biguint(), message[2].into_biguint()]);
2822    println!("RSA_1024_u128: Cipher = {}-{}-{}", cipher[0], cipher[1], cipher[2]);
2823    assert_eq!(cipher[0].to_string(), "11498347717307207939984362127351227343891647828020606575311543799151890764127473045317534512340185778744636841280042786182569650057937658603208825508942688973104517576288781331746748391854265838779283687892786769606159370940757555192222397126885152499974714907155577213949301954426519701752245072900923522752");
2824    assert_eq!(cipher[1].to_string(), "45166296929219312241602148452388101165982942196797433986896281306258443882182670297688602803542744940710777118285870195236223805296014729404603886413057185221555925116647357044154437182045242075682782556942753834770554330814409546713579993834957473055501649369674260085089688894770909747300380931410305465861");
2825    assert_eq!(cipher[2].to_string(), "104258245100557014100388000089255129244422186376824260941762474305558950933838723741556706570805144408966737408754572353981049992762264824762423516397166237816159126666560150516613931243159392446246807361060328409075514311188817416397236549955030332963112158611270173312280594534996614952700041036430688843711");
2826
2827    let recovered = rsa.decrypt_array_biguint(&cipher);
2828    println!("RSA_1024_u128: Recovered = {}-{}-{}", recovered[0], recovered[1], recovered[2]);
2829    assert_eq!(recovered[0], message[0].into_biguint());
2830    assert_eq!(recovered[1], message[1].into_biguint());
2831    assert_eq!(recovered[2], message[2].into_biguint());
2832
2833    // Example for RSA_2048_u128
2834    use cryptocol::asymmetric::RSA_2048_u128;
2835
2836    let public_key = U2048::from(7_u8);
2837    let private_key = U2048::from_str_radix("4935A7A0CA0F94101C34BC4A3180F18FE756C4CAFAFDED502AF6B7EC89E42D89C0163CFD43CC58F90F9CEA3045B565957732102340ACF51695E3F635FBD3AAEE83F71EB37103D234B108380932372E677200AD37074BBCEEC60FBEE4AB73C8F7030F712C8A70B43A05BD10700A0C50579CE8A8AEEF96D1D8BF7EDA7CF946F64A04F4C739591D41E2D0CD9E65FA6CED2AAEAE2BB3E9CE38BD0BA06DFF1847965DBE264447EE0C1AE7452638014AA2959B1FEAE409987C65321651C896732A62F0581F87A94DC41D85C3936C369A803DB0D6BD99B346C01A74295C24260E0055BFA97013967F9D6A868E57A67EBF17A6C9D7D5FB50BEFA4A4AD93BC558B8A78297", 16).unwrap();
2838    let modulus = U2048::from_str_radix("aad28721d779aed041d06202738233a51bca75d99efb29bb0eea57d297146a416ade8e4ef3877a45246e2270a2a7425cc0ca25a796e8e68a08693e7df6433981de95f24d5d08ea7af26882c01fd616f15f56e980665b638278cf6815900e2a405c795d67edb1a48762b9265ac21cbb7718c989982f0a944f1427fdce45a59403b080b68d260dafd1fb64b374aaac80bd1f595bd0ff175ca6108fdd2f83905774f66828ba84fab66412430666d46d1b94bb0da1c9d9c9062497677ea5b6b751f1e51651d86b6d377c3b44767134496a8fe2d7157e5f17281ad156d1a05eea359bc847d2d835474e1d4dc517902ffcfb036f7444bf296ad86ab0795f058a6a7a4f", 16).unwrap();
2839    let rsa = RSA_2048_u128::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2840    let message = [U2048::from_string("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap(),
2841                    U2048::from_string("22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap(),
2842                    U2048::from_string("33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333").unwrap()];
2843
2844    println!("RSA_2048_u128: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2845    println!("RSA_2048_u128: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2846    println!("RSA_2048_u128: Message = {}-{}-{}", message[0], message[1], message[2]);
2847
2848    let cipher = rsa.encrypt_array_biguint(&[message[0].into_biguint(), message[1].into_biguint(), message[2].into_biguint()]);
2849    println!("RSA_2048_u128: Cipher = {}-{}-{}", cipher[0], cipher[1], cipher[2]);
2850    assert_eq!(cipher[0].to_string(), "19222624061359673250846359059739843853420634451448389991163689366334342051370657105636882731845894634918805671425622270152257383139670767434742531576389209205471554857350405398176392673609145359240099506218157452818844010262047559375358378002428435697834074559358972665165014579261334313265387506189805058027311828755496605900175422002860565918262405898991726046385746431718588466318613122627318460097165106135557737414837339967603607946756100252603428997909207374469669014045491975776570237713303509787189577741351064528943707348455591901381015422856571578745503309804988710845868795458723379943018626701026619580904");
2851    assert_eq!(cipher[1].to_string(), "2162601705197266388430407067468432039384013235712826322894856463766187033358723916690576103616208021235118086892704527157675665923187607693853175631923961500069870836826565615537684511580445390403335706835152446778962609842260014842938385695677464053437897083002342473290905366555201087408506088286024071657223370958139726526658613908350434381933078613256245009076381433448776545677230225375345485184663906559997314931625379179728845765913371880777924776671070365050266168791435461962831816750003484563263566103101048540393850384009497837363571269795809614594215419935841678869610883053048459763096376368303543057618");
2852    assert_eq!(cipher[2].to_string(), "11005496648948092196671263853474018345023369218256547760376027065480788176360278240016253379330891750962711210125748191463703823515643414126048153016279497771873322920552753976875286327495435794501104988281718167000843412300082848991944943057029810023543981865177927105338265914121416097511479737861674883541423933061998681507286171218723416306799646568348207996021600555324586523788204283964397436578478311759288379296955383037548813806708090848554801088192089524689822235188613606104977142437789920233100836515577891822546346199757457300078280962387025576467704769692869917952700145348667083921490956402329000033669");
2853
2854    let recovered = rsa.decrypt_array_biguint(&cipher);
2855    println!("RSA_2048_u128: Recovered = {}-{}-{}", recovered[0], recovered[1], recovered[2]);
2856    assert_eq!(recovered[0], message[0].into_biguint());
2857    assert_eq!(recovered[1], message[1].into_biguint());
2858    assert_eq!(recovered[2], message[2].into_biguint());
2859
2860    // Example for RSA_4096_u128
2861    use cryptocol::asymmetric::RSA_4096_u128;
2862
2863    let public_key = U4096::from(5_u8);
2864    let private_key = U4096::from_str_radix("65D454FB951A5CEFCA5203530570263DC58CA1F8C489801223754B92F3AFAFCF390C35A6C4F01FBFB6F70563146F1A5610816C34781F831871D946665E7752B92E522A1556DFD885332EC38E0A65A3D934C40C1B123A8181EFC7BE48657EC3437FED43EE8197E2E2F61F639DFEEBA157ED5F33B748A5ADE0881B8A377DFB4FD889732DE0F5DE07454E1845E64CD28321CF7D1B7EBACAE56F5B2EE12232927312A7D4113EACF69903245F86587EFDA359E19CAF07884D3DDD82482B1A8ACBA989933014EED53FAE4DB84A97F2CCD8CBC0C769E909CE918785EB8CA6C13232F0D88F8A0F2A124815BA1B6F5991D258B3262F012FE931BB50E90D1EB9FE3793CD8A18182768BCC1926552BDA2F452FFE5A25DADBF36F83D01FB072B463841A939F0EFAFD7E6564E7F71705CDCFB1281AF424D4EB6282F1F33ADD58DD862B3DE496D6F379BAD1E068893C3A2FFC75DDB1DC18042569AFA0F9DE44A582534BE73DA29D40E624A82A19F6D48609609600FF34BCA8E4D69F18101A3F0BAE655D5F389D568BB91E54465E5AA0FB52CA6E372A21BCDEB45EA16FC36FEFDBC9FF3F295B53C25458C75EE869755A4E4557BD639DE5D80AA9FDE709A53F4D6D135FD8611D0EED5CBB9430C13292C74DF5380BCDE17A4C3BF0E692E505683560CBA89C931934C76B4C499A5092C586EE014732761CEB7C9D67BF43472D89644D2250DAA0E82CD", 16).unwrap();
2865    let modulus = U4096::from_str_radix("7f496a3a7a60f42bbce68427c6cc2fcd36efca76f5abe016ac529e77b09b9bc3074f4310762c27afa4b4c6bbd98ae0eb94a1c741962763de8e4f97fff615276779e6b49aac97cea67ffa74718cff0ccf81f50f21d6c921e26bb9adda7ede74145fe894ea21fddb9bb3a73c857ea689ade8b700a51acf1958aa226cc55d7a23ceabcff95933558916a19e575fe00723ea435c625e697d9ecb31fa996abf370fd751c9158e58343f43ed7767ee9ebd0c305a03dac96a608d54e2da35e12d7e93ebf7fc1a2a8a8f99e1265d3def800efeb0f944634c4235e967666fd0717ebfad0eb36c92f496da1b28a24b2ff646eedfefbac17be37e2a25235066687dc578c0ee1a0790c4437f848078eefd7082f84fc343c1accf9cc24f5e8e0eb021f4dd25fd308c91a79c416639c63e8ad87d452a2d25b4d37356a8d8e70b82df6226fbda1fb7d5a6346d18a9ec79401d6bb3776fa2115eb1c6bc83213eef559f10d0cd21a6d159f3a8910fc13d3a2c031eb3394e7a7928df1d854122b0dc032cb3272adc131ed8bd6e82af43294db9b0640189ebf6da9922af531638f7f71282c240518559e3c839767d78b5b5031f1a88b13028a55587f15a047cd2f565bad97a9a50afab1699397dcc92f10bc0140d2a796686253eabf412ea85e70c0c1d47a22b803fcf94af4ad3dda0dca583ff830b57b2cf86e1c2c0dd15b2a26372f3e43a1300226d", 16).unwrap();
2866    let rsa = RSA_4096_u128::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2867    let message = [U4096::from_string("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap(),
2868                    U4096::from_string("2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap(),
2869                    U4096::from_string("3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333").unwrap()];
2870
2871    println!("RSA_4096_u128: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2872    println!("RSA_4096_u128: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2873    println!("RSA_4096_u128: Message = {}-{}-{}", message[0], message[1], message[2]);
2874
2875    let cipher = rsa.encrypt_array_biguint(&[message[0].into_biguint(), message[1].into_biguint(), message[2].into_biguint()]);
2876    println!("RSA_4096_u128: Cipher = {}-{}-{}", cipher[0], cipher[1], cipher[2]);
2877    assert_eq!(cipher[0].to_string(), "482480559007706139120435280808635896009433629588335984384927715221286241221693386397964558645023125644387584377108048840919363748179067815556343522612009226536244646018841314849644563703567121309251931243104536248830409306764441218940707735488174389293011516384299039172989527209791652903206065174607465242127258473463449897381586375165158262679436131223964565287682877733440561251733628268289938957295135308390468247660146474573679954253402229925356718786306318712335967935544719625339452930957199350386947670968898258607047286750312571697576971474019840700563054069610571790835804735603849906670776683787524123334029659362618326992712141061257613414324296166006594978236006676084553601587664366122587386278129925060768375788485986602763782980169513776316287742616158875810163725010461579433100067994550624723427286094489426319062692258967640187754398048428613760189298914444204926481463733838943736719093910153478487926462136253769740147515107152461575428182350390686729098858398529816214835849111530826241152472252076472917684397765104370104272368489696053079777801388987696516172596260735578907952952459711577927570207745725289641141609304276024163405203474353382102713816313135307667770197490398260668967746483598882575518327870");
2878    assert_eq!(cipher[1].to_string(), "380120271426728247273769594446426641238838574667066484492143825438199540746259333734898815839113476807946344674781852498015750187211946722686817140378127692602596973237535781766036917217014439840298935296104792388923935389140007930758417023287106240377236524088212457735840517977835282307935378303691528124337422295542861244981251202817035532847360174307949160666481423592218164303960867236056117050624200788667329124296084136158402380660016117503455576500836950136532659050275799351693675963408739507550453651080705341452109450531835286543627282055447987805443778346211402384761807314384195838018252816026053966001141868460018268757844053788682677555437718750833050059731042394824540328543797043564501760327576307307355931319658681398516269273687097684141437367423611622209771531132413287920345638854815045079343370332832839457765574775484259542386378149003148326014739675786806590309375655758321160305411682476757937244509127945920548992083112247444836804339957942255918239364228741912091347528452773593332640033742044746411180874088216225474181184840821497671566688088032569517704444379135001484669795569619902101545075816910203604438757433894421722427813437974178973513107314677953578676777016943686788116194436463496787358425447");
2879    assert_eq!(cipher[2].to_string(), "403708122166717805212812440921541454803287378381881151718566217059934543482388343843574347969379105455056108349254666875616590987975539200841837849153148937087547866812511369840092694040775151853507412463054629015063201331777319928369501610686490431829222617691381034382645478686717780175687315400539711928636188622663308476599958801157371748300079694552482160722166897070092451616412069071181575031872050871255427968090224828478189746473554664127514715116670586818360179040472853498418648045879823744470657856376457526201599706788452275951271097481060745828920788111970622502535466247898449235637174171943825913108633880035293325538963948968316813709719634673738870061012948875675340444118678854664035378384510021029569760389132667739424199676333150729497633898277251965456673950972150625131498563419556536557513225945879539695884910650410670631396971797107947173943230798002349278205019698905650667265388286337528525078132653138115630367203064184429904843606583697672829370055741098908264941689234822140860264804737667847796895993509920072611623938284873822582637972665248640500313543359063164177031112994089881032048285300304361927726006864552178984319375585107683011215008616994395932187400440737780861175121938401991141425571085");
2880
2881    let recovered = rsa.decrypt_array_biguint(&cipher);
2882    println!("RSA_4096_u128: Recovered = {}-{}-{}", recovered[0], recovered[1], recovered[2]);
2883    assert_eq!(recovered[0], message[0].into_biguint());
2884    assert_eq!(recovered[1], message[1].into_biguint());
2885    assert_eq!(recovered[2], message[2].into_biguint());
2886    
2887    // Example for RSA_1024_u64
2888    use cryptocol::asymmetric::RSA_1024_u64;
2889
2890    let public_key = U1024::from(5_u8);
2891    let private_key = U1024::from_str_radix("3D4990127949DDB062F2BE417E8EACAB79F3215C306217A0C5974FEE15D4CB6D9348A161523F49F83D1CD49CB261C98259F04FECED08E08F3F0C5EF1FE695A291782AA0B9500911299CDAE0297337E9CB219F71411133C4440184C349FAC497EE809ED6D1B472409AB88A99B843FD61DBBBBC4C9686871D5221D137F89AF64CD", 16).unwrap();
2892    let modulus = U1024::from_str_radix("9937e82e2f38aa38f75edba3bc64afacb0dfd36678f53b11edfa47d33693fc91f03593734d9e38ec98c81387bdf477c5e0d8c7d0509631661d9eed5cfc07616849dec988a75bd976cd83c7b6b38cb3573d776435a28b33f2dbbcebb09e693d911fff63ff88e4de8c730a5ee8023b1c6e18a1551e949ebca6b1fedeff1dec08a9", 16).unwrap();
2893    let rsa = RSA_1024_u64::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2894    let message = [U1024::from_string("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap(),
2895                    U1024::from_string("2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap(),
2896                    U1024::from_string("3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333").unwrap()];
2897
2898    println!("RSA_1024_u64: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2899    println!("RSA_1024_u64: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2900    println!("RSA_1024_u64: Message = {}-{}-{}", message[0], message[1], message[2]);
2901
2902    let cipher = rsa.encrypt_array_biguint(&[message[0].into_biguint(), message[1].into_biguint(), message[2].into_biguint()]);
2903    println!("RSA_1024_u64: Cipher = {}-{}-{}", cipher[0], cipher[1], cipher[2]);
2904    assert_eq!(cipher[0].to_string(), "11498347717307207939984362127351227343891647828020606575311543799151890764127473045317534512340185778744636841280042786182569650057937658603208825508942688973104517576288781331746748391854265838779283687892786769606159370940757555192222397126885152499974714907155577213949301954426519701752245072900923522752");
2905    assert_eq!(cipher[1].to_string(), "45166296929219312241602148452388101165982942196797433986896281306258443882182670297688602803542744940710777118285870195236223805296014729404603886413057185221555925116647357044154437182045242075682782556942753834770554330814409546713579993834957473055501649369674260085089688894770909747300380931410305465861");
2906    assert_eq!(cipher[2].to_string(), "104258245100557014100388000089255129244422186376824260941762474305558950933838723741556706570805144408966737408754572353981049992762264824762423516397166237816159126666560150516613931243159392446246807361060328409075514311188817416397236549955030332963112158611270173312280594534996614952700041036430688843711");
2907
2908    let recovered = rsa.decrypt_array_biguint(&cipher);
2909    println!("RSA_1024_u64: Recovered = {}-{}-{}", recovered[0], recovered[1], recovered[2]);
2910    assert_eq!(recovered[0], message[0].into_biguint());
2911    assert_eq!(recovered[1], message[1].into_biguint());
2912    assert_eq!(recovered[2], message[2].into_biguint());
2913
2914    // Example for RSA_2048_u64
2915    use cryptocol::asymmetric::RSA_2048_u64;
2916
2917    let public_key = U2048::from(7_u8);
2918    let private_key = U2048::from_str_radix("4935A7A0CA0F94101C34BC4A3180F18FE756C4CAFAFDED502AF6B7EC89E42D89C0163CFD43CC58F90F9CEA3045B565957732102340ACF51695E3F635FBD3AAEE83F71EB37103D234B108380932372E677200AD37074BBCEEC60FBEE4AB73C8F7030F712C8A70B43A05BD10700A0C50579CE8A8AEEF96D1D8BF7EDA7CF946F64A04F4C739591D41E2D0CD9E65FA6CED2AAEAE2BB3E9CE38BD0BA06DFF1847965DBE264447EE0C1AE7452638014AA2959B1FEAE409987C65321651C896732A62F0581F87A94DC41D85C3936C369A803DB0D6BD99B346C01A74295C24260E0055BFA97013967F9D6A868E57A67EBF17A6C9D7D5FB50BEFA4A4AD93BC558B8A78297", 16).unwrap();
2919    let modulus = U2048::from_str_radix("aad28721d779aed041d06202738233a51bca75d99efb29bb0eea57d297146a416ade8e4ef3877a45246e2270a2a7425cc0ca25a796e8e68a08693e7df6433981de95f24d5d08ea7af26882c01fd616f15f56e980665b638278cf6815900e2a405c795d67edb1a48762b9265ac21cbb7718c989982f0a944f1427fdce45a59403b080b68d260dafd1fb64b374aaac80bd1f595bd0ff175ca6108fdd2f83905774f66828ba84fab66412430666d46d1b94bb0da1c9d9c9062497677ea5b6b751f1e51651d86b6d377c3b44767134496a8fe2d7157e5f17281ad156d1a05eea359bc847d2d835474e1d4dc517902ffcfb036f7444bf296ad86ab0795f058a6a7a4f", 16).unwrap();
2920    let rsa = RSA_2048_u64::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2921    let message = [U2048::from_string("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap(),
2922                    U2048::from_string("22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap(),
2923                    U2048::from_string("33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333").unwrap()];
2924
2925    println!("RSA_2048_u64: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2926    println!("RSA_2048_u64: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2927    println!("RSA_2048_u64: Message = {}-{}-{}", message[0], message[1], message[2]);
2928
2929    let cipher = rsa.encrypt_array_biguint(&[message[0].into_biguint(), message[1].into_biguint(), message[2].into_biguint()]);
2930    println!("RSA_2048_u64: Cipher = {}-{}-{}", cipher[0], cipher[1], cipher[2]);
2931    assert_eq!(cipher[0].to_string(), "19222624061359673250846359059739843853420634451448389991163689366334342051370657105636882731845894634918805671425622270152257383139670767434742531576389209205471554857350405398176392673609145359240099506218157452818844010262047559375358378002428435697834074559358972665165014579261334313265387506189805058027311828755496605900175422002860565918262405898991726046385746431718588466318613122627318460097165106135557737414837339967603607946756100252603428997909207374469669014045491975776570237713303509787189577741351064528943707348455591901381015422856571578745503309804988710845868795458723379943018626701026619580904");
2932    assert_eq!(cipher[1].to_string(), "2162601705197266388430407067468432039384013235712826322894856463766187033358723916690576103616208021235118086892704527157675665923187607693853175631923961500069870836826565615537684511580445390403335706835152446778962609842260014842938385695677464053437897083002342473290905366555201087408506088286024071657223370958139726526658613908350434381933078613256245009076381433448776545677230225375345485184663906559997314931625379179728845765913371880777924776671070365050266168791435461962831816750003484563263566103101048540393850384009497837363571269795809614594215419935841678869610883053048459763096376368303543057618");
2933    assert_eq!(cipher[2].to_string(), "11005496648948092196671263853474018345023369218256547760376027065480788176360278240016253379330891750962711210125748191463703823515643414126048153016279497771873322920552753976875286327495435794501104988281718167000843412300082848991944943057029810023543981865177927105338265914121416097511479737861674883541423933061998681507286171218723416306799646568348207996021600555324586523788204283964397436578478311759288379296955383037548813806708090848554801088192089524689822235188613606104977142437789920233100836515577891822546346199757457300078280962387025576467704769692869917952700145348667083921490956402329000033669");
2934
2935    let recovered = rsa.decrypt_array_biguint(&cipher);
2936    println!("RSA_2048_u64: Recovered = {}-{}-{}", recovered[0], recovered[1], recovered[2]);
2937    assert_eq!(recovered[0], message[0].into_biguint());
2938    assert_eq!(recovered[1], message[1].into_biguint());
2939    assert_eq!(recovered[2], message[2].into_biguint());
2940
2941    // Example for RSA_4096_u64
2942    use cryptocol::asymmetric::RSA_4096_u64;
2943
2944    let public_key = U4096::from(5_u8);
2945    let private_key = U4096::from_str_radix("65D454FB951A5CEFCA5203530570263DC58CA1F8C489801223754B92F3AFAFCF390C35A6C4F01FBFB6F70563146F1A5610816C34781F831871D946665E7752B92E522A1556DFD885332EC38E0A65A3D934C40C1B123A8181EFC7BE48657EC3437FED43EE8197E2E2F61F639DFEEBA157ED5F33B748A5ADE0881B8A377DFB4FD889732DE0F5DE07454E1845E64CD28321CF7D1B7EBACAE56F5B2EE12232927312A7D4113EACF69903245F86587EFDA359E19CAF07884D3DDD82482B1A8ACBA989933014EED53FAE4DB84A97F2CCD8CBC0C769E909CE918785EB8CA6C13232F0D88F8A0F2A124815BA1B6F5991D258B3262F012FE931BB50E90D1EB9FE3793CD8A18182768BCC1926552BDA2F452FFE5A25DADBF36F83D01FB072B463841A939F0EFAFD7E6564E7F71705CDCFB1281AF424D4EB6282F1F33ADD58DD862B3DE496D6F379BAD1E068893C3A2FFC75DDB1DC18042569AFA0F9DE44A582534BE73DA29D40E624A82A19F6D48609609600FF34BCA8E4D69F18101A3F0BAE655D5F389D568BB91E54465E5AA0FB52CA6E372A21BCDEB45EA16FC36FEFDBC9FF3F295B53C25458C75EE869755A4E4557BD639DE5D80AA9FDE709A53F4D6D135FD8611D0EED5CBB9430C13292C74DF5380BCDE17A4C3BF0E692E505683560CBA89C931934C76B4C499A5092C586EE014732761CEB7C9D67BF43472D89644D2250DAA0E82CD", 16).unwrap();
2946    let modulus = U4096::from_str_radix("7f496a3a7a60f42bbce68427c6cc2fcd36efca76f5abe016ac529e77b09b9bc3074f4310762c27afa4b4c6bbd98ae0eb94a1c741962763de8e4f97fff615276779e6b49aac97cea67ffa74718cff0ccf81f50f21d6c921e26bb9adda7ede74145fe894ea21fddb9bb3a73c857ea689ade8b700a51acf1958aa226cc55d7a23ceabcff95933558916a19e575fe00723ea435c625e697d9ecb31fa996abf370fd751c9158e58343f43ed7767ee9ebd0c305a03dac96a608d54e2da35e12d7e93ebf7fc1a2a8a8f99e1265d3def800efeb0f944634c4235e967666fd0717ebfad0eb36c92f496da1b28a24b2ff646eedfefbac17be37e2a25235066687dc578c0ee1a0790c4437f848078eefd7082f84fc343c1accf9cc24f5e8e0eb021f4dd25fd308c91a79c416639c63e8ad87d452a2d25b4d37356a8d8e70b82df6226fbda1fb7d5a6346d18a9ec79401d6bb3776fa2115eb1c6bc83213eef559f10d0cd21a6d159f3a8910fc13d3a2c031eb3394e7a7928df1d854122b0dc032cb3272adc131ed8bd6e82af43294db9b0640189ebf6da9922af531638f7f71282c240518559e3c839767d78b5b5031f1a88b13028a55587f15a047cd2f565bad97a9a50afab1699397dcc92f10bc0140d2a796686253eabf412ea85e70c0c1d47a22b803fcf94af4ad3dda0dca583ff830b57b2cf86e1c2c0dd15b2a26372f3e43a1300226d", 16).unwrap();
2947    let rsa = RSA_4096_u64::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2948    let message = [U4096::from_string("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap(),
2949                    U4096::from_string("2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap(),
2950                    U4096::from_string("3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333").unwrap()];
2951
2952    println!("RSA_4096_u64: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2953    println!("RSA_4096_u64: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2954    println!("RSA_4096_u64: Message = {}-{}-{}", message[0], message[1], message[2]);
2955
2956    let cipher = rsa.encrypt_array_biguint(&[message[0].into_biguint(), message[1].into_biguint(), message[2].into_biguint()]);
2957    println!("RSA_4096_u64: Cipher = {}-{}-{}", cipher[0], cipher[1], cipher[2]);
2958    assert_eq!(cipher[0].to_string(), "482480559007706139120435280808635896009433629588335984384927715221286241221693386397964558645023125644387584377108048840919363748179067815556343522612009226536244646018841314849644563703567121309251931243104536248830409306764441218940707735488174389293011516384299039172989527209791652903206065174607465242127258473463449897381586375165158262679436131223964565287682877733440561251733628268289938957295135308390468247660146474573679954253402229925356718786306318712335967935544719625339452930957199350386947670968898258607047286750312571697576971474019840700563054069610571790835804735603849906670776683787524123334029659362618326992712141061257613414324296166006594978236006676084553601587664366122587386278129925060768375788485986602763782980169513776316287742616158875810163725010461579433100067994550624723427286094489426319062692258967640187754398048428613760189298914444204926481463733838943736719093910153478487926462136253769740147515107152461575428182350390686729098858398529816214835849111530826241152472252076472917684397765104370104272368489696053079777801388987696516172596260735578907952952459711577927570207745725289641141609304276024163405203474353382102713816313135307667770197490398260668967746483598882575518327870");
2959    assert_eq!(cipher[1].to_string(), "380120271426728247273769594446426641238838574667066484492143825438199540746259333734898815839113476807946344674781852498015750187211946722686817140378127692602596973237535781766036917217014439840298935296104792388923935389140007930758417023287106240377236524088212457735840517977835282307935378303691528124337422295542861244981251202817035532847360174307949160666481423592218164303960867236056117050624200788667329124296084136158402380660016117503455576500836950136532659050275799351693675963408739507550453651080705341452109450531835286543627282055447987805443778346211402384761807314384195838018252816026053966001141868460018268757844053788682677555437718750833050059731042394824540328543797043564501760327576307307355931319658681398516269273687097684141437367423611622209771531132413287920345638854815045079343370332832839457765574775484259542386378149003148326014739675786806590309375655758321160305411682476757937244509127945920548992083112247444836804339957942255918239364228741912091347528452773593332640033742044746411180874088216225474181184840821497671566688088032569517704444379135001484669795569619902101545075816910203604438757433894421722427813437974178973513107314677953578676777016943686788116194436463496787358425447");
2960    assert_eq!(cipher[2].to_string(), "403708122166717805212812440921541454803287378381881151718566217059934543482388343843574347969379105455056108349254666875616590987975539200841837849153148937087547866812511369840092694040775151853507412463054629015063201331777319928369501610686490431829222617691381034382645478686717780175687315400539711928636188622663308476599958801157371748300079694552482160722166897070092451616412069071181575031872050871255427968090224828478189746473554664127514715116670586818360179040472853498418648045879823744470657856376457526201599706788452275951271097481060745828920788111970622502535466247898449235637174171943825913108633880035293325538963948968316813709719634673738870061012948875675340444118678854664035378384510021029569760389132667739424199676333150729497633898277251965456673950972150625131498563419556536557513225945879539695884910650410670631396971797107947173943230798002349278205019698905650667265388286337528525078132653138115630367203064184429904843606583697672829370055741098908264941689234822140860264804737667847796895993509920072611623938284873822582637972665248640500313543359063164177031112994089881032048285300304361927726006864552178984319375585107683011215008616994395932187400440737780861175121938401991141425571085");
2961
2962    let recovered = rsa.decrypt_array_biguint(&cipher);
2963    println!("RSA_4096_u64: Recovered = {}-{}-{}", recovered[0], recovered[1], recovered[2]);
2964    assert_eq!(recovered[0], message[0].into_biguint());
2965    assert_eq!(recovered[1], message[1].into_biguint());
2966    assert_eq!(recovered[2], message[2].into_biguint());
2967    
2968    // Example for RSA_1024_u32
2969    use cryptocol::asymmetric::RSA_1024_u32;
2970
2971    let public_key = U1024::from(5_u8);
2972    let private_key = U1024::from_str_radix("3D4990127949DDB062F2BE417E8EACAB79F3215C306217A0C5974FEE15D4CB6D9348A161523F49F83D1CD49CB261C98259F04FECED08E08F3F0C5EF1FE695A291782AA0B9500911299CDAE0297337E9CB219F71411133C4440184C349FAC497EE809ED6D1B472409AB88A99B843FD61DBBBBC4C9686871D5221D137F89AF64CD", 16).unwrap();
2973    let modulus = U1024::from_str_radix("9937e82e2f38aa38f75edba3bc64afacb0dfd36678f53b11edfa47d33693fc91f03593734d9e38ec98c81387bdf477c5e0d8c7d0509631661d9eed5cfc07616849dec988a75bd976cd83c7b6b38cb3573d776435a28b33f2dbbcebb09e693d911fff63ff88e4de8c730a5ee8023b1c6e18a1551e949ebca6b1fedeff1dec08a9", 16).unwrap();
2974    let rsa = RSA_1024_u32::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
2975    let message = [U1024::from_string("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap(),
2976                    U1024::from_string("2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap(),
2977                    U1024::from_string("3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333").unwrap()];
2978
2979    println!("RSA_1024_u32: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
2980    println!("RSA_1024_u32: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
2981    println!("RSA_1024_u32: Message = {}-{}-{}", message[0], message[1], message[2]);
2982
2983    let cipher = rsa.encrypt_array_biguint(&[message[0].into_biguint(), message[1].into_biguint(), message[2].into_biguint()]);
2984    println!("RSA_1024_u32: Cipher = {}-{}-{}", cipher[0], cipher[1], cipher[2]);
2985    assert_eq!(cipher[0].to_string(), "11498347717307207939984362127351227343891647828020606575311543799151890764127473045317534512340185778744636841280042786182569650057937658603208825508942688973104517576288781331746748391854265838779283687892786769606159370940757555192222397126885152499974714907155577213949301954426519701752245072900923522752");
2986    assert_eq!(cipher[1].to_string(), "45166296929219312241602148452388101165982942196797433986896281306258443882182670297688602803542744940710777118285870195236223805296014729404603886413057185221555925116647357044154437182045242075682782556942753834770554330814409546713579993834957473055501649369674260085089688894770909747300380931410305465861");
2987    assert_eq!(cipher[2].to_string(), "104258245100557014100388000089255129244422186376824260941762474305558950933838723741556706570805144408966737408754572353981049992762264824762423516397166237816159126666560150516613931243159392446246807361060328409075514311188817416397236549955030332963112158611270173312280594534996614952700041036430688843711");
2988
2989    let recovered = rsa.decrypt_array_biguint(&cipher);
2990    println!("RSA_1024_u32: Recovered = {}-{}-{}", recovered[0], recovered[1], recovered[2]);
2991    assert_eq!(recovered[0], message[0].into_biguint());
2992    assert_eq!(recovered[1], message[1].into_biguint());
2993    assert_eq!(recovered[2], message[2].into_biguint());
2994
2995    // Example for RSA_2048_u32
2996    use cryptocol::asymmetric::RSA_2048_u32;
2997
2998    let public_key = U2048::from(7_u8);
2999    let private_key = U2048::from_str_radix("4935A7A0CA0F94101C34BC4A3180F18FE756C4CAFAFDED502AF6B7EC89E42D89C0163CFD43CC58F90F9CEA3045B565957732102340ACF51695E3F635FBD3AAEE83F71EB37103D234B108380932372E677200AD37074BBCEEC60FBEE4AB73C8F7030F712C8A70B43A05BD10700A0C50579CE8A8AEEF96D1D8BF7EDA7CF946F64A04F4C739591D41E2D0CD9E65FA6CED2AAEAE2BB3E9CE38BD0BA06DFF1847965DBE264447EE0C1AE7452638014AA2959B1FEAE409987C65321651C896732A62F0581F87A94DC41D85C3936C369A803DB0D6BD99B346C01A74295C24260E0055BFA97013967F9D6A868E57A67EBF17A6C9D7D5FB50BEFA4A4AD93BC558B8A78297", 16).unwrap();
3000    let modulus = U2048::from_str_radix("aad28721d779aed041d06202738233a51bca75d99efb29bb0eea57d297146a416ade8e4ef3877a45246e2270a2a7425cc0ca25a796e8e68a08693e7df6433981de95f24d5d08ea7af26882c01fd616f15f56e980665b638278cf6815900e2a405c795d67edb1a48762b9265ac21cbb7718c989982f0a944f1427fdce45a59403b080b68d260dafd1fb64b374aaac80bd1f595bd0ff175ca6108fdd2f83905774f66828ba84fab66412430666d46d1b94bb0da1c9d9c9062497677ea5b6b751f1e51651d86b6d377c3b44767134496a8fe2d7157e5f17281ad156d1a05eea359bc847d2d835474e1d4dc517902ffcfb036f7444bf296ad86ab0795f058a6a7a4f", 16).unwrap();
3001    let rsa = RSA_2048_u32::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3002    let message = [U2048::from_string("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap(),
3003                    U2048::from_string("22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap(),
3004                    U2048::from_string("33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333").unwrap()];
3005
3006    println!("RSA_2048_u32: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3007    println!("RSA_2048_u32: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3008    println!("RSA_2048_u32: Message = {}-{}-{}", message[0], message[1], message[2]);
3009
3010    let cipher = rsa.encrypt_array_biguint(&[message[0].into_biguint(), message[1].into_biguint(), message[2].into_biguint()]);
3011    println!("RSA_2048_u32: Cipher = {}-{}-{}", cipher[0], cipher[1], cipher[2]);
3012    assert_eq!(cipher[0].to_string(), "19222624061359673250846359059739843853420634451448389991163689366334342051370657105636882731845894634918805671425622270152257383139670767434742531576389209205471554857350405398176392673609145359240099506218157452818844010262047559375358378002428435697834074559358972665165014579261334313265387506189805058027311828755496605900175422002860565918262405898991726046385746431718588466318613122627318460097165106135557737414837339967603607946756100252603428997909207374469669014045491975776570237713303509787189577741351064528943707348455591901381015422856571578745503309804988710845868795458723379943018626701026619580904");
3013    assert_eq!(cipher[1].to_string(), "2162601705197266388430407067468432039384013235712826322894856463766187033358723916690576103616208021235118086892704527157675665923187607693853175631923961500069870836826565615537684511580445390403335706835152446778962609842260014842938385695677464053437897083002342473290905366555201087408506088286024071657223370958139726526658613908350434381933078613256245009076381433448776545677230225375345485184663906559997314931625379179728845765913371880777924776671070365050266168791435461962831816750003484563263566103101048540393850384009497837363571269795809614594215419935841678869610883053048459763096376368303543057618");
3014    assert_eq!(cipher[2].to_string(), "11005496648948092196671263853474018345023369218256547760376027065480788176360278240016253379330891750962711210125748191463703823515643414126048153016279497771873322920552753976875286327495435794501104988281718167000843412300082848991944943057029810023543981865177927105338265914121416097511479737861674883541423933061998681507286171218723416306799646568348207996021600555324586523788204283964397436578478311759288379296955383037548813806708090848554801088192089524689822235188613606104977142437789920233100836515577891822546346199757457300078280962387025576467704769692869917952700145348667083921490956402329000033669");
3015
3016    let recovered = rsa.decrypt_array_biguint(&cipher);
3017    println!("RSA_2048_u32: Recovered = {}-{}-{}", recovered[0], recovered[1], recovered[2]);
3018    assert_eq!(recovered[0], message[0].into_biguint());
3019    assert_eq!(recovered[1], message[1].into_biguint());
3020    assert_eq!(recovered[2], message[2].into_biguint());
3021
3022    // Example for RSA_4096_u32
3023    use cryptocol::asymmetric::RSA_4096_u32;
3024
3025    let public_key = U4096::from(5_u8);
3026    let private_key = U4096::from_str_radix("65D454FB951A5CEFCA5203530570263DC58CA1F8C489801223754B92F3AFAFCF390C35A6C4F01FBFB6F70563146F1A5610816C34781F831871D946665E7752B92E522A1556DFD885332EC38E0A65A3D934C40C1B123A8181EFC7BE48657EC3437FED43EE8197E2E2F61F639DFEEBA157ED5F33B748A5ADE0881B8A377DFB4FD889732DE0F5DE07454E1845E64CD28321CF7D1B7EBACAE56F5B2EE12232927312A7D4113EACF69903245F86587EFDA359E19CAF07884D3DDD82482B1A8ACBA989933014EED53FAE4DB84A97F2CCD8CBC0C769E909CE918785EB8CA6C13232F0D88F8A0F2A124815BA1B6F5991D258B3262F012FE931BB50E90D1EB9FE3793CD8A18182768BCC1926552BDA2F452FFE5A25DADBF36F83D01FB072B463841A939F0EFAFD7E6564E7F71705CDCFB1281AF424D4EB6282F1F33ADD58DD862B3DE496D6F379BAD1E068893C3A2FFC75DDB1DC18042569AFA0F9DE44A582534BE73DA29D40E624A82A19F6D48609609600FF34BCA8E4D69F18101A3F0BAE655D5F389D568BB91E54465E5AA0FB52CA6E372A21BCDEB45EA16FC36FEFDBC9FF3F295B53C25458C75EE869755A4E4557BD639DE5D80AA9FDE709A53F4D6D135FD8611D0EED5CBB9430C13292C74DF5380BCDE17A4C3BF0E692E505683560CBA89C931934C76B4C499A5092C586EE014732761CEB7C9D67BF43472D89644D2250DAA0E82CD", 16).unwrap();
3027    let modulus = U4096::from_str_radix("7f496a3a7a60f42bbce68427c6cc2fcd36efca76f5abe016ac529e77b09b9bc3074f4310762c27afa4b4c6bbd98ae0eb94a1c741962763de8e4f97fff615276779e6b49aac97cea67ffa74718cff0ccf81f50f21d6c921e26bb9adda7ede74145fe894ea21fddb9bb3a73c857ea689ade8b700a51acf1958aa226cc55d7a23ceabcff95933558916a19e575fe00723ea435c625e697d9ecb31fa996abf370fd751c9158e58343f43ed7767ee9ebd0c305a03dac96a608d54e2da35e12d7e93ebf7fc1a2a8a8f99e1265d3def800efeb0f944634c4235e967666fd0717ebfad0eb36c92f496da1b28a24b2ff646eedfefbac17be37e2a25235066687dc578c0ee1a0790c4437f848078eefd7082f84fc343c1accf9cc24f5e8e0eb021f4dd25fd308c91a79c416639c63e8ad87d452a2d25b4d37356a8d8e70b82df6226fbda1fb7d5a6346d18a9ec79401d6bb3776fa2115eb1c6bc83213eef559f10d0cd21a6d159f3a8910fc13d3a2c031eb3394e7a7928df1d854122b0dc032cb3272adc131ed8bd6e82af43294db9b0640189ebf6da9922af531638f7f71282c240518559e3c839767d78b5b5031f1a88b13028a55587f15a047cd2f565bad97a9a50afab1699397dcc92f10bc0140d2a796686253eabf412ea85e70c0c1d47a22b803fcf94af4ad3dda0dca583ff830b57b2cf86e1c2c0dd15b2a26372f3e43a1300226d", 16).unwrap();
3028    let rsa = RSA_4096_u32::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3029    let message = [U4096::from_string("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap(),
3030                    U4096::from_string("2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap(),
3031                    U4096::from_string("3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333").unwrap()];
3032
3033    println!("RSA_4096_u32: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3034    println!("RSA_4096_u32: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3035    println!("RSA_4096_u32: Message = {}-{}-{}", message[0], message[1], message[2]);
3036
3037    let cipher = rsa.encrypt_array_biguint(&[message[0].into_biguint(), message[1].into_biguint(), message[2].into_biguint()]);
3038    println!("RSA_4096_u32: Cipher = {}-{}-{}", cipher[0], cipher[1], cipher[2]);
3039    assert_eq!(cipher[0].to_string(), "482480559007706139120435280808635896009433629588335984384927715221286241221693386397964558645023125644387584377108048840919363748179067815556343522612009226536244646018841314849644563703567121309251931243104536248830409306764441218940707735488174389293011516384299039172989527209791652903206065174607465242127258473463449897381586375165158262679436131223964565287682877733440561251733628268289938957295135308390468247660146474573679954253402229925356718786306318712335967935544719625339452930957199350386947670968898258607047286750312571697576971474019840700563054069610571790835804735603849906670776683787524123334029659362618326992712141061257613414324296166006594978236006676084553601587664366122587386278129925060768375788485986602763782980169513776316287742616158875810163725010461579433100067994550624723427286094489426319062692258967640187754398048428613760189298914444204926481463733838943736719093910153478487926462136253769740147515107152461575428182350390686729098858398529816214835849111530826241152472252076472917684397765104370104272368489696053079777801388987696516172596260735578907952952459711577927570207745725289641141609304276024163405203474353382102713816313135307667770197490398260668967746483598882575518327870");
3040    assert_eq!(cipher[1].to_string(), "380120271426728247273769594446426641238838574667066484492143825438199540746259333734898815839113476807946344674781852498015750187211946722686817140378127692602596973237535781766036917217014439840298935296104792388923935389140007930758417023287106240377236524088212457735840517977835282307935378303691528124337422295542861244981251202817035532847360174307949160666481423592218164303960867236056117050624200788667329124296084136158402380660016117503455576500836950136532659050275799351693675963408739507550453651080705341452109450531835286543627282055447987805443778346211402384761807314384195838018252816026053966001141868460018268757844053788682677555437718750833050059731042394824540328543797043564501760327576307307355931319658681398516269273687097684141437367423611622209771531132413287920345638854815045079343370332832839457765574775484259542386378149003148326014739675786806590309375655758321160305411682476757937244509127945920548992083112247444836804339957942255918239364228741912091347528452773593332640033742044746411180874088216225474181184840821497671566688088032569517704444379135001484669795569619902101545075816910203604438757433894421722427813437974178973513107314677953578676777016943686788116194436463496787358425447");
3041    assert_eq!(cipher[2].to_string(), "403708122166717805212812440921541454803287378381881151718566217059934543482388343843574347969379105455056108349254666875616590987975539200841837849153148937087547866812511369840092694040775151853507412463054629015063201331777319928369501610686490431829222617691381034382645478686717780175687315400539711928636188622663308476599958801157371748300079694552482160722166897070092451616412069071181575031872050871255427968090224828478189746473554664127514715116670586818360179040472853498418648045879823744470657856376457526201599706788452275951271097481060745828920788111970622502535466247898449235637174171943825913108633880035293325538963948968316813709719634673738870061012948875675340444118678854664035378384510021029569760389132667739424199676333150729497633898277251965456673950972150625131498563419556536557513225945879539695884910650410670631396971797107947173943230798002349278205019698905650667265388286337528525078132653138115630367203064184429904843606583697672829370055741098908264941689234822140860264804737667847796895993509920072611623938284873822582637972665248640500313543359063164177031112994089881032048285300304361927726006864552178984319375585107683011215008616994395932187400440737780861175121938401991141425571085");
3042
3043    let recovered = rsa.decrypt_array_biguint(&cipher);
3044    println!("RSA_4096_u32: Recovered = {}-{}-{}", recovered[0], recovered[1], recovered[2]);
3045    assert_eq!(recovered[0], message[0].into_biguint());
3046    assert_eq!(recovered[1], message[1].into_biguint());
3047    assert_eq!(recovered[2], message[2].into_biguint());
3048    
3049    // Example for RSA_1024_u16
3050    use cryptocol::asymmetric::RSA_1024_u16;
3051
3052    let public_key = U1024::from(5_u8);
3053    let private_key = U1024::from_str_radix("3D4990127949DDB062F2BE417E8EACAB79F3215C306217A0C5974FEE15D4CB6D9348A161523F49F83D1CD49CB261C98259F04FECED08E08F3F0C5EF1FE695A291782AA0B9500911299CDAE0297337E9CB219F71411133C4440184C349FAC497EE809ED6D1B472409AB88A99B843FD61DBBBBC4C9686871D5221D137F89AF64CD", 16).unwrap();
3054    let modulus = U1024::from_str_radix("9937e82e2f38aa38f75edba3bc64afacb0dfd36678f53b11edfa47d33693fc91f03593734d9e38ec98c81387bdf477c5e0d8c7d0509631661d9eed5cfc07616849dec988a75bd976cd83c7b6b38cb3573d776435a28b33f2dbbcebb09e693d911fff63ff88e4de8c730a5ee8023b1c6e18a1551e949ebca6b1fedeff1dec08a9", 16).unwrap();
3055    let rsa = RSA_1024_u16::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3056    let message = [U1024::from_string("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap(),
3057                    U1024::from_string("2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap(),
3058                    U1024::from_string("3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333").unwrap()];
3059
3060    println!("RSA_1024_u16: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3061    println!("RSA_1024_u16: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3062    println!("RSA_1024_u16: Message = {}-{}-{}", message[0], message[1], message[2]);
3063
3064    let cipher = rsa.encrypt_array_biguint(&[message[0].into_biguint(), message[1].into_biguint(), message[2].into_biguint()]);
3065    println!("RSA_1024_u16: Cipher = {}-{}-{}", cipher[0], cipher[1], cipher[2]);
3066    assert_eq!(cipher[0].to_string(), "11498347717307207939984362127351227343891647828020606575311543799151890764127473045317534512340185778744636841280042786182569650057937658603208825508942688973104517576288781331746748391854265838779283687892786769606159370940757555192222397126885152499974714907155577213949301954426519701752245072900923522752");
3067    assert_eq!(cipher[1].to_string(), "45166296929219312241602148452388101165982942196797433986896281306258443882182670297688602803542744940710777118285870195236223805296014729404603886413057185221555925116647357044154437182045242075682782556942753834770554330814409546713579993834957473055501649369674260085089688894770909747300380931410305465861");
3068    assert_eq!(cipher[2].to_string(), "104258245100557014100388000089255129244422186376824260941762474305558950933838723741556706570805144408966737408754572353981049992762264824762423516397166237816159126666560150516613931243159392446246807361060328409075514311188817416397236549955030332963112158611270173312280594534996614952700041036430688843711");
3069
3070    let recovered = rsa.decrypt_array_biguint(&cipher);
3071    println!("RSA_1024_u16: Recovered = {}-{}-{}", recovered[0], recovered[1], recovered[2]);
3072    assert_eq!(recovered[0], message[0].into_biguint());
3073    assert_eq!(recovered[1], message[1].into_biguint());
3074    assert_eq!(recovered[2], message[2].into_biguint());
3075
3076    // Example for RSA_2048_u16
3077    use cryptocol::asymmetric::RSA_2048_u16;
3078
3079    let public_key = U2048::from(7_u8);
3080    let private_key = U2048::from_str_radix("4935A7A0CA0F94101C34BC4A3180F18FE756C4CAFAFDED502AF6B7EC89E42D89C0163CFD43CC58F90F9CEA3045B565957732102340ACF51695E3F635FBD3AAEE83F71EB37103D234B108380932372E677200AD37074BBCEEC60FBEE4AB73C8F7030F712C8A70B43A05BD10700A0C50579CE8A8AEEF96D1D8BF7EDA7CF946F64A04F4C739591D41E2D0CD9E65FA6CED2AAEAE2BB3E9CE38BD0BA06DFF1847965DBE264447EE0C1AE7452638014AA2959B1FEAE409987C65321651C896732A62F0581F87A94DC41D85C3936C369A803DB0D6BD99B346C01A74295C24260E0055BFA97013967F9D6A868E57A67EBF17A6C9D7D5FB50BEFA4A4AD93BC558B8A78297", 16).unwrap();
3081    let modulus = U2048::from_str_radix("aad28721d779aed041d06202738233a51bca75d99efb29bb0eea57d297146a416ade8e4ef3877a45246e2270a2a7425cc0ca25a796e8e68a08693e7df6433981de95f24d5d08ea7af26882c01fd616f15f56e980665b638278cf6815900e2a405c795d67edb1a48762b9265ac21cbb7718c989982f0a944f1427fdce45a59403b080b68d260dafd1fb64b374aaac80bd1f595bd0ff175ca6108fdd2f83905774f66828ba84fab66412430666d46d1b94bb0da1c9d9c9062497677ea5b6b751f1e51651d86b6d377c3b44767134496a8fe2d7157e5f17281ad156d1a05eea359bc847d2d835474e1d4dc517902ffcfb036f7444bf296ad86ab0795f058a6a7a4f", 16).unwrap();
3082    let rsa = RSA_2048_u16::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3083    let message = [U2048::from_string("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap(),
3084                    U2048::from_string("22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap(),
3085                    U2048::from_string("33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333").unwrap()];
3086
3087    println!("RSA_2048_u16: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3088    println!("RSA_2048_u16: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3089    println!("RSA_2048_u16: Message = {}-{}-{}", message[0], message[1], message[2]);
3090
3091    let cipher = rsa.encrypt_array_biguint(&[message[0].into_biguint(), message[1].into_biguint(), message[2].into_biguint()]);
3092    println!("RSA_2048_u16: Cipher = {}-{}-{}", cipher[0], cipher[1], cipher[2]);
3093    assert_eq!(cipher[0].to_string(), "19222624061359673250846359059739843853420634451448389991163689366334342051370657105636882731845894634918805671425622270152257383139670767434742531576389209205471554857350405398176392673609145359240099506218157452818844010262047559375358378002428435697834074559358972665165014579261334313265387506189805058027311828755496605900175422002860565918262405898991726046385746431718588466318613122627318460097165106135557737414837339967603607946756100252603428997909207374469669014045491975776570237713303509787189577741351064528943707348455591901381015422856571578745503309804988710845868795458723379943018626701026619580904");
3094    assert_eq!(cipher[1].to_string(), "2162601705197266388430407067468432039384013235712826322894856463766187033358723916690576103616208021235118086892704527157675665923187607693853175631923961500069870836826565615537684511580445390403335706835152446778962609842260014842938385695677464053437897083002342473290905366555201087408506088286024071657223370958139726526658613908350434381933078613256245009076381433448776545677230225375345485184663906559997314931625379179728845765913371880777924776671070365050266168791435461962831816750003484563263566103101048540393850384009497837363571269795809614594215419935841678869610883053048459763096376368303543057618");
3095    assert_eq!(cipher[2].to_string(), "11005496648948092196671263853474018345023369218256547760376027065480788176360278240016253379330891750962711210125748191463703823515643414126048153016279497771873322920552753976875286327495435794501104988281718167000843412300082848991944943057029810023543981865177927105338265914121416097511479737861674883541423933061998681507286171218723416306799646568348207996021600555324586523788204283964397436578478311759288379296955383037548813806708090848554801088192089524689822235188613606104977142437789920233100836515577891822546346199757457300078280962387025576467704769692869917952700145348667083921490956402329000033669");
3096
3097    let recovered = rsa.decrypt_array_biguint(&cipher);
3098    println!("RSA_2048_u16: Recovered = {}-{}-{}", recovered[0], recovered[1], recovered[2]);
3099    assert_eq!(recovered[0], message[0].into_biguint());
3100    assert_eq!(recovered[1], message[1].into_biguint());
3101    assert_eq!(recovered[2], message[2].into_biguint());
3102
3103    // Example for RSA_4096_u16
3104    use cryptocol::asymmetric::RSA_4096_u16;
3105
3106    let public_key = U4096::from(5_u8);
3107    let private_key = U4096::from_str_radix("65D454FB951A5CEFCA5203530570263DC58CA1F8C489801223754B92F3AFAFCF390C35A6C4F01FBFB6F70563146F1A5610816C34781F831871D946665E7752B92E522A1556DFD885332EC38E0A65A3D934C40C1B123A8181EFC7BE48657EC3437FED43EE8197E2E2F61F639DFEEBA157ED5F33B748A5ADE0881B8A377DFB4FD889732DE0F5DE07454E1845E64CD28321CF7D1B7EBACAE56F5B2EE12232927312A7D4113EACF69903245F86587EFDA359E19CAF07884D3DDD82482B1A8ACBA989933014EED53FAE4DB84A97F2CCD8CBC0C769E909CE918785EB8CA6C13232F0D88F8A0F2A124815BA1B6F5991D258B3262F012FE931BB50E90D1EB9FE3793CD8A18182768BCC1926552BDA2F452FFE5A25DADBF36F83D01FB072B463841A939F0EFAFD7E6564E7F71705CDCFB1281AF424D4EB6282F1F33ADD58DD862B3DE496D6F379BAD1E068893C3A2FFC75DDB1DC18042569AFA0F9DE44A582534BE73DA29D40E624A82A19F6D48609609600FF34BCA8E4D69F18101A3F0BAE655D5F389D568BB91E54465E5AA0FB52CA6E372A21BCDEB45EA16FC36FEFDBC9FF3F295B53C25458C75EE869755A4E4557BD639DE5D80AA9FDE709A53F4D6D135FD8611D0EED5CBB9430C13292C74DF5380BCDE17A4C3BF0E692E505683560CBA89C931934C76B4C499A5092C586EE014732761CEB7C9D67BF43472D89644D2250DAA0E82CD", 16).unwrap();
3108    let modulus = U4096::from_str_radix("7f496a3a7a60f42bbce68427c6cc2fcd36efca76f5abe016ac529e77b09b9bc3074f4310762c27afa4b4c6bbd98ae0eb94a1c741962763de8e4f97fff615276779e6b49aac97cea67ffa74718cff0ccf81f50f21d6c921e26bb9adda7ede74145fe894ea21fddb9bb3a73c857ea689ade8b700a51acf1958aa226cc55d7a23ceabcff95933558916a19e575fe00723ea435c625e697d9ecb31fa996abf370fd751c9158e58343f43ed7767ee9ebd0c305a03dac96a608d54e2da35e12d7e93ebf7fc1a2a8a8f99e1265d3def800efeb0f944634c4235e967666fd0717ebfad0eb36c92f496da1b28a24b2ff646eedfefbac17be37e2a25235066687dc578c0ee1a0790c4437f848078eefd7082f84fc343c1accf9cc24f5e8e0eb021f4dd25fd308c91a79c416639c63e8ad87d452a2d25b4d37356a8d8e70b82df6226fbda1fb7d5a6346d18a9ec79401d6bb3776fa2115eb1c6bc83213eef559f10d0cd21a6d159f3a8910fc13d3a2c031eb3394e7a7928df1d854122b0dc032cb3272adc131ed8bd6e82af43294db9b0640189ebf6da9922af531638f7f71282c240518559e3c839767d78b5b5031f1a88b13028a55587f15a047cd2f565bad97a9a50afab1699397dcc92f10bc0140d2a796686253eabf412ea85e70c0c1d47a22b803fcf94af4ad3dda0dca583ff830b57b2cf86e1c2c0dd15b2a26372f3e43a1300226d", 16).unwrap();
3109    let rsa = RSA_4096_u16::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3110    let message = [U4096::from_string("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap(),
3111                    U4096::from_string("2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap(),
3112                    U4096::from_string("3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333").unwrap()];
3113
3114    println!("RSA_4096_u16: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3115    println!("RSA_4096_u16: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3116    println!("RSA_4096_u16: Message = {}-{}-{}", message[0], message[1], message[2]);
3117
3118    let cipher = rsa.encrypt_array_biguint(&[message[0].into_biguint(), message[1].into_biguint(), message[2].into_biguint()]);
3119    println!("RSA_4096_u16: Cipher = {}-{}-{}", cipher[0], cipher[1], cipher[2]);
3120    assert_eq!(cipher[0].to_string(), "482480559007706139120435280808635896009433629588335984384927715221286241221693386397964558645023125644387584377108048840919363748179067815556343522612009226536244646018841314849644563703567121309251931243104536248830409306764441218940707735488174389293011516384299039172989527209791652903206065174607465242127258473463449897381586375165158262679436131223964565287682877733440561251733628268289938957295135308390468247660146474573679954253402229925356718786306318712335967935544719625339452930957199350386947670968898258607047286750312571697576971474019840700563054069610571790835804735603849906670776683787524123334029659362618326992712141061257613414324296166006594978236006676084553601587664366122587386278129925060768375788485986602763782980169513776316287742616158875810163725010461579433100067994550624723427286094489426319062692258967640187754398048428613760189298914444204926481463733838943736719093910153478487926462136253769740147515107152461575428182350390686729098858398529816214835849111530826241152472252076472917684397765104370104272368489696053079777801388987696516172596260735578907952952459711577927570207745725289641141609304276024163405203474353382102713816313135307667770197490398260668967746483598882575518327870");
3121    assert_eq!(cipher[1].to_string(), "380120271426728247273769594446426641238838574667066484492143825438199540746259333734898815839113476807946344674781852498015750187211946722686817140378127692602596973237535781766036917217014439840298935296104792388923935389140007930758417023287106240377236524088212457735840517977835282307935378303691528124337422295542861244981251202817035532847360174307949160666481423592218164303960867236056117050624200788667329124296084136158402380660016117503455576500836950136532659050275799351693675963408739507550453651080705341452109450531835286543627282055447987805443778346211402384761807314384195838018252816026053966001141868460018268757844053788682677555437718750833050059731042394824540328543797043564501760327576307307355931319658681398516269273687097684141437367423611622209771531132413287920345638854815045079343370332832839457765574775484259542386378149003148326014739675786806590309375655758321160305411682476757937244509127945920548992083112247444836804339957942255918239364228741912091347528452773593332640033742044746411180874088216225474181184840821497671566688088032569517704444379135001484669795569619902101545075816910203604438757433894421722427813437974178973513107314677953578676777016943686788116194436463496787358425447");
3122    assert_eq!(cipher[2].to_string(), "403708122166717805212812440921541454803287378381881151718566217059934543482388343843574347969379105455056108349254666875616590987975539200841837849153148937087547866812511369840092694040775151853507412463054629015063201331777319928369501610686490431829222617691381034382645478686717780175687315400539711928636188622663308476599958801157371748300079694552482160722166897070092451616412069071181575031872050871255427968090224828478189746473554664127514715116670586818360179040472853498418648045879823744470657856376457526201599706788452275951271097481060745828920788111970622502535466247898449235637174171943825913108633880035293325538963948968316813709719634673738870061012948875675340444118678854664035378384510021029569760389132667739424199676333150729497633898277251965456673950972150625131498563419556536557513225945879539695884910650410670631396971797107947173943230798002349278205019698905650667265388286337528525078132653138115630367203064184429904843606583697672829370055741098908264941689234822140860264804737667847796895993509920072611623938284873822582637972665248640500313543359063164177031112994089881032048285300304361927726006864552178984319375585107683011215008616994395932187400440737780861175121938401991141425571085");
3123
3124    let recovered = rsa.decrypt_array_biguint(&cipher);
3125    println!("RSA_4096_u16: Recovered = {}-{}-{}", recovered[0], recovered[1], recovered[2]);
3126    assert_eq!(recovered[0], message[0].into_biguint());
3127    assert_eq!(recovered[1], message[1].into_biguint());
3128    assert_eq!(recovered[2], message[2].into_biguint());
3129    
3130    // Example for RSA_1024_u8
3131    use cryptocol::asymmetric::RSA_1024_u8;
3132
3133    let public_key = U1024::from(5_u8);
3134    let private_key = U1024::from_str_radix("3D4990127949DDB062F2BE417E8EACAB79F3215C306217A0C5974FEE15D4CB6D9348A161523F49F83D1CD49CB261C98259F04FECED08E08F3F0C5EF1FE695A291782AA0B9500911299CDAE0297337E9CB219F71411133C4440184C349FAC497EE809ED6D1B472409AB88A99B843FD61DBBBBC4C9686871D5221D137F89AF64CD", 16).unwrap();
3135    let modulus = U1024::from_str_radix("9937e82e2f38aa38f75edba3bc64afacb0dfd36678f53b11edfa47d33693fc91f03593734d9e38ec98c81387bdf477c5e0d8c7d0509631661d9eed5cfc07616849dec988a75bd976cd83c7b6b38cb3573d776435a28b33f2dbbcebb09e693d911fff63ff88e4de8c730a5ee8023b1c6e18a1551e949ebca6b1fedeff1dec08a9", 16).unwrap();
3136    let rsa = RSA_1024_u8::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3137    let message = [U1024::from_string("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap(),
3138                    U1024::from_string("2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap(),
3139                    U1024::from_string("3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333").unwrap()];
3140
3141    println!("RSA_1024_u8: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3142    println!("RSA_1024_u8: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3143    println!("RSA_1024_u8: Message = {}-{}-{}", message[0], message[1], message[2]);
3144
3145    let cipher = rsa.encrypt_array_biguint(&[message[0].clone(), message[1].clone(), message[2].clone()]);
3146    println!("RSA_1024_u8: Cipher = {}-{}-{}", cipher[0], cipher[1], cipher[2]);
3147    assert_eq!(cipher[0].to_string(), "11498347717307207939984362127351227343891647828020606575311543799151890764127473045317534512340185778744636841280042786182569650057937658603208825508942688973104517576288781331746748391854265838779283687892786769606159370940757555192222397126885152499974714907155577213949301954426519701752245072900923522752");
3148    assert_eq!(cipher[1].to_string(), "45166296929219312241602148452388101165982942196797433986896281306258443882182670297688602803542744940710777118285870195236223805296014729404603886413057185221555925116647357044154437182045242075682782556942753834770554330814409546713579993834957473055501649369674260085089688894770909747300380931410305465861");
3149    assert_eq!(cipher[2].to_string(), "104258245100557014100388000089255129244422186376824260941762474305558950933838723741556706570805144408966737408754572353981049992762264824762423516397166237816159126666560150516613931243159392446246807361060328409075514311188817416397236549955030332963112158611270173312280594534996614952700041036430688843711");
3150
3151    let recovered = rsa.decrypt_array_biguint(&cipher);
3152    println!("RSA_1024_u8: Recovered = {}-{}-{}", recovered[0], recovered[1], recovered[2]);
3153    assert_eq!(recovered[0], message[0].into_biguint());
3154    assert_eq!(recovered[1], message[1].into_biguint());
3155    assert_eq!(recovered[2], message[2].into_biguint());
3156
3157    // Example for RSA_2048_u8
3158    use cryptocol::asymmetric::RSA_2048_u8;
3159
3160    let public_key = U2048::from(7_u8);
3161    let private_key = U2048::from_str_radix("4935A7A0CA0F94101C34BC4A3180F18FE756C4CAFAFDED502AF6B7EC89E42D89C0163CFD43CC58F90F9CEA3045B565957732102340ACF51695E3F635FBD3AAEE83F71EB37103D234B108380932372E677200AD37074BBCEEC60FBEE4AB73C8F7030F712C8A70B43A05BD10700A0C50579CE8A8AEEF96D1D8BF7EDA7CF946F64A04F4C739591D41E2D0CD9E65FA6CED2AAEAE2BB3E9CE38BD0BA06DFF1847965DBE264447EE0C1AE7452638014AA2959B1FEAE409987C65321651C896732A62F0581F87A94DC41D85C3936C369A803DB0D6BD99B346C01A74295C24260E0055BFA97013967F9D6A868E57A67EBF17A6C9D7D5FB50BEFA4A4AD93BC558B8A78297", 16).unwrap();
3162    let modulus = U2048::from_str_radix("aad28721d779aed041d06202738233a51bca75d99efb29bb0eea57d297146a416ade8e4ef3877a45246e2270a2a7425cc0ca25a796e8e68a08693e7df6433981de95f24d5d08ea7af26882c01fd616f15f56e980665b638278cf6815900e2a405c795d67edb1a48762b9265ac21cbb7718c989982f0a944f1427fdce45a59403b080b68d260dafd1fb64b374aaac80bd1f595bd0ff175ca6108fdd2f83905774f66828ba84fab66412430666d46d1b94bb0da1c9d9c9062497677ea5b6b751f1e51651d86b6d377c3b44767134496a8fe2d7157e5f17281ad156d1a05eea359bc847d2d835474e1d4dc517902ffcfb036f7444bf296ad86ab0795f058a6a7a4f", 16).unwrap();
3163    let rsa = RSA_2048_u8::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3164    let message = [U2048::from_string("11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap(),
3165                    U2048::from_string("22222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap(),
3166                    U2048::from_string("33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333").unwrap()];
3167
3168    println!("RSA_2048_u8: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3169    println!("RSA_2048_u8: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3170    println!("RSA_2048_u8: Message = {}-{}-{}", message[0], message[1], message[2]);
3171
3172    let cipher = rsa.encrypt_array_biguint(&[message[0].clone(), message[1].clone(), message[2].clone()]);
3173    println!("RSA_2048_u8: Cipher = {}-{}-{}", cipher[0], cipher[1], cipher[2]);
3174    assert_eq!(cipher[0].to_string(), "19222624061359673250846359059739843853420634451448389991163689366334342051370657105636882731845894634918805671425622270152257383139670767434742531576389209205471554857350405398176392673609145359240099506218157452818844010262047559375358378002428435697834074559358972665165014579261334313265387506189805058027311828755496605900175422002860565918262405898991726046385746431718588466318613122627318460097165106135557737414837339967603607946756100252603428997909207374469669014045491975776570237713303509787189577741351064528943707348455591901381015422856571578745503309804988710845868795458723379943018626701026619580904");
3175    assert_eq!(cipher[1].to_string(), "2162601705197266388430407067468432039384013235712826322894856463766187033358723916690576103616208021235118086892704527157675665923187607693853175631923961500069870836826565615537684511580445390403335706835152446778962609842260014842938385695677464053437897083002342473290905366555201087408506088286024071657223370958139726526658613908350434381933078613256245009076381433448776545677230225375345485184663906559997314931625379179728845765913371880777924776671070365050266168791435461962831816750003484563263566103101048540393850384009497837363571269795809614594215419935841678869610883053048459763096376368303543057618");
3176    assert_eq!(cipher[2].to_string(), "11005496648948092196671263853474018345023369218256547760376027065480788176360278240016253379330891750962711210125748191463703823515643414126048153016279497771873322920552753976875286327495435794501104988281718167000843412300082848991944943057029810023543981865177927105338265914121416097511479737861674883541423933061998681507286171218723416306799646568348207996021600555324586523788204283964397436578478311759288379296955383037548813806708090848554801088192089524689822235188613606104977142437789920233100836515577891822546346199757457300078280962387025576467704769692869917952700145348667083921490956402329000033669");
3177
3178    let recovered = rsa.decrypt_array_biguint(&cipher);
3179    println!("RSA_2048_u8: Recovered = {}-{}-{}", recovered[0], recovered[1], recovered[2]);
3180    assert_eq!(recovered[0], message[0].into_biguint());
3181    assert_eq!(recovered[1], message[1].into_biguint());
3182    assert_eq!(recovered[2], message[2].into_biguint());
3183
3184    // Example for RSA_4096_u8
3185    use cryptocol::asymmetric::RSA_4096_u8;
3186
3187    let public_key = U4096::from(5_u8);
3188    let private_key = U4096::from_str_radix("65D454FB951A5CEFCA5203530570263DC58CA1F8C489801223754B92F3AFAFCF390C35A6C4F01FBFB6F70563146F1A5610816C34781F831871D946665E7752B92E522A1556DFD885332EC38E0A65A3D934C40C1B123A8181EFC7BE48657EC3437FED43EE8197E2E2F61F639DFEEBA157ED5F33B748A5ADE0881B8A377DFB4FD889732DE0F5DE07454E1845E64CD28321CF7D1B7EBACAE56F5B2EE12232927312A7D4113EACF69903245F86587EFDA359E19CAF07884D3DDD82482B1A8ACBA989933014EED53FAE4DB84A97F2CCD8CBC0C769E909CE918785EB8CA6C13232F0D88F8A0F2A124815BA1B6F5991D258B3262F012FE931BB50E90D1EB9FE3793CD8A18182768BCC1926552BDA2F452FFE5A25DADBF36F83D01FB072B463841A939F0EFAFD7E6564E7F71705CDCFB1281AF424D4EB6282F1F33ADD58DD862B3DE496D6F379BAD1E068893C3A2FFC75DDB1DC18042569AFA0F9DE44A582534BE73DA29D40E624A82A19F6D48609609600FF34BCA8E4D69F18101A3F0BAE655D5F389D568BB91E54465E5AA0FB52CA6E372A21BCDEB45EA16FC36FEFDBC9FF3F295B53C25458C75EE869755A4E4557BD639DE5D80AA9FDE709A53F4D6D135FD8611D0EED5CBB9430C13292C74DF5380BCDE17A4C3BF0E692E505683560CBA89C931934C76B4C499A5092C586EE014732761CEB7C9D67BF43472D89644D2250DAA0E82CD", 16).unwrap();
3189    let modulus = U4096::from_str_radix("7f496a3a7a60f42bbce68427c6cc2fcd36efca76f5abe016ac529e77b09b9bc3074f4310762c27afa4b4c6bbd98ae0eb94a1c741962763de8e4f97fff615276779e6b49aac97cea67ffa74718cff0ccf81f50f21d6c921e26bb9adda7ede74145fe894ea21fddb9bb3a73c857ea689ade8b700a51acf1958aa226cc55d7a23ceabcff95933558916a19e575fe00723ea435c625e697d9ecb31fa996abf370fd751c9158e58343f43ed7767ee9ebd0c305a03dac96a608d54e2da35e12d7e93ebf7fc1a2a8a8f99e1265d3def800efeb0f944634c4235e967666fd0717ebfad0eb36c92f496da1b28a24b2ff646eedfefbac17be37e2a25235066687dc578c0ee1a0790c4437f848078eefd7082f84fc343c1accf9cc24f5e8e0eb021f4dd25fd308c91a79c416639c63e8ad87d452a2d25b4d37356a8d8e70b82df6226fbda1fb7d5a6346d18a9ec79401d6bb3776fa2115eb1c6bc83213eef559f10d0cd21a6d159f3a8910fc13d3a2c031eb3394e7a7928df1d854122b0dc032cb3272adc131ed8bd6e82af43294db9b0640189ebf6da9922af531638f7f71282c240518559e3c839767d78b5b5031f1a88b13028a55587f15a047cd2f565bad97a9a50afab1699397dcc92f10bc0140d2a796686253eabf412ea85e70c0c1d47a22b803fcf94af4ad3dda0dca583ff830b57b2cf86e1c2c0dd15b2a26372f3e43a1300226d", 16).unwrap();
3190    let rsa = RSA_4096_u8::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3191    let message = [U4096::from_string("1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111").unwrap(),
3192                    U4096::from_string("2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222").unwrap(),
3193                    U4096::from_string("3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333").unwrap()];
3194
3195    println!("RSA_4096_u8: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3196    println!("RSA_4096_u8: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3197    println!("RSA_4096_u8: Message = {}-{}-{}", message[0], message[1], message[2]);
3198
3199    let cipher = rsa.encrypt_array_biguint(&[message[0].clone(), message[1].clone(), message[2].clone()]);
3200    println!("RSA_4096_u8: Cipher = {}-{}-{}", cipher[0], cipher[1], cipher[2]);
3201    assert_eq!(cipher[0].to_string(), "482480559007706139120435280808635896009433629588335984384927715221286241221693386397964558645023125644387584377108048840919363748179067815556343522612009226536244646018841314849644563703567121309251931243104536248830409306764441218940707735488174389293011516384299039172989527209791652903206065174607465242127258473463449897381586375165158262679436131223964565287682877733440561251733628268289938957295135308390468247660146474573679954253402229925356718786306318712335967935544719625339452930957199350386947670968898258607047286750312571697576971474019840700563054069610571790835804735603849906670776683787524123334029659362618326992712141061257613414324296166006594978236006676084553601587664366122587386278129925060768375788485986602763782980169513776316287742616158875810163725010461579433100067994550624723427286094489426319062692258967640187754398048428613760189298914444204926481463733838943736719093910153478487926462136253769740147515107152461575428182350390686729098858398529816214835849111530826241152472252076472917684397765104370104272368489696053079777801388987696516172596260735578907952952459711577927570207745725289641141609304276024163405203474353382102713816313135307667770197490398260668967746483598882575518327870");
3202    assert_eq!(cipher[1].to_string(), "380120271426728247273769594446426641238838574667066484492143825438199540746259333734898815839113476807946344674781852498015750187211946722686817140378127692602596973237535781766036917217014439840298935296104792388923935389140007930758417023287106240377236524088212457735840517977835282307935378303691528124337422295542861244981251202817035532847360174307949160666481423592218164303960867236056117050624200788667329124296084136158402380660016117503455576500836950136532659050275799351693675963408739507550453651080705341452109450531835286543627282055447987805443778346211402384761807314384195838018252816026053966001141868460018268757844053788682677555437718750833050059731042394824540328543797043564501760327576307307355931319658681398516269273687097684141437367423611622209771531132413287920345638854815045079343370332832839457765574775484259542386378149003148326014739675786806590309375655758321160305411682476757937244509127945920548992083112247444836804339957942255918239364228741912091347528452773593332640033742044746411180874088216225474181184840821497671566688088032569517704444379135001484669795569619902101545075816910203604438757433894421722427813437974178973513107314677953578676777016943686788116194436463496787358425447");
3203    assert_eq!(cipher[2].to_string(), "403708122166717805212812440921541454803287378381881151718566217059934543482388343843574347969379105455056108349254666875616590987975539200841837849153148937087547866812511369840092694040775151853507412463054629015063201331777319928369501610686490431829222617691381034382645478686717780175687315400539711928636188622663308476599958801157371748300079694552482160722166897070092451616412069071181575031872050871255427968090224828478189746473554664127514715116670586818360179040472853498418648045879823744470657856376457526201599706788452275951271097481060745828920788111970622502535466247898449235637174171943825913108633880035293325538963948968316813709719634673738870061012948875675340444118678854664035378384510021029569760389132667739424199676333150729497633898277251965456673950972150625131498563419556536557513225945879539695884910650410670631396971797107947173943230798002349278205019698905650667265388286337528525078132653138115630367203064184429904843606583697672829370055741098908264941689234822140860264804737667847796895993509920072611623938284873822582637972665248640500313543359063164177031112994089881032048285300304361927726006864552178984319375585107683011215008616994395932187400440737780861175121938401991141425571085");
3204
3205    let recovered = rsa.decrypt_array_biguint(&cipher);
3206    println!("RSA_4096_u8: Recovered = {}-{}-{}", recovered[0], recovered[1], recovered[2]);
3207    assert_eq!(recovered[0], message[0].into_biguint());
3208    assert_eq!(recovered[1], message[1].into_biguint());
3209    assert_eq!(recovered[2], message[2].into_biguint());
3210    println!("-------------------------------");
3211}
3212
3213fn rsa_decrypt_unit()
3214{
3215    println!("rsa_decrypt_unit");
3216    use std::ptr::copy_nonoverlapping;
3217    use cryptocol::number::BigUInt;
3218    use cryptocol::define_utypes_with;
3219    define_utypes_with!(u128);
3220
3221    // Example for RSA_1024
3222    use cryptocol::asymmetric::RSA_1024;
3223
3224    let public_key = U1024::from(5_u8);
3225    let private_key = U1024::from_str_radix("3D4990127949DDB062F2BE417E8EACAB79F3215C306217A0C5974FEE15D4CB6D9348A161523F49F83D1CD49CB261C98259F04FECED08E08F3F0C5EF1FE695A291782AA0B9500911299CDAE0297337E9CB219F71411133C4440184C349FAC497EE809ED6D1B472409AB88A99B843FD61DBBBBC4C9686871D5221D137F89AF64CD", 16).unwrap();
3226    let modulus = U1024::from_str_radix("9937e82e2f38aa38f75edba3bc64afacb0dfd36678f53b11edfa47d33693fc91f03593734d9e38ec98c81387bdf477c5e0d8c7d0509631661d9eed5cfc07616849dec988a75bd976cd83c7b6b38cb3573d776435a28b33f2dbbcebb09e693d911fff63ff88e4de8c730a5ee8023b1c6e18a1551e949ebca6b1fedeff1dec08a9", 16).unwrap();
3227    let rsa = RSA_1024::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3228    let message = [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6978879605A4B3C2D1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF];
3229
3230    println!("RSA_1024: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3231    println!("RSA_1024: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3232    print!("RSA_1024: Message = [");
3233    for m in message
3234        { print!("{:#X}, ", m); }
3235    println!("]");
3236
3237    let mut m = [0u32; 32];
3238    unsafe { copy_nonoverlapping(message.as_ptr() as *const u32, m.as_mut_ptr(), 32); }
3239    let cipher = rsa.encrypt_unit(&m);
3240    print!("RSA_1024: Cipher = [");
3241    for c in cipher
3242        { print!("{:#X}, ", c); }
3243    println!("]");
3244    assert_eq!(cipher, [0x5876D910, 0x9DF1BA1, 0x3D2ABEA9, 0xF9EAF9F1, 0xB4DD00B4, 0x4238994, 0x946574F8, 0xFB00D2B7, 0xD3F9E91D, 0x26D78E8F, 0x4D1B93C, 0x7666C3CC, 0x492EA323, 0xC7EFA926, 0x95E9D5CE, 0xF32C4732, 0x748103D, 0x298576A7, 0x4342BA6D, 0xFF59D1A9, 0x9D1585DD, 0xFA9B236F, 0x7B7982E2, 0x2B80425C, 0x1112A9DA, 0xA5EA8BC7, 0x41AF7FBB, 0x557B6333, 0xFA12D78B, 0x34B8451C, 0x867DF90A, 0xB412E61E]);
3245
3246    let recovered = rsa.decrypt_unit(&cipher);
3247    let mut rr = [0u128; 8];
3248    unsafe { copy_nonoverlapping(recovered.as_ptr() as *const u32, rr.as_mut_ptr() as *mut u32, 32); }
3249    
3250    print!("RSA_1024: Recovered = [");
3251    for r in rr
3252        { println!("{:#X}, ", r); }
3253    assert_eq!(rr, [0x_123456789ABCDEF00FEDCBA987654321, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6978879605A4B3C2D1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF]);
3254    assert_eq!(rr, message);
3255
3256    // Example for RSA_2048
3257    use cryptocol::asymmetric::RSA_2048;
3258
3259    let public_key = U2048::from(7_u8);
3260    let private_key = U2048::from_str_radix("4935A7A0CA0F94101C34BC4A3180F18FE756C4CAFAFDED502AF6B7EC89E42D89C0163CFD43CC58F90F9CEA3045B565957732102340ACF51695E3F635FBD3AAEE83F71EB37103D234B108380932372E677200AD37074BBCEEC60FBEE4AB73C8F7030F712C8A70B43A05BD10700A0C50579CE8A8AEEF96D1D8BF7EDA7CF946F64A04F4C739591D41E2D0CD9E65FA6CED2AAEAE2BB3E9CE38BD0BA06DFF1847965DBE264447EE0C1AE7452638014AA2959B1FEAE409987C65321651C896732A62F0581F87A94DC41D85C3936C369A803DB0D6BD99B346C01A74295C24260E0055BFA97013967F9D6A868E57A67EBF17A6C9D7D5FB50BEFA4A4AD93BC558B8A78297", 16).unwrap();
3261    let modulus = U2048::from_str_radix("aad28721d779aed041d06202738233a51bca75d99efb29bb0eea57d297146a416ade8e4ef3877a45246e2270a2a7425cc0ca25a796e8e68a08693e7df6433981de95f24d5d08ea7af26882c01fd616f15f56e980665b638278cf6815900e2a405c795d67edb1a48762b9265ac21cbb7718c989982f0a944f1427fdce45a59403b080b68d260dafd1fb64b374aaac80bd1f595bd0ff175ca6108fdd2f83905774f66828ba84fab66412430666d46d1b94bb0da1c9d9c9062497677ea5b6b751f1e51651d86b6d377c3b44767134496a8fe2d7157e5f17281ad156d1a05eea359bc847d2d835474e1d4dc517902ffcfb036f7444bf296ad86ab0795f058a6a7a4f", 16).unwrap();
3262    let rsa = RSA_2048::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3263    let message = [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF];
3264
3265    println!("RSA_2048: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3266    println!("RSA_2048: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3267    print!("RSA_2048: Message = [");
3268    for m in message
3269        { print!("{:#X}, ", m); }
3270    println!("]");
3271
3272    let mut m = [0u32; 64];
3273    unsafe { copy_nonoverlapping(message.as_ptr() as *const u32, m.as_mut_ptr(), 64); }
3274    let cipher = rsa.encrypt_unit(&m);
3275    print!("RSA_2048: Cipher = [");
3276    for c in cipher
3277        { print!("{:#X}, ", c); }
3278    println!("]");
3279    assert_eq!(cipher, [0x47283873, 0x2CDBEDD8, 0x93922441, 0x8E8A2C0F, 0xD2483CDF, 0x712502C, 0x975FB948, 0xA5477C70, 0x5151E7A4, 0x7B83A1E1, 0x63B4157F, 0x9CB225EB, 0xF613588C, 0xA28B6E71, 0xD16F7440, 0xE80799C, 0xE5629F2E, 0x59A4DD76, 0x5CC7AF66, 0x17FD5732, 0x90E31987, 0x23B5BDDD, 0x2A329668, 0x91DA607E, 0xE2EB9B3B, 0x1DFC378F, 0x56EFB8F6, 0xA387D998, 0x7C819286, 0x7FFD1AC3, 0x81E4143F, 0x72B12533, 0x6C871DC6, 0x3317DDA8, 0x415F5497, 0x2FB59FFD, 0xF720E361, 0x515DB9B5, 0x8EB0C7D1, 0x2747A272, 0x661AB141, 0xFA4561A, 0x8E9DAD98, 0xC3DC9098, 0x6FC2E30, 0x6CCC919D, 0x44BCC6F4, 0xCA835FD1, 0xD660A677, 0xFC235E1F, 0x2D54CE65, 0x16AD846F, 0xB8FBDBC3, 0x5EBF02E, 0x63EE29D6, 0x49262F3B, 0x96CC8F26, 0x4BCD700C, 0x3362037A, 0xD909B057, 0x2D932D0D, 0x1394BCCB, 0xE545D5DF, 0x6A33D012]);
3280    let recovered = rsa.decrypt_unit(&cipher);
3281    let mut rr = [0u128; 16];
3282    unsafe { copy_nonoverlapping(recovered.as_ptr() as *const u32, rr.as_mut_ptr() as *mut u32, 64); }
3283    
3284    print!("RSA_2048: Recovered = [");
3285    for r in rr
3286        { print!("{:#X}, ", r); }
3287    println!("]");
3288    assert_eq!(rr, [0x_123456789ABCDEF00FEDCBA987654321, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF]);
3289    assert_eq!(rr, message);
3290
3291    // Example for RSA_4096
3292    use cryptocol::asymmetric::RSA_4096;
3293
3294    let public_key = U4096::from(5_u8);
3295    let private_key = U4096::from_str_radix("65D454FB951A5CEFCA5203530570263DC58CA1F8C489801223754B92F3AFAFCF390C35A6C4F01FBFB6F70563146F1A5610816C34781F831871D946665E7752B92E522A1556DFD885332EC38E0A65A3D934C40C1B123A8181EFC7BE48657EC3437FED43EE8197E2E2F61F639DFEEBA157ED5F33B748A5ADE0881B8A377DFB4FD889732DE0F5DE07454E1845E64CD28321CF7D1B7EBACAE56F5B2EE12232927312A7D4113EACF69903245F86587EFDA359E19CAF07884D3DDD82482B1A8ACBA989933014EED53FAE4DB84A97F2CCD8CBC0C769E909CE918785EB8CA6C13232F0D88F8A0F2A124815BA1B6F5991D258B3262F012FE931BB50E90D1EB9FE3793CD8A18182768BCC1926552BDA2F452FFE5A25DADBF36F83D01FB072B463841A939F0EFAFD7E6564E7F71705CDCFB1281AF424D4EB6282F1F33ADD58DD862B3DE496D6F379BAD1E068893C3A2FFC75DDB1DC18042569AFA0F9DE44A582534BE73DA29D40E624A82A19F6D48609609600FF34BCA8E4D69F18101A3F0BAE655D5F389D568BB91E54465E5AA0FB52CA6E372A21BCDEB45EA16FC36FEFDBC9FF3F295B53C25458C75EE869755A4E4557BD639DE5D80AA9FDE709A53F4D6D135FD8611D0EED5CBB9430C13292C74DF5380BCDE17A4C3BF0E692E505683560CBA89C931934C76B4C499A5092C586EE014732761CEB7C9D67BF43472D89644D2250DAA0E82CD", 16).unwrap();
3296    let modulus = U4096::from_str_radix("7f496a3a7a60f42bbce68427c6cc2fcd36efca76f5abe016ac529e77b09b9bc3074f4310762c27afa4b4c6bbd98ae0eb94a1c741962763de8e4f97fff615276779e6b49aac97cea67ffa74718cff0ccf81f50f21d6c921e26bb9adda7ede74145fe894ea21fddb9bb3a73c857ea689ade8b700a51acf1958aa226cc55d7a23ceabcff95933558916a19e575fe00723ea435c625e697d9ecb31fa996abf370fd751c9158e58343f43ed7767ee9ebd0c305a03dac96a608d54e2da35e12d7e93ebf7fc1a2a8a8f99e1265d3def800efeb0f944634c4235e967666fd0717ebfad0eb36c92f496da1b28a24b2ff646eedfefbac17be37e2a25235066687dc578c0ee1a0790c4437f848078eefd7082f84fc343c1accf9cc24f5e8e0eb021f4dd25fd308c91a79c416639c63e8ad87d452a2d25b4d37356a8d8e70b82df6226fbda1fb7d5a6346d18a9ec79401d6bb3776fa2115eb1c6bc83213eef559f10d0cd21a6d159f3a8910fc13d3a2c031eb3394e7a7928df1d854122b0dc032cb3272adc131ed8bd6e82af43294db9b0640189ebf6da9922af531638f7f71282c240518559e3c839767d78b5b5031f1a88b13028a55587f15a047cd2f565bad97a9a50afab1699397dcc92f10bc0140d2a796686253eabf412ea85e70c0c1d47a22b803fcf94af4ad3dda0dca583ff830b57b2cf86e1c2c0dd15b2a26372f3e43a1300226d", 16).unwrap();
3297    let rsa = RSA_4096::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3298    let message = [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000];
3299
3300    println!("RSA_4096: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3301    println!("RSA_4096: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3302    print!("RSA_4096: Message = [");
3303    for m in message
3304        { print!("{:#X}, ", m); }
3305    println!("]");
3306
3307    let mut m = [0u32; 128];
3308    unsafe { copy_nonoverlapping(message.as_ptr() as *const u32, m.as_mut_ptr(), 128); }
3309    let cipher = rsa.encrypt_unit(&m);
3310    print!("RSA_4096: Cipher = [");
3311    for c in cipher
3312        { print!("{:#X}, ", c); }
3313    println!("]");
3314    assert_eq!(cipher, [0x9CB6ED19, 0xD4FB55D8, 0xC122734C, 0x2F1811F6, 0xA5114AFF, 0x93B93341, 0x6CEDD077, 0xCBABA04C, 0xB0873367, 0xDDBB2719, 0x8060C197, 0x17949273, 0x9EBA2656, 0xA6757910, 0xF832F645, 0x12836967, 0x2ED8B7ED, 0x501E8879, 0x920F899A, 0x6AEBB339, 0xB416EC59, 0xDCB94159, 0xD24DF92D, 0x2457DBC7, 0xBF6C9361, 0x6308ADE8, 0xB7E0A22C, 0xF8641498, 0x20367D0C, 0x994F70D2, 0x2E1B1007, 0x96EA933B, 0x65D11AD3, 0x78C0C565, 0xB2E327C9, 0xC9A3DB5, 0x2A5DA924, 0xFFBB3522, 0xA6187825, 0x14F47769, 0x3E3E549A, 0xDCBCE40A, 0x27323317, 0xECC35120, 0xAEEB915, 0xC47F38FD, 0x6A9DEF00, 0x2D7AC41D, 0x9E9EBA3C, 0xB5347E7, 0xE9F682DF, 0x936934BD, 0x715BC0D4, 0x7709F812, 0x44E0BDF7, 0x3BD64D43, 0xCCD014E8, 0x54F45FBE, 0x2E2A4FEE, 0x71FD352A, 0x527F1386, 0x81683594, 0x5370C3FF, 0xE19A6E62, 0x39978561, 0x4AAB76D6, 0x3A41D681, 0xB5EE9ED7, 0x465EA91C, 0xEF7222B1, 0x8098DF3C, 0x975E545D, 0xDE5D873A, 0x2FD8CF10, 0xFF806337, 0xDF0246B0, 0x12ABF503, 0xB185DA9D, 0xE1AD50CB, 0x746198FC, 0x86727129, 0x48A7C5FE, 0xFCA33C4C, 0xC1B4D550, 0xF2FC1DFE, 0x13DE163B, 0x7E9624D7, 0x45C84418, 0xCF8DEA12, 0xB7F566C7, 0x46CFC115, 0x81E6CDC4, 0xD8BCFF70, 0xB41D8E6C, 0x9F7ABF3F, 0x3FCD96B, 0x40203895, 0xDBE711C6, 0xEDDB977A, 0x4F0F98A1, 0xE4060DC6, 0x34AC5734, 0x884CDEB5, 0x860425FA, 0xB9D26FF9, 0x89E2B6CF, 0x94351640, 0xC2F3797, 0xC944A9CC, 0xC5570B76, 0x15CF86D7, 0x5455267A, 0xDF827B3, 0x89C4D05D, 0xD3C161C5, 0x71F3A803, 0x275ECEA5, 0xCE1A255, 0x4B055080, 0x6E115E15, 0x1D64B0AA, 0xF1A92FD5, 0x9A1B3206, 0x37FC92CA, 0x62EE5AFA, 0xD18E769A, 0xF5CCF050, 0xEC82A614]);
3315    let recovered = rsa.decrypt_unit(&cipher);
3316    let mut rr = [0u128; 32];
3317    unsafe { copy_nonoverlapping(recovered.as_ptr() as *const u32, rr.as_mut_ptr() as *mut u32, 128); }
3318    
3319    print!("RSA_4096: Recovered = [");
3320    for r in rr
3321        { print!("{:#X}, ", r); }
3322    println!("]");
3323    assert_eq!(rr, [0x_123456789ABCDEF00FEDCBA987654321, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000]);
3324    assert_eq!(rr, message);
3325
3326    // Example for RSA_Genric
3327    use cryptocol::asymmetric::RSA_Generic;
3328
3329    let public_key = BigUInt::<u64, 4>::from(0xD_u8);
3330    let private_key = BigUInt::<u64, 4>::from_str_radix("3F3597F1C44073A8D3C34F5FF1444665DAE8D8F268104A60C82825E1C3CD44D5", 16).unwrap();
3331    let modulus = BigUInt::<u64, 4>::from_str_radix("88f41e8bd3e0fa98757c814fe013edde379c41da169a91050fa4964a1141853b", 16).unwrap();
3332    let rsa = RSA_Generic::<4, u64, 5>::new_with_keys(public_key, private_key, modulus);
3333    let message = [0x_FEDCBA9876543210_u64, 0x_1122334455667788, 0x_9900AABBCCDDEEFF, 0x_FEDCBA0987654321];
3334
3335    println!("RSA_Generic<4, u64, 5>: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3336    println!("RSA_Generic<4, u64, 5>: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3337    print!("RSA_Generic<4, u64, 5>: Message = [");
3338    for m in message
3339        { print!("{:#X}, ", m); }
3340    println!("]");
3341
3342    let cipher = rsa.encrypt_unit(&message);
3343    print!("RSA_Generic<4, u64, 5>: Cipher = [");
3344    for c in cipher
3345        { print!("{:#X}, ", c); }
3346    println!("]");
3347    assert_eq!(cipher, [0xAA75AA5E6838BB51, 0x14B74CBA736261B8, 0x582AED04672A4512, 0xE81777B9B19C8547]);
3348    let recovered = rsa.decrypt_unit(&cipher);
3349    print!("RSA_Generic<4, u64, 5>: Recovered = [");
3350    for r in recovered
3351        { print!("{:#X}, ", r); }
3352    println!("]");
3353    assert_eq!(recovered, [0x_FEDCBA9876543210, 0x_1122334455667788, 0x_9900AABBCCDDEEFF, 0x_FEDCBA0987654321]);
3354    assert_eq!(recovered, message);
3355
3356    // Example for RSA_1024_u128
3357    use cryptocol::asymmetric::RSA_1024_u128;
3358
3359    let public_key = U1024::from(5_u8);
3360    let private_key = U1024::from_str_radix("3D4990127949DDB062F2BE417E8EACAB79F3215C306217A0C5974FEE15D4CB6D9348A161523F49F83D1CD49CB261C98259F04FECED08E08F3F0C5EF1FE695A291782AA0B9500911299CDAE0297337E9CB219F71411133C4440184C349FAC497EE809ED6D1B472409AB88A99B843FD61DBBBBC4C9686871D5221D137F89AF64CD", 16).unwrap();
3361    let modulus = U1024::from_str_radix("9937e82e2f38aa38f75edba3bc64afacb0dfd36678f53b11edfa47d33693fc91f03593734d9e38ec98c81387bdf477c5e0d8c7d0509631661d9eed5cfc07616849dec988a75bd976cd83c7b6b38cb3573d776435a28b33f2dbbcebb09e693d911fff63ff88e4de8c730a5ee8023b1c6e18a1551e949ebca6b1fedeff1dec08a9", 16).unwrap();
3362    let rsa = RSA_1024_u128::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3363    let message = [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6978879605A4B3C2D1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF];
3364
3365    println!("RSA_1024_u128: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3366    println!("RSA_1024_u128: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3367    print!("RSA_1024_u128: Message = [");
3368    for m in message
3369        { print!("{:#X}, ", m); }
3370    println!("]");
3371
3372    let cipher = rsa.encrypt_unit(&message);
3373    print!("RSA_1024_u128: Cipher = [");
3374    for c in cipher
3375        { print!("{:#X}, ", c); }
3376    println!("]");
3377    assert_eq!(cipher, [0xF9EAF9F13D2ABEA909DF1BA15876D910, 0xFB00D2B7946574F804238994B4DD00B4, 0x7666C3CC04D1B93C26D78E8FD3F9E91D, 0xF32C473295E9D5CEC7EFA926492EA323, 0xFF59D1A94342BA6D298576A70748103D, 0x2B80425C7B7982E2FA9B236F9D1585DD, 0x557B633341AF7FBBA5EA8BC71112A9DA, 0xB412E61E867DF90A34B8451CFA12D78B]);
3378    let recovered = rsa.decrypt_unit(&cipher);   
3379
3380    print!("RSA_1024_u128: Recovered = [");
3381    for r in recovered
3382        { println!("{:#X}, ", r); }
3383    assert_eq!(recovered, [0x_123456789ABCDEF00FEDCBA987654321, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6978879605A4B3C2D1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF]);
3384    assert_eq!(recovered, message);
3385
3386    // Example for RSA_2048_u128
3387    use cryptocol::asymmetric::RSA_2048_u128;
3388
3389    let public_key = U2048::from(7_u8);
3390    let private_key = U2048::from_str_radix("4935A7A0CA0F94101C34BC4A3180F18FE756C4CAFAFDED502AF6B7EC89E42D89C0163CFD43CC58F90F9CEA3045B565957732102340ACF51695E3F635FBD3AAEE83F71EB37103D234B108380932372E677200AD37074BBCEEC60FBEE4AB73C8F7030F712C8A70B43A05BD10700A0C50579CE8A8AEEF96D1D8BF7EDA7CF946F64A04F4C739591D41E2D0CD9E65FA6CED2AAEAE2BB3E9CE38BD0BA06DFF1847965DBE264447EE0C1AE7452638014AA2959B1FEAE409987C65321651C896732A62F0581F87A94DC41D85C3936C369A803DB0D6BD99B346C01A74295C24260E0055BFA97013967F9D6A868E57A67EBF17A6C9D7D5FB50BEFA4A4AD93BC558B8A78297", 16).unwrap();
3391    let modulus = U2048::from_str_radix("aad28721d779aed041d06202738233a51bca75d99efb29bb0eea57d297146a416ade8e4ef3877a45246e2270a2a7425cc0ca25a796e8e68a08693e7df6433981de95f24d5d08ea7af26882c01fd616f15f56e980665b638278cf6815900e2a405c795d67edb1a48762b9265ac21cbb7718c989982f0a944f1427fdce45a59403b080b68d260dafd1fb64b374aaac80bd1f595bd0ff175ca6108fdd2f83905774f66828ba84fab66412430666d46d1b94bb0da1c9d9c9062497677ea5b6b751f1e51651d86b6d377c3b44767134496a8fe2d7157e5f17281ad156d1a05eea359bc847d2d835474e1d4dc517902ffcfb036f7444bf296ad86ab0795f058a6a7a4f", 16).unwrap();
3392    let rsa = RSA_2048_u128::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3393    let message = [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF];
3394
3395    println!("RSA_2048_u128: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3396    println!("RSA_2048_u128: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3397    print!("RSA_2048_u128: Message = [");
3398    for m in message
3399        { print!("{:#X}, ", m); }
3400    println!("]");
3401
3402    let cipher = rsa.encrypt_unit(&message);
3403    print!("RSA_2048_u128: Cipher = [");
3404    for c in cipher
3405        { print!("{:#X}, ", c); }
3406    println!("]");
3407    assert_eq!(cipher, [0x8E8A2C0F939224412CDBEDD847283873, 0xA5477C70975FB9480712502CD2483CDF, 0x9CB225EB63B4157F7B83A1E15151E7A4, 0xE80799CD16F7440A28B6E71F613588C, 0x17FD57325CC7AF6659A4DD76E5629F2E, 0x91DA607E2A32966823B5BDDD90E31987, 0xA387D99856EFB8F61DFC378FE2EB9B3B, 0x72B1253381E4143F7FFD1AC37C819286, 0x2FB59FFD415F54973317DDA86C871DC6, 0x2747A2728EB0C7D1515DB9B5F720E361, 0xC3DC90988E9DAD980FA4561A661AB141, 0xCA835FD144BCC6F46CCC919D06FC2E30, 0x16AD846F2D54CE65FC235E1FD660A677, 0x49262F3B63EE29D605EBF02EB8FBDBC3, 0xD909B0573362037A4BCD700C96CC8F26, 0x6A33D012E545D5DF1394BCCB2D932D0D]);
3408    let recovered = rsa.decrypt_unit(&cipher);
3409
3410    print!("RSA_2048_u128: Recovered = [");
3411    for r in recovered
3412        { print!("{:#X}, ", r); }
3413    println!("]");
3414    assert_eq!(recovered, [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF]);
3415    assert_eq!(recovered, message);
3416
3417    // Example for RSA_4096_u128
3418    use cryptocol::asymmetric::RSA_4096_u128;
3419
3420    let public_key = U4096::from(5_u8);
3421    let private_key = U4096::from_str_radix("65D454FB951A5CEFCA5203530570263DC58CA1F8C489801223754B92F3AFAFCF390C35A6C4F01FBFB6F70563146F1A5610816C34781F831871D946665E7752B92E522A1556DFD885332EC38E0A65A3D934C40C1B123A8181EFC7BE48657EC3437FED43EE8197E2E2F61F639DFEEBA157ED5F33B748A5ADE0881B8A377DFB4FD889732DE0F5DE07454E1845E64CD28321CF7D1B7EBACAE56F5B2EE12232927312A7D4113EACF69903245F86587EFDA359E19CAF07884D3DDD82482B1A8ACBA989933014EED53FAE4DB84A97F2CCD8CBC0C769E909CE918785EB8CA6C13232F0D88F8A0F2A124815BA1B6F5991D258B3262F012FE931BB50E90D1EB9FE3793CD8A18182768BCC1926552BDA2F452FFE5A25DADBF36F83D01FB072B463841A939F0EFAFD7E6564E7F71705CDCFB1281AF424D4EB6282F1F33ADD58DD862B3DE496D6F379BAD1E068893C3A2FFC75DDB1DC18042569AFA0F9DE44A582534BE73DA29D40E624A82A19F6D48609609600FF34BCA8E4D69F18101A3F0BAE655D5F389D568BB91E54465E5AA0FB52CA6E372A21BCDEB45EA16FC36FEFDBC9FF3F295B53C25458C75EE869755A4E4557BD639DE5D80AA9FDE709A53F4D6D135FD8611D0EED5CBB9430C13292C74DF5380BCDE17A4C3BF0E692E505683560CBA89C931934C76B4C499A5092C586EE014732761CEB7C9D67BF43472D89644D2250DAA0E82CD", 16).unwrap();
3422    let modulus = U4096::from_str_radix("7f496a3a7a60f42bbce68427c6cc2fcd36efca76f5abe016ac529e77b09b9bc3074f4310762c27afa4b4c6bbd98ae0eb94a1c741962763de8e4f97fff615276779e6b49aac97cea67ffa74718cff0ccf81f50f21d6c921e26bb9adda7ede74145fe894ea21fddb9bb3a73c857ea689ade8b700a51acf1958aa226cc55d7a23ceabcff95933558916a19e575fe00723ea435c625e697d9ecb31fa996abf370fd751c9158e58343f43ed7767ee9ebd0c305a03dac96a608d54e2da35e12d7e93ebf7fc1a2a8a8f99e1265d3def800efeb0f944634c4235e967666fd0717ebfad0eb36c92f496da1b28a24b2ff646eedfefbac17be37e2a25235066687dc578c0ee1a0790c4437f848078eefd7082f84fc343c1accf9cc24f5e8e0eb021f4dd25fd308c91a79c416639c63e8ad87d452a2d25b4d37356a8d8e70b82df6226fbda1fb7d5a6346d18a9ec79401d6bb3776fa2115eb1c6bc83213eef559f10d0cd21a6d159f3a8910fc13d3a2c031eb3394e7a7928df1d854122b0dc032cb3272adc131ed8bd6e82af43294db9b0640189ebf6da9922af531638f7f71282c240518559e3c839767d78b5b5031f1a88b13028a55587f15a047cd2f565bad97a9a50afab1699397dcc92f10bc0140d2a796686253eabf412ea85e70c0c1d47a22b803fcf94af4ad3dda0dca583ff830b57b2cf86e1c2c0dd15b2a26372f3e43a1300226d", 16).unwrap();
3423    let rsa = RSA_4096_u128::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3424    let message = [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000];
3425
3426    println!("RSA_4096_u128: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3427    println!("RSA_4096_u128: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3428    print!("RSA_4096_u128: Message = [");
3429    for m in message
3430        { print!("{:#X}, ", m); }
3431    println!("]");
3432
3433    let cipher = rsa.encrypt_unit(&message);
3434    print!("RSA_4096_u128: Cipher = [");
3435    for c in cipher
3436        { print!("{:#X}, ", c); }
3437    println!("]");
3438    assert_eq!(cipher, [0x2F1811F6C122734CD4FB55D89CB6ED19, 0xCBABA04C6CEDD07793B93341A5114AFF, 0x179492738060C197DDBB2719B0873367, 0x12836967F832F645A67579109EBA2656, 0x6AEBB339920F899A501E88792ED8B7ED, 0x2457DBC7D24DF92DDCB94159B416EC59, 0xF8641498B7E0A22C6308ADE8BF6C9361, 0x96EA933B2E1B1007994F70D220367D0C, 0xC9A3DB5B2E327C978C0C56565D11AD3, 0x14F47769A6187825FFBB35222A5DA924, 0xECC3512027323317DCBCE40A3E3E549A, 0x2D7AC41D6A9DEF00C47F38FD0AEEB915, 0x936934BDE9F682DF0B5347E79E9EBA3C, 0x3BD64D4344E0BDF77709F812715BC0D4, 0x71FD352A2E2A4FEE54F45FBECCD014E8, 0xE19A6E625370C3FF81683594527F1386, 0xB5EE9ED73A41D6814AAB76D639978561, 0x975E545D8098DF3CEF7222B1465EA91C, 0xDF0246B0FF8063372FD8CF10DE5D873A, 0x746198FCE1AD50CBB185DA9D12ABF503, 0xC1B4D550FCA33C4C48A7C5FE86727129, 0x45C844187E9624D713DE163BF2FC1DFE, 0x81E6CDC446CFC115B7F566C7CF8DEA12, 0x3FCD96B9F7ABF3FB41D8E6CD8BCFF70, 0x4F0F98A1EDDB977ADBE711C640203895, 0x860425FA884CDEB534AC5734E4060DC6, 0xC2F37979435164089E2B6CFB9D26FF9, 0x5455267A15CF86D7C5570B76C944A9CC, 0x71F3A803D3C161C589C4D05D0DF827B3, 0x6E115E154B0550800CE1A255275ECEA5, 0x37FC92CA9A1B3206F1A92FD51D64B0AA, 0xEC82A614F5CCF050D18E769A62EE5AFA]);
3439    let recovered = rsa.decrypt_unit(&cipher);
3440
3441    print!("RSA_4096_u128: Recovered = [");
3442    for r in recovered
3443        { print!("{:#X}, ", r); }
3444    println!("]");
3445    assert_eq!(recovered, [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000]);
3446    assert_eq!(recovered, message);
3447
3448    // Example for RSA_1024_u64
3449    use cryptocol::asymmetric::RSA_1024_u64;
3450
3451    let public_key = U1024::from(5_u8);
3452    let private_key = U1024::from_str_radix("3D4990127949DDB062F2BE417E8EACAB79F3215C306217A0C5974FEE15D4CB6D9348A161523F49F83D1CD49CB261C98259F04FECED08E08F3F0C5EF1FE695A291782AA0B9500911299CDAE0297337E9CB219F71411133C4440184C349FAC497EE809ED6D1B472409AB88A99B843FD61DBBBBC4C9686871D5221D137F89AF64CD", 16).unwrap();
3453    let modulus = U1024::from_str_radix("9937e82e2f38aa38f75edba3bc64afacb0dfd36678f53b11edfa47d33693fc91f03593734d9e38ec98c81387bdf477c5e0d8c7d0509631661d9eed5cfc07616849dec988a75bd976cd83c7b6b38cb3573d776435a28b33f2dbbcebb09e693d911fff63ff88e4de8c730a5ee8023b1c6e18a1551e949ebca6b1fedeff1dec08a9", 16).unwrap();
3454    let rsa = RSA_1024_u64::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3455    let message = [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6978879605A4B3C2D1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF];
3456
3457    println!("RSA_1024_u64: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3458    println!("RSA_1024_u64: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3459    print!("RSA_1024_u64: Message = [");
3460    for m in message
3461        { print!("{:#X}, ", m); }
3462    println!("]");
3463
3464    let mut m = [0u64; 16];
3465    unsafe { copy_nonoverlapping(message.as_ptr() as *const u64, m.as_mut_ptr(), 16); }
3466    let cipher = rsa.encrypt_unit(&m);
3467    print!("RSA_1024_u64: Cipher = [");
3468    for c in cipher
3469        { print!("{:#X}, ", c); }
3470    println!("]");
3471    assert_eq!(cipher, [0x9DF1BA15876D910, 0xF9EAF9F13D2ABEA9, 0x4238994B4DD00B4, 0xFB00D2B7946574F8, 0x26D78E8FD3F9E91D, 0x7666C3CC04D1B93C, 0xC7EFA926492EA323, 0xF32C473295E9D5CE, 0x298576A70748103D, 0xFF59D1A94342BA6D, 0xFA9B236F9D1585DD, 0x2B80425C7B7982E2, 0xA5EA8BC71112A9DA, 0x557B633341AF7FBB, 0x34B8451CFA12D78B, 0xB412E61E867DF90A]);
3472
3473    let recovered = rsa.decrypt_unit(&cipher);
3474    let mut rr = [0u128; 8];
3475    unsafe { copy_nonoverlapping(recovered.as_ptr(), rr.as_mut_ptr() as *mut u64, 16); }
3476    
3477    print!("RSA_1024_u64: Recovered = [");
3478    for r in rr
3479        { print!("{:#X}, ", r); }
3480    println!("]");
3481    assert_eq!(rr, [0x123456789ABCDEF00FEDCBA987654321, 0x11223344556677889900AABBCCDDEEFF, 0xFFEEDDCCBBAA00998877665544332211, 0x1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0xF1E2D3C4B5A6978879605A4B3C2D1F, 0x102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x11112222333344445555666677778888, 0x99990000AAAABBBBCCCCDDDDEEEEFFFF]);
3482    assert_eq!(rr, message);
3483
3484    // Example for RSA_2048_u64
3485    use cryptocol::asymmetric::RSA_2048_u64;
3486
3487    let public_key = U2048::from(7_u8);
3488    let private_key = U2048::from_str_radix("4935A7A0CA0F94101C34BC4A3180F18FE756C4CAFAFDED502AF6B7EC89E42D89C0163CFD43CC58F90F9CEA3045B565957732102340ACF51695E3F635FBD3AAEE83F71EB37103D234B108380932372E677200AD37074BBCEEC60FBEE4AB73C8F7030F712C8A70B43A05BD10700A0C50579CE8A8AEEF96D1D8BF7EDA7CF946F64A04F4C739591D41E2D0CD9E65FA6CED2AAEAE2BB3E9CE38BD0BA06DFF1847965DBE264447EE0C1AE7452638014AA2959B1FEAE409987C65321651C896732A62F0581F87A94DC41D85C3936C369A803DB0D6BD99B346C01A74295C24260E0055BFA97013967F9D6A868E57A67EBF17A6C9D7D5FB50BEFA4A4AD93BC558B8A78297", 16).unwrap();
3489    let modulus = U2048::from_str_radix("aad28721d779aed041d06202738233a51bca75d99efb29bb0eea57d297146a416ade8e4ef3877a45246e2270a2a7425cc0ca25a796e8e68a08693e7df6433981de95f24d5d08ea7af26882c01fd616f15f56e980665b638278cf6815900e2a405c795d67edb1a48762b9265ac21cbb7718c989982f0a944f1427fdce45a59403b080b68d260dafd1fb64b374aaac80bd1f595bd0ff175ca6108fdd2f83905774f66828ba84fab66412430666d46d1b94bb0da1c9d9c9062497677ea5b6b751f1e51651d86b6d377c3b44767134496a8fe2d7157e5f17281ad156d1a05eea359bc847d2d835474e1d4dc517902ffcfb036f7444bf296ad86ab0795f058a6a7a4f", 16).unwrap();
3490    let rsa = RSA_2048_u64::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3491    let message = [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF];
3492
3493    println!("RSA_2048_u64: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3494    println!("RSA_2048_u64: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3495    print!("RSA_2048_u64: Message = [");
3496    for m in message
3497        { print!("{:#X}, ", m); }
3498    println!("]");
3499
3500    let mut m = [0u64; 32];
3501    unsafe { copy_nonoverlapping(message.as_ptr() as *const u64, m.as_mut_ptr(), 32); }
3502    let cipher = rsa.encrypt_unit(&m);
3503    print!("RSA_2048_u64: Cipher = [");
3504    for c in cipher
3505        { print!("{:#X}, ", c); }
3506    println!("]");
3507    assert_eq!(cipher, [0x2CDBEDD847283873, 0x8E8A2C0F93922441, 0x712502CD2483CDF, 0xA5477C70975FB948, 0x7B83A1E15151E7A4, 0x9CB225EB63B4157F, 0xA28B6E71F613588C, 0xE80799CD16F7440, 0x59A4DD76E5629F2E, 0x17FD57325CC7AF66, 0x23B5BDDD90E31987, 0x91DA607E2A329668, 0x1DFC378FE2EB9B3B, 0xA387D99856EFB8F6, 0x7FFD1AC37C819286, 0x72B1253381E4143F, 0x3317DDA86C871DC6, 0x2FB59FFD415F5497, 0x515DB9B5F720E361, 0x2747A2728EB0C7D1, 0xFA4561A661AB141, 0xC3DC90988E9DAD98, 0x6CCC919D06FC2E30, 0xCA835FD144BCC6F4, 0xFC235E1FD660A677, 0x16AD846F2D54CE65, 0x5EBF02EB8FBDBC3, 0x49262F3B63EE29D6, 0x4BCD700C96CC8F26, 0xD909B0573362037A, 0x1394BCCB2D932D0D, 0x6A33D012E545D5DF]);
3508    let recovered = rsa.decrypt_unit(&cipher);
3509    let mut rr = [0u128; 16];
3510    unsafe { copy_nonoverlapping(recovered.as_ptr(), rr.as_mut_ptr() as *mut u64, 32); }
3511    
3512    print!("RSA_2048_u64: Recovered = [");
3513    for r in rr
3514        { print!("{:#X}, ", r); }
3515    println!("]");
3516    assert_eq!(rr, [0x123456789ABCDEF00FEDCBA987654321, 0x11223344556677889900AABBCCDDEEFF, 0xFFEEDDCCBBAA00998877665544332211, 0x1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0xF1E2D3C4B5A6079889706A5B4C3D2E1F, 0x102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x11112222333344445555666677778888, 0x99990000AAAABBBBCCCCDDDDEEEEFFFF, 0xFEDCBA98765432100123456789ABCDEF, 0x9900AABBCCDDEEFF1122334455667788, 0x8877665544332211FFEEDDCCBBAA0099, 0x9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x879605A4B3C2D1E00F1E2D3C4B5A6978, 0x98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x111122223333444499990000AAAABBBB, 0x5555666677778888CCCCDDDDEEEEFFFF]);
3517    assert_eq!(rr, message);
3518
3519    // Example for RSA_4096_u64
3520    use cryptocol::asymmetric::RSA_4096_u64;
3521
3522    let public_key = U4096::from(5_u8);
3523    let private_key = U4096::from_str_radix("65D454FB951A5CEFCA5203530570263DC58CA1F8C489801223754B92F3AFAFCF390C35A6C4F01FBFB6F70563146F1A5610816C34781F831871D946665E7752B92E522A1556DFD885332EC38E0A65A3D934C40C1B123A8181EFC7BE48657EC3437FED43EE8197E2E2F61F639DFEEBA157ED5F33B748A5ADE0881B8A377DFB4FD889732DE0F5DE07454E1845E64CD28321CF7D1B7EBACAE56F5B2EE12232927312A7D4113EACF69903245F86587EFDA359E19CAF07884D3DDD82482B1A8ACBA989933014EED53FAE4DB84A97F2CCD8CBC0C769E909CE918785EB8CA6C13232F0D88F8A0F2A124815BA1B6F5991D258B3262F012FE931BB50E90D1EB9FE3793CD8A18182768BCC1926552BDA2F452FFE5A25DADBF36F83D01FB072B463841A939F0EFAFD7E6564E7F71705CDCFB1281AF424D4EB6282F1F33ADD58DD862B3DE496D6F379BAD1E068893C3A2FFC75DDB1DC18042569AFA0F9DE44A582534BE73DA29D40E624A82A19F6D48609609600FF34BCA8E4D69F18101A3F0BAE655D5F389D568BB91E54465E5AA0FB52CA6E372A21BCDEB45EA16FC36FEFDBC9FF3F295B53C25458C75EE869755A4E4557BD639DE5D80AA9FDE709A53F4D6D135FD8611D0EED5CBB9430C13292C74DF5380BCDE17A4C3BF0E692E505683560CBA89C931934C76B4C499A5092C586EE014732761CEB7C9D67BF43472D89644D2250DAA0E82CD", 16).unwrap();
3524    let modulus = U4096::from_str_radix("7f496a3a7a60f42bbce68427c6cc2fcd36efca76f5abe016ac529e77b09b9bc3074f4310762c27afa4b4c6bbd98ae0eb94a1c741962763de8e4f97fff615276779e6b49aac97cea67ffa74718cff0ccf81f50f21d6c921e26bb9adda7ede74145fe894ea21fddb9bb3a73c857ea689ade8b700a51acf1958aa226cc55d7a23ceabcff95933558916a19e575fe00723ea435c625e697d9ecb31fa996abf370fd751c9158e58343f43ed7767ee9ebd0c305a03dac96a608d54e2da35e12d7e93ebf7fc1a2a8a8f99e1265d3def800efeb0f944634c4235e967666fd0717ebfad0eb36c92f496da1b28a24b2ff646eedfefbac17be37e2a25235066687dc578c0ee1a0790c4437f848078eefd7082f84fc343c1accf9cc24f5e8e0eb021f4dd25fd308c91a79c416639c63e8ad87d452a2d25b4d37356a8d8e70b82df6226fbda1fb7d5a6346d18a9ec79401d6bb3776fa2115eb1c6bc83213eef559f10d0cd21a6d159f3a8910fc13d3a2c031eb3394e7a7928df1d854122b0dc032cb3272adc131ed8bd6e82af43294db9b0640189ebf6da9922af531638f7f71282c240518559e3c839767d78b5b5031f1a88b13028a55587f15a047cd2f565bad97a9a50afab1699397dcc92f10bc0140d2a796686253eabf412ea85e70c0c1d47a22b803fcf94af4ad3dda0dca583ff830b57b2cf86e1c2c0dd15b2a26372f3e43a1300226d", 16).unwrap();
3525    let rsa = RSA_4096_u64::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3526    let message = [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000];
3527
3528    println!("RSA_4096_u64: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3529    println!("RSA_4096_u64: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3530    print!("RSA_4096_u64: Message = [");
3531    for m in message
3532        { print!("{:#X}, ", m); }
3533    println!("]");
3534
3535    let mut m = [0u64; 64];
3536    unsafe { copy_nonoverlapping(message.as_ptr() as *const u64, m.as_mut_ptr(), 64); }
3537    let cipher = rsa.encrypt_unit(&m);
3538    print!("RSA_4096_u64: Cipher = [");
3539    for c in cipher
3540        { print!("{:#X}, ", c); }
3541    println!("]");
3542
3543    assert_eq!(cipher, [0xD4FB55D89CB6ED19, 0x2F1811F6C122734C, 0x93B93341A5114AFF, 0xCBABA04C6CEDD077, 0xDDBB2719B0873367, 0x179492738060C197, 0xA67579109EBA2656, 0x12836967F832F645, 0x501E88792ED8B7ED, 0x6AEBB339920F899A, 0xDCB94159B416EC59, 0x2457DBC7D24DF92D, 0x6308ADE8BF6C9361, 0xF8641498B7E0A22C, 0x994F70D220367D0C, 0x96EA933B2E1B1007, 0x78C0C56565D11AD3, 0xC9A3DB5B2E327C9, 0xFFBB35222A5DA924, 0x14F47769A6187825, 0xDCBCE40A3E3E549A, 0xECC3512027323317, 0xC47F38FD0AEEB915, 0x2D7AC41D6A9DEF00, 0xB5347E79E9EBA3C, 0x936934BDE9F682DF, 0x7709F812715BC0D4, 0x3BD64D4344E0BDF7, 0x54F45FBECCD014E8, 0x71FD352A2E2A4FEE, 0x81683594527F1386, 0xE19A6E625370C3FF, 0x4AAB76D639978561, 0xB5EE9ED73A41D681, 0xEF7222B1465EA91C, 0x975E545D8098DF3C, 0x2FD8CF10DE5D873A, 0xDF0246B0FF806337, 0xB185DA9D12ABF503, 0x746198FCE1AD50CB, 0x48A7C5FE86727129, 0xC1B4D550FCA33C4C, 0x13DE163BF2FC1DFE, 0x45C844187E9624D7, 0xB7F566C7CF8DEA12, 0x81E6CDC446CFC115, 0xB41D8E6CD8BCFF70, 0x3FCD96B9F7ABF3F, 0xDBE711C640203895, 0x4F0F98A1EDDB977A, 0x34AC5734E4060DC6, 0x860425FA884CDEB5, 0x89E2B6CFB9D26FF9, 0xC2F379794351640, 0xC5570B76C944A9CC, 0x5455267A15CF86D7, 0x89C4D05D0DF827B3, 0x71F3A803D3C161C5, 0xCE1A255275ECEA5, 0x6E115E154B055080, 0xF1A92FD51D64B0AA, 0x37FC92CA9A1B3206, 0xD18E769A62EE5AFA, 0xEC82A614F5CCF050]);
3544    let recovered = rsa.decrypt_unit(&cipher);
3545    let mut rr = [0u128; 32];
3546    unsafe { copy_nonoverlapping(recovered.as_ptr(), rr.as_mut_ptr() as *mut u64, 64); }
3547    
3548    print!("RSA_4096_u64: Recovered = [");
3549    for r in rr
3550        { print!("{:#X}, ", r); }
3551    println!("]");
3552    assert_eq!(rr, [0x123456789ABCDEF00FEDCBA987654321, 0x11223344556677889900AABBCCDDEEFF, 0xFFEEDDCCBBAA00998877665544332211, 0x1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0xF1E2D3C4B5A6079889706A5B4C3D2E1F, 0x102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x11112222333344445555666677778888, 0x99990000AAAABBBBCCCCDDDDEEEEFFFF, 0xFEDCBA98765432100123456789ABCDEF, 0x9900AABBCCDDEEFF1122334455667788, 0x8877665544332211FFEEDDCCBBAA0099, 0x9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x879605A4B3C2D1E00F1E2D3C4B5A6978, 0x98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x111122223333444499990000AAAABBBB, 0x5555666677778888CCCCDDDDEEEEFFFF, 0x11111111111111111111111111111111, 0x22222222222222222222222222222222, 0x33333333333333333333333333333333, 0x44444444444444444444444444444444, 0x55555555555555555555555555555555, 0x66666666666666666666666666666666, 0x77777777777777777777777777777777, 0x88888888888888888888888888888888, 0x99999999999999999999999999999999, 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0xBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0xCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0xDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x0]);
3553    assert_eq!(rr, message);
3554
3555    // Example for RSA_1024_u32
3556    use cryptocol::asymmetric::RSA_1024_u32;
3557
3558    let public_key = U1024::from(5_u8);
3559    let private_key = U1024::from_str_radix("3D4990127949DDB062F2BE417E8EACAB79F3215C306217A0C5974FEE15D4CB6D9348A161523F49F83D1CD49CB261C98259F04FECED08E08F3F0C5EF1FE695A291782AA0B9500911299CDAE0297337E9CB219F71411133C4440184C349FAC497EE809ED6D1B472409AB88A99B843FD61DBBBBC4C9686871D5221D137F89AF64CD", 16).unwrap();
3560    let modulus = U1024::from_str_radix("9937e82e2f38aa38f75edba3bc64afacb0dfd36678f53b11edfa47d33693fc91f03593734d9e38ec98c81387bdf477c5e0d8c7d0509631661d9eed5cfc07616849dec988a75bd976cd83c7b6b38cb3573d776435a28b33f2dbbcebb09e693d911fff63ff88e4de8c730a5ee8023b1c6e18a1551e949ebca6b1fedeff1dec08a9", 16).unwrap();
3561    let rsa = RSA_1024_u32::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3562    let message = [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6978879605A4B3C2D1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF];
3563
3564    println!("RSA_1024_u32: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3565    println!("RSA_1024_u32: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3566    print!("RSA_1024_u32: Message = [");
3567    for m in message
3568        { print!("{:#X}, ", m); }
3569    println!("]");
3570
3571    let mut m = [0u32; 32];
3572    unsafe { copy_nonoverlapping(message.as_ptr() as *const u32, m.as_mut_ptr(), 32); }
3573    let cipher = rsa.encrypt_unit(&m);
3574    print!("RSA_1024_u32: Cipher = [");
3575    for c in cipher
3576        { print!("{:#X}, ", c); }
3577    println!("]");
3578    assert_eq!(cipher, [0x5876D910, 0x9DF1BA1, 0x3D2ABEA9, 0xF9EAF9F1, 0xB4DD00B4, 0x4238994, 0x946574F8, 0xFB00D2B7, 0xD3F9E91D, 0x26D78E8F, 0x4D1B93C, 0x7666C3CC, 0x492EA323, 0xC7EFA926, 0x95E9D5CE, 0xF32C4732, 0x748103D, 0x298576A7, 0x4342BA6D, 0xFF59D1A9, 0x9D1585DD, 0xFA9B236F, 0x7B7982E2, 0x2B80425C, 0x1112A9DA, 0xA5EA8BC7, 0x41AF7FBB, 0x557B6333, 0xFA12D78B, 0x34B8451C, 0x867DF90A, 0xB412E61E]);
3579
3580    let recovered = rsa.decrypt_unit(&cipher);
3581    let mut rr = [0u128; 8];
3582    unsafe { copy_nonoverlapping(recovered.as_ptr(), rr.as_mut_ptr() as *mut u32, 32); }
3583    
3584    print!("RSA_1024_u32: Recovered = [");
3585    for r in rr
3586        { print!("{:#X}, ", r); }
3587    println!("]");
3588    assert_eq!(rr, [0x123456789ABCDEF00FEDCBA987654321, 0x11223344556677889900AABBCCDDEEFF, 0xFFEEDDCCBBAA00998877665544332211, 0x1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0xF1E2D3C4B5A6978879605A4B3C2D1F, 0x102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x11112222333344445555666677778888, 0x99990000AAAABBBBCCCCDDDDEEEEFFFF]);
3589    assert_eq!(rr, message);
3590
3591    // Example for RSA_2048_u32
3592    use cryptocol::asymmetric::RSA_2048_u32;
3593
3594    let public_key = U2048::from(7_u8);
3595    let private_key = U2048::from_str_radix("4935A7A0CA0F94101C34BC4A3180F18FE756C4CAFAFDED502AF6B7EC89E42D89C0163CFD43CC58F90F9CEA3045B565957732102340ACF51695E3F635FBD3AAEE83F71EB37103D234B108380932372E677200AD37074BBCEEC60FBEE4AB73C8F7030F712C8A70B43A05BD10700A0C50579CE8A8AEEF96D1D8BF7EDA7CF946F64A04F4C739591D41E2D0CD9E65FA6CED2AAEAE2BB3E9CE38BD0BA06DFF1847965DBE264447EE0C1AE7452638014AA2959B1FEAE409987C65321651C896732A62F0581F87A94DC41D85C3936C369A803DB0D6BD99B346C01A74295C24260E0055BFA97013967F9D6A868E57A67EBF17A6C9D7D5FB50BEFA4A4AD93BC558B8A78297", 16).unwrap();
3596    let modulus = U2048::from_str_radix("aad28721d779aed041d06202738233a51bca75d99efb29bb0eea57d297146a416ade8e4ef3877a45246e2270a2a7425cc0ca25a796e8e68a08693e7df6433981de95f24d5d08ea7af26882c01fd616f15f56e980665b638278cf6815900e2a405c795d67edb1a48762b9265ac21cbb7718c989982f0a944f1427fdce45a59403b080b68d260dafd1fb64b374aaac80bd1f595bd0ff175ca6108fdd2f83905774f66828ba84fab66412430666d46d1b94bb0da1c9d9c9062497677ea5b6b751f1e51651d86b6d377c3b44767134496a8fe2d7157e5f17281ad156d1a05eea359bc847d2d835474e1d4dc517902ffcfb036f7444bf296ad86ab0795f058a6a7a4f", 16).unwrap();
3597    let rsa = RSA_2048_u32::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3598    let message = [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF];
3599
3600    println!("RSA_2048_u32: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3601    println!("RSA_2048_u32: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3602    print!("RSA_2048_u32: Message = [");
3603    for m in message
3604        { print!("{:#X}, ", m); }
3605    println!("]");
3606
3607    let mut m = [0u32; 64];
3608    unsafe { copy_nonoverlapping(message.as_ptr() as *const u32, m.as_mut_ptr(), 64); }
3609    let cipher = rsa.encrypt_unit(&m);
3610    print!("RSA_2048_u32: Cipher = [");
3611    for c in cipher
3612        { print!("{:#X}, ", c); }
3613    println!("]");
3614    assert_eq!(cipher, [0x47283873, 0x2CDBEDD8, 0x93922441, 0x8E8A2C0F, 0xD2483CDF, 0x712502C, 0x975FB948, 0xA5477C70, 0x5151E7A4, 0x7B83A1E1, 0x63B4157F, 0x9CB225EB, 0xF613588C, 0xA28B6E71, 0xD16F7440, 0xE80799C, 0xE5629F2E, 0x59A4DD76, 0x5CC7AF66, 0x17FD5732, 0x90E31987, 0x23B5BDDD, 0x2A329668, 0x91DA607E, 0xE2EB9B3B, 0x1DFC378F, 0x56EFB8F6, 0xA387D998, 0x7C819286, 0x7FFD1AC3, 0x81E4143F, 0x72B12533, 0x6C871DC6, 0x3317DDA8, 0x415F5497, 0x2FB59FFD, 0xF720E361, 0x515DB9B5, 0x8EB0C7D1, 0x2747A272, 0x661AB141, 0xFA4561A, 0x8E9DAD98, 0xC3DC9098, 0x6FC2E30, 0x6CCC919D, 0x44BCC6F4, 0xCA835FD1, 0xD660A677, 0xFC235E1F, 0x2D54CE65, 0x16AD846F, 0xB8FBDBC3, 0x5EBF02E, 0x63EE29D6, 0x49262F3B, 0x96CC8F26, 0x4BCD700C, 0x3362037A, 0xD909B057, 0x2D932D0D, 0x1394BCCB, 0xE545D5DF, 0x6A33D012]);
3615    let recovered = rsa.decrypt_unit(&cipher);
3616    let mut rr = [0u128; 16];
3617    unsafe { copy_nonoverlapping(recovered.as_ptr(), rr.as_mut_ptr() as *mut u32, 64); }
3618    
3619    print!("RSA_2048_u32: Recovered = [");
3620    for r in rr
3621        { print!("{:#X}, ", r); }
3622    println!("]");
3623    assert_eq!(rr, [0x123456789ABCDEF00FEDCBA987654321, 0x11223344556677889900AABBCCDDEEFF, 0xFFEEDDCCBBAA00998877665544332211, 0x1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0xF1E2D3C4B5A6079889706A5B4C3D2E1F, 0x102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x11112222333344445555666677778888, 0x99990000AAAABBBBCCCCDDDDEEEEFFFF, 0xFEDCBA98765432100123456789ABCDEF, 0x9900AABBCCDDEEFF1122334455667788, 0x8877665544332211FFEEDDCCBBAA0099, 0x9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x879605A4B3C2D1E00F1E2D3C4B5A6978, 0x98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x111122223333444499990000AAAABBBB, 0x5555666677778888CCCCDDDDEEEEFFFF]);
3624    assert_eq!(rr, message);
3625
3626    // Example for RSA_4096_u32
3627    use cryptocol::asymmetric::RSA_4096_u32;
3628
3629    let public_key = U4096::from(5_u8);
3630    let private_key = U4096::from_str_radix("65D454FB951A5CEFCA5203530570263DC58CA1F8C489801223754B92F3AFAFCF390C35A6C4F01FBFB6F70563146F1A5610816C34781F831871D946665E7752B92E522A1556DFD885332EC38E0A65A3D934C40C1B123A8181EFC7BE48657EC3437FED43EE8197E2E2F61F639DFEEBA157ED5F33B748A5ADE0881B8A377DFB4FD889732DE0F5DE07454E1845E64CD28321CF7D1B7EBACAE56F5B2EE12232927312A7D4113EACF69903245F86587EFDA359E19CAF07884D3DDD82482B1A8ACBA989933014EED53FAE4DB84A97F2CCD8CBC0C769E909CE918785EB8CA6C13232F0D88F8A0F2A124815BA1B6F5991D258B3262F012FE931BB50E90D1EB9FE3793CD8A18182768BCC1926552BDA2F452FFE5A25DADBF36F83D01FB072B463841A939F0EFAFD7E6564E7F71705CDCFB1281AF424D4EB6282F1F33ADD58DD862B3DE496D6F379BAD1E068893C3A2FFC75DDB1DC18042569AFA0F9DE44A582534BE73DA29D40E624A82A19F6D48609609600FF34BCA8E4D69F18101A3F0BAE655D5F389D568BB91E54465E5AA0FB52CA6E372A21BCDEB45EA16FC36FEFDBC9FF3F295B53C25458C75EE869755A4E4557BD639DE5D80AA9FDE709A53F4D6D135FD8611D0EED5CBB9430C13292C74DF5380BCDE17A4C3BF0E692E505683560CBA89C931934C76B4C499A5092C586EE014732761CEB7C9D67BF43472D89644D2250DAA0E82CD", 16).unwrap();
3631    let modulus = U4096::from_str_radix("7f496a3a7a60f42bbce68427c6cc2fcd36efca76f5abe016ac529e77b09b9bc3074f4310762c27afa4b4c6bbd98ae0eb94a1c741962763de8e4f97fff615276779e6b49aac97cea67ffa74718cff0ccf81f50f21d6c921e26bb9adda7ede74145fe894ea21fddb9bb3a73c857ea689ade8b700a51acf1958aa226cc55d7a23ceabcff95933558916a19e575fe00723ea435c625e697d9ecb31fa996abf370fd751c9158e58343f43ed7767ee9ebd0c305a03dac96a608d54e2da35e12d7e93ebf7fc1a2a8a8f99e1265d3def800efeb0f944634c4235e967666fd0717ebfad0eb36c92f496da1b28a24b2ff646eedfefbac17be37e2a25235066687dc578c0ee1a0790c4437f848078eefd7082f84fc343c1accf9cc24f5e8e0eb021f4dd25fd308c91a79c416639c63e8ad87d452a2d25b4d37356a8d8e70b82df6226fbda1fb7d5a6346d18a9ec79401d6bb3776fa2115eb1c6bc83213eef559f10d0cd21a6d159f3a8910fc13d3a2c031eb3394e7a7928df1d854122b0dc032cb3272adc131ed8bd6e82af43294db9b0640189ebf6da9922af531638f7f71282c240518559e3c839767d78b5b5031f1a88b13028a55587f15a047cd2f565bad97a9a50afab1699397dcc92f10bc0140d2a796686253eabf412ea85e70c0c1d47a22b803fcf94af4ad3dda0dca583ff830b57b2cf86e1c2c0dd15b2a26372f3e43a1300226d", 16).unwrap();
3632    let rsa = RSA_4096_u32::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3633    let message = [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000];
3634
3635    println!("RSA_4096_u32: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3636    println!("RSA_4096_u32: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3637    print!("RSA_4096_u32: Message = [");
3638    for m in message
3639        { print!("{:#X}, ", m); }
3640    println!("]");
3641
3642    let mut m = [0u32; 128];
3643    unsafe { copy_nonoverlapping(message.as_ptr() as *const u32, m.as_mut_ptr(), 128); }
3644    let cipher = rsa.encrypt_unit(&m);
3645    print!("RSA_4096_u32: Cipher = [");
3646    for c in cipher
3647        { print!("{:#X}, ", c); }
3648    println!("]");
3649
3650    assert_eq!(cipher, [0x9CB6ED19, 0xD4FB55D8, 0xC122734C, 0x2F1811F6, 0xA5114AFF, 0x93B93341, 0x6CEDD077, 0xCBABA04C, 0xB0873367, 0xDDBB2719, 0x8060C197, 0x17949273, 0x9EBA2656, 0xA6757910, 0xF832F645, 0x12836967, 0x2ED8B7ED, 0x501E8879, 0x920F899A, 0x6AEBB339, 0xB416EC59, 0xDCB94159, 0xD24DF92D, 0x2457DBC7, 0xBF6C9361, 0x6308ADE8, 0xB7E0A22C, 0xF8641498, 0x20367D0C, 0x994F70D2, 0x2E1B1007, 0x96EA933B, 0x65D11AD3, 0x78C0C565, 0xB2E327C9, 0xC9A3DB5, 0x2A5DA924, 0xFFBB3522, 0xA6187825, 0x14F47769, 0x3E3E549A, 0xDCBCE40A, 0x27323317, 0xECC35120, 0xAEEB915, 0xC47F38FD, 0x6A9DEF00, 0x2D7AC41D, 0x9E9EBA3C, 0xB5347E7, 0xE9F682DF, 0x936934BD, 0x715BC0D4, 0x7709F812, 0x44E0BDF7, 0x3BD64D43, 0xCCD014E8, 0x54F45FBE, 0x2E2A4FEE, 0x71FD352A, 0x527F1386, 0x81683594, 0x5370C3FF, 0xE19A6E62, 0x39978561, 0x4AAB76D6, 0x3A41D681, 0xB5EE9ED7, 0x465EA91C, 0xEF7222B1, 0x8098DF3C, 0x975E545D, 0xDE5D873A, 0x2FD8CF10, 0xFF806337, 0xDF0246B0, 0x12ABF503, 0xB185DA9D, 0xE1AD50CB, 0x746198FC, 0x86727129, 0x48A7C5FE, 0xFCA33C4C, 0xC1B4D550, 0xF2FC1DFE, 0x13DE163B, 0x7E9624D7, 0x45C84418, 0xCF8DEA12, 0xB7F566C7, 0x46CFC115, 0x81E6CDC4, 0xD8BCFF70, 0xB41D8E6C, 0x9F7ABF3F, 0x3FCD96B, 0x40203895, 0xDBE711C6, 0xEDDB977A, 0x4F0F98A1, 0xE4060DC6, 0x34AC5734, 0x884CDEB5, 0x860425FA, 0xB9D26FF9, 0x89E2B6CF, 0x94351640, 0xC2F3797, 0xC944A9CC, 0xC5570B76, 0x15CF86D7, 0x5455267A, 0xDF827B3, 0x89C4D05D, 0xD3C161C5, 0x71F3A803, 0x275ECEA5, 0xCE1A255, 0x4B055080, 0x6E115E15, 0x1D64B0AA, 0xF1A92FD5, 0x9A1B3206, 0x37FC92CA, 0x62EE5AFA, 0xD18E769A, 0xF5CCF050, 0xEC82A614]);
3651    let recovered = rsa.decrypt_unit(&cipher);
3652    let mut rr = [0u128; 32];
3653    unsafe { copy_nonoverlapping(recovered.as_ptr(), rr.as_mut_ptr() as *mut u32, 128); }
3654    
3655    print!("RSA_4096_u32: Recovered = [");
3656    for r in rr
3657        { print!("{:#X}, ", r); }
3658    println!("]");
3659    assert_eq!(rr, [0x123456789ABCDEF00FEDCBA987654321, 0x11223344556677889900AABBCCDDEEFF, 0xFFEEDDCCBBAA00998877665544332211, 0x1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0xF1E2D3C4B5A6079889706A5B4C3D2E1F, 0x102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x11112222333344445555666677778888, 0x99990000AAAABBBBCCCCDDDDEEEEFFFF, 0xFEDCBA98765432100123456789ABCDEF, 0x9900AABBCCDDEEFF1122334455667788, 0x8877665544332211FFEEDDCCBBAA0099, 0x9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x879605A4B3C2D1E00F1E2D3C4B5A6978, 0x98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x111122223333444499990000AAAABBBB, 0x5555666677778888CCCCDDDDEEEEFFFF, 0x11111111111111111111111111111111, 0x22222222222222222222222222222222, 0x33333333333333333333333333333333, 0x44444444444444444444444444444444, 0x55555555555555555555555555555555, 0x66666666666666666666666666666666, 0x77777777777777777777777777777777, 0x88888888888888888888888888888888, 0x99999999999999999999999999999999, 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0xBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0xCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0xDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x0]);
3660    assert_eq!(rr, message);
3661
3662    // Example for RSA_1024_u16
3663    use cryptocol::asymmetric::RSA_1024_u16;
3664
3665    let public_key = U1024::from(5_u8);
3666    let private_key = U1024::from_str_radix("3D4990127949DDB062F2BE417E8EACAB79F3215C306217A0C5974FEE15D4CB6D9348A161523F49F83D1CD49CB261C98259F04FECED08E08F3F0C5EF1FE695A291782AA0B9500911299CDAE0297337E9CB219F71411133C4440184C349FAC497EE809ED6D1B472409AB88A99B843FD61DBBBBC4C9686871D5221D137F89AF64CD", 16).unwrap();
3667    let modulus = U1024::from_str_radix("9937e82e2f38aa38f75edba3bc64afacb0dfd36678f53b11edfa47d33693fc91f03593734d9e38ec98c81387bdf477c5e0d8c7d0509631661d9eed5cfc07616849dec988a75bd976cd83c7b6b38cb3573d776435a28b33f2dbbcebb09e693d911fff63ff88e4de8c730a5ee8023b1c6e18a1551e949ebca6b1fedeff1dec08a9", 16).unwrap();
3668    let rsa = RSA_1024_u16::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3669    let message = [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6978879605A4B3C2D1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF];
3670
3671    println!("RSA_1024_u16: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3672    println!("RSA_1024_u16: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3673    print!("RSA_1024_u16: Message = [");
3674    for m in message
3675        { print!("{:#X}, ", m); }
3676    println!("]");
3677
3678    let mut m = [0u16; 64];
3679    unsafe { copy_nonoverlapping(message.as_ptr() as *const u16, m.as_mut_ptr(), 64); }
3680    let cipher = rsa.encrypt_unit(&m);
3681    print!("RSA_1024_u16: Cipher = [");
3682    for c in cipher
3683        { print!("{:#X}, ", c); }
3684    println!("]");
3685    assert_eq!(cipher, [0xD910, 0x5876, 0x1BA1, 0x9DF, 0xBEA9, 0x3D2A, 0xF9F1, 0xF9EA, 0xB4, 0xB4DD, 0x8994, 0x423, 0x74F8, 0x9465, 0xD2B7, 0xFB00, 0xE91D, 0xD3F9, 0x8E8F, 0x26D7, 0xB93C, 0x4D1, 0xC3CC, 0x7666, 0xA323, 0x492E, 0xA926, 0xC7EF, 0xD5CE, 0x95E9, 0x4732, 0xF32C, 0x103D, 0x748, 0x76A7, 0x2985, 0xBA6D, 0x4342, 0xD1A9, 0xFF59, 0x85DD, 0x9D15, 0x236F, 0xFA9B, 0x82E2, 0x7B79, 0x425C, 0x2B80, 0xA9DA, 0x1112, 0x8BC7, 0xA5EA, 0x7FBB, 0x41AF, 0x6333, 0x557B, 0xD78B, 0xFA12, 0x451C, 0x34B8, 0xF90A, 0x867D, 0xE61E, 0xB412]);
3686
3687    let recovered = rsa.decrypt_unit(&cipher);
3688    let mut rr = [0u128; 8];
3689    unsafe { copy_nonoverlapping(recovered.as_ptr(), rr.as_mut_ptr() as *mut u16, 64); }
3690    
3691    print!("RSA_1024_u16: Recovered = [");
3692    for r in rr
3693        { print!("{:#X}, ", r); }
3694    println!("]");
3695    assert_eq!(rr, [0x123456789ABCDEF00FEDCBA987654321, 0x11223344556677889900AABBCCDDEEFF, 0xFFEEDDCCBBAA00998877665544332211, 0x1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0xF1E2D3C4B5A6978879605A4B3C2D1F, 0x102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x11112222333344445555666677778888, 0x99990000AAAABBBBCCCCDDDDEEEEFFFF]);
3696    assert_eq!(rr, message);
3697
3698    // Example for RSA_2048_u16
3699    use cryptocol::asymmetric::RSA_2048_u16;
3700
3701    let public_key = U2048::from(7_u8);
3702    let private_key = U2048::from_str_radix("4935A7A0CA0F94101C34BC4A3180F18FE756C4CAFAFDED502AF6B7EC89E42D89C0163CFD43CC58F90F9CEA3045B565957732102340ACF51695E3F635FBD3AAEE83F71EB37103D234B108380932372E677200AD37074BBCEEC60FBEE4AB73C8F7030F712C8A70B43A05BD10700A0C50579CE8A8AEEF96D1D8BF7EDA7CF946F64A04F4C739591D41E2D0CD9E65FA6CED2AAEAE2BB3E9CE38BD0BA06DFF1847965DBE264447EE0C1AE7452638014AA2959B1FEAE409987C65321651C896732A62F0581F87A94DC41D85C3936C369A803DB0D6BD99B346C01A74295C24260E0055BFA97013967F9D6A868E57A67EBF17A6C9D7D5FB50BEFA4A4AD93BC558B8A78297", 16).unwrap();
3703    let modulus = U2048::from_str_radix("aad28721d779aed041d06202738233a51bca75d99efb29bb0eea57d297146a416ade8e4ef3877a45246e2270a2a7425cc0ca25a796e8e68a08693e7df6433981de95f24d5d08ea7af26882c01fd616f15f56e980665b638278cf6815900e2a405c795d67edb1a48762b9265ac21cbb7718c989982f0a944f1427fdce45a59403b080b68d260dafd1fb64b374aaac80bd1f595bd0ff175ca6108fdd2f83905774f66828ba84fab66412430666d46d1b94bb0da1c9d9c9062497677ea5b6b751f1e51651d86b6d377c3b44767134496a8fe2d7157e5f17281ad156d1a05eea359bc847d2d835474e1d4dc517902ffcfb036f7444bf296ad86ab0795f058a6a7a4f", 16).unwrap();
3704    let rsa = RSA_2048_u16::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3705    let message = [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF];
3706
3707    println!("RSA_2048_u16: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3708    println!("RSA_2048_u16: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3709    print!("RSA_2048_u16: Message = [");
3710    for m in message
3711        { print!("{:#X}, ", m); }
3712    println!("]");
3713
3714    let mut m = [0u16; 128];
3715    unsafe { copy_nonoverlapping(message.as_ptr() as *const u16, m.as_mut_ptr(), 128); }
3716    let cipher = rsa.encrypt_unit(&m);
3717    print!("RSA_2048_u16: Cipher = [");
3718    for c in cipher
3719        { print!("{:#X}, ", c); }
3720    println!("]");
3721    assert_eq!(cipher, [0x3873, 0x4728, 0xEDD8, 0x2CDB, 0x2441, 0x9392, 0x2C0F, 0x8E8A, 0x3CDF, 0xD248, 0x502C, 0x712, 0xB948, 0x975F, 0x7C70, 0xA547, 0xE7A4, 0x5151, 0xA1E1, 0x7B83, 0x157F, 0x63B4, 0x25EB, 0x9CB2, 0x588C, 0xF613, 0x6E71, 0xA28B, 0x7440, 0xD16F, 0x799C, 0xE80, 0x9F2E, 0xE562, 0xDD76, 0x59A4, 0xAF66, 0x5CC7, 0x5732, 0x17FD, 0x1987, 0x90E3, 0xBDDD, 0x23B5, 0x9668, 0x2A32, 0x607E, 0x91DA, 0x9B3B, 0xE2EB, 0x378F, 0x1DFC, 0xB8F6, 0x56EF, 0xD998, 0xA387, 0x9286, 0x7C81, 0x1AC3, 0x7FFD, 0x143F, 0x81E4, 0x2533, 0x72B1, 0x1DC6, 0x6C87, 0xDDA8, 0x3317, 0x5497, 0x415F, 0x9FFD, 0x2FB5, 0xE361, 0xF720, 0xB9B5, 0x515D, 0xC7D1, 0x8EB0, 0xA272, 0x2747, 0xB141, 0x661A, 0x561A, 0xFA4, 0xAD98, 0x8E9D, 0x9098, 0xC3DC, 0x2E30, 0x6FC, 0x919D, 0x6CCC, 0xC6F4, 0x44BC, 0x5FD1, 0xCA83, 0xA677, 0xD660, 0x5E1F, 0xFC23, 0xCE65, 0x2D54, 0x846F, 0x16AD, 0xDBC3, 0xB8FB, 0xF02E, 0x5EB, 0x29D6, 0x63EE, 0x2F3B, 0x4926, 0x8F26, 0x96CC, 0x700C, 0x4BCD, 0x37A, 0x3362, 0xB057, 0xD909, 0x2D0D, 0x2D93, 0xBCCB, 0x1394, 0xD5DF, 0xE545, 0xD012, 0x6A33]);
3722    let recovered = rsa.decrypt_unit(&cipher);
3723    let mut rr = [0u128; 16];
3724    unsafe { copy_nonoverlapping(recovered.as_ptr(), rr.as_mut_ptr() as *mut u16, 128); }
3725    
3726    print!("RSA_2048_u16: Recovered = [");
3727    for r in rr
3728        { print!("{:#X}, ", r); }
3729    println!("]");
3730    assert_eq!(rr, [0x123456789ABCDEF00FEDCBA987654321, 0x11223344556677889900AABBCCDDEEFF, 0xFFEEDDCCBBAA00998877665544332211, 0x1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0xF1E2D3C4B5A6079889706A5B4C3D2E1F, 0x102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x11112222333344445555666677778888, 0x99990000AAAABBBBCCCCDDDDEEEEFFFF, 0xFEDCBA98765432100123456789ABCDEF, 0x9900AABBCCDDEEFF1122334455667788, 0x8877665544332211FFEEDDCCBBAA0099, 0x9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x879605A4B3C2D1E00F1E2D3C4B5A6978, 0x98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x111122223333444499990000AAAABBBB, 0x5555666677778888CCCCDDDDEEEEFFFF]);
3731    assert_eq!(rr, message);
3732
3733    // Example for RSA_4096_u16
3734    use cryptocol::asymmetric::RSA_4096_u16;
3735
3736    let public_key = U4096::from(5_u8);
3737    let private_key = U4096::from_str_radix("65D454FB951A5CEFCA5203530570263DC58CA1F8C489801223754B92F3AFAFCF390C35A6C4F01FBFB6F70563146F1A5610816C34781F831871D946665E7752B92E522A1556DFD885332EC38E0A65A3D934C40C1B123A8181EFC7BE48657EC3437FED43EE8197E2E2F61F639DFEEBA157ED5F33B748A5ADE0881B8A377DFB4FD889732DE0F5DE07454E1845E64CD28321CF7D1B7EBACAE56F5B2EE12232927312A7D4113EACF69903245F86587EFDA359E19CAF07884D3DDD82482B1A8ACBA989933014EED53FAE4DB84A97F2CCD8CBC0C769E909CE918785EB8CA6C13232F0D88F8A0F2A124815BA1B6F5991D258B3262F012FE931BB50E90D1EB9FE3793CD8A18182768BCC1926552BDA2F452FFE5A25DADBF36F83D01FB072B463841A939F0EFAFD7E6564E7F71705CDCFB1281AF424D4EB6282F1F33ADD58DD862B3DE496D6F379BAD1E068893C3A2FFC75DDB1DC18042569AFA0F9DE44A582534BE73DA29D40E624A82A19F6D48609609600FF34BCA8E4D69F18101A3F0BAE655D5F389D568BB91E54465E5AA0FB52CA6E372A21BCDEB45EA16FC36FEFDBC9FF3F295B53C25458C75EE869755A4E4557BD639DE5D80AA9FDE709A53F4D6D135FD8611D0EED5CBB9430C13292C74DF5380BCDE17A4C3BF0E692E505683560CBA89C931934C76B4C499A5092C586EE014732761CEB7C9D67BF43472D89644D2250DAA0E82CD", 16).unwrap();
3738    let modulus = U4096::from_str_radix("7f496a3a7a60f42bbce68427c6cc2fcd36efca76f5abe016ac529e77b09b9bc3074f4310762c27afa4b4c6bbd98ae0eb94a1c741962763de8e4f97fff615276779e6b49aac97cea67ffa74718cff0ccf81f50f21d6c921e26bb9adda7ede74145fe894ea21fddb9bb3a73c857ea689ade8b700a51acf1958aa226cc55d7a23ceabcff95933558916a19e575fe00723ea435c625e697d9ecb31fa996abf370fd751c9158e58343f43ed7767ee9ebd0c305a03dac96a608d54e2da35e12d7e93ebf7fc1a2a8a8f99e1265d3def800efeb0f944634c4235e967666fd0717ebfad0eb36c92f496da1b28a24b2ff646eedfefbac17be37e2a25235066687dc578c0ee1a0790c4437f848078eefd7082f84fc343c1accf9cc24f5e8e0eb021f4dd25fd308c91a79c416639c63e8ad87d452a2d25b4d37356a8d8e70b82df6226fbda1fb7d5a6346d18a9ec79401d6bb3776fa2115eb1c6bc83213eef559f10d0cd21a6d159f3a8910fc13d3a2c031eb3394e7a7928df1d854122b0dc032cb3272adc131ed8bd6e82af43294db9b0640189ebf6da9922af531638f7f71282c240518559e3c839767d78b5b5031f1a88b13028a55587f15a047cd2f565bad97a9a50afab1699397dcc92f10bc0140d2a796686253eabf412ea85e70c0c1d47a22b803fcf94af4ad3dda0dca583ff830b57b2cf86e1c2c0dd15b2a26372f3e43a1300226d", 16).unwrap();
3739    let rsa = RSA_4096_u16::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3740    let message = [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000];
3741
3742    println!("RSA_4096_u16: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3743    println!("RSA_4096_u16: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3744    print!("RSA_4096_u16: Message = [");
3745    for m in message
3746        { print!("{:#X}, ", m); }
3747    println!("]");
3748
3749    let mut m = [0u16; 256];
3750    unsafe { copy_nonoverlapping(message.as_ptr() as *const u16, m.as_mut_ptr(), 256); }
3751    let cipher = rsa.encrypt_unit(&m);
3752    print!("RSA_4096_u16: Cipher = [");
3753    for c in cipher
3754        { print!("{:#X}, ", c); }
3755    println!("]");
3756
3757    assert_eq!(cipher, [0xED19, 0x9CB6, 0x55D8, 0xD4FB, 0x734C, 0xC122, 0x11F6, 0x2F18, 0x4AFF, 0xA511, 0x3341, 0x93B9, 0xD077, 0x6CED, 0xA04C, 0xCBAB, 0x3367, 0xB087, 0x2719, 0xDDBB, 0xC197, 0x8060, 0x9273, 0x1794, 0x2656, 0x9EBA, 0x7910, 0xA675, 0xF645, 0xF832, 0x6967, 0x1283, 0xB7ED, 0x2ED8, 0x8879, 0x501E, 0x899A, 0x920F, 0xB339, 0x6AEB, 0xEC59, 0xB416, 0x4159, 0xDCB9, 0xF92D, 0xD24D, 0xDBC7, 0x2457, 0x9361, 0xBF6C, 0xADE8, 0x6308, 0xA22C, 0xB7E0, 0x1498, 0xF864, 0x7D0C, 0x2036, 0x70D2, 0x994F, 0x1007, 0x2E1B, 0x933B, 0x96EA, 0x1AD3, 0x65D1, 0xC565, 0x78C0, 0x27C9, 0xB2E3, 0x3DB5, 0xC9A, 0xA924, 0x2A5D, 0x3522, 0xFFBB, 0x7825, 0xA618, 0x7769, 0x14F4, 0x549A, 0x3E3E, 0xE40A, 0xDCBC, 0x3317, 0x2732, 0x5120, 0xECC3, 0xB915, 0xAEE, 0x38FD, 0xC47F, 0xEF00, 0x6A9D, 0xC41D, 0x2D7A, 0xBA3C, 0x9E9E, 0x47E7, 0xB53, 0x82DF, 0xE9F6, 0x34BD, 0x9369, 0xC0D4, 0x715B, 0xF812, 0x7709, 0xBDF7, 0x44E0, 0x4D43, 0x3BD6, 0x14E8, 0xCCD0, 0x5FBE, 0x54F4, 0x4FEE, 0x2E2A, 0x352A, 0x71FD, 0x1386, 0x527F, 0x3594, 0x8168, 0xC3FF, 0x5370, 0x6E62, 0xE19A, 0x8561, 0x3997, 0x76D6, 0x4AAB, 0xD681, 0x3A41, 0x9ED7, 0xB5EE, 0xA91C, 0x465E, 0x22B1, 0xEF72, 0xDF3C, 0x8098, 0x545D, 0x975E, 0x873A, 0xDE5D, 0xCF10, 0x2FD8, 0x6337, 0xFF80, 0x46B0, 0xDF02, 0xF503, 0x12AB, 0xDA9D, 0xB185, 0x50CB, 0xE1AD, 0x98FC, 0x7461, 0x7129, 0x8672, 0xC5FE, 0x48A7, 0x3C4C, 0xFCA3, 0xD550, 0xC1B4, 0x1DFE, 0xF2FC, 0x163B, 0x13DE, 0x24D7, 0x7E96, 0x4418, 0x45C8, 0xEA12, 0xCF8D, 0x66C7, 0xB7F5, 0xC115, 0x46CF, 0xCDC4, 0x81E6, 0xFF70, 0xD8BC, 0x8E6C, 0xB41D, 0xBF3F, 0x9F7A, 0xD96B, 0x3FC, 0x3895, 0x4020, 0x11C6, 0xDBE7, 0x977A, 0xEDDB, 0x98A1, 0x4F0F, 0xDC6, 0xE406, 0x5734, 0x34AC, 0xDEB5, 0x884C, 0x25FA, 0x8604, 0x6FF9, 0xB9D2, 0xB6CF, 0x89E2, 0x1640, 0x9435, 0x3797, 0xC2F, 0xA9CC, 0xC944, 0xB76, 0xC557, 0x86D7, 0x15CF, 0x267A, 0x5455, 0x27B3, 0xDF8, 0xD05D, 0x89C4, 0x61C5, 0xD3C1, 0xA803, 0x71F3, 0xCEA5, 0x275E, 0xA255, 0xCE1, 0x5080, 0x4B05, 0x5E15, 0x6E11, 0xB0AA, 0x1D64, 0x2FD5, 0xF1A9, 0x3206, 0x9A1B, 0x92CA, 0x37FC, 0x5AFA, 0x62EE, 0x769A, 0xD18E, 0xF050, 0xF5CC, 0xA614, 0xEC82]);
3758    let recovered = rsa.decrypt_unit(&cipher);
3759    let mut rr = [0u128; 32];
3760    unsafe { copy_nonoverlapping(recovered.as_ptr(), rr.as_mut_ptr() as *mut u16, 256); }
3761    
3762    print!("RSA_4096_u16: Recovered = [");
3763    for r in rr
3764        { print!("{:#X}, ", r); }
3765    println!("]");
3766    assert_eq!(rr, [0x123456789ABCDEF00FEDCBA987654321, 0x11223344556677889900AABBCCDDEEFF, 0xFFEEDDCCBBAA00998877665544332211, 0x1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0xF1E2D3C4B5A6079889706A5B4C3D2E1F, 0x102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x11112222333344445555666677778888, 0x99990000AAAABBBBCCCCDDDDEEEEFFFF, 0xFEDCBA98765432100123456789ABCDEF, 0x9900AABBCCDDEEFF1122334455667788, 0x8877665544332211FFEEDDCCBBAA0099, 0x9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x879605A4B3C2D1E00F1E2D3C4B5A6978, 0x98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x111122223333444499990000AAAABBBB, 0x5555666677778888CCCCDDDDEEEEFFFF, 0x11111111111111111111111111111111, 0x22222222222222222222222222222222, 0x33333333333333333333333333333333, 0x44444444444444444444444444444444, 0x55555555555555555555555555555555, 0x66666666666666666666666666666666, 0x77777777777777777777777777777777, 0x88888888888888888888888888888888, 0x99999999999999999999999999999999, 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0xBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0xCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0xDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x0]);
3767    assert_eq!(rr, message);
3768
3769    // Example for RSA_1024_u8
3770    use cryptocol::asymmetric::RSA_1024_u8;
3771
3772    let public_key = U1024::from(5_u8);
3773    let private_key = U1024::from_str_radix("3D4990127949DDB062F2BE417E8EACAB79F3215C306217A0C5974FEE15D4CB6D9348A161523F49F83D1CD49CB261C98259F04FECED08E08F3F0C5EF1FE695A291782AA0B9500911299CDAE0297337E9CB219F71411133C4440184C349FAC497EE809ED6D1B472409AB88A99B843FD61DBBBBC4C9686871D5221D137F89AF64CD", 16).unwrap();
3774    let modulus = U1024::from_str_radix("9937e82e2f38aa38f75edba3bc64afacb0dfd36678f53b11edfa47d33693fc91f03593734d9e38ec98c81387bdf477c5e0d8c7d0509631661d9eed5cfc07616849dec988a75bd976cd83c7b6b38cb3573d776435a28b33f2dbbcebb09e693d911fff63ff88e4de8c730a5ee8023b1c6e18a1551e949ebca6b1fedeff1dec08a9", 16).unwrap();
3775    let rsa = RSA_1024_u8::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3776    let message = [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6978879605A4B3C2D1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF];
3777
3778    println!("RSA_1024_u8: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3779    println!("RSA_1024_u8: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3780    print!("RSA_1024_u8: Message = [");
3781    for m in message
3782        { print!("{:#X}, ", m); }
3783    println!("]");
3784
3785    let mut m = [0u8; 128];
3786    unsafe { copy_nonoverlapping(message.as_ptr() as *const u8, m.as_mut_ptr(), 128); }
3787    let cipher = rsa.encrypt_unit(&m);
3788    print!("RSA_1024_u8: Cipher = [");
3789    for c in cipher
3790        { print!("{:#X}, ", c); }
3791    println!("]");
3792    assert_eq!(cipher, [0x10, 0xD9, 0x76, 0x58, 0xA1, 0x1B, 0xDF, 0x9, 0xA9, 0xBE, 0x2A, 0x3D, 0xF1, 0xF9, 0xEA, 0xF9, 0xB4, 0x0, 0xDD, 0xB4, 0x94, 0x89, 0x23, 0x4, 0xF8, 0x74, 0x65, 0x94, 0xB7, 0xD2, 0x0, 0xFB, 0x1D, 0xE9, 0xF9, 0xD3, 0x8F, 0x8E, 0xD7, 0x26, 0x3C, 0xB9, 0xD1, 0x4, 0xCC, 0xC3, 0x66, 0x76, 0x23, 0xA3, 0x2E, 0x49, 0x26, 0xA9, 0xEF, 0xC7, 0xCE, 0xD5, 0xE9, 0x95, 0x32, 0x47, 0x2C, 0xF3, 0x3D, 0x10, 0x48, 0x7, 0xA7, 0x76, 0x85, 0x29, 0x6D, 0xBA, 0x42, 0x43, 0xA9, 0xD1, 0x59, 0xFF, 0xDD, 0x85, 0x15, 0x9D, 0x6F, 0x23, 0x9B, 0xFA, 0xE2, 0x82, 0x79, 0x7B, 0x5C, 0x42, 0x80, 0x2B, 0xDA, 0xA9, 0x12, 0x11, 0xC7, 0x8B, 0xEA, 0xA5, 0xBB, 0x7F, 0xAF, 0x41, 0x33, 0x63, 0x7B, 0x55, 0x8B, 0xD7, 0x12, 0xFA, 0x1C, 0x45, 0xB8, 0x34, 0xA, 0xF9, 0x7D, 0x86, 0x1E, 0xE6, 0x12, 0xB4]);
3793
3794    let recovered = rsa.decrypt_unit(&cipher);
3795    let mut rr = [0u128; 8];
3796    unsafe { copy_nonoverlapping(recovered.as_ptr(), rr.as_mut_ptr() as *mut u8, 128); }
3797    
3798    print!("RSA_1024_u8: Recovered = [");
3799    for r in rr
3800        { print!("{:#X}, ", r); }
3801    println!("]");
3802    assert_eq!(rr, [0x123456789ABCDEF00FEDCBA987654321, 0x11223344556677889900AABBCCDDEEFF, 0xFFEEDDCCBBAA00998877665544332211, 0x1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0xF1E2D3C4B5A6978879605A4B3C2D1F, 0x102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x11112222333344445555666677778888, 0x99990000AAAABBBBCCCCDDDDEEEEFFFF]);
3803    assert_eq!(rr, message);
3804
3805    // Example for RSA_2048_u8
3806    use cryptocol::asymmetric::RSA_2048_u8;
3807
3808    let public_key = U2048::from(7_u8);
3809    let private_key = U2048::from_str_radix("4935A7A0CA0F94101C34BC4A3180F18FE756C4CAFAFDED502AF6B7EC89E42D89C0163CFD43CC58F90F9CEA3045B565957732102340ACF51695E3F635FBD3AAEE83F71EB37103D234B108380932372E677200AD37074BBCEEC60FBEE4AB73C8F7030F712C8A70B43A05BD10700A0C50579CE8A8AEEF96D1D8BF7EDA7CF946F64A04F4C739591D41E2D0CD9E65FA6CED2AAEAE2BB3E9CE38BD0BA06DFF1847965DBE264447EE0C1AE7452638014AA2959B1FEAE409987C65321651C896732A62F0581F87A94DC41D85C3936C369A803DB0D6BD99B346C01A74295C24260E0055BFA97013967F9D6A868E57A67EBF17A6C9D7D5FB50BEFA4A4AD93BC558B8A78297", 16).unwrap();
3810    let modulus = U2048::from_str_radix("aad28721d779aed041d06202738233a51bca75d99efb29bb0eea57d297146a416ade8e4ef3877a45246e2270a2a7425cc0ca25a796e8e68a08693e7df6433981de95f24d5d08ea7af26882c01fd616f15f56e980665b638278cf6815900e2a405c795d67edb1a48762b9265ac21cbb7718c989982f0a944f1427fdce45a59403b080b68d260dafd1fb64b374aaac80bd1f595bd0ff175ca6108fdd2f83905774f66828ba84fab66412430666d46d1b94bb0da1c9d9c9062497677ea5b6b751f1e51651d86b6d377c3b44767134496a8fe2d7157e5f17281ad156d1a05eea359bc847d2d835474e1d4dc517902ffcfb036f7444bf296ad86ab0795f058a6a7a4f", 16).unwrap();
3811    let rsa = RSA_2048_u8::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3812    let message = [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF];
3813
3814    println!("RSA_2048_u8: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3815    println!("RSA_2048_u8: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3816    print!("RSA_2048_u8: Message = [");
3817    for m in message
3818        { print!("{:#X}, ", m); }
3819    println!("]");
3820
3821    let mut m = [0u8; 256];
3822    unsafe { copy_nonoverlapping(message.as_ptr() as *const u8, m.as_mut_ptr(), 256); }
3823    let cipher = rsa.encrypt_unit(&m);
3824    print!("RSA_2048_u8: Cipher = [");
3825    for c in cipher
3826        { print!("{:#X}, ", c); }
3827    println!("]");
3828    assert_eq!(cipher, [0x73, 0x38, 0x28, 0x47, 0xD8, 0xED, 0xDB, 0x2C, 0x41, 0x24, 0x92, 0x93, 0xF, 0x2C, 0x8A, 0x8E, 0xDF, 0x3C, 0x48, 0xD2, 0x2C, 0x50, 0x12, 0x7, 0x48, 0xB9, 0x5F, 0x97, 0x70, 0x7C, 0x47, 0xA5, 0xA4, 0xE7, 0x51, 0x51, 0xE1, 0xA1, 0x83, 0x7B, 0x7F, 0x15, 0xB4, 0x63, 0xEB, 0x25, 0xB2, 0x9C, 0x8C, 0x58, 0x13, 0xF6, 0x71, 0x6E, 0x8B, 0xA2, 0x40, 0x74, 0x6F, 0xD1, 0x9C, 0x79, 0x80, 0xE, 0x2E, 0x9F, 0x62, 0xE5, 0x76, 0xDD, 0xA4, 0x59, 0x66, 0xAF, 0xC7, 0x5C, 0x32, 0x57, 0xFD, 0x17, 0x87, 0x19, 0xE3, 0x90, 0xDD, 0xBD, 0xB5, 0x23, 0x68, 0x96, 0x32, 0x2A, 0x7E, 0x60, 0xDA, 0x91, 0x3B, 0x9B, 0xEB, 0xE2, 0x8F, 0x37, 0xFC, 0x1D, 0xF6, 0xB8, 0xEF, 0x56, 0x98, 0xD9, 0x87, 0xA3, 0x86, 0x92, 0x81, 0x7C, 0xC3, 0x1A, 0xFD, 0x7F, 0x3F, 0x14, 0xE4, 0x81, 0x33, 0x25, 0xB1, 0x72, 0xC6, 0x1D, 0x87, 0x6C, 0xA8, 0xDD, 0x17, 0x33, 0x97, 0x54, 0x5F, 0x41, 0xFD, 0x9F, 0xB5, 0x2F, 0x61, 0xE3, 0x20, 0xF7, 0xB5, 0xB9, 0x5D, 0x51, 0xD1, 0xC7, 0xB0, 0x8E, 0x72, 0xA2, 0x47, 0x27, 0x41, 0xB1, 0x1A, 0x66, 0x1A, 0x56, 0xA4, 0xF, 0x98, 0xAD, 0x9D, 0x8E, 0x98, 0x90, 0xDC, 0xC3, 0x30, 0x2E, 0xFC, 0x6, 0x9D, 0x91, 0xCC, 0x6C, 0xF4, 0xC6, 0xBC, 0x44, 0xD1, 0x5F, 0x83, 0xCA, 0x77, 0xA6, 0x60, 0xD6, 0x1F, 0x5E, 0x23, 0xFC, 0x65, 0xCE, 0x54, 0x2D, 0x6F, 0x84, 0xAD, 0x16, 0xC3, 0xDB, 0xFB, 0xB8, 0x2E, 0xF0, 0xEB, 0x5, 0xD6, 0x29, 0xEE, 0x63, 0x3B, 0x2F, 0x26, 0x49, 0x26, 0x8F, 0xCC, 0x96, 0xC, 0x70, 0xCD, 0x4B, 0x7A, 0x3, 0x62, 0x33, 0x57, 0xB0, 0x9, 0xD9, 0xD, 0x2D, 0x93, 0x2D, 0xCB, 0xBC, 0x94, 0x13, 0xDF, 0xD5, 0x45, 0xE5, 0x12, 0xD0, 0x33, 0x6A]);
3829    let recovered = rsa.decrypt_unit(&cipher);
3830    let mut rr = [0u128; 16];
3831    unsafe { copy_nonoverlapping(recovered.as_ptr(), rr.as_mut_ptr() as *mut u8, 256); }
3832    
3833    print!("RSA_2048_u8: Recovered = [");
3834    for r in rr
3835        { print!("{:#X}, ", r); }
3836    println!("]");
3837    assert_eq!(rr, [0x123456789ABCDEF00FEDCBA987654321, 0x11223344556677889900AABBCCDDEEFF, 0xFFEEDDCCBBAA00998877665544332211, 0x1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0xF1E2D3C4B5A6079889706A5B4C3D2E1F, 0x102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x11112222333344445555666677778888, 0x99990000AAAABBBBCCCCDDDDEEEEFFFF, 0xFEDCBA98765432100123456789ABCDEF, 0x9900AABBCCDDEEFF1122334455667788, 0x8877665544332211FFEEDDCCBBAA0099, 0x9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x879605A4B3C2D1E00F1E2D3C4B5A6978, 0x98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x111122223333444499990000AAAABBBB, 0x5555666677778888CCCCDDDDEEEEFFFF]);
3838    assert_eq!(rr, message);
3839
3840    // Example for RSA_4096_u8
3841    use cryptocol::asymmetric::RSA_4096_u8;
3842
3843    let public_key = U4096::from(5_u8);
3844    let private_key = U4096::from_str_radix("65D454FB951A5CEFCA5203530570263DC58CA1F8C489801223754B92F3AFAFCF390C35A6C4F01FBFB6F70563146F1A5610816C34781F831871D946665E7752B92E522A1556DFD885332EC38E0A65A3D934C40C1B123A8181EFC7BE48657EC3437FED43EE8197E2E2F61F639DFEEBA157ED5F33B748A5ADE0881B8A377DFB4FD889732DE0F5DE07454E1845E64CD28321CF7D1B7EBACAE56F5B2EE12232927312A7D4113EACF69903245F86587EFDA359E19CAF07884D3DDD82482B1A8ACBA989933014EED53FAE4DB84A97F2CCD8CBC0C769E909CE918785EB8CA6C13232F0D88F8A0F2A124815BA1B6F5991D258B3262F012FE931BB50E90D1EB9FE3793CD8A18182768BCC1926552BDA2F452FFE5A25DADBF36F83D01FB072B463841A939F0EFAFD7E6564E7F71705CDCFB1281AF424D4EB6282F1F33ADD58DD862B3DE496D6F379BAD1E068893C3A2FFC75DDB1DC18042569AFA0F9DE44A582534BE73DA29D40E624A82A19F6D48609609600FF34BCA8E4D69F18101A3F0BAE655D5F389D568BB91E54465E5AA0FB52CA6E372A21BCDEB45EA16FC36FEFDBC9FF3F295B53C25458C75EE869755A4E4557BD639DE5D80AA9FDE709A53F4D6D135FD8611D0EED5CBB9430C13292C74DF5380BCDE17A4C3BF0E692E505683560CBA89C931934C76B4C499A5092C586EE014732761CEB7C9D67BF43472D89644D2250DAA0E82CD", 16).unwrap();
3845    let modulus = U4096::from_str_radix("7f496a3a7a60f42bbce68427c6cc2fcd36efca76f5abe016ac529e77b09b9bc3074f4310762c27afa4b4c6bbd98ae0eb94a1c741962763de8e4f97fff615276779e6b49aac97cea67ffa74718cff0ccf81f50f21d6c921e26bb9adda7ede74145fe894ea21fddb9bb3a73c857ea689ade8b700a51acf1958aa226cc55d7a23ceabcff95933558916a19e575fe00723ea435c625e697d9ecb31fa996abf370fd751c9158e58343f43ed7767ee9ebd0c305a03dac96a608d54e2da35e12d7e93ebf7fc1a2a8a8f99e1265d3def800efeb0f944634c4235e967666fd0717ebfad0eb36c92f496da1b28a24b2ff646eedfefbac17be37e2a25235066687dc578c0ee1a0790c4437f848078eefd7082f84fc343c1accf9cc24f5e8e0eb021f4dd25fd308c91a79c416639c63e8ad87d452a2d25b4d37356a8d8e70b82df6226fbda1fb7d5a6346d18a9ec79401d6bb3776fa2115eb1c6bc83213eef559f10d0cd21a6d159f3a8910fc13d3a2c031eb3394e7a7928df1d854122b0dc032cb3272adc131ed8bd6e82af43294db9b0640189ebf6da9922af531638f7f71282c240518559e3c839767d78b5b5031f1a88b13028a55587f15a047cd2f565bad97a9a50afab1699397dcc92f10bc0140d2a796686253eabf412ea85e70c0c1d47a22b803fcf94af4ad3dda0dca583ff830b57b2cf86e1c2c0dd15b2a26372f3e43a1300226d", 16).unwrap();
3846    let rsa = RSA_4096_u8::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3847    let message = [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000];
3848
3849    println!("RSA_4096_u8: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3850    println!("RSA_4096_u8: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3851    print!("RSA_4096_u8: Message = [");
3852    for m in message
3853        { print!("{:#X}, ", m); }
3854    println!("]");
3855
3856    let mut m = [0u8; 512];
3857    unsafe { copy_nonoverlapping(message.as_ptr() as *const u8, m.as_mut_ptr(), 512); }
3858    let cipher = rsa.encrypt_unit(&m);
3859    print!("RSA_4096_u8: Cipher = [");
3860    for c in cipher
3861        { print!("{:#X}, ", c); }
3862    println!("]");
3863
3864    assert_eq!(cipher, [0x19, 0xED, 0xB6, 0x9C, 0xD8, 0x55, 0xFB, 0xD4, 0x4C, 0x73, 0x22, 0xC1, 0xF6, 0x11, 0x18, 0x2F, 0xFF, 0x4A, 0x11, 0xA5, 0x41, 0x33, 0xB9, 0x93, 0x77, 0xD0, 0xED, 0x6C, 0x4C, 0xA0, 0xAB, 0xCB, 0x67, 0x33, 0x87, 0xB0, 0x19, 0x27, 0xBB, 0xDD, 0x97, 0xC1, 0x60, 0x80, 0x73, 0x92, 0x94, 0x17, 0x56, 0x26, 0xBA, 0x9E, 0x10, 0x79, 0x75, 0xA6, 0x45, 0xF6, 0x32, 0xF8, 0x67, 0x69, 0x83, 0x12, 0xED, 0xB7, 0xD8, 0x2E, 0x79, 0x88, 0x1E, 0x50, 0x9A, 0x89, 0xF, 0x92, 0x39, 0xB3, 0xEB, 0x6A, 0x59, 0xEC, 0x16, 0xB4, 0x59, 0x41, 0xB9, 0xDC, 0x2D, 0xF9, 0x4D, 0xD2, 0xC7, 0xDB, 0x57, 0x24, 0x61, 0x93, 0x6C, 0xBF, 0xE8, 0xAD, 0x8, 0x63, 0x2C, 0xA2, 0xE0, 0xB7, 0x98, 0x14, 0x64, 0xF8, 0xC, 0x7D, 0x36, 0x20, 0xD2, 0x70, 0x4F, 0x99, 0x7, 0x10, 0x1B, 0x2E, 0x3B, 0x93, 0xEA, 0x96, 0xD3, 0x1A, 0xD1, 0x65, 0x65, 0xC5, 0xC0, 0x78, 0xC9, 0x27, 0xE3, 0xB2, 0xB5, 0x3D, 0x9A, 0xC, 0x24, 0xA9, 0x5D, 0x2A, 0x22, 0x35, 0xBB, 0xFF, 0x25, 0x78, 0x18, 0xA6, 0x69, 0x77, 0xF4, 0x14, 0x9A, 0x54, 0x3E, 0x3E, 0xA, 0xE4, 0xBC, 0xDC, 0x17, 0x33, 0x32, 0x27, 0x20, 0x51, 0xC3, 0xEC, 0x15, 0xB9, 0xEE, 0xA, 0xFD, 0x38, 0x7F, 0xC4, 0x0, 0xEF, 0x9D, 0x6A, 0x1D, 0xC4, 0x7A, 0x2D, 0x3C, 0xBA, 0x9E, 0x9E, 0xE7, 0x47, 0x53, 0xB, 0xDF, 0x82, 0xF6, 0xE9, 0xBD, 0x34, 0x69, 0x93, 0xD4, 0xC0, 0x5B, 0x71, 0x12, 0xF8, 0x9, 0x77, 0xF7, 0xBD, 0xE0, 0x44, 0x43, 0x4D, 0xD6, 0x3B, 0xE8, 0x14, 0xD0, 0xCC, 0xBE, 0x5F, 0xF4, 0x54, 0xEE, 0x4F, 0x2A, 0x2E, 0x2A, 0x35, 0xFD, 0x71, 0x86, 0x13, 0x7F, 0x52, 0x94, 0x35, 0x68, 0x81, 0xFF, 0xC3, 0x70, 0x53, 0x62, 0x6E, 0x9A, 0xE1, 0x61, 0x85, 0x97, 0x39, 0xD6, 0x76, 0xAB, 0x4A, 0x81, 0xD6, 0x41, 0x3A, 0xD7, 0x9E, 0xEE, 0xB5, 0x1C, 0xA9, 0x5E, 0x46, 0xB1, 0x22, 0x72, 0xEF, 0x3C, 0xDF, 0x98, 0x80, 0x5D, 0x54, 0x5E, 0x97, 0x3A, 0x87, 0x5D, 0xDE, 0x10, 0xCF, 0xD8, 0x2F, 0x37, 0x63, 0x80, 0xFF, 0xB0, 0x46, 0x2, 0xDF, 0x3, 0xF5, 0xAB, 0x12, 0x9D, 0xDA, 0x85, 0xB1, 0xCB, 0x50, 0xAD, 0xE1, 0xFC, 0x98, 0x61, 0x74, 0x29, 0x71, 0x72, 0x86, 0xFE, 0xC5, 0xA7, 0x48, 0x4C, 0x3C, 0xA3, 0xFC, 0x50, 0xD5, 0xB4, 0xC1, 0xFE, 0x1D, 0xFC, 0xF2, 0x3B, 0x16, 0xDE, 0x13, 0xD7, 0x24, 0x96, 0x7E, 0x18, 0x44, 0xC8, 0x45, 0x12, 0xEA, 0x8D, 0xCF, 0xC7, 0x66, 0xF5, 0xB7, 0x15, 0xC1, 0xCF, 0x46, 0xC4, 0xCD, 0xE6, 0x81, 0x70, 0xFF, 0xBC, 0xD8, 0x6C, 0x8E, 0x1D, 0xB4, 0x3F, 0xBF, 0x7A, 0x9F, 0x6B, 0xD9, 0xFC, 0x3, 0x95, 0x38, 0x20, 0x40, 0xC6, 0x11, 0xE7, 0xDB, 0x7A, 0x97, 0xDB, 0xED, 0xA1, 0x98, 0xF, 0x4F, 0xC6, 0xD, 0x6, 0xE4, 0x34, 0x57, 0xAC, 0x34, 0xB5, 0xDE, 0x4C, 0x88, 0xFA, 0x25, 0x4, 0x86, 0xF9, 0x6F, 0xD2, 0xB9, 0xCF, 0xB6, 0xE2, 0x89, 0x40, 0x16, 0x35, 0x94, 0x97, 0x37, 0x2F, 0xC, 0xCC, 0xA9, 0x44, 0xC9, 0x76, 0xB, 0x57, 0xC5, 0xD7, 0x86, 0xCF, 0x15, 0x7A, 0x26, 0x55, 0x54, 0xB3, 0x27, 0xF8, 0xD, 0x5D, 0xD0, 0xC4, 0x89, 0xC5, 0x61, 0xC1, 0xD3, 0x3, 0xA8, 0xF3, 0x71, 0xA5, 0xCE, 0x5E, 0x27, 0x55, 0xA2, 0xE1, 0xC, 0x80, 0x50, 0x5, 0x4B, 0x15, 0x5E, 0x11, 0x6E, 0xAA, 0xB0, 0x64, 0x1D, 0xD5, 0x2F, 0xA9, 0xF1, 0x6, 0x32, 0x1B, 0x9A, 0xCA, 0x92, 0xFC, 0x37, 0xFA, 0x5A, 0xEE, 0x62, 0x9A, 0x76, 0x8E, 0xD1, 0x50, 0xF0, 0xCC, 0xF5, 0x14, 0xA6, 0x82, 0xEC]);
3865    let recovered = rsa.decrypt_unit(&cipher);
3866    let mut rr = [0u128; 32];
3867    unsafe { copy_nonoverlapping(recovered.as_ptr(), rr.as_mut_ptr() as *mut u8, 512); }
3868    
3869    print!("RSA_4096_u8: Recovered = [");
3870    for r in rr
3871        { print!("{:#X}, ", r); }
3872    println!("]");
3873    assert_eq!(rr, [0x123456789ABCDEF00FEDCBA987654321, 0x11223344556677889900AABBCCDDEEFF, 0xFFEEDDCCBBAA00998877665544332211, 0x1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0xF1E2D3C4B5A6079889706A5B4C3D2E1F, 0x102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x11112222333344445555666677778888, 0x99990000AAAABBBBCCCCDDDDEEEEFFFF, 0xFEDCBA98765432100123456789ABCDEF, 0x9900AABBCCDDEEFF1122334455667788, 0x8877665544332211FFEEDDCCBBAA0099, 0x9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x879605A4B3C2D1E00F1E2D3C4B5A6978, 0x98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x111122223333444499990000AAAABBBB, 0x5555666677778888CCCCDDDDEEEEFFFF, 0x11111111111111111111111111111111, 0x22222222222222222222222222222222, 0x33333333333333333333333333333333, 0x44444444444444444444444444444444, 0x55555555555555555555555555555555, 0x66666666666666666666666666666666, 0x77777777777777777777777777777777, 0x88888888888888888888888888888888, 0x99999999999999999999999999999999, 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0xBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0xCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0xDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x0]);
3874    assert_eq!(rr, message);
3875    println!("-------------------------------");
3876}
3877
3878fn rsa_decrypt_array_unit()
3879{
3880    println!("rsa_decrypt_array_unit");
3881    use std::ptr::copy_nonoverlapping;
3882    use cryptocol::number::BigUInt;
3883    use cryptocol::define_utypes_with;
3884    define_utypes_with!(u64);
3885
3886    // Example for RSA_1024
3887    use cryptocol::asymmetric::RSA_1024;
3888
3889    let public_key = U1024::from(7_u8);
3890    let private_key = U1024::from_str_radix("4703E575111E5E33F674DB8CB5C7AA883BCBC715FFF564645CD67F2AB09470D71575D6D88FBB6BC0FABD4837B2F1F3F01FE4F7D135EF2FA15476D88107881CB8D6594A0010F987144DD6243268D07A6C7002F5949E0886BA36F8BAA886B0D8311277977315FC7F93CD95AB72592F65A2AB7BE609C69AFC3D9B54BA3BB78FAD87", 16).unwrap();
3891    let modulus = U1024::from_str_radix("636bdad717f750af25d6ccf831b121f1ed507d1eccbdf2f2e85f7ed55d9c9df9ead82cc8c93996daf8a2984dfa85ef1cf973c158184edc48430cc8b4a424f504093508b4a1235839fd887c0ef40d7740b770a375457b0e95cda768e23799f94c34982315e6974fa1e1fb63d2a1be2ed341f22275bd098a6bb56e7efe2ba6f2ef", 16).unwrap();
3892    let rsa = RSA_1024::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3893    let message = [ [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6978879605A4B3C2D1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF],
3894                    [0x_23456789ABCDEF00FEDCBA9876543211_u128, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_F1E2D3C4B5A6978879605A4B3C2D1F, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB],
3895                    [0x_3456789ABCDEF00FEDCBA98765432112_u128, 0x_CCDDEEFF112233449900AABB55667788, 0x_44332211FFEEDD88776655CCBBAA0099, 0x_9807A6B5C5B6A70894D3E2F11F2E3D4C, 0x_F1E2D35A4B3C2D1FC4B5A697887960, 0x_4E3F201102F3E4D98A7B6C5D5C6B7A89, 0x_55556666333344447777888811112222, 0x_EEEEFFFF99990000CCCCDDDDAAAABBBB] ];
3896    println!("RSA_1024: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3897    println!("RSA_1024: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3898    print!("RSA_1024: Message = [");
3899    for mm in message
3900    {
3901        print!(" [");
3902        for m in mm
3903            { print!("{:#X}, ", m); }
3904        print!(" ], ");
3905    }
3906    println!("]");
3907
3908    let mut m = [[0u32; 32]; 3];
3909    unsafe { copy_nonoverlapping(message.as_ptr() as *const u32, m.as_mut_ptr() as *mut u32, 32 * 3); }
3910    let cipher = rsa.encrypt_array_unit(&m);
3911    print!("RSA_1024: Cipher = [");
3912    for cc in cipher
3913    {
3914        print!("[");
3915        for c in cc
3916            { print!("{:#X}, ", c); }
3917        print!("], ");
3918    }
3919    println!("]");
3920    assert_eq!(cipher, [[0xE181EC1C, 0x86C53D7E, 0xC1EE84B, 0xC64EE28F, 0xBCB1272C, 0xDCCF7F8D, 0x5CCEE57E, 0xDEE7F806, 0x260E66E3, 0xEAF66FB4, 0x84C29D28, 0xF3331A75, 0x6A98F58E, 0xAF51309B, 0x988A192A, 0x36D16E3D, 0x8F7D9425, 0xD125283B, 0x64A9AC13, 0xBA293535, 0x48A937F6, 0x347A3932, 0x678E3AA9, 0x596C50E5, 0x372F32F3, 0x92CADF0A, 0x53A41E0, 0x527CDD75, 0x637C4679, 0x16575D1C, 0x1E452703, 0xC2A8AAFA],
3921                        [0x6E971C27, 0x9D289F9E, 0x5890CBE1, 0xDCB604D0, 0x3DFF02E4, 0x8BB80EDF, 0x16025971, 0x47F83DFB, 0x15DB89ED, 0x37D3D81E, 0x1C784012, 0x96B5A8B2, 0x9B73CDEB, 0x19C3EB1C, 0x7380AF9B, 0xC7C05B11, 0x8778FFB1, 0xA4980451, 0x7817EF0E, 0xFBEC9BB0, 0x775226C3, 0x17DF9B7F, 0xBAD86876, 0xD482C2D8, 0x3AD54CCB, 0x63206A15, 0x5380238F, 0xCF893CDA, 0xD918FB53, 0x278CC36, 0x88966E4F, 0xED9F1A8A],
3922                        [0x732F2B30, 0x4FF2B312, 0x764BC5FE, 0x1A83AAC2, 0x6B97E97A, 0x8740A298, 0xD0F1CCD, 0x6BE5488D, 0x55BCFAB6, 0x44D8DD33, 0xF0BDF5E3, 0xA4F2A20F, 0x5ED64723, 0xDFFEA2C7, 0xBB55E1E, 0xBA258D21, 0x75A9D8B8, 0x41087FE1, 0xF73A3142, 0x97551901, 0xB4534FEC, 0x94EAAEF3, 0x34A07F91, 0x3A31B17E, 0x6C49CF97, 0xAB7A50A1, 0xEAFD8E4, 0x3BDED4CB, 0x1360C56A, 0xA8053DEA, 0xF4967191, 0x9735C7FF]]);
3923
3924    let recovered = rsa.decrypt_array_unit(&cipher);
3925    let mut rrr = [[0u128; 8]; 3];
3926    unsafe { copy_nonoverlapping(recovered.as_ptr() as *const u32, rrr.as_mut_ptr() as *mut u32, 32 * 3); }
3927    
3928    print!("RSA_1024: Recovered = [");
3929    for rr in rrr
3930    {
3931        print!("[");
3932        for r in rr
3933            { print!("{:#X}, ", r); }
3934        print!("], ");
3935    }
3936    println!("]");
3937    assert_eq!(rrr, [[0x123456789ABCDEF00FEDCBA987654321, 0x11223344556677889900AABBCCDDEEFF, 0xFFEEDDCCBBAA00998877665544332211, 0x1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0xF1E2D3C4B5A6978879605A4B3C2D1F, 0x102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x11112222333344445555666677778888, 0x99990000AAAABBBBCCCCDDDDEEEEFFFF],
3938                        [0x23456789ABCDEF00FEDCBA9876543211, 0x9900AABBCCDDEEFF1122334455667788, 0x8877665544332211FFEEDDCCBBAA0099, 0x9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0xF1E2D3C4B5A6978879605A4B3C2D1F, 0x98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x55556666777788881111222233334444, 0xCCCCDDDDEEEEFFFF99990000AAAABBBB],
3939                        [0x3456789ABCDEF00FEDCBA98765432112, 0xCCDDEEFF112233449900AABB55667788, 0x44332211FFEEDD88776655CCBBAA0099, 0x9807A6B5C5B6A70894D3E2F11F2E3D4C, 0xF1E2D35A4B3C2D1FC4B5A697887960, 0x4E3F201102F3E4D98A7B6C5D5C6B7A89, 0x55556666333344447777888811112222, 0xEEEEFFFF99990000CCCCDDDDAAAABBBB]]);
3940    assert_eq!(rrr, message);
3941
3942    // Example for RSA_2048
3943    use cryptocol::asymmetric::RSA_2048;
3944
3945    let public_key = U2048::from(5_u8);
3946    let private_key = U2048::from_str_radix("49E61033258BFDFF87ADB347816E3D13BC07A9929F4064C5336F5FEC074C857BA6F64415DB647DD6CEE42842DF409A2B036839B814E6F2A1E507F2CDD91FB2B42BE6B4A40E0CFA0779437B42B8996CA31034CB90D84CB283870BE414756316FB300523F700BCC3D9E1B8183F8EA4675FF6F59D84FF3E120CE54C94B0A44E2C1DCCA68F3F0842DB99FCD7698234C374ABB28C2B5F5A5B1914F15F41163E16A54AEDA0CB6679EA1026BA97C00B0726DB7837F7478275D3688D2981898A7BB040CC9927F4204E8BA93B97992D1C13C17D9A53F4B834A2A56DD9633F5288BA125859413D3F197F7278F95F37503D2FDDF9F540154C491AAE943B13EF3C047AA5E1AD", 16).unwrap();
3947    let modulus = U2048::from_str_radix("7b2a1affe93ea7548ccc2acc826265cb8eb76ff45ec0a7f355b99fdeb6d4de78c0efc6cf18522710ae26edc4c96bab9d05adb58822d63f0dd30d3f57148a29d6f3d5d7bc176af60c74c5cd6f33aa5fba7057fdf1687fd4308bbe7c2218fa7ba2a55de69babe5466b22dd7dbf4312019ff0eeb132febcc8c028d4f7d111d79eddc056ec9cd74e3a369eefbc634b6544bcbd80ff73a941ab7614ccf740da8a1010a6e1799953abfdcbe9892520eb35733602807ef52fb6b4cf0664560e2feda618cceecba02038d0c3349e1634f778544f2ab941bd61788f30db3c0aeebefb02759f2e605f301e48b5235f3340fecb37e04bd34f53a2f516904532135a4a38b9e7", 16).unwrap();
3948    let rsa = RSA_2048::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
3949    let message = [[0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF],
3950                    [0x_21123456789ABCDEF00FEDCBA9876543_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_89706A5B4C3D2E1FF1E2D3C4B5A60798, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_11112222777788883333444455556666, 0x_99990000EEEEFFFFAAAABBBBCCCCDDDD, 0x_0123456789ABCDEFFEDCBA9876543210, 0x_11223344556677889900AABBCCDDEEFF, 0x_88776655BBAA009944332211FFEEDDCC, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_0F1E2D3C4B5A6978879605A4B3C2D1E0, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_0000AAAABBBB11112222333344449999, 0x_CCCCDDDDEEEEFFFF5555666677778888],
3951                    [0x_321123456789ABCDEF00FEDCBA987654_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCC5544332211BBAA0099887766, 0x_1F2E3D4CC4D3E2F15B6A70899807A6B5, 0x_F1E2D3C4B4C3D2E1F5A6079889706A5B, 0x_102F3E4DD4E3F2015C6B7A8998A7B6C5, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB, 0x_FEDCBA989ABCDEF87654321001234567, 0x_CCDDEEFF112233449900AABB55667788, 0x_FFEEDDCCBBAA00998877665544332211, 0x_9807A6B51F2E3D4C5B6A7089C4D3E2F1, 0x_879605A44B5A6978B3C2D1E00F1E2D3C, 0x_5D4E3F201102F3E98A7B6C4D5C6B7A89, 0x_11112222AAAABBBB3333444499990000, 0x_77778888CCCCDDDD55556666EEEEFFFF]];
3952    println!("RSA_2048: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
3953    println!("RSA_2048: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
3954    print!("RSA_2048: Message = [");
3955    for mm in message
3956    {
3957        print!(" [");
3958        for m in mm
3959            { print!("{:#X}, ", m); }
3960        print!(" ], ");
3961    }
3962    println!("]");
3963
3964    let mut m = [[0u32; 64]; 3];
3965    unsafe { copy_nonoverlapping(message.as_ptr() as *const u32, m.as_mut_ptr() as *mut u32, 64 * 3); }
3966    let cipher = rsa.encrypt_array_unit(&m);
3967    print!("RSA_2048: Cipher = [");
3968    for cc in cipher
3969    {
3970        print!("[");
3971        for c in cc
3972            { print!("{:#X}, ", c); }
3973        print!("], ");
3974    }
3975    println!("]");
3976    assert_eq!(cipher, [[0x58512746, 0xA88DE309, 0x16A1FCA0, 0x839DAD1, 0x63C593A1, 0x73655BFB, 0x7991B26, 0xBFEF2D64, 0x8602856F, 0x6C4BFFD5, 0x4B6969DA, 0xFAE91CB1, 0xCE340203, 0x487811E8, 0x55FF5A2B, 0x3A344493, 0x40933E17, 0xB6E7FC8E, 0xD1BB3CA2, 0xCBF46CC4, 0xA799D9F6, 0xA71195B4, 0xC904ED6E, 0xCEE3C80, 0xC50713C0, 0x7C396E59, 0xC32D0579, 0x16839F92, 0xB7AACD80, 0x32913210, 0x66AB3112, 0xF885BEAC, 0x75BC7B1A, 0x8E4B37AF, 0xDC8E5EFA, 0xD55E6E53, 0x55168D6A, 0xAC8C176F, 0x55F529D7, 0x1CF6778B, 0x6927C346, 0xB828CD00, 0xFF1F2E96, 0x8733A73C, 0xDCF3EC8B, 0x107A6AC1, 0x87E4317B, 0x55EA897A, 0x484B9F8C, 0x7D109B38, 0x72E3C18C, 0x7A52100A, 0x69574CD9, 0xD2232D3E, 0xEC16E847, 0xA0AAF25E, 0x7812251E, 0x52727569, 0x44211691, 0x1A7CC156, 0x458B9D97, 0xF70A2641, 0x8D7CE45B, 0x144B8CDE],
3977                        [0xAF8EA34A, 0x8451F77A, 0x1CC9E10B, 0x1A6F8D28, 0x1B1E535B, 0xD636F52F, 0x16B759DC, 0x46A8B, 0xA4DB4947, 0x694603D4, 0xD47357D1, 0xFAAA44CB, 0x18A7D50A, 0x281FF567, 0xE31648FD, 0xB996F502, 0xF6FFC57F, 0x1E1509C7, 0xA3CBC1C6, 0x430A5970, 0x87501C03, 0xBDDE7C4B, 0x6A104F83, 0x9AC886D1, 0xAFE5FCB3, 0xCAE6D365, 0x781B31B4, 0x15689F6A, 0xEC393431, 0xAE042223, 0x94281CB9, 0x3E7EECD, 0xED46EEB9, 0xB958CB54, 0xF3F0D946, 0x41F39B10, 0xDDAA89AF, 0xC2152C2E, 0x2CCB18C5, 0xB6A22DD0, 0x4FEA1DC7, 0xE4E9D89D, 0x4B40BCCA, 0xAA738CC7, 0x1FCF3CBD, 0x30A41CA8, 0x9C4BF168, 0xE78C0962, 0xA96F42DE, 0x25FE30C7, 0x44970C8, 0x4957120, 0xF4BEA26E, 0xC8880E2, 0xB6DBFB74, 0x5DDA4CE5, 0x2AFE2CD0, 0xA6860B6E, 0x72E227CA, 0xB91E53CA, 0x7DC37372, 0xEC31BAC1, 0x6DFA0EF, 0x204ABDC6],
3978                        [0x3EC97176, 0x3E662231, 0xD7142C09, 0x872DF0A7, 0x912E04C9, 0x9A2EB827, 0xE5ED5CDF, 0x4A6CBDE9, 0x8AD9C195, 0x81EC6854, 0xDD5F05DD, 0x3D9005D, 0x3DB693E4, 0x406BA4B0, 0xCC9A7BA5, 0xC7F81B10, 0x5B0FEEA7, 0x78195A94, 0x45CC9F4A, 0x5C3686F6, 0xB17EA923, 0xCEA9D40F, 0x6543C935, 0xEB44EB69, 0x9C406F87, 0x464C2710, 0x3DEE373C, 0xED63CB32, 0xF784D1B4, 0x8DE9C7BA, 0x3160BC6, 0x38A4E187, 0xD7C49411, 0xF8486078, 0x40030B00, 0x97047FAD, 0xB837A89F, 0xB00E34F5, 0x16279A66, 0xD68F4FED, 0x470BD897, 0x5ED4AED0, 0x2BB360C2, 0x8E1A882C, 0x74A73D94, 0xDC1257F4, 0x5B8DFBA2, 0x64E737E5, 0x395C8152, 0xC7822C68, 0x7C9AD0B4, 0x69134CCD, 0xBD2535D6, 0x4F72EDF6, 0x1101F3A4, 0x4AA60B4C, 0xBB03EC35, 0xF886D1E7, 0xC85FADF, 0xE11617FB, 0xAA005E06, 0xBAD3992F, 0x90BD84BB, 0x10AA50CD]]);
3979    let recovered = rsa.decrypt_array_unit(&cipher);
3980    let mut rrr = [[0u128; 16]; 3];
3981    unsafe { copy_nonoverlapping(recovered.as_ptr() as *const u32, rrr.as_mut_ptr() as *mut u32, 64 * 3); }
3982    
3983    print!("RSA_2048: Recovered = [");
3984    for rr in rrr
3985    {
3986        print!("[");
3987        for r in rr
3988            { print!("{:#X}, ", r); }
3989        print!("], ");
3990    }
3991    println!("]");
3992    assert_eq!(rrr, [[0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF],
3993                        [0x_21123456789ABCDEF00FEDCBA9876543_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_89706A5B4C3D2E1FF1E2D3C4B5A60798, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_11112222777788883333444455556666, 0x_99990000EEEEFFFFAAAABBBBCCCCDDDD, 0x_0123456789ABCDEFFEDCBA9876543210, 0x_11223344556677889900AABBCCDDEEFF, 0x_88776655BBAA009944332211FFEEDDCC, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_0F1E2D3C4B5A6978879605A4B3C2D1E0, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_0000AAAABBBB11112222333344449999, 0x_CCCCDDDDEEEEFFFF5555666677778888],
3994                        [0x_321123456789ABCDEF00FEDCBA987654_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCC5544332211BBAA0099887766, 0x_1F2E3D4CC4D3E2F15B6A70899807A6B5, 0x_F1E2D3C4B4C3D2E1F5A6079889706A5B, 0x_102F3E4DD4E3F2015C6B7A8998A7B6C5, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB, 0x_FEDCBA989ABCDEF87654321001234567, 0x_CCDDEEFF112233449900AABB55667788, 0x_FFEEDDCCBBAA00998877665544332211, 0x_9807A6B51F2E3D4C5B6A7089C4D3E2F1, 0x_879605A44B5A6978B3C2D1E00F1E2D3C, 0x_5D4E3F201102F3E98A7B6C4D5C6B7A89, 0x_11112222AAAABBBB3333444499990000, 0x_77778888CCCCDDDD55556666EEEEFFFF]]);
3995    assert_eq!(rrr, message);
3996
3997    // Example for RSA_4096
3998    use cryptocol::asymmetric::RSA_4096;
3999
4000    let public_key = U4096::from(5_u8);
4001    let private_key = U4096::from_str_radix("4E0F13FFD94F4F793ED6900C7A99EA88942D3A065EB7E72E741A77CE7BB6AD5B7FFB2B83B6154A975FAE613F22A739F54E305BDCD85A5A3D5C59C28FEDB6AC2CF03272A57C25ED4CEAAF8006321DA2529F381EF51B050FA1AC7DE541624A19AFE8561C1407F9D3333AA364DDA03A5E50ACA61C7E52850C519549AB45B82AE1E831D7FE401A641CB47A4711340F4B6D2F9822D32442168D2517B5CB9E6A01FB89D9B8240858269DA12F8B0E247AD1D0DA835C3F38390EB4BA56EAA266FF113CA7DD7817AF156E994C21738839D1E4B6AE4B04332F09DC6A047F75FF521E6868697998CBCE9CBA7C505A97C01C510BED5CDBB55D4E624CA14A9D5A4A05851F0842904604D544B6FBF154BAF9FAB89A2765A41A6BD17E631B079429AED230B2F72777350CEF5CA6E89784376003BA8F189F671D9451EE86039EF8F2DE7B6E9A3A37A4C15BD8ACE6CCA3B218CD59D018674DDE5BCF25487464AFDA648A475D6BCEA1A95F2E2937DB1CEE3C9E7EBB2492ED275DCD9089A2909CBBDEB0368EDC5E6DBD12582E171DF0724C5534204F656E095339C5E19D5665D214D3E4F05F6A18F3D0B3E95D16996EE3E49A239C8673A78D0DD90F36DBE6F85B316DD1E2AFED84D3823F5EAE9088176309CC33056B2976C31C8EC94C5FAA62E466CFC8FFE8D6DCB106DB27BA551C1A041561E597C967C1C8568D3C605BD703877343E0C4B4E932E10D", 16).unwrap();
4002    let modulus = U4096::from_str_radix("6192d8ffcfa323578e8c340f9940652ab9388887f665e0fa112115c21aa458b25ff9f664a39a9d3d3799f98eeb510872a1bc72d40e70f0ccb3703333e92457382c3f0f4edb2f68a0255b6007bea50ae7470626b261c6538a179d5e91badca01be26ba31909f84800094c3e150848f5e4d7cfa39de7264f65fa9c161726359a623e4dfdd020fd23e198d8d581131e487b7e2b87ed529c306e5da33e8604827a6c50262d0a6e3045097b6dd1ad9986451124334f06475261e8eca54b00bed58bd1d4d61d9adaca3f9f29d06a48465de459ddc53ffacc5384859f537f26a6028283d7fefec243e91b64713db023654ee8b412a2b4a1fadfc99d44b0dc86e666ca5470704b8bfe5fd708ddd576bd021bf4c2d813279ec0d74f4e03a53557f2cefde2cd9e9d01c72be14754f7a4472dfe8ef653fe73980d1edc3727501f5594863d2e32a8abf8fc04c44f8aac2e9bda32a8d154a62107bdc1f2f394b9ae693e84d6c7ba4143c15b39fed115fd4265fc230c3e9cd830d56f7866e09042569c80517596f8fcef6ed1e31962d3805d2d811248b11006e1dc14d03c98f5daeca854ad44eac60878e807d26656e5f91e4cfeeb16b8f8ba4d04d398737af8fd4a6b7f1b31e390dee1dfc5e117cdd76b4e26b2407480d97a1503f8aa01f676d6ddbce264e1cd4ec3f2ef903632865fe85795d5298432df45cae39771f83155b8da0979de9f23", 16).unwrap();
4003    let rsa = RSA_4096::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
4004    let message = [[0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000],
4005                    [0x_3456789ABCDEF00FEDCBA98765432112_u128, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_89706A5B4C3D2E1FF1E2D3C4B5A60798, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB, 0x_0123456789ABCDEFFEDCBA9876543210, 0x_556677889900AABB11223344CCDDEEFF, 0x_44332211FFEEDDCC88776655BBAA0099, 0x_4D3E2F11F29807A6B5CE3D4C5B6A7089, 0x_2D1E00F1E2D879605A4B3C3C4B5A6978, 0x_E3F201102F3E98A7B6C5D44D5C6B7A89, 0x_333344449999111122220000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000],
4006                    [0x_56789ABCDEF00FEDCBA9876543211234_u128, 0x_11223344CCDDEEFF556677889900AABB, 0x_FFEEDDCC5544332211BBAA0099887766, 0x_5B6A70899807A6B51F2E3D4CC4D3E2F1, 0x_B5A6079889706A5BF1E2D3C44C3D2E1F, 0x_102F3E4DD4E3F2015C6B7A8998A7B6C5, 0x_33334444555566661111222277778888, 0x_99990000EEEEFFFFAAAABBBBCCCCDDDD, 0x_FEDCBA99ABCDEF876543210012345678, 0x_CCDDEEFF112233449900AABB55667788, 0x_88776655BBAA009944332211FFEEDDCC, 0x_9807A6B5C5B6A7089C4D3E2F11F2E3D4, 0x_879605A43C4B5A6978B3C2D1E00F1E2D, 0x_E3F201102F3E98A7B6C5D44D5C6B7A89, 0x_111122220000AAAABBBB333344449999, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000]];
4007
4008    println!("RSA_4096: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
4009    println!("RSA_4096: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
4010    print!("RSA_4096: Message = [");
4011    for mm in message
4012    {
4013        print!(" [");
4014        for m in mm
4015            { print!("{:#X}, ", m); }
4016        print!(" ], ");
4017    }
4018    println!("]");
4019
4020    let mut m = [[0u32; 128]; 3];
4021    unsafe { copy_nonoverlapping(message.as_ptr() as *const u32, m.as_mut_ptr() as *mut u32, 128 * 3); }
4022    let cipher = rsa.encrypt_array_unit(&m);
4023    print!("RSA_4096: Cipher = [");
4024    for cc in cipher
4025    {
4026        print!("[");
4027        for c in cc
4028            { print!("{:#X}, ", c); }
4029        print!("], ");
4030    }
4031    println!("]");
4032    assert_eq!(cipher, [[0x297D441C, 0x2C5F6411, 0x753A7FEE, 0x50C6112C, 0x9765F75A, 0xC967B73, 0x464B45EB, 0x2E7B2CE2, 0xAD8D127, 0xBE324F21, 0x718D227D, 0xAA644C8B, 0x478530AD, 0xB060802D, 0x5E688409, 0x82F3C894, 0x9930DB71, 0xA2287A36, 0xE9E5766F, 0xC09E5C5C, 0xB4DEBA1E, 0xDD452F9E, 0x5D195295, 0xA366D241, 0x5C0E152E, 0xEDAB47C6, 0x6BDE070E, 0x27A5AA6F, 0x134009FB, 0x55B1038D, 0x19196446, 0xC4A9C264, 0xAEC6AB51, 0xA437DCD5, 0xF8EBC560, 0x9EADB1FC, 0xA446D423, 0x6C10C632, 0x20558326, 0xEF92D5BC, 0x124F75C2, 0x61316515, 0x9BA2A06D, 0xC40239A3, 0x826440E8, 0xFF04ED8B, 0x3BE3A38F, 0x8FFBEDA7, 0xBB154B25, 0xF37A69D3, 0x82A21E50, 0xE799865E, 0xB9FC1E91, 0x8DDA3FF8, 0xA92673B5, 0x2E6B7BDF, 0x2C6630AB, 0xF10FFFAF, 0xD1EC6253, 0xEE7B7D26, 0xE367BC27, 0x6233235A, 0x821954B5, 0x7516FFA2, 0x1BBF54E5, 0xB9A7901E, 0xC6672059, 0xE70F4930, 0x39A64754, 0xD4C12243, 0x49CDEBB8, 0x2E39E8A1, 0xCAF382AD, 0x94D3E2FC, 0xEC85450F, 0x31D7D3A7, 0x2FC47057, 0x95BB0C4, 0xF7C96DC1, 0x4F99EF5C, 0x4B14F7D7, 0xA77AD0D6, 0xA1D4CD71, 0xCF8D9BB4, 0x6F9EB898, 0x367BD1B, 0x6118438B, 0x558B0A29, 0xC7E346CA, 0x3721EBBF, 0xA44449C8, 0x1F26303F, 0x4205F7A3, 0x80224033, 0xCD0F2DFF, 0xABD140D0, 0x9AD41EDD, 0xD51B8A18, 0x3291E8D8, 0xC09A4F19, 0xA53D31ED, 0xA6BDBAB9, 0x5BC8D0EC, 0xBF50027C, 0xD8EFD4C7, 0x98A46C2E, 0xF1016DBF, 0x8960EBE0, 0x5783CE6E, 0x8C5F0A55, 0xC64D7A6B, 0x86B53F64, 0x85D2EF84, 0x22679606, 0x97A089B1, 0xCB8C74E1, 0xA3CCC592, 0xEFFE6EC3, 0x4F79D2D0, 0x389545E1, 0x84719E7C, 0xDC0004BA, 0x86CAF327, 0xBC113DF7, 0x875A5C24, 0xD93A4A0D, 0x7A8AD437, 0xDD5831F7],
4033                        [0xF8EA263C, 0xE551A4FE, 0xF20B52DF, 0xC992089E, 0x74176FCA, 0x75DC52BC, 0xD7EF3A78, 0x9D510616, 0x76A595DC, 0xF44E4A6D, 0x6FF6C7D6, 0x9D06E31C, 0x1447F881, 0x5B10CD8B, 0x8E44C9F5, 0xDCB6326C, 0xB79F18C, 0xD008BBB1, 0xA9DAE98A, 0x62ACFF3E, 0x2A7C3CB7, 0xF774DD3D, 0x3041C333, 0x154367CF, 0x1DE4A90A, 0xB7DE12F, 0x8DAD4359, 0x8EB7CE1A, 0xB11561CE, 0xA03E2ACF, 0x2E3CC59, 0x29A27365, 0x884BCF0C, 0xC186776C, 0xBDB3F787, 0xA76CDC7C, 0x32D0EC90, 0x341DB3CE, 0xC308A18E, 0xBBC4F265, 0x8EA878C3, 0xBBE9D930, 0xD4C2339, 0xCB2DCA03, 0xAAA4361D, 0xF9086339, 0x851158E0, 0xDC6187A5, 0xB85DC071, 0xB0DFC87F, 0xD762704B, 0x587630DF, 0xB0F3AFEE, 0x77702F19, 0xE72DEAB1, 0xCC6F76A4, 0xFBF91FE9, 0x682257BB, 0xE1803C31, 0x4AA72B7D, 0x319536E0, 0xD3B607D4, 0xB249A538, 0x166C0187, 0xF121272D, 0x9F1089AB, 0x826266CD, 0x209A5B74, 0x51B7F6E4, 0x698A875E, 0xC89964C2, 0xE0114D4C, 0xE32315E8, 0xFBFD50C3, 0x632EA904, 0xC92137E4, 0xCCEE3076, 0x48F7122C, 0xF50773CD, 0x79EFE6C6, 0xECFD11AC, 0x1BA83BBC, 0xC5F23FDA, 0xC4FE9C9D, 0xDC6D0467, 0xE8A94956, 0xF96D707D, 0x63DC6592, 0x9AE27FEC, 0x800811FC, 0x47306665, 0xDD82AC4E, 0x36931217, 0x8B813528, 0x88E4F5FC, 0x98896DD4, 0xB80D2269, 0x6C19905A, 0xDBA6B482, 0x258B79A2, 0x1A3C9AA5, 0xC1A514BD, 0x6C2845D2, 0x72D0CB25, 0x18C1F440, 0xE769717, 0xD2D4D517, 0x669BB63A, 0x85737599, 0x8761B910, 0xD5AA71B7, 0x7A1123D0, 0xBCD95883, 0xA02A5025, 0x72B71CA3, 0x60E991E2, 0xAD6601C7, 0x9176C80F, 0x2151FCA9, 0x70FCE4A9, 0xA16B991C, 0x483B834F, 0x7216959F, 0x2707FC2F, 0x771A46E0, 0xEF3E168, 0x3D3CEFCC, 0x8DCA257D],
4034                        [0xF42BE309, 0xDB4CE2DC, 0x42A27BDD, 0xC198B82B, 0x3E7A2747, 0x46FF7A3E, 0x9EA7255B, 0x178A5D5F, 0x89FFAAD, 0x4EC09632, 0xE81D248F, 0x6835F752, 0xF6EC565D, 0xC1DAFB0, 0x2D0DF0B5, 0xDF30C11F, 0x36B1ED61, 0xD303EBF5, 0x20D05AC8, 0x8D3EBEA7, 0x63D136F6, 0x15CC58A, 0xC4A65B45, 0x17127731, 0x94F6B581, 0x11BB2E0, 0xAEA46599, 0x3E2B0D84, 0x6D5CD0FC, 0xDAE2987D, 0xBD857C7B, 0xDEC69E3A, 0x55669B9A, 0x1D25D802, 0x356C3B31, 0x63D78F4E, 0x55BA82A4, 0x31ECD988, 0xD0FAC275, 0xBCF6D009, 0x4D3BBE36, 0x8394AD0, 0x7849CBF8, 0x73F0F16B, 0x2D5ED807, 0xDE3BE531, 0x23C06EC6, 0x62A5A61, 0x97AD95D3, 0xB85AB016, 0x32B7326D, 0x3E857E82, 0xC2105D2E, 0xFE9085C1, 0xEF4AF832, 0xC52CB9A4, 0xF302F044, 0xA7B30970, 0xAB41472D, 0xBE4C22A5, 0xCFB4ACA8, 0xD63C7428, 0x5195A499, 0xCA9FFB1D, 0x7604D98C, 0x47A7DDD, 0xE7D11482, 0xF4B0C737, 0x85040FBC, 0xE39A51F7, 0xC51A71DD, 0x880981C0, 0xBF4CAF2F, 0x443873F4, 0x90DAFC99, 0x4823B425, 0x85C04D13, 0x5A016214, 0xB033E79D, 0x3A175AF4, 0xAB6FBAD1, 0xDE0BE592, 0x713C68FE, 0xE01ACB15, 0xE2410568, 0x4B77433D, 0xECF20668, 0xDB21D751, 0xE80C456D, 0x2D9D62C6, 0xBC29F1CD, 0x1E137E49, 0xECC20CD9, 0xAC1D53D2, 0x7C589B17, 0x48E555B7, 0x88418FB0, 0x5D5EC0B1, 0x16EA1D9D, 0x87EEC267, 0xB83A7E17, 0xB9E2E216, 0x27C1B230, 0x147902F6, 0x525D2FB5, 0x707C4CDE, 0xBCF186FA, 0x85B9DAAC, 0x5E9AFE8A, 0x2DBB8CF9, 0x6D61C17C, 0xF1F2AE4C, 0x1ECCC2BF, 0xFB5177CD, 0x94820CC2, 0x98004AFB, 0xEBE22490, 0xD2ECD1A0, 0xE6B0697, 0x9E2C9D4, 0xB62101F, 0xDD9D5027, 0xC4D07CC1, 0xC4714130, 0x87F511B, 0x107E5ABF, 0xE1E238E6, 0xD2114B52]]);
4035    let recovered = rsa.decrypt_array_unit(&cipher);
4036    let mut rrr = [[0u128; 32]; 3];
4037    unsafe { copy_nonoverlapping(recovered.as_ptr() as *const u32, rrr.as_mut_ptr() as *mut u32, 128 * 3); }
4038    
4039    print!("RSA_4096: Recovered = [");
4040    for rr in rrr
4041    {
4042        print!("[");
4043        for r in rr
4044            { print!("{:#X}, ", r); }
4045        print!("], ");
4046    }
4047    println!("]");
4048    assert_eq!(rrr, [[0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000],
4049                    [0x_3456789ABCDEF00FEDCBA98765432112_u128, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_89706A5B4C3D2E1FF1E2D3C4B5A60798, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB, 0x_0123456789ABCDEFFEDCBA9876543210, 0x_556677889900AABB11223344CCDDEEFF, 0x_44332211FFEEDDCC88776655BBAA0099, 0x_4D3E2F11F29807A6B5CE3D4C5B6A7089, 0x_2D1E00F1E2D879605A4B3C3C4B5A6978, 0x_E3F201102F3E98A7B6C5D44D5C6B7A89, 0x_333344449999111122220000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000],
4050                    [0x_56789ABCDEF00FEDCBA9876543211234_u128, 0x_11223344CCDDEEFF556677889900AABB, 0x_FFEEDDCC5544332211BBAA0099887766, 0x_5B6A70899807A6B51F2E3D4CC4D3E2F1, 0x_B5A6079889706A5BF1E2D3C44C3D2E1F, 0x_102F3E4DD4E3F2015C6B7A8998A7B6C5, 0x_33334444555566661111222277778888, 0x_99990000EEEEFFFFAAAABBBBCCCCDDDD, 0x_FEDCBA99ABCDEF876543210012345678, 0x_CCDDEEFF112233449900AABB55667788, 0x_88776655BBAA009944332211FFEEDDCC, 0x_9807A6B5C5B6A7089C4D3E2F11F2E3D4, 0x_879605A43C4B5A6978B3C2D1E00F1E2D, 0x_E3F201102F3E98A7B6C5D44D5C6B7A89, 0x_111122220000AAAABBBB333344449999, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000]]);
4051    assert_eq!(rrr, message);
4052
4053    // Example for RSA_Genric
4054    use cryptocol::asymmetric::RSA_Generic;
4055
4056    let public_key = BigUInt::<u64, 4>::from(5_u8);
4057    let private_key = BigUInt::<u64, 4>::from_str_radix("92D109331B85A642EC6AE3F68A4E7272426A4BD0A0C16EF9B62F9269ACF9E8CD", 16).unwrap();
4058    let modulus = BigUInt::<u64, 4>::from_str_radix("b7854b7fe2670fd3a7859cf42ce20f1087aad03f863107e2b7bac58e09483f3d", 16).unwrap();
4059    let rsa = RSA_Generic::<4, u64, 5>::new_with_keys(public_key, private_key, modulus);
4060    let message = [[0x_FEDCBA9876543210_u64, 0x_1122334455667788, 0x_9900AABBCCDDEEFF, 0x_FEDCBA0987654321],
4061                    [0x_10FEDCBA98765432_u64, 0x_8811223344556677, 0x_CCDDEEFF9900AABB, 0x_9876FEDCBA054321],
4062                    [0x_3210FEDCBA987654_u64, 0x_7788112233445566, 0x_9900EEFFAABBCCDD, 0x_FEDC54321BA09876]];
4063
4064    println!("RSA_Generic<4, u64, 5>: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
4065    println!("RSA_Generic<4, u64, 5>: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
4066    print!("RSA_Generic<4, u64, 5>: Message = [");
4067    for mm in message
4068    {
4069        print!(" [");
4070        for m in mm
4071            { print!("{:#X}, ", m); }
4072        print!(" ], ");
4073    }
4074    println!("]");
4075
4076    let cipher = rsa.encrypt_array_unit(&message);
4077    print!("RSA_Generic<4, u64, 5>: Cipher = [");
4078    for cc in cipher
4079    {
4080        print!("[");
4081        for c in cc
4082            { print!("{:#X}, ", c); }
4083        print!("], ");
4084    }
4085    println!("]");
4086    assert_eq!(cipher, [[0xEB94831A3D67B97E, 0x14A5FE7C9A1F8E92, 0x9EAA729DE8B91D5B, 0x3065877D5C71FB46],
4087                        [0xBDD4B28968F07A29, 0x4FB31BF06504F164, 0x931AD673E14E379B, 0xC3021414384B0C21],
4088                        [0x299756779EBC6378, 0x5159A86D671F491C, 0xD7FF0A7562B5EAD9, 0xEEB151D0770DC2BC]]);
4089    let recovered = rsa.decrypt_array_unit(&cipher);
4090    print!("RSA_Generic<4, u64, 5>: Recovered = [");
4091    for rr in recovered
4092    {
4093        print!("[");
4094        for r in rr
4095            { print!("{:#X}, ", r); }
4096        print!("], ");
4097    }
4098    println!("]");
4099    assert_eq!(recovered, [[0x_FEDCBA9876543210_u64, 0x_1122334455667788, 0x_9900AABBCCDDEEFF, 0x_FEDCBA0987654321],
4100                    [0x_10FEDCBA98765432_u64, 0x_8811223344556677, 0x_CCDDEEFF9900AABB, 0x_9876FEDCBA054321],
4101                    [0x_3210FEDCBA987654_u64, 0x_7788112233445566, 0x_9900EEFFAABBCCDD, 0x_FEDC54321BA09876]]);
4102    assert_eq!(recovered, message);
4103
4104    // Example for RSA_1024_u128
4105    use cryptocol::asymmetric::RSA_1024_u128;
4106
4107    let public_key = U1024::from(7_u8);
4108    let private_key = U1024::from_str_radix("4703E575111E5E33F674DB8CB5C7AA883BCBC715FFF564645CD67F2AB09470D71575D6D88FBB6BC0FABD4837B2F1F3F01FE4F7D135EF2FA15476D88107881CB8D6594A0010F987144DD6243268D07A6C7002F5949E0886BA36F8BAA886B0D8311277977315FC7F93CD95AB72592F65A2AB7BE609C69AFC3D9B54BA3BB78FAD87", 16).unwrap();
4109    let modulus = U1024::from_str_radix("636bdad717f750af25d6ccf831b121f1ed507d1eccbdf2f2e85f7ed55d9c9df9ead82cc8c93996daf8a2984dfa85ef1cf973c158184edc48430cc8b4a424f504093508b4a1235839fd887c0ef40d7740b770a375457b0e95cda768e23799f94c34982315e6974fa1e1fb63d2a1be2ed341f22275bd098a6bb56e7efe2ba6f2ef", 16).unwrap();
4110    let rsa = RSA_1024_u128::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
4111    let message = [ [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6978879605A4B3C2D1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF],
4112                    [0x_23456789ABCDEF00FEDCBA9876543211_u128, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_F1E2D3C4B5A6978879605A4B3C2D1F, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB],
4113                    [0x_3456789ABCDEF00FEDCBA98765432112_u128, 0x_CCDDEEFF112233449900AABB55667788, 0x_44332211FFEEDD88776655CCBBAA0099, 0x_9807A6B5C5B6A70894D3E2F11F2E3D4C, 0x_F1E2D35A4B3C2D1FC4B5A697887960, 0x_4E3F201102F3E4D98A7B6C5D5C6B7A89, 0x_55556666333344447777888811112222, 0x_EEEEFFFF99990000CCCCDDDDAAAABBBB] ];
4114    println!("RSA_1024_u128: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
4115    println!("RSA_1024_u128: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
4116    print!("RSA_1024_u128: Message = [");
4117    for mm in message
4118    {
4119        print!(" [");
4120        for m in mm
4121            { print!("{:#X}, ", m); }
4122        print!(" ], ");
4123    }
4124    println!("]");
4125
4126    let cipher = rsa.encrypt_array_unit(&message);
4127    print!("RSA_1024_u128: Cipher = [");
4128    for cc in cipher
4129    {
4130        print!("[");
4131        for c in cc
4132            { print!("{:#X}, ", c); }
4133        print!("], ");
4134    }
4135    println!("]");
4136    assert_eq!(cipher, [[0xC64EE28F0C1EE84B86C53D7EE181EC1C, 0xDEE7F8065CCEE57EDCCF7F8DBCB1272C, 0xF3331A7584C29D28EAF66FB4260E66E3, 0x36D16E3D988A192AAF51309B6A98F58E, 0xBA29353564A9AC13D125283B8F7D9425, 0x596C50E5678E3AA9347A393248A937F6, 0x527CDD75053A41E092CADF0A372F32F3, 0xC2A8AAFA1E45270316575D1C637C4679],
4137                        [0xDCB604D05890CBE19D289F9E6E971C27, 0x47F83DFB160259718BB80EDF3DFF02E4, 0x96B5A8B21C78401237D3D81E15DB89ED, 0xC7C05B117380AF9B19C3EB1C9B73CDEB, 0xFBEC9BB07817EF0EA49804518778FFB1, 0xD482C2D8BAD8687617DF9B7F775226C3, 0xCF893CDA5380238F63206A153AD54CCB, 0xED9F1A8A88966E4F0278CC36D918FB53],
4138                        [0x1A83AAC2764BC5FE4FF2B312732F2B30, 0x6BE5488D0D0F1CCD8740A2986B97E97A, 0xA4F2A20FF0BDF5E344D8DD3355BCFAB6, 0xBA258D210BB55E1EDFFEA2C75ED64723, 0x97551901F73A314241087FE175A9D8B8, 0x3A31B17E34A07F9194EAAEF3B4534FEC, 0x3BDED4CB0EAFD8E4AB7A50A16C49CF97, 0x9735C7FFF4967191A8053DEA1360C56A]]);
4139    let recovered = rsa.decrypt_array_unit(&cipher);
4140    print!("RSA_1024_u128: Recovered = [");
4141    for rr in recovered
4142    {
4143        print!("[");
4144        for r in rr
4145            { print!("{:#X}, ", r); }
4146        print!("], ");
4147    }
4148    println!("]");
4149    assert_eq!(recovered, [[0x123456789ABCDEF00FEDCBA987654321, 0x11223344556677889900AABBCCDDEEFF, 0xFFEEDDCCBBAA00998877665544332211, 0x1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0xF1E2D3C4B5A6978879605A4B3C2D1F, 0x102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x11112222333344445555666677778888, 0x99990000AAAABBBBCCCCDDDDEEEEFFFF],
4150                        [0x23456789ABCDEF00FEDCBA9876543211, 0x9900AABBCCDDEEFF1122334455667788, 0x8877665544332211FFEEDDCCBBAA0099, 0x9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0xF1E2D3C4B5A6978879605A4B3C2D1F, 0x98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x55556666777788881111222233334444, 0xCCCCDDDDEEEEFFFF99990000AAAABBBB],
4151                        [0x3456789ABCDEF00FEDCBA98765432112, 0xCCDDEEFF112233449900AABB55667788, 0x44332211FFEEDD88776655CCBBAA0099, 0x9807A6B5C5B6A70894D3E2F11F2E3D4C, 0xF1E2D35A4B3C2D1FC4B5A697887960, 0x4E3F201102F3E4D98A7B6C5D5C6B7A89, 0x55556666333344447777888811112222, 0xEEEEFFFF99990000CCCCDDDDAAAABBBB]]);
4152    assert_eq!(recovered, message);
4153
4154    // Example for RSA_2048_u128
4155    use cryptocol::asymmetric::RSA_2048_u128;
4156
4157    let public_key = U2048::from(5_u8);
4158    let private_key = U2048::from_str_radix("49E61033258BFDFF87ADB347816E3D13BC07A9929F4064C5336F5FEC074C857BA6F64415DB647DD6CEE42842DF409A2B036839B814E6F2A1E507F2CDD91FB2B42BE6B4A40E0CFA0779437B42B8996CA31034CB90D84CB283870BE414756316FB300523F700BCC3D9E1B8183F8EA4675FF6F59D84FF3E120CE54C94B0A44E2C1DCCA68F3F0842DB99FCD7698234C374ABB28C2B5F5A5B1914F15F41163E16A54AEDA0CB6679EA1026BA97C00B0726DB7837F7478275D3688D2981898A7BB040CC9927F4204E8BA93B97992D1C13C17D9A53F4B834A2A56DD9633F5288BA125859413D3F197F7278F95F37503D2FDDF9F540154C491AAE943B13EF3C047AA5E1AD", 16).unwrap();
4159    let modulus = U2048::from_str_radix("7b2a1affe93ea7548ccc2acc826265cb8eb76ff45ec0a7f355b99fdeb6d4de78c0efc6cf18522710ae26edc4c96bab9d05adb58822d63f0dd30d3f57148a29d6f3d5d7bc176af60c74c5cd6f33aa5fba7057fdf1687fd4308bbe7c2218fa7ba2a55de69babe5466b22dd7dbf4312019ff0eeb132febcc8c028d4f7d111d79eddc056ec9cd74e3a369eefbc634b6544bcbd80ff73a941ab7614ccf740da8a1010a6e1799953abfdcbe9892520eb35733602807ef52fb6b4cf0664560e2feda618cceecba02038d0c3349e1634f778544f2ab941bd61788f30db3c0aeebefb02759f2e605f301e48b5235f3340fecb37e04bd34f53a2f516904532135a4a38b9e7", 16).unwrap();
4160    let rsa = RSA_2048_u128::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
4161    let message = [[0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF],
4162                    [0x_21123456789ABCDEF00FEDCBA9876543_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_89706A5B4C3D2E1FF1E2D3C4B5A60798, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_11112222777788883333444455556666, 0x_99990000EEEEFFFFAAAABBBBCCCCDDDD, 0x_0123456789ABCDEFFEDCBA9876543210, 0x_11223344556677889900AABBCCDDEEFF, 0x_88776655BBAA009944332211FFEEDDCC, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_0F1E2D3C4B5A6978879605A4B3C2D1E0, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_0000AAAABBBB11112222333344449999, 0x_CCCCDDDDEEEEFFFF5555666677778888],
4163                    [0x_321123456789ABCDEF00FEDCBA987654_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCC5544332211BBAA0099887766, 0x_1F2E3D4CC4D3E2F15B6A70899807A6B5, 0x_F1E2D3C4B4C3D2E1F5A6079889706A5B, 0x_102F3E4DD4E3F2015C6B7A8998A7B6C5, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB, 0x_FEDCBA989ABCDEF87654321001234567, 0x_CCDDEEFF112233449900AABB55667788, 0x_FFEEDDCCBBAA00998877665544332211, 0x_9807A6B51F2E3D4C5B6A7089C4D3E2F1, 0x_879605A44B5A6978B3C2D1E00F1E2D3C, 0x_5D4E3F201102F3E98A7B6C4D5C6B7A89, 0x_11112222AAAABBBB3333444499990000, 0x_77778888CCCCDDDD55556666EEEEFFFF]];
4164    println!("RSA_2048_u128: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
4165    println!("RSA_2048_u128: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
4166    print!("RSA_2048_u128: Message = [");
4167    for mm in message
4168    {
4169        print!(" [");
4170        for m in mm
4171            { print!("{:#X}, ", m); }
4172        print!(" ], ");
4173    }
4174    println!("]");
4175
4176    let cipher = rsa.encrypt_array_unit(&message);
4177    print!("RSA_2048_u128: Cipher = [");
4178    for cc in cipher
4179    {
4180        print!("[");
4181        for c in cc
4182            { print!("{:#X}, ", c); }
4183        print!("], ");
4184    }
4185    println!("]");
4186    assert_eq!(cipher, [[0x839DAD116A1FCA0A88DE30958512746, 0xBFEF2D6407991B2673655BFB63C593A1, 0xFAE91CB14B6969DA6C4BFFD58602856F, 0x3A34449355FF5A2B487811E8CE340203, 0xCBF46CC4D1BB3CA2B6E7FC8E40933E17, 0xCEE3C80C904ED6EA71195B4A799D9F6, 0x16839F92C32D05797C396E59C50713C0, 0xF885BEAC66AB311232913210B7AACD80, 0xD55E6E53DC8E5EFA8E4B37AF75BC7B1A, 0x1CF6778B55F529D7AC8C176F55168D6A, 0x8733A73CFF1F2E96B828CD006927C346, 0x55EA897A87E4317B107A6AC1DCF3EC8B, 0x7A52100A72E3C18C7D109B38484B9F8C, 0xA0AAF25EEC16E847D2232D3E69574CD9, 0x1A7CC15644211691527275697812251E, 0x144B8CDE8D7CE45BF70A2641458B9D97],
4187                        [0x1A6F8D281CC9E10B8451F77AAF8EA34A, 0x46A8B16B759DCD636F52F1B1E535B, 0xFAAA44CBD47357D1694603D4A4DB4947, 0xB996F502E31648FD281FF56718A7D50A, 0x430A5970A3CBC1C61E1509C7F6FFC57F, 0x9AC886D16A104F83BDDE7C4B87501C03, 0x15689F6A781B31B4CAE6D365AFE5FCB3, 0x3E7EECD94281CB9AE042223EC393431, 0x41F39B10F3F0D946B958CB54ED46EEB9, 0xB6A22DD02CCB18C5C2152C2EDDAA89AF, 0xAA738CC74B40BCCAE4E9D89D4FEA1DC7, 0xE78C09629C4BF16830A41CA81FCF3CBD, 0x4957120044970C825FE30C7A96F42DE, 0x5DDA4CE5B6DBFB740C8880E2F4BEA26E, 0xB91E53CA72E227CAA6860B6E2AFE2CD0, 0x204ABDC606DFA0EFEC31BAC17DC37372],
4188                        [0x872DF0A7D7142C093E6622313EC97176, 0x4A6CBDE9E5ED5CDF9A2EB827912E04C9, 0x3D9005DDD5F05DD81EC68548AD9C195, 0xC7F81B10CC9A7BA5406BA4B03DB693E4, 0x5C3686F645CC9F4A78195A945B0FEEA7, 0xEB44EB696543C935CEA9D40FB17EA923, 0xED63CB323DEE373C464C27109C406F87, 0x38A4E18703160BC68DE9C7BAF784D1B4, 0x97047FAD40030B00F8486078D7C49411, 0xD68F4FED16279A66B00E34F5B837A89F, 0x8E1A882C2BB360C25ED4AED0470BD897, 0x64E737E55B8DFBA2DC1257F474A73D94, 0x69134CCD7C9AD0B4C7822C68395C8152, 0x4AA60B4C1101F3A44F72EDF6BD2535D6, 0xE11617FB0C85FADFF886D1E7BB03EC35, 0x10AA50CD90BD84BBBAD3992FAA005E06]]);
4189    let recovered = rsa.decrypt_array_unit(&cipher);
4190    
4191    print!("RSA_2048_u128: Recovered = [");
4192    for rr in recovered
4193    {
4194        print!("[");
4195        for r in rr
4196            { print!("{:#X}, ", r); }
4197        print!("], ");
4198    }
4199    println!("]");
4200    assert_eq!(recovered, [[0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF],
4201                        [0x_21123456789ABCDEF00FEDCBA9876543_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_89706A5B4C3D2E1FF1E2D3C4B5A60798, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_11112222777788883333444455556666, 0x_99990000EEEEFFFFAAAABBBBCCCCDDDD, 0x_0123456789ABCDEFFEDCBA9876543210, 0x_11223344556677889900AABBCCDDEEFF, 0x_88776655BBAA009944332211FFEEDDCC, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_0F1E2D3C4B5A6978879605A4B3C2D1E0, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_0000AAAABBBB11112222333344449999, 0x_CCCCDDDDEEEEFFFF5555666677778888],
4202                        [0x_321123456789ABCDEF00FEDCBA987654_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCC5544332211BBAA0099887766, 0x_1F2E3D4CC4D3E2F15B6A70899807A6B5, 0x_F1E2D3C4B4C3D2E1F5A6079889706A5B, 0x_102F3E4DD4E3F2015C6B7A8998A7B6C5, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB, 0x_FEDCBA989ABCDEF87654321001234567, 0x_CCDDEEFF112233449900AABB55667788, 0x_FFEEDDCCBBAA00998877665544332211, 0x_9807A6B51F2E3D4C5B6A7089C4D3E2F1, 0x_879605A44B5A6978B3C2D1E00F1E2D3C, 0x_5D4E3F201102F3E98A7B6C4D5C6B7A89, 0x_11112222AAAABBBB3333444499990000, 0x_77778888CCCCDDDD55556666EEEEFFFF]]);
4203    assert_eq!(recovered, message);
4204
4205    // Example for RSA_4096_u128
4206    use cryptocol::asymmetric::RSA_4096_u128;
4207
4208    let public_key = U4096::from(5_u8);
4209    let private_key = U4096::from_str_radix("4E0F13FFD94F4F793ED6900C7A99EA88942D3A065EB7E72E741A77CE7BB6AD5B7FFB2B83B6154A975FAE613F22A739F54E305BDCD85A5A3D5C59C28FEDB6AC2CF03272A57C25ED4CEAAF8006321DA2529F381EF51B050FA1AC7DE541624A19AFE8561C1407F9D3333AA364DDA03A5E50ACA61C7E52850C519549AB45B82AE1E831D7FE401A641CB47A4711340F4B6D2F9822D32442168D2517B5CB9E6A01FB89D9B8240858269DA12F8B0E247AD1D0DA835C3F38390EB4BA56EAA266FF113CA7DD7817AF156E994C21738839D1E4B6AE4B04332F09DC6A047F75FF521E6868697998CBCE9CBA7C505A97C01C510BED5CDBB55D4E624CA14A9D5A4A05851F0842904604D544B6FBF154BAF9FAB89A2765A41A6BD17E631B079429AED230B2F72777350CEF5CA6E89784376003BA8F189F671D9451EE86039EF8F2DE7B6E9A3A37A4C15BD8ACE6CCA3B218CD59D018674DDE5BCF25487464AFDA648A475D6BCEA1A95F2E2937DB1CEE3C9E7EBB2492ED275DCD9089A2909CBBDEB0368EDC5E6DBD12582E171DF0724C5534204F656E095339C5E19D5665D214D3E4F05F6A18F3D0B3E95D16996EE3E49A239C8673A78D0DD90F36DBE6F85B316DD1E2AFED84D3823F5EAE9088176309CC33056B2976C31C8EC94C5FAA62E466CFC8FFE8D6DCB106DB27BA551C1A041561E597C967C1C8568D3C605BD703877343E0C4B4E932E10D", 16).unwrap();
4210    let modulus = U4096::from_str_radix("6192d8ffcfa323578e8c340f9940652ab9388887f665e0fa112115c21aa458b25ff9f664a39a9d3d3799f98eeb510872a1bc72d40e70f0ccb3703333e92457382c3f0f4edb2f68a0255b6007bea50ae7470626b261c6538a179d5e91badca01be26ba31909f84800094c3e150848f5e4d7cfa39de7264f65fa9c161726359a623e4dfdd020fd23e198d8d581131e487b7e2b87ed529c306e5da33e8604827a6c50262d0a6e3045097b6dd1ad9986451124334f06475261e8eca54b00bed58bd1d4d61d9adaca3f9f29d06a48465de459ddc53ffacc5384859f537f26a6028283d7fefec243e91b64713db023654ee8b412a2b4a1fadfc99d44b0dc86e666ca5470704b8bfe5fd708ddd576bd021bf4c2d813279ec0d74f4e03a53557f2cefde2cd9e9d01c72be14754f7a4472dfe8ef653fe73980d1edc3727501f5594863d2e32a8abf8fc04c44f8aac2e9bda32a8d154a62107bdc1f2f394b9ae693e84d6c7ba4143c15b39fed115fd4265fc230c3e9cd830d56f7866e09042569c80517596f8fcef6ed1e31962d3805d2d811248b11006e1dc14d03c98f5daeca854ad44eac60878e807d26656e5f91e4cfeeb16b8f8ba4d04d398737af8fd4a6b7f1b31e390dee1dfc5e117cdd76b4e26b2407480d97a1503f8aa01f676d6ddbce264e1cd4ec3f2ef903632865fe85795d5298432df45cae39771f83155b8da0979de9f23", 16).unwrap();
4211    let rsa = RSA_4096_u128::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
4212    let message = [[0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000],
4213                    [0x_3456789ABCDEF00FEDCBA98765432112_u128, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_89706A5B4C3D2E1FF1E2D3C4B5A60798, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB, 0x_0123456789ABCDEFFEDCBA9876543210, 0x_556677889900AABB11223344CCDDEEFF, 0x_44332211FFEEDDCC88776655BBAA0099, 0x_4D3E2F11F29807A6B5CE3D4C5B6A7089, 0x_2D1E00F1E2D879605A4B3C3C4B5A6978, 0x_E3F201102F3E98A7B6C5D44D5C6B7A89, 0x_333344449999111122220000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000],
4214                    [0x_56789ABCDEF00FEDCBA9876543211234_u128, 0x_11223344CCDDEEFF556677889900AABB, 0x_FFEEDDCC5544332211BBAA0099887766, 0x_5B6A70899807A6B51F2E3D4CC4D3E2F1, 0x_B5A6079889706A5BF1E2D3C44C3D2E1F, 0x_102F3E4DD4E3F2015C6B7A8998A7B6C5, 0x_33334444555566661111222277778888, 0x_99990000EEEEFFFFAAAABBBBCCCCDDDD, 0x_FEDCBA99ABCDEF876543210012345678, 0x_CCDDEEFF112233449900AABB55667788, 0x_88776655BBAA009944332211FFEEDDCC, 0x_9807A6B5C5B6A7089C4D3E2F11F2E3D4, 0x_879605A43C4B5A6978B3C2D1E00F1E2D, 0x_E3F201102F3E98A7B6C5D44D5C6B7A89, 0x_111122220000AAAABBBB333344449999, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000]];
4215
4216    println!("RSA_4096_u128: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
4217    println!("RSA_4096_u128: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
4218    print!("RSA_4096_u128: Message = [");
4219    for mm in message
4220    {
4221        print!(" [");
4222        for m in mm
4223            { print!("{:#X}, ", m); }
4224        print!(" ], ");
4225    }
4226    println!("]");
4227
4228    let cipher = rsa.encrypt_array_unit(&message);
4229    print!("RSA_4096_u128: Cipher = [");
4230    for cc in cipher
4231    {
4232        print!("[");
4233        for c in cc
4234            { print!("{:#X}, ", c); }
4235        print!("], ");
4236    }
4237    println!("]");
4238    assert_eq!(cipher, [[0x50C6112C753A7FEE2C5F6411297D441C, 0x2E7B2CE2464B45EB0C967B739765F75A, 0xAA644C8B718D227DBE324F210AD8D127, 0x82F3C8945E688409B060802D478530AD, 0xC09E5C5CE9E5766FA2287A369930DB71, 0xA366D2415D195295DD452F9EB4DEBA1E, 0x27A5AA6F6BDE070EEDAB47C65C0E152E, 0xC4A9C2641919644655B1038D134009FB, 0x9EADB1FCF8EBC560A437DCD5AEC6AB51, 0xEF92D5BC205583266C10C632A446D423, 0xC40239A39BA2A06D61316515124F75C2, 0x8FFBEDA73BE3A38FFF04ED8B826440E8, 0xE799865E82A21E50F37A69D3BB154B25, 0x2E6B7BDFA92673B58DDA3FF8B9FC1E91, 0xEE7B7D26D1EC6253F10FFFAF2C6630AB, 0x7516FFA2821954B56233235AE367BC27, 0xE70F4930C6672059B9A7901E1BBF54E5, 0x2E39E8A149CDEBB8D4C1224339A64754, 0x31D7D3A7EC85450F94D3E2FCCAF382AD, 0x4F99EF5CF7C96DC1095BB0C42FC47057, 0xCF8D9BB4A1D4CD71A77AD0D64B14F7D7, 0x558B0A296118438B0367BD1B6F9EB898, 0x1F26303FA44449C83721EBBFC7E346CA, 0xABD140D0CD0F2DFF802240334205F7A3, 0xC09A4F193291E8D8D51B8A189AD41EDD, 0xBF50027C5BC8D0ECA6BDBAB9A53D31ED, 0x8960EBE0F1016DBF98A46C2ED8EFD4C7, 0x86B53F64C64D7A6B8C5F0A555783CE6E, 0xCB8C74E197A089B12267960685D2EF84, 0x389545E14F79D2D0EFFE6EC3A3CCC592, 0xBC113DF786CAF327DC0004BA84719E7C, 0xDD5831F77A8AD437D93A4A0D875A5C24],
4239                        [0xC992089EF20B52DFE551A4FEF8EA263C, 0x9D510616D7EF3A7875DC52BC74176FCA, 0x9D06E31C6FF6C7D6F44E4A6D76A595DC, 0xDCB6326C8E44C9F55B10CD8B1447F881, 0x62ACFF3EA9DAE98AD008BBB10B79F18C, 0x154367CF3041C333F774DD3D2A7C3CB7, 0x8EB7CE1A8DAD43590B7DE12F1DE4A90A, 0x29A2736502E3CC59A03E2ACFB11561CE, 0xA76CDC7CBDB3F787C186776C884BCF0C, 0xBBC4F265C308A18E341DB3CE32D0EC90, 0xCB2DCA030D4C2339BBE9D9308EA878C3, 0xDC6187A5851158E0F9086339AAA4361D, 0x587630DFD762704BB0DFC87FB85DC071, 0xCC6F76A4E72DEAB177702F19B0F3AFEE, 0x4AA72B7DE1803C31682257BBFBF91FE9, 0x166C0187B249A538D3B607D4319536E0, 0x209A5B74826266CD9F1089ABF121272D, 0xE0114D4CC89964C2698A875E51B7F6E4, 0xC92137E4632EA904FBFD50C3E32315E8, 0x79EFE6C6F50773CD48F7122CCCEE3076, 0xC4FE9C9DC5F23FDA1BA83BBCECFD11AC, 0x63DC6592F96D707DE8A94956DC6D0467, 0xDD82AC4E47306665800811FC9AE27FEC, 0x98896DD488E4F5FC8B81352836931217, 0x258B79A2DBA6B4826C19905AB80D2269, 0x72D0CB256C2845D2C1A514BD1A3C9AA5, 0x669BB63AD2D4D5170E76971718C1F440, 0x7A1123D0D5AA71B78761B91085737599, 0x60E991E272B71CA3A02A5025BCD95883, 0x70FCE4A92151FCA99176C80FAD6601C7, 0x2707FC2F7216959F483B834FA16B991C, 0x8DCA257D3D3CEFCC0EF3E168771A46E0],
4240                        [0xC198B82B42A27BDDDB4CE2DCF42BE309, 0x178A5D5F9EA7255B46FF7A3E3E7A2747, 0x6835F752E81D248F4EC09632089FFAAD, 0xDF30C11F2D0DF0B50C1DAFB0F6EC565D, 0x8D3EBEA720D05AC8D303EBF536B1ED61, 0x17127731C4A65B45015CC58A63D136F6, 0x3E2B0D84AEA46599011BB2E094F6B581, 0xDEC69E3ABD857C7BDAE2987D6D5CD0FC, 0x63D78F4E356C3B311D25D80255669B9A, 0xBCF6D009D0FAC27531ECD98855BA82A4, 0x73F0F16B7849CBF808394AD04D3BBE36, 0x62A5A6123C06EC6DE3BE5312D5ED807, 0x3E857E8232B7326DB85AB01697AD95D3, 0xC52CB9A4EF4AF832FE9085C1C2105D2E, 0xBE4C22A5AB41472DA7B30970F302F044, 0xCA9FFB1D5195A499D63C7428CFB4ACA8, 0xF4B0C737E7D11482047A7DDD7604D98C, 0x880981C0C51A71DDE39A51F785040FBC, 0x4823B42590DAFC99443873F4BF4CAF2F, 0x3A175AF4B033E79D5A01621485C04D13, 0xE01ACB15713C68FEDE0BE592AB6FBAD1, 0xDB21D751ECF206684B77433DE2410568, 0x1E137E49BC29F1CD2D9D62C6E80C456D, 0x48E555B77C589B17AC1D53D2ECC20CD9, 0x87EEC26716EA1D9D5D5EC0B188418FB0, 0x147902F627C1B230B9E2E216B83A7E17, 0x85B9DAACBCF186FA707C4CDE525D2FB5, 0xF1F2AE4C6D61C17C2DBB8CF95E9AFE8A, 0x98004AFB94820CC2FB5177CD1ECCC2BF, 0x9E2C9D40E6B0697D2ECD1A0EBE22490, 0xC4714130C4D07CC1DD9D50270B62101F, 0xD2114B52E1E238E6107E5ABF087F511B]]);
4241    let recovered = rsa.decrypt_array_unit(&cipher);
4242    
4243    print!("RSA_4096_u128: Recovered = [");
4244    for rr in recovered
4245    {
4246        print!("[");
4247        for r in rr
4248            { print!("{:#X}, ", r); }
4249        print!("], ");
4250    }
4251    println!("]");
4252    assert_eq!(recovered, [[0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000],
4253                    [0x_3456789ABCDEF00FEDCBA98765432112_u128, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_89706A5B4C3D2E1FF1E2D3C4B5A60798, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB, 0x_0123456789ABCDEFFEDCBA9876543210, 0x_556677889900AABB11223344CCDDEEFF, 0x_44332211FFEEDDCC88776655BBAA0099, 0x_4D3E2F11F29807A6B5CE3D4C5B6A7089, 0x_2D1E00F1E2D879605A4B3C3C4B5A6978, 0x_E3F201102F3E98A7B6C5D44D5C6B7A89, 0x_333344449999111122220000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000],
4254                    [0x_56789ABCDEF00FEDCBA9876543211234_u128, 0x_11223344CCDDEEFF556677889900AABB, 0x_FFEEDDCC5544332211BBAA0099887766, 0x_5B6A70899807A6B51F2E3D4CC4D3E2F1, 0x_B5A6079889706A5BF1E2D3C44C3D2E1F, 0x_102F3E4DD4E3F2015C6B7A8998A7B6C5, 0x_33334444555566661111222277778888, 0x_99990000EEEEFFFFAAAABBBBCCCCDDDD, 0x_FEDCBA99ABCDEF876543210012345678, 0x_CCDDEEFF112233449900AABB55667788, 0x_88776655BBAA009944332211FFEEDDCC, 0x_9807A6B5C5B6A7089C4D3E2F11F2E3D4, 0x_879605A43C4B5A6978B3C2D1E00F1E2D, 0x_E3F201102F3E98A7B6C5D44D5C6B7A89, 0x_111122220000AAAABBBB333344449999, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000]]);
4255    assert_eq!(recovered, message);
4256
4257    // Example for RSA_1024_u64
4258    use cryptocol::asymmetric::RSA_1024_u64;
4259
4260    let public_key = U1024::from(7_u8);
4261    let private_key = U1024::from_str_radix("4703E575111E5E33F674DB8CB5C7AA883BCBC715FFF564645CD67F2AB09470D71575D6D88FBB6BC0FABD4837B2F1F3F01FE4F7D135EF2FA15476D88107881CB8D6594A0010F987144DD6243268D07A6C7002F5949E0886BA36F8BAA886B0D8311277977315FC7F93CD95AB72592F65A2AB7BE609C69AFC3D9B54BA3BB78FAD87", 16).unwrap();
4262    let modulus = U1024::from_str_radix("636bdad717f750af25d6ccf831b121f1ed507d1eccbdf2f2e85f7ed55d9c9df9ead82cc8c93996daf8a2984dfa85ef1cf973c158184edc48430cc8b4a424f504093508b4a1235839fd887c0ef40d7740b770a375457b0e95cda768e23799f94c34982315e6974fa1e1fb63d2a1be2ed341f22275bd098a6bb56e7efe2ba6f2ef", 16).unwrap();
4263    let rsa = RSA_1024_u64::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
4264    let message = [ [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6978879605A4B3C2D1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF],
4265                    [0x_23456789ABCDEF00FEDCBA9876543211_u128, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_F1E2D3C4B5A6978879605A4B3C2D1F, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB],
4266                    [0x_3456789ABCDEF00FEDCBA98765432112_u128, 0x_CCDDEEFF112233449900AABB55667788, 0x_44332211FFEEDD88776655CCBBAA0099, 0x_9807A6B5C5B6A70894D3E2F11F2E3D4C, 0x_F1E2D35A4B3C2D1FC4B5A697887960, 0x_4E3F201102F3E4D98A7B6C5D5C6B7A89, 0x_55556666333344447777888811112222, 0x_EEEEFFFF99990000CCCCDDDDAAAABBBB] ];
4267    println!("RSA_1024_u64: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
4268    println!("RSA_1024_u64: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
4269    print!("RSA_1024_u64: Message = [");
4270    for mm in message
4271    {
4272        print!(" [");
4273        for m in mm
4274            { print!("{:#X}, ", m); }
4275        print!(" ], ");
4276    }
4277    println!("]");
4278
4279    let mut m = [[0u64; 16]; 3];
4280    unsafe { copy_nonoverlapping(message.as_ptr() as *const u64, m.as_mut_ptr() as *mut u64, 16 * 3); }
4281    let cipher = rsa.encrypt_array_unit(&m);
4282    print!("RSA_1024_u64: Cipher = [");
4283    for cc in cipher
4284    {
4285        print!("[");
4286        for c in cc
4287            { print!("{:#X}, ", c); }
4288        print!("], ");
4289    }
4290    println!("]");
4291    assert_eq!(cipher, [[0x86C53D7EE181EC1C, 0xC64EE28F0C1EE84B, 0xDCCF7F8DBCB1272C, 0xDEE7F8065CCEE57E, 0xEAF66FB4260E66E3, 0xF3331A7584C29D28, 0xAF51309B6A98F58E, 0x36D16E3D988A192A, 0xD125283B8F7D9425, 0xBA29353564A9AC13, 0x347A393248A937F6, 0x596C50E5678E3AA9, 0x92CADF0A372F32F3, 0x527CDD75053A41E0, 0x16575D1C637C4679, 0xC2A8AAFA1E452703],
4292                        [0x9D289F9E6E971C27, 0xDCB604D05890CBE1, 0x8BB80EDF3DFF02E4, 0x47F83DFB16025971, 0x37D3D81E15DB89ED, 0x96B5A8B21C784012, 0x19C3EB1C9B73CDEB, 0xC7C05B117380AF9B, 0xA49804518778FFB1, 0xFBEC9BB07817EF0E, 0x17DF9B7F775226C3, 0xD482C2D8BAD86876, 0x63206A153AD54CCB, 0xCF893CDA5380238F, 0x278CC36D918FB53, 0xED9F1A8A88966E4F],
4293                        [0x4FF2B312732F2B30, 0x1A83AAC2764BC5FE, 0x8740A2986B97E97A, 0x6BE5488D0D0F1CCD, 0x44D8DD3355BCFAB6, 0xA4F2A20FF0BDF5E3, 0xDFFEA2C75ED64723, 0xBA258D210BB55E1E, 0x41087FE175A9D8B8, 0x97551901F73A3142, 0x94EAAEF3B4534FEC, 0x3A31B17E34A07F91, 0xAB7A50A16C49CF97, 0x3BDED4CB0EAFD8E4, 0xA8053DEA1360C56A, 0x9735C7FFF4967191]]);
4294    let recovered = rsa.decrypt_array_unit(&cipher);
4295    let mut rrr = [[0u128; 8]; 3];
4296    unsafe { copy_nonoverlapping(recovered.as_ptr() as *const u64, rrr.as_mut_ptr() as *mut u64, 16 * 3); }
4297    
4298    print!("RSA_1024_u64: Recovered = [");
4299    for rr in rrr
4300    {
4301        print!("[");
4302        for r in rr
4303            { print!("{:#X}, ", r); }
4304        print!("], ");
4305    }
4306    println!("]");
4307    assert_eq!(rrr, [[0x123456789ABCDEF00FEDCBA987654321, 0x11223344556677889900AABBCCDDEEFF, 0xFFEEDDCCBBAA00998877665544332211, 0x1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0xF1E2D3C4B5A6978879605A4B3C2D1F, 0x102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x11112222333344445555666677778888, 0x99990000AAAABBBBCCCCDDDDEEEEFFFF],
4308                    [0x23456789ABCDEF00FEDCBA9876543211, 0x9900AABBCCDDEEFF1122334455667788, 0x8877665544332211FFEEDDCCBBAA0099, 0x9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0xF1E2D3C4B5A6978879605A4B3C2D1F, 0x98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x55556666777788881111222233334444, 0xCCCCDDDDEEEEFFFF99990000AAAABBBB],
4309                    [0x3456789ABCDEF00FEDCBA98765432112, 0xCCDDEEFF112233449900AABB55667788, 0x44332211FFEEDD88776655CCBBAA0099, 0x9807A6B5C5B6A70894D3E2F11F2E3D4C, 0xF1E2D35A4B3C2D1FC4B5A697887960, 0x4E3F201102F3E4D98A7B6C5D5C6B7A89, 0x55556666333344447777888811112222, 0xEEEEFFFF99990000CCCCDDDDAAAABBBB]]);
4310    assert_eq!(rrr, message);
4311
4312    // Example for RSA_2048_u64
4313    use cryptocol::asymmetric::RSA_2048_u64;
4314
4315    let public_key = U2048::from(5_u8);
4316    let private_key = U2048::from_str_radix("49E61033258BFDFF87ADB347816E3D13BC07A9929F4064C5336F5FEC074C857BA6F64415DB647DD6CEE42842DF409A2B036839B814E6F2A1E507F2CDD91FB2B42BE6B4A40E0CFA0779437B42B8996CA31034CB90D84CB283870BE414756316FB300523F700BCC3D9E1B8183F8EA4675FF6F59D84FF3E120CE54C94B0A44E2C1DCCA68F3F0842DB99FCD7698234C374ABB28C2B5F5A5B1914F15F41163E16A54AEDA0CB6679EA1026BA97C00B0726DB7837F7478275D3688D2981898A7BB040CC9927F4204E8BA93B97992D1C13C17D9A53F4B834A2A56DD9633F5288BA125859413D3F197F7278F95F37503D2FDDF9F540154C491AAE943B13EF3C047AA5E1AD", 16).unwrap();
4317    let modulus = U2048::from_str_radix("7b2a1affe93ea7548ccc2acc826265cb8eb76ff45ec0a7f355b99fdeb6d4de78c0efc6cf18522710ae26edc4c96bab9d05adb58822d63f0dd30d3f57148a29d6f3d5d7bc176af60c74c5cd6f33aa5fba7057fdf1687fd4308bbe7c2218fa7ba2a55de69babe5466b22dd7dbf4312019ff0eeb132febcc8c028d4f7d111d79eddc056ec9cd74e3a369eefbc634b6544bcbd80ff73a941ab7614ccf740da8a1010a6e1799953abfdcbe9892520eb35733602807ef52fb6b4cf0664560e2feda618cceecba02038d0c3349e1634f778544f2ab941bd61788f30db3c0aeebefb02759f2e605f301e48b5235f3340fecb37e04bd34f53a2f516904532135a4a38b9e7", 16).unwrap();
4318    let rsa = RSA_2048_u64::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
4319    let message = [[0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF],
4320                    [0x_21123456789ABCDEF00FEDCBA9876543_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_89706A5B4C3D2E1FF1E2D3C4B5A60798, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_11112222777788883333444455556666, 0x_99990000EEEEFFFFAAAABBBBCCCCDDDD, 0x_0123456789ABCDEFFEDCBA9876543210, 0x_11223344556677889900AABBCCDDEEFF, 0x_88776655BBAA009944332211FFEEDDCC, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_0F1E2D3C4B5A6978879605A4B3C2D1E0, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_0000AAAABBBB11112222333344449999, 0x_CCCCDDDDEEEEFFFF5555666677778888],
4321                    [0x_321123456789ABCDEF00FEDCBA987654_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCC5544332211BBAA0099887766, 0x_1F2E3D4CC4D3E2F15B6A70899807A6B5, 0x_F1E2D3C4B4C3D2E1F5A6079889706A5B, 0x_102F3E4DD4E3F2015C6B7A8998A7B6C5, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB, 0x_FEDCBA989ABCDEF87654321001234567, 0x_CCDDEEFF112233449900AABB55667788, 0x_FFEEDDCCBBAA00998877665544332211, 0x_9807A6B51F2E3D4C5B6A7089C4D3E2F1, 0x_879605A44B5A6978B3C2D1E00F1E2D3C, 0x_5D4E3F201102F3E98A7B6C4D5C6B7A89, 0x_11112222AAAABBBB3333444499990000, 0x_77778888CCCCDDDD55556666EEEEFFFF]];
4322    println!("RSA_2048_u64: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
4323    println!("RSA_2048_u64: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
4324    print!("RSA_2048_u64: Message = [");
4325    for mm in message
4326    {
4327        print!(" [");
4328        for m in mm
4329            { print!("{:#X}, ", m); }
4330        print!(" ], ");
4331    }
4332    println!("]");
4333
4334    let mut m = [[0u64; 32]; 3];
4335    unsafe { copy_nonoverlapping(message.as_ptr() as *const u64, m.as_mut_ptr() as *mut u64, 32 * 3); }
4336    let cipher = rsa.encrypt_array_unit(&m);
4337    print!("RSA_2048_u64: Cipher = [");
4338    for cc in cipher
4339    {
4340        print!("[");
4341        for c in cc
4342            { print!("{:#X}, ", c); }
4343        print!("], ");
4344    }
4345    println!("]");
4346    assert_eq!(cipher, [[0xA88DE30958512746, 0x839DAD116A1FCA0, 0x73655BFB63C593A1, 0xBFEF2D6407991B26, 0x6C4BFFD58602856F, 0xFAE91CB14B6969DA, 0x487811E8CE340203, 0x3A34449355FF5A2B, 0xB6E7FC8E40933E17, 0xCBF46CC4D1BB3CA2, 0xA71195B4A799D9F6, 0xCEE3C80C904ED6E, 0x7C396E59C50713C0, 0x16839F92C32D0579, 0x32913210B7AACD80, 0xF885BEAC66AB3112, 0x8E4B37AF75BC7B1A, 0xD55E6E53DC8E5EFA, 0xAC8C176F55168D6A, 0x1CF6778B55F529D7, 0xB828CD006927C346, 0x8733A73CFF1F2E96, 0x107A6AC1DCF3EC8B, 0x55EA897A87E4317B, 0x7D109B38484B9F8C, 0x7A52100A72E3C18C, 0xD2232D3E69574CD9, 0xA0AAF25EEC16E847, 0x527275697812251E, 0x1A7CC15644211691, 0xF70A2641458B9D97, 0x144B8CDE8D7CE45B],
4347                        [0x8451F77AAF8EA34A, 0x1A6F8D281CC9E10B, 0xD636F52F1B1E535B, 0x46A8B16B759DC, 0x694603D4A4DB4947, 0xFAAA44CBD47357D1, 0x281FF56718A7D50A, 0xB996F502E31648FD, 0x1E1509C7F6FFC57F, 0x430A5970A3CBC1C6, 0xBDDE7C4B87501C03, 0x9AC886D16A104F83, 0xCAE6D365AFE5FCB3, 0x15689F6A781B31B4, 0xAE042223EC393431, 0x3E7EECD94281CB9, 0xB958CB54ED46EEB9, 0x41F39B10F3F0D946, 0xC2152C2EDDAA89AF, 0xB6A22DD02CCB18C5, 0xE4E9D89D4FEA1DC7, 0xAA738CC74B40BCCA, 0x30A41CA81FCF3CBD, 0xE78C09629C4BF168, 0x25FE30C7A96F42DE, 0x4957120044970C8, 0xC8880E2F4BEA26E, 0x5DDA4CE5B6DBFB74, 0xA6860B6E2AFE2CD0, 0xB91E53CA72E227CA, 0xEC31BAC17DC37372, 0x204ABDC606DFA0EF],
4348                        [0x3E6622313EC97176, 0x872DF0A7D7142C09, 0x9A2EB827912E04C9, 0x4A6CBDE9E5ED5CDF, 0x81EC68548AD9C195, 0x3D9005DDD5F05DD, 0x406BA4B03DB693E4, 0xC7F81B10CC9A7BA5, 0x78195A945B0FEEA7, 0x5C3686F645CC9F4A, 0xCEA9D40FB17EA923, 0xEB44EB696543C935, 0x464C27109C406F87, 0xED63CB323DEE373C, 0x8DE9C7BAF784D1B4, 0x38A4E18703160BC6, 0xF8486078D7C49411, 0x97047FAD40030B00, 0xB00E34F5B837A89F, 0xD68F4FED16279A66, 0x5ED4AED0470BD897, 0x8E1A882C2BB360C2, 0xDC1257F474A73D94, 0x64E737E55B8DFBA2, 0xC7822C68395C8152, 0x69134CCD7C9AD0B4, 0x4F72EDF6BD2535D6, 0x4AA60B4C1101F3A4, 0xF886D1E7BB03EC35, 0xE11617FB0C85FADF, 0xBAD3992FAA005E06, 0x10AA50CD90BD84BB]]);
4349    let recovered = rsa.decrypt_array_unit(&cipher);
4350    let mut rrr = [[0u128; 16]; 3];
4351    unsafe { copy_nonoverlapping(recovered.as_ptr() as *const u64, rrr.as_mut_ptr() as *mut u64, 32 * 3); }
4352    
4353    print!("RSA_2048_u64: Recovered = [");
4354    for rr in rrr
4355    {
4356        print!("[");
4357        for r in rr
4358            { print!("{:#X}, ", r); }
4359        print!("], ");
4360    }
4361    println!("]");
4362    assert_eq!(rrr, [[0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF],
4363                        [0x_21123456789ABCDEF00FEDCBA9876543_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_89706A5B4C3D2E1FF1E2D3C4B5A60798, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_11112222777788883333444455556666, 0x_99990000EEEEFFFFAAAABBBBCCCCDDDD, 0x_0123456789ABCDEFFEDCBA9876543210, 0x_11223344556677889900AABBCCDDEEFF, 0x_88776655BBAA009944332211FFEEDDCC, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_0F1E2D3C4B5A6978879605A4B3C2D1E0, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_0000AAAABBBB11112222333344449999, 0x_CCCCDDDDEEEEFFFF5555666677778888],
4364                        [0x_321123456789ABCDEF00FEDCBA987654_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCC5544332211BBAA0099887766, 0x_1F2E3D4CC4D3E2F15B6A70899807A6B5, 0x_F1E2D3C4B4C3D2E1F5A6079889706A5B, 0x_102F3E4DD4E3F2015C6B7A8998A7B6C5, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB, 0x_FEDCBA989ABCDEF87654321001234567, 0x_CCDDEEFF112233449900AABB55667788, 0x_FFEEDDCCBBAA00998877665544332211, 0x_9807A6B51F2E3D4C5B6A7089C4D3E2F1, 0x_879605A44B5A6978B3C2D1E00F1E2D3C, 0x_5D4E3F201102F3E98A7B6C4D5C6B7A89, 0x_11112222AAAABBBB3333444499990000, 0x_77778888CCCCDDDD55556666EEEEFFFF]]);
4365    assert_eq!(rrr, message);
4366
4367    // Example for RSA_4096_u64
4368    use cryptocol::asymmetric::RSA_4096_u64;
4369
4370    let public_key = U4096::from(5_u8);
4371    let private_key = U4096::from_str_radix("4E0F13FFD94F4F793ED6900C7A99EA88942D3A065EB7E72E741A77CE7BB6AD5B7FFB2B83B6154A975FAE613F22A739F54E305BDCD85A5A3D5C59C28FEDB6AC2CF03272A57C25ED4CEAAF8006321DA2529F381EF51B050FA1AC7DE541624A19AFE8561C1407F9D3333AA364DDA03A5E50ACA61C7E52850C519549AB45B82AE1E831D7FE401A641CB47A4711340F4B6D2F9822D32442168D2517B5CB9E6A01FB89D9B8240858269DA12F8B0E247AD1D0DA835C3F38390EB4BA56EAA266FF113CA7DD7817AF156E994C21738839D1E4B6AE4B04332F09DC6A047F75FF521E6868697998CBCE9CBA7C505A97C01C510BED5CDBB55D4E624CA14A9D5A4A05851F0842904604D544B6FBF154BAF9FAB89A2765A41A6BD17E631B079429AED230B2F72777350CEF5CA6E89784376003BA8F189F671D9451EE86039EF8F2DE7B6E9A3A37A4C15BD8ACE6CCA3B218CD59D018674DDE5BCF25487464AFDA648A475D6BCEA1A95F2E2937DB1CEE3C9E7EBB2492ED275DCD9089A2909CBBDEB0368EDC5E6DBD12582E171DF0724C5534204F656E095339C5E19D5665D214D3E4F05F6A18F3D0B3E95D16996EE3E49A239C8673A78D0DD90F36DBE6F85B316DD1E2AFED84D3823F5EAE9088176309CC33056B2976C31C8EC94C5FAA62E466CFC8FFE8D6DCB106DB27BA551C1A041561E597C967C1C8568D3C605BD703877343E0C4B4E932E10D", 16).unwrap();
4372    let modulus = U4096::from_str_radix("6192d8ffcfa323578e8c340f9940652ab9388887f665e0fa112115c21aa458b25ff9f664a39a9d3d3799f98eeb510872a1bc72d40e70f0ccb3703333e92457382c3f0f4edb2f68a0255b6007bea50ae7470626b261c6538a179d5e91badca01be26ba31909f84800094c3e150848f5e4d7cfa39de7264f65fa9c161726359a623e4dfdd020fd23e198d8d581131e487b7e2b87ed529c306e5da33e8604827a6c50262d0a6e3045097b6dd1ad9986451124334f06475261e8eca54b00bed58bd1d4d61d9adaca3f9f29d06a48465de459ddc53ffacc5384859f537f26a6028283d7fefec243e91b64713db023654ee8b412a2b4a1fadfc99d44b0dc86e666ca5470704b8bfe5fd708ddd576bd021bf4c2d813279ec0d74f4e03a53557f2cefde2cd9e9d01c72be14754f7a4472dfe8ef653fe73980d1edc3727501f5594863d2e32a8abf8fc04c44f8aac2e9bda32a8d154a62107bdc1f2f394b9ae693e84d6c7ba4143c15b39fed115fd4265fc230c3e9cd830d56f7866e09042569c80517596f8fcef6ed1e31962d3805d2d811248b11006e1dc14d03c98f5daeca854ad44eac60878e807d26656e5f91e4cfeeb16b8f8ba4d04d398737af8fd4a6b7f1b31e390dee1dfc5e117cdd76b4e26b2407480d97a1503f8aa01f676d6ddbce264e1cd4ec3f2ef903632865fe85795d5298432df45cae39771f83155b8da0979de9f23", 16).unwrap();
4373    let rsa = RSA_4096_u64::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
4374    let message = [[0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000],
4375                    [0x_3456789ABCDEF00FEDCBA98765432112_u128, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_89706A5B4C3D2E1FF1E2D3C4B5A60798, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB, 0x_0123456789ABCDEFFEDCBA9876543210, 0x_556677889900AABB11223344CCDDEEFF, 0x_44332211FFEEDDCC88776655BBAA0099, 0x_4D3E2F11F29807A6B5CE3D4C5B6A7089, 0x_2D1E00F1E2D879605A4B3C3C4B5A6978, 0x_E3F201102F3E98A7B6C5D44D5C6B7A89, 0x_333344449999111122220000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000],
4376                    [0x_56789ABCDEF00FEDCBA9876543211234_u128, 0x_11223344CCDDEEFF556677889900AABB, 0x_FFEEDDCC5544332211BBAA0099887766, 0x_5B6A70899807A6B51F2E3D4CC4D3E2F1, 0x_B5A6079889706A5BF1E2D3C44C3D2E1F, 0x_102F3E4DD4E3F2015C6B7A8998A7B6C5, 0x_33334444555566661111222277778888, 0x_99990000EEEEFFFFAAAABBBBCCCCDDDD, 0x_FEDCBA99ABCDEF876543210012345678, 0x_CCDDEEFF112233449900AABB55667788, 0x_88776655BBAA009944332211FFEEDDCC, 0x_9807A6B5C5B6A7089C4D3E2F11F2E3D4, 0x_879605A43C4B5A6978B3C2D1E00F1E2D, 0x_E3F201102F3E98A7B6C5D44D5C6B7A89, 0x_111122220000AAAABBBB333344449999, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000]];
4377
4378    println!("RSA_4096_u64: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
4379    println!("RSA_4096_u64: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
4380    print!("RSA_4096_u64: Message = [");
4381    for mm in message
4382    {
4383        print!(" [");
4384        for m in mm
4385            { print!("{:#X}, ", m); }
4386        print!(" ], ");
4387    }
4388    println!("]");
4389
4390    let mut m = [[0u64; 64]; 3];
4391    unsafe { copy_nonoverlapping(message.as_ptr() as *const u64, m.as_mut_ptr() as *mut u64, 64 * 3); }
4392    let cipher = rsa.encrypt_array_unit(&m);
4393    print!("RSA_4096_u64: Cipher = [");
4394    for cc in cipher
4395    {
4396        print!("[");
4397        for c in cc
4398            { print!("{:#X}, ", c); }
4399        print!("], ");
4400    }
4401    println!("]");
4402    assert_eq!(cipher, [[0x2C5F6411297D441C, 0x50C6112C753A7FEE, 0xC967B739765F75A, 0x2E7B2CE2464B45EB, 0xBE324F210AD8D127, 0xAA644C8B718D227D, 0xB060802D478530AD, 0x82F3C8945E688409, 0xA2287A369930DB71, 0xC09E5C5CE9E5766F, 0xDD452F9EB4DEBA1E, 0xA366D2415D195295, 0xEDAB47C65C0E152E, 0x27A5AA6F6BDE070E, 0x55B1038D134009FB, 0xC4A9C26419196446, 0xA437DCD5AEC6AB51, 0x9EADB1FCF8EBC560, 0x6C10C632A446D423, 0xEF92D5BC20558326, 0x61316515124F75C2, 0xC40239A39BA2A06D, 0xFF04ED8B826440E8, 0x8FFBEDA73BE3A38F, 0xF37A69D3BB154B25, 0xE799865E82A21E50, 0x8DDA3FF8B9FC1E91, 0x2E6B7BDFA92673B5, 0xF10FFFAF2C6630AB, 0xEE7B7D26D1EC6253, 0x6233235AE367BC27, 0x7516FFA2821954B5, 0xB9A7901E1BBF54E5, 0xE70F4930C6672059, 0xD4C1224339A64754, 0x2E39E8A149CDEBB8, 0x94D3E2FCCAF382AD, 0x31D7D3A7EC85450F, 0x95BB0C42FC47057, 0x4F99EF5CF7C96DC1, 0xA77AD0D64B14F7D7, 0xCF8D9BB4A1D4CD71, 0x367BD1B6F9EB898, 0x558B0A296118438B, 0x3721EBBFC7E346CA, 0x1F26303FA44449C8, 0x802240334205F7A3, 0xABD140D0CD0F2DFF, 0xD51B8A189AD41EDD, 0xC09A4F193291E8D8, 0xA6BDBAB9A53D31ED, 0xBF50027C5BC8D0EC, 0x98A46C2ED8EFD4C7, 0x8960EBE0F1016DBF, 0x8C5F0A555783CE6E, 0x86B53F64C64D7A6B, 0x2267960685D2EF84, 0xCB8C74E197A089B1, 0xEFFE6EC3A3CCC592, 0x389545E14F79D2D0, 0xDC0004BA84719E7C, 0xBC113DF786CAF327, 0xD93A4A0D875A5C24, 0xDD5831F77A8AD437],
4403                        [0xE551A4FEF8EA263C, 0xC992089EF20B52DF, 0x75DC52BC74176FCA, 0x9D510616D7EF3A78, 0xF44E4A6D76A595DC, 0x9D06E31C6FF6C7D6, 0x5B10CD8B1447F881, 0xDCB6326C8E44C9F5, 0xD008BBB10B79F18C, 0x62ACFF3EA9DAE98A, 0xF774DD3D2A7C3CB7, 0x154367CF3041C333, 0xB7DE12F1DE4A90A, 0x8EB7CE1A8DAD4359, 0xA03E2ACFB11561CE, 0x29A2736502E3CC59, 0xC186776C884BCF0C, 0xA76CDC7CBDB3F787, 0x341DB3CE32D0EC90, 0xBBC4F265C308A18E, 0xBBE9D9308EA878C3, 0xCB2DCA030D4C2339, 0xF9086339AAA4361D, 0xDC6187A5851158E0, 0xB0DFC87FB85DC071, 0x587630DFD762704B, 0x77702F19B0F3AFEE, 0xCC6F76A4E72DEAB1, 0x682257BBFBF91FE9, 0x4AA72B7DE1803C31, 0xD3B607D4319536E0, 0x166C0187B249A538, 0x9F1089ABF121272D, 0x209A5B74826266CD, 0x698A875E51B7F6E4, 0xE0114D4CC89964C2, 0xFBFD50C3E32315E8, 0xC92137E4632EA904, 0x48F7122CCCEE3076, 0x79EFE6C6F50773CD, 0x1BA83BBCECFD11AC, 0xC4FE9C9DC5F23FDA, 0xE8A94956DC6D0467, 0x63DC6592F96D707D, 0x800811FC9AE27FEC, 0xDD82AC4E47306665, 0x8B81352836931217, 0x98896DD488E4F5FC, 0x6C19905AB80D2269, 0x258B79A2DBA6B482, 0xC1A514BD1A3C9AA5, 0x72D0CB256C2845D2, 0xE76971718C1F440, 0x669BB63AD2D4D517, 0x8761B91085737599, 0x7A1123D0D5AA71B7, 0xA02A5025BCD95883, 0x60E991E272B71CA3, 0x9176C80FAD6601C7, 0x70FCE4A92151FCA9, 0x483B834FA16B991C, 0x2707FC2F7216959F, 0xEF3E168771A46E0, 0x8DCA257D3D3CEFCC],
4404                        [0xDB4CE2DCF42BE309, 0xC198B82B42A27BDD, 0x46FF7A3E3E7A2747, 0x178A5D5F9EA7255B, 0x4EC09632089FFAAD, 0x6835F752E81D248F, 0xC1DAFB0F6EC565D, 0xDF30C11F2D0DF0B5, 0xD303EBF536B1ED61, 0x8D3EBEA720D05AC8, 0x15CC58A63D136F6, 0x17127731C4A65B45, 0x11BB2E094F6B581, 0x3E2B0D84AEA46599, 0xDAE2987D6D5CD0FC, 0xDEC69E3ABD857C7B, 0x1D25D80255669B9A, 0x63D78F4E356C3B31, 0x31ECD98855BA82A4, 0xBCF6D009D0FAC275, 0x8394AD04D3BBE36, 0x73F0F16B7849CBF8, 0xDE3BE5312D5ED807, 0x62A5A6123C06EC6, 0xB85AB01697AD95D3, 0x3E857E8232B7326D, 0xFE9085C1C2105D2E, 0xC52CB9A4EF4AF832, 0xA7B30970F302F044, 0xBE4C22A5AB41472D, 0xD63C7428CFB4ACA8, 0xCA9FFB1D5195A499, 0x47A7DDD7604D98C, 0xF4B0C737E7D11482, 0xE39A51F785040FBC, 0x880981C0C51A71DD, 0x443873F4BF4CAF2F, 0x4823B42590DAFC99, 0x5A01621485C04D13, 0x3A175AF4B033E79D, 0xDE0BE592AB6FBAD1, 0xE01ACB15713C68FE, 0x4B77433DE2410568, 0xDB21D751ECF20668, 0x2D9D62C6E80C456D, 0x1E137E49BC29F1CD, 0xAC1D53D2ECC20CD9, 0x48E555B77C589B17, 0x5D5EC0B188418FB0, 0x87EEC26716EA1D9D, 0xB9E2E216B83A7E17, 0x147902F627C1B230, 0x707C4CDE525D2FB5, 0x85B9DAACBCF186FA, 0x2DBB8CF95E9AFE8A, 0xF1F2AE4C6D61C17C, 0xFB5177CD1ECCC2BF, 0x98004AFB94820CC2, 0xD2ECD1A0EBE22490, 0x9E2C9D40E6B0697, 0xDD9D50270B62101F, 0xC4714130C4D07CC1, 0x107E5ABF087F511B, 0xD2114B52E1E238E6]]);
4405    let recovered = rsa.decrypt_array_unit(&cipher);
4406    let mut rrr = [[0u128; 32]; 3];
4407    unsafe { copy_nonoverlapping(recovered.as_ptr() as *const u64, rrr.as_mut_ptr() as *mut u64, 64 * 3); }
4408    
4409    print!("RSA_4096_u64: Recovered = [");
4410    for rr in rrr
4411    {
4412        print!("[");
4413        for r in rr
4414            { print!("{:#X}, ", r); }
4415        print!("], ");
4416    }
4417    println!("]");
4418    assert_eq!(rrr, [[0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000],
4419                    [0x_3456789ABCDEF00FEDCBA98765432112_u128, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_89706A5B4C3D2E1FF1E2D3C4B5A60798, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB, 0x_0123456789ABCDEFFEDCBA9876543210, 0x_556677889900AABB11223344CCDDEEFF, 0x_44332211FFEEDDCC88776655BBAA0099, 0x_4D3E2F11F29807A6B5CE3D4C5B6A7089, 0x_2D1E00F1E2D879605A4B3C3C4B5A6978, 0x_E3F201102F3E98A7B6C5D44D5C6B7A89, 0x_333344449999111122220000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000],
4420                    [0x_56789ABCDEF00FEDCBA9876543211234_u128, 0x_11223344CCDDEEFF556677889900AABB, 0x_FFEEDDCC5544332211BBAA0099887766, 0x_5B6A70899807A6B51F2E3D4CC4D3E2F1, 0x_B5A6079889706A5BF1E2D3C44C3D2E1F, 0x_102F3E4DD4E3F2015C6B7A8998A7B6C5, 0x_33334444555566661111222277778888, 0x_99990000EEEEFFFFAAAABBBBCCCCDDDD, 0x_FEDCBA99ABCDEF876543210012345678, 0x_CCDDEEFF112233449900AABB55667788, 0x_88776655BBAA009944332211FFEEDDCC, 0x_9807A6B5C5B6A7089C4D3E2F11F2E3D4, 0x_879605A43C4B5A6978B3C2D1E00F1E2D, 0x_E3F201102F3E98A7B6C5D44D5C6B7A89, 0x_111122220000AAAABBBB333344449999, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000]]);
4421    assert_eq!(rrr, message);
4422
4423    // Example for RSA_1024_u32
4424    use cryptocol::asymmetric::RSA_1024_u32;
4425
4426    let public_key = U1024::from(7_u8);
4427    let private_key = U1024::from_str_radix("4703E575111E5E33F674DB8CB5C7AA883BCBC715FFF564645CD67F2AB09470D71575D6D88FBB6BC0FABD4837B2F1F3F01FE4F7D135EF2FA15476D88107881CB8D6594A0010F987144DD6243268D07A6C7002F5949E0886BA36F8BAA886B0D8311277977315FC7F93CD95AB72592F65A2AB7BE609C69AFC3D9B54BA3BB78FAD87", 16).unwrap();
4428    let modulus = U1024::from_str_radix("636bdad717f750af25d6ccf831b121f1ed507d1eccbdf2f2e85f7ed55d9c9df9ead82cc8c93996daf8a2984dfa85ef1cf973c158184edc48430cc8b4a424f504093508b4a1235839fd887c0ef40d7740b770a375457b0e95cda768e23799f94c34982315e6974fa1e1fb63d2a1be2ed341f22275bd098a6bb56e7efe2ba6f2ef", 16).unwrap();
4429    let rsa = RSA_1024_u32::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
4430    let message = [ [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6978879605A4B3C2D1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF],
4431                    [0x_23456789ABCDEF00FEDCBA9876543211_u128, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_F1E2D3C4B5A6978879605A4B3C2D1F, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB],
4432                    [0x_3456789ABCDEF00FEDCBA98765432112_u128, 0x_CCDDEEFF112233449900AABB55667788, 0x_44332211FFEEDD88776655CCBBAA0099, 0x_9807A6B5C5B6A70894D3E2F11F2E3D4C, 0x_F1E2D35A4B3C2D1FC4B5A697887960, 0x_4E3F201102F3E4D98A7B6C5D5C6B7A89, 0x_55556666333344447777888811112222, 0x_EEEEFFFF99990000CCCCDDDDAAAABBBB] ];
4433    println!("RSA_1024_u32: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
4434    println!("RSA_1024_u32: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
4435    print!("RSA_1024_u32: Message = [");
4436    for mm in message
4437    {
4438        print!(" [");
4439        for m in mm
4440            { print!("{:#X}, ", m); }
4441        print!(" ], ");
4442    }
4443    println!("]");
4444
4445    let mut m = [[0u32; 32]; 3];
4446    unsafe { copy_nonoverlapping(message.as_ptr() as *const u32, m.as_mut_ptr() as *mut u32, 32 * 3); }
4447    let cipher = rsa.encrypt_array_unit(&m);
4448    print!("RSA_1024_u32: Cipher = [");
4449    for cc in cipher
4450    {
4451        print!("[");
4452        for c in cc
4453            { print!("{:#X}, ", c); }
4454        print!("], ");
4455    }
4456    println!("]");
4457    assert_eq!(cipher, [[0xE181EC1C, 0x86C53D7E, 0xC1EE84B, 0xC64EE28F, 0xBCB1272C, 0xDCCF7F8D, 0x5CCEE57E, 0xDEE7F806, 0x260E66E3, 0xEAF66FB4, 0x84C29D28, 0xF3331A75, 0x6A98F58E, 0xAF51309B, 0x988A192A, 0x36D16E3D, 0x8F7D9425, 0xD125283B, 0x64A9AC13, 0xBA293535, 0x48A937F6, 0x347A3932, 0x678E3AA9, 0x596C50E5, 0x372F32F3, 0x92CADF0A, 0x53A41E0, 0x527CDD75, 0x637C4679, 0x16575D1C, 0x1E452703, 0xC2A8AAFA],
4458                        [0x6E971C27, 0x9D289F9E, 0x5890CBE1, 0xDCB604D0, 0x3DFF02E4, 0x8BB80EDF, 0x16025971, 0x47F83DFB, 0x15DB89ED, 0x37D3D81E, 0x1C784012, 0x96B5A8B2, 0x9B73CDEB, 0x19C3EB1C, 0x7380AF9B, 0xC7C05B11, 0x8778FFB1, 0xA4980451, 0x7817EF0E, 0xFBEC9BB0, 0x775226C3, 0x17DF9B7F, 0xBAD86876, 0xD482C2D8, 0x3AD54CCB, 0x63206A15, 0x5380238F, 0xCF893CDA, 0xD918FB53, 0x278CC36, 0x88966E4F, 0xED9F1A8A],
4459                        [0x732F2B30, 0x4FF2B312, 0x764BC5FE, 0x1A83AAC2, 0x6B97E97A, 0x8740A298, 0xD0F1CCD, 0x6BE5488D, 0x55BCFAB6, 0x44D8DD33, 0xF0BDF5E3, 0xA4F2A20F, 0x5ED64723, 0xDFFEA2C7, 0xBB55E1E, 0xBA258D21, 0x75A9D8B8, 0x41087FE1, 0xF73A3142, 0x97551901, 0xB4534FEC, 0x94EAAEF3, 0x34A07F91, 0x3A31B17E, 0x6C49CF97, 0xAB7A50A1, 0xEAFD8E4, 0x3BDED4CB, 0x1360C56A, 0xA8053DEA, 0xF4967191, 0x9735C7FF]]);
4460    let mut rrr = [[0u128; 8]; 3];
4461    let recovered = rsa.decrypt_array_unit(&cipher);
4462    unsafe { copy_nonoverlapping(recovered.as_ptr() as *const u32, rrr.as_mut_ptr() as *mut u32, 32 * 3); }
4463    
4464    print!("RSA_1024_u32: Recovered = [");
4465    for rr in rrr
4466    {
4467        print!("[");
4468        for r in rr
4469            { print!("{:#X}, ", r); }
4470        print!("], ");
4471    }
4472    println!("]");
4473    assert_eq!(rrr, [[0x123456789ABCDEF00FEDCBA987654321, 0x11223344556677889900AABBCCDDEEFF, 0xFFEEDDCCBBAA00998877665544332211, 0x1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0xF1E2D3C4B5A6978879605A4B3C2D1F, 0x102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x11112222333344445555666677778888, 0x99990000AAAABBBBCCCCDDDDEEEEFFFF],
4474                    [0x23456789ABCDEF00FEDCBA9876543211, 0x9900AABBCCDDEEFF1122334455667788, 0x8877665544332211FFEEDDCCBBAA0099, 0x9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0xF1E2D3C4B5A6978879605A4B3C2D1F, 0x98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x55556666777788881111222233334444, 0xCCCCDDDDEEEEFFFF99990000AAAABBBB],
4475                    [0x3456789ABCDEF00FEDCBA98765432112, 0xCCDDEEFF112233449900AABB55667788, 0x44332211FFEEDD88776655CCBBAA0099, 0x9807A6B5C5B6A70894D3E2F11F2E3D4C, 0xF1E2D35A4B3C2D1FC4B5A697887960, 0x4E3F201102F3E4D98A7B6C5D5C6B7A89, 0x55556666333344447777888811112222, 0xEEEEFFFF99990000CCCCDDDDAAAABBBB]]);
4476    assert_eq!(rrr, message);
4477
4478    // Example for RSA_2048_u32
4479    use cryptocol::asymmetric::RSA_2048_u32;
4480
4481    let public_key = U2048::from(5_u8);
4482    let private_key = U2048::from_str_radix("49E61033258BFDFF87ADB347816E3D13BC07A9929F4064C5336F5FEC074C857BA6F64415DB647DD6CEE42842DF409A2B036839B814E6F2A1E507F2CDD91FB2B42BE6B4A40E0CFA0779437B42B8996CA31034CB90D84CB283870BE414756316FB300523F700BCC3D9E1B8183F8EA4675FF6F59D84FF3E120CE54C94B0A44E2C1DCCA68F3F0842DB99FCD7698234C374ABB28C2B5F5A5B1914F15F41163E16A54AEDA0CB6679EA1026BA97C00B0726DB7837F7478275D3688D2981898A7BB040CC9927F4204E8BA93B97992D1C13C17D9A53F4B834A2A56DD9633F5288BA125859413D3F197F7278F95F37503D2FDDF9F540154C491AAE943B13EF3C047AA5E1AD", 16).unwrap();
4483    let modulus = U2048::from_str_radix("7b2a1affe93ea7548ccc2acc826265cb8eb76ff45ec0a7f355b99fdeb6d4de78c0efc6cf18522710ae26edc4c96bab9d05adb58822d63f0dd30d3f57148a29d6f3d5d7bc176af60c74c5cd6f33aa5fba7057fdf1687fd4308bbe7c2218fa7ba2a55de69babe5466b22dd7dbf4312019ff0eeb132febcc8c028d4f7d111d79eddc056ec9cd74e3a369eefbc634b6544bcbd80ff73a941ab7614ccf740da8a1010a6e1799953abfdcbe9892520eb35733602807ef52fb6b4cf0664560e2feda618cceecba02038d0c3349e1634f778544f2ab941bd61788f30db3c0aeebefb02759f2e605f301e48b5235f3340fecb37e04bd34f53a2f516904532135a4a38b9e7", 16).unwrap();
4484    let rsa = RSA_2048_u32::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
4485    let message = [[0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF],
4486                    [0x_21123456789ABCDEF00FEDCBA9876543_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_89706A5B4C3D2E1FF1E2D3C4B5A60798, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_11112222777788883333444455556666, 0x_99990000EEEEFFFFAAAABBBBCCCCDDDD, 0x_0123456789ABCDEFFEDCBA9876543210, 0x_11223344556677889900AABBCCDDEEFF, 0x_88776655BBAA009944332211FFEEDDCC, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_0F1E2D3C4B5A6978879605A4B3C2D1E0, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_0000AAAABBBB11112222333344449999, 0x_CCCCDDDDEEEEFFFF5555666677778888],
4487                    [0x_321123456789ABCDEF00FEDCBA987654_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCC5544332211BBAA0099887766, 0x_1F2E3D4CC4D3E2F15B6A70899807A6B5, 0x_F1E2D3C4B4C3D2E1F5A6079889706A5B, 0x_102F3E4DD4E3F2015C6B7A8998A7B6C5, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB, 0x_FEDCBA989ABCDEF87654321001234567, 0x_CCDDEEFF112233449900AABB55667788, 0x_FFEEDDCCBBAA00998877665544332211, 0x_9807A6B51F2E3D4C5B6A7089C4D3E2F1, 0x_879605A44B5A6978B3C2D1E00F1E2D3C, 0x_5D4E3F201102F3E98A7B6C4D5C6B7A89, 0x_11112222AAAABBBB3333444499990000, 0x_77778888CCCCDDDD55556666EEEEFFFF]];
4488    println!("RSA_2048_u32: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
4489    println!("RSA_2048_u32: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
4490    print!("RSA_2048_u32: Message = [");
4491    for mm in message
4492    {
4493        print!(" [");
4494        for m in mm
4495            { print!("{:#X}, ", m); }
4496        print!(" ], ");
4497    }
4498    println!("]");
4499
4500    let mut m = [[0u32; 64]; 3];
4501    unsafe { copy_nonoverlapping(message.as_ptr() as *const u32, m.as_mut_ptr() as *mut u32, 64 * 3); }
4502    let cipher = rsa.encrypt_array_unit(&m);
4503    print!("RSA_2048_u32: Cipher = [");
4504    for cc in cipher
4505    {
4506        print!("[");
4507        for c in cc
4508            { print!("{:#X}, ", c); }
4509        print!("], ");
4510    }
4511    println!("]");
4512    assert_eq!(cipher, [[0x58512746, 0xA88DE309, 0x16A1FCA0, 0x839DAD1, 0x63C593A1, 0x73655BFB, 0x7991B26, 0xBFEF2D64, 0x8602856F, 0x6C4BFFD5, 0x4B6969DA, 0xFAE91CB1, 0xCE340203, 0x487811E8, 0x55FF5A2B, 0x3A344493, 0x40933E17, 0xB6E7FC8E, 0xD1BB3CA2, 0xCBF46CC4, 0xA799D9F6, 0xA71195B4, 0xC904ED6E, 0xCEE3C80, 0xC50713C0, 0x7C396E59, 0xC32D0579, 0x16839F92, 0xB7AACD80, 0x32913210, 0x66AB3112, 0xF885BEAC, 0x75BC7B1A, 0x8E4B37AF, 0xDC8E5EFA, 0xD55E6E53, 0x55168D6A, 0xAC8C176F, 0x55F529D7, 0x1CF6778B, 0x6927C346, 0xB828CD00, 0xFF1F2E96, 0x8733A73C, 0xDCF3EC8B, 0x107A6AC1, 0x87E4317B, 0x55EA897A, 0x484B9F8C, 0x7D109B38, 0x72E3C18C, 0x7A52100A, 0x69574CD9, 0xD2232D3E, 0xEC16E847, 0xA0AAF25E, 0x7812251E, 0x52727569, 0x44211691, 0x1A7CC156, 0x458B9D97, 0xF70A2641, 0x8D7CE45B, 0x144B8CDE],
4513                        [0xAF8EA34A, 0x8451F77A, 0x1CC9E10B, 0x1A6F8D28, 0x1B1E535B, 0xD636F52F, 0x16B759DC, 0x46A8B, 0xA4DB4947, 0x694603D4, 0xD47357D1, 0xFAAA44CB, 0x18A7D50A, 0x281FF567, 0xE31648FD, 0xB996F502, 0xF6FFC57F, 0x1E1509C7, 0xA3CBC1C6, 0x430A5970, 0x87501C03, 0xBDDE7C4B, 0x6A104F83, 0x9AC886D1, 0xAFE5FCB3, 0xCAE6D365, 0x781B31B4, 0x15689F6A, 0xEC393431, 0xAE042223, 0x94281CB9, 0x3E7EECD, 0xED46EEB9, 0xB958CB54, 0xF3F0D946, 0x41F39B10, 0xDDAA89AF, 0xC2152C2E, 0x2CCB18C5, 0xB6A22DD0, 0x4FEA1DC7, 0xE4E9D89D, 0x4B40BCCA, 0xAA738CC7, 0x1FCF3CBD, 0x30A41CA8, 0x9C4BF168, 0xE78C0962, 0xA96F42DE, 0x25FE30C7, 0x44970C8, 0x4957120, 0xF4BEA26E, 0xC8880E2, 0xB6DBFB74, 0x5DDA4CE5, 0x2AFE2CD0, 0xA6860B6E, 0x72E227CA, 0xB91E53CA, 0x7DC37372, 0xEC31BAC1, 0x6DFA0EF, 0x204ABDC6],
4514                        [0x3EC97176, 0x3E662231, 0xD7142C09, 0x872DF0A7, 0x912E04C9, 0x9A2EB827, 0xE5ED5CDF, 0x4A6CBDE9, 0x8AD9C195, 0x81EC6854, 0xDD5F05DD, 0x3D9005D, 0x3DB693E4, 0x406BA4B0, 0xCC9A7BA5, 0xC7F81B10, 0x5B0FEEA7, 0x78195A94, 0x45CC9F4A, 0x5C3686F6, 0xB17EA923, 0xCEA9D40F, 0x6543C935, 0xEB44EB69, 0x9C406F87, 0x464C2710, 0x3DEE373C, 0xED63CB32, 0xF784D1B4, 0x8DE9C7BA, 0x3160BC6, 0x38A4E187, 0xD7C49411, 0xF8486078, 0x40030B00, 0x97047FAD, 0xB837A89F, 0xB00E34F5, 0x16279A66, 0xD68F4FED, 0x470BD897, 0x5ED4AED0, 0x2BB360C2, 0x8E1A882C, 0x74A73D94, 0xDC1257F4, 0x5B8DFBA2, 0x64E737E5, 0x395C8152, 0xC7822C68, 0x7C9AD0B4, 0x69134CCD, 0xBD2535D6, 0x4F72EDF6, 0x1101F3A4, 0x4AA60B4C, 0xBB03EC35, 0xF886D1E7, 0xC85FADF, 0xE11617FB, 0xAA005E06, 0xBAD3992F, 0x90BD84BB, 0x10AA50CD]]);
4515    let recovered = rsa.decrypt_array_unit(&cipher);
4516    let mut rrr = [[0u128; 16]; 3];
4517    unsafe { copy_nonoverlapping(recovered.as_ptr() as *const u32, rrr.as_mut_ptr() as *mut u32, 64 * 3); }
4518    
4519    print!("RSA_2048_u32: Recovered = [");
4520    for rr in rrr
4521    {
4522        print!("[");
4523        for r in rr
4524            { print!("{:#X}, ", r); }
4525        print!("], ");
4526    }
4527    println!("]");
4528    assert_eq!(rrr, [[0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF],
4529                        [0x_21123456789ABCDEF00FEDCBA9876543_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_89706A5B4C3D2E1FF1E2D3C4B5A60798, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_11112222777788883333444455556666, 0x_99990000EEEEFFFFAAAABBBBCCCCDDDD, 0x_0123456789ABCDEFFEDCBA9876543210, 0x_11223344556677889900AABBCCDDEEFF, 0x_88776655BBAA009944332211FFEEDDCC, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_0F1E2D3C4B5A6978879605A4B3C2D1E0, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_0000AAAABBBB11112222333344449999, 0x_CCCCDDDDEEEEFFFF5555666677778888],
4530                        [0x_321123456789ABCDEF00FEDCBA987654_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCC5544332211BBAA0099887766, 0x_1F2E3D4CC4D3E2F15B6A70899807A6B5, 0x_F1E2D3C4B4C3D2E1F5A6079889706A5B, 0x_102F3E4DD4E3F2015C6B7A8998A7B6C5, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB, 0x_FEDCBA989ABCDEF87654321001234567, 0x_CCDDEEFF112233449900AABB55667788, 0x_FFEEDDCCBBAA00998877665544332211, 0x_9807A6B51F2E3D4C5B6A7089C4D3E2F1, 0x_879605A44B5A6978B3C2D1E00F1E2D3C, 0x_5D4E3F201102F3E98A7B6C4D5C6B7A89, 0x_11112222AAAABBBB3333444499990000, 0x_77778888CCCCDDDD55556666EEEEFFFF]]);
4531    assert_eq!(rrr, message);
4532
4533    // Example for RSA_4096_u32
4534    use cryptocol::asymmetric::RSA_4096_u32;
4535
4536    let public_key = U4096::from(5_u8);
4537    let private_key = U4096::from_str_radix("4E0F13FFD94F4F793ED6900C7A99EA88942D3A065EB7E72E741A77CE7BB6AD5B7FFB2B83B6154A975FAE613F22A739F54E305BDCD85A5A3D5C59C28FEDB6AC2CF03272A57C25ED4CEAAF8006321DA2529F381EF51B050FA1AC7DE541624A19AFE8561C1407F9D3333AA364DDA03A5E50ACA61C7E52850C519549AB45B82AE1E831D7FE401A641CB47A4711340F4B6D2F9822D32442168D2517B5CB9E6A01FB89D9B8240858269DA12F8B0E247AD1D0DA835C3F38390EB4BA56EAA266FF113CA7DD7817AF156E994C21738839D1E4B6AE4B04332F09DC6A047F75FF521E6868697998CBCE9CBA7C505A97C01C510BED5CDBB55D4E624CA14A9D5A4A05851F0842904604D544B6FBF154BAF9FAB89A2765A41A6BD17E631B079429AED230B2F72777350CEF5CA6E89784376003BA8F189F671D9451EE86039EF8F2DE7B6E9A3A37A4C15BD8ACE6CCA3B218CD59D018674DDE5BCF25487464AFDA648A475D6BCEA1A95F2E2937DB1CEE3C9E7EBB2492ED275DCD9089A2909CBBDEB0368EDC5E6DBD12582E171DF0724C5534204F656E095339C5E19D5665D214D3E4F05F6A18F3D0B3E95D16996EE3E49A239C8673A78D0DD90F36DBE6F85B316DD1E2AFED84D3823F5EAE9088176309CC33056B2976C31C8EC94C5FAA62E466CFC8FFE8D6DCB106DB27BA551C1A041561E597C967C1C8568D3C605BD703877343E0C4B4E932E10D", 16).unwrap();
4538    let modulus = U4096::from_str_radix("6192d8ffcfa323578e8c340f9940652ab9388887f665e0fa112115c21aa458b25ff9f664a39a9d3d3799f98eeb510872a1bc72d40e70f0ccb3703333e92457382c3f0f4edb2f68a0255b6007bea50ae7470626b261c6538a179d5e91badca01be26ba31909f84800094c3e150848f5e4d7cfa39de7264f65fa9c161726359a623e4dfdd020fd23e198d8d581131e487b7e2b87ed529c306e5da33e8604827a6c50262d0a6e3045097b6dd1ad9986451124334f06475261e8eca54b00bed58bd1d4d61d9adaca3f9f29d06a48465de459ddc53ffacc5384859f537f26a6028283d7fefec243e91b64713db023654ee8b412a2b4a1fadfc99d44b0dc86e666ca5470704b8bfe5fd708ddd576bd021bf4c2d813279ec0d74f4e03a53557f2cefde2cd9e9d01c72be14754f7a4472dfe8ef653fe73980d1edc3727501f5594863d2e32a8abf8fc04c44f8aac2e9bda32a8d154a62107bdc1f2f394b9ae693e84d6c7ba4143c15b39fed115fd4265fc230c3e9cd830d56f7866e09042569c80517596f8fcef6ed1e31962d3805d2d811248b11006e1dc14d03c98f5daeca854ad44eac60878e807d26656e5f91e4cfeeb16b8f8ba4d04d398737af8fd4a6b7f1b31e390dee1dfc5e117cdd76b4e26b2407480d97a1503f8aa01f676d6ddbce264e1cd4ec3f2ef903632865fe85795d5298432df45cae39771f83155b8da0979de9f23", 16).unwrap();
4539    let rsa = RSA_4096_u32::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
4540    let message = [[0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000],
4541                    [0x_3456789ABCDEF00FEDCBA98765432112_u128, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_89706A5B4C3D2E1FF1E2D3C4B5A60798, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB, 0x_0123456789ABCDEFFEDCBA9876543210, 0x_556677889900AABB11223344CCDDEEFF, 0x_44332211FFEEDDCC88776655BBAA0099, 0x_4D3E2F11F29807A6B5CE3D4C5B6A7089, 0x_2D1E00F1E2D879605A4B3C3C4B5A6978, 0x_E3F201102F3E98A7B6C5D44D5C6B7A89, 0x_333344449999111122220000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000],
4542                    [0x_56789ABCDEF00FEDCBA9876543211234_u128, 0x_11223344CCDDEEFF556677889900AABB, 0x_FFEEDDCC5544332211BBAA0099887766, 0x_5B6A70899807A6B51F2E3D4CC4D3E2F1, 0x_B5A6079889706A5BF1E2D3C44C3D2E1F, 0x_102F3E4DD4E3F2015C6B7A8998A7B6C5, 0x_33334444555566661111222277778888, 0x_99990000EEEEFFFFAAAABBBBCCCCDDDD, 0x_FEDCBA99ABCDEF876543210012345678, 0x_CCDDEEFF112233449900AABB55667788, 0x_88776655BBAA009944332211FFEEDDCC, 0x_9807A6B5C5B6A7089C4D3E2F11F2E3D4, 0x_879605A43C4B5A6978B3C2D1E00F1E2D, 0x_E3F201102F3E98A7B6C5D44D5C6B7A89, 0x_111122220000AAAABBBB333344449999, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000]];
4543
4544    println!("RSA_4096_u32: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
4545    println!("RSA_4096_u32: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
4546    print!("RSA_4096_u32: Message = [");
4547    for mm in message
4548    {
4549        print!(" [");
4550        for m in mm
4551            { print!("{:#X}, ", m); }
4552        print!(" ], ");
4553    }
4554    println!("]");
4555
4556    let mut m = [[0u32; 128]; 3];
4557    unsafe { copy_nonoverlapping(message.as_ptr() as *const u32, m.as_mut_ptr() as *mut u32, 128 * 3); }
4558    let cipher = rsa.encrypt_array_unit(&m);
4559    print!("RSA_4096_u32: Cipher = [");
4560    for cc in cipher
4561    {
4562        print!("[");
4563        for c in cc
4564            { print!("{:#X}, ", c); }
4565        print!("], ");
4566    }
4567    println!("]");
4568    assert_eq!(cipher, [[0x297D441C, 0x2C5F6411, 0x753A7FEE, 0x50C6112C, 0x9765F75A, 0xC967B73, 0x464B45EB, 0x2E7B2CE2, 0xAD8D127, 0xBE324F21, 0x718D227D, 0xAA644C8B, 0x478530AD, 0xB060802D, 0x5E688409, 0x82F3C894, 0x9930DB71, 0xA2287A36, 0xE9E5766F, 0xC09E5C5C, 0xB4DEBA1E, 0xDD452F9E, 0x5D195295, 0xA366D241, 0x5C0E152E, 0xEDAB47C6, 0x6BDE070E, 0x27A5AA6F, 0x134009FB, 0x55B1038D, 0x19196446, 0xC4A9C264, 0xAEC6AB51, 0xA437DCD5, 0xF8EBC560, 0x9EADB1FC, 0xA446D423, 0x6C10C632, 0x20558326, 0xEF92D5BC, 0x124F75C2, 0x61316515, 0x9BA2A06D, 0xC40239A3, 0x826440E8, 0xFF04ED8B, 0x3BE3A38F, 0x8FFBEDA7, 0xBB154B25, 0xF37A69D3, 0x82A21E50, 0xE799865E, 0xB9FC1E91, 0x8DDA3FF8, 0xA92673B5, 0x2E6B7BDF, 0x2C6630AB, 0xF10FFFAF, 0xD1EC6253, 0xEE7B7D26, 0xE367BC27, 0x6233235A, 0x821954B5, 0x7516FFA2, 0x1BBF54E5, 0xB9A7901E, 0xC6672059, 0xE70F4930, 0x39A64754, 0xD4C12243, 0x49CDEBB8, 0x2E39E8A1, 0xCAF382AD, 0x94D3E2FC, 0xEC85450F, 0x31D7D3A7, 0x2FC47057, 0x95BB0C4, 0xF7C96DC1, 0x4F99EF5C, 0x4B14F7D7, 0xA77AD0D6, 0xA1D4CD71, 0xCF8D9BB4, 0x6F9EB898, 0x367BD1B, 0x6118438B, 0x558B0A29, 0xC7E346CA, 0x3721EBBF, 0xA44449C8, 0x1F26303F, 0x4205F7A3, 0x80224033, 0xCD0F2DFF, 0xABD140D0, 0x9AD41EDD, 0xD51B8A18, 0x3291E8D8, 0xC09A4F19, 0xA53D31ED, 0xA6BDBAB9, 0x5BC8D0EC, 0xBF50027C, 0xD8EFD4C7, 0x98A46C2E, 0xF1016DBF, 0x8960EBE0, 0x5783CE6E, 0x8C5F0A55, 0xC64D7A6B, 0x86B53F64, 0x85D2EF84, 0x22679606, 0x97A089B1, 0xCB8C74E1, 0xA3CCC592, 0xEFFE6EC3, 0x4F79D2D0, 0x389545E1, 0x84719E7C, 0xDC0004BA, 0x86CAF327, 0xBC113DF7, 0x875A5C24, 0xD93A4A0D, 0x7A8AD437, 0xDD5831F7],
4569                        [0xF8EA263C, 0xE551A4FE, 0xF20B52DF, 0xC992089E, 0x74176FCA, 0x75DC52BC, 0xD7EF3A78, 0x9D510616, 0x76A595DC, 0xF44E4A6D, 0x6FF6C7D6, 0x9D06E31C, 0x1447F881, 0x5B10CD8B, 0x8E44C9F5, 0xDCB6326C, 0xB79F18C, 0xD008BBB1, 0xA9DAE98A, 0x62ACFF3E, 0x2A7C3CB7, 0xF774DD3D, 0x3041C333, 0x154367CF, 0x1DE4A90A, 0xB7DE12F, 0x8DAD4359, 0x8EB7CE1A, 0xB11561CE, 0xA03E2ACF, 0x2E3CC59, 0x29A27365, 0x884BCF0C, 0xC186776C, 0xBDB3F787, 0xA76CDC7C, 0x32D0EC90, 0x341DB3CE, 0xC308A18E, 0xBBC4F265, 0x8EA878C3, 0xBBE9D930, 0xD4C2339, 0xCB2DCA03, 0xAAA4361D, 0xF9086339, 0x851158E0, 0xDC6187A5, 0xB85DC071, 0xB0DFC87F, 0xD762704B, 0x587630DF, 0xB0F3AFEE, 0x77702F19, 0xE72DEAB1, 0xCC6F76A4, 0xFBF91FE9, 0x682257BB, 0xE1803C31, 0x4AA72B7D, 0x319536E0, 0xD3B607D4, 0xB249A538, 0x166C0187, 0xF121272D, 0x9F1089AB, 0x826266CD, 0x209A5B74, 0x51B7F6E4, 0x698A875E, 0xC89964C2, 0xE0114D4C, 0xE32315E8, 0xFBFD50C3, 0x632EA904, 0xC92137E4, 0xCCEE3076, 0x48F7122C, 0xF50773CD, 0x79EFE6C6, 0xECFD11AC, 0x1BA83BBC, 0xC5F23FDA, 0xC4FE9C9D, 0xDC6D0467, 0xE8A94956, 0xF96D707D, 0x63DC6592, 0x9AE27FEC, 0x800811FC, 0x47306665, 0xDD82AC4E, 0x36931217, 0x8B813528, 0x88E4F5FC, 0x98896DD4, 0xB80D2269, 0x6C19905A, 0xDBA6B482, 0x258B79A2, 0x1A3C9AA5, 0xC1A514BD, 0x6C2845D2, 0x72D0CB25, 0x18C1F440, 0xE769717, 0xD2D4D517, 0x669BB63A, 0x85737599, 0x8761B910, 0xD5AA71B7, 0x7A1123D0, 0xBCD95883, 0xA02A5025, 0x72B71CA3, 0x60E991E2, 0xAD6601C7, 0x9176C80F, 0x2151FCA9, 0x70FCE4A9, 0xA16B991C, 0x483B834F, 0x7216959F, 0x2707FC2F, 0x771A46E0, 0xEF3E168, 0x3D3CEFCC, 0x8DCA257D],
4570                        [0xF42BE309, 0xDB4CE2DC, 0x42A27BDD, 0xC198B82B, 0x3E7A2747, 0x46FF7A3E, 0x9EA7255B, 0x178A5D5F, 0x89FFAAD, 0x4EC09632, 0xE81D248F, 0x6835F752, 0xF6EC565D, 0xC1DAFB0, 0x2D0DF0B5, 0xDF30C11F, 0x36B1ED61, 0xD303EBF5, 0x20D05AC8, 0x8D3EBEA7, 0x63D136F6, 0x15CC58A, 0xC4A65B45, 0x17127731, 0x94F6B581, 0x11BB2E0, 0xAEA46599, 0x3E2B0D84, 0x6D5CD0FC, 0xDAE2987D, 0xBD857C7B, 0xDEC69E3A, 0x55669B9A, 0x1D25D802, 0x356C3B31, 0x63D78F4E, 0x55BA82A4, 0x31ECD988, 0xD0FAC275, 0xBCF6D009, 0x4D3BBE36, 0x8394AD0, 0x7849CBF8, 0x73F0F16B, 0x2D5ED807, 0xDE3BE531, 0x23C06EC6, 0x62A5A61, 0x97AD95D3, 0xB85AB016, 0x32B7326D, 0x3E857E82, 0xC2105D2E, 0xFE9085C1, 0xEF4AF832, 0xC52CB9A4, 0xF302F044, 0xA7B30970, 0xAB41472D, 0xBE4C22A5, 0xCFB4ACA8, 0xD63C7428, 0x5195A499, 0xCA9FFB1D, 0x7604D98C, 0x47A7DDD, 0xE7D11482, 0xF4B0C737, 0x85040FBC, 0xE39A51F7, 0xC51A71DD, 0x880981C0, 0xBF4CAF2F, 0x443873F4, 0x90DAFC99, 0x4823B425, 0x85C04D13, 0x5A016214, 0xB033E79D, 0x3A175AF4, 0xAB6FBAD1, 0xDE0BE592, 0x713C68FE, 0xE01ACB15, 0xE2410568, 0x4B77433D, 0xECF20668, 0xDB21D751, 0xE80C456D, 0x2D9D62C6, 0xBC29F1CD, 0x1E137E49, 0xECC20CD9, 0xAC1D53D2, 0x7C589B17, 0x48E555B7, 0x88418FB0, 0x5D5EC0B1, 0x16EA1D9D, 0x87EEC267, 0xB83A7E17, 0xB9E2E216, 0x27C1B230, 0x147902F6, 0x525D2FB5, 0x707C4CDE, 0xBCF186FA, 0x85B9DAAC, 0x5E9AFE8A, 0x2DBB8CF9, 0x6D61C17C, 0xF1F2AE4C, 0x1ECCC2BF, 0xFB5177CD, 0x94820CC2, 0x98004AFB, 0xEBE22490, 0xD2ECD1A0, 0xE6B0697, 0x9E2C9D4, 0xB62101F, 0xDD9D5027, 0xC4D07CC1, 0xC4714130, 0x87F511B, 0x107E5ABF, 0xE1E238E6, 0xD2114B52]]);
4571    let recovered = rsa.decrypt_array_unit(&cipher);
4572    let mut rrr = [[0u128; 32]; 3];
4573    unsafe { copy_nonoverlapping(recovered.as_ptr() as *const u32, rrr.as_mut_ptr() as *mut u32, 128 * 3); }
4574    
4575    print!("RSA_4096_u32: Recovered = [");
4576    for rr in rrr
4577    {
4578        print!("[");
4579        for r in rr
4580            { print!("{:#X}, ", r); }
4581        print!("], ");
4582    }
4583    println!("]");
4584    assert_eq!(rrr, [[0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000],
4585                    [0x_3456789ABCDEF00FEDCBA98765432112_u128, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_89706A5B4C3D2E1FF1E2D3C4B5A60798, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB, 0x_0123456789ABCDEFFEDCBA9876543210, 0x_556677889900AABB11223344CCDDEEFF, 0x_44332211FFEEDDCC88776655BBAA0099, 0x_4D3E2F11F29807A6B5CE3D4C5B6A7089, 0x_2D1E00F1E2D879605A4B3C3C4B5A6978, 0x_E3F201102F3E98A7B6C5D44D5C6B7A89, 0x_333344449999111122220000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000],
4586                    [0x_56789ABCDEF00FEDCBA9876543211234_u128, 0x_11223344CCDDEEFF556677889900AABB, 0x_FFEEDDCC5544332211BBAA0099887766, 0x_5B6A70899807A6B51F2E3D4CC4D3E2F1, 0x_B5A6079889706A5BF1E2D3C44C3D2E1F, 0x_102F3E4DD4E3F2015C6B7A8998A7B6C5, 0x_33334444555566661111222277778888, 0x_99990000EEEEFFFFAAAABBBBCCCCDDDD, 0x_FEDCBA99ABCDEF876543210012345678, 0x_CCDDEEFF112233449900AABB55667788, 0x_88776655BBAA009944332211FFEEDDCC, 0x_9807A6B5C5B6A7089C4D3E2F11F2E3D4, 0x_879605A43C4B5A6978B3C2D1E00F1E2D, 0x_E3F201102F3E98A7B6C5D44D5C6B7A89, 0x_111122220000AAAABBBB333344449999, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000]]);
4587    assert_eq!(rrr, message);
4588
4589    // Example for RSA_1024_u16
4590    use cryptocol::asymmetric::RSA_1024_u16;
4591
4592    let public_key = U1024::from(7_u8);
4593    let private_key = U1024::from_str_radix("4703E575111E5E33F674DB8CB5C7AA883BCBC715FFF564645CD67F2AB09470D71575D6D88FBB6BC0FABD4837B2F1F3F01FE4F7D135EF2FA15476D88107881CB8D6594A0010F987144DD6243268D07A6C7002F5949E0886BA36F8BAA886B0D8311277977315FC7F93CD95AB72592F65A2AB7BE609C69AFC3D9B54BA3BB78FAD87", 16).unwrap();
4594    let modulus = U1024::from_str_radix("636bdad717f750af25d6ccf831b121f1ed507d1eccbdf2f2e85f7ed55d9c9df9ead82cc8c93996daf8a2984dfa85ef1cf973c158184edc48430cc8b4a424f504093508b4a1235839fd887c0ef40d7740b770a375457b0e95cda768e23799f94c34982315e6974fa1e1fb63d2a1be2ed341f22275bd098a6bb56e7efe2ba6f2ef", 16).unwrap();
4595    let rsa = RSA_1024_u16::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
4596    let message = [ [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6978879605A4B3C2D1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF],
4597                    [0x_23456789ABCDEF00FEDCBA9876543211_u128, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_F1E2D3C4B5A6978879605A4B3C2D1F, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB],
4598                    [0x_3456789ABCDEF00FEDCBA98765432112_u128, 0x_CCDDEEFF112233449900AABB55667788, 0x_44332211FFEEDD88776655CCBBAA0099, 0x_9807A6B5C5B6A70894D3E2F11F2E3D4C, 0x_F1E2D35A4B3C2D1FC4B5A697887960, 0x_4E3F201102F3E4D98A7B6C5D5C6B7A89, 0x_55556666333344447777888811112222, 0x_EEEEFFFF99990000CCCCDDDDAAAABBBB] ];
4599    println!("RSA_1024_u16: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
4600    println!("RSA_1024_u16: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
4601    print!("RSA_1024_u16: Message = [");
4602    for mm in message
4603    {
4604        print!(" [");
4605        for m in mm
4606            { print!("{:#X}, ", m); }
4607        print!(" ], ");
4608    }
4609    println!("]");
4610
4611    let mut m = [[0u16; 64]; 3];
4612    unsafe { copy_nonoverlapping(message.as_ptr() as *const u16, m.as_mut_ptr() as *mut u16, 64 * 3); }
4613    let cipher = rsa.encrypt_array_unit(&m);
4614    print!("RSA_1024_u16: Cipher = [");
4615    for cc in cipher
4616    {
4617        print!("[");
4618        for c in cc
4619            { print!("{:#X}, ", c); }
4620        print!("], ");
4621    }
4622    println!("]");
4623    assert_eq!(cipher, [[0xEC1C, 0xE181, 0x3D7E, 0x86C5, 0xE84B, 0xC1E, 0xE28F, 0xC64E, 0x272C, 0xBCB1, 0x7F8D, 0xDCCF, 0xE57E, 0x5CCE, 0xF806, 0xDEE7, 0x66E3, 0x260E, 0x6FB4, 0xEAF6, 0x9D28, 0x84C2, 0x1A75, 0xF333, 0xF58E, 0x6A98, 0x309B, 0xAF51, 0x192A, 0x988A, 0x6E3D, 0x36D1, 0x9425, 0x8F7D, 0x283B, 0xD125, 0xAC13, 0x64A9, 0x3535, 0xBA29, 0x37F6, 0x48A9, 0x3932, 0x347A, 0x3AA9, 0x678E, 0x50E5, 0x596C, 0x32F3, 0x372F, 0xDF0A, 0x92CA, 0x41E0, 0x53A, 0xDD75, 0x527C, 0x4679, 0x637C, 0x5D1C, 0x1657, 0x2703, 0x1E45, 0xAAFA, 0xC2A8],
4624                        [0x1C27, 0x6E97, 0x9F9E, 0x9D28, 0xCBE1, 0x5890, 0x4D0, 0xDCB6, 0x2E4, 0x3DFF, 0xEDF, 0x8BB8, 0x5971, 0x1602, 0x3DFB, 0x47F8, 0x89ED, 0x15DB, 0xD81E, 0x37D3, 0x4012, 0x1C78, 0xA8B2, 0x96B5, 0xCDEB, 0x9B73, 0xEB1C, 0x19C3, 0xAF9B, 0x7380, 0x5B11, 0xC7C0, 0xFFB1, 0x8778, 0x451, 0xA498, 0xEF0E, 0x7817, 0x9BB0, 0xFBEC, 0x26C3, 0x7752, 0x9B7F, 0x17DF, 0x6876, 0xBAD8, 0xC2D8, 0xD482, 0x4CCB, 0x3AD5, 0x6A15, 0x6320, 0x238F, 0x5380, 0x3CDA, 0xCF89, 0xFB53, 0xD918, 0xCC36, 0x278, 0x6E4F, 0x8896, 0x1A8A, 0xED9F],
4625                        [0x2B30, 0x732F, 0xB312, 0x4FF2, 0xC5FE, 0x764B, 0xAAC2, 0x1A83, 0xE97A, 0x6B97, 0xA298, 0x8740, 0x1CCD, 0xD0F, 0x488D, 0x6BE5, 0xFAB6, 0x55BC, 0xDD33, 0x44D8, 0xF5E3, 0xF0BD, 0xA20F, 0xA4F2, 0x4723, 0x5ED6, 0xA2C7, 0xDFFE, 0x5E1E, 0xBB5, 0x8D21, 0xBA25, 0xD8B8, 0x75A9, 0x7FE1, 0x4108, 0x3142, 0xF73A, 0x1901, 0x9755, 0x4FEC, 0xB453, 0xAEF3, 0x94EA, 0x7F91, 0x34A0, 0xB17E, 0x3A31, 0xCF97, 0x6C49, 0x50A1, 0xAB7A, 0xD8E4, 0xEAF, 0xD4CB, 0x3BDE, 0xC56A, 0x1360, 0x3DEA, 0xA805, 0x7191, 0xF496, 0xC7FF, 0x9735]]);
4626    let mut rrr = [[0u128; 8]; 3];
4627    let recovered = rsa.decrypt_array_unit(&cipher);
4628    unsafe { copy_nonoverlapping(recovered.as_ptr() as *const u16, rrr.as_mut_ptr() as *mut u16, 64 * 3); }
4629    
4630    print!("RSA_1024_u16: Recovered = [");
4631    for rr in rrr
4632    {
4633        print!("[");
4634        for r in rr
4635            { print!("{:#X}, ", r); }
4636        print!("], ");
4637    }
4638    println!("]");
4639    assert_eq!(rrr, [[0x123456789ABCDEF00FEDCBA987654321, 0x11223344556677889900AABBCCDDEEFF, 0xFFEEDDCCBBAA00998877665544332211, 0x1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0xF1E2D3C4B5A6978879605A4B3C2D1F, 0x102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x11112222333344445555666677778888, 0x99990000AAAABBBBCCCCDDDDEEEEFFFF],
4640                    [0x23456789ABCDEF00FEDCBA9876543211, 0x9900AABBCCDDEEFF1122334455667788, 0x8877665544332211FFEEDDCCBBAA0099, 0x9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0xF1E2D3C4B5A6978879605A4B3C2D1F, 0x98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x55556666777788881111222233334444, 0xCCCCDDDDEEEEFFFF99990000AAAABBBB],
4641                    [0x3456789ABCDEF00FEDCBA98765432112, 0xCCDDEEFF112233449900AABB55667788, 0x44332211FFEEDD88776655CCBBAA0099, 0x9807A6B5C5B6A70894D3E2F11F2E3D4C, 0xF1E2D35A4B3C2D1FC4B5A697887960, 0x4E3F201102F3E4D98A7B6C5D5C6B7A89, 0x55556666333344447777888811112222, 0xEEEEFFFF99990000CCCCDDDDAAAABBBB]]);
4642    assert_eq!(rrr, message);
4643
4644    // Example for RSA_2048_u16
4645    use cryptocol::asymmetric::RSA_2048_u16;
4646
4647    let public_key = U2048::from(5_u8);
4648    let private_key = U2048::from_str_radix("49E61033258BFDFF87ADB347816E3D13BC07A9929F4064C5336F5FEC074C857BA6F64415DB647DD6CEE42842DF409A2B036839B814E6F2A1E507F2CDD91FB2B42BE6B4A40E0CFA0779437B42B8996CA31034CB90D84CB283870BE414756316FB300523F700BCC3D9E1B8183F8EA4675FF6F59D84FF3E120CE54C94B0A44E2C1DCCA68F3F0842DB99FCD7698234C374ABB28C2B5F5A5B1914F15F41163E16A54AEDA0CB6679EA1026BA97C00B0726DB7837F7478275D3688D2981898A7BB040CC9927F4204E8BA93B97992D1C13C17D9A53F4B834A2A56DD9633F5288BA125859413D3F197F7278F95F37503D2FDDF9F540154C491AAE943B13EF3C047AA5E1AD", 16).unwrap();
4649    let modulus = U2048::from_str_radix("7b2a1affe93ea7548ccc2acc826265cb8eb76ff45ec0a7f355b99fdeb6d4de78c0efc6cf18522710ae26edc4c96bab9d05adb58822d63f0dd30d3f57148a29d6f3d5d7bc176af60c74c5cd6f33aa5fba7057fdf1687fd4308bbe7c2218fa7ba2a55de69babe5466b22dd7dbf4312019ff0eeb132febcc8c028d4f7d111d79eddc056ec9cd74e3a369eefbc634b6544bcbd80ff73a941ab7614ccf740da8a1010a6e1799953abfdcbe9892520eb35733602807ef52fb6b4cf0664560e2feda618cceecba02038d0c3349e1634f778544f2ab941bd61788f30db3c0aeebefb02759f2e605f301e48b5235f3340fecb37e04bd34f53a2f516904532135a4a38b9e7", 16).unwrap();
4650    let rsa = RSA_2048_u16::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
4651    let message = [[0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF],
4652                    [0x_21123456789ABCDEF00FEDCBA9876543_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_89706A5B4C3D2E1FF1E2D3C4B5A60798, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_11112222777788883333444455556666, 0x_99990000EEEEFFFFAAAABBBBCCCCDDDD, 0x_0123456789ABCDEFFEDCBA9876543210, 0x_11223344556677889900AABBCCDDEEFF, 0x_88776655BBAA009944332211FFEEDDCC, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_0F1E2D3C4B5A6978879605A4B3C2D1E0, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_0000AAAABBBB11112222333344449999, 0x_CCCCDDDDEEEEFFFF5555666677778888],
4653                    [0x_321123456789ABCDEF00FEDCBA987654_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCC5544332211BBAA0099887766, 0x_1F2E3D4CC4D3E2F15B6A70899807A6B5, 0x_F1E2D3C4B4C3D2E1F5A6079889706A5B, 0x_102F3E4DD4E3F2015C6B7A8998A7B6C5, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB, 0x_FEDCBA989ABCDEF87654321001234567, 0x_CCDDEEFF112233449900AABB55667788, 0x_FFEEDDCCBBAA00998877665544332211, 0x_9807A6B51F2E3D4C5B6A7089C4D3E2F1, 0x_879605A44B5A6978B3C2D1E00F1E2D3C, 0x_5D4E3F201102F3E98A7B6C4D5C6B7A89, 0x_11112222AAAABBBB3333444499990000, 0x_77778888CCCCDDDD55556666EEEEFFFF]];
4654    println!("RSA_2048_u16: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
4655    println!("RSA_2048_u16: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
4656    print!("RSA_2048_u16: Message = [");
4657    for mm in message
4658    {
4659        print!(" [");
4660        for m in mm
4661            { print!("{:#X}, ", m); }
4662        print!(" ], ");
4663    }
4664    println!("]");
4665
4666    let mut m = [[0u16; 128]; 3];
4667    unsafe { copy_nonoverlapping(message.as_ptr() as *const u16, m.as_mut_ptr() as *mut u16, 128 * 3); }
4668    let cipher = rsa.encrypt_array_unit(&m);
4669    print!("RSA_2048_u16: Cipher = [");
4670    for cc in cipher
4671    {
4672        print!("[");
4673        for c in cc
4674            { print!("{:#X}, ", c); }
4675        print!("], ");
4676    }
4677    println!("]");
4678    assert_eq!(cipher, [[0x2746, 0x5851, 0xE309, 0xA88D, 0xFCA0, 0x16A1, 0xDAD1, 0x839, 0x93A1, 0x63C5, 0x5BFB, 0x7365, 0x1B26, 0x799, 0x2D64, 0xBFEF, 0x856F, 0x8602, 0xFFD5, 0x6C4B, 0x69DA, 0x4B69, 0x1CB1, 0xFAE9, 0x203, 0xCE34, 0x11E8, 0x4878, 0x5A2B, 0x55FF, 0x4493, 0x3A34, 0x3E17, 0x4093, 0xFC8E, 0xB6E7, 0x3CA2, 0xD1BB, 0x6CC4, 0xCBF4, 0xD9F6, 0xA799, 0x95B4, 0xA711, 0xED6E, 0xC904, 0x3C80, 0xCEE, 0x13C0, 0xC507, 0x6E59, 0x7C39, 0x579, 0xC32D, 0x9F92, 0x1683, 0xCD80, 0xB7AA, 0x3210, 0x3291, 0x3112, 0x66AB, 0xBEAC, 0xF885, 0x7B1A, 0x75BC, 0x37AF, 0x8E4B, 0x5EFA, 0xDC8E, 0x6E53, 0xD55E, 0x8D6A, 0x5516, 0x176F, 0xAC8C, 0x29D7, 0x55F5, 0x778B, 0x1CF6, 0xC346, 0x6927, 0xCD00, 0xB828, 0x2E96, 0xFF1F, 0xA73C, 0x8733, 0xEC8B, 0xDCF3, 0x6AC1, 0x107A, 0x317B, 0x87E4, 0x897A, 0x55EA, 0x9F8C, 0x484B, 0x9B38, 0x7D10, 0xC18C, 0x72E3, 0x100A, 0x7A52, 0x4CD9, 0x6957, 0x2D3E, 0xD223, 0xE847, 0xEC16, 0xF25E, 0xA0AA, 0x251E, 0x7812, 0x7569, 0x5272, 0x1691, 0x4421, 0xC156, 0x1A7C, 0x9D97, 0x458B, 0x2641, 0xF70A, 0xE45B, 0x8D7C, 0x8CDE, 0x144B],
4679                        [0xA34A, 0xAF8E, 0xF77A, 0x8451, 0xE10B, 0x1CC9, 0x8D28, 0x1A6F, 0x535B, 0x1B1E, 0xF52F, 0xD636, 0x59DC, 0x16B7, 0x6A8B, 0x4, 0x4947, 0xA4DB, 0x3D4, 0x6946, 0x57D1, 0xD473, 0x44CB, 0xFAAA, 0xD50A, 0x18A7, 0xF567, 0x281F, 0x48FD, 0xE316, 0xF502, 0xB996, 0xC57F, 0xF6FF, 0x9C7, 0x1E15, 0xC1C6, 0xA3CB, 0x5970, 0x430A, 0x1C03, 0x8750, 0x7C4B, 0xBDDE, 0x4F83, 0x6A10, 0x86D1, 0x9AC8, 0xFCB3, 0xAFE5, 0xD365, 0xCAE6, 0x31B4, 0x781B, 0x9F6A, 0x1568, 0x3431, 0xEC39, 0x2223, 0xAE04, 0x1CB9, 0x9428, 0xEECD, 0x3E7, 0xEEB9, 0xED46, 0xCB54, 0xB958, 0xD946, 0xF3F0, 0x9B10, 0x41F3, 0x89AF, 0xDDAA, 0x2C2E, 0xC215, 0x18C5, 0x2CCB, 0x2DD0, 0xB6A2, 0x1DC7, 0x4FEA, 0xD89D, 0xE4E9, 0xBCCA, 0x4B40, 0x8CC7, 0xAA73, 0x3CBD, 0x1FCF, 0x1CA8, 0x30A4, 0xF168, 0x9C4B, 0x962, 0xE78C, 0x42DE, 0xA96F, 0x30C7, 0x25FE, 0x70C8, 0x449, 0x7120, 0x495, 0xA26E, 0xF4BE, 0x80E2, 0xC88, 0xFB74, 0xB6DB, 0x4CE5, 0x5DDA, 0x2CD0, 0x2AFE, 0xB6E, 0xA686, 0x27CA, 0x72E2, 0x53CA, 0xB91E, 0x7372, 0x7DC3, 0xBAC1, 0xEC31, 0xA0EF, 0x6DF, 0xBDC6, 0x204A],
4680                        [0x7176, 0x3EC9, 0x2231, 0x3E66, 0x2C09, 0xD714, 0xF0A7, 0x872D, 0x4C9, 0x912E, 0xB827, 0x9A2E, 0x5CDF, 0xE5ED, 0xBDE9, 0x4A6C, 0xC195, 0x8AD9, 0x6854, 0x81EC, 0x5DD, 0xDD5F, 0x5D, 0x3D9, 0x93E4, 0x3DB6, 0xA4B0, 0x406B, 0x7BA5, 0xCC9A, 0x1B10, 0xC7F8, 0xEEA7, 0x5B0F, 0x5A94, 0x7819, 0x9F4A, 0x45CC, 0x86F6, 0x5C36, 0xA923, 0xB17E, 0xD40F, 0xCEA9, 0xC935, 0x6543, 0xEB69, 0xEB44, 0x6F87, 0x9C40, 0x2710, 0x464C, 0x373C, 0x3DEE, 0xCB32, 0xED63, 0xD1B4, 0xF784, 0xC7BA, 0x8DE9, 0xBC6, 0x316, 0xE187, 0x38A4, 0x9411, 0xD7C4, 0x6078, 0xF848, 0xB00, 0x4003, 0x7FAD, 0x9704, 0xA89F, 0xB837, 0x34F5, 0xB00E, 0x9A66, 0x1627, 0x4FED, 0xD68F, 0xD897, 0x470B, 0xAED0, 0x5ED4, 0x60C2, 0x2BB3, 0x882C, 0x8E1A, 0x3D94, 0x74A7, 0x57F4, 0xDC12, 0xFBA2, 0x5B8D, 0x37E5, 0x64E7, 0x8152, 0x395C, 0x2C68, 0xC782, 0xD0B4, 0x7C9A, 0x4CCD, 0x6913, 0x35D6, 0xBD25, 0xEDF6, 0x4F72, 0xF3A4, 0x1101, 0xB4C, 0x4AA6, 0xEC35, 0xBB03, 0xD1E7, 0xF886, 0xFADF, 0xC85, 0x17FB, 0xE116, 0x5E06, 0xAA00, 0x992F, 0xBAD3, 0x84BB, 0x90BD, 0x50CD, 0x10AA]]);
4681    let recovered = rsa.decrypt_array_unit(&cipher);
4682    let mut rrr = [[0u128; 16]; 3];
4683    unsafe { copy_nonoverlapping(recovered.as_ptr() as *const u16, rrr.as_mut_ptr() as *mut u16, 128 * 3); }
4684    
4685    print!("RSA_2048_u16: Recovered = [");
4686    for rr in rrr
4687    {
4688        print!("[");
4689        for r in rr
4690            { print!("{:#X}, ", r); }
4691        print!("], ");
4692    }
4693    println!("]");
4694    assert_eq!(rrr, [[0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF],
4695                        [0x_21123456789ABCDEF00FEDCBA9876543_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_89706A5B4C3D2E1FF1E2D3C4B5A60798, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_11112222777788883333444455556666, 0x_99990000EEEEFFFFAAAABBBBCCCCDDDD, 0x_0123456789ABCDEFFEDCBA9876543210, 0x_11223344556677889900AABBCCDDEEFF, 0x_88776655BBAA009944332211FFEEDDCC, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_0F1E2D3C4B5A6978879605A4B3C2D1E0, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_0000AAAABBBB11112222333344449999, 0x_CCCCDDDDEEEEFFFF5555666677778888],
4696                        [0x_321123456789ABCDEF00FEDCBA987654_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCC5544332211BBAA0099887766, 0x_1F2E3D4CC4D3E2F15B6A70899807A6B5, 0x_F1E2D3C4B4C3D2E1F5A6079889706A5B, 0x_102F3E4DD4E3F2015C6B7A8998A7B6C5, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB, 0x_FEDCBA989ABCDEF87654321001234567, 0x_CCDDEEFF112233449900AABB55667788, 0x_FFEEDDCCBBAA00998877665544332211, 0x_9807A6B51F2E3D4C5B6A7089C4D3E2F1, 0x_879605A44B5A6978B3C2D1E00F1E2D3C, 0x_5D4E3F201102F3E98A7B6C4D5C6B7A89, 0x_11112222AAAABBBB3333444499990000, 0x_77778888CCCCDDDD55556666EEEEFFFF]]);
4697    assert_eq!(rrr, message);
4698
4699    // Example for RSA_4096_u16
4700    use cryptocol::asymmetric::RSA_4096_u16;
4701
4702    let public_key = U4096::from(5_u8);
4703    let private_key = U4096::from_str_radix("4E0F13FFD94F4F793ED6900C7A99EA88942D3A065EB7E72E741A77CE7BB6AD5B7FFB2B83B6154A975FAE613F22A739F54E305BDCD85A5A3D5C59C28FEDB6AC2CF03272A57C25ED4CEAAF8006321DA2529F381EF51B050FA1AC7DE541624A19AFE8561C1407F9D3333AA364DDA03A5E50ACA61C7E52850C519549AB45B82AE1E831D7FE401A641CB47A4711340F4B6D2F9822D32442168D2517B5CB9E6A01FB89D9B8240858269DA12F8B0E247AD1D0DA835C3F38390EB4BA56EAA266FF113CA7DD7817AF156E994C21738839D1E4B6AE4B04332F09DC6A047F75FF521E6868697998CBCE9CBA7C505A97C01C510BED5CDBB55D4E624CA14A9D5A4A05851F0842904604D544B6FBF154BAF9FAB89A2765A41A6BD17E631B079429AED230B2F72777350CEF5CA6E89784376003BA8F189F671D9451EE86039EF8F2DE7B6E9A3A37A4C15BD8ACE6CCA3B218CD59D018674DDE5BCF25487464AFDA648A475D6BCEA1A95F2E2937DB1CEE3C9E7EBB2492ED275DCD9089A2909CBBDEB0368EDC5E6DBD12582E171DF0724C5534204F656E095339C5E19D5665D214D3E4F05F6A18F3D0B3E95D16996EE3E49A239C8673A78D0DD90F36DBE6F85B316DD1E2AFED84D3823F5EAE9088176309CC33056B2976C31C8EC94C5FAA62E466CFC8FFE8D6DCB106DB27BA551C1A041561E597C967C1C8568D3C605BD703877343E0C4B4E932E10D", 16).unwrap();
4704    let modulus = U4096::from_str_radix("6192d8ffcfa323578e8c340f9940652ab9388887f665e0fa112115c21aa458b25ff9f664a39a9d3d3799f98eeb510872a1bc72d40e70f0ccb3703333e92457382c3f0f4edb2f68a0255b6007bea50ae7470626b261c6538a179d5e91badca01be26ba31909f84800094c3e150848f5e4d7cfa39de7264f65fa9c161726359a623e4dfdd020fd23e198d8d581131e487b7e2b87ed529c306e5da33e8604827a6c50262d0a6e3045097b6dd1ad9986451124334f06475261e8eca54b00bed58bd1d4d61d9adaca3f9f29d06a48465de459ddc53ffacc5384859f537f26a6028283d7fefec243e91b64713db023654ee8b412a2b4a1fadfc99d44b0dc86e666ca5470704b8bfe5fd708ddd576bd021bf4c2d813279ec0d74f4e03a53557f2cefde2cd9e9d01c72be14754f7a4472dfe8ef653fe73980d1edc3727501f5594863d2e32a8abf8fc04c44f8aac2e9bda32a8d154a62107bdc1f2f394b9ae693e84d6c7ba4143c15b39fed115fd4265fc230c3e9cd830d56f7866e09042569c80517596f8fcef6ed1e31962d3805d2d811248b11006e1dc14d03c98f5daeca854ad44eac60878e807d26656e5f91e4cfeeb16b8f8ba4d04d398737af8fd4a6b7f1b31e390dee1dfc5e117cdd76b4e26b2407480d97a1503f8aa01f676d6ddbce264e1cd4ec3f2ef903632865fe85795d5298432df45cae39771f83155b8da0979de9f23", 16).unwrap();
4705    let rsa = RSA_4096_u16::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
4706    let message = [[0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000],
4707                    [0x_3456789ABCDEF00FEDCBA98765432112_u128, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_89706A5B4C3D2E1FF1E2D3C4B5A60798, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB, 0x_0123456789ABCDEFFEDCBA9876543210, 0x_556677889900AABB11223344CCDDEEFF, 0x_44332211FFEEDDCC88776655BBAA0099, 0x_4D3E2F11F29807A6B5CE3D4C5B6A7089, 0x_2D1E00F1E2D879605A4B3C3C4B5A6978, 0x_E3F201102F3E98A7B6C5D44D5C6B7A89, 0x_333344449999111122220000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000],
4708                    [0x_56789ABCDEF00FEDCBA9876543211234_u128, 0x_11223344CCDDEEFF556677889900AABB, 0x_FFEEDDCC5544332211BBAA0099887766, 0x_5B6A70899807A6B51F2E3D4CC4D3E2F1, 0x_B5A6079889706A5BF1E2D3C44C3D2E1F, 0x_102F3E4DD4E3F2015C6B7A8998A7B6C5, 0x_33334444555566661111222277778888, 0x_99990000EEEEFFFFAAAABBBBCCCCDDDD, 0x_FEDCBA99ABCDEF876543210012345678, 0x_CCDDEEFF112233449900AABB55667788, 0x_88776655BBAA009944332211FFEEDDCC, 0x_9807A6B5C5B6A7089C4D3E2F11F2E3D4, 0x_879605A43C4B5A6978B3C2D1E00F1E2D, 0x_E3F201102F3E98A7B6C5D44D5C6B7A89, 0x_111122220000AAAABBBB333344449999, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000]];
4709
4710    println!("RSA_4096_u16: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
4711    println!("RSA_4096_u16: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
4712    print!("RSA_4096_u16: Message = [");
4713    for mm in message
4714    {
4715        print!(" [");
4716        for m in mm
4717            { print!("{:#X}, ", m); }
4718        print!(" ], ");
4719    }
4720    println!("]");
4721
4722    let mut m = [[0u16; 256]; 3];
4723    unsafe { copy_nonoverlapping(message.as_ptr() as *const u16, m.as_mut_ptr() as *mut u16, 256 * 3); }
4724    let cipher = rsa.encrypt_array_unit(&m);
4725    print!("RSA_4096_u16: Cipher = [");
4726    for cc in cipher
4727    {
4728        print!("[");
4729        for c in cc
4730            { print!("{:#X}, ", c); }
4731        print!("], ");
4732    }
4733    println!("]");
4734    assert_eq!(cipher, [[0x441C, 0x297D, 0x6411, 0x2C5F, 0x7FEE, 0x753A, 0x112C, 0x50C6, 0xF75A, 0x9765, 0x7B73, 0xC96, 0x45EB, 0x464B, 0x2CE2, 0x2E7B, 0xD127, 0xAD8, 0x4F21, 0xBE32, 0x227D, 0x718D, 0x4C8B, 0xAA64, 0x30AD, 0x4785, 0x802D, 0xB060, 0x8409, 0x5E68, 0xC894, 0x82F3, 0xDB71, 0x9930, 0x7A36, 0xA228, 0x766F, 0xE9E5, 0x5C5C, 0xC09E, 0xBA1E, 0xB4DE, 0x2F9E, 0xDD45, 0x5295, 0x5D19, 0xD241, 0xA366, 0x152E, 0x5C0E, 0x47C6, 0xEDAB, 0x70E, 0x6BDE, 0xAA6F, 0x27A5, 0x9FB, 0x1340, 0x38D, 0x55B1, 0x6446, 0x1919, 0xC264, 0xC4A9, 0xAB51, 0xAEC6, 0xDCD5, 0xA437, 0xC560, 0xF8EB, 0xB1FC, 0x9EAD, 0xD423, 0xA446, 0xC632, 0x6C10, 0x8326, 0x2055, 0xD5BC, 0xEF92, 0x75C2, 0x124F, 0x6515, 0x6131, 0xA06D, 0x9BA2, 0x39A3, 0xC402, 0x40E8, 0x8264, 0xED8B, 0xFF04, 0xA38F, 0x3BE3, 0xEDA7, 0x8FFB, 0x4B25, 0xBB15, 0x69D3, 0xF37A, 0x1E50, 0x82A2, 0x865E, 0xE799, 0x1E91, 0xB9FC, 0x3FF8, 0x8DDA, 0x73B5, 0xA926, 0x7BDF, 0x2E6B, 0x30AB, 0x2C66, 0xFFAF, 0xF10F, 0x6253, 0xD1EC, 0x7D26, 0xEE7B, 0xBC27, 0xE367, 0x235A, 0x6233, 0x54B5, 0x8219, 0xFFA2, 0x7516, 0x54E5, 0x1BBF, 0x901E, 0xB9A7, 0x2059, 0xC667, 0x4930, 0xE70F, 0x4754, 0x39A6, 0x2243, 0xD4C1, 0xEBB8, 0x49CD, 0xE8A1, 0x2E39, 0x82AD, 0xCAF3, 0xE2FC, 0x94D3, 0x450F, 0xEC85, 0xD3A7, 0x31D7, 0x7057, 0x2FC4, 0xB0C4, 0x95B, 0x6DC1, 0xF7C9, 0xEF5C, 0x4F99, 0xF7D7, 0x4B14, 0xD0D6, 0xA77A, 0xCD71, 0xA1D4, 0x9BB4, 0xCF8D, 0xB898, 0x6F9E, 0xBD1B, 0x367, 0x438B, 0x6118, 0xA29, 0x558B, 0x46CA, 0xC7E3, 0xEBBF, 0x3721, 0x49C8, 0xA444, 0x303F, 0x1F26, 0xF7A3, 0x4205, 0x4033, 0x8022, 0x2DFF, 0xCD0F, 0x40D0, 0xABD1, 0x1EDD, 0x9AD4, 0x8A18, 0xD51B, 0xE8D8, 0x3291, 0x4F19, 0xC09A, 0x31ED, 0xA53D, 0xBAB9, 0xA6BD, 0xD0EC, 0x5BC8, 0x27C, 0xBF50, 0xD4C7, 0xD8EF, 0x6C2E, 0x98A4, 0x6DBF, 0xF101, 0xEBE0, 0x8960, 0xCE6E, 0x5783, 0xA55, 0x8C5F, 0x7A6B, 0xC64D, 0x3F64, 0x86B5, 0xEF84, 0x85D2, 0x9606, 0x2267, 0x89B1, 0x97A0, 0x74E1, 0xCB8C, 0xC592, 0xA3CC, 0x6EC3, 0xEFFE, 0xD2D0, 0x4F79, 0x45E1, 0x3895, 0x9E7C, 0x8471, 0x4BA, 0xDC00, 0xF327, 0x86CA, 0x3DF7, 0xBC11, 0x5C24, 0x875A, 0x4A0D, 0xD93A, 0xD437, 0x7A8A, 0x31F7, 0xDD58],
4735                        [0x263C, 0xF8EA, 0xA4FE, 0xE551, 0x52DF, 0xF20B, 0x89E, 0xC992, 0x6FCA, 0x7417, 0x52BC, 0x75DC, 0x3A78, 0xD7EF, 0x616, 0x9D51, 0x95DC, 0x76A5, 0x4A6D, 0xF44E, 0xC7D6, 0x6FF6, 0xE31C, 0x9D06, 0xF881, 0x1447, 0xCD8B, 0x5B10, 0xC9F5, 0x8E44, 0x326C, 0xDCB6, 0xF18C, 0xB79, 0xBBB1, 0xD008, 0xE98A, 0xA9DA, 0xFF3E, 0x62AC, 0x3CB7, 0x2A7C, 0xDD3D, 0xF774, 0xC333, 0x3041, 0x67CF, 0x1543, 0xA90A, 0x1DE4, 0xE12F, 0xB7D, 0x4359, 0x8DAD, 0xCE1A, 0x8EB7, 0x61CE, 0xB115, 0x2ACF, 0xA03E, 0xCC59, 0x2E3, 0x7365, 0x29A2, 0xCF0C, 0x884B, 0x776C, 0xC186, 0xF787, 0xBDB3, 0xDC7C, 0xA76C, 0xEC90, 0x32D0, 0xB3CE, 0x341D, 0xA18E, 0xC308, 0xF265, 0xBBC4, 0x78C3, 0x8EA8, 0xD930, 0xBBE9, 0x2339, 0xD4C, 0xCA03, 0xCB2D, 0x361D, 0xAAA4, 0x6339, 0xF908, 0x58E0, 0x8511, 0x87A5, 0xDC61, 0xC071, 0xB85D, 0xC87F, 0xB0DF, 0x704B, 0xD762, 0x30DF, 0x5876, 0xAFEE, 0xB0F3, 0x2F19, 0x7770, 0xEAB1, 0xE72D, 0x76A4, 0xCC6F, 0x1FE9, 0xFBF9, 0x57BB, 0x6822, 0x3C31, 0xE180, 0x2B7D, 0x4AA7, 0x36E0, 0x3195, 0x7D4, 0xD3B6, 0xA538, 0xB249, 0x187, 0x166C, 0x272D, 0xF121, 0x89AB, 0x9F10, 0x66CD, 0x8262, 0x5B74, 0x209A, 0xF6E4, 0x51B7, 0x875E, 0x698A, 0x64C2, 0xC899, 0x4D4C, 0xE011, 0x15E8, 0xE323, 0x50C3, 0xFBFD, 0xA904, 0x632E, 0x37E4, 0xC921, 0x3076, 0xCCEE, 0x122C, 0x48F7, 0x73CD, 0xF507, 0xE6C6, 0x79EF, 0x11AC, 0xECFD, 0x3BBC, 0x1BA8, 0x3FDA, 0xC5F2, 0x9C9D, 0xC4FE, 0x467, 0xDC6D, 0x4956, 0xE8A9, 0x707D, 0xF96D, 0x6592, 0x63DC, 0x7FEC, 0x9AE2, 0x11FC, 0x8008, 0x6665, 0x4730, 0xAC4E, 0xDD82, 0x1217, 0x3693, 0x3528, 0x8B81, 0xF5FC, 0x88E4, 0x6DD4, 0x9889, 0x2269, 0xB80D, 0x905A, 0x6C19, 0xB482, 0xDBA6, 0x79A2, 0x258B, 0x9AA5, 0x1A3C, 0x14BD, 0xC1A5, 0x45D2, 0x6C28, 0xCB25, 0x72D0, 0xF440, 0x18C1, 0x9717, 0xE76, 0xD517, 0xD2D4, 0xB63A, 0x669B, 0x7599, 0x8573, 0xB910, 0x8761, 0x71B7, 0xD5AA, 0x23D0, 0x7A11, 0x5883, 0xBCD9, 0x5025, 0xA02A, 0x1CA3, 0x72B7, 0x91E2, 0x60E9, 0x1C7, 0xAD66, 0xC80F, 0x9176, 0xFCA9, 0x2151, 0xE4A9, 0x70FC, 0x991C, 0xA16B, 0x834F, 0x483B, 0x959F, 0x7216, 0xFC2F, 0x2707, 0x46E0, 0x771A, 0xE168, 0xEF3, 0xEFCC, 0x3D3C, 0x257D, 0x8DCA],
4736                        [0xE309, 0xF42B, 0xE2DC, 0xDB4C, 0x7BDD, 0x42A2, 0xB82B, 0xC198, 0x2747, 0x3E7A, 0x7A3E, 0x46FF, 0x255B, 0x9EA7, 0x5D5F, 0x178A, 0xFAAD, 0x89F, 0x9632, 0x4EC0, 0x248F, 0xE81D, 0xF752, 0x6835, 0x565D, 0xF6EC, 0xAFB0, 0xC1D, 0xF0B5, 0x2D0D, 0xC11F, 0xDF30, 0xED61, 0x36B1, 0xEBF5, 0xD303, 0x5AC8, 0x20D0, 0xBEA7, 0x8D3E, 0x36F6, 0x63D1, 0xC58A, 0x15C, 0x5B45, 0xC4A6, 0x7731, 0x1712, 0xB581, 0x94F6, 0xB2E0, 0x11B, 0x6599, 0xAEA4, 0xD84, 0x3E2B, 0xD0FC, 0x6D5C, 0x987D, 0xDAE2, 0x7C7B, 0xBD85, 0x9E3A, 0xDEC6, 0x9B9A, 0x5566, 0xD802, 0x1D25, 0x3B31, 0x356C, 0x8F4E, 0x63D7, 0x82A4, 0x55BA, 0xD988, 0x31EC, 0xC275, 0xD0FA, 0xD009, 0xBCF6, 0xBE36, 0x4D3B, 0x4AD0, 0x839, 0xCBF8, 0x7849, 0xF16B, 0x73F0, 0xD807, 0x2D5E, 0xE531, 0xDE3B, 0x6EC6, 0x23C0, 0x5A61, 0x62A, 0x95D3, 0x97AD, 0xB016, 0xB85A, 0x326D, 0x32B7, 0x7E82, 0x3E85, 0x5D2E, 0xC210, 0x85C1, 0xFE90, 0xF832, 0xEF4A, 0xB9A4, 0xC52C, 0xF044, 0xF302, 0x970, 0xA7B3, 0x472D, 0xAB41, 0x22A5, 0xBE4C, 0xACA8, 0xCFB4, 0x7428, 0xD63C, 0xA499, 0x5195, 0xFB1D, 0xCA9F, 0xD98C, 0x7604, 0x7DDD, 0x47A, 0x1482, 0xE7D1, 0xC737, 0xF4B0, 0xFBC, 0x8504, 0x51F7, 0xE39A, 0x71DD, 0xC51A, 0x81C0, 0x8809, 0xAF2F, 0xBF4C, 0x73F4, 0x4438, 0xFC99, 0x90DA, 0xB425, 0x4823, 0x4D13, 0x85C0, 0x6214, 0x5A01, 0xE79D, 0xB033, 0x5AF4, 0x3A17, 0xBAD1, 0xAB6F, 0xE592, 0xDE0B, 0x68FE, 0x713C, 0xCB15, 0xE01A, 0x568, 0xE241, 0x433D, 0x4B77, 0x668, 0xECF2, 0xD751, 0xDB21, 0x456D, 0xE80C, 0x62C6, 0x2D9D, 0xF1CD, 0xBC29, 0x7E49, 0x1E13, 0xCD9, 0xECC2, 0x53D2, 0xAC1D, 0x9B17, 0x7C58, 0x55B7, 0x48E5, 0x8FB0, 0x8841, 0xC0B1, 0x5D5E, 0x1D9D, 0x16EA, 0xC267, 0x87EE, 0x7E17, 0xB83A, 0xE216, 0xB9E2, 0xB230, 0x27C1, 0x2F6, 0x1479, 0x2FB5, 0x525D, 0x4CDE, 0x707C, 0x86FA, 0xBCF1, 0xDAAC, 0x85B9, 0xFE8A, 0x5E9A, 0x8CF9, 0x2DBB, 0xC17C, 0x6D61, 0xAE4C, 0xF1F2, 0xC2BF, 0x1ECC, 0x77CD, 0xFB51, 0xCC2, 0x9482, 0x4AFB, 0x9800, 0x2490, 0xEBE2, 0xD1A0, 0xD2EC, 0x697, 0xE6B, 0xC9D4, 0x9E2, 0x101F, 0xB62, 0x5027, 0xDD9D, 0x7CC1, 0xC4D0, 0x4130, 0xC471, 0x511B, 0x87F, 0x5ABF, 0x107E, 0x38E6, 0xE1E2, 0x4B52, 0xD211]]);
4737    let recovered = rsa.decrypt_array_unit(&cipher);
4738    let mut rrr = [[0u128; 32]; 3];
4739    unsafe { copy_nonoverlapping(recovered.as_ptr() as *const u16, rrr.as_mut_ptr() as *mut u16, 256 * 3); }
4740    
4741    print!("RSA_4096_u16: Recovered = [");
4742    for rr in rrr
4743    {
4744        print!("[");
4745        for r in rr
4746            { print!("{:#X}, ", r); }
4747        print!("], ");
4748    }
4749    println!("]");
4750    assert_eq!(rrr, [[0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000],
4751                    [0x_3456789ABCDEF00FEDCBA98765432112_u128, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_89706A5B4C3D2E1FF1E2D3C4B5A60798, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB, 0x_0123456789ABCDEFFEDCBA9876543210, 0x_556677889900AABB11223344CCDDEEFF, 0x_44332211FFEEDDCC88776655BBAA0099, 0x_4D3E2F11F29807A6B5CE3D4C5B6A7089, 0x_2D1E00F1E2D879605A4B3C3C4B5A6978, 0x_E3F201102F3E98A7B6C5D44D5C6B7A89, 0x_333344449999111122220000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000],
4752                    [0x_56789ABCDEF00FEDCBA9876543211234_u128, 0x_11223344CCDDEEFF556677889900AABB, 0x_FFEEDDCC5544332211BBAA0099887766, 0x_5B6A70899807A6B51F2E3D4CC4D3E2F1, 0x_B5A6079889706A5BF1E2D3C44C3D2E1F, 0x_102F3E4DD4E3F2015C6B7A8998A7B6C5, 0x_33334444555566661111222277778888, 0x_99990000EEEEFFFFAAAABBBBCCCCDDDD, 0x_FEDCBA99ABCDEF876543210012345678, 0x_CCDDEEFF112233449900AABB55667788, 0x_88776655BBAA009944332211FFEEDDCC, 0x_9807A6B5C5B6A7089C4D3E2F11F2E3D4, 0x_879605A43C4B5A6978B3C2D1E00F1E2D, 0x_E3F201102F3E98A7B6C5D44D5C6B7A89, 0x_111122220000AAAABBBB333344449999, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000]]);
4753    assert_eq!(rrr, message);
4754
4755    // Example for RSA_1024_u8
4756    use cryptocol::asymmetric::RSA_1024_u8;
4757
4758    let public_key = U1024::from(7_u8);
4759    let private_key = U1024::from_str_radix("4703E575111E5E33F674DB8CB5C7AA883BCBC715FFF564645CD67F2AB09470D71575D6D88FBB6BC0FABD4837B2F1F3F01FE4F7D135EF2FA15476D88107881CB8D6594A0010F987144DD6243268D07A6C7002F5949E0886BA36F8BAA886B0D8311277977315FC7F93CD95AB72592F65A2AB7BE609C69AFC3D9B54BA3BB78FAD87", 16).unwrap();
4760    let modulus = U1024::from_str_radix("636bdad717f750af25d6ccf831b121f1ed507d1eccbdf2f2e85f7ed55d9c9df9ead82cc8c93996daf8a2984dfa85ef1cf973c158184edc48430cc8b4a424f504093508b4a1235839fd887c0ef40d7740b770a375457b0e95cda768e23799f94c34982315e6974fa1e1fb63d2a1be2ed341f22275bd098a6bb56e7efe2ba6f2ef", 16).unwrap();
4761    let rsa = RSA_1024_u8::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
4762    let message = [ [0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6978879605A4B3C2D1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF],
4763                    [0x_23456789ABCDEF00FEDCBA9876543211_u128, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_F1E2D3C4B5A6978879605A4B3C2D1F, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB],
4764                    [0x_3456789ABCDEF00FEDCBA98765432112_u128, 0x_CCDDEEFF112233449900AABB55667788, 0x_44332211FFEEDD88776655CCBBAA0099, 0x_9807A6B5C5B6A70894D3E2F11F2E3D4C, 0x_F1E2D35A4B3C2D1FC4B5A697887960, 0x_4E3F201102F3E4D98A7B6C5D5C6B7A89, 0x_55556666333344447777888811112222, 0x_EEEEFFFF99990000CCCCDDDDAAAABBBB] ];
4765    println!("RSA_1024_u8: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
4766    println!("RSA_1024_u8: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
4767    print!("RSA_1024_u8: Message = [");
4768    for mm in message
4769    {
4770        print!(" [");
4771        for m in mm
4772            { print!("{:#X}, ", m); }
4773        print!(" ], ");
4774    }
4775    println!("]");
4776
4777    let mut m = [[0u8; 128]; 3];
4778    unsafe { copy_nonoverlapping(message.as_ptr() as *const u16, m.as_mut_ptr() as *mut u16, 64 * 3); }
4779    let cipher = rsa.encrypt_array_unit(&m);
4780    print!("RSA_1024_u8: Cipher = [");
4781    for cc in cipher
4782    {
4783        print!("[");
4784        for c in cc
4785            { print!("{:#X}, ", c); }
4786        print!("], ");
4787    }
4788    println!("]");
4789    assert_eq!(cipher, [[0x1C, 0xEC, 0x81, 0xE1, 0x7E, 0x3D, 0xC5, 0x86, 0x4B, 0xE8, 0x1E, 0xC, 0x8F, 0xE2, 0x4E, 0xC6, 0x2C, 0x27, 0xB1, 0xBC, 0x8D, 0x7F, 0xCF, 0xDC, 0x7E, 0xE5, 0xCE, 0x5C, 0x6, 0xF8, 0xE7, 0xDE, 0xE3, 0x66, 0xE, 0x26, 0xB4, 0x6F, 0xF6, 0xEA, 0x28, 0x9D, 0xC2, 0x84, 0x75, 0x1A, 0x33, 0xF3, 0x8E, 0xF5, 0x98, 0x6A, 0x9B, 0x30, 0x51, 0xAF, 0x2A, 0x19, 0x8A, 0x98, 0x3D, 0x6E, 0xD1, 0x36, 0x25, 0x94, 0x7D, 0x8F, 0x3B, 0x28, 0x25, 0xD1, 0x13, 0xAC, 0xA9, 0x64, 0x35, 0x35, 0x29, 0xBA, 0xF6, 0x37, 0xA9, 0x48, 0x32, 0x39, 0x7A, 0x34, 0xA9, 0x3A, 0x8E, 0x67, 0xE5, 0x50, 0x6C, 0x59, 0xF3, 0x32, 0x2F, 0x37, 0xA, 0xDF, 0xCA, 0x92, 0xE0, 0x41, 0x3A, 0x5, 0x75, 0xDD, 0x7C, 0x52, 0x79, 0x46, 0x7C, 0x63, 0x1C, 0x5D, 0x57, 0x16, 0x3, 0x27, 0x45, 0x1E, 0xFA, 0xAA, 0xA8, 0xC2],
4790                        [0x27, 0x1C, 0x97, 0x6E, 0x9E, 0x9F, 0x28, 0x9D, 0xE1, 0xCB, 0x90, 0x58, 0xD0, 0x4, 0xB6, 0xDC, 0xE4, 0x2, 0xFF, 0x3D, 0xDF, 0xE, 0xB8, 0x8B, 0x71, 0x59, 0x2, 0x16, 0xFB, 0x3D, 0xF8, 0x47, 0xED, 0x89, 0xDB, 0x15, 0x1E, 0xD8, 0xD3, 0x37, 0x12, 0x40, 0x78, 0x1C, 0xB2, 0xA8, 0xB5, 0x96, 0xEB, 0xCD, 0x73, 0x9B, 0x1C, 0xEB, 0xC3, 0x19, 0x9B, 0xAF, 0x80, 0x73, 0x11, 0x5B, 0xC0, 0xC7, 0xB1, 0xFF, 0x78, 0x87, 0x51, 0x4, 0x98, 0xA4, 0xE, 0xEF, 0x17, 0x78, 0xB0, 0x9B, 0xEC, 0xFB, 0xC3, 0x26, 0x52, 0x77, 0x7F, 0x9B, 0xDF, 0x17, 0x76, 0x68, 0xD8, 0xBA, 0xD8, 0xC2, 0x82, 0xD4, 0xCB, 0x4C, 0xD5, 0x3A, 0x15, 0x6A, 0x20, 0x63, 0x8F, 0x23, 0x80, 0x53, 0xDA, 0x3C, 0x89, 0xCF, 0x53, 0xFB, 0x18, 0xD9, 0x36, 0xCC, 0x78, 0x2, 0x4F, 0x6E, 0x96, 0x88, 0x8A, 0x1A, 0x9F, 0xED],
4791                        [0x30, 0x2B, 0x2F, 0x73, 0x12, 0xB3, 0xF2, 0x4F, 0xFE, 0xC5, 0x4B, 0x76, 0xC2, 0xAA, 0x83, 0x1A, 0x7A, 0xE9, 0x97, 0x6B, 0x98, 0xA2, 0x40, 0x87, 0xCD, 0x1C, 0xF, 0xD, 0x8D, 0x48, 0xE5, 0x6B, 0xB6, 0xFA, 0xBC, 0x55, 0x33, 0xDD, 0xD8, 0x44, 0xE3, 0xF5, 0xBD, 0xF0, 0xF, 0xA2, 0xF2, 0xA4, 0x23, 0x47, 0xD6, 0x5E, 0xC7, 0xA2, 0xFE, 0xDF, 0x1E, 0x5E, 0xB5, 0xB, 0x21, 0x8D, 0x25, 0xBA, 0xB8, 0xD8, 0xA9, 0x75, 0xE1, 0x7F, 0x8, 0x41, 0x42, 0x31, 0x3A, 0xF7, 0x1, 0x19, 0x55, 0x97, 0xEC, 0x4F, 0x53, 0xB4, 0xF3, 0xAE, 0xEA, 0x94, 0x91, 0x7F, 0xA0, 0x34, 0x7E, 0xB1, 0x31, 0x3A, 0x97, 0xCF, 0x49, 0x6C, 0xA1, 0x50, 0x7A, 0xAB, 0xE4, 0xD8, 0xAF, 0xE, 0xCB, 0xD4, 0xDE, 0x3B, 0x6A, 0xC5, 0x60, 0x13, 0xEA, 0x3D, 0x5, 0xA8, 0x91, 0x71, 0x96, 0xF4, 0xFF, 0xC7, 0x35, 0x97]]);
4792    let mut rrr = [[0u128; 8]; 3];
4793    let recovered = rsa.decrypt_array_unit(&cipher);
4794    unsafe { copy_nonoverlapping(recovered.as_ptr() as *const u8, rrr.as_mut_ptr() as *mut u8, 128 * 3); }
4795    
4796    print!("RSA_1024_u8: Recovered = [");
4797    for rr in rrr
4798    {
4799        print!("[");
4800        for r in rr
4801            { print!("{:#X}, ", r); }
4802        print!("], ");
4803    }
4804    println!("]");
4805    assert_eq!(rrr, [[0x123456789ABCDEF00FEDCBA987654321, 0x11223344556677889900AABBCCDDEEFF, 0xFFEEDDCCBBAA00998877665544332211, 0x1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0xF1E2D3C4B5A6978879605A4B3C2D1F, 0x102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x11112222333344445555666677778888, 0x99990000AAAABBBBCCCCDDDDEEEEFFFF],
4806                    [0x23456789ABCDEF00FEDCBA9876543211, 0x9900AABBCCDDEEFF1122334455667788, 0x8877665544332211FFEEDDCCBBAA0099, 0x9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0xF1E2D3C4B5A6978879605A4B3C2D1F, 0x98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x55556666777788881111222233334444, 0xCCCCDDDDEEEEFFFF99990000AAAABBBB],
4807                    [0x3456789ABCDEF00FEDCBA98765432112, 0xCCDDEEFF112233449900AABB55667788, 0x44332211FFEEDD88776655CCBBAA0099, 0x9807A6B5C5B6A70894D3E2F11F2E3D4C, 0xF1E2D35A4B3C2D1FC4B5A697887960, 0x4E3F201102F3E4D98A7B6C5D5C6B7A89, 0x55556666333344447777888811112222, 0xEEEEFFFF99990000CCCCDDDDAAAABBBB]]);
4808    assert_eq!(rrr, message);
4809
4810    // Example for RSA_2048_u8
4811    use cryptocol::asymmetric::RSA_2048_u8;
4812
4813    let public_key = U2048::from(5_u8);
4814    let private_key = U2048::from_str_radix("49E61033258BFDFF87ADB347816E3D13BC07A9929F4064C5336F5FEC074C857BA6F64415DB647DD6CEE42842DF409A2B036839B814E6F2A1E507F2CDD91FB2B42BE6B4A40E0CFA0779437B42B8996CA31034CB90D84CB283870BE414756316FB300523F700BCC3D9E1B8183F8EA4675FF6F59D84FF3E120CE54C94B0A44E2C1DCCA68F3F0842DB99FCD7698234C374ABB28C2B5F5A5B1914F15F41163E16A54AEDA0CB6679EA1026BA97C00B0726DB7837F7478275D3688D2981898A7BB040CC9927F4204E8BA93B97992D1C13C17D9A53F4B834A2A56DD9633F5288BA125859413D3F197F7278F95F37503D2FDDF9F540154C491AAE943B13EF3C047AA5E1AD", 16).unwrap();
4815    let modulus = U2048::from_str_radix("7b2a1affe93ea7548ccc2acc826265cb8eb76ff45ec0a7f355b99fdeb6d4de78c0efc6cf18522710ae26edc4c96bab9d05adb58822d63f0dd30d3f57148a29d6f3d5d7bc176af60c74c5cd6f33aa5fba7057fdf1687fd4308bbe7c2218fa7ba2a55de69babe5466b22dd7dbf4312019ff0eeb132febcc8c028d4f7d111d79eddc056ec9cd74e3a369eefbc634b6544bcbd80ff73a941ab7614ccf740da8a1010a6e1799953abfdcbe9892520eb35733602807ef52fb6b4cf0664560e2feda618cceecba02038d0c3349e1634f778544f2ab941bd61788f30db3c0aeebefb02759f2e605f301e48b5235f3340fecb37e04bd34f53a2f516904532135a4a38b9e7", 16).unwrap();
4816    let rsa = RSA_2048_u8::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
4817    let message = [[0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF],
4818                    [0x_21123456789ABCDEF00FEDCBA9876543_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_89706A5B4C3D2E1FF1E2D3C4B5A60798, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_11112222777788883333444455556666, 0x_99990000EEEEFFFFAAAABBBBCCCCDDDD, 0x_0123456789ABCDEFFEDCBA9876543210, 0x_11223344556677889900AABBCCDDEEFF, 0x_88776655BBAA009944332211FFEEDDCC, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_0F1E2D3C4B5A6978879605A4B3C2D1E0, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_0000AAAABBBB11112222333344449999, 0x_CCCCDDDDEEEEFFFF5555666677778888],
4819                    [0x_321123456789ABCDEF00FEDCBA987654_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCC5544332211BBAA0099887766, 0x_1F2E3D4CC4D3E2F15B6A70899807A6B5, 0x_F1E2D3C4B4C3D2E1F5A6079889706A5B, 0x_102F3E4DD4E3F2015C6B7A8998A7B6C5, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB, 0x_FEDCBA989ABCDEF87654321001234567, 0x_CCDDEEFF112233449900AABB55667788, 0x_FFEEDDCCBBAA00998877665544332211, 0x_9807A6B51F2E3D4C5B6A7089C4D3E2F1, 0x_879605A44B5A6978B3C2D1E00F1E2D3C, 0x_5D4E3F201102F3E98A7B6C4D5C6B7A89, 0x_11112222AAAABBBB3333444499990000, 0x_77778888CCCCDDDD55556666EEEEFFFF]];
4820    println!("RSA_2048_u8: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
4821    println!("RSA_2048_u8: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
4822    print!("RSA_2048_u8: Message = [");
4823    for mm in message
4824    {
4825        print!(" [");
4826        for m in mm
4827            { print!("{:#X}, ", m); }
4828        print!(" ], ");
4829    }
4830    println!("]");
4831
4832    let mut m = [[0u8; 256]; 3];
4833    unsafe { copy_nonoverlapping(message.as_ptr() as *const u8, m.as_mut_ptr() as *mut u8, 256 * 3); }
4834    let cipher = rsa.encrypt_array_unit(&m);
4835    print!("RSA_2048_u8: Cipher = [");
4836    for cc in cipher
4837    {
4838        print!("[");
4839        for c in cc
4840            { print!("{:#X}, ", c); }
4841        print!("], ");
4842    }
4843    println!("]");
4844    assert_eq!(cipher, [[0x46, 0x27, 0x51, 0x58, 0x9, 0xE3, 0x8D, 0xA8, 0xA0, 0xFC, 0xA1, 0x16, 0xD1, 0xDA, 0x39, 0x8, 0xA1, 0x93, 0xC5, 0x63, 0xFB, 0x5B, 0x65, 0x73, 0x26, 0x1B, 0x99, 0x7, 0x64, 0x2D, 0xEF, 0xBF, 0x6F, 0x85, 0x2, 0x86, 0xD5, 0xFF, 0x4B, 0x6C, 0xDA, 0x69, 0x69, 0x4B, 0xB1, 0x1C, 0xE9, 0xFA, 0x3, 0x2, 0x34, 0xCE, 0xE8, 0x11, 0x78, 0x48, 0x2B, 0x5A, 0xFF, 0x55, 0x93, 0x44, 0x34, 0x3A, 0x17, 0x3E, 0x93, 0x40, 0x8E, 0xFC, 0xE7, 0xB6, 0xA2, 0x3C, 0xBB, 0xD1, 0xC4, 0x6C, 0xF4, 0xCB, 0xF6, 0xD9, 0x99, 0xA7, 0xB4, 0x95, 0x11, 0xA7, 0x6E, 0xED, 0x4, 0xC9, 0x80, 0x3C, 0xEE, 0xC, 0xC0, 0x13, 0x7, 0xC5, 0x59, 0x6E, 0x39, 0x7C, 0x79, 0x5, 0x2D, 0xC3, 0x92, 0x9F, 0x83, 0x16, 0x80, 0xCD, 0xAA, 0xB7, 0x10, 0x32, 0x91, 0x32, 0x12, 0x31, 0xAB, 0x66, 0xAC, 0xBE, 0x85, 0xF8, 0x1A, 0x7B, 0xBC, 0x75, 0xAF, 0x37, 0x4B, 0x8E, 0xFA, 0x5E, 0x8E, 0xDC, 0x53, 0x6E, 0x5E, 0xD5, 0x6A, 0x8D, 0x16, 0x55, 0x6F, 0x17, 0x8C, 0xAC, 0xD7, 0x29, 0xF5, 0x55, 0x8B, 0x77, 0xF6, 0x1C, 0x46, 0xC3, 0x27, 0x69, 0x0, 0xCD, 0x28, 0xB8, 0x96, 0x2E, 0x1F, 0xFF, 0x3C, 0xA7, 0x33, 0x87, 0x8B, 0xEC, 0xF3, 0xDC, 0xC1, 0x6A, 0x7A, 0x10, 0x7B, 0x31, 0xE4, 0x87, 0x7A, 0x89, 0xEA, 0x55, 0x8C, 0x9F, 0x4B, 0x48, 0x38, 0x9B, 0x10, 0x7D, 0x8C, 0xC1, 0xE3, 0x72, 0xA, 0x10, 0x52, 0x7A, 0xD9, 0x4C, 0x57, 0x69, 0x3E, 0x2D, 0x23, 0xD2, 0x47, 0xE8, 0x16, 0xEC, 0x5E, 0xF2, 0xAA, 0xA0, 0x1E, 0x25, 0x12, 0x78, 0x69, 0x75, 0x72, 0x52, 0x91, 0x16, 0x21, 0x44, 0x56, 0xC1, 0x7C, 0x1A, 0x97, 0x9D, 0x8B, 0x45, 0x41, 0x26, 0xA, 0xF7, 0x5B, 0xE4, 0x7C, 0x8D, 0xDE, 0x8C, 0x4B, 0x14],
4845                        [0x4A, 0xA3, 0x8E, 0xAF, 0x7A, 0xF7, 0x51, 0x84, 0xB, 0xE1, 0xC9, 0x1C, 0x28, 0x8D, 0x6F, 0x1A, 0x5B, 0x53, 0x1E, 0x1B, 0x2F, 0xF5, 0x36, 0xD6, 0xDC, 0x59, 0xB7, 0x16, 0x8B, 0x6A, 0x4, 0x0, 0x47, 0x49, 0xDB, 0xA4, 0xD4, 0x3, 0x46, 0x69, 0xD1, 0x57, 0x73, 0xD4, 0xCB, 0x44, 0xAA, 0xFA, 0xA, 0xD5, 0xA7, 0x18, 0x67, 0xF5, 0x1F, 0x28, 0xFD, 0x48, 0x16, 0xE3, 0x2, 0xF5, 0x96, 0xB9, 0x7F, 0xC5, 0xFF, 0xF6, 0xC7, 0x9, 0x15, 0x1E, 0xC6, 0xC1, 0xCB, 0xA3, 0x70, 0x59, 0xA, 0x43, 0x3, 0x1C, 0x50, 0x87, 0x4B, 0x7C, 0xDE, 0xBD, 0x83, 0x4F, 0x10, 0x6A, 0xD1, 0x86, 0xC8, 0x9A, 0xB3, 0xFC, 0xE5, 0xAF, 0x65, 0xD3, 0xE6, 0xCA, 0xB4, 0x31, 0x1B, 0x78, 0x6A, 0x9F, 0x68, 0x15, 0x31, 0x34, 0x39, 0xEC, 0x23, 0x22, 0x4, 0xAE, 0xB9, 0x1C, 0x28, 0x94, 0xCD, 0xEE, 0xE7, 0x3, 0xB9, 0xEE, 0x46, 0xED, 0x54, 0xCB, 0x58, 0xB9, 0x46, 0xD9, 0xF0, 0xF3, 0x10, 0x9B, 0xF3, 0x41, 0xAF, 0x89, 0xAA, 0xDD, 0x2E, 0x2C, 0x15, 0xC2, 0xC5, 0x18, 0xCB, 0x2C, 0xD0, 0x2D, 0xA2, 0xB6, 0xC7, 0x1D, 0xEA, 0x4F, 0x9D, 0xD8, 0xE9, 0xE4, 0xCA, 0xBC, 0x40, 0x4B, 0xC7, 0x8C, 0x73, 0xAA, 0xBD, 0x3C, 0xCF, 0x1F, 0xA8, 0x1C, 0xA4, 0x30, 0x68, 0xF1, 0x4B, 0x9C, 0x62, 0x9, 0x8C, 0xE7, 0xDE, 0x42, 0x6F, 0xA9, 0xC7, 0x30, 0xFE, 0x25, 0xC8, 0x70, 0x49, 0x4, 0x20, 0x71, 0x95, 0x4, 0x6E, 0xA2, 0xBE, 0xF4, 0xE2, 0x80, 0x88, 0xC, 0x74, 0xFB, 0xDB, 0xB6, 0xE5, 0x4C, 0xDA, 0x5D, 0xD0, 0x2C, 0xFE, 0x2A, 0x6E, 0xB, 0x86, 0xA6, 0xCA, 0x27, 0xE2, 0x72, 0xCA, 0x53, 0x1E, 0xB9, 0x72, 0x73, 0xC3, 0x7D, 0xC1, 0xBA, 0x31, 0xEC, 0xEF, 0xA0, 0xDF, 0x6, 0xC6, 0xBD, 0x4A, 0x20],
4846                        [0x76, 0x71, 0xC9, 0x3E, 0x31, 0x22, 0x66, 0x3E, 0x9, 0x2C, 0x14, 0xD7, 0xA7, 0xF0, 0x2D, 0x87, 0xC9, 0x4, 0x2E, 0x91, 0x27, 0xB8, 0x2E, 0x9A, 0xDF, 0x5C, 0xED, 0xE5, 0xE9, 0xBD, 0x6C, 0x4A, 0x95, 0xC1, 0xD9, 0x8A, 0x54, 0x68, 0xEC, 0x81, 0xDD, 0x5, 0x5F, 0xDD, 0x5D, 0x0, 0xD9, 0x3, 0xE4, 0x93, 0xB6, 0x3D, 0xB0, 0xA4, 0x6B, 0x40, 0xA5, 0x7B, 0x9A, 0xCC, 0x10, 0x1B, 0xF8, 0xC7, 0xA7, 0xEE, 0xF, 0x5B, 0x94, 0x5A, 0x19, 0x78, 0x4A, 0x9F, 0xCC, 0x45, 0xF6, 0x86, 0x36, 0x5C, 0x23, 0xA9, 0x7E, 0xB1, 0xF, 0xD4, 0xA9, 0xCE, 0x35, 0xC9, 0x43, 0x65, 0x69, 0xEB, 0x44, 0xEB, 0x87, 0x6F, 0x40, 0x9C, 0x10, 0x27, 0x4C, 0x46, 0x3C, 0x37, 0xEE, 0x3D, 0x32, 0xCB, 0x63, 0xED, 0xB4, 0xD1, 0x84, 0xF7, 0xBA, 0xC7, 0xE9, 0x8D, 0xC6, 0xB, 0x16, 0x3, 0x87, 0xE1, 0xA4, 0x38, 0x11, 0x94, 0xC4, 0xD7, 0x78, 0x60, 0x48, 0xF8, 0x0, 0xB, 0x3, 0x40, 0xAD, 0x7F, 0x4, 0x97, 0x9F, 0xA8, 0x37, 0xB8, 0xF5, 0x34, 0xE, 0xB0, 0x66, 0x9A, 0x27, 0x16, 0xED, 0x4F, 0x8F, 0xD6, 0x97, 0xD8, 0xB, 0x47, 0xD0, 0xAE, 0xD4, 0x5E, 0xC2, 0x60, 0xB3, 0x2B, 0x2C, 0x88, 0x1A, 0x8E, 0x94, 0x3D, 0xA7, 0x74, 0xF4, 0x57, 0x12, 0xDC, 0xA2, 0xFB, 0x8D, 0x5B, 0xE5, 0x37, 0xE7, 0x64, 0x52, 0x81, 0x5C, 0x39, 0x68, 0x2C, 0x82, 0xC7, 0xB4, 0xD0, 0x9A, 0x7C, 0xCD, 0x4C, 0x13, 0x69, 0xD6, 0x35, 0x25, 0xBD, 0xF6, 0xED, 0x72, 0x4F, 0xA4, 0xF3, 0x1, 0x11, 0x4C, 0xB, 0xA6, 0x4A, 0x35, 0xEC, 0x3, 0xBB, 0xE7, 0xD1, 0x86, 0xF8, 0xDF, 0xFA, 0x85, 0xC, 0xFB, 0x17, 0x16, 0xE1, 0x6, 0x5E, 0x0, 0xAA, 0x2F, 0x99, 0xD3, 0xBA, 0xBB, 0x84, 0xBD, 0x90, 0xCD, 0x50, 0xAA, 0x10]]);
4847    let recovered = rsa.decrypt_array_unit(&cipher);
4848    let mut rrr = [[0u128; 16]; 3];
4849    unsafe { copy_nonoverlapping(recovered.as_ptr() as *const u8, rrr.as_mut_ptr() as *mut u8, 256 * 3); }
4850    
4851    print!("RSA_2048_u8: Recovered = [");
4852    for rr in rrr
4853    {
4854        print!("[");
4855        for r in rr
4856            { print!("{:#X}, ", r); }
4857        print!("], ");
4858    }
4859    println!("]");
4860    assert_eq!(rrr, [[0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF],
4861                        [0x_21123456789ABCDEF00FEDCBA9876543_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_89706A5B4C3D2E1FF1E2D3C4B5A60798, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_11112222777788883333444455556666, 0x_99990000EEEEFFFFAAAABBBBCCCCDDDD, 0x_0123456789ABCDEFFEDCBA9876543210, 0x_11223344556677889900AABBCCDDEEFF, 0x_88776655BBAA009944332211FFEEDDCC, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_0F1E2D3C4B5A6978879605A4B3C2D1E0, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_0000AAAABBBB11112222333344449999, 0x_CCCCDDDDEEEEFFFF5555666677778888],
4862                        [0x_321123456789ABCDEF00FEDCBA987654_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCC5544332211BBAA0099887766, 0x_1F2E3D4CC4D3E2F15B6A70899807A6B5, 0x_F1E2D3C4B4C3D2E1F5A6079889706A5B, 0x_102F3E4DD4E3F2015C6B7A8998A7B6C5, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB, 0x_FEDCBA989ABCDEF87654321001234567, 0x_CCDDEEFF112233449900AABB55667788, 0x_FFEEDDCCBBAA00998877665544332211, 0x_9807A6B51F2E3D4C5B6A7089C4D3E2F1, 0x_879605A44B5A6978B3C2D1E00F1E2D3C, 0x_5D4E3F201102F3E98A7B6C4D5C6B7A89, 0x_11112222AAAABBBB3333444499990000, 0x_77778888CCCCDDDD55556666EEEEFFFF]]);
4863    assert_eq!(rrr, message);
4864
4865    // Example for RSA_4096_u8
4866    use cryptocol::asymmetric::RSA_4096_u8;
4867
4868    let public_key = U4096::from(5_u8);
4869    let private_key = U4096::from_str_radix("4E0F13FFD94F4F793ED6900C7A99EA88942D3A065EB7E72E741A77CE7BB6AD5B7FFB2B83B6154A975FAE613F22A739F54E305BDCD85A5A3D5C59C28FEDB6AC2CF03272A57C25ED4CEAAF8006321DA2529F381EF51B050FA1AC7DE541624A19AFE8561C1407F9D3333AA364DDA03A5E50ACA61C7E52850C519549AB45B82AE1E831D7FE401A641CB47A4711340F4B6D2F9822D32442168D2517B5CB9E6A01FB89D9B8240858269DA12F8B0E247AD1D0DA835C3F38390EB4BA56EAA266FF113CA7DD7817AF156E994C21738839D1E4B6AE4B04332F09DC6A047F75FF521E6868697998CBCE9CBA7C505A97C01C510BED5CDBB55D4E624CA14A9D5A4A05851F0842904604D544B6FBF154BAF9FAB89A2765A41A6BD17E631B079429AED230B2F72777350CEF5CA6E89784376003BA8F189F671D9451EE86039EF8F2DE7B6E9A3A37A4C15BD8ACE6CCA3B218CD59D018674DDE5BCF25487464AFDA648A475D6BCEA1A95F2E2937DB1CEE3C9E7EBB2492ED275DCD9089A2909CBBDEB0368EDC5E6DBD12582E171DF0724C5534204F656E095339C5E19D5665D214D3E4F05F6A18F3D0B3E95D16996EE3E49A239C8673A78D0DD90F36DBE6F85B316DD1E2AFED84D3823F5EAE9088176309CC33056B2976C31C8EC94C5FAA62E466CFC8FFE8D6DCB106DB27BA551C1A041561E597C967C1C8568D3C605BD703877343E0C4B4E932E10D", 16).unwrap();
4870    let modulus = U4096::from_str_radix("6192d8ffcfa323578e8c340f9940652ab9388887f665e0fa112115c21aa458b25ff9f664a39a9d3d3799f98eeb510872a1bc72d40e70f0ccb3703333e92457382c3f0f4edb2f68a0255b6007bea50ae7470626b261c6538a179d5e91badca01be26ba31909f84800094c3e150848f5e4d7cfa39de7264f65fa9c161726359a623e4dfdd020fd23e198d8d581131e487b7e2b87ed529c306e5da33e8604827a6c50262d0a6e3045097b6dd1ad9986451124334f06475261e8eca54b00bed58bd1d4d61d9adaca3f9f29d06a48465de459ddc53ffacc5384859f537f26a6028283d7fefec243e91b64713db023654ee8b412a2b4a1fadfc99d44b0dc86e666ca5470704b8bfe5fd708ddd576bd021bf4c2d813279ec0d74f4e03a53557f2cefde2cd9e9d01c72be14754f7a4472dfe8ef653fe73980d1edc3727501f5594863d2e32a8abf8fc04c44f8aac2e9bda32a8d154a62107bdc1f2f394b9ae693e84d6c7ba4143c15b39fed115fd4265fc230c3e9cd830d56f7866e09042569c80517596f8fcef6ed1e31962d3805d2d811248b11006e1dc14d03c98f5daeca854ad44eac60878e807d26656e5f91e4cfeeb16b8f8ba4d04d398737af8fd4a6b7f1b31e390dee1dfc5e117cdd76b4e26b2407480d97a1503f8aa01f676d6ddbce264e1cd4ec3f2ef903632865fe85795d5298432df45cae39771f83155b8da0979de9f23", 16).unwrap();
4871    let rsa = RSA_4096_u8::new_with_keys(public_key.into_biguint(), private_key.into_biguint(), modulus.into_biguint());
4872    let message = [[0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000],
4873                    [0x_3456789ABCDEF00FEDCBA98765432112_u128, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_89706A5B4C3D2E1FF1E2D3C4B5A60798, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB, 0x_0123456789ABCDEFFEDCBA9876543210, 0x_556677889900AABB11223344CCDDEEFF, 0x_44332211FFEEDDCC88776655BBAA0099, 0x_4D3E2F11F29807A6B5CE3D4C5B6A7089, 0x_2D1E00F1E2D879605A4B3C3C4B5A6978, 0x_E3F201102F3E98A7B6C5D44D5C6B7A89, 0x_333344449999111122220000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000],
4874                    [0x_56789ABCDEF00FEDCBA9876543211234_u128, 0x_11223344CCDDEEFF556677889900AABB, 0x_FFEEDDCC5544332211BBAA0099887766, 0x_5B6A70899807A6B51F2E3D4CC4D3E2F1, 0x_B5A6079889706A5BF1E2D3C44C3D2E1F, 0x_102F3E4DD4E3F2015C6B7A8998A7B6C5, 0x_33334444555566661111222277778888, 0x_99990000EEEEFFFFAAAABBBBCCCCDDDD, 0x_FEDCBA99ABCDEF876543210012345678, 0x_CCDDEEFF112233449900AABB55667788, 0x_88776655BBAA009944332211FFEEDDCC, 0x_9807A6B5C5B6A7089C4D3E2F11F2E3D4, 0x_879605A43C4B5A6978B3C2D1E00F1E2D, 0x_E3F201102F3E98A7B6C5D44D5C6B7A89, 0x_111122220000AAAABBBB333344449999, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000]];
4875
4876    println!("RSA_4096_u8: private key = {:X}:{:x}", rsa.get_private_key(), rsa.get_modulus());
4877    println!("RSA_4096_u8: public key = {:X}:{:x}", rsa.get_public_key(), rsa.get_modulus());
4878    print!("RSA_4096_u8: Message = [");
4879    for mm in message
4880    {
4881        print!(" [");
4882        for m in mm
4883            { print!("{:#X}, ", m); }
4884        print!(" ], ");
4885    }
4886    println!("]");
4887
4888    let mut m = [[0u8; 512]; 3];
4889    unsafe { copy_nonoverlapping(message.as_ptr() as *const u8, m.as_mut_ptr() as *mut u8, 512 * 3); }
4890    let cipher = rsa.encrypt_array_unit(&m);
4891    print!("RSA_4096_u8: Cipher = [");
4892    for cc in cipher
4893    {
4894        print!("[");
4895        for c in cc
4896            { print!("{:#X}, ", c); }
4897        print!("], ");
4898    }
4899    println!("]");
4900    assert_eq!(cipher, [[0x1C, 0x44, 0x7D, 0x29, 0x11, 0x64, 0x5F, 0x2C, 0xEE, 0x7F, 0x3A, 0x75, 0x2C, 0x11, 0xC6, 0x50, 0x5A, 0xF7, 0x65, 0x97, 0x73, 0x7B, 0x96, 0xC, 0xEB, 0x45, 0x4B, 0x46, 0xE2, 0x2C, 0x7B, 0x2E, 0x27, 0xD1, 0xD8, 0xA, 0x21, 0x4F, 0x32, 0xBE, 0x7D, 0x22, 0x8D, 0x71, 0x8B, 0x4C, 0x64, 0xAA, 0xAD, 0x30, 0x85, 0x47, 0x2D, 0x80, 0x60, 0xB0, 0x9, 0x84, 0x68, 0x5E, 0x94, 0xC8, 0xF3, 0x82, 0x71, 0xDB, 0x30, 0x99, 0x36, 0x7A, 0x28, 0xA2, 0x6F, 0x76, 0xE5, 0xE9, 0x5C, 0x5C, 0x9E, 0xC0, 0x1E, 0xBA, 0xDE, 0xB4, 0x9E, 0x2F, 0x45, 0xDD, 0x95, 0x52, 0x19, 0x5D, 0x41, 0xD2, 0x66, 0xA3, 0x2E, 0x15, 0xE, 0x5C, 0xC6, 0x47, 0xAB, 0xED, 0xE, 0x7, 0xDE, 0x6B, 0x6F, 0xAA, 0xA5, 0x27, 0xFB, 0x9, 0x40, 0x13, 0x8D, 0x3, 0xB1, 0x55, 0x46, 0x64, 0x19, 0x19, 0x64, 0xC2, 0xA9, 0xC4, 0x51, 0xAB, 0xC6, 0xAE, 0xD5, 0xDC, 0x37, 0xA4, 0x60, 0xC5, 0xEB, 0xF8, 0xFC, 0xB1, 0xAD, 0x9E, 0x23, 0xD4, 0x46, 0xA4, 0x32, 0xC6, 0x10, 0x6C, 0x26, 0x83, 0x55, 0x20, 0xBC, 0xD5, 0x92, 0xEF, 0xC2, 0x75, 0x4F, 0x12, 0x15, 0x65, 0x31, 0x61, 0x6D, 0xA0, 0xA2, 0x9B, 0xA3, 0x39, 0x2, 0xC4, 0xE8, 0x40, 0x64, 0x82, 0x8B, 0xED, 0x4, 0xFF, 0x8F, 0xA3, 0xE3, 0x3B, 0xA7, 0xED, 0xFB, 0x8F, 0x25, 0x4B, 0x15, 0xBB, 0xD3, 0x69, 0x7A, 0xF3, 0x50, 0x1E, 0xA2, 0x82, 0x5E, 0x86, 0x99, 0xE7, 0x91, 0x1E, 0xFC, 0xB9, 0xF8, 0x3F, 0xDA, 0x8D, 0xB5, 0x73, 0x26, 0xA9, 0xDF, 0x7B, 0x6B, 0x2E, 0xAB, 0x30, 0x66, 0x2C, 0xAF, 0xFF, 0xF, 0xF1, 0x53, 0x62, 0xEC, 0xD1, 0x26, 0x7D, 0x7B, 0xEE, 0x27, 0xBC, 0x67, 0xE3, 0x5A, 0x23, 0x33, 0x62, 0xB5, 0x54, 0x19, 0x82, 0xA2, 0xFF, 0x16, 0x75, 0xE5, 0x54, 0xBF, 0x1B, 0x1E, 0x90, 0xA7, 0xB9, 0x59, 0x20, 0x67, 0xC6, 0x30, 0x49, 0xF, 0xE7, 0x54, 0x47, 0xA6, 0x39, 0x43, 0x22, 0xC1, 0xD4, 0xB8, 0xEB, 0xCD, 0x49, 0xA1, 0xE8, 0x39, 0x2E, 0xAD, 0x82, 0xF3, 0xCA, 0xFC, 0xE2, 0xD3, 0x94, 0xF, 0x45, 0x85, 0xEC, 0xA7, 0xD3, 0xD7, 0x31, 0x57, 0x70, 0xC4, 0x2F, 0xC4, 0xB0, 0x5B, 0x9, 0xC1, 0x6D, 0xC9, 0xF7, 0x5C, 0xEF, 0x99, 0x4F, 0xD7, 0xF7, 0x14, 0x4B, 0xD6, 0xD0, 0x7A, 0xA7, 0x71, 0xCD, 0xD4, 0xA1, 0xB4, 0x9B, 0x8D, 0xCF, 0x98, 0xB8, 0x9E, 0x6F, 0x1B, 0xBD, 0x67, 0x3, 0x8B, 0x43, 0x18, 0x61, 0x29, 0xA, 0x8B, 0x55, 0xCA, 0x46, 0xE3, 0xC7, 0xBF, 0xEB, 0x21, 0x37, 0xC8, 0x49, 0x44, 0xA4, 0x3F, 0x30, 0x26, 0x1F, 0xA3, 0xF7, 0x5, 0x42, 0x33, 0x40, 0x22, 0x80, 0xFF, 0x2D, 0xF, 0xCD, 0xD0, 0x40, 0xD1, 0xAB, 0xDD, 0x1E, 0xD4, 0x9A, 0x18, 0x8A, 0x1B, 0xD5, 0xD8, 0xE8, 0x91, 0x32, 0x19, 0x4F, 0x9A, 0xC0, 0xED, 0x31, 0x3D, 0xA5, 0xB9, 0xBA, 0xBD, 0xA6, 0xEC, 0xD0, 0xC8, 0x5B, 0x7C, 0x2, 0x50, 0xBF, 0xC7, 0xD4, 0xEF, 0xD8, 0x2E, 0x6C, 0xA4, 0x98, 0xBF, 0x6D, 0x1, 0xF1, 0xE0, 0xEB, 0x60, 0x89, 0x6E, 0xCE, 0x83, 0x57, 0x55, 0xA, 0x5F, 0x8C, 0x6B, 0x7A, 0x4D, 0xC6, 0x64, 0x3F, 0xB5, 0x86, 0x84, 0xEF, 0xD2, 0x85, 0x6, 0x96, 0x67, 0x22, 0xB1, 0x89, 0xA0, 0x97, 0xE1, 0x74, 0x8C, 0xCB, 0x92, 0xC5, 0xCC, 0xA3, 0xC3, 0x6E, 0xFE, 0xEF, 0xD0, 0xD2, 0x79, 0x4F, 0xE1, 0x45, 0x95, 0x38, 0x7C, 0x9E, 0x71, 0x84, 0xBA, 0x4, 0x0, 0xDC, 0x27, 0xF3, 0xCA, 0x86, 0xF7, 0x3D, 0x11, 0xBC, 0x24, 0x5C, 0x5A, 0x87, 0xD, 0x4A, 0x3A, 0xD9, 0x37, 0xD4, 0x8A, 0x7A, 0xF7, 0x31, 0x58, 0xDD],
4901                        [0x3C, 0x26, 0xEA, 0xF8, 0xFE, 0xA4, 0x51, 0xE5, 0xDF, 0x52, 0xB, 0xF2, 0x9E, 0x8, 0x92, 0xC9, 0xCA, 0x6F, 0x17, 0x74, 0xBC, 0x52, 0xDC, 0x75, 0x78, 0x3A, 0xEF, 0xD7, 0x16, 0x6, 0x51, 0x9D, 0xDC, 0x95, 0xA5, 0x76, 0x6D, 0x4A, 0x4E, 0xF4, 0xD6, 0xC7, 0xF6, 0x6F, 0x1C, 0xE3, 0x6, 0x9D, 0x81, 0xF8, 0x47, 0x14, 0x8B, 0xCD, 0x10, 0x5B, 0xF5, 0xC9, 0x44, 0x8E, 0x6C, 0x32, 0xB6, 0xDC, 0x8C, 0xF1, 0x79, 0xB, 0xB1, 0xBB, 0x8, 0xD0, 0x8A, 0xE9, 0xDA, 0xA9, 0x3E, 0xFF, 0xAC, 0x62, 0xB7, 0x3C, 0x7C, 0x2A, 0x3D, 0xDD, 0x74, 0xF7, 0x33, 0xC3, 0x41, 0x30, 0xCF, 0x67, 0x43, 0x15, 0xA, 0xA9, 0xE4, 0x1D, 0x2F, 0xE1, 0x7D, 0xB, 0x59, 0x43, 0xAD, 0x8D, 0x1A, 0xCE, 0xB7, 0x8E, 0xCE, 0x61, 0x15, 0xB1, 0xCF, 0x2A, 0x3E, 0xA0, 0x59, 0xCC, 0xE3, 0x2, 0x65, 0x73, 0xA2, 0x29, 0xC, 0xCF, 0x4B, 0x88, 0x6C, 0x77, 0x86, 0xC1, 0x87, 0xF7, 0xB3, 0xBD, 0x7C, 0xDC, 0x6C, 0xA7, 0x90, 0xEC, 0xD0, 0x32, 0xCE, 0xB3, 0x1D, 0x34, 0x8E, 0xA1, 0x8, 0xC3, 0x65, 0xF2, 0xC4, 0xBB, 0xC3, 0x78, 0xA8, 0x8E, 0x30, 0xD9, 0xE9, 0xBB, 0x39, 0x23, 0x4C, 0xD, 0x3, 0xCA, 0x2D, 0xCB, 0x1D, 0x36, 0xA4, 0xAA, 0x39, 0x63, 0x8, 0xF9, 0xE0, 0x58, 0x11, 0x85, 0xA5, 0x87, 0x61, 0xDC, 0x71, 0xC0, 0x5D, 0xB8, 0x7F, 0xC8, 0xDF, 0xB0, 0x4B, 0x70, 0x62, 0xD7, 0xDF, 0x30, 0x76, 0x58, 0xEE, 0xAF, 0xF3, 0xB0, 0x19, 0x2F, 0x70, 0x77, 0xB1, 0xEA, 0x2D, 0xE7, 0xA4, 0x76, 0x6F, 0xCC, 0xE9, 0x1F, 0xF9, 0xFB, 0xBB, 0x57, 0x22, 0x68, 0x31, 0x3C, 0x80, 0xE1, 0x7D, 0x2B, 0xA7, 0x4A, 0xE0, 0x36, 0x95, 0x31, 0xD4, 0x7, 0xB6, 0xD3, 0x38, 0xA5, 0x49, 0xB2, 0x87, 0x1, 0x6C, 0x16, 0x2D, 0x27, 0x21, 0xF1, 0xAB, 0x89, 0x10, 0x9F, 0xCD, 0x66, 0x62, 0x82, 0x74, 0x5B, 0x9A, 0x20, 0xE4, 0xF6, 0xB7, 0x51, 0x5E, 0x87, 0x8A, 0x69, 0xC2, 0x64, 0x99, 0xC8, 0x4C, 0x4D, 0x11, 0xE0, 0xE8, 0x15, 0x23, 0xE3, 0xC3, 0x50, 0xFD, 0xFB, 0x4, 0xA9, 0x2E, 0x63, 0xE4, 0x37, 0x21, 0xC9, 0x76, 0x30, 0xEE, 0xCC, 0x2C, 0x12, 0xF7, 0x48, 0xCD, 0x73, 0x7, 0xF5, 0xC6, 0xE6, 0xEF, 0x79, 0xAC, 0x11, 0xFD, 0xEC, 0xBC, 0x3B, 0xA8, 0x1B, 0xDA, 0x3F, 0xF2, 0xC5, 0x9D, 0x9C, 0xFE, 0xC4, 0x67, 0x4, 0x6D, 0xDC, 0x56, 0x49, 0xA9, 0xE8, 0x7D, 0x70, 0x6D, 0xF9, 0x92, 0x65, 0xDC, 0x63, 0xEC, 0x7F, 0xE2, 0x9A, 0xFC, 0x11, 0x8, 0x80, 0x65, 0x66, 0x30, 0x47, 0x4E, 0xAC, 0x82, 0xDD, 0x17, 0x12, 0x93, 0x36, 0x28, 0x35, 0x81, 0x8B, 0xFC, 0xF5, 0xE4, 0x88, 0xD4, 0x6D, 0x89, 0x98, 0x69, 0x22, 0xD, 0xB8, 0x5A, 0x90, 0x19, 0x6C, 0x82, 0xB4, 0xA6, 0xDB, 0xA2, 0x79, 0x8B, 0x25, 0xA5, 0x9A, 0x3C, 0x1A, 0xBD, 0x14, 0xA5, 0xC1, 0xD2, 0x45, 0x28, 0x6C, 0x25, 0xCB, 0xD0, 0x72, 0x40, 0xF4, 0xC1, 0x18, 0x17, 0x97, 0x76, 0xE, 0x17, 0xD5, 0xD4, 0xD2, 0x3A, 0xB6, 0x9B, 0x66, 0x99, 0x75, 0x73, 0x85, 0x10, 0xB9, 0x61, 0x87, 0xB7, 0x71, 0xAA, 0xD5, 0xD0, 0x23, 0x11, 0x7A, 0x83, 0x58, 0xD9, 0xBC, 0x25, 0x50, 0x2A, 0xA0, 0xA3, 0x1C, 0xB7, 0x72, 0xE2, 0x91, 0xE9, 0x60, 0xC7, 0x1, 0x66, 0xAD, 0xF, 0xC8, 0x76, 0x91, 0xA9, 0xFC, 0x51, 0x21, 0xA9, 0xE4, 0xFC, 0x70, 0x1C, 0x99, 0x6B, 0xA1, 0x4F, 0x83, 0x3B, 0x48, 0x9F, 0x95, 0x16, 0x72, 0x2F, 0xFC, 0x7, 0x27, 0xE0, 0x46, 0x1A, 0x77, 0x68, 0xE1, 0xF3, 0xE, 0xCC, 0xEF, 0x3C, 0x3D, 0x7D, 0x25, 0xCA, 0x8D],
4902                        [0x9, 0xE3, 0x2B, 0xF4, 0xDC, 0xE2, 0x4C, 0xDB, 0xDD, 0x7B, 0xA2, 0x42, 0x2B, 0xB8, 0x98, 0xC1, 0x47, 0x27, 0x7A, 0x3E, 0x3E, 0x7A, 0xFF, 0x46, 0x5B, 0x25, 0xA7, 0x9E, 0x5F, 0x5D, 0x8A, 0x17, 0xAD, 0xFA, 0x9F, 0x8, 0x32, 0x96, 0xC0, 0x4E, 0x8F, 0x24, 0x1D, 0xE8, 0x52, 0xF7, 0x35, 0x68, 0x5D, 0x56, 0xEC, 0xF6, 0xB0, 0xAF, 0x1D, 0xC, 0xB5, 0xF0, 0xD, 0x2D, 0x1F, 0xC1, 0x30, 0xDF, 0x61, 0xED, 0xB1, 0x36, 0xF5, 0xEB, 0x3, 0xD3, 0xC8, 0x5A, 0xD0, 0x20, 0xA7, 0xBE, 0x3E, 0x8D, 0xF6, 0x36, 0xD1, 0x63, 0x8A, 0xC5, 0x5C, 0x1, 0x45, 0x5B, 0xA6, 0xC4, 0x31, 0x77, 0x12, 0x17, 0x81, 0xB5, 0xF6, 0x94, 0xE0, 0xB2, 0x1B, 0x1, 0x99, 0x65, 0xA4, 0xAE, 0x84, 0xD, 0x2B, 0x3E, 0xFC, 0xD0, 0x5C, 0x6D, 0x7D, 0x98, 0xE2, 0xDA, 0x7B, 0x7C, 0x85, 0xBD, 0x3A, 0x9E, 0xC6, 0xDE, 0x9A, 0x9B, 0x66, 0x55, 0x2, 0xD8, 0x25, 0x1D, 0x31, 0x3B, 0x6C, 0x35, 0x4E, 0x8F, 0xD7, 0x63, 0xA4, 0x82, 0xBA, 0x55, 0x88, 0xD9, 0xEC, 0x31, 0x75, 0xC2, 0xFA, 0xD0, 0x9, 0xD0, 0xF6, 0xBC, 0x36, 0xBE, 0x3B, 0x4D, 0xD0, 0x4A, 0x39, 0x8, 0xF8, 0xCB, 0x49, 0x78, 0x6B, 0xF1, 0xF0, 0x73, 0x7, 0xD8, 0x5E, 0x2D, 0x31, 0xE5, 0x3B, 0xDE, 0xC6, 0x6E, 0xC0, 0x23, 0x61, 0x5A, 0x2A, 0x6, 0xD3, 0x95, 0xAD, 0x97, 0x16, 0xB0, 0x5A, 0xB8, 0x6D, 0x32, 0xB7, 0x32, 0x82, 0x7E, 0x85, 0x3E, 0x2E, 0x5D, 0x10, 0xC2, 0xC1, 0x85, 0x90, 0xFE, 0x32, 0xF8, 0x4A, 0xEF, 0xA4, 0xB9, 0x2C, 0xC5, 0x44, 0xF0, 0x2, 0xF3, 0x70, 0x9, 0xB3, 0xA7, 0x2D, 0x47, 0x41, 0xAB, 0xA5, 0x22, 0x4C, 0xBE, 0xA8, 0xAC, 0xB4, 0xCF, 0x28, 0x74, 0x3C, 0xD6, 0x99, 0xA4, 0x95, 0x51, 0x1D, 0xFB, 0x9F, 0xCA, 0x8C, 0xD9, 0x4, 0x76, 0xDD, 0x7D, 0x7A, 0x4, 0x82, 0x14, 0xD1, 0xE7, 0x37, 0xC7, 0xB0, 0xF4, 0xBC, 0xF, 0x4, 0x85, 0xF7, 0x51, 0x9A, 0xE3, 0xDD, 0x71, 0x1A, 0xC5, 0xC0, 0x81, 0x9, 0x88, 0x2F, 0xAF, 0x4C, 0xBF, 0xF4, 0x73, 0x38, 0x44, 0x99, 0xFC, 0xDA, 0x90, 0x25, 0xB4, 0x23, 0x48, 0x13, 0x4D, 0xC0, 0x85, 0x14, 0x62, 0x1, 0x5A, 0x9D, 0xE7, 0x33, 0xB0, 0xF4, 0x5A, 0x17, 0x3A, 0xD1, 0xBA, 0x6F, 0xAB, 0x92, 0xE5, 0xB, 0xDE, 0xFE, 0x68, 0x3C, 0x71, 0x15, 0xCB, 0x1A, 0xE0, 0x68, 0x5, 0x41, 0xE2, 0x3D, 0x43, 0x77, 0x4B, 0x68, 0x6, 0xF2, 0xEC, 0x51, 0xD7, 0x21, 0xDB, 0x6D, 0x45, 0xC, 0xE8, 0xC6, 0x62, 0x9D, 0x2D, 0xCD, 0xF1, 0x29, 0xBC, 0x49, 0x7E, 0x13, 0x1E, 0xD9, 0xC, 0xC2, 0xEC, 0xD2, 0x53, 0x1D, 0xAC, 0x17, 0x9B, 0x58, 0x7C, 0xB7, 0x55, 0xE5, 0x48, 0xB0, 0x8F, 0x41, 0x88, 0xB1, 0xC0, 0x5E, 0x5D, 0x9D, 0x1D, 0xEA, 0x16, 0x67, 0xC2, 0xEE, 0x87, 0x17, 0x7E, 0x3A, 0xB8, 0x16, 0xE2, 0xE2, 0xB9, 0x30, 0xB2, 0xC1, 0x27, 0xF6, 0x2, 0x79, 0x14, 0xB5, 0x2F, 0x5D, 0x52, 0xDE, 0x4C, 0x7C, 0x70, 0xFA, 0x86, 0xF1, 0xBC, 0xAC, 0xDA, 0xB9, 0x85, 0x8A, 0xFE, 0x9A, 0x5E, 0xF9, 0x8C, 0xBB, 0x2D, 0x7C, 0xC1, 0x61, 0x6D, 0x4C, 0xAE, 0xF2, 0xF1, 0xBF, 0xC2, 0xCC, 0x1E, 0xCD, 0x77, 0x51, 0xFB, 0xC2, 0xC, 0x82, 0x94, 0xFB, 0x4A, 0x0, 0x98, 0x90, 0x24, 0xE2, 0xEB, 0xA0, 0xD1, 0xEC, 0xD2, 0x97, 0x6, 0x6B, 0xE, 0xD4, 0xC9, 0xE2, 0x9, 0x1F, 0x10, 0x62, 0xB, 0x27, 0x50, 0x9D, 0xDD, 0xC1, 0x7C, 0xD0, 0xC4, 0x30, 0x41, 0x71, 0xC4, 0x1B, 0x51, 0x7F, 0x8, 0xBF, 0x5A, 0x7E, 0x10, 0xE6, 0x38, 0xE2, 0xE1, 0x52, 0x4B, 0x11, 0xD2]]);
4903    let recovered = rsa.decrypt_array_unit(&cipher);
4904    let mut rrr = [[0u128; 32]; 3];
4905    unsafe { copy_nonoverlapping(recovered.as_ptr() as *const u8, rrr.as_mut_ptr() as *mut u8, 512 * 3); }
4906    
4907    print!("RSA_4096_u8: Recovered = [");
4908    for rr in rrr
4909    {
4910        print!("[");
4911        for r in rr
4912            { print!("{:#X}, ", r); }
4913        print!("], ");
4914    }
4915    println!("]");
4916    assert_eq!(rrr, [[0x_123456789ABCDEF00FEDCBA987654321_u128, 0x_11223344556677889900AABBCCDDEEFF, 0x_FFEEDDCCBBAA00998877665544332211, 0x_1F2E3D4C5B6A70899807A6B5C4D3E2F1, 0x_F1E2D3C4B5A6079889706A5B4C3D2E1F, 0x_102F3E4D5C6B7A8998A7B6C5D4E3F201, 0x_11112222333344445555666677778888, 0x_99990000AAAABBBBCCCCDDDDEEEEFFFF, 0x_FEDCBA98765432100123456789ABCDEF, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_879605A4B3C2D1E00F1E2D3C4B5A6978, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_111122223333444499990000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000],
4917                    [0x_3456789ABCDEF00FEDCBA98765432112_u128, 0x_9900AABBCCDDEEFF1122334455667788, 0x_8877665544332211FFEEDDCCBBAA0099, 0x_9807A6B5C4D3E2F11F2E3D4C5B6A7089, 0x_89706A5B4C3D2E1FF1E2D3C4B5A60798, 0x_98A7B6C5D4E3F201102F3E4D5C6B7A89, 0x_55556666777788881111222233334444, 0x_CCCCDDDDEEEEFFFF99990000AAAABBBB, 0x_0123456789ABCDEFFEDCBA9876543210, 0x_556677889900AABB11223344CCDDEEFF, 0x_44332211FFEEDDCC88776655BBAA0099, 0x_4D3E2F11F29807A6B5CE3D4C5B6A7089, 0x_2D1E00F1E2D879605A4B3C3C4B5A6978, 0x_E3F201102F3E98A7B6C5D44D5C6B7A89, 0x_333344449999111122220000AAAABBBB, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000],
4918                    [0x_56789ABCDEF00FEDCBA9876543211234_u128, 0x_11223344CCDDEEFF556677889900AABB, 0x_FFEEDDCC5544332211BBAA0099887766, 0x_5B6A70899807A6B51F2E3D4CC4D3E2F1, 0x_B5A6079889706A5BF1E2D3C44C3D2E1F, 0x_102F3E4DD4E3F2015C6B7A8998A7B6C5, 0x_33334444555566661111222277778888, 0x_99990000EEEEFFFFAAAABBBBCCCCDDDD, 0x_FEDCBA99ABCDEF876543210012345678, 0x_CCDDEEFF112233449900AABB55667788, 0x_88776655BBAA009944332211FFEEDDCC, 0x_9807A6B5C5B6A7089C4D3E2F11F2E3D4, 0x_879605A43C4B5A6978B3C2D1E00F1E2D, 0x_E3F201102F3E98A7B6C5D44D5C6B7A89, 0x_111122220000AAAABBBB333344449999, 0x_5555666677778888CCCCDDDDEEEEFFFF, 0x_11111111111111111111111111111111, 0x_22222222222222222222222222222222, 0x_33333333333333333333333333333333, 0x_44444444444444444444444444444444, 0x_55555555555555555555555555555555, 0x_66666666666666666666666666666666, 0x_77777777777777777777777777777777, 0x_88888888888888888888888888888888, 0x_99999999999999999999999999999999, 0x_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, 0x_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB, 0x_CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC, 0x_DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD, 0x_EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE, 0x_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, 0x_00000000000000000000000000000000]]);
4919    assert_eq!(rrr, message);
4920    println!("-------------------------------");
4921}