AES-XTS ASM x64: Add Intel x64 implementation of streaming

Changed APIs from wc_AesXts*Start -> wc_AesXts*Init.
Enabled ASM for x64 in aes.c.
AesXtsDecryptStart_sw same as AesXtsEncryptStart_sw so changed them to
AesXtsInit_sw.
pull/7522/head
Sean Parkinson 2024-05-14 15:17:50 +10:00 committed by Daniel Pouzzner
parent f874d8753d
commit 643f472cfb
4 changed files with 2724 additions and 51 deletions

View File

@ -12530,9 +12530,9 @@ void AES_XTS_encrypt_aesni(const unsigned char *in, unsigned char *out, word32 s
const unsigned char* key2, int nr) const unsigned char* key2, int nr)
XASM_LINK("AES_XTS_encrypt_aesni"); XASM_LINK("AES_XTS_encrypt_aesni");
#ifdef WOLFSSL_AESXTS_STREAM #ifdef WOLFSSL_AESXTS_STREAM
void AES_XTS_encrypt_start_aesni(unsigned char* i, const unsigned char* tweak_key, void AES_XTS_init_aesni(unsigned char* i, const unsigned char* tweak_key,
int tweak_nr) int tweak_nr)
XASM_LINK("AES_XTS_encrypt_start_aesni"); XASM_LINK("AES_XTS_init_aesni");
void AES_XTS_encrypt_update_aesni(const unsigned char *in, unsigned char *out, word32 sz, void AES_XTS_encrypt_update_aesni(const unsigned char *in, unsigned char *out, word32 sz,
const unsigned char* key, unsigned char *i, int nr) const unsigned char* key, unsigned char *i, int nr)
XASM_LINK("AES_XTS_encrypt_update_aesni"); XASM_LINK("AES_XTS_encrypt_update_aesni");
@ -12544,9 +12544,9 @@ void AES_XTS_encrypt_avx1(const unsigned char *in, unsigned char *out,
int nr) int nr)
XASM_LINK("AES_XTS_encrypt_avx1"); XASM_LINK("AES_XTS_encrypt_avx1");
#ifdef WOLFSSL_AESXTS_STREAM #ifdef WOLFSSL_AESXTS_STREAM
void AES_XTS_encrypt_start_avx1(unsigned char* i, const unsigned char* tweak_key, void AES_XTS_init_avx1(unsigned char* i, const unsigned char* tweak_key,
int tweak_nr) int tweak_nr)
XASM_LINK("AES_XTS_encrypt_start_avx1"); XASM_LINK("AES_XTS_init_avx1");
void AES_XTS_encrypt_update_avx1(const unsigned char *in, unsigned char *out, word32 sz, void AES_XTS_encrypt_update_avx1(const unsigned char *in, unsigned char *out, word32 sz,
const unsigned char* key, unsigned char *i, int nr) const unsigned char* key, unsigned char *i, int nr)
XASM_LINK("AES_XTS_encrypt_update_avx1"); XASM_LINK("AES_XTS_encrypt_update_avx1");
@ -12559,9 +12559,6 @@ void AES_XTS_decrypt_aesni(const unsigned char *in, unsigned char *out, word32 s
const unsigned char* key2, int nr) const unsigned char* key2, int nr)
XASM_LINK("AES_XTS_decrypt_aesni"); XASM_LINK("AES_XTS_decrypt_aesni");
#ifdef WOLFSSL_AESXTS_STREAM #ifdef WOLFSSL_AESXTS_STREAM
void AES_XTS_decrypt_start_aesni(unsigned char* i, const unsigned char* tweak_key,
int tweak_nr)
XASM_LINK("AES_XTS_decrypt_start_aesni");
void AES_XTS_decrypt_update_aesni(const unsigned char *in, unsigned char *out, word32 sz, void AES_XTS_decrypt_update_aesni(const unsigned char *in, unsigned char *out, word32 sz,
const unsigned char* key, unsigned char *i, int nr) const unsigned char* key, unsigned char *i, int nr)
XASM_LINK("AES_XTS_decrypt_update_aesni"); XASM_LINK("AES_XTS_decrypt_update_aesni");
@ -12573,9 +12570,6 @@ void AES_XTS_decrypt_avx1(const unsigned char *in, unsigned char *out,
int nr) int nr)
XASM_LINK("AES_XTS_decrypt_avx1"); XASM_LINK("AES_XTS_decrypt_avx1");
#ifdef WOLFSSL_AESXTS_STREAM #ifdef WOLFSSL_AESXTS_STREAM
void AES_XTS_decrypt_start_avx1(unsigned char* i, const unsigned char* tweak_key,
int tweak_nr)
XASM_LINK("AES_XTS_decrypt_start_avx1");
void AES_XTS_decrypt_update_avx1(const unsigned char *in, unsigned char *out, word32 sz, void AES_XTS_decrypt_update_avx1(const unsigned char *in, unsigned char *out, word32 sz,
const unsigned char* key, unsigned char *i, int nr) const unsigned char* key, unsigned char *i, int nr)
XASM_LINK("AES_XTS_decrypt_update_avx1"); XASM_LINK("AES_XTS_decrypt_update_avx1");
@ -12732,7 +12726,7 @@ static int AesXtsEncrypt_sw(XtsAes* xaes, byte* out, const byte* in, word32 sz,
* *
* returns 0 on success * returns 0 on success
*/ */
static int AesXtsEncryptStart_sw(XtsAes* xaes, byte* i) { static int AesXtsInit_sw(XtsAes* xaes, byte* i) {
return wc_AesEncryptDirect(&xaes->tweak, i, i); return wc_AesEncryptDirect(&xaes->tweak, i, i);
} }
@ -12916,7 +12910,7 @@ int wc_AesXtsEncrypt(XtsAes* xaes, byte* out, const byte* in, word32 sz,
#ifdef WOLFSSL_AESXTS_STREAM #ifdef WOLFSSL_AESXTS_STREAM
int wc_AesXtsEncryptStart(XtsAes* xaes, byte* i, word32 iSz) int wc_AesXtsEncryptInit(XtsAes* xaes, byte* i, word32 iSz)
{ {
int ret; int ret;
@ -12942,30 +12936,28 @@ int wc_AesXtsEncryptStart(XtsAes* xaes, byte* i, word32 iSz)
} }
{ {
#if 0 && defined(WOLFSSL_AESNI) #ifdef WOLFSSL_AESNI
if (aes->use_aesni) { if (aes->use_aesni) {
SAVE_VECTOR_REGISTERS(return _svr_ret;); SAVE_VECTOR_REGISTERS(return _svr_ret;);
#if defined(HAVE_INTEL_AVX1) #if defined(HAVE_INTEL_AVX1)
if (IS_INTEL_AVX1(intel_flags)) { if (IS_INTEL_AVX1(intel_flags)) {
AES_XTS_encrypt_start_avx1(i, AES_XTS_init_avx1(i, (const byte*)xaes->tweak.key,
(const byte*)xaes->tweak.key,
(int)xaes->tweak.rounds); (int)xaes->tweak.rounds);
ret = 0; ret = 0;
} }
else else
#endif #endif
{ {
AES_XTS_encrypt_start_aesni(i, AES_XTS_init_aesni(i, (const byte*)xaes->tweak.key,
(const byte*)xaes->tweak.key,
(int)xaes->tweak.rounds); (int)xaes->tweak.rounds);
ret = 0; ret = 0;
} }
RESTORE_VECTOR_REGISTERS(); RESTORE_VECTOR_REGISTERS();
} }
else else
#endif /* 0 && defined(WOLFSSL_AESNI) */ #endif /* WOLFSSL_AESNI */
{ {
ret = AesXtsEncryptStart_sw(xaes, i); ret = AesXtsInit_sw(xaes, i);
} }
} }
@ -12989,7 +12981,7 @@ int wc_AesXtsEncryptUpdate(XtsAes* xaes, byte* out, const byte* in, word32 sz,
{ {
int ret; int ret;
#if 0 && defined(WOLFSSL_AESNI) #ifdef WOLFSSL_AESNI
Aes *aes; Aes *aes;
#endif #endif
@ -12997,7 +12989,7 @@ int wc_AesXtsEncryptUpdate(XtsAes* xaes, byte* out, const byte* in, word32 sz,
return BAD_FUNC_ARG; return BAD_FUNC_ARG;
} }
#if 0 && defined(WOLFSSL_AESNI) #ifdef WOLFSSL_AESNI
aes = &xaes->aes; aes = &xaes->aes;
#endif #endif
@ -13007,7 +12999,7 @@ int wc_AesXtsEncryptUpdate(XtsAes* xaes, byte* out, const byte* in, word32 sz,
} }
{ {
#if 0 && defined(WOLFSSL_AESNI) #ifdef WOLFSSL_AESNI
if (aes->use_aesni) { if (aes->use_aesni) {
SAVE_VECTOR_REGISTERS(return _svr_ret;); SAVE_VECTOR_REGISTERS(return _svr_ret;);
#if defined(HAVE_INTEL_AVX1) #if defined(HAVE_INTEL_AVX1)
@ -13030,7 +13022,7 @@ int wc_AesXtsEncryptUpdate(XtsAes* xaes, byte* out, const byte* in, word32 sz,
RESTORE_VECTOR_REGISTERS(); RESTORE_VECTOR_REGISTERS();
} }
else else
#endif /* 0 && defined(WOLFSSL_AESNI) */ #endif /* WOLFSSL_AESNI */
{ {
ret = AesXtsEncryptUpdate_sw(xaes, out, in, sz, i); ret = AesXtsEncryptUpdate_sw(xaes, out, in, sz, i);
} }
@ -13171,11 +13163,6 @@ static int AesXtsDecrypt_sw(XtsAes* xaes, byte* out, const byte* in, word32 sz,
#ifdef WOLFSSL_AESXTS_STREAM #ifdef WOLFSSL_AESXTS_STREAM
static int AesXtsDecryptStart_sw(XtsAes* xaes, byte* i)
{
return wc_AesEncryptDirect(&xaes->tweak, i, i);
}
/* Block-streaming AES-XTS. /* Block-streaming AES-XTS.
* *
* Same process as encryption but use decrypt key. * Same process as encryption but use decrypt key.
@ -13402,7 +13389,7 @@ int wc_AesXtsDecrypt(XtsAes* xaes, byte* out, const byte* in, word32 sz,
* *
* returns 0 on success * returns 0 on success
*/ */
int wc_AesXtsDecryptStart(XtsAes* xaes, byte* i, word32 iSz) int wc_AesXtsDecryptInit(XtsAes* xaes, byte* i, word32 iSz)
{ {
int ret; int ret;
Aes *aes; Aes *aes;
@ -13427,30 +13414,28 @@ int wc_AesXtsDecryptStart(XtsAes* xaes, byte* i, word32 iSz)
} }
{ {
#if 0 && defined(WOLFSSL_AESNI) #ifdef WOLFSSL_AESNI
if (aes->use_aesni) { if (aes->use_aesni) {
SAVE_VECTOR_REGISTERS(return _svr_ret;); SAVE_VECTOR_REGISTERS(return _svr_ret;);
#if defined(HAVE_INTEL_AVX1) #if defined(HAVE_INTEL_AVX1)
if (IS_INTEL_AVX1(intel_flags)) { if (IS_INTEL_AVX1(intel_flags)) {
AES_XTS_decrypt_start_avx1(i, AES_XTS_init_avx1(i, (const byte*)xaes->tweak.key,
(const byte*)xaes->tweak.key,
(int)xaes->tweak.rounds); (int)xaes->tweak.rounds);
ret = 0; ret = 0;
} }
else else
#endif #endif
{ {
AES_XTS_decrypt_start_aesni(i, AES_XTS_init_aesni(i, (const byte*)xaes->tweak.key,
(const byte*)xaes->tweak.key,
(int)xaes->tweak.rounds); (int)xaes->tweak.rounds);
ret = 0; ret = 0;
} }
RESTORE_VECTOR_REGISTERS(); RESTORE_VECTOR_REGISTERS();
} }
else else
#endif /* 0 && defined(WOLFSSL_AESNI) */ #endif /* WOLFSSL_AESNI */
{ {
ret = AesXtsDecryptStart_sw(xaes, i); ret = AesXtsInit_sw(xaes, i);
} }
} }
@ -13472,7 +13457,7 @@ int wc_AesXtsDecryptUpdate(XtsAes* xaes, byte* out, const byte* in, word32 sz,
byte *i) byte *i)
{ {
int ret; int ret;
#if 0 && defined(WOLFSSL_AESNI) #ifdef WOLFSSL_AESNI
Aes *aes; Aes *aes;
#endif #endif
@ -13480,7 +13465,7 @@ int wc_AesXtsDecryptUpdate(XtsAes* xaes, byte* out, const byte* in, word32 sz,
return BAD_FUNC_ARG; return BAD_FUNC_ARG;
} }
#if 0 && defined(WOLFSSL_AESNI) #ifdef WOLFSSL_AESNI
#ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS #ifdef WC_AES_XTS_SUPPORT_SIMULTANEOUS_ENC_AND_DEC_KEYS
aes = &xaes->aes_decrypt; aes = &xaes->aes_decrypt;
#else #else
@ -13494,7 +13479,7 @@ int wc_AesXtsDecryptUpdate(XtsAes* xaes, byte* out, const byte* in, word32 sz,
} }
{ {
#if 0 && defined(WOLFSSL_AESNI) #ifdef WOLFSSL_AESNI
if (aes->use_aesni) { if (aes->use_aesni) {
SAVE_VECTOR_REGISTERS(return _svr_ret;); SAVE_VECTOR_REGISTERS(return _svr_ret;);
#if defined(HAVE_INTEL_AVX1) #if defined(HAVE_INTEL_AVX1)
@ -13517,7 +13502,7 @@ int wc_AesXtsDecryptUpdate(XtsAes* xaes, byte* out, const byte* in, word32 sz,
RESTORE_VECTOR_REGISTERS(); RESTORE_VECTOR_REGISTERS();
} }
else else
#endif /* 0 && defined(WOLFSSL_AESNI) */ #endif /* WOLFSSL_AESNI */
{ {
ret = AesXtsDecryptUpdate_sw(xaes, out, in, sz, i); ret = AesXtsDecryptUpdate_sw(xaes, out, in, sz, i);
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -671,9 +671,9 @@ WOLFSSL_API int wc_AesXtsDecryptConsecutiveSectors(XtsAes* aes,
#ifdef WOLFSSL_AESXTS_STREAM #ifdef WOLFSSL_AESXTS_STREAM
WOLFSSL_API int wc_AesXtsEncryptStart(XtsAes* aes, byte* i, word32 iSz); WOLFSSL_API int wc_AesXtsEncryptInit(XtsAes* aes, byte* i, word32 iSz);
WOLFSSL_API int wc_AesXtsDecryptStart(XtsAes* aes, byte* i, word32 iSz); WOLFSSL_API int wc_AesXtsDecryptInit(XtsAes* aes, byte* i, word32 iSz);
WOLFSSL_API int wc_AesXtsEncryptUpdate(XtsAes* aes, byte* out, WOLFSSL_API int wc_AesXtsEncryptUpdate(XtsAes* aes, byte* out,
const byte* in, word32 sz, byte *i); const byte* in, word32 sz, byte *i);