1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// Recommendation for Block Cipher Modes of Operation (ECB/CBC/CFB/OFB/CTR)
// https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38a.pdf
//
// NOTE:
//
// 对于 CBC、CFB 和 OFB 分组模式而言,在对一条 `消息` 进行加密或解密的操作时,
// 需要用户提供:
//
// 1. 初始向量(IV)
// 2. 密文或明文
//
// 其中,初始向量(IV)并不要求是机密性的(比如随机生成),
// 因此,初始向量(IV)或生成初始向量(IV)的信息可以和
// 密文一起发送给接收端。
//
//
//
// 对于 CTR 模式,在进行加密或解密操作时,需要用户提供:
//
// 1. Counter Block
// 2. 密文或明文
//
// Counter Block 的大小和 Block Cipher 的 BLOCK_SIZE 一样。
// 它的内存布局大概是:
//
// IV || Counter
//
// 但是在标准(NIST-SP-800-38A)里面,确并没有明确 Counter 到底
// 使用多少 位(Bits)来用作 Block 的计数器。
// 一些应用制定了比较明确的规范,如 `RFC-3686` 在 `Section 4` 里面
// 明确规范了 Counter Block 的格式为:
//
// NONCE (32-bits) || IV (64-bits) || BlockCounter (32-bit big-endian integer)
//
// 对于这个问题,本项目的实现是:
//
// IV (96-bits) || Counter (32-bits, big-endian)
//
// 这样,可以很好的兼容不同的内存布局(Layout)。
//
// 以上资料信息可以在 `Recommendation for Block Cipher Modes of Operation (ECB/CBC/CFB/OFB/CTR)` 的
// 以下章节里面找到:
//
// * Appendix B: Generation of Counter Blocks
// * Appendix C: Generation of Initialization Vectors
//
//
//
// 对于 AEAD 分组模式,如 CCM、OCB、GCM、GCM-SIV、SIV,进行加解密时,需要用户提供:
//
// 1. 对每个 Message 而言,具有唯一性的 Nonce。
// 2. 密文或明文
//
// 跟 IV 不同,IV 并不要求信息的机密性,他甚至可以和密文一起发送。
// 但 NONCE 要求并不是如此,他要求是机密性的。
//
// 最后,不管是 IV 还是 NONCE,对于不同的消息的加解密时,IV 或 NONCE 不应该是相同的。
pub use *;
pub use *;
pub use *;
pub use *;
pub use *;
// AEAD
pub use *;
pub use *;
pub use *;
pub use *;
pub use *;
// IEEE P1619™/D16 Standard for Cryptographic Protection of Data on Block-Oriented Storage Devices
// http://libeccio.di.unisa.it/Crypto14/Lab/p1619.pdf
//
// Recommendation for Block Cipher Modes of Operation: The XTS-AES Mode for Confidentiality on Storage Devices
// https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38e.pdf
//
// Disk encryption theory
// https://en.wikipedia.org/wiki/Disk_encryption_theory
//
//
// C code
// https://docs.rs/crate/xtsn/0.1.1/source/src/ccrypto.c
//
// Rust Code
// https://github.com/pheki/xts-mode/blob/master/src/lib.rs
//
// C Code
// https://github.com/randombit/botan/blob/master/src/lib/modes/xts/xts.cpp
// 2. Notation and Basic Operations
// https://tools.ietf.org/html/rfc7253#section-2
//
// double(S) If S[1] == 0, then double(S) == (S[2..128] || 0);
// otherwise, double(S) == (S[2..128] || 0) xor
// (zeros(120) || 10000111).
//
// https://github.com/briansmith/ring/issues/517
pub const