Skip to content

Commit c0015cb

Browse files
authored
Merge pull request #7549 from douzzer/20240516-wc_AesXtsEnDecryptFinal
20240516-wc_AesXtsEnDecryptFinal
2 parents 219a338 + 6d0f611 commit c0015cb

4 files changed

Lines changed: 171 additions & 42 deletions

File tree

linuxkm/lkcapi_glue.c

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -945,9 +945,14 @@ static int km_AesXtsEncrypt(struct skcipher_request *req)
945945
if (nbytes < walk.total)
946946
nbytes &= ~(AES_BLOCK_SIZE - 1);
947947

948-
err = wc_AesXtsEncryptUpdate(ctx->aesXts, walk.dst.virt.addr,
949-
walk.src.virt.addr, nbytes,
950-
walk.iv);
948+
if (nbytes & ((unsigned int)AES_BLOCK_SIZE - 1U))
949+
err = wc_AesXtsEncryptFinal(ctx->aesXts, walk.dst.virt.addr,
950+
walk.src.virt.addr, nbytes,
951+
walk.iv);
952+
else
953+
err = wc_AesXtsEncryptUpdate(ctx->aesXts, walk.dst.virt.addr,
954+
walk.src.virt.addr, nbytes,
955+
walk.iv);
951956

952957
if (unlikely(err)) {
953958
pr_err("%s: wc_AesXtsEncryptUpdate failed: %d\n",
@@ -979,12 +984,12 @@ static int km_AesXtsEncrypt(struct skcipher_request *req)
979984
if (err)
980985
return err;
981986

982-
err = wc_AesXtsEncryptUpdate(ctx->aesXts, walk.dst.virt.addr,
987+
err = wc_AesXtsEncryptFinal(ctx->aesXts, walk.dst.virt.addr,
983988
walk.src.virt.addr, walk.nbytes,
984989
walk.iv);
985990

986991
if (unlikely(err)) {
987-
pr_err("%s: wc_AesXtsEncryptUpdate failed: %d\n",
992+
pr_err("%s: wc_AesXtsEncryptFinal failed: %d\n",
988993
crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err);
989994
return -EINVAL;
990995
}
@@ -1071,9 +1076,14 @@ static int km_AesXtsDecrypt(struct skcipher_request *req)
10711076
if (nbytes < walk.total)
10721077
nbytes &= ~(AES_BLOCK_SIZE - 1);
10731078

1074-
err = wc_AesXtsDecryptUpdate(ctx->aesXts, walk.dst.virt.addr,
1075-
walk.src.virt.addr, nbytes,
1076-
walk.iv);
1079+
if (nbytes & ((unsigned int)AES_BLOCK_SIZE - 1U))
1080+
err = wc_AesXtsDecryptFinal(ctx->aesXts, walk.dst.virt.addr,
1081+
walk.src.virt.addr, nbytes,
1082+
walk.iv);
1083+
else
1084+
err = wc_AesXtsDecryptUpdate(ctx->aesXts, walk.dst.virt.addr,
1085+
walk.src.virt.addr, nbytes,
1086+
walk.iv);
10771087

10781088
if (unlikely(err)) {
10791089
pr_err("%s: wc_AesXtsDecryptUpdate failed: %d\n",
@@ -1105,12 +1115,12 @@ static int km_AesXtsDecrypt(struct skcipher_request *req)
11051115
if (err)
11061116
return err;
11071117

1108-
err = wc_AesXtsDecryptUpdate(ctx->aesXts, walk.dst.virt.addr,
1118+
err = wc_AesXtsDecryptFinal(ctx->aesXts, walk.dst.virt.addr,
11091119
walk.src.virt.addr, walk.nbytes,
11101120
walk.iv);
11111121

11121122
if (unlikely(err)) {
1113-
pr_err("%s: wc_AesXtsDecryptUpdate failed: %d\n",
1123+
pr_err("%s: wc_AesXtsDecryptFinal failed: %d\n",
11141124
crypto_tfm_alg_driver_name(crypto_skcipher_tfm(tfm)), err);
11151125
return -EINVAL;
11161126
}
@@ -2029,7 +2039,7 @@ static int aes_xts_128_test(void)
20292039
ret = wc_AesXtsEncryptUpdate(aes, buf, p2, AES_BLOCK_SIZE, iv);
20302040
if (ret != 0)
20312041
goto out;
2032-
ret = wc_AesXtsEncryptUpdate(aes, buf + AES_BLOCK_SIZE,
2042+
ret = wc_AesXtsEncryptFinal(aes, buf + AES_BLOCK_SIZE,
20332043
p2 + AES_BLOCK_SIZE,
20342044
sizeof(p2) - AES_BLOCK_SIZE, iv);
20352045
if (ret != 0)
@@ -2214,7 +2224,10 @@ static int aes_xts_128_test(void)
22142224
if (ret != 0)
22152225
goto out;
22162226
for (k = 0; k < j; k += AES_BLOCK_SIZE) {
2217-
ret = wc_AesXtsEncryptUpdate(aes, large_input + k, large_input + k, (j - k) < AES_BLOCK_SIZE*2 ? j - k : AES_BLOCK_SIZE, iv);
2227+
if ((j - k) < AES_BLOCK_SIZE*2)
2228+
ret = wc_AesXtsEncryptFinal(aes, large_input + k, large_input + k, j - k, iv);
2229+
else
2230+
ret = wc_AesXtsEncryptUpdate(aes, large_input + k, large_input + k, AES_BLOCK_SIZE, iv);
22182231
if (ret != 0)
22192232
goto out;
22202233
if ((j - k) < AES_BLOCK_SIZE*2)
@@ -2252,7 +2265,10 @@ static int aes_xts_128_test(void)
22522265
if (ret != 0)
22532266
goto out;
22542267
for (k = 0; k < j; k += AES_BLOCK_SIZE) {
2255-
ret = wc_AesXtsDecryptUpdate(aes, large_input + k, large_input + k, (j - k) < AES_BLOCK_SIZE*2 ? j - k : AES_BLOCK_SIZE, iv);
2268+
if ((j - k) < AES_BLOCK_SIZE*2)
2269+
ret = wc_AesXtsDecryptFinal(aes, large_input + k, large_input + k, j - k, iv);
2270+
else
2271+
ret = wc_AesXtsDecryptUpdate(aes, large_input + k, large_input + k, AES_BLOCK_SIZE, iv);
22562272
if (ret != 0)
22572273
goto out;
22582274
if ((j - k) < AES_BLOCK_SIZE*2)
@@ -2611,7 +2627,7 @@ static int aes_xts_256_test(void)
26112627
ret = wc_AesXtsEncryptUpdate(aes, buf, p2, AES_BLOCK_SIZE, iv);
26122628
if (ret != 0)
26132629
goto out;
2614-
ret = wc_AesXtsEncryptUpdate(aes, buf + AES_BLOCK_SIZE,
2630+
ret = wc_AesXtsEncryptFinal(aes, buf + AES_BLOCK_SIZE,
26152631
p2 + AES_BLOCK_SIZE,
26162632
sizeof(p2) - AES_BLOCK_SIZE, iv);
26172633
if (ret != 0)
@@ -2700,7 +2716,10 @@ static int aes_xts_256_test(void)
27002716
if (ret != 0)
27012717
goto out;
27022718
for (k = 0; k < j; k += AES_BLOCK_SIZE) {
2703-
ret = wc_AesXtsEncryptUpdate(aes, large_input + k, large_input + k, (j - k) < AES_BLOCK_SIZE*2 ? j - k : AES_BLOCK_SIZE, iv);
2719+
if ((j - k) < AES_BLOCK_SIZE*2)
2720+
ret = wc_AesXtsEncryptFinal(aes, large_input + k, large_input + k, j - k, iv);
2721+
else
2722+
ret = wc_AesXtsEncryptUpdate(aes, large_input + k, large_input + k, AES_BLOCK_SIZE, iv);
27042723
if (ret != 0)
27052724
goto out;
27062725
if ((j - k) < AES_BLOCK_SIZE*2)
@@ -2738,7 +2757,10 @@ static int aes_xts_256_test(void)
27382757
if (ret != 0)
27392758
goto out;
27402759
for (k = 0; k < j; k += AES_BLOCK_SIZE) {
2741-
ret = wc_AesXtsDecryptUpdate(aes, large_input + k, large_input + k, (j - k) < AES_BLOCK_SIZE*2 ? j - k : AES_BLOCK_SIZE, iv);
2760+
if ((j - k) < AES_BLOCK_SIZE*2)
2761+
ret = wc_AesXtsDecryptFinal(aes, large_input + k, large_input + k, j - k, iv);
2762+
else
2763+
ret = wc_AesXtsDecryptUpdate(aes, large_input + k, large_input + k, AES_BLOCK_SIZE, iv);
27422764
if (ret != 0)
27432765
goto out;
27442766
if ((j - k) < AES_BLOCK_SIZE*2)

wolfcrypt/src/aes.c

Lines changed: 54 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12907,8 +12907,9 @@ int wc_AesXtsEncryptInit(XtsAes* xaes, byte* i, word32 iSz)
1290712907

1290812908
/* Block-streaming AES-XTS
1290912909
*
12910-
* Note that sz must be greater than AES_BLOCK_SIZE in each call, and must be a
12911-
* multiple of AES_BLOCK_SIZE in all but the final call.
12910+
* Note that sz must be >= AES_BLOCK_SIZE in each call, and must be a multiple
12911+
* of AES_BLOCK_SIZE in each call to wc_AesXtsEncryptUpdate().
12912+
* wc_AesXtsEncryptFinal() can handle any length >= AES_BLOCK_SIZE.
1291212913
*
1291312914
* xaes AES keys to use for block encrypt/decrypt
1291412915
* out output buffer to hold cipher text
@@ -12920,7 +12921,7 @@ int wc_AesXtsEncryptInit(XtsAes* xaes, byte* i, word32 iSz)
1292012921
*
1292112922
* returns 0 on success
1292212923
*/
12923-
int wc_AesXtsEncryptUpdate(XtsAes* xaes, byte* out, const byte* in, word32 sz,
12924+
static int AesXtsEncryptUpdate(XtsAes* xaes, byte* out, const byte* in, word32 sz,
1292412925
byte *i)
1292512926
{
1292612927
int ret;
@@ -12975,6 +12976,29 @@ int wc_AesXtsEncryptUpdate(XtsAes* xaes, byte* out, const byte* in, word32 sz,
1297512976
return ret;
1297612977
}
1297712978

12979+
int wc_AesXtsEncryptUpdate(XtsAes* xaes, byte* out, const byte* in, word32 sz,
12980+
byte *i)
12981+
{
12982+
if (sz & ((word32)AES_BLOCK_SIZE - 1U))
12983+
return BAD_FUNC_ARG;
12984+
return AesXtsEncryptUpdate(xaes, out, in, sz, i);
12985+
}
12986+
12987+
int wc_AesXtsEncryptFinal(XtsAes* xaes, byte* out, const byte* in, word32 sz,
12988+
byte *i)
12989+
{
12990+
int ret;
12991+
if (sz > 0)
12992+
ret = AesXtsEncryptUpdate(xaes, out, in, sz, i);
12993+
else
12994+
ret = 0;
12995+
ForceZero(i, AES_BLOCK_SIZE);
12996+
#ifdef WOLFSSL_CHECK_MEM_ZERO
12997+
wc_MemZero_Check(i, AES_BLOCK_SIZE);
12998+
#endif
12999+
return ret;
13000+
}
13001+
1297813002
#endif /* WOLFSSL_AESXTS_STREAM */
1297913003

1298013004

@@ -13284,8 +13308,9 @@ int wc_AesXtsDecryptInit(XtsAes* xaes, byte* i, word32 iSz)
1328413308

1328513309
/* Block-streaming AES-XTS
1328613310
*
13287-
* Note that sz must be greater than AES_BLOCK_SIZE in each call, and must be a
13288-
* multiple of AES_BLOCK_SIZE in all but the final call.
13311+
* Note that sz must be >= AES_BLOCK_SIZE in each call, and must be a multiple
13312+
* of AES_BLOCK_SIZE in each call to wc_AesXtsDecryptUpdate().
13313+
* wc_AesXtsDecryptFinal() can handle any length >= AES_BLOCK_SIZE.
1328913314
*
1329013315
* xaes AES keys to use for block encrypt/decrypt
1329113316
* out output buffer to hold plain text
@@ -13295,7 +13320,7 @@ int wc_AesXtsDecryptInit(XtsAes* xaes, byte* i, word32 iSz)
1329513320
*
1329613321
* returns 0 on success
1329713322
*/
13298-
int wc_AesXtsDecryptUpdate(XtsAes* xaes, byte* out, const byte* in, word32 sz,
13323+
static int AesXtsDecryptUpdate(XtsAes* xaes, byte* out, const byte* in, word32 sz,
1329913324
byte *i)
1330013325
{
1330113326
int ret;
@@ -13353,6 +13378,29 @@ int wc_AesXtsDecryptUpdate(XtsAes* xaes, byte* out, const byte* in, word32 sz,
1335313378
return ret;
1335413379
}
1335513380

13381+
int wc_AesXtsDecryptUpdate(XtsAes* xaes, byte* out, const byte* in, word32 sz,
13382+
byte *i)
13383+
{
13384+
if (sz & ((word32)AES_BLOCK_SIZE - 1U))
13385+
return BAD_FUNC_ARG;
13386+
return AesXtsDecryptUpdate(xaes, out, in, sz, i);
13387+
}
13388+
13389+
int wc_AesXtsDecryptFinal(XtsAes* xaes, byte* out, const byte* in, word32 sz,
13390+
byte *i)
13391+
{
13392+
int ret;
13393+
if (sz > 0)
13394+
ret = AesXtsDecryptUpdate(xaes, out, in, sz, i);
13395+
else
13396+
ret = 0;
13397+
ForceZero(i, AES_BLOCK_SIZE);
13398+
#ifdef WOLFSSL_CHECK_MEM_ZERO
13399+
wc_MemZero_Check(i, AES_BLOCK_SIZE);
13400+
#endif
13401+
return ret;
13402+
}
13403+
1335613404
#endif /* WOLFSSL_AESXTS_STREAM */
1335713405

1335813406
#endif /* !WOLFSSL_ARMASM || WOLFSSL_ARMASM_NO_HW_CRYPTO */

0 commit comments

Comments
 (0)