pq_crypto-seal 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.github/workflows/ci.yml +66 -0
- data/CHANGELOG.md +44 -0
- data/FORMAT.md +139 -0
- data/GET_STARTED.md +30 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +215 -0
- data/RELEASING.md +34 -0
- data/Rakefile +19 -0
- data/SECURITY.md +85 -0
- data/VENDORING.md +14 -0
- data/ext/pq_crypto_seal/aegis_unused_stubs.c +20 -0
- data/ext/pq_crypto_seal/extconf.rb +296 -0
- data/ext/pq_crypto_seal/pq_crypto_seal.c +390 -0
- data/ext/pq_crypto_seal/vendor/libaegis/LICENSE +21 -0
- data/ext/pq_crypto_seal/vendor/libaegis/TREE_SHA256 +1 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/aegis128l.c +246 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/aegis128l_aesni.c +73 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/aegis128l_aesni.h +9 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/aegis128l_altivec.c +70 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/aegis128l_altivec.h +9 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/aegis128l_common.h +691 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/aegis128l_neon_aes.c +77 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/aegis128l_neon_aes.h +9 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/aegis128l_neon_sha3.c +86 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/aegis128l_neon_sha3.h +9 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/aegis128l_soft.c +63 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/aegis128l_soft.h +9 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128l/implementations.h +40 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/aegis128x2.c +247 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/aegis128x2_aesni.c +108 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/aegis128x2_aesni.h +9 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/aegis128x2_altivec.c +103 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/aegis128x2_altivec.h +9 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/aegis128x2_avx2.c +79 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/aegis128x2_avx2.h +11 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/aegis128x2_common.h +795 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/aegis128x2_neon_aes.c +111 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/aegis128x2_neon_aes.h +9 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/aegis128x2_soft.c +96 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/aegis128x2_soft.h +9 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x2/implementations.h +40 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4.c +252 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_aesni.c +117 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_aesni.h +9 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_altivec.c +111 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_altivec.h +9 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_avx2.c +112 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_avx2.h +11 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_avx512.c +85 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_avx512.h +11 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_common.h +808 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_neon_aes.c +119 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_neon_aes.h +9 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_soft.c +104 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/aegis128x4_soft.h +9 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis128x4/implementations.h +41 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256/aegis256.c +240 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256/aegis256_aesni.c +68 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256/aegis256_aesni.h +9 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256/aegis256_altivec.c +68 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256/aegis256_altivec.h +9 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256/aegis256_common.h +673 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256/aegis256_neon_aes.c +75 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256/aegis256_neon_aes.h +9 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256/aegis256_soft.c +58 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256/aegis256_soft.h +9 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256/implementations.h +39 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/aegis256x2.c +247 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/aegis256x2_aesni.c +103 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/aegis256x2_aesni.h +9 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/aegis256x2_altivec.c +101 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/aegis256x2_altivec.h +9 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/aegis256x2_avx2.c +74 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/aegis256x2_avx2.h +11 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/aegis256x2_common.h +790 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/aegis256x2_neon_aes.c +109 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/aegis256x2_neon_aes.h +9 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/aegis256x2_soft.c +91 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/aegis256x2_soft.h +9 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x2/implementations.h +41 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4.c +252 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_aesni.c +112 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_aesni.h +9 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_altivec.c +109 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_altivec.h +9 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_avx2.c +107 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_avx2.h +11 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_avx512.c +79 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_avx512.h +11 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_common.h +805 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_neon_aes.c +117 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_neon_aes.h +9 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_soft.c +99 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/aegis256x4_soft.h +9 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/aegis256x4/implementations.h +42 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/common/common.c +81 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/common/common.h +144 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/common/cpu.c +378 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/common/cpu.h +34 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/common/keccak.c +187 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/common/keccak.h +13 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/common/softaes.c +338 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/common/softaes.h +69 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/include/aegis.h +77 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/include/aegis128l.h +311 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/include/aegis128x2.h +313 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/include/aegis128x4.h +313 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/include/aegis256.h +311 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/include/aegis256x2.h +313 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/include/aegis256x4.h +313 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/include/aegis_raf.h +580 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/raf/raf.c +87 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/raf/raf_aegis128l.c +20 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/raf/raf_aegis128x2.c +20 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/raf/raf_aegis128x4.c +20 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/raf/raf_aegis256.c +20 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/raf/raf_aegis256x2.c +20 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/raf/raf_aegis256x4.c +20 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/raf/raf_internal.h +152 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/raf/raf_merkle.c +268 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/raf/raf_merkle.h +165 -0
- data/ext/pq_crypto_seal/vendor/libaegis/src/raf/raf_variant.h +1119 -0
- data/fuzz/decrypt_fuzz.rb +119 -0
- data/lib/pq_crypto/seal/binary.rb +62 -0
- data/lib/pq_crypto/seal/core.rb +398 -0
- data/lib/pq_crypto/seal/errors.rb +15 -0
- data/lib/pq_crypto/seal/format.rb +275 -0
- data/lib/pq_crypto/seal/io.rb +336 -0
- data/lib/pq_crypto/seal/native.rb +13 -0
- data/lib/pq_crypto/seal/padding.rb +47 -0
- data/lib/pq_crypto/seal/version.rb +6 -0
- data/lib/pq_crypto/seal.rb +32 -0
- data/pq_crypto-seal.gemspec +37 -0
- data/script/vendor_libs.rb +79 -0
- data/test/aegis_vectors_test.rb +54 -0
- data/test/golden_vectors_test.rb +183 -0
- data/test/io_test.rb +125 -0
- data/test/native_test.rb +36 -0
- data/test/seal_test.rb +238 -0
- data/test/test_helper.rb +6 -0
- metadata +244 -0
|
@@ -0,0 +1,691 @@
|
|
|
1
|
+
#define RATE 32
|
|
2
|
+
#define ALIGNMENT 32
|
|
3
|
+
|
|
4
|
+
typedef aes_block_t aegis_blocks[8];
|
|
5
|
+
|
|
6
|
+
static inline void
|
|
7
|
+
aegis128l_init(const uint8_t *key, const uint8_t *nonce, aes_block_t *const state)
|
|
8
|
+
{
|
|
9
|
+
static CRYPTO_ALIGN(AES_BLOCK_LENGTH)
|
|
10
|
+
const uint8_t c0_[AES_BLOCK_LENGTH] = { 0x00, 0x01, 0x01, 0x02, 0x03, 0x05, 0x08, 0x0d,
|
|
11
|
+
0x15, 0x22, 0x37, 0x59, 0x90, 0xe9, 0x79, 0x62 };
|
|
12
|
+
static CRYPTO_ALIGN(AES_BLOCK_LENGTH)
|
|
13
|
+
const uint8_t c1_[AES_BLOCK_LENGTH] = { 0xdb, 0x3d, 0x18, 0x55, 0x6d, 0xc2, 0x2f, 0xf1,
|
|
14
|
+
0x20, 0x11, 0x31, 0x42, 0x73, 0xb5, 0x28, 0xdd };
|
|
15
|
+
|
|
16
|
+
const aes_block_t c0 = AES_BLOCK_LOAD(c0_);
|
|
17
|
+
const aes_block_t c1 = AES_BLOCK_LOAD(c1_);
|
|
18
|
+
aes_block_t k;
|
|
19
|
+
aes_block_t n;
|
|
20
|
+
int i;
|
|
21
|
+
|
|
22
|
+
k = AES_BLOCK_LOAD(key);
|
|
23
|
+
n = AES_BLOCK_LOAD(nonce);
|
|
24
|
+
|
|
25
|
+
state[0] = AES_BLOCK_XOR(k, n);
|
|
26
|
+
state[1] = c1;
|
|
27
|
+
state[2] = c0;
|
|
28
|
+
state[3] = c1;
|
|
29
|
+
state[4] = AES_BLOCK_XOR(k, n);
|
|
30
|
+
state[5] = AES_BLOCK_XOR(k, c0);
|
|
31
|
+
state[6] = AES_BLOCK_XOR(k, c1);
|
|
32
|
+
state[7] = AES_BLOCK_XOR(k, c0);
|
|
33
|
+
for (i = 0; i < 10; i++) {
|
|
34
|
+
aegis128l_update(state, n, k);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
static inline void
|
|
39
|
+
aegis128l_mac(uint8_t *mac, size_t maclen, uint64_t adlen, uint64_t mlen, aes_block_t *const state)
|
|
40
|
+
{
|
|
41
|
+
aes_block_t tmp;
|
|
42
|
+
int i;
|
|
43
|
+
|
|
44
|
+
tmp = AES_BLOCK_LOAD_64x2(mlen << 3, adlen << 3);
|
|
45
|
+
tmp = AES_BLOCK_XOR(tmp, state[2]);
|
|
46
|
+
|
|
47
|
+
for (i = 0; i < 7; i++) {
|
|
48
|
+
aegis128l_update(state, tmp, tmp);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (maclen == 16) {
|
|
52
|
+
tmp = AES_BLOCK_XOR(state[6], AES_BLOCK_XOR(state[5], state[4]));
|
|
53
|
+
tmp = AES_BLOCK_XOR(tmp, AES_BLOCK_XOR(state[3], state[2]));
|
|
54
|
+
tmp = AES_BLOCK_XOR(tmp, AES_BLOCK_XOR(state[1], state[0]));
|
|
55
|
+
AES_BLOCK_STORE(mac, tmp);
|
|
56
|
+
} else if (maclen == 32) {
|
|
57
|
+
tmp = AES_BLOCK_XOR(state[3], state[2]);
|
|
58
|
+
tmp = AES_BLOCK_XOR(tmp, AES_BLOCK_XOR(state[1], state[0]));
|
|
59
|
+
AES_BLOCK_STORE(mac, tmp);
|
|
60
|
+
tmp = AES_BLOCK_XOR(state[7], state[6]);
|
|
61
|
+
tmp = AES_BLOCK_XOR(tmp, AES_BLOCK_XOR(state[5], state[4]));
|
|
62
|
+
AES_BLOCK_STORE(mac + 16, tmp);
|
|
63
|
+
} else {
|
|
64
|
+
memset(mac, 0, maclen);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
static inline void
|
|
69
|
+
aegis128l_absorb(const uint8_t *const src, aes_block_t *const state)
|
|
70
|
+
{
|
|
71
|
+
aes_block_t msg0, msg1;
|
|
72
|
+
|
|
73
|
+
msg0 = AES_BLOCK_LOAD(src);
|
|
74
|
+
msg1 = AES_BLOCK_LOAD(src + AES_BLOCK_LENGTH);
|
|
75
|
+
aegis128l_update(state, msg0, msg1);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
static inline void
|
|
79
|
+
aegis128l_absorb_rate(const uint8_t *const src, aes_block_t *const state)
|
|
80
|
+
{
|
|
81
|
+
aes_block_t msg0, msg1;
|
|
82
|
+
|
|
83
|
+
msg0 = AES_BLOCK_LOAD(src);
|
|
84
|
+
msg1 = AES_BLOCK_LOAD(src + AES_BLOCK_LENGTH);
|
|
85
|
+
aegis128l_update(state, msg0, msg1);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
static inline void
|
|
89
|
+
aegis128l_squeeze_keystream(uint8_t *const dst, aes_block_t *const state)
|
|
90
|
+
{
|
|
91
|
+
aes_block_t tmp0, tmp1;
|
|
92
|
+
|
|
93
|
+
tmp0 = AES_BLOCK_XOR(state[6], state[1]);
|
|
94
|
+
tmp0 = AES_BLOCK_XOR(tmp0, AES_BLOCK_AND(state[2], state[3]));
|
|
95
|
+
tmp1 = AES_BLOCK_XOR(state[5], state[2]);
|
|
96
|
+
tmp1 = AES_BLOCK_XOR(tmp1, AES_BLOCK_AND(state[6], state[7]));
|
|
97
|
+
AES_BLOCK_STORE(dst, tmp0);
|
|
98
|
+
AES_BLOCK_STORE(dst + AES_BLOCK_LENGTH, tmp1);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
static inline void
|
|
102
|
+
aegis128l_enc(uint8_t *const dst, const uint8_t *const src, aes_block_t *const state)
|
|
103
|
+
{
|
|
104
|
+
aes_block_t msg0, msg1;
|
|
105
|
+
aes_block_t tmp0, tmp1;
|
|
106
|
+
|
|
107
|
+
msg0 = AES_BLOCK_LOAD(src);
|
|
108
|
+
msg1 = AES_BLOCK_LOAD(src + AES_BLOCK_LENGTH);
|
|
109
|
+
tmp0 = AES_BLOCK_XOR(msg0, state[6]);
|
|
110
|
+
tmp0 = AES_BLOCK_XOR(tmp0, state[1]);
|
|
111
|
+
tmp1 = AES_BLOCK_XOR(msg1, state[5]);
|
|
112
|
+
tmp1 = AES_BLOCK_XOR(tmp1, state[2]);
|
|
113
|
+
tmp0 = AES_BLOCK_XOR(tmp0, AES_BLOCK_AND(state[2], state[3]));
|
|
114
|
+
tmp1 = AES_BLOCK_XOR(tmp1, AES_BLOCK_AND(state[6], state[7]));
|
|
115
|
+
AES_BLOCK_STORE(dst, tmp0);
|
|
116
|
+
AES_BLOCK_STORE(dst + AES_BLOCK_LENGTH, tmp1);
|
|
117
|
+
|
|
118
|
+
aegis128l_update(state, msg0, msg1);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
static inline void
|
|
122
|
+
aegis128l_dec(uint8_t *const dst, const uint8_t *const src, aes_block_t *const state)
|
|
123
|
+
{
|
|
124
|
+
aes_block_t msg0, msg1;
|
|
125
|
+
|
|
126
|
+
msg0 = AES_BLOCK_LOAD(src);
|
|
127
|
+
msg1 = AES_BLOCK_LOAD(src + AES_BLOCK_LENGTH);
|
|
128
|
+
msg0 = AES_BLOCK_XOR(msg0, state[6]);
|
|
129
|
+
msg0 = AES_BLOCK_XOR(msg0, state[1]);
|
|
130
|
+
msg1 = AES_BLOCK_XOR(msg1, state[5]);
|
|
131
|
+
msg1 = AES_BLOCK_XOR(msg1, state[2]);
|
|
132
|
+
msg0 = AES_BLOCK_XOR(msg0, AES_BLOCK_AND(state[2], state[3]));
|
|
133
|
+
msg1 = AES_BLOCK_XOR(msg1, AES_BLOCK_AND(state[6], state[7]));
|
|
134
|
+
AES_BLOCK_STORE(dst, msg0);
|
|
135
|
+
AES_BLOCK_STORE(dst + AES_BLOCK_LENGTH, msg1);
|
|
136
|
+
|
|
137
|
+
aegis128l_update(state, msg0, msg1);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
static inline void
|
|
141
|
+
aegis128l_declast(uint8_t *const dst, const uint8_t *const src, size_t len,
|
|
142
|
+
aes_block_t *const state)
|
|
143
|
+
{
|
|
144
|
+
uint8_t pad[RATE];
|
|
145
|
+
aes_block_t msg0, msg1;
|
|
146
|
+
|
|
147
|
+
memset(pad, 0, sizeof pad);
|
|
148
|
+
memcpy(pad, src, len);
|
|
149
|
+
|
|
150
|
+
msg0 = AES_BLOCK_LOAD(pad);
|
|
151
|
+
msg1 = AES_BLOCK_LOAD(pad + AES_BLOCK_LENGTH);
|
|
152
|
+
msg0 = AES_BLOCK_XOR(msg0, state[6]);
|
|
153
|
+
msg0 = AES_BLOCK_XOR(msg0, state[1]);
|
|
154
|
+
msg1 = AES_BLOCK_XOR(msg1, state[5]);
|
|
155
|
+
msg1 = AES_BLOCK_XOR(msg1, state[2]);
|
|
156
|
+
msg0 = AES_BLOCK_XOR(msg0, AES_BLOCK_AND(state[2], state[3]));
|
|
157
|
+
msg1 = AES_BLOCK_XOR(msg1, AES_BLOCK_AND(state[6], state[7]));
|
|
158
|
+
AES_BLOCK_STORE(pad, msg0);
|
|
159
|
+
AES_BLOCK_STORE(pad + AES_BLOCK_LENGTH, msg1);
|
|
160
|
+
|
|
161
|
+
memset(pad + len, 0, sizeof pad - len);
|
|
162
|
+
memcpy(dst, pad, len);
|
|
163
|
+
|
|
164
|
+
msg0 = AES_BLOCK_LOAD(pad);
|
|
165
|
+
msg1 = AES_BLOCK_LOAD(pad + AES_BLOCK_LENGTH);
|
|
166
|
+
|
|
167
|
+
aegis128l_update(state, msg0, msg1);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
static int
|
|
171
|
+
encrypt_detached(uint8_t *c, uint8_t *mac, size_t maclen, const uint8_t *m, size_t mlen,
|
|
172
|
+
const uint8_t *ad, size_t adlen, const uint8_t *npub, const uint8_t *k)
|
|
173
|
+
{
|
|
174
|
+
aegis_blocks state;
|
|
175
|
+
CRYPTO_ALIGN(ALIGNMENT) uint8_t src[RATE];
|
|
176
|
+
CRYPTO_ALIGN(ALIGNMENT) uint8_t dst[RATE];
|
|
177
|
+
size_t i;
|
|
178
|
+
|
|
179
|
+
aegis128l_init(k, npub, state);
|
|
180
|
+
|
|
181
|
+
for (i = 0; i + RATE <= adlen; i += RATE) {
|
|
182
|
+
aegis128l_absorb(ad + i, state);
|
|
183
|
+
}
|
|
184
|
+
if (adlen % RATE) {
|
|
185
|
+
memset(src, 0, RATE);
|
|
186
|
+
memcpy(src, ad + i, adlen % RATE);
|
|
187
|
+
aegis128l_absorb(src, state);
|
|
188
|
+
}
|
|
189
|
+
for (i = 0; i + RATE <= mlen; i += RATE) {
|
|
190
|
+
aegis128l_enc(c + i, m + i, state);
|
|
191
|
+
}
|
|
192
|
+
if (mlen % RATE) {
|
|
193
|
+
memset(src, 0, RATE);
|
|
194
|
+
memcpy(src, m + i, mlen % RATE);
|
|
195
|
+
aegis128l_enc(dst, src, state);
|
|
196
|
+
memcpy(c + i, dst, mlen % RATE);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
aegis128l_mac(mac, maclen, adlen, mlen, state);
|
|
200
|
+
|
|
201
|
+
return 0;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
static int
|
|
205
|
+
decrypt_detached(uint8_t *m, const uint8_t *c, size_t clen, const uint8_t *mac, size_t maclen,
|
|
206
|
+
const uint8_t *ad, size_t adlen, const uint8_t *npub, const uint8_t *k)
|
|
207
|
+
{
|
|
208
|
+
aegis_blocks state;
|
|
209
|
+
CRYPTO_ALIGN(ALIGNMENT) uint8_t src[RATE];
|
|
210
|
+
CRYPTO_ALIGN(ALIGNMENT) uint8_t dst[RATE];
|
|
211
|
+
CRYPTO_ALIGN(16) uint8_t computed_mac[32];
|
|
212
|
+
const size_t mlen = clen;
|
|
213
|
+
size_t i;
|
|
214
|
+
int ret;
|
|
215
|
+
|
|
216
|
+
aegis128l_init(k, npub, state);
|
|
217
|
+
|
|
218
|
+
for (i = 0; i + RATE <= adlen; i += RATE) {
|
|
219
|
+
aegis128l_absorb(ad + i, state);
|
|
220
|
+
}
|
|
221
|
+
if (adlen % RATE) {
|
|
222
|
+
memset(src, 0, RATE);
|
|
223
|
+
memcpy(src, ad + i, adlen % RATE);
|
|
224
|
+
aegis128l_absorb(src, state);
|
|
225
|
+
}
|
|
226
|
+
if (m != NULL) {
|
|
227
|
+
for (i = 0; i + RATE <= mlen; i += RATE) {
|
|
228
|
+
aegis128l_dec(m + i, c + i, state);
|
|
229
|
+
}
|
|
230
|
+
} else {
|
|
231
|
+
for (i = 0; i + RATE <= mlen; i += RATE) {
|
|
232
|
+
aegis128l_dec(dst, c + i, state);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
if (mlen % RATE) {
|
|
236
|
+
if (m != NULL) {
|
|
237
|
+
aegis128l_declast(m + i, c + i, mlen % RATE, state);
|
|
238
|
+
} else {
|
|
239
|
+
aegis128l_declast(dst, c + i, mlen % RATE, state);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
COMPILER_ASSERT(sizeof computed_mac >= 32);
|
|
244
|
+
aegis128l_mac(computed_mac, maclen, adlen, mlen, state);
|
|
245
|
+
ret = -1;
|
|
246
|
+
if (maclen == 16) {
|
|
247
|
+
ret = aegis_verify_16(computed_mac, mac);
|
|
248
|
+
} else if (maclen == 32) {
|
|
249
|
+
ret = aegis_verify_32(computed_mac, mac);
|
|
250
|
+
}
|
|
251
|
+
if (ret != 0 && m != NULL) {
|
|
252
|
+
memset(m, 0, mlen);
|
|
253
|
+
}
|
|
254
|
+
return ret;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
static void
|
|
258
|
+
stream(uint8_t *out, size_t len, const uint8_t *npub, const uint8_t *k)
|
|
259
|
+
{
|
|
260
|
+
aegis_blocks state;
|
|
261
|
+
CRYPTO_ALIGN(ALIGNMENT) uint8_t src[RATE];
|
|
262
|
+
CRYPTO_ALIGN(ALIGNMENT) uint8_t dst[RATE];
|
|
263
|
+
size_t i;
|
|
264
|
+
|
|
265
|
+
memset(src, 0, sizeof src);
|
|
266
|
+
if (npub == NULL) {
|
|
267
|
+
npub = src;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
aegis128l_init(k, npub, state);
|
|
271
|
+
|
|
272
|
+
for (i = 0; i + RATE <= len; i += RATE) {
|
|
273
|
+
aegis128l_enc(out + i, src, state);
|
|
274
|
+
}
|
|
275
|
+
if (len % RATE) {
|
|
276
|
+
aegis128l_enc(dst, src, state);
|
|
277
|
+
memcpy(out + i, dst, len % RATE);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
static void
|
|
282
|
+
encrypt_unauthenticated(uint8_t *c, const uint8_t *m, size_t mlen, const uint8_t *npub,
|
|
283
|
+
const uint8_t *k)
|
|
284
|
+
{
|
|
285
|
+
aegis_blocks state;
|
|
286
|
+
CRYPTO_ALIGN(ALIGNMENT) uint8_t src[RATE];
|
|
287
|
+
CRYPTO_ALIGN(ALIGNMENT) uint8_t dst[RATE];
|
|
288
|
+
size_t i;
|
|
289
|
+
|
|
290
|
+
aegis128l_init(k, npub, state);
|
|
291
|
+
|
|
292
|
+
for (i = 0; i + RATE <= mlen; i += RATE) {
|
|
293
|
+
aegis128l_enc(c + i, m + i, state);
|
|
294
|
+
}
|
|
295
|
+
if (mlen % RATE) {
|
|
296
|
+
memset(src, 0, RATE);
|
|
297
|
+
memcpy(src, m + i, mlen % RATE);
|
|
298
|
+
aegis128l_enc(dst, src, state);
|
|
299
|
+
memcpy(c + i, dst, mlen % RATE);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
static void
|
|
304
|
+
decrypt_unauthenticated(uint8_t *m, const uint8_t *c, size_t clen, const uint8_t *npub,
|
|
305
|
+
const uint8_t *k)
|
|
306
|
+
{
|
|
307
|
+
aegis_blocks state;
|
|
308
|
+
const size_t mlen = clen;
|
|
309
|
+
size_t i;
|
|
310
|
+
|
|
311
|
+
aegis128l_init(k, npub, state);
|
|
312
|
+
|
|
313
|
+
for (i = 0; i + RATE <= mlen; i += RATE) {
|
|
314
|
+
aegis128l_dec(m + i, c + i, state);
|
|
315
|
+
}
|
|
316
|
+
if (mlen % RATE) {
|
|
317
|
+
aegis128l_declast(m + i, c + i, mlen % RATE, state);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
typedef struct _aegis128l_state {
|
|
322
|
+
aegis_blocks blocks;
|
|
323
|
+
uint8_t buf[RATE];
|
|
324
|
+
uint64_t adlen;
|
|
325
|
+
uint64_t mlen;
|
|
326
|
+
size_t pos;
|
|
327
|
+
} _aegis128l_state;
|
|
328
|
+
|
|
329
|
+
typedef struct _aegis128l_mac_state {
|
|
330
|
+
aegis_blocks blocks;
|
|
331
|
+
aegis_blocks blocks0;
|
|
332
|
+
uint8_t buf[RATE];
|
|
333
|
+
uint64_t adlen;
|
|
334
|
+
size_t pos;
|
|
335
|
+
} _aegis128l_mac_state;
|
|
336
|
+
|
|
337
|
+
static void
|
|
338
|
+
state_init(aegis128l_state *st_, const uint8_t *ad, size_t adlen, const uint8_t *npub,
|
|
339
|
+
const uint8_t *k)
|
|
340
|
+
{
|
|
341
|
+
aegis_blocks blocks;
|
|
342
|
+
_aegis128l_state *const st =
|
|
343
|
+
(_aegis128l_state *) ((((uintptr_t) &st_->opaque) + (ALIGNMENT - 1)) &
|
|
344
|
+
~(uintptr_t) (ALIGNMENT - 1));
|
|
345
|
+
size_t i;
|
|
346
|
+
|
|
347
|
+
COMPILER_ASSERT((sizeof *st) + ALIGNMENT <= sizeof *st_);
|
|
348
|
+
st->mlen = 0;
|
|
349
|
+
st->pos = 0;
|
|
350
|
+
|
|
351
|
+
aegis128l_init(k, npub, blocks);
|
|
352
|
+
for (i = 0; i + RATE <= adlen; i += RATE) {
|
|
353
|
+
aegis128l_absorb(ad + i, blocks);
|
|
354
|
+
}
|
|
355
|
+
if (adlen % RATE) {
|
|
356
|
+
memset(st->buf, 0, RATE);
|
|
357
|
+
memcpy(st->buf, ad + i, adlen % RATE);
|
|
358
|
+
aegis128l_absorb(st->buf, blocks);
|
|
359
|
+
}
|
|
360
|
+
st->adlen = adlen;
|
|
361
|
+
|
|
362
|
+
memcpy(st->blocks, blocks, sizeof blocks);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
static int
|
|
366
|
+
state_encrypt_update(aegis128l_state *st_, uint8_t *c, const uint8_t *m, size_t mlen)
|
|
367
|
+
{
|
|
368
|
+
aegis_blocks blocks;
|
|
369
|
+
_aegis128l_state *const st =
|
|
370
|
+
(_aegis128l_state *) ((((uintptr_t) &st_->opaque) + (ALIGNMENT - 1)) &
|
|
371
|
+
~(uintptr_t) (ALIGNMENT - 1));
|
|
372
|
+
size_t i = 0;
|
|
373
|
+
size_t left;
|
|
374
|
+
|
|
375
|
+
memcpy(blocks, st->blocks, sizeof blocks);
|
|
376
|
+
|
|
377
|
+
st->mlen += mlen;
|
|
378
|
+
|
|
379
|
+
// Handle leftover keystream from previous call
|
|
380
|
+
if (st->pos != 0) {
|
|
381
|
+
const size_t available = RATE - st->pos;
|
|
382
|
+
const size_t n = mlen < available ? mlen : available;
|
|
383
|
+
size_t j;
|
|
384
|
+
uint8_t tmp;
|
|
385
|
+
|
|
386
|
+
for (j = 0; j < n; j++) {
|
|
387
|
+
tmp = m[j];
|
|
388
|
+
c[j] = m[j] ^ st->buf[st->pos + j];
|
|
389
|
+
st->buf[st->pos + j] = tmp;
|
|
390
|
+
}
|
|
391
|
+
st->pos += n;
|
|
392
|
+
m += n;
|
|
393
|
+
c += n;
|
|
394
|
+
mlen -= n;
|
|
395
|
+
|
|
396
|
+
if (st->pos < RATE) {
|
|
397
|
+
// Still consuming keystream from previous call
|
|
398
|
+
memcpy(st->blocks, blocks, sizeof blocks);
|
|
399
|
+
return 0;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// Full block accumulated, update state
|
|
403
|
+
aegis128l_absorb_rate(st->buf, blocks);
|
|
404
|
+
st->pos = 0;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
for (i = 0; i + RATE <= mlen; i += RATE) {
|
|
408
|
+
aegis128l_enc(c + i, m + i, blocks);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
left = mlen - i;
|
|
412
|
+
if (left != 0) {
|
|
413
|
+
size_t j;
|
|
414
|
+
uint8_t tmp;
|
|
415
|
+
|
|
416
|
+
// Generate keystream without updating state
|
|
417
|
+
aegis128l_squeeze_keystream(st->buf, blocks);
|
|
418
|
+
|
|
419
|
+
for (j = 0; j < left; j++) {
|
|
420
|
+
tmp = m[i + j];
|
|
421
|
+
c[i + j] = m[i + j] ^ st->buf[j];
|
|
422
|
+
st->buf[j] = tmp;
|
|
423
|
+
}
|
|
424
|
+
st->pos = left;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
memcpy(st->blocks, blocks, sizeof blocks);
|
|
428
|
+
|
|
429
|
+
return 0;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
static int
|
|
433
|
+
state_encrypt_final(aegis128l_state *st_, uint8_t *mac, size_t maclen)
|
|
434
|
+
{
|
|
435
|
+
aegis_blocks blocks;
|
|
436
|
+
_aegis128l_state *const st =
|
|
437
|
+
(_aegis128l_state *) ((((uintptr_t) &st_->opaque) + (ALIGNMENT - 1)) &
|
|
438
|
+
~(uintptr_t) (ALIGNMENT - 1));
|
|
439
|
+
|
|
440
|
+
memcpy(blocks, st->blocks, sizeof blocks);
|
|
441
|
+
|
|
442
|
+
// Ciphertext was already output during _update; absorb cached plaintext into state
|
|
443
|
+
if (st->pos != 0) {
|
|
444
|
+
CRYPTO_ALIGN(ALIGNMENT) uint8_t tmp[RATE];
|
|
445
|
+
memset(tmp, 0, sizeof tmp);
|
|
446
|
+
memcpy(tmp, st->buf, st->pos);
|
|
447
|
+
aegis128l_absorb_rate(tmp, blocks);
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
aegis128l_mac(mac, maclen, st->adlen, st->mlen, blocks);
|
|
451
|
+
|
|
452
|
+
memcpy(st->blocks, blocks, sizeof blocks);
|
|
453
|
+
|
|
454
|
+
return 0;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
static int
|
|
458
|
+
state_decrypt_update(aegis128l_state *st_, uint8_t *m, const uint8_t *c, size_t clen)
|
|
459
|
+
{
|
|
460
|
+
aegis_blocks blocks;
|
|
461
|
+
_aegis128l_state *const st =
|
|
462
|
+
(_aegis128l_state *) ((((uintptr_t) &st_->opaque) + (ALIGNMENT - 1)) &
|
|
463
|
+
~(uintptr_t) (ALIGNMENT - 1));
|
|
464
|
+
size_t i = 0;
|
|
465
|
+
size_t left;
|
|
466
|
+
|
|
467
|
+
memcpy(blocks, st->blocks, sizeof blocks);
|
|
468
|
+
|
|
469
|
+
st->mlen += clen;
|
|
470
|
+
|
|
471
|
+
// Handle leftover keystream from previous call
|
|
472
|
+
if (st->pos != 0) {
|
|
473
|
+
const size_t available = RATE - st->pos;
|
|
474
|
+
const size_t n = clen < available ? clen : available;
|
|
475
|
+
size_t j;
|
|
476
|
+
|
|
477
|
+
for (j = 0; j < n; j++) {
|
|
478
|
+
if (m != NULL) {
|
|
479
|
+
m[j] = c[j] ^ st->buf[st->pos + j];
|
|
480
|
+
st->buf[st->pos + j] = m[j];
|
|
481
|
+
} else {
|
|
482
|
+
uint8_t plaintext = c[j] ^ st->buf[st->pos + j];
|
|
483
|
+
st->buf[st->pos + j] = plaintext;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
st->pos += n;
|
|
487
|
+
if (m != NULL) {
|
|
488
|
+
m += n;
|
|
489
|
+
}
|
|
490
|
+
c += n;
|
|
491
|
+
clen -= n;
|
|
492
|
+
|
|
493
|
+
if (st->pos < RATE) {
|
|
494
|
+
// Still consuming keystream
|
|
495
|
+
memcpy(st->blocks, blocks, sizeof blocks);
|
|
496
|
+
return 0;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
// Full block accumulated, update state
|
|
500
|
+
aegis128l_absorb_rate(st->buf, blocks);
|
|
501
|
+
st->pos = 0;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
if (m != NULL) {
|
|
505
|
+
for (i = 0; i + RATE <= clen; i += RATE) {
|
|
506
|
+
aegis128l_dec(m + i, c + i, blocks);
|
|
507
|
+
}
|
|
508
|
+
} else {
|
|
509
|
+
CRYPTO_ALIGN(ALIGNMENT) uint8_t dst[RATE];
|
|
510
|
+
for (i = 0; i + RATE <= clen; i += RATE) {
|
|
511
|
+
aegis128l_dec(dst, c + i, blocks);
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
left = clen - i;
|
|
516
|
+
if (left != 0) {
|
|
517
|
+
size_t j;
|
|
518
|
+
|
|
519
|
+
// Generate keystream without updating state
|
|
520
|
+
aegis128l_squeeze_keystream(st->buf, blocks);
|
|
521
|
+
|
|
522
|
+
for (j = 0; j < left; j++) {
|
|
523
|
+
if (m != NULL) {
|
|
524
|
+
m[i + j] = c[i + j] ^ st->buf[j];
|
|
525
|
+
st->buf[j] = m[i + j];
|
|
526
|
+
} else {
|
|
527
|
+
uint8_t plaintext = c[i + j] ^ st->buf[j];
|
|
528
|
+
st->buf[j] = plaintext;
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
st->pos = left;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
memcpy(st->blocks, blocks, sizeof blocks);
|
|
535
|
+
|
|
536
|
+
return 0;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
static int
|
|
540
|
+
state_decrypt_final(aegis128l_state *st_, const uint8_t *mac, size_t maclen)
|
|
541
|
+
{
|
|
542
|
+
aegis_blocks blocks;
|
|
543
|
+
CRYPTO_ALIGN(16) uint8_t computed_mac[32];
|
|
544
|
+
_aegis128l_state *const st =
|
|
545
|
+
(_aegis128l_state *) ((((uintptr_t) &st_->opaque) + (ALIGNMENT - 1)) &
|
|
546
|
+
~(uintptr_t) (ALIGNMENT - 1));
|
|
547
|
+
int ret;
|
|
548
|
+
|
|
549
|
+
memcpy(blocks, st->blocks, sizeof blocks);
|
|
550
|
+
|
|
551
|
+
// Plaintext was already output during _update; absorb cached plaintext into state
|
|
552
|
+
if (st->pos != 0) {
|
|
553
|
+
CRYPTO_ALIGN(ALIGNMENT) uint8_t tmp[RATE];
|
|
554
|
+
memset(tmp, 0, sizeof tmp);
|
|
555
|
+
memcpy(tmp, st->buf, st->pos);
|
|
556
|
+
aegis128l_absorb_rate(tmp, blocks);
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
aegis128l_mac(computed_mac, maclen, st->adlen, st->mlen, blocks);
|
|
560
|
+
ret = -1;
|
|
561
|
+
if (maclen == 16) {
|
|
562
|
+
ret = aegis_verify_16(computed_mac, mac);
|
|
563
|
+
} else if (maclen == 32) {
|
|
564
|
+
ret = aegis_verify_32(computed_mac, mac);
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
memcpy(st->blocks, blocks, sizeof blocks);
|
|
568
|
+
|
|
569
|
+
return ret;
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
static void
|
|
573
|
+
state_mac_init(aegis128l_mac_state *st_, const uint8_t *npub, const uint8_t *k)
|
|
574
|
+
{
|
|
575
|
+
aegis_blocks blocks;
|
|
576
|
+
CRYPTO_ALIGN(ALIGNMENT) uint8_t zero_nonce[16];
|
|
577
|
+
_aegis128l_mac_state *const st =
|
|
578
|
+
(_aegis128l_mac_state *) ((((uintptr_t) &st_->opaque) + (ALIGNMENT - 1)) &
|
|
579
|
+
~(uintptr_t) (ALIGNMENT - 1));
|
|
580
|
+
|
|
581
|
+
COMPILER_ASSERT((sizeof *st) + ALIGNMENT <= sizeof *st_);
|
|
582
|
+
st->pos = 0;
|
|
583
|
+
|
|
584
|
+
memcpy(blocks, st->blocks, sizeof blocks);
|
|
585
|
+
|
|
586
|
+
if (npub == NULL) {
|
|
587
|
+
memset(zero_nonce, 0, sizeof zero_nonce);
|
|
588
|
+
npub = zero_nonce;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
aegis128l_init(k, npub, blocks);
|
|
592
|
+
|
|
593
|
+
memcpy(st->blocks0, blocks, sizeof blocks);
|
|
594
|
+
memcpy(st->blocks, blocks, sizeof blocks);
|
|
595
|
+
st->adlen = 0;
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
static int
|
|
599
|
+
state_mac_update(aegis128l_mac_state *st_, const uint8_t *ad, size_t adlen)
|
|
600
|
+
{
|
|
601
|
+
aegis_blocks blocks;
|
|
602
|
+
_aegis128l_mac_state *const st =
|
|
603
|
+
(_aegis128l_mac_state *) ((((uintptr_t) &st_->opaque) + (ALIGNMENT - 1)) &
|
|
604
|
+
~(uintptr_t) (ALIGNMENT - 1));
|
|
605
|
+
size_t i;
|
|
606
|
+
size_t left;
|
|
607
|
+
|
|
608
|
+
memcpy(blocks, st->blocks, sizeof blocks);
|
|
609
|
+
|
|
610
|
+
left = st->adlen % RATE;
|
|
611
|
+
st->adlen += adlen;
|
|
612
|
+
if (left != 0) {
|
|
613
|
+
if (left + adlen < RATE) {
|
|
614
|
+
memcpy(st->buf + left, ad, adlen);
|
|
615
|
+
return 0;
|
|
616
|
+
}
|
|
617
|
+
memcpy(st->buf + left, ad, RATE - left);
|
|
618
|
+
aegis128l_absorb(st->buf, blocks);
|
|
619
|
+
ad += RATE - left;
|
|
620
|
+
adlen -= RATE - left;
|
|
621
|
+
}
|
|
622
|
+
for (i = 0; i + RATE * 2 <= adlen; i += RATE * 2) {
|
|
623
|
+
aes_block_t msg0, msg1, msg2, msg3;
|
|
624
|
+
|
|
625
|
+
msg0 = AES_BLOCK_LOAD(ad + i + AES_BLOCK_LENGTH * 0);
|
|
626
|
+
msg1 = AES_BLOCK_LOAD(ad + i + AES_BLOCK_LENGTH * 1);
|
|
627
|
+
msg2 = AES_BLOCK_LOAD(ad + i + AES_BLOCK_LENGTH * 2);
|
|
628
|
+
msg3 = AES_BLOCK_LOAD(ad + i + AES_BLOCK_LENGTH * 3);
|
|
629
|
+
COMPILER_ASSERT(AES_BLOCK_LENGTH * 4 == RATE * 2);
|
|
630
|
+
|
|
631
|
+
aegis128l_update(blocks, msg0, msg1);
|
|
632
|
+
aegis128l_update(blocks, msg2, msg3);
|
|
633
|
+
}
|
|
634
|
+
for (; i + RATE <= adlen; i += RATE) {
|
|
635
|
+
aegis128l_absorb(ad + i, blocks);
|
|
636
|
+
}
|
|
637
|
+
if (i < adlen) {
|
|
638
|
+
memset(st->buf, 0, RATE);
|
|
639
|
+
memcpy(st->buf, ad + i, adlen - i);
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
memcpy(st->blocks, blocks, sizeof blocks);
|
|
643
|
+
|
|
644
|
+
return 0;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
static int
|
|
648
|
+
state_mac_final(aegis128l_mac_state *st_, uint8_t *mac, size_t maclen)
|
|
649
|
+
{
|
|
650
|
+
aegis_blocks blocks;
|
|
651
|
+
_aegis128l_mac_state *const st =
|
|
652
|
+
(_aegis128l_mac_state *) ((((uintptr_t) &st_->opaque) + (ALIGNMENT - 1)) &
|
|
653
|
+
~(uintptr_t) (ALIGNMENT - 1));
|
|
654
|
+
size_t left;
|
|
655
|
+
|
|
656
|
+
memcpy(blocks, st->blocks, sizeof blocks);
|
|
657
|
+
|
|
658
|
+
left = st->adlen % RATE;
|
|
659
|
+
if (left != 0) {
|
|
660
|
+
memset(st->buf + left, 0, RATE - left);
|
|
661
|
+
aegis128l_absorb(st->buf, blocks);
|
|
662
|
+
}
|
|
663
|
+
aegis128l_mac(mac, maclen, st->adlen, maclen, blocks);
|
|
664
|
+
|
|
665
|
+
memcpy(st->blocks, blocks, sizeof blocks);
|
|
666
|
+
|
|
667
|
+
return 0;
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
static void
|
|
671
|
+
state_mac_reset(aegis128l_mac_state *st_)
|
|
672
|
+
{
|
|
673
|
+
_aegis128l_mac_state *const st =
|
|
674
|
+
(_aegis128l_mac_state *) ((((uintptr_t) &st_->opaque) + (ALIGNMENT - 1)) &
|
|
675
|
+
~(uintptr_t) (ALIGNMENT - 1));
|
|
676
|
+
st->adlen = 0;
|
|
677
|
+
st->pos = 0;
|
|
678
|
+
memcpy(st->blocks, st->blocks0, sizeof(aegis_blocks));
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
static void
|
|
682
|
+
state_mac_clone(aegis128l_mac_state *dst, const aegis128l_mac_state *src)
|
|
683
|
+
{
|
|
684
|
+
_aegis128l_mac_state *const dst_ =
|
|
685
|
+
(_aegis128l_mac_state *) ((((uintptr_t) &dst->opaque) + (ALIGNMENT - 1)) &
|
|
686
|
+
~(uintptr_t) (ALIGNMENT - 1));
|
|
687
|
+
const _aegis128l_mac_state *const src_ =
|
|
688
|
+
(const _aegis128l_mac_state *) ((((uintptr_t) &src->opaque) + (ALIGNMENT - 1)) &
|
|
689
|
+
~(uintptr_t) (ALIGNMENT - 1));
|
|
690
|
+
*dst_ = *src_;
|
|
691
|
+
}
|