Clean up the aes128ctr code

This commit is contained in:
Frank Denis
2017-02-23 10:30:44 +01:00
parent 2be6fc4800
commit a60ac31ba4
9 changed files with 223 additions and 261 deletions
-1
View File
@@ -169,7 +169,6 @@ libsodium_la_SOURCES += \
crypto_stream/aes128ctr/nacl/int128.h \
crypto_stream/aes128ctr/nacl/int128_aes128ctr.c \
crypto_stream/aes128ctr/nacl/stream_aes128ctr_nacl.c \
crypto_stream/aes128ctr/nacl/types.h \
crypto_stream/aes128ctr/nacl/xor_afternm_aes128ctr.c \
crypto_stream/aes128ctr/stream_aes128ctr.c \
crypto_stream/salsa2012/ref/stream_salsa2012_ref.c \
@@ -13,31 +13,29 @@ crypto_stream_aes128ctr_afternm(unsigned char *out, unsigned long long len,
const unsigned char *nonce,
const unsigned char *c)
{
aes_uint128_t xmm0;
aes_uint128_t xmm1;
aes_uint128_t xmm2;
aes_uint128_t xmm3;
aes_uint128_t xmm4;
aes_uint128_t xmm5;
aes_uint128_t xmm6;
aes_uint128_t xmm7;
aes_uint128_t xmm8;
aes_uint128_t xmm9;
aes_uint128_t xmm10;
aes_uint128_t xmm11;
aes_uint128_t xmm12;
aes_uint128_t xmm13;
aes_uint128_t xmm14;
aes_uint128_t xmm15;
aes_uint128_t xmm0;
aes_uint128_t xmm1;
aes_uint128_t xmm2;
aes_uint128_t xmm3;
aes_uint128_t xmm4;
aes_uint128_t xmm5;
aes_uint128_t xmm6;
aes_uint128_t xmm7;
aes_uint128_t xmm8;
aes_uint128_t xmm9;
aes_uint128_t xmm10;
aes_uint128_t xmm11;
aes_uint128_t xmm12;
aes_uint128_t xmm13;
aes_uint128_t xmm14;
aes_uint128_t xmm15;
aes_uint128_t nonce_stack;
unsigned long long lensav;
unsigned char bl[128];
unsigned char * blp;
unsigned char * np;
unsigned char b;
uint32_t tmp;
uint32_t tmp;
/* Copy nonce on the stack */
copy2(&nonce_stack, (const aes_uint128_t *) (nonce + 0));
@@ -72,43 +70,37 @@ enc_block:
shufb(&xmm6, M0SWAP);
shufb(&xmm7, M0SWAP);
bitslice(xmm7, xmm6, xmm5, xmm4, xmm3, xmm2, xmm1, xmm0, xmm8)
bitslice(xmm7, xmm6, xmm5, xmm4, xmm3, xmm2, xmm1, xmm0, xmm8);
aesround(1, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9,
xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,
c) aesround(2, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14,
xmm15, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6,
xmm7, c)
aesround(3, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8,
xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,
c) aesround(4, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13,
xmm14, xmm15, xmm0, xmm1, xmm2, xmm3, xmm4,
xmm5, xmm6, xmm7, c)
aesround(5, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,
xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,
c) aesround(6, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13,
xmm14, xmm15, xmm0, xmm1, xmm2, xmm3, xmm4,
xmm5, xmm6, xmm7, c)
aesround(7, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,
xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14,
xmm15, c)
aesround(8, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13,
xmm14, xmm15, xmm0, xmm1, xmm2, xmm3, xmm4,
xmm5, xmm6, xmm7, c)
aesround(9, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5,
xmm6, xmm7, xmm8, xmm9, xmm10, xmm11,
xmm12, xmm13, xmm14, xmm15, c)
lastround(xmm8, xmm9, xmm10, xmm11, xmm12,
xmm13, xmm14, xmm15, xmm0, xmm1, xmm2,
xmm3, xmm4, xmm5, xmm6, xmm7, c)
aesround(1, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9,
xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, c);
aesround(2, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xmm0,
xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, c);
aesround(3, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9,
xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, c);
aesround(4, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xmm0,
xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, c);
aesround(5, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9,
xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, c);
aesround(6, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xmm0,
xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, c);
aesround(7, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9,
xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, c);
aesround(8, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xmm0,
xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, c);
aesround(9, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9,
xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, c);
lastround(xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xmm0, xmm1,
xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, c);
bitslice(xmm13, xmm10, xmm15, xmm11, xmm14,
xmm12, xmm9, xmm8, xmm0)
bitslice(xmm13, xmm10, xmm15, xmm11, xmm14, xmm12, xmm9, xmm8, xmm0);
if (len < 128) goto partial;
if (len == 128)
if (len < 128) {
goto partial;
}
if (len == 128) {
goto full;
}
tmp = LOAD32_BE(np + 12);
tmp += 8;
STORE32_BE(np + 12, tmp);
@@ -136,7 +128,8 @@ partial:
tmp += len;
STORE32_BE(np + 12, tmp);
blp = bl;
blp = bl;
*(aes_uint128_t *) (blp + 0) = xmm8;
*(aes_uint128_t *) (blp + 16) = xmm9;
*(aes_uint128_t *) (blp + 32) = xmm12;
@@ -148,10 +141,11 @@ partial:
bytes:
if (lensav == 0)
if (lensav == 0) {
goto end;
}
b = blp[0]; /* clang false positive */
b = blp[0]; /* clang false positive */
*(unsigned char *) (out + 0) = b;
blp += 1;
@@ -29,45 +29,38 @@ crypto_stream_aes128ctr_beforenm(unsigned char *c, const unsigned char *k)
aes_uint128_t xmm15;
aes_uint128_t t;
bitslicekey0(k, c)
bitslicekey0(k, c);
keyexpbs1(xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9,
xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,
c) keyexpbs(xmm0, xmm1, xmm4, xmm6, xmm3, xmm7, xmm2, xmm5,
xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14,
xmm15, xor_rcon(&xmm1);
, 2, c)
keyexpbs(xmm0, xmm1, xmm3, xmm2, xmm6, xmm5, xmm4, xmm7, xmm8, xmm9,
xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xor_rcon(&xmm6);
, 3, c) keyexpbs(xmm0, xmm1, xmm6, xmm4, xmm2, xmm7, xmm3,
xmm5, xmm8, xmm9, xmm10, xmm11, xmm12,
xmm13, xmm14, xmm15, xor_rcon(&xmm3);
, 4, c)
keyexpbs1(xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9, xmm10,
xmm11, xmm12, xmm13, xmm14, xmm15, c);
keyexpbs(xmm0, xmm1, xmm4, xmm6, xmm3, xmm7, xmm2, xmm5, xmm8, xmm9, xmm10,
xmm11, xmm12, xmm13, xmm14, xmm15, xor_rcon(&xmm1);
, 2, c);
keyexpbs(xmm0, xmm1, xmm3, xmm2, xmm6, xmm5, xmm4, xmm7, xmm8, xmm9, xmm10,
xmm11, xmm12, xmm13, xmm14, xmm15, xor_rcon(&xmm6);
, 3, c);
keyexpbs(xmm0, xmm1, xmm6, xmm4, xmm2, xmm7, xmm3, xmm5, xmm8, xmm9, xmm10,
xmm11, xmm12, xmm13, xmm14, xmm15, xor_rcon(&xmm3);
, 4, c);
keyexpbs(
xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9,
xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xor_rcon(&xmm3);
, 5, c) keyexpbs(xmm0, xmm1, xmm4, xmm6, xmm3, xmm7, xmm2,
xmm5, xmm8, xmm9, xmm10, xmm11, xmm12,
xmm13, xmm14, xmm15, xor_rcon(&xmm5);
, 6, c)
keyexpbs(xmm0, xmm1, xmm3, xmm2, xmm6, xmm5, xmm4, xmm7,
xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14,
xmm15, xor_rcon(&xmm3);
, 7, c)
keyexpbs(xmm0, xmm1, xmm6, xmm4, xmm2, xmm7, xmm3, xmm5,
xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14,
xmm15, xor_rcon(&xmm7);
, 8, c)
keyexpbs(xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9, xmm10,
xmm11, xmm12, xmm13, xmm14, xmm15, xor_rcon(&xmm3);
, 5, c);
keyexpbs(xmm0, xmm1, xmm4, xmm6, xmm3, xmm7, xmm2, xmm5, xmm8, xmm9, xmm10,
xmm11, xmm12, xmm13, xmm14, xmm15, xor_rcon(&xmm5);
, 6, c);
keyexpbs(xmm0, xmm1, xmm3, xmm2, xmm6, xmm5, xmm4, xmm7, xmm8, xmm9, xmm10,
xmm11, xmm12, xmm13, xmm14, xmm15, xor_rcon(&xmm3);
, 7, c);
keyexpbs(xmm0, xmm1, xmm6, xmm4, xmm2, xmm7, xmm3, xmm5, xmm8, xmm9, xmm10,
xmm11, xmm12, xmm13, xmm14, xmm15, xor_rcon(&xmm7);
, 8, c);
keyexpbs(xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6,
xmm7, xmm8, xmm9, xmm10, xmm11, xmm12,
xmm13, xmm14, xmm15, xor_rcon(&xmm0);
xor_rcon(&xmm1); xor_rcon(&xmm6);
xor_rcon(&xmm3);, 9, c)
keyexpbs10(xmm0, xmm1, xmm4, xmm6, xmm3, xmm7,
xmm2, xmm5, xmm8, xmm9, xmm10, xmm11,
xmm12, xmm13, xmm14, xmm15, c)
keyexpbs(xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9, xmm10,
xmm11, xmm12, xmm13, xmm14, xmm15, xor_rcon(&xmm0);
xor_rcon(&xmm1); xor_rcon(&xmm6); xor_rcon(&xmm3);, 9, c);
keyexpbs10(xmm0, xmm1, xmm4, xmm6, xmm3, xmm7, xmm2, xmm5, xmm8, xmm9,
xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, c);
return 0;
return 0;
}
@@ -2,11 +2,10 @@
Käsper
Date: 2009-03-19
Public domain */
#ifndef COMMON_H
#define COMMON_H
#ifndef aes128ctr_nacl_common_H
#define aes128ctr_nacl_common_H
#include "private/common.h"
#include "types.h"
/* Macros required only for key expansion */
@@ -20,9 +19,9 @@
rotbyte(&b5); \
rotbyte(&b6); \
rotbyte(&b7); \
; \
\
sbox(b0, b1, b2, b3, b4, b5, b6, b7, t0, t1, t2, t3, t4, t5, t6, t7); \
; \
\
xor_rcon(&b0); \
shufb(&b0, EXPB0); \
shufb(&b1, EXPB0); \
@@ -33,7 +32,7 @@
shufb(&b2, EXPB0); \
shufb(&b5, EXPB0); \
shufb(&b0, EXPB0); \
; \
\
t0 = *(aes_uint128_t *) (bskey + 0); \
t1 = *(aes_uint128_t *) (bskey + 16); \
t2 = *(aes_uint128_t *) (bskey + 32); \
@@ -42,7 +41,7 @@
t5 = *(aes_uint128_t *) (bskey + 80); \
t6 = *(aes_uint128_t *) (bskey + 96); \
t7 = *(aes_uint128_t *) (bskey + 112); \
; \
\
xor2(&b0, &t0); \
xor2(&b1, &t1); \
xor2(&b4, &t2); \
@@ -51,7 +50,7 @@
xor2(&b7, &t5); \
xor2(&b2, &t6); \
xor2(&b5, &t7); \
; \
\
rshift32_littleendian(&t0, 8); \
rshift32_littleendian(&t1, 8); \
rshift32_littleendian(&t2, 8); \
@@ -60,7 +59,7 @@
rshift32_littleendian(&t5, 8); \
rshift32_littleendian(&t6, 8); \
rshift32_littleendian(&t7, 8); \
; \
\
xor2(&b0, &t0); \
xor2(&b1, &t1); \
xor2(&b4, &t2); \
@@ -69,7 +68,7 @@
xor2(&b7, &t5); \
xor2(&b2, &t6); \
xor2(&b5, &t7); \
; \
\
rshift32_littleendian(&t0, 8); \
rshift32_littleendian(&t1, 8); \
rshift32_littleendian(&t2, 8); \
@@ -78,7 +77,7 @@
rshift32_littleendian(&t5, 8); \
rshift32_littleendian(&t6, 8); \
rshift32_littleendian(&t7, 8); \
; \
\
xor2(&b0, &t0); \
xor2(&b1, &t1); \
xor2(&b4, &t2); \
@@ -87,7 +86,7 @@
xor2(&b7, &t5); \
xor2(&b2, &t6); \
xor2(&b5, &t7); \
; \
\
rshift32_littleendian(&t0, 8); \
rshift32_littleendian(&t1, 8); \
rshift32_littleendian(&t2, 8); \
@@ -96,7 +95,7 @@
rshift32_littleendian(&t5, 8); \
rshift32_littleendian(&t6, 8); \
rshift32_littleendian(&t7, 8); \
; \
\
xor2(&b0, &t0); \
xor2(&b1, &t1); \
xor2(&b4, &t2); \
@@ -105,7 +104,7 @@
xor2(&b7, &t5); \
xor2(&b2, &t6); \
xor2(&b5, &t7); \
; \
\
*(aes_uint128_t *) (bskey + 128) = b0; \
*(aes_uint128_t *) (bskey + 144) = b1; \
*(aes_uint128_t *) (bskey + 160) = b4; \
@@ -113,11 +112,10 @@
*(aes_uint128_t *) (bskey + 192) = b3; \
*(aes_uint128_t *) (bskey + 208) = b7; \
*(aes_uint128_t *) (bskey + 224) = b2; \
*(aes_uint128_t *) (bskey + 240) = b5;
*(aes_uint128_t *) (bskey + 240) = b5
#define keyexpbs10(b0, b1, b2, b3, b4, b5, b6, b7, t0, t1, t2, t3, t4, t5, t6, \
t7, bskey) \
; \
toggle(&b0); \
toggle(&b1); \
toggle(&b5); \
@@ -130,9 +128,9 @@
rotbyte(&b5); \
rotbyte(&b6); \
rotbyte(&b7); \
; \
\
sbox(b0, b1, b2, b3, b4, b5, b6, b7, t0, t1, t2, t3, t4, t5, t6, t7); \
; \
\
xor_rcon(&b1); \
xor_rcon(&b4); \
xor_rcon(&b3); \
@@ -145,7 +143,7 @@
shufb(&b7, EXPB0); \
shufb(&b2, EXPB0); \
shufb(&b5, EXPB0); \
; \
\
t0 = *(aes_uint128_t *) (bskey + 9 * 128 + 0); \
t1 = *(aes_uint128_t *) (bskey + 9 * 128 + 16); \
t2 = *(aes_uint128_t *) (bskey + 9 * 128 + 32); \
@@ -154,12 +152,12 @@
t5 = *(aes_uint128_t *) (bskey + 9 * 128 + 80); \
t6 = *(aes_uint128_t *) (bskey + 9 * 128 + 96); \
t7 = *(aes_uint128_t *) (bskey + 9 * 128 + 112); \
; \
\
toggle(&t0); \
toggle(&t1); \
toggle(&t5); \
toggle(&t6); \
; \
\
xor2(&b0, &t0); \
xor2(&b1, &t1); \
xor2(&b4, &t2); \
@@ -168,7 +166,7 @@
xor2(&b7, &t5); \
xor2(&b2, &t6); \
xor2(&b5, &t7); \
; \
\
rshift32_littleendian(&t0, 8); \
rshift32_littleendian(&t1, 8); \
rshift32_littleendian(&t2, 8); \
@@ -177,7 +175,7 @@
rshift32_littleendian(&t5, 8); \
rshift32_littleendian(&t6, 8); \
rshift32_littleendian(&t7, 8); \
; \
\
xor2(&b0, &t0); \
xor2(&b1, &t1); \
xor2(&b4, &t2); \
@@ -186,7 +184,7 @@
xor2(&b7, &t5); \
xor2(&b2, &t6); \
xor2(&b5, &t7); \
; \
\
rshift32_littleendian(&t0, 8); \
rshift32_littleendian(&t1, 8); \
rshift32_littleendian(&t2, 8); \
@@ -195,7 +193,7 @@
rshift32_littleendian(&t5, 8); \
rshift32_littleendian(&t6, 8); \
rshift32_littleendian(&t7, 8); \
; \
\
xor2(&b0, &t0); \
xor2(&b1, &t1); \
xor2(&b4, &t2); \
@@ -204,7 +202,7 @@
xor2(&b7, &t5); \
xor2(&b2, &t6); \
xor2(&b5, &t7); \
; \
\
rshift32_littleendian(&t0, 8); \
rshift32_littleendian(&t1, 8); \
rshift32_littleendian(&t2, 8); \
@@ -213,7 +211,7 @@
rshift32_littleendian(&t5, 8); \
rshift32_littleendian(&t6, 8); \
rshift32_littleendian(&t7, 8); \
; \
\
xor2(&b0, &t0); \
xor2(&b1, &t1); \
xor2(&b4, &t2); \
@@ -222,7 +220,7 @@
xor2(&b7, &t5); \
xor2(&b2, &t6); \
xor2(&b5, &t7); \
; \
\
shufb(&b0, M0); \
shufb(&b1, M0); \
shufb(&b2, M0); \
@@ -231,7 +229,7 @@
shufb(&b5, M0); \
shufb(&b6, M0); \
shufb(&b7, M0); \
; \
\
*(aes_uint128_t *) (bskey + 1280) = b0; \
*(aes_uint128_t *) (bskey + 1296) = b1; \
*(aes_uint128_t *) (bskey + 1312) = b4; \
@@ -239,7 +237,7 @@
*(aes_uint128_t *) (bskey + 1344) = b3; \
*(aes_uint128_t *) (bskey + 1360) = b7; \
*(aes_uint128_t *) (bskey + 1376) = b2; \
*(aes_uint128_t *) (bskey + 1392) = b5;
*(aes_uint128_t *) (bskey + 1392) = b5
#define keyexpbs(b0, b1, b2, b3, b4, b5, b6, b7, t0, t1, t2, t3, t4, t5, t6, \
t7, rcon, i, bskey) \
@@ -255,9 +253,9 @@
rotbyte(&b5); \
rotbyte(&b6); \
rotbyte(&b7); \
; \
\
sbox(b0, b1, b2, b3, b4, b5, b6, b7, t0, t1, t2, t3, t4, t5, t6, t7); \
; \
\
rcon; \
shufb(&b0, EXPB0); \
shufb(&b1, EXPB0); \
@@ -267,7 +265,7 @@
shufb(&b7, EXPB0); \
shufb(&b2, EXPB0); \
shufb(&b5, EXPB0); \
; \
\
t0 = *(aes_uint128_t *) (bskey + (i - 1) * 128 + 0); \
t1 = *(aes_uint128_t *) (bskey + (i - 1) * 128 + 16); \
t2 = *(aes_uint128_t *) (bskey + (i - 1) * 128 + 32); \
@@ -276,12 +274,12 @@
t5 = *(aes_uint128_t *) (bskey + (i - 1) * 128 + 80); \
t6 = *(aes_uint128_t *) (bskey + (i - 1) * 128 + 96); \
t7 = *(aes_uint128_t *) (bskey + (i - 1) * 128 + 112); \
; \
\
toggle(&t0); \
toggle(&t1); \
toggle(&t5); \
toggle(&t6); \
; \
\
xor2(&b0, &t0); \
xor2(&b1, &t1); \
xor2(&b4, &t2); \
@@ -290,7 +288,7 @@
xor2(&b7, &t5); \
xor2(&b2, &t6); \
xor2(&b5, &t7); \
; \
\
rshift32_littleendian(&t0, 8); \
rshift32_littleendian(&t1, 8); \
rshift32_littleendian(&t2, 8); \
@@ -299,7 +297,7 @@
rshift32_littleendian(&t5, 8); \
rshift32_littleendian(&t6, 8); \
rshift32_littleendian(&t7, 8); \
; \
\
xor2(&b0, &t0); \
xor2(&b1, &t1); \
xor2(&b4, &t2); \
@@ -308,7 +306,7 @@
xor2(&b7, &t5); \
xor2(&b2, &t6); \
xor2(&b5, &t7); \
; \
\
rshift32_littleendian(&t0, 8); \
rshift32_littleendian(&t1, 8); \
rshift32_littleendian(&t2, 8); \
@@ -317,7 +315,7 @@
rshift32_littleendian(&t5, 8); \
rshift32_littleendian(&t6, 8); \
rshift32_littleendian(&t7, 8); \
; \
\
xor2(&b0, &t0); \
xor2(&b1, &t1); \
xor2(&b4, &t2); \
@@ -326,7 +324,7 @@
xor2(&b7, &t5); \
xor2(&b2, &t6); \
xor2(&b5, &t7); \
; \
\
rshift32_littleendian(&t0, 8); \
rshift32_littleendian(&t1, 8); \
rshift32_littleendian(&t2, 8); \
@@ -335,7 +333,7 @@
rshift32_littleendian(&t5, 8); \
rshift32_littleendian(&t6, 8); \
rshift32_littleendian(&t7, 8); \
; \
\
xor2(&b0, &t0); \
xor2(&b1, &t1); \
xor2(&b4, &t2); \
@@ -344,7 +342,7 @@
xor2(&b7, &t5); \
xor2(&b2, &t6); \
xor2(&b5, &t7); \
; \
\
*(aes_uint128_t *) (bskey + i * 128 + 0) = b0; \
*(aes_uint128_t *) (bskey + i * 128 + 16) = b1; \
*(aes_uint128_t *) (bskey + i * 128 + 32) = b4; \
@@ -352,7 +350,7 @@
*(aes_uint128_t *) (bskey + i * 128 + 64) = b3; \
*(aes_uint128_t *) (bskey + i * 128 + 80) = b7; \
*(aes_uint128_t *) (bskey + i * 128 + 96) = b2; \
*(aes_uint128_t *) (bskey + i * 128 + 112) = b5;
*(aes_uint128_t *) (bskey + i * 128 + 112) = b5
/* Macros used in multiple contexts */
@@ -366,9 +364,9 @@
copy2(&xmm5, &xmm0); \
copy2(&xmm6, &xmm0); \
copy2(&xmm7, &xmm0); \
; \
\
bitslice(xmm7, xmm6, xmm5, xmm4, xmm3, xmm2, xmm1, xmm0, t); \
; \
\
*(aes_uint128_t *) (bskey + 0) = xmm0; \
*(aes_uint128_t *) (bskey + 16) = xmm1; \
*(aes_uint128_t *) (bskey + 32) = xmm2; \
@@ -376,7 +374,7 @@
*(aes_uint128_t *) (bskey + 64) = xmm4; \
*(aes_uint128_t *) (bskey + 80) = xmm5; \
*(aes_uint128_t *) (bskey + 96) = xmm6; \
*(aes_uint128_t *) (bskey + 112) = xmm7;
*(aes_uint128_t *) (bskey + 112) = xmm7
#define bitslicekey10(key, bskey) \
xmm0 = *(aes_uint128_t *) (key + 0); \
@@ -387,14 +385,14 @@
copy2(xmm5, xmm0); \
copy2(xmm6, xmm0); \
copy2(xmm7, xmm0); \
; \
\
bitslice(xmm7, xmm6, xmm5, xmm4, xmm3, xmm2, xmm1, xmm0, t); \
; \
\
toggle(&xmm6); \
toggle(&xmm5); \
toggle(&xmm1); \
toggle(&xmm0); \
; \
\
*(aes_uint128_t *) (bskey + 0 + 1280) = xmm0; \
*(aes_uint128_t *) (bskey + 16 + 1280) = xmm1; \
*(aes_uint128_t *) (bskey + 32 + 1280) = xmm2; \
@@ -402,7 +400,7 @@
*(aes_uint128_t *) (bskey + 64 + 1280) = xmm4; \
*(aes_uint128_t *) (bskey + 80 + 1280) = xmm5; \
*(aes_uint128_t *) (bskey + 96 + 1280) = xmm6; \
*(aes_uint128_t *) (bskey + 112 + 1280) = xmm7;
*(aes_uint128_t *) (bskey + 112 + 1280) = xmm7
#define bitslicekey(i, key, bskey) \
xmm0 = *(aes_uint128_t *) (key + 0); \
@@ -414,14 +412,14 @@
copy2(&xmm5, &xmm0); \
copy2(&xmm6, &xmm0); \
copy2(&xmm7, &xmm0); \
; \
\
bitslice(xmm7, xmm6, xmm5, xmm4, xmm3, xmm2, xmm1, xmm0, t); \
; \
\
toggle(&xmm6); \
toggle(&xmm5); \
toggle(&xmm1); \
toggle(&xmm0); \
; \
\
*(aes_uint128_t *) (bskey + 0 + 128 * i) = xmm0; \
*(aes_uint128_t *) (bskey + 16 + 128 * i) = xmm1; \
*(aes_uint128_t *) (bskey + 32 + 128 * i) = xmm2; \
@@ -429,23 +427,23 @@
*(aes_uint128_t *) (bskey + 64 + 128 * i) = xmm4; \
*(aes_uint128_t *) (bskey + 80 + 128 * i) = xmm5; \
*(aes_uint128_t *) (bskey + 96 + 128 * i) = xmm6; \
*(aes_uint128_t *) (bskey + 112 + 128 * i) = xmm7;
*(aes_uint128_t *) (bskey + 112 + 128 * i) = xmm7
#define bitslice(x0, x1, x2, x3, x4, x5, x6, x7, t) \
swapmove(x0, x1, 1, BS0, t); \
swapmove(x2, x3, 1, BS0, t); \
swapmove(x4, x5, 1, BS0, t); \
swapmove(x6, x7, 1, BS0, t); \
; \
\
swapmove(x0, x2, 2, BS1, t); \
swapmove(x1, x3, 2, BS1, t); \
swapmove(x4, x6, 2, BS1, t); \
swapmove(x5, x7, 2, BS1, t); \
; \
\
swapmove(x0, x4, 4, BS2, t); \
swapmove(x1, x5, 4, BS2, t); \
swapmove(x2, x6, 4, BS2, t); \
swapmove(x3, x7, 4, BS2, t);
swapmove(x3, x7, 4, BS2, t)
#define swapmove(a, b, n, m, t) \
copy2(&t, &b); \
@@ -454,7 +452,7 @@
and2(&t, &m); \
xor2(&a, &t); \
lshift64_littleendian(&t, n); \
xor2(&b, &t);
xor2(&b, &t)
#define rotbyte(x) shufb(x, ROTB) /* TODO: Make faster */
@@ -476,7 +474,7 @@
xor2(&x6, (const aes_uint128_t *) (bskey + 128 * (i - 1) + 96)); \
shufb(&x6, M); \
xor2(&x7, (const aes_uint128_t *) (bskey + 128 * (i - 1) + 112)); \
shufb(&x7, M);
shufb(&x7, M)
#define mixcolumns(x0, x1, x2, x3, x4, x5, x6, x7, t0, t1, t2, t3, t4, t5, t6, \
t7) \
@@ -488,7 +486,7 @@
shufd(&t5, &x5, 0x93); \
shufd(&t6, &x6, 0x93); \
shufd(&t7, &x7, 0x93); \
; \
\
xor2(&x0, &t0); \
xor2(&x1, &t1); \
xor2(&x2, &t2); \
@@ -497,7 +495,7 @@
xor2(&x5, &t5); \
xor2(&x6, &t6); \
xor2(&x7, &t7); \
; \
\
xor2(&t0, &x7); \
xor2(&t1, &x0); \
xor2(&t2, &x1); \
@@ -509,7 +507,7 @@
xor2(&t6, &x5); \
xor2(&t7, &x6); \
xor2(&t4, &x7); \
; \
\
shufd(&x0, &x0, 0x4e); \
shufd(&x1, &x1, 0x4e); \
shufd(&x2, &x2, 0x4e); \
@@ -518,7 +516,7 @@
shufd(&x5, &x5, 0x4e); \
shufd(&x6, &x6, 0x4e); \
shufd(&x7, &x7, 0x4e); \
; \
\
xor2(&t0, &x0); \
xor2(&t1, &x1); \
xor2(&t2, &x2); \
@@ -526,13 +524,13 @@
xor2(&t4, &x4); \
xor2(&t5, &x5); \
xor2(&t6, &x6); \
xor2(&t7, &x7);
xor2(&t7, &x7)
#define aesround(i, b0, b1, b2, b3, b4, b5, b6, b7, t0, t1, t2, t3, t4, t5, \
t6, t7, bskey) \
shiftrows(b0, b1, b2, b3, b4, b5, b6, b7, i, SR, bskey); \
sbox(b0, b1, b2, b3, b4, b5, b6, b7, t0, t1, t2, t3, t4, t5, t6, t7); \
mixcolumns(b0, b1, b4, b6, b3, b7, b2, b5, t0, t1, t2, t3, t4, t5, t6, t7);
mixcolumns(b0, b1, b4, b6, b3, b7, b2, b5, t0, t1, t2, t3, t4, t5, t6, t7)
#define lastround(b0, b1, b2, b3, b4, b5, b6, b7, t0, t1, t2, t3, t4, t5, t6, \
t7, bskey) \
@@ -545,12 +543,12 @@
xor2(&b3, (const aes_uint128_t *) (bskey + 128 * 10 + 64)); \
xor2(&b7, (const aes_uint128_t *) (bskey + 128 * 10 + 80)); \
xor2(&b2, (const aes_uint128_t *) (bskey + 128 * 10 + 96)); \
xor2(&b5, (const aes_uint128_t *) (bskey + 128 * 10 + 112));
xor2(&b5, (const aes_uint128_t *) (bskey + 128 * 10 + 112))
#define sbox(b0, b1, b2, b3, b4, b5, b6, b7, t0, t1, t2, t3, s0, s1, s2, s3) \
InBasisChange(b0, b1, b2, b3, b4, b5, b6, b7); \
Inv_GF256(b6, b5, b0, b3, b7, b1, b4, b2, t0, t1, t2, t3, s0, s1, s2, s3); \
OutBasisChange(b7, b1, b4, b2, b6, b5, b0, b3);
OutBasisChange(b7, b1, b4, b2, b6, b5, b0, b3)
#define InBasisChange(b0, b1, b2, b3, b4, b5, b6, b7) \
xor2(&b5, &b6); \
@@ -558,16 +556,16 @@
xor2(&b5, &b0); \
xor2(&b6, &b2); \
xor2(&b3, &b0); \
; \
\
xor2(&b6, &b3); \
xor2(&b3, &b7); \
xor2(&b3, &b4); \
xor2(&b7, &b5); \
xor2(&b3, &b1); \
; \
\
xor2(&b4, &b5); \
xor2(&b2, &b7); \
xor2(&b1, &b5);
xor2(&b1, &b5)
#define OutBasisChange(b0, b1, b2, b3, b4, b5, b6, b7) \
xor2(&b0, &b6); \
@@ -575,14 +573,14 @@
xor2(&b2, &b0); \
xor2(&b4, &b6); \
xor2(&b6, &b1); \
; \
\
xor2(&b1, &b5); \
xor2(&b5, &b3); \
xor2(&b2, &b5); \
xor2(&b3, &b7); \
xor2(&b7, &b5); \
; \
xor2(&b4, &b7);
\
xor2(&b4, &b7)
#define Mul_GF4(x0, x1, y0, y1, t0) \
copy2(&t0, &y0); \
@@ -592,7 +590,7 @@
and2(&x0, &y1); \
and2(&x1, &y0); \
xor2(&x0, &x1); \
xor2(&x1, &t0);
xor2(&x1, &t0)
#define Mul_GF4_N(x0, x1, y0, y1, t0) \
copy2(&t0, &y0); \
@@ -602,7 +600,7 @@
and2(&x0, &y1); \
and2(&x1, &y0); \
xor2(&x1, &x0); \
xor2(&x0, &t0);
xor2(&x0, &t0)
#define Mul_GF4_2(x0, x1, x2, x3, y0, y1, t0, t1) \
copy2(&t0, = y0); \
@@ -619,7 +617,7 @@
xor2(&x0, &x1); \
xor2(&x2, &x3); \
xor2(&x1, &t0); \
xor2(&x3, &t1);
xor2(&x3, &t1)
#define Mul_GF16(x0, x1, x2, x3, y0, y1, y2, y3, t0, t1, t2, t3) \
copy2(&t0, &x0); \
@@ -631,11 +629,11 @@
xor2(&y1, &y3); \
Mul_GF4_N(t0, t1, y0, y1, t2); \
Mul_GF4(x2, x3, y2, y3, t3); \
; \
\
xor2(&x0, &t0); \
xor2(&x2, &t0); \
xor2(&x1, &t1); \
xor2(&x3, &t1);
xor2(&x3, &t1)
#define Mul_GF16_2(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, t0, t1, t2, \
t3) \
@@ -648,12 +646,12 @@
xor2(&y1, &y3); \
Mul_GF4_N(t0, t1, y0, y1, t3); \
Mul_GF4(x2, x3, y2, y3, t2); \
; \
\
xor2(&x0, &t0); \
xor2(&x2, &t0); \
xor2(&x1, &t1); \
xor2(&x3, &t1); \
; \
\
copy2(&t0, &x4); \
copy2(&t1, &x5); \
xor2(&t0, &x6); \
@@ -663,11 +661,11 @@
xor2(&y0, &y2); \
xor2(&y1, &y3); \
Mul_GF4(x4, x5, y0, y1, t3); \
; \
\
xor2(&x4, &t0); \
xor2(&x6, &t0); \
xor2(&x5, &t1); \
xor2(&x7, &t1);
xor2(&x7, &t1)
#define Inv_GF16(x0, x1, x2, x3, t0, t1, t2, t3) \
copy2(&t0, &x1); \
@@ -679,11 +677,11 @@
or2(&t2, &x2); \
or2(&t3, &x3); \
xor2(&t2, &t3); \
; \
\
xor2(&t0, &t2); \
xor2(&t1, &t2); \
; \
Mul_GF4_2(x0, x1, x2, x3, t1, t0, t2, t3);
\
Mul_GF4_2(x0, x1, x2, x3, t1, t0, t2, t3)
#define Inv_GF256(x0, x1, x2, x3, x4, x5, x6, x7, t0, t1, t2, t3, s0, s1, s2, \
s3) \
@@ -692,17 +690,17 @@
copy2(&t1, &x1); \
copy2(&s1, &x7); \
copy2(&s0, &x0); \
; \
\
xor2(&t3, &x6); \
xor2(&t2, &x7); \
xor2(&t1, &x3); \
xor2(&s1, &x6); \
xor2(&s0, &x2); \
; \
\
copy2(&s2, &t3); \
copy2(&t0, &t2); \
copy2(&s3, &t3); \
; \
\
or2(&t2, &t1); \
or2(&t3, &s0); \
xor2(&s3, &t0); \
@@ -740,7 +738,7 @@
xor2(&t2, &s1); \
xor2(&t1, &s2); \
xor2(&t0, &s3); \
; \
\
copy2(&s0, &t3); \
xor2(&s0, &t2); \
and2(&t3, &t1); \
@@ -762,7 +760,7 @@
xor2(&s2, &t2); \
and2(&s2, &s3); \
xor2(&s2, &s0); \
; \
Mul_GF16_2(x0, x1, x2, x3, x4, x5, x6, x7, s3, s2, s1, t1, s0, t0, t2, t3);
\
Mul_GF16_2(x0, x1, x2, x3, x4, x5, x6, x7, s3, s2, s1, t1, s0, t0, t2, t3)
#endif
@@ -1,5 +1,5 @@
#ifndef CONSTS_H
#define CONSTS_H
#ifndef aes128ctr_nacl_consts_H
#define aes128ctr_nacl_consts_H
#include "int128.h"
@@ -1,16 +1,10 @@
#ifndef INT128_H
#define INT128_H
#ifndef aes128ctr_nacl_int128_H
#define aes128ctr_nacl_int128_H
#include <stdint.h>
#include "common.h"
#ifdef __cplusplus
#ifdef __GNUC__
#pragma GCC diagnostic ignored "-Wlong-long"
#endif
#endif
typedef union {
uint64_t u64[2];
uint32_t u32[4];
@@ -1,3 +1,4 @@
#include <stdint.h>
#include "common.h"
#include "int128.h"
@@ -94,7 +95,7 @@ void
rshift64_littleendian(aes_uint128_t *r, const unsigned int n)
{
unsigned char *rp = (unsigned char *) r;
uint64 t;
uint64_t t;
t = LOAD64_LE(rp);
t >>= n;
@@ -108,7 +109,7 @@ void
lshift64_littleendian(aes_uint128_t *r, const unsigned int n)
{
unsigned char *rp = (unsigned char *) r;
uint64 t;
uint64_t t;
t = LOAD64_LE(rp);
t <<= n;
@@ -1,10 +0,0 @@
#ifndef TYPES_H
#define TYPES_H
#include <stdint.h>
#include <stdlib.h>
typedef uint32_t uint32;
typedef uint64_t uint64;
#endif
@@ -14,31 +14,29 @@ crypto_stream_aes128ctr_xor_afternm(unsigned char *out, const unsigned char *in,
const unsigned char *nonce,
const unsigned char *c)
{
aes_uint128_t xmm0;
aes_uint128_t xmm1;
aes_uint128_t xmm2;
aes_uint128_t xmm3;
aes_uint128_t xmm4;
aes_uint128_t xmm5;
aes_uint128_t xmm6;
aes_uint128_t xmm7;
aes_uint128_t xmm8;
aes_uint128_t xmm9;
aes_uint128_t xmm10;
aes_uint128_t xmm11;
aes_uint128_t xmm12;
aes_uint128_t xmm13;
aes_uint128_t xmm14;
aes_uint128_t xmm15;
aes_uint128_t xmm0;
aes_uint128_t xmm1;
aes_uint128_t xmm2;
aes_uint128_t xmm3;
aes_uint128_t xmm4;
aes_uint128_t xmm5;
aes_uint128_t xmm6;
aes_uint128_t xmm7;
aes_uint128_t xmm8;
aes_uint128_t xmm9;
aes_uint128_t xmm10;
aes_uint128_t xmm11;
aes_uint128_t xmm12;
aes_uint128_t xmm13;
aes_uint128_t xmm14;
aes_uint128_t xmm15;
aes_uint128_t nonce_stack;
unsigned long long lensav;
unsigned char bl[128];
unsigned char * blp;
unsigned char * np;
unsigned char b;
uint32_t tmp;
uint32_t tmp;
/* Copy nonce on the stack */
copy2(&nonce_stack, (const aes_uint128_t *) (nonce + 0));
@@ -73,43 +71,37 @@ enc_block:
shufb(&xmm6, M0SWAP);
shufb(&xmm7, M0SWAP);
bitslice(xmm7, xmm6, xmm5, xmm4, xmm3, xmm2, xmm1, xmm0, xmm8)
bitslice(xmm7, xmm6, xmm5, xmm4, xmm3, xmm2, xmm1, xmm0, xmm8);
aesround(1, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9,
xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,
c) aesround(2, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14,
xmm15, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6,
xmm7, c)
aesround(3, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8,
xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,
c) aesround(4, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13,
xmm14, xmm15, xmm0, xmm1, xmm2, xmm3, xmm4,
xmm5, xmm6, xmm7, c)
aesround(5, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,
xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,
c) aesround(6, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13,
xmm14, xmm15, xmm0, xmm1, xmm2, xmm3, xmm4,
xmm5, xmm6, xmm7, c)
aesround(7, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,
xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14,
xmm15, c)
aesround(8, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13,
xmm14, xmm15, xmm0, xmm1, xmm2, xmm3, xmm4,
xmm5, xmm6, xmm7, c)
aesround(9, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5,
xmm6, xmm7, xmm8, xmm9, xmm10, xmm11,
xmm12, xmm13, xmm14, xmm15, c)
lastround(xmm8, xmm9, xmm10, xmm11, xmm12,
xmm13, xmm14, xmm15, xmm0, xmm1, xmm2,
xmm3, xmm4, xmm5, xmm6, xmm7, c)
aesround(1, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9,
xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, c);
aesround(2, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xmm0,
xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, c);
aesround(3, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9,
xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, c);
aesround(4, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xmm0,
xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, c);
aesround(5, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9,
xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, c);
aesround(6, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xmm0,
xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, c);
aesround(7, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9,
xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, c);
aesround(8, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xmm0,
xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, c);
aesround(9, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9,
xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, c);
lastround(xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xmm0, xmm1,
xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, c);
bitslice(xmm13, xmm10, xmm15, xmm11, xmm14,
xmm12, xmm9, xmm8, xmm0)
bitslice(xmm13, xmm10, xmm15, xmm11, xmm14, xmm12, xmm9, xmm8, xmm0);
if (len < 128) goto partial;
if (len == 128)
if (len < 128) {
goto partial;
}
if (len == 128) {
goto full;
}
tmp = LOAD32_BE(np + 12);
tmp += 8;
STORE32_BE(np + 12, tmp);
@@ -147,7 +139,8 @@ partial:
tmp += len;
STORE32_BE(np + 12, tmp);
blp = bl;
blp = bl;
*(aes_uint128_t *) (blp + 0) = xmm8;
*(aes_uint128_t *) (blp + 16) = xmm9;
*(aes_uint128_t *) (blp + 32) = xmm12;
@@ -159,9 +152,9 @@ partial:
bytes:
if (lensav == 0)
if (lensav == 0) {
goto end;
}
b = blp[0]; /* clang false positive */
b ^= *(const unsigned char *) (in + 0);
*(unsigned char *) (out + 0) = b;