Skip to content

Commit f8f6619

Browse files
Merge pull request #6750 from SparkiDev/curve25519_thumb2_2
Curve25519/Ed25519: align buffers
2 parents 00a0837 + 90467aa commit f8f6619

15 files changed

Lines changed: 5458 additions & 1420 deletions

tests/api.c

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12494,6 +12494,7 @@ static int test_wc_Sha256Update(void)
1249412494
#ifndef NO_SHA256
1249512495
wc_Sha256 sha256;
1249612496
byte hash[WC_SHA256_DIGEST_SIZE];
12497+
byte hash_unaligned[WC_SHA256_DIGEST_SIZE+1];
1249712498
testVector a, b, c;
1249812499

1249912500
ExpectIntEQ(wc_InitSha256(&sha256), 0);
@@ -12517,6 +12518,11 @@ static int test_wc_Sha256Update(void)
1251712518
ExpectIntEQ(wc_Sha256Final(&sha256, hash), 0);
1251812519
ExpectIntEQ(XMEMCMP(hash, a.output, WC_SHA256_DIGEST_SIZE), 0);
1251912520

12521+
/* Unaligned check. */
12522+
ExpectIntEQ(wc_Sha256Update(&sha256, (byte*)a.input+1, (word32)a.inLen-1),
12523+
0);
12524+
ExpectIntEQ(wc_Sha256Final(&sha256, hash_unaligned + 1), 0);
12525+
1252012526
/* Try passing in bad values */
1252112527
b.input = NULL;
1252212528
b.inLen = 0;
@@ -12721,6 +12727,7 @@ static int test_wc_Sha512Update(void)
1272112727
#ifdef WOLFSSL_SHA512
1272212728
wc_Sha512 sha512;
1272312729
byte hash[WC_SHA512_DIGEST_SIZE];
12730+
byte hash_unaligned[WC_SHA512_DIGEST_SIZE + 1];
1272412731
testVector a, b, c;
1272512732

1272612733
ExpectIntEQ(wc_InitSha512(&sha512), 0);
@@ -12747,6 +12754,11 @@ static int test_wc_Sha512Update(void)
1274712754

1274812755
ExpectIntEQ(XMEMCMP(hash, a.output, WC_SHA512_DIGEST_SIZE), 0);
1274912756

12757+
/* Unaligned check. */
12758+
ExpectIntEQ(wc_Sha512Update(&sha512, (byte*)a.input+1, (word32)a.inLen-1),
12759+
0);
12760+
ExpectIntEQ(wc_Sha512Final(&sha512, hash_unaligned+1), 0);
12761+
1275012762
/* Try passing in bad values */
1275112763
b.input = NULL;
1275212764
b.inLen = 0;
@@ -20091,15 +20103,18 @@ static int test_wc_ed25519_make_key(void)
2009120103
#if defined(HAVE_ED25519) && defined(HAVE_ED25519_MAKE_KEY)
2009220104
ed25519_key key;
2009320105
WC_RNG rng;
20094-
unsigned char pubkey[ED25519_PUB_KEY_SIZE];
20106+
unsigned char pubkey[ED25519_PUB_KEY_SIZE+1];
20107+
int pubkey_sz = ED25519_PUB_KEY_SIZE;
2009520108

2009620109
XMEMSET(&key, 0, sizeof(ed25519_key));
2009720110
XMEMSET(&rng, 0, sizeof(WC_RNG));
2009820111

2009920112
ExpectIntEQ(wc_ed25519_init(&key), 0);
2010020113
ExpectIntEQ(wc_InitRng(&rng), 0);
2010120114

20102-
ExpectIntEQ(wc_ed25519_make_public(&key, pubkey, sizeof(pubkey)),
20115+
ExpectIntEQ(wc_ed25519_make_public(&key, pubkey, pubkey_sz),
20116+
ECC_PRIV_KEY_E);
20117+
ExpectIntEQ(wc_ed25519_make_public(&key, pubkey+1, pubkey_sz),
2010320118
ECC_PRIV_KEY_E);
2010420119
ExpectIntEQ(wc_ed25519_make_key(&rng, ED25519_KEY_SIZE, &key), 0);
2010520120

@@ -20149,18 +20164,18 @@ static int test_wc_ed25519_sign_msg(void)
2014920164
WC_RNG rng;
2015020165
ed25519_key key;
2015120166
byte msg[] = "Everybody gets Friday off.\n";
20152-
byte sig[ED25519_SIG_SIZE];
20167+
byte sig[ED25519_SIG_SIZE+1];
2015320168
word32 msglen = sizeof(msg);
20154-
word32 siglen = sizeof(sig);
20155-
word32 badSigLen = sizeof(sig) - 1;
20169+
word32 siglen = ED25519_SIG_SIZE;
20170+
word32 badSigLen = ED25519_SIG_SIZE - 1;
2015620171
#ifdef HAVE_ED25519_VERIFY
2015720172
int verify_ok = 0; /*1 = Verify success.*/
2015820173
#endif
2015920174

2016020175
/* Initialize stack variables. */
2016120176
XMEMSET(&key, 0, sizeof(ed25519_key));
2016220177
XMEMSET(&rng, 0, sizeof(WC_RNG));
20163-
XMEMSET(sig, 0, siglen);
20178+
XMEMSET(sig, 0, sizeof(sig));
2016420179

2016520180
/* Initialize key. */
2016620181
ExpectIntEQ(wc_ed25519_init(&key), 0);
@@ -20169,6 +20184,8 @@ static int test_wc_ed25519_sign_msg(void)
2016920184

2017020185
ExpectIntEQ(wc_ed25519_sign_msg(msg, msglen, sig, &siglen, &key), 0);
2017120186
ExpectIntEQ(siglen, ED25519_SIG_SIZE);
20187+
ExpectIntEQ(wc_ed25519_sign_msg(msg, msglen, sig+1, &siglen, &key), 0);
20188+
ExpectIntEQ(siglen, ED25519_SIG_SIZE);
2017220189

2017320190
/* Test bad args. */
2017420191
ExpectIntEQ(wc_ed25519_sign_msg(NULL, msglen, sig, &siglen, &key),
@@ -20185,24 +20202,24 @@ static int test_wc_ed25519_sign_msg(void)
2018520202
badSigLen -= 1;
2018620203

2018720204
#ifdef HAVE_ED25519_VERIFY
20188-
ExpectIntEQ(wc_ed25519_verify_msg(sig, siglen, msg, msglen, &verify_ok,
20205+
ExpectIntEQ(wc_ed25519_verify_msg(sig+1, siglen, msg, msglen, &verify_ok,
2018920206
&key), 0);
2019020207
ExpectIntEQ(verify_ok, 1);
2019120208

2019220209
/* Test bad args. */
20193-
ExpectIntEQ(wc_ed25519_verify_msg(sig, siglen - 1, msg, msglen, &verify_ok,
20194-
&key), BAD_FUNC_ARG);
20195-
ExpectIntEQ(wc_ed25519_verify_msg(sig, siglen + 1, msg, msglen, &verify_ok,
20196-
&key), BAD_FUNC_ARG);
20210+
ExpectIntEQ(wc_ed25519_verify_msg(sig+1, siglen - 1, msg, msglen,
20211+
&verify_ok, &key), BAD_FUNC_ARG);
20212+
ExpectIntEQ(wc_ed25519_verify_msg(sig+1, siglen + 1, msg, msglen,
20213+
&verify_ok, &key), BAD_FUNC_ARG);
2019720214
ExpectIntEQ(wc_ed25519_verify_msg(NULL, siglen, msg, msglen, &verify_ok,
2019820215
&key), BAD_FUNC_ARG);
20199-
ExpectIntEQ(wc_ed25519_verify_msg(sig, siglen, NULL, msglen, &verify_ok,
20216+
ExpectIntEQ(wc_ed25519_verify_msg(sig+1, siglen, NULL, msglen, &verify_ok,
2020020217
&key), BAD_FUNC_ARG);
20201-
ExpectIntEQ(wc_ed25519_verify_msg(sig, siglen, msg, msglen, NULL, &key),
20218+
ExpectIntEQ(wc_ed25519_verify_msg(sig+1, siglen, msg, msglen, NULL, &key),
2020220219
BAD_FUNC_ARG);
20203-
ExpectIntEQ(wc_ed25519_verify_msg(sig, siglen, msg, msglen, &verify_ok,
20220+
ExpectIntEQ(wc_ed25519_verify_msg(sig+1, siglen, msg, msglen, &verify_ok,
2020420221
NULL), BAD_FUNC_ARG);
20205-
ExpectIntEQ(wc_ed25519_verify_msg(sig, badSigLen, msg, msglen, &verify_ok,
20222+
ExpectIntEQ(wc_ed25519_verify_msg(sig+1, badSigLen, msg, msglen, &verify_ok,
2020620223
&key), BAD_FUNC_ARG);
2020720224
#endif /* Verify. */
2020820225

wolfcrypt/src/asn.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33810,7 +33810,7 @@ int wc_Ed25519PrivateKeyDecode(const byte* input, word32* inOutIdx,
3381033810
ed25519_key* key, word32 inSz)
3381133811
{
3381233812
int ret;
33813-
byte privKey[ED25519_KEY_SIZE], pubKey[ED25519_PUB_KEY_SIZE];
33813+
byte privKey[ED25519_KEY_SIZE], pubKey[2*ED25519_PUB_KEY_SIZE+1];
3381433814
word32 privKeyLen = (word32)sizeof(privKey);
3381533815
word32 pubKeyLen = (word32)sizeof(pubKey);
3381633816

@@ -33836,7 +33836,7 @@ int wc_Ed25519PublicKeyDecode(const byte* input, word32* inOutIdx,
3383633836
ed25519_key* key, word32 inSz)
3383733837
{
3383833838
int ret;
33839-
byte pubKey[ED25519_PUB_KEY_SIZE];
33839+
byte pubKey[2*ED25519_PUB_KEY_SIZE+1];
3384033840
word32 pubKeyLen = (word32)sizeof(pubKey);
3384133841

3384233842
if (input == NULL || inOutIdx == NULL || key == NULL || inSz == 0) {
@@ -34127,7 +34127,7 @@ int wc_Ed448PublicKeyDecode(const byte* input, word32* inOutIdx,
3412734127
ed448_key* key, word32 inSz)
3412834128
{
3412934129
int ret;
34130-
byte pubKey[ED448_PUB_KEY_SIZE];
34130+
byte pubKey[2 * ED448_PUB_KEY_SIZE + 1];
3413134131
word32 pubKeyLen = (word32)sizeof(pubKey);
3413234132

3413334133
if (input == NULL || inOutIdx == NULL || key == NULL || inSz == 0) {

wolfcrypt/src/ed25519.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ int wc_ed25519_make_public(ed25519_key* key, unsigned char* pubKey,
187187
word32 pubKeySz)
188188
{
189189
int ret = 0;
190-
byte az[ED25519_PRV_KEY_SIZE];
190+
ALIGN16 byte az[ED25519_PRV_KEY_SIZE];
191191
#if !defined(FREESCALE_LTC_ECC)
192192
ge_p3 A;
193193
#endif
@@ -296,14 +296,14 @@ int wc_ed25519_sign_msg_ex(const byte* in, word32 inLen, byte* out,
296296
ret = se050_ed25519_sign_msg(in, inLen, out, outLen, key);
297297
#else
298298
#ifdef FREESCALE_LTC_ECC
299-
byte tempBuf[ED25519_PRV_KEY_SIZE];
299+
ALIGN16 byte tempBuf[ED25519_PRV_KEY_SIZE];
300300
ltc_pkha_ecc_point_t ltcPoint = {0};
301301
#else
302302
ge_p3 R;
303303
#endif
304-
byte nonce[WC_SHA512_DIGEST_SIZE];
305-
byte hram[WC_SHA512_DIGEST_SIZE];
306-
byte az[ED25519_PRV_KEY_SIZE];
304+
ALIGN16 byte nonce[WC_SHA512_DIGEST_SIZE];
305+
ALIGN16 byte hram[WC_SHA512_DIGEST_SIZE];
306+
ALIGN16 byte az[ED25519_PRV_KEY_SIZE];
307307

308308
/* sanity check on arguments */
309309
if (in == NULL || out == NULL || outLen == NULL || key == NULL ||
@@ -617,8 +617,8 @@ static int ed25519_verify_msg_final_with_sha(const byte* sig, word32 sigLen,
617617
int* res, ed25519_key* key,
618618
wc_Sha512 *sha)
619619
{
620-
byte rcheck[ED25519_KEY_SIZE];
621-
byte h[WC_SHA512_DIGEST_SIZE];
620+
ALIGN16 byte rcheck[ED25519_KEY_SIZE];
621+
ALIGN16 byte h[WC_SHA512_DIGEST_SIZE];
622622
#ifndef FREESCALE_LTC_ECC
623623
ge_p3 A;
624624
ge_p2 R;
@@ -1239,7 +1239,7 @@ int wc_ed25519_check_key(ed25519_key* key)
12391239
{
12401240
int ret = 0;
12411241
#ifdef HAVE_ED25519_MAKE_KEY
1242-
unsigned char pubKey[ED25519_PUB_KEY_SIZE];
1242+
ALIGN16 unsigned char pubKey[ED25519_PUB_KEY_SIZE];
12431243

12441244
if (!key->pubKeySet)
12451245
ret = PUBLIC_KEY_E;

wolfcrypt/src/ge_operations.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -920,13 +920,13 @@ void sc_muladd(byte* s, const byte* a, const byte* b, const byte* c)
920920
int ge_compress_key(byte* out, const byte* xIn, const byte* yIn, word32 keySz)
921921
{
922922
ge_p2 g;
923-
byte bArray[ED25519_KEY_SIZE];
924-
byte x[ED25519_KEY_SIZE];
925-
byte y[ED25519_KEY_SIZE];
923+
ALIGN16 byte bArray[ED25519_KEY_SIZE];
924+
ALIGN16 byte x[ED25519_PUB_KEY_SIZE];
925+
ALIGN16 byte y[ED25519_PUB_KEY_SIZE];
926926
word32 i;
927927

928-
XMEMCPY(x, xIn, ED25519_KEY_SIZE);
929-
XMEMCPY(y, yIn, ED25519_KEY_SIZE);
928+
XMEMCPY(x, xIn, ED25519_PUB_KEY_SIZE);
929+
XMEMCPY(y, yIn, ED25519_PUB_KEY_SIZE);
930930
fe_frombytes(g.X, x);
931931
fe_frombytes(g.Y, y);
932932
fe_1(g.Z);

wolfcrypt/src/port/arm/armv8-32-aes-asm.S

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1447,10 +1447,10 @@ L_AES_CTR_encrypt_loop_block_256:
14471447
ldr r9, [lr, #4]
14481448
ldr r10, [lr, #8]
14491449
ldr r11, [lr, #12]
1450-
eor r4, r8
1451-
eor r5, r9
1452-
eor r6, r10
1453-
eor r7, r11
1450+
eor r4, r4, r8
1451+
eor r5, r5, r9
1452+
eor r6, r6, r10
1453+
eor r7, r7, r11
14541454
ldr r8, [sp, #4]
14551455
str r4, [r1]
14561456
str r5, [r1, #4]
@@ -1489,10 +1489,10 @@ L_AES_CTR_encrypt_loop_block_192:
14891489
ldr r9, [lr, #4]
14901490
ldr r10, [lr, #8]
14911491
ldr r11, [lr, #12]
1492-
eor r4, r8
1493-
eor r5, r9
1494-
eor r6, r10
1495-
eor r7, r11
1492+
eor r4, r4, r8
1493+
eor r5, r5, r9
1494+
eor r6, r6, r10
1495+
eor r7, r7, r11
14961496
ldr r8, [sp, #4]
14971497
str r4, [r1]
14981498
str r5, [r1, #4]
@@ -1531,10 +1531,10 @@ L_AES_CTR_encrypt_loop_block_128:
15311531
ldr r9, [lr, #4]
15321532
ldr r10, [lr, #8]
15331533
ldr r11, [lr, #12]
1534-
eor r4, r8
1535-
eor r5, r9
1536-
eor r6, r10
1537-
eor r7, r11
1534+
eor r4, r4, r8
1535+
eor r5, r5, r9
1536+
eor r6, r6, r10
1537+
eor r7, r7, r11
15381538
ldr r8, [sp, #4]
15391539
str r4, [r1]
15401540
str r5, [r1, #4]
@@ -3172,10 +3172,10 @@ L_AES_GCM_encrypt_loop_block_256:
31723172
ldr r9, [lr, #4]
31733173
ldr r10, [lr, #8]
31743174
ldr r11, [lr, #12]
3175-
eor r4, r8
3176-
eor r5, r9
3177-
eor r6, r10
3178-
eor r7, r11
3175+
eor r4, r4, r8
3176+
eor r5, r5, r9
3177+
eor r6, r6, r10
3178+
eor r7, r7, r11
31793179
ldr r8, [sp, #4]
31803180
str r4, [r1]
31813181
str r5, [r1, #4]
@@ -3211,10 +3211,10 @@ L_AES_GCM_encrypt_loop_block_192:
32113211
ldr r9, [lr, #4]
32123212
ldr r10, [lr, #8]
32133213
ldr r11, [lr, #12]
3214-
eor r4, r8
3215-
eor r5, r9
3216-
eor r6, r10
3217-
eor r7, r11
3214+
eor r4, r4, r8
3215+
eor r5, r5, r9
3216+
eor r6, r6, r10
3217+
eor r7, r7, r11
32183218
ldr r8, [sp, #4]
32193219
str r4, [r1]
32203220
str r5, [r1, #4]
@@ -3250,10 +3250,10 @@ L_AES_GCM_encrypt_loop_block_128:
32503250
ldr r9, [lr, #4]
32513251
ldr r10, [lr, #8]
32523252
ldr r11, [lr, #12]
3253-
eor r4, r8
3254-
eor r5, r9
3255-
eor r6, r10
3256-
eor r7, r11
3253+
eor r4, r4, r8
3254+
eor r5, r5, r9
3255+
eor r6, r6, r10
3256+
eor r7, r7, r11
32573257
ldr r8, [sp, #4]
32583258
str r4, [r1]
32593259
str r5, [r1, #4]

0 commit comments

Comments
 (0)