Add ABI tests for ChaCha20_ctr32.
Change-Id: I1fad7f954284000474e5723c3fa59fedceb52ad4 Reviewed-on: https://boringssl-review.googlesource.com/c/34186 Commit-Queue: Adam Langley <agl@google.com> Reviewed-by: Adam Langley <agl@google.com>
This commit is contained in:
parent
5e350d13f5
commit
b2f56f9283
@ -228,6 +228,7 @@ $code.=<<___;
|
|||||||
.type ChaCha20_ctr32,\@function,5
|
.type ChaCha20_ctr32,\@function,5
|
||||||
.align 64
|
.align 64
|
||||||
ChaCha20_ctr32:
|
ChaCha20_ctr32:
|
||||||
|
.cfi_startproc
|
||||||
cmp \$0,$len
|
cmp \$0,$len
|
||||||
je .Lno_data
|
je .Lno_data
|
||||||
mov OPENSSL_ia32cap_P+4(%rip),%r10
|
mov OPENSSL_ia32cap_P+4(%rip),%r10
|
||||||
@ -241,12 +242,19 @@ $code.=<<___;
|
|||||||
jnz .LChaCha20_ssse3
|
jnz .LChaCha20_ssse3
|
||||||
|
|
||||||
push %rbx
|
push %rbx
|
||||||
|
.cfi_push rbx
|
||||||
push %rbp
|
push %rbp
|
||||||
|
.cfi_push rbp
|
||||||
push %r12
|
push %r12
|
||||||
|
.cfi_push r12
|
||||||
push %r13
|
push %r13
|
||||||
|
.cfi_push r13
|
||||||
push %r14
|
push %r14
|
||||||
|
.cfi_push r14
|
||||||
push %r15
|
push %r15
|
||||||
|
.cfi_push r15
|
||||||
sub \$64+24,%rsp
|
sub \$64+24,%rsp
|
||||||
|
.cfi_adjust_cfa_offset `64+24`
|
||||||
.Lctr32_body:
|
.Lctr32_body:
|
||||||
|
|
||||||
#movdqa .Lsigma(%rip),%xmm0
|
#movdqa .Lsigma(%rip),%xmm0
|
||||||
@ -388,14 +396,22 @@ $code.=<<___;
|
|||||||
.Ldone:
|
.Ldone:
|
||||||
lea 64+24+48(%rsp),%rsi
|
lea 64+24+48(%rsp),%rsi
|
||||||
mov -48(%rsi),%r15
|
mov -48(%rsi),%r15
|
||||||
|
.cfi_restore r15
|
||||||
mov -40(%rsi),%r14
|
mov -40(%rsi),%r14
|
||||||
|
.cfi_restore r14
|
||||||
mov -32(%rsi),%r13
|
mov -32(%rsi),%r13
|
||||||
|
.cfi_restore r13
|
||||||
mov -24(%rsi),%r12
|
mov -24(%rsi),%r12
|
||||||
|
.cfi_restore r12
|
||||||
mov -16(%rsi),%rbp
|
mov -16(%rsi),%rbp
|
||||||
|
.cfi_restore rbp
|
||||||
mov -8(%rsi),%rbx
|
mov -8(%rsi),%rbx
|
||||||
|
.cfi_restore rbx
|
||||||
lea (%rsi),%rsp
|
lea (%rsi),%rsp
|
||||||
|
.cfi_adjust_cfa_offset `-64-24-48`
|
||||||
.Lno_data:
|
.Lno_data:
|
||||||
ret
|
ret
|
||||||
|
.cfi_endproc
|
||||||
.size ChaCha20_ctr32,.-ChaCha20_ctr32
|
.size ChaCha20_ctr32,.-ChaCha20_ctr32
|
||||||
___
|
___
|
||||||
|
|
||||||
@ -435,7 +451,9 @@ $code.=<<___;
|
|||||||
.align 32
|
.align 32
|
||||||
ChaCha20_ssse3:
|
ChaCha20_ssse3:
|
||||||
.LChaCha20_ssse3:
|
.LChaCha20_ssse3:
|
||||||
|
.cfi_startproc
|
||||||
mov %rsp,%r9 # frame pointer
|
mov %rsp,%r9 # frame pointer
|
||||||
|
.cfi_def_cfa_register r9
|
||||||
___
|
___
|
||||||
$code.=<<___;
|
$code.=<<___;
|
||||||
cmp \$128,$len # we might throw away some data,
|
cmp \$128,$len # we might throw away some data,
|
||||||
@ -547,8 +565,10 @@ $code.=<<___ if ($win64);
|
|||||||
___
|
___
|
||||||
$code.=<<___;
|
$code.=<<___;
|
||||||
lea (%r9),%rsp
|
lea (%r9),%rsp
|
||||||
|
.cfi_def_cfa_register rsp
|
||||||
.Lssse3_epilogue:
|
.Lssse3_epilogue:
|
||||||
ret
|
ret
|
||||||
|
.cfi_endproc
|
||||||
.size ChaCha20_ssse3,.-ChaCha20_ssse3
|
.size ChaCha20_ssse3,.-ChaCha20_ssse3
|
||||||
___
|
___
|
||||||
}
|
}
|
||||||
@ -691,7 +711,9 @@ $code.=<<___;
|
|||||||
.align 32
|
.align 32
|
||||||
ChaCha20_4x:
|
ChaCha20_4x:
|
||||||
.LChaCha20_4x:
|
.LChaCha20_4x:
|
||||||
|
.cfi_startproc
|
||||||
mov %rsp,%r9 # frame pointer
|
mov %rsp,%r9 # frame pointer
|
||||||
|
.cfi_def_cfa_register r9
|
||||||
mov %r10,%r11
|
mov %r10,%r11
|
||||||
___
|
___
|
||||||
$code.=<<___ if ($avx>1);
|
$code.=<<___ if ($avx>1);
|
||||||
@ -1131,8 +1153,10 @@ $code.=<<___ if ($win64);
|
|||||||
___
|
___
|
||||||
$code.=<<___;
|
$code.=<<___;
|
||||||
lea (%r9),%rsp
|
lea (%r9),%rsp
|
||||||
|
.cfi_def_cfa_register rsp
|
||||||
.L4x_epilogue:
|
.L4x_epilogue:
|
||||||
ret
|
ret
|
||||||
|
.cfi_endproc
|
||||||
.size ChaCha20_4x,.-ChaCha20_4x
|
.size ChaCha20_4x,.-ChaCha20_4x
|
||||||
___
|
___
|
||||||
}
|
}
|
||||||
@ -1266,7 +1290,9 @@ $code.=<<___;
|
|||||||
.align 32
|
.align 32
|
||||||
ChaCha20_8x:
|
ChaCha20_8x:
|
||||||
.LChaCha20_8x:
|
.LChaCha20_8x:
|
||||||
|
.cfi_startproc
|
||||||
mov %rsp,%r9 # frame register
|
mov %rsp,%r9 # frame register
|
||||||
|
.cfi_def_cfa_register r9
|
||||||
sub \$0x280+$xframe,%rsp
|
sub \$0x280+$xframe,%rsp
|
||||||
and \$-32,%rsp
|
and \$-32,%rsp
|
||||||
___
|
___
|
||||||
@ -1772,8 +1798,10 @@ $code.=<<___ if ($win64);
|
|||||||
___
|
___
|
||||||
$code.=<<___;
|
$code.=<<___;
|
||||||
lea (%r9),%rsp
|
lea (%r9),%rsp
|
||||||
|
.cfi_def_cfa_register rsp
|
||||||
.L8x_epilogue:
|
.L8x_epilogue:
|
||||||
ret
|
ret
|
||||||
|
.cfi_endproc
|
||||||
.size ChaCha20_8x,.-ChaCha20_8x
|
.size ChaCha20_8x,.-ChaCha20_8x
|
||||||
___
|
___
|
||||||
}
|
}
|
||||||
@ -1811,7 +1839,9 @@ $code.=<<___;
|
|||||||
.align 32
|
.align 32
|
||||||
ChaCha20_avx512:
|
ChaCha20_avx512:
|
||||||
.LChaCha20_avx512:
|
.LChaCha20_avx512:
|
||||||
|
.cfi_startproc
|
||||||
mov %rsp,%r9 # frame pointer
|
mov %rsp,%r9 # frame pointer
|
||||||
|
.cfi_def_cfa_register r9
|
||||||
cmp \$512,$len
|
cmp \$512,$len
|
||||||
ja .LChaCha20_16x
|
ja .LChaCha20_16x
|
||||||
|
|
||||||
@ -1991,8 +2021,10 @@ $code.=<<___ if ($win64);
|
|||||||
___
|
___
|
||||||
$code.=<<___;
|
$code.=<<___;
|
||||||
lea (%r9),%rsp
|
lea (%r9),%rsp
|
||||||
|
.cfi_def_cfa_register rsp
|
||||||
.Lavx512_epilogue:
|
.Lavx512_epilogue:
|
||||||
ret
|
ret
|
||||||
|
.cfi_endproc
|
||||||
.size ChaCha20_avx512,.-ChaCha20_avx512
|
.size ChaCha20_avx512,.-ChaCha20_avx512
|
||||||
___
|
___
|
||||||
}
|
}
|
||||||
@ -2075,7 +2107,9 @@ $code.=<<___;
|
|||||||
.align 32
|
.align 32
|
||||||
ChaCha20_16x:
|
ChaCha20_16x:
|
||||||
.LChaCha20_16x:
|
.LChaCha20_16x:
|
||||||
|
.cfi_startproc
|
||||||
mov %rsp,%r9 # frame register
|
mov %rsp,%r9 # frame register
|
||||||
|
.cfi_def_cfa_register r9
|
||||||
sub \$64+$xframe,%rsp
|
sub \$64+$xframe,%rsp
|
||||||
and \$-64,%rsp
|
and \$-64,%rsp
|
||||||
___
|
___
|
||||||
@ -2493,8 +2527,10 @@ $code.=<<___ if ($win64);
|
|||||||
___
|
___
|
||||||
$code.=<<___;
|
$code.=<<___;
|
||||||
lea (%r9),%rsp
|
lea (%r9),%rsp
|
||||||
|
.cfi_def_cfa_register rsp
|
||||||
.L16x_epilogue:
|
.L16x_epilogue:
|
||||||
ret
|
ret
|
||||||
|
.cfi_endproc
|
||||||
.size ChaCha20_16x,.-ChaCha20_16x
|
.size ChaCha20_16x,.-ChaCha20_16x
|
||||||
___
|
___
|
||||||
}
|
}
|
||||||
|
@ -64,13 +64,7 @@ void CRYPTO_hchacha20(uint8_t out[32], const uint8_t key[32],
|
|||||||
OPENSSL_memcpy(&out[16], &x[12], sizeof(uint32_t) * 4);
|
OPENSSL_memcpy(&out[16], &x[12], sizeof(uint32_t) * 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(OPENSSL_NO_ASM) && \
|
#if defined(CHACHA20_ASM)
|
||||||
(defined(OPENSSL_X86) || defined(OPENSSL_X86_64) || \
|
|
||||||
defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64))
|
|
||||||
|
|
||||||
// ChaCha20_ctr32 is defined in asm/chacha-*.pl.
|
|
||||||
void ChaCha20_ctr32(uint8_t *out, const uint8_t *in, size_t in_len,
|
|
||||||
const uint32_t key[8], const uint32_t counter[4]);
|
|
||||||
|
|
||||||
void CRYPTO_chacha_20(uint8_t *out, const uint8_t *in, size_t in_len,
|
void CRYPTO_chacha_20(uint8_t *out, const uint8_t *in, size_t in_len,
|
||||||
const uint8_t key[32], const uint8_t nonce[12],
|
const uint8_t key[32], const uint8_t nonce[12],
|
||||||
|
@ -23,7 +23,9 @@
|
|||||||
#include <openssl/crypto.h>
|
#include <openssl/crypto.h>
|
||||||
#include <openssl/chacha.h>
|
#include <openssl/chacha.h>
|
||||||
|
|
||||||
|
#include "internal.h"
|
||||||
#include "../internal.h"
|
#include "../internal.h"
|
||||||
|
#include "../test/abi_test.h"
|
||||||
#include "../test/test_util.h"
|
#include "../test/test_util.h"
|
||||||
|
|
||||||
|
|
||||||
@ -234,3 +236,25 @@ TEST(ChaChaTest, TestVector) {
|
|||||||
EXPECT_EQ(Bytes(kOutput, len), Bytes(buf.get(), len));
|
EXPECT_EQ(Bytes(kOutput, len), Bytes(buf.get(), len));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(CHACHA20_ASM) && defined(SUPPORTS_ABI_TEST)
|
||||||
|
TEST(ChaChaTest, ABI) {
|
||||||
|
uint32_t key[8];
|
||||||
|
OPENSSL_memcpy(key, kKey, sizeof(key));
|
||||||
|
|
||||||
|
static const uint32_t kCounterNonce[4] = {0};
|
||||||
|
|
||||||
|
std::unique_ptr<uint8_t[]> buf(new uint8_t[sizeof(kInput)]);
|
||||||
|
for (size_t len = 0; len <= 32; len++) {
|
||||||
|
SCOPED_TRACE(len);
|
||||||
|
CHECK_ABI(ChaCha20_ctr32, buf.get(), kInput, len, key, kCounterNonce);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t len : {32 * 2, 32 * 4, 32 * 8, 32 * 16, 32 * 24}) {
|
||||||
|
SCOPED_TRACE(len);
|
||||||
|
CHECK_ABI(ChaCha20_ctr32, buf.get(), kInput, len, key, kCounterNonce);
|
||||||
|
// Cover the partial block paths.
|
||||||
|
CHECK_ABI(ChaCha20_ctr32, buf.get(), kInput, len + 15, key, kCounterNonce);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif // CHACHA20_ASM && SUPPORTS_ABI_TEST
|
||||||
|
@ -27,6 +27,16 @@ extern "C" {
|
|||||||
void CRYPTO_hchacha20(uint8_t out[32], const uint8_t key[32],
|
void CRYPTO_hchacha20(uint8_t out[32], const uint8_t key[32],
|
||||||
const uint8_t nonce[16]);
|
const uint8_t nonce[16]);
|
||||||
|
|
||||||
|
#if !defined(OPENSSL_NO_ASM) && \
|
||||||
|
(defined(OPENSSL_X86) || defined(OPENSSL_X86_64) || \
|
||||||
|
defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64))
|
||||||
|
#define CHACHA20_ASM
|
||||||
|
|
||||||
|
// ChaCha20_ctr32 is defined in asm/chacha-*.pl.
|
||||||
|
void ChaCha20_ctr32(uint8_t *out, const uint8_t *in, size_t in_len,
|
||||||
|
const uint32_t key[8], const uint32_t counter[4]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
} // extern C
|
} // extern C
|
||||||
|
Loading…
Reference in New Issue
Block a user