This commit is contained in:
Frank Denis
2017-02-23 10:14:13 +01:00
parent 2838bcd04c
commit 2be6fc4800
8 changed files with 1035 additions and 940 deletions
@@ -1,13 +1,17 @@
/* Author: Peter Schwabe, ported from an assembly implementation by Emilia Käsper
/* Author: Peter Schwabe, ported from an assembly implementation by Emilia
* Käsper
* Date: 2009-03-19
* Public domain */
#include "crypto_stream_aes128ctr.h"
#include "int128.h"
#include "common.h"
#include "consts.h"
#include "crypto_stream_aes128ctr.h"
#include "int128.h"
int crypto_stream_aes128ctr_afternm(unsigned char *out, unsigned long long len, const unsigned char *nonce, const unsigned char *c)
int
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;
@@ -26,18 +30,18 @@ int crypto_stream_aes128ctr_afternm(unsigned char *out, unsigned long long len,
aes_uint128_t xmm14;
aes_uint128_t xmm15;
aes_uint128_t nonce_stack;
aes_uint128_t nonce_stack;
unsigned long long lensav;
unsigned char bl[128];
unsigned char *blp;
unsigned char *np;
unsigned char b;
unsigned char bl[128];
unsigned char * blp;
unsigned char * np;
unsigned char b;
uint32_t tmp;
/* Copy nonce on the stack */
copy2(&nonce_stack, (const aes_uint128_t *) (nonce + 0));
np = (unsigned char *)&nonce_stack;
np = (unsigned char *) &nonce_stack;
enc_block:
@@ -70,33 +74,52 @@ enc_block:
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) goto full;
if (len < 128) goto partial;
if (len == 128)
goto full;
tmp = LOAD32_BE(np + 12);
tmp += 8;
STORE32_BE(np + 12, tmp);
*(aes_uint128_t *) (out + 0) = xmm8;
*(aes_uint128_t *) (out + 16) = xmm9;
*(aes_uint128_t *) (out + 32) = xmm12;
*(aes_uint128_t *) (out + 48) = xmm14;
*(aes_uint128_t *) (out + 64) = xmm11;
*(aes_uint128_t *) (out + 80) = xmm15;
*(aes_uint128_t *) (out + 96) = xmm10;
*(aes_uint128_t *) (out + 0) = xmm8;
*(aes_uint128_t *) (out + 16) = xmm9;
*(aes_uint128_t *) (out + 32) = xmm12;
*(aes_uint128_t *) (out + 48) = xmm14;
*(aes_uint128_t *) (out + 64) = xmm11;
*(aes_uint128_t *) (out + 80) = xmm15;
*(aes_uint128_t *) (out + 96) = xmm10;
*(aes_uint128_t *) (out + 112) = xmm13;
len -= 128;
@@ -113,25 +136,26 @@ partial:
tmp += len;
STORE32_BE(np + 12, tmp);
blp = bl;
*(aes_uint128_t *)(blp + 0) = xmm8;
*(aes_uint128_t *)(blp + 16) = xmm9;
*(aes_uint128_t *)(blp + 32) = xmm12;
*(aes_uint128_t *)(blp + 48) = xmm14;
*(aes_uint128_t *)(blp + 64) = xmm11;
*(aes_uint128_t *)(blp + 80) = xmm15;
*(aes_uint128_t *)(blp + 96) = xmm10;
*(aes_uint128_t *)(blp + 112) = xmm13;
blp = bl;
*(aes_uint128_t *) (blp + 0) = xmm8;
*(aes_uint128_t *) (blp + 16) = xmm9;
*(aes_uint128_t *) (blp + 32) = xmm12;
*(aes_uint128_t *) (blp + 48) = xmm14;
*(aes_uint128_t *) (blp + 64) = xmm11;
*(aes_uint128_t *) (blp + 80) = xmm15;
*(aes_uint128_t *) (blp + 96) = xmm10;
*(aes_uint128_t *) (blp + 112) = xmm13;
bytes:
if(lensav == 0) goto end;
if (lensav == 0)
goto end;
b = blp[0]; /* clang false positive */
*(unsigned char *)(out + 0) = b;
b = blp[0]; /* clang false positive */
*(unsigned char *) (out + 0) = b;
blp += 1;
out +=1;
out += 1;
lensav -= 1;
goto bytes;
@@ -142,13 +166,13 @@ full:
tmp += 8;
STORE32_BE(np + 12, tmp);
*(aes_uint128_t *) (out + 0) = xmm8;
*(aes_uint128_t *) (out + 16) = xmm9;
*(aes_uint128_t *) (out + 32) = xmm12;
*(aes_uint128_t *) (out + 48) = xmm14;
*(aes_uint128_t *) (out + 64) = xmm11;
*(aes_uint128_t *) (out + 80) = xmm15;
*(aes_uint128_t *) (out + 96) = xmm10;
*(aes_uint128_t *) (out + 0) = xmm8;
*(aes_uint128_t *) (out + 16) = xmm9;
*(aes_uint128_t *) (out + 32) = xmm12;
*(aes_uint128_t *) (out + 48) = xmm14;
*(aes_uint128_t *) (out + 64) = xmm11;
*(aes_uint128_t *) (out + 80) = xmm15;
*(aes_uint128_t *) (out + 96) = xmm10;
*(aes_uint128_t *) (out + 112) = xmm13;
end:
@@ -1,13 +1,15 @@
/* Author: Peter Schwabe, ported from an assembly implementation by Emilia Käsper
/* Author: Peter Schwabe, ported from an assembly implementation by Emilia
* Käsper
* Date: 2009-03-19
* Public domain */
#include "crypto_stream_aes128ctr.h"
#include "consts.h"
#include "int128.h"
#include "common.h"
#include "consts.h"
#include "crypto_stream_aes128ctr.h"
#include "int128.h"
int crypto_stream_aes128ctr_beforenm(unsigned char *c, const unsigned char *k)
int
crypto_stream_aes128ctr_beforenm(unsigned char *c, const unsigned char *k)
{
aes_uint128_t xmm0;
aes_uint128_t xmm1;
@@ -29,18 +31,43 @@ int crypto_stream_aes128ctr_beforenm(unsigned char *c, const unsigned char *k)
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;
}
File diff suppressed because it is too large Load Diff
@@ -1,14 +1,28 @@
#include "consts.h"
const unsigned char ROTB[16] = {0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08};
const unsigned char M0[16] = {0x0f, 0x0b, 0x07, 0x03, 0x0e, 0x0a, 0x06, 0x02, 0x0d, 0x09, 0x05, 0x01, 0x0c, 0x08, 0x04, 0x00};
const unsigned char EXPB0[16] = {0x03, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07, 0x0b, 0x0b, 0x0b, 0x0b, 0x0f, 0x0f, 0x0f, 0x0f};
const unsigned char ROTB[16] = {
0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08
};
const unsigned char M0[16] = { 0x0f, 0x0b, 0x07, 0x03, 0x0e, 0x0a, 0x06, 0x02,
0x0d, 0x09, 0x05, 0x01, 0x0c, 0x08, 0x04, 0x00 };
const unsigned char EXPB0[16] = { 0x03, 0x03, 0x03, 0x03, 0x07, 0x07,
0x07, 0x07, 0x0b, 0x0b, 0x0b, 0x0b,
0x0f, 0x0f, 0x0f, 0x0f };
const unsigned char SWAP32[16] = {0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c};
const unsigned char M0SWAP[16] = {0x0c, 0x08, 0x04, 0x00, 0x0d, 0x09, 0x05, 0x01, 0x0e, 0x0a, 0x06, 0x02, 0x0f, 0x0b, 0x07, 0x03};
const unsigned char SR[16] = {0x01, 0x02, 0x03, 0x00, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x08, 0x09, 0x0a, 0x0c, 0x0d, 0x0e, 0x0f};
const unsigned char SRM0[16] = {0x0f, 0x0a, 0x05, 0x00, 0x0e, 0x09, 0x04, 0x03, 0x0d, 0x08, 0x07, 0x02, 0x0c, 0x0b, 0x06, 0x01};
const unsigned char SWAP32[16] = { 0x03, 0x02, 0x01, 0x00, 0x07, 0x06,
0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08,
0x0f, 0x0e, 0x0d, 0x0c };
const unsigned char M0SWAP[16] = { 0x0c, 0x08, 0x04, 0x00, 0x0d, 0x09,
0x05, 0x01, 0x0e, 0x0a, 0x06, 0x02,
0x0f, 0x0b, 0x07, 0x03 };
const unsigned char SR[16] = { 0x01, 0x02, 0x03, 0x00, 0x06, 0x07, 0x04, 0x05,
0x0b, 0x08, 0x09, 0x0a, 0x0c, 0x0d, 0x0e, 0x0f };
const unsigned char SRM0[16] = {
0x0f, 0x0a, 0x05, 0x00, 0x0e, 0x09, 0x04, 0x03,
0x0d, 0x08, 0x07, 0x02, 0x0c, 0x0b, 0x06, 0x01
};
const aes_uint128_t BS0 = {{0x5555555555555555ULL, 0x5555555555555555ULL}};
const aes_uint128_t BS1 = {{0x3333333333333333ULL, 0x3333333333333333ULL}};
const aes_uint128_t BS2 = {{0x0f0f0f0f0f0f0f0fULL, 0x0f0f0f0f0f0f0f0fULL}};
const aes_uint128_t BS0 = { { 0x5555555555555555ULL, 0x5555555555555555ULL } };
const aes_uint128_t BS1 = { { 0x3333333333333333ULL, 0x3333333333333333ULL } };
const aes_uint128_t BS2 = { { 0x0f0f0f0f0f0f0f0fULL, 0x0f0f0f0f0f0f0f0fULL } };
@@ -6,9 +6,9 @@
#include "common.h"
#ifdef __cplusplus
# ifdef __GNUC__
# pragma GCC diagnostic ignored "-Wlong-long"
# endif
#ifdef __GNUC__
#pragma GCC diagnostic ignored "-Wlong-long"
#endif
#endif
typedef union {
@@ -35,13 +35,16 @@ void shufb(aes_uint128_t *r, const unsigned char *l);
#define shufd crypto_stream_aes128ctr_portable_shufd
void shufd(aes_uint128_t *r, const aes_uint128_t *x, const unsigned int c);
#define rshift32_littleendian crypto_stream_aes128ctr_portable_rshift32_littleendian
#define rshift32_littleendian \
crypto_stream_aes128ctr_portable_rshift32_littleendian
void rshift32_littleendian(aes_uint128_t *r, const unsigned int n);
#define rshift64_littleendian crypto_stream_aes128ctr_portable_rshift64_littleendian
#define rshift64_littleendian \
crypto_stream_aes128ctr_portable_rshift64_littleendian
void rshift64_littleendian(aes_uint128_t *r, const unsigned int n);
#define lshift64_littleendian crypto_stream_aes128ctr_portable_lshift64_littleendian
#define lshift64_littleendian \
crypto_stream_aes128ctr_portable_lshift64_littleendian
void lshift64_littleendian(aes_uint128_t *r, const unsigned int n);
#define toggle crypto_stream_aes128ctr_portable_toggle
@@ -1,50 +1,55 @@
#include "int128.h"
#include "common.h"
#include "int128.h"
void xor2(aes_uint128_t *r, const aes_uint128_t *x)
void
xor2(aes_uint128_t *r, const aes_uint128_t *x)
{
r->u64[0] ^= x->u64[0];
r->u64[1] ^= x->u64[1];
}
void and2(aes_uint128_t *r, const aes_uint128_t *x)
void
and2(aes_uint128_t *r, const aes_uint128_t *x)
{
r->u64[0] &= x->u64[0];
r->u64[1] &= x->u64[1];
}
void or2(aes_uint128_t *r, const aes_uint128_t *x)
void
or2(aes_uint128_t *r, const aes_uint128_t *x)
{
r->u64[0] |= x->u64[0];
r->u64[1] |= x->u64[1];
}
void copy2(aes_uint128_t *r, const aes_uint128_t *x)
void
copy2(aes_uint128_t *r, const aes_uint128_t *x)
{
r->u64[0] = x->u64[0];
r->u64[1] = x->u64[1];
}
void shufb(aes_uint128_t *r, const unsigned char *l)
void
shufb(aes_uint128_t *r, const unsigned char *l)
{
aes_uint128_t t;
uint8_t *ct;
uint8_t *cr;
uint8_t * ct;
uint8_t * cr;
copy2(&t, r);
cr = r->u8;
ct = t.u8;
cr[0] = ct[l[0]];
cr[1] = ct[l[1]];
cr[2] = ct[l[2]];
cr[3] = ct[l[3]];
cr[4] = ct[l[4]];
cr[5] = ct[l[5]];
cr[6] = ct[l[6]];
cr[7] = ct[l[7]];
cr[8] = ct[l[8]];
cr[9] = ct[l[9]];
cr = r->u8;
ct = t.u8;
cr[0] = ct[l[0]];
cr[1] = ct[l[1]];
cr[2] = ct[l[2]];
cr[3] = ct[l[3]];
cr[4] = ct[l[4]];
cr[5] = ct[l[5]];
cr[6] = ct[l[6]];
cr[7] = ct[l[7]];
cr[8] = ct[l[8]];
cr[9] = ct[l[9]];
cr[10] = ct[l[10]];
cr[11] = ct[l[11]];
cr[12] = ct[l[12]];
@@ -53,7 +58,8 @@ void shufb(aes_uint128_t *r, const unsigned char *l)
cr[15] = ct[l[15]];
}
void shufd(aes_uint128_t *r, const aes_uint128_t *x, const unsigned int c)
void
shufd(aes_uint128_t *r, const aes_uint128_t *x, const unsigned int c)
{
aes_uint128_t t;
@@ -64,73 +70,79 @@ void shufd(aes_uint128_t *r, const aes_uint128_t *x, const unsigned int c)
copy2(r, &t);
}
void rshift32_littleendian(aes_uint128_t *r, const unsigned int n)
void
rshift32_littleendian(aes_uint128_t *r, const unsigned int n)
{
unsigned char *rp = (unsigned char *)r;
uint32_t t;
unsigned char *rp = (unsigned char *) r;
uint32_t t;
t = LOAD32_LE(rp);
t >>= n;
STORE32_LE(rp, t);
t = LOAD32_LE(rp+4);
t = LOAD32_LE(rp + 4);
t >>= n;
STORE32_LE(rp+4, t);
t = LOAD32_LE(rp+8);
STORE32_LE(rp + 4, t);
t = LOAD32_LE(rp + 8);
t >>= n;
STORE32_LE(rp+8, t);
t = LOAD32_LE(rp+12);
STORE32_LE(rp + 8, t);
t = LOAD32_LE(rp + 12);
t >>= n;
STORE32_LE(rp+12, t);
STORE32_LE(rp + 12, t);
}
void rshift64_littleendian(aes_uint128_t *r, const unsigned int n)
void
rshift64_littleendian(aes_uint128_t *r, const unsigned int n)
{
unsigned char *rp = (unsigned char *)r;
uint64 t;
unsigned char *rp = (unsigned char *) r;
uint64 t;
t = LOAD64_LE(rp);
t >>= n;
STORE64_LE(rp, t);
t = LOAD64_LE(rp+8);
t = LOAD64_LE(rp + 8);
t >>= n;
STORE64_LE(rp+8, t);
STORE64_LE(rp + 8, t);
}
void lshift64_littleendian(aes_uint128_t *r, const unsigned int n)
void
lshift64_littleendian(aes_uint128_t *r, const unsigned int n)
{
unsigned char *rp = (unsigned char *)r;
uint64 t;
unsigned char *rp = (unsigned char *) r;
uint64 t;
t = LOAD64_LE(rp);
t <<= n;
STORE64_LE(rp, t);
t = LOAD64_LE(rp+8);
t = LOAD64_LE(rp + 8);
t <<= n;
STORE64_LE(rp+8, t);
STORE64_LE(rp + 8, t);
}
void toggle(aes_uint128_t *r)
void
toggle(aes_uint128_t *r)
{
r->u64[0] ^= 0xffffffffffffffffULL;
r->u64[1] ^= 0xffffffffffffffffULL;
}
void xor_rcon(aes_uint128_t *r)
void
xor_rcon(aes_uint128_t *r)
{
unsigned char *rp = (unsigned char *)r;
uint32_t t;
unsigned char *rp = (unsigned char *) r;
uint32_t t;
t = LOAD32_LE(rp+12);
t = LOAD32_LE(rp + 12);
t ^= 0xffffffff;
STORE32_LE(rp+12, t);
STORE32_LE(rp + 12, t);
}
void add_uint32_big(aes_uint128_t *r, uint32_t x)
void
add_uint32_big(aes_uint128_t *r, uint32_t x)
{
unsigned char *rp = (unsigned char *)r;
uint32_t t;
unsigned char *rp = (unsigned char *) r;
uint32_t t;
t = LOAD32_LE(rp+12);
t = LOAD32_LE(rp + 12);
t += x;
STORE32_LE(rp+12, t);
STORE32_LE(rp + 12, t);
}
@@ -1,10 +1,9 @@
#include "crypto_stream_aes128ctr.h"
int crypto_stream_aes128ctr(unsigned char *out,
unsigned long long outlen,
const unsigned char *n,
const unsigned char *k)
int
crypto_stream_aes128ctr(unsigned char *out, unsigned long long outlen,
const unsigned char *n, const unsigned char *k)
{
unsigned char d[crypto_stream_aes128ctr_BEFORENMBYTES];
@@ -14,11 +13,10 @@ int crypto_stream_aes128ctr(unsigned char *out,
return 0;
}
int crypto_stream_aes128ctr_xor(unsigned char *out,
const unsigned char *in,
unsigned long long inlen,
const unsigned char *n,
const unsigned char *k)
int
crypto_stream_aes128ctr_xor(unsigned char *out, const unsigned char *in,
unsigned long long inlen, const unsigned char *n,
const unsigned char *k)
{
unsigned char d[crypto_stream_aes128ctr_BEFORENMBYTES];
@@ -1,17 +1,18 @@
/* Author: Peter Schwabe, ported from an assembly implementation by Emilia Käsper
/* Author: Peter Schwabe, ported from an assembly implementation by Emilia
* Käsper
* Date: 2009-03-19
* Public domain */
#include "crypto_stream_aes128ctr.h"
#include "int128.h"
#include "common.h"
#include "consts.h"
#include "crypto_stream_aes128ctr.h"
#include "int128.h"
int crypto_stream_aes128ctr_xor_afternm(unsigned char *out,
const unsigned char *in,
unsigned long long len,
const unsigned char *nonce,
const unsigned char *c)
int
crypto_stream_aes128ctr_xor_afternm(unsigned char *out, const unsigned char *in,
unsigned long long len,
const unsigned char *nonce,
const unsigned char *c)
{
aes_uint128_t xmm0;
aes_uint128_t xmm1;
@@ -30,18 +31,18 @@ int crypto_stream_aes128ctr_xor_afternm(unsigned char *out,
aes_uint128_t xmm14;
aes_uint128_t xmm15;
aes_uint128_t nonce_stack;
aes_uint128_t nonce_stack;
unsigned long long lensav;
unsigned char bl[128];
unsigned char *blp;
unsigned char *np;
unsigned char b;
unsigned char bl[128];
unsigned char * blp;
unsigned char * np;
unsigned char b;
uint32_t tmp;
/* Copy nonce on the stack */
copy2(&nonce_stack, (const aes_uint128_t *) (nonce + 0));
np = (unsigned char *)&nonce_stack;
np = (unsigned char *) &nonce_stack;
enc_block:
@@ -74,42 +75,61 @@ enc_block:
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) goto full;
if (len < 128) goto partial;
if (len == 128)
goto full;
tmp = LOAD32_BE(np + 12);
tmp += 8;
STORE32_BE(np + 12, tmp);
xor2(&xmm8, (const aes_uint128_t *)(in + 0));
xor2(&xmm9, (const aes_uint128_t *)(in + 16));
xor2(&xmm12, (const aes_uint128_t *)(in + 32));
xor2(&xmm14, (const aes_uint128_t *)(in + 48));
xor2(&xmm11, (const aes_uint128_t *)(in + 64));
xor2(&xmm15, (const aes_uint128_t *)(in + 80));
xor2(&xmm10, (const aes_uint128_t *)(in + 96));
xor2(&xmm13, (const aes_uint128_t *)(in + 112));
xor2(&xmm8, (const aes_uint128_t *) (in + 0));
xor2(&xmm9, (const aes_uint128_t *) (in + 16));
xor2(&xmm12, (const aes_uint128_t *) (in + 32));
xor2(&xmm14, (const aes_uint128_t *) (in + 48));
xor2(&xmm11, (const aes_uint128_t *) (in + 64));
xor2(&xmm15, (const aes_uint128_t *) (in + 80));
xor2(&xmm10, (const aes_uint128_t *) (in + 96));
xor2(&xmm13, (const aes_uint128_t *) (in + 112));
*(aes_uint128_t *) (out + 0) = xmm8;
*(aes_uint128_t *) (out + 16) = xmm9;
*(aes_uint128_t *) (out + 32) = xmm12;
*(aes_uint128_t *) (out + 48) = xmm14;
*(aes_uint128_t *) (out + 64) = xmm11;
*(aes_uint128_t *) (out + 80) = xmm15;
*(aes_uint128_t *) (out + 96) = xmm10;
*(aes_uint128_t *) (out + 0) = xmm8;
*(aes_uint128_t *) (out + 16) = xmm9;
*(aes_uint128_t *) (out + 32) = xmm12;
*(aes_uint128_t *) (out + 48) = xmm14;
*(aes_uint128_t *) (out + 64) = xmm11;
*(aes_uint128_t *) (out + 80) = xmm15;
*(aes_uint128_t *) (out + 96) = xmm10;
*(aes_uint128_t *) (out + 112) = xmm13;
len -= 128;
@@ -127,27 +147,28 @@ partial:
tmp += len;
STORE32_BE(np + 12, tmp);
blp = bl;
*(aes_uint128_t *)(blp + 0) = xmm8;
*(aes_uint128_t *)(blp + 16) = xmm9;
*(aes_uint128_t *)(blp + 32) = xmm12;
*(aes_uint128_t *)(blp + 48) = xmm14;
*(aes_uint128_t *)(blp + 64) = xmm11;
*(aes_uint128_t *)(blp + 80) = xmm15;
*(aes_uint128_t *)(blp + 96) = xmm10;
*(aes_uint128_t *)(blp + 112) = xmm13;
blp = bl;
*(aes_uint128_t *) (blp + 0) = xmm8;
*(aes_uint128_t *) (blp + 16) = xmm9;
*(aes_uint128_t *) (blp + 32) = xmm12;
*(aes_uint128_t *) (blp + 48) = xmm14;
*(aes_uint128_t *) (blp + 64) = xmm11;
*(aes_uint128_t *) (blp + 80) = xmm15;
*(aes_uint128_t *) (blp + 96) = xmm10;
*(aes_uint128_t *) (blp + 112) = xmm13;
bytes:
if(lensav == 0) goto end;
if (lensav == 0)
goto end;
b = blp[0]; /* clang false positive */
b ^= *(const unsigned char *)(in + 0);
*(unsigned char *)(out + 0) = b;
b ^= *(const unsigned char *) (in + 0);
*(unsigned char *) (out + 0) = b;
blp += 1;
in +=1;
out +=1;
in += 1;
out += 1;
lensav -= 1;
goto bytes;
@@ -158,25 +179,24 @@ full:
tmp += 8;
STORE32_BE(np + 12, tmp);
xor2(&xmm8, (const aes_uint128_t *)(in + 0));
xor2(&xmm9, (const aes_uint128_t *)(in + 16));
xor2(&xmm12, (const aes_uint128_t *)(in + 32));
xor2(&xmm14, (const aes_uint128_t *)(in + 48));
xor2(&xmm11, (const aes_uint128_t *)(in + 64));
xor2(&xmm15, (const aes_uint128_t *)(in + 80));
xor2(&xmm10, (const aes_uint128_t *)(in + 96));
xor2(&xmm13, (const aes_uint128_t *)(in + 112));
xor2(&xmm8, (const aes_uint128_t *) (in + 0));
xor2(&xmm9, (const aes_uint128_t *) (in + 16));
xor2(&xmm12, (const aes_uint128_t *) (in + 32));
xor2(&xmm14, (const aes_uint128_t *) (in + 48));
xor2(&xmm11, (const aes_uint128_t *) (in + 64));
xor2(&xmm15, (const aes_uint128_t *) (in + 80));
xor2(&xmm10, (const aes_uint128_t *) (in + 96));
xor2(&xmm13, (const aes_uint128_t *) (in + 112));
*(aes_uint128_t *) (out + 0) = xmm8;
*(aes_uint128_t *) (out + 16) = xmm9;
*(aes_uint128_t *) (out + 32) = xmm12;
*(aes_uint128_t *) (out + 48) = xmm14;
*(aes_uint128_t *) (out + 64) = xmm11;
*(aes_uint128_t *) (out + 80) = xmm15;
*(aes_uint128_t *) (out + 96) = xmm10;
*(aes_uint128_t *) (out + 0) = xmm8;
*(aes_uint128_t *) (out + 16) = xmm9;
*(aes_uint128_t *) (out + 32) = xmm12;
*(aes_uint128_t *) (out + 48) = xmm14;
*(aes_uint128_t *) (out + 64) = xmm11;
*(aes_uint128_t *) (out + 80) = xmm15;
*(aes_uint128_t *) (out + 96) = xmm10;
*(aes_uint128_t *) (out + 112) = xmm13;
end:
return 0;
}