Skip to content

Commit 87f4636

Browse files
committed
AEGIS: improve performance of AD absorption on x86_64
No apparent regression on other platforms. Adapted from libaegis.
1 parent 93a1ec7 commit 87f4636

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

src/libsodium/crypto_aead/aegis128l/aegis128l_common.h

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,19 @@ aegis128l_absorb(const uint8_t *const src, aes_block_t *const state)
7272
aegis128l_update(state, msg0, msg1);
7373
}
7474

75+
static inline void
76+
aegis128l_absorb2(const uint8_t *const src, aes_block_t *const state)
77+
{
78+
aes_block_t msg0, msg1, msg2, msg3;
79+
80+
msg0 = AES_BLOCK_LOAD(src + 0 * AES_BLOCK_LENGTH);
81+
msg1 = AES_BLOCK_LOAD(src + 1 * AES_BLOCK_LENGTH);
82+
msg2 = AES_BLOCK_LOAD(src + 2 * AES_BLOCK_LENGTH);
83+
msg3 = AES_BLOCK_LOAD(src + 3 * AES_BLOCK_LENGTH);
84+
aegis128l_update(state, msg0, msg1);
85+
aegis128l_update(state, msg2, msg3);
86+
}
87+
7588
static void
7689
aegis128l_enc(uint8_t *const dst, const uint8_t *const src, aes_block_t *const state)
7790
{
@@ -152,7 +165,10 @@ encrypt_detached(uint8_t *c, uint8_t *mac, size_t maclen, const uint8_t *m, size
152165

153166
aegis128l_init(k, npub, state);
154167

155-
for (i = 0; i + RATE <= adlen; i += RATE) {
168+
for (i = 0; i + RATE * 2 <= adlen; i += RATE * 2) {
169+
aegis128l_absorb2(ad + i, state);
170+
}
171+
for (; i + RATE <= adlen; i += RATE) {
156172
aegis128l_absorb(ad + i, state);
157173
}
158174
if (adlen % RATE) {
@@ -189,7 +205,10 @@ decrypt_detached(uint8_t *m, const uint8_t *c, size_t clen, const uint8_t *mac,
189205

190206
aegis128l_init(k, npub, state);
191207

192-
for (i = 0; i + RATE <= adlen; i += RATE) {
208+
for (i = 0; i + RATE * 2 <= adlen; i += RATE * 2) {
209+
aegis128l_absorb2(ad + i, state);
210+
}
211+
for (; i + RATE <= adlen; i += RATE) {
193212
aegis128l_absorb(ad + i, state);
194213
}
195214
if (adlen % RATE) {

src/libsodium/crypto_aead/aegis256/aegis256_common.h

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,17 @@ aegis256_absorb(const uint8_t *const src, aes_block_t *const state)
7171
aegis256_update(state, msg);
7272
}
7373

74+
static inline void
75+
aegis256_absorb2(const uint8_t *const src, aes_block_t *const state)
76+
{
77+
aes_block_t msg, msg2;
78+
79+
msg = AES_BLOCK_LOAD(src + 0 * AES_BLOCK_LENGTH);
80+
msg2 = AES_BLOCK_LOAD(src + 1 * AES_BLOCK_LENGTH);
81+
aegis256_update(state, msg);
82+
aegis256_update(state, msg2);
83+
}
84+
7485
static void
7586
aegis256_enc(uint8_t *const dst, const uint8_t *const src, aes_block_t *const state)
7687
{
@@ -137,7 +148,10 @@ encrypt_detached(uint8_t *c, uint8_t *mac, size_t maclen, const uint8_t *m, size
137148

138149
aegis256_init(k, npub, state);
139150

140-
for (i = 0; i + RATE <= adlen; i += RATE) {
151+
for (i = 0; i + 2 * RATE <= adlen; i += 2 * RATE) {
152+
aegis256_absorb2(ad + i, state);
153+
}
154+
for (; i + RATE <= adlen; i += RATE) {
141155
aegis256_absorb(ad + i, state);
142156
}
143157
if (adlen % RATE) {
@@ -174,7 +188,10 @@ decrypt_detached(uint8_t *m, const uint8_t *c, size_t clen, const uint8_t *mac,
174188

175189
aegis256_init(k, npub, state);
176190

177-
for (i = 0; i + RATE <= adlen; i += RATE) {
191+
for (i = 0; i + 2 * RATE <= adlen; i += 2 * RATE) {
192+
aegis256_absorb2(ad + i, state);
193+
}
194+
for (; i + RATE <= adlen; i += RATE) {
178195
aegis256_absorb(ad + i, state);
179196
}
180197
if (adlen % RATE) {

0 commit comments

Comments
 (0)