1use 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 use cryptocol::asymmetric::RSA_1024;
118 let _rsa = RSA_1024::new();
119
120 use cryptocol::asymmetric::RSA_2048;
122 let _rsa = RSA_2048::new();
123
124 use cryptocol::asymmetric::RSA_4096;
126 let _rsa = RSA_4096::new();
127
128 use cryptocol::asymmetric::RSA_Generic;
130 let _rsa = RSA_Generic::<8, u32, 5>::new();
131
132 use cryptocol::asymmetric::RSA_1024_u128;
134 let _rsa = RSA_1024_u128::new();
135
136 use cryptocol::asymmetric::RSA_2048_u128;
138 let _rsa = RSA_2048_u128::new();
139
140 use cryptocol::asymmetric::RSA_4096_u128;
142 let _rsa = RSA_4096_u128::new();
143
144 use cryptocol::asymmetric::RSA_1024_u64;
146 let _rsa = RSA_1024_u64::new();
147
148 use cryptocol::asymmetric::RSA_2048_u64;
150 let _rsa = RSA_2048_u64::new();
151
152 use cryptocol::asymmetric::RSA_4096_u64;
154 let _rsa = RSA_4096_u64::new();
155
156 use cryptocol::asymmetric::RSA_1024_u32;
158 let _rsa = RSA_1024_u32::new();
159
160 use cryptocol::asymmetric::RSA_2048_u32;
162 let _rsa = RSA_2048_u32::new();
163
164 use cryptocol::asymmetric::RSA_4096_u32;
166 let _rsa = RSA_4096_u32::new();
167
168 use cryptocol::asymmetric::RSA_1024_u16;
170 let _rsa = RSA_1024_u16::new();
171
172 use cryptocol::asymmetric::RSA_2048_u16;
174 let _rsa = RSA_2048_u16::new();
175
176 use cryptocol::asymmetric::RSA_4096_u16;
178 let _rsa = RSA_4096_u16::new();
179
180 use cryptocol::asymmetric::RSA_1024_u8;
182 let _rsa = RSA_1024_u8::new();
183
184 use cryptocol::asymmetric::RSA_2048_u8;
186 let _rsa = RSA_2048_u8::new();
187
188 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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}