mirror of https://github.com/wolfSSL/wolfssl.git
linuxkm/linuxkm_wc_port.h: add #error if the user tries to use the kernel crypto fuzzer with FIPS AES-XTS (kernel bug).
src/internal.c: fix shiftTooManyBitsSigned in DefTicketEncCb(). tests/api/test_sha256.c and wolfssl/wolfcrypt/sha256.h: gate raw transform APIs (wc_Sha256Transform(), wc_Sha256FinalRaw()) and tests on !defined(WOLFSSL_KCAPI_HASH) && !defined(WOLFSSL_AFALG_HASH). move enum wc_HashFlags from wolfssl/wolfcrypt/hash.h to wolfssl/wolfcrypt/types.h to resolve circular dependency detected by cross-armv7m-armasm-thumb-fips-140-3-dev-sp-asm-all-crypto-only. add FIPS_VERSION_GE(7,0) gates to new null-arg tests in test_wc_Shake{128,256}_*(). optimize ByteReverseWords() for cases where only one operand is unaligned, and add correct handling of unaligned data in ByteReverseWords64() to resolve unaligned access sanitizer report in cross-aarch64_be-all-sp-asm-unittest-sanitizer.pull/8512/head
parent
0a6a8516f9
commit
f7ddc49487
|
@ -30,6 +30,11 @@
|
||||||
#error Unsupported kernel.
|
#error Unsupported kernel.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(HAVE_FIPS) && defined(LINUXKM_LKCAPI_REGISTER_AESXTS) && defined(CONFIG_CRYPTO_MANAGER_EXTRA_TESTS)
|
||||||
|
/* CONFIG_CRYPTO_MANAGER_EXTRA_TESTS expects AES-XTS-384 to work, even when CONFIG_CRYPTO_FIPS, but FIPS 140-3 only allows AES-XTS-256 and AES-XTS-512. */
|
||||||
|
#error CONFIG_CRYPTO_MANAGER_EXTRA_TESTS is incompatible with FIPS wolfCrypt AES-XTS -- please reconfigure the target kernel to disable CONFIG_CRYPTO_MANAGER_EXTRA_TESTS.
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#ifndef PACKAGE_NAME
|
#ifndef PACKAGE_NAME
|
||||||
#error wc_port.h included before config.h
|
#error wc_port.h included before config.h
|
||||||
|
|
|
@ -41793,7 +41793,7 @@ static int DefTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ],
|
||||||
ret = args->lastErr;
|
ret = args->lastErr;
|
||||||
args->lastErr = 0; /* reset */
|
args->lastErr = 0; /* reset */
|
||||||
/* On error 'ret' will be negative */
|
/* On error 'ret' will be negative */
|
||||||
mask = (byte)((ret >> ((sizeof(ret) * 8) - 1)) & 0xFF) - 1;
|
mask = (byte)(((unsigned int)ret >> ((sizeof(ret) * 8) - 1)) - 1);
|
||||||
|
|
||||||
/* build PreMasterSecret */
|
/* build PreMasterSecret */
|
||||||
ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
|
ssl->arrays->preMasterSecret[0] = ssl->chVersion.major;
|
||||||
|
|
|
@ -202,6 +202,7 @@ int test_wc_Sha256Transform(void)
|
||||||
{
|
{
|
||||||
EXPECT_DECLS;
|
EXPECT_DECLS;
|
||||||
#if !defined(NO_SHA256) && (defined(OPENSSL_EXTRA) || defined(HAVE_CURL)) && \
|
#if !defined(NO_SHA256) && (defined(OPENSSL_EXTRA) || defined(HAVE_CURL)) && \
|
||||||
|
!defined(WOLFSSL_KCAPI_HASH) && !defined(WOLFSSL_AFALG_HASH) && \
|
||||||
!defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
|
!defined(HAVE_SELFTEST) && (!defined(HAVE_FIPS) || \
|
||||||
(defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 3)))
|
(defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 3)))
|
||||||
DIGEST_TRANSFORM_FINAL_RAW_TEST(wc_Sha256, Sha256, SHA256,
|
DIGEST_TRANSFORM_FINAL_RAW_TEST(wc_Sha256, Sha256, SHA256,
|
||||||
|
|
|
@ -861,6 +861,7 @@ int test_wc_Shake128_Absorb(void)
|
||||||
|
|
||||||
ExpectIntEQ(wc_InitShake128(&shake128, HEAP_HINT, INVALID_DEVID), 0);
|
ExpectIntEQ(wc_InitShake128(&shake128, HEAP_HINT, INVALID_DEVID), 0);
|
||||||
|
|
||||||
|
#if !defined(HAVE_FIPS) || FIPS_VERSION_GE(7,0)
|
||||||
ExpectIntEQ(wc_Shake128_Absorb(NULL , NULL , 1),
|
ExpectIntEQ(wc_Shake128_Absorb(NULL , NULL , 1),
|
||||||
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
|
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
|
||||||
ExpectIntEQ(wc_Shake128_Absorb(&shake128, NULL , 1),
|
ExpectIntEQ(wc_Shake128_Absorb(&shake128, NULL , 1),
|
||||||
|
@ -869,6 +870,8 @@ int test_wc_Shake128_Absorb(void)
|
||||||
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
|
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
|
||||||
|
|
||||||
ExpectIntEQ(wc_Shake128_Absorb(&shake128, NULL, 0), 0);
|
ExpectIntEQ(wc_Shake128_Absorb(&shake128, NULL, 0), 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
ExpectIntEQ(wc_Shake128_Absorb(&shake128, (byte*)"a", 1), 0);
|
ExpectIntEQ(wc_Shake128_Absorb(&shake128, (byte*)"a", 1), 0);
|
||||||
|
|
||||||
wc_Shake128_Free(&shake128);
|
wc_Shake128_Free(&shake128);
|
||||||
|
@ -885,6 +888,7 @@ int test_wc_Shake128_SqueezeBlocks(void)
|
||||||
|
|
||||||
ExpectIntEQ(wc_InitShake128(&shake128, HEAP_HINT, INVALID_DEVID), 0);
|
ExpectIntEQ(wc_InitShake128(&shake128, HEAP_HINT, INVALID_DEVID), 0);
|
||||||
|
|
||||||
|
#if !defined(HAVE_FIPS) || FIPS_VERSION_GE(7,0)
|
||||||
ExpectIntEQ(wc_Shake128_SqueezeBlocks(NULL , NULL, 1),
|
ExpectIntEQ(wc_Shake128_SqueezeBlocks(NULL , NULL, 1),
|
||||||
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
|
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
|
||||||
ExpectIntEQ(wc_Shake128_SqueezeBlocks(&shake128, NULL, 1),
|
ExpectIntEQ(wc_Shake128_SqueezeBlocks(&shake128, NULL, 1),
|
||||||
|
@ -893,6 +897,7 @@ int test_wc_Shake128_SqueezeBlocks(void)
|
||||||
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
|
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
|
||||||
|
|
||||||
ExpectIntEQ(wc_Shake128_SqueezeBlocks(&shake128, NULL, 0), 0);
|
ExpectIntEQ(wc_Shake128_SqueezeBlocks(&shake128, NULL, 0), 0);
|
||||||
|
#endif
|
||||||
ExpectIntEQ(wc_Shake128_SqueezeBlocks(&shake128, hash, 1), 0);
|
ExpectIntEQ(wc_Shake128_SqueezeBlocks(&shake128, hash, 1), 0);
|
||||||
|
|
||||||
wc_Shake128_Free(&shake128);
|
wc_Shake128_Free(&shake128);
|
||||||
|
@ -1281,6 +1286,7 @@ int test_wc_Shake256_Absorb(void)
|
||||||
|
|
||||||
ExpectIntEQ(wc_InitShake256(&shake256, HEAP_HINT, INVALID_DEVID), 0);
|
ExpectIntEQ(wc_InitShake256(&shake256, HEAP_HINT, INVALID_DEVID), 0);
|
||||||
|
|
||||||
|
#if !defined(HAVE_FIPS) || FIPS_VERSION_GE(7,0)
|
||||||
ExpectIntEQ(wc_Shake256_Absorb(NULL , NULL , 1),
|
ExpectIntEQ(wc_Shake256_Absorb(NULL , NULL , 1),
|
||||||
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
|
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
|
||||||
ExpectIntEQ(wc_Shake256_Absorb(&shake256, NULL , 1),
|
ExpectIntEQ(wc_Shake256_Absorb(&shake256, NULL , 1),
|
||||||
|
@ -1289,6 +1295,7 @@ int test_wc_Shake256_Absorb(void)
|
||||||
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
|
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
|
||||||
|
|
||||||
ExpectIntEQ(wc_Shake256_Absorb(&shake256, NULL, 0), 0);
|
ExpectIntEQ(wc_Shake256_Absorb(&shake256, NULL, 0), 0);
|
||||||
|
#endif
|
||||||
ExpectIntEQ(wc_Shake256_Absorb(&shake256, (byte*)"a", 1), 0);
|
ExpectIntEQ(wc_Shake256_Absorb(&shake256, (byte*)"a", 1), 0);
|
||||||
|
|
||||||
wc_Shake256_Free(&shake256);
|
wc_Shake256_Free(&shake256);
|
||||||
|
@ -1305,6 +1312,7 @@ int test_wc_Shake256_SqueezeBlocks(void)
|
||||||
|
|
||||||
ExpectIntEQ(wc_InitShake256(&shake256, HEAP_HINT, INVALID_DEVID), 0);
|
ExpectIntEQ(wc_InitShake256(&shake256, HEAP_HINT, INVALID_DEVID), 0);
|
||||||
|
|
||||||
|
#if !defined(HAVE_FIPS) || FIPS_VERSION_GE(7,0)
|
||||||
ExpectIntEQ(wc_Shake256_SqueezeBlocks(NULL , NULL, 1),
|
ExpectIntEQ(wc_Shake256_SqueezeBlocks(NULL , NULL, 1),
|
||||||
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
|
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
|
||||||
ExpectIntEQ(wc_Shake256_SqueezeBlocks(&shake256, NULL, 1),
|
ExpectIntEQ(wc_Shake256_SqueezeBlocks(&shake256, NULL, 1),
|
||||||
|
@ -1313,6 +1321,7 @@ int test_wc_Shake256_SqueezeBlocks(void)
|
||||||
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
|
WC_NO_ERR_TRACE(BAD_FUNC_ARG));
|
||||||
|
|
||||||
ExpectIntEQ(wc_Shake256_SqueezeBlocks(&shake256, NULL, 0), 0);
|
ExpectIntEQ(wc_Shake256_SqueezeBlocks(&shake256, NULL, 0), 0);
|
||||||
|
#endif
|
||||||
ExpectIntEQ(wc_Shake256_SqueezeBlocks(&shake256, hash, 1), 0);
|
ExpectIntEQ(wc_Shake256_SqueezeBlocks(&shake256, hash, 1), 0);
|
||||||
|
|
||||||
wc_Shake256_Free(&shake256);
|
wc_Shake256_Free(&shake256);
|
||||||
|
|
|
@ -189,6 +189,28 @@ WC_MISC_STATIC WC_INLINE void ByteReverseWords(word32* out, const word32* in,
|
||||||
out[i] = ByteReverseWord32(in[i]);
|
out[i] = ByteReverseWord32(in[i]);
|
||||||
}
|
}
|
||||||
#ifdef WOLFSSL_USE_ALIGN
|
#ifdef WOLFSSL_USE_ALIGN
|
||||||
|
else if (((size_t)in & 0x3) == 0) {
|
||||||
|
byte *out_bytes = (byte *)out;
|
||||||
|
word32 scratch;
|
||||||
|
|
||||||
|
byteCount &= ~0x3U;
|
||||||
|
|
||||||
|
for (i = 0; i < byteCount; i += (word32)sizeof(word32)) {
|
||||||
|
scratch = ByteReverseWord32(*in++);
|
||||||
|
XMEMCPY(out_bytes + i, &scratch, sizeof(scratch));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (((size_t)out & 0x3) == 0) {
|
||||||
|
byte *in_bytes = (byte *)in;
|
||||||
|
word32 scratch;
|
||||||
|
|
||||||
|
byteCount &= ~0x3U;
|
||||||
|
|
||||||
|
for (i = 0; i < byteCount; i += (word32)sizeof(word32)) {
|
||||||
|
XMEMCPY(&scratch, in_bytes + i, sizeof(scratch));
|
||||||
|
*out++ = ByteReverseWord32(scratch);
|
||||||
|
}
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
byte *in_bytes = (byte *)in;
|
byte *in_bytes = (byte *)in;
|
||||||
byte *out_bytes = (byte *)out;
|
byte *out_bytes = (byte *)out;
|
||||||
|
@ -335,9 +357,51 @@ WC_MISC_STATIC WC_INLINE void ByteReverseWords64(word64* out, const word64* in,
|
||||||
{
|
{
|
||||||
word32 count = byteCount/(word32)sizeof(word64), i;
|
word32 count = byteCount/(word32)sizeof(word64), i;
|
||||||
|
|
||||||
for (i = 0; i < count; i++)
|
#ifdef WOLFSSL_USE_ALIGN
|
||||||
out[i] = ByteReverseWord64(in[i]);
|
if ((((size_t)in & 0x7) == 0) &&
|
||||||
|
(((size_t)out & 0x7) == 0))
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
out[i] = ByteReverseWord64(in[i]);
|
||||||
|
}
|
||||||
|
#ifdef WOLFSSL_USE_ALIGN
|
||||||
|
else if (((size_t)in & 0x7) == 0) {
|
||||||
|
byte *out_bytes = (byte *)out;
|
||||||
|
word64 scratch;
|
||||||
|
|
||||||
|
byteCount &= ~0x7U;
|
||||||
|
|
||||||
|
for (i = 0; i < byteCount; i += (word32)sizeof(word64)) {
|
||||||
|
scratch = ByteReverseWord64(*in++);
|
||||||
|
XMEMCPY(out_bytes + i, &scratch, sizeof(scratch));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (((size_t)out & 0x7) == 0) {
|
||||||
|
byte *in_bytes = (byte *)in;
|
||||||
|
word64 scratch;
|
||||||
|
|
||||||
|
byteCount &= ~0x7U;
|
||||||
|
|
||||||
|
for (i = 0; i < byteCount; i += (word32)sizeof(word64)) {
|
||||||
|
XMEMCPY(&scratch, in_bytes + i, sizeof(scratch));
|
||||||
|
*out++ = ByteReverseWord64(scratch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
byte *in_bytes = (byte *)in;
|
||||||
|
byte *out_bytes = (byte *)out;
|
||||||
|
word64 scratch;
|
||||||
|
|
||||||
|
byteCount &= ~0x7U;
|
||||||
|
|
||||||
|
for (i = 0; i < byteCount; i += (word32)sizeof(word64)) {
|
||||||
|
XMEMCPY(&scratch, in_bytes + i, sizeof(scratch));
|
||||||
|
scratch = ByteReverseWord64(scratch);
|
||||||
|
XMEMCPY(out_bytes + i, &scratch, sizeof(scratch));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* WORD64_AVAILABLE && !WOLFSSL_NO_WORD64_OPS */
|
#endif /* WORD64_AVAILABLE && !WOLFSSL_NO_WORD64_OPS */
|
||||||
|
|
|
@ -83,16 +83,6 @@ enum wc_MACAlgorithm {
|
||||||
sm3_mac
|
sm3_mac
|
||||||
};
|
};
|
||||||
|
|
||||||
enum wc_HashFlags {
|
|
||||||
WC_HASH_FLAG_NONE = 0x00000000,
|
|
||||||
WC_HASH_FLAG_WILLCOPY = 0x00000001, /* flag to indicate hash will be copied */
|
|
||||||
WC_HASH_FLAG_ISCOPY = 0x00000002, /* hash is copy */
|
|
||||||
#ifdef WOLFSSL_SHA3
|
|
||||||
WC_HASH_SHA3_KECCAK256 =0x00010000, /* Older KECCAK256 */
|
|
||||||
#endif
|
|
||||||
WOLF_ENUM_DUMMY_LAST_ELEMENT(WC_HASH)
|
|
||||||
};
|
|
||||||
|
|
||||||
/* hash union */
|
/* hash union */
|
||||||
typedef union {
|
typedef union {
|
||||||
#ifndef NO_MD5
|
#ifndef NO_MD5
|
||||||
|
|
|
@ -264,10 +264,14 @@ struct wc_Sha256 {
|
||||||
WOLFSSL_API int wc_InitSha256(wc_Sha256* sha);
|
WOLFSSL_API int wc_InitSha256(wc_Sha256* sha);
|
||||||
WOLFSSL_API int wc_InitSha256_ex(wc_Sha256* sha, void* heap, int devId);
|
WOLFSSL_API int wc_InitSha256_ex(wc_Sha256* sha, void* heap, int devId);
|
||||||
WOLFSSL_API int wc_Sha256Update(wc_Sha256* sha, const byte* data, word32 len);
|
WOLFSSL_API int wc_Sha256Update(wc_Sha256* sha, const byte* data, word32 len);
|
||||||
|
|
||||||
|
#if !defined(WOLFSSL_KCAPI_HASH) && !defined(WOLFSSL_AFALG_HASH)
|
||||||
WOLFSSL_API int wc_Sha256FinalRaw(wc_Sha256* sha256, byte* hash);
|
WOLFSSL_API int wc_Sha256FinalRaw(wc_Sha256* sha256, byte* hash);
|
||||||
|
#endif
|
||||||
WOLFSSL_API int wc_Sha256Final(wc_Sha256* sha256, byte* hash);
|
WOLFSSL_API int wc_Sha256Final(wc_Sha256* sha256, byte* hash);
|
||||||
WOLFSSL_API void wc_Sha256Free(wc_Sha256* sha256);
|
WOLFSSL_API void wc_Sha256Free(wc_Sha256* sha256);
|
||||||
#if defined(OPENSSL_EXTRA) || defined(HAVE_CURL)
|
#if (defined(OPENSSL_EXTRA) || defined(HAVE_CURL)) && \
|
||||||
|
!defined(WOLFSSL_KCAPI_HASH) && !defined(WOLFSSL_AFALG_HASH)
|
||||||
WOLFSSL_API int wc_Sha256Transform(wc_Sha256* sha, const unsigned char* data);
|
WOLFSSL_API int wc_Sha256Transform(wc_Sha256* sha, const unsigned char* data);
|
||||||
#endif
|
#endif
|
||||||
#if defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_LMS_FULL_HASH)
|
#if defined(WOLFSSL_HAVE_LMS) && !defined(WOLFSSL_LMS_FULL_HASH)
|
||||||
|
|
|
@ -1247,6 +1247,16 @@ typedef struct w64wrapper {
|
||||||
#endif /* HAVE_SELFTEST */
|
#endif /* HAVE_SELFTEST */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum wc_HashFlags {
|
||||||
|
WC_HASH_FLAG_NONE = 0x00000000,
|
||||||
|
WC_HASH_FLAG_WILLCOPY = 0x00000001, /* flag to indicate hash will be copied */
|
||||||
|
WC_HASH_FLAG_ISCOPY = 0x00000002, /* hash is copy */
|
||||||
|
#ifdef WOLFSSL_SHA3
|
||||||
|
WC_HASH_SHA3_KECCAK256 =0x00010000, /* Older KECCAK256 */
|
||||||
|
#endif
|
||||||
|
WOLF_ENUM_DUMMY_LAST_ELEMENT(WC_HASH)
|
||||||
|
};
|
||||||
|
|
||||||
/* cipher types */
|
/* cipher types */
|
||||||
enum wc_CipherType {
|
enum wc_CipherType {
|
||||||
WC_CIPHER_NONE = 0,
|
WC_CIPHER_NONE = 0,
|
||||||
|
|
Loading…
Reference in New Issue