``` 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
```
```//! Cryptosystems primitives
//!
//! Cryptosystem is a suite of algorithms that describe particular security service, in most cases
//! used for achieving confidentiality. Typically this is set of three algorithms: key generation,
//! encryption function and decryption function.
//!
//! Mathematically it can be described as tuple `(P, C, K, E, D)`, where:
//!
//! - `P` is a set called "plaintext space"
//! - `C` is a set called "ciphertext space"
//! - `K` is a set called "key space"
//! - `E` is a set of functions `e :: k -> p -> c` called "encryption functions"
//! - `D` is a set of functions `d :: k -> c -> p` called "decryption functions"
//!
//! For each `ke ∈ K` there is `kd ∈ K` such that `d(kd, e(ke, p)) = p`. If `kd = ke` then we call
//! that "symmetric cipher" otherwise we call it "asymmetric cipher".
//!
//! In practise we use "asymmetric ciphers" for which computing `kd` from `ke` is computationally
//! hard or impossible.
//!
//! # Kerckhoff's Principle
//!
//! > A cryptosystem should be secure even if everything about the system, except the key, is
//! > public knowledge.
//!
//! This is basic law for moder cryptography. Unfortunately many of people understand this as
//! "keeping cryptosystem hidden is bad". That is big misunderstanding of what that principle
//! states. It is nothing bad to keep cryptosystem in secret, it is yet another obstacle to
//! overcome by eavesdropper, just don't rely on secrecy.
//!
//! # Key lengths
//!
//! According to [ECRYPT II][ecrypt] [Yearly Report on Algorithms and Keysizes][d.spa.20] this
//! table presents key-sizes equivalence between types of algorithms:
//!
//! | Symmetric | Factoring Modulus | Discrete Logarithm | Elliptic Curves |
//! | --------: | ----------------: | -----------------: | --------------: |
//! |        48 |               480 |             480/96 |              96 |
//! |        56 |               640 |            640/112 |             112 |
//! |        64 |               816 |            816/128 |             128 |
//! |        80 |              1248 |           1248/160 |             160 |
//! |       112 |              2432 |           2432/224 |             224 |
//! |       128 |              3248 |           3248/256 |             256 |
//! |       160 |              5312 |           5312/320 |             320 |
//! |       192 |              7936 |           7936/384 |             384 |
//! |       256 |             15424 |          15424/512 |             512 |
//!
//! # Security table
//!
//! Levels of security according to [ECRYPT II][ecrypt] [Yearly Report on Algorithms and
//! Keysizes][d.spa.20]
//!
//! | Security Level | Security (bits) | Protection                                                                                            | Comment                                                                    |
//! | -------------- | --------------: | ----------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- |
//! | 1.             |              32 | Attacks in "real-time" by individuals                                                                 | Only acceptable for auth. tag size                                         |
//! | 2.             |              64 | Very short-term protection against small organizations                                                | Should not be used for confidentiality in new systems                      |
//! | 3.             |              72 | Short-term protection against medium organizations, mediumterm protection against small organizations |                                                                            |
//! | 4.             |              80 | Very short-term protection against agencies, long-term prot. against small organizations              | Smallest general-purpose level, <= 4 years protection                      |
//! | 5.             |              96 | Legacy standard level                                                                                 | 2-key 3DES restricted to ~10^6 plaintext/ciphertexts, ~10 years protection |
//! | 6.             |             112 | Medium-term protection                                                                                | ~20 years protection                                                       |
//! | 7.             |             128 | Long-term protection                                                                                  | Good, generic application-indep. recommendation, ~30 years protection      |
//! | 8.             |             256 | "Foreseeable future"                                                                                  | Good protection against quantum computers unless Shor's algorithm applies  |
//!
//! We recommend at least 128-bit security for general purpose.
//!
//! [ecrypt]: http://www.ecrypt.eu.org/ "European Network of Excellence in Cryptology II "
//! [d.spa.20]: http://www.ecrypt.eu.org/ecrypt2/documents/D.SPA.20.pdf "ECRYPT II Yearly Report on Algorithms and Keysizes"

extern crate byteorder;
extern crate generic_array;
extern crate num;
extern crate rand;
extern crate typenum;

pub mod block;
pub mod stream;
pub mod asymmetric;

pub mod prelude {
pub use block::{BlockEncrypt, BlockDecrypt};
pub use stream::{StreamEncrypt, StreamDecrypt};
}
```