Skip to content

Commit 70aa3dc

Browse files
committed
20260204-linuxkm-fips-hash: more fixes+improvements from peer and AI review:
linuxkm/linuxkm_memory.c: * fix straddle check in wc_reloc_normalize_text(); * fix seg_map bounds checks in wc_fips_generate_hash(); linuxkm/linuxkm_memory.h: fix initializer for wc_reloc_table_segments.bss_end; wolfssl/wolfcrypt/settings.h: add WC_BITS_TO_BYTES() and WC_BITS_FULL_BYTES() and deploy opportunistically to wolfssl/internal.h, wolfssl/wolfcrypt/{asn.h,dh.h,rsa.h,types.h}, wolfcrypt/src/sakke.c, and wolfcrypt/test/test.c.
1 parent 9443f59 commit 70aa3dc

File tree

10 files changed

+50
-34
lines changed

10 files changed

+50
-34
lines changed

linuxkm/linuxkm_memory.c

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,9 @@ ssize_t wc_reloc_normalize_text(
237237
break;
238238
}
239239

240-
if (next_reloc_rel > text_in_len - layout->width) {
240+
if ((text_in_len < WC_BITS_TO_BYTES(layout->width)) ||
241+
(next_reloc_rel > text_in_len - WC_BITS_TO_BYTES(layout->width)))
242+
{
241243
/* relocation straddles buffer at end -- caller will try again with
242244
* that relocation at the start.
243245
*/
@@ -586,29 +588,40 @@ int wc_fips_generate_hash(
586588
return BAD_FUNC_ARG;
587589
}
588590

589-
if (seg_map->end > 0) {
591+
if (seg_map->start > 0) {
590592
if ((seg_map->fips_text_start < seg_map->start) ||
591-
(seg_map->fips_text_end >= seg_map->end) ||
592593
(seg_map->fips_rodata_start < seg_map->start) ||
593-
(seg_map->fips_rodata_end > seg_map->end) ||
594-
(seg_map->verifyCore_start < seg_map->start) ||
595-
(seg_map->verifyCore_end >= seg_map->end)
594+
(seg_map->verifyCore_start < seg_map->start)
596595
#if defined(WC_SYM_RELOC_TABLES) || defined(WC_SYM_RELOC_TABLES_SUPPORT)
597596
||
598-
((seg_map->reloc_tab_end != 0) &&
599-
((seg_map->reloc_tab_start < seg_map->start) ||
600-
(seg_map->reloc_tab_end >= seg_map->end))) ||
601-
((seg_map->reloc_tab_len_end != 0) &&
602-
((seg_map->reloc_tab_len_start < seg_map->start) ||
603-
(seg_map->reloc_tab_len_end >= seg_map->end))) ||
597+
(seg_map->reloc_tab_start < seg_map->start) ||
598+
(seg_map->reloc_tab_len_start < seg_map->start) ||
604599
(seg_map->text_start < seg_map->start) ||
605-
(seg_map->text_end >= seg_map->end) ||
606600
(seg_map->rodata_start < seg_map->start) ||
607-
(seg_map->rodata_end >= seg_map->end) ||
608601
(seg_map->data_start < seg_map->start) ||
609-
(seg_map->data_end >= seg_map->end) ||
610-
(seg_map->bss_start < seg_map->start) ||
611-
(seg_map->bss_end >= seg_map->end)
602+
(seg_map->bss_start < seg_map->start)
603+
#endif
604+
)
605+
{
606+
RELOC_DEBUG_PRINTF("assert failed.\n");
607+
return BUFFER_E;
608+
}
609+
}
610+
611+
if (seg_map->end > 0) {
612+
if ((seg_map->fips_text_end > seg_map->end) ||
613+
(seg_map->fips_rodata_end > seg_map->end) ||
614+
(seg_map->verifyCore_end > seg_map->end)
615+
#if defined(WC_SYM_RELOC_TABLES) || defined(WC_SYM_RELOC_TABLES_SUPPORT)
616+
||
617+
((seg_map->reloc_tab_end != 0) &&
618+
(seg_map->reloc_tab_end > seg_map->end)) ||
619+
((seg_map->reloc_tab_len_end != 0) &&
620+
(seg_map->reloc_tab_len_end > seg_map->end)) ||
621+
(seg_map->text_end > seg_map->end) ||
622+
(seg_map->rodata_end > seg_map->end) ||
623+
(seg_map->data_end > seg_map->end) ||
624+
(seg_map->bss_end > seg_map->end)
612625
#endif
613626
)
614627
{

linuxkm/linuxkm_memory.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ struct wc_reloc_table_segments {
130130
.data_start = ~0UL, \
131131
.data_end = ~0UL, \
132132
.bss_start = ~0UL, \
133-
.bss_end = 0, \
133+
.bss_end = ~0UL, \
134134
.text_is_live = 0 \
135135
}
136136

@@ -150,7 +150,7 @@ struct wc_reloc_table_segments {
150150
.data_start = ~0UL, \
151151
.data_end = ~0UL, \
152152
.bss_start = ~0UL, \
153-
.bss_end = 0, \
153+
.bss_end = ~0UL, \
154154
.text_is_live = 0 \
155155
}
156156

wolfcrypt/src/sakke.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2510,7 +2510,7 @@ int wc_GetSakkeAuthSize(SakkeKey* key, word16* authSz)
25102510
err = sakke_load_params(key);
25112511
}
25122512
if (err == 0) {
2513-
word16 n = (word16)((mp_count_bits(&key->params.prime) + 7) / 8);
2513+
word16 n = (word16)WC_BITS_TO_BYTES(mp_count_bits(&key->params.prime));
25142514
*authSz = (word16)(1 + 2 * n);
25152515
}
25162516

@@ -6709,7 +6709,7 @@ int wc_MakeSakkeEncapsulatedSSV(SakkeKey* key, enum wc_HashType hashType,
67096709
err = sakke_load_params(key);
67106710
}
67116711
if (err == 0) {
6712-
n = (word16)((mp_count_bits(&key->params.prime) + 7) / 8);
6712+
n = (word16)WC_BITS_TO_BYTES(mp_count_bits(&key->params.prime));
67136713

67146714
/* Uncompressed point */
67156715
outSz = (word16)(1 + 2 * n);
@@ -6807,7 +6807,7 @@ int wc_GenerateSakkeSSV(SakkeKey* key, WC_RNG* rng, byte* ssv, word16* ssvSz)
68076807
err = sakke_load_params(key);
68086808
}
68096809
if (err == 0) {
6810-
n = (word16)((mp_count_bits(&key->params.prime) + 7) / 8);
6810+
n = (word16)WC_BITS_TO_BYTES(mp_count_bits(&key->params.prime));
68116811

68126812
if ((ssv != NULL) && (*ssvSz > n)) {
68136813
err = BAD_FUNC_ARG;
@@ -6886,7 +6886,7 @@ int wc_DeriveSakkeSSV(SakkeKey* key, enum wc_HashType hashType, byte* ssv,
68866886
err = sakke_load_params(key);
68876887
}
68886888
if (err == 0) {
6889-
n = (word16)((mp_count_bits(&key->params.prime) + 7) / 8);
6889+
n = (word16)WC_BITS_TO_BYTES(mp_count_bits(&key->params.prime));
68906890

68916891
if (authSz != 2 * n + 1) {
68926892
err = BAD_FUNC_ARG;

wolfcrypt/test/test.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60083,7 +60083,7 @@ static wc_test_ret_t mp_test_shbd(mp_int* a, mp_int* b, WC_RNG* rng)
6008360083

6008460084
#ifndef WOLFSSL_SP_MATH
6008560085
for (i = 0; i < 10; i++) {
60086-
for (j = 1; j < (DIGIT_BIT + 7) / 8 * 3; j++) {
60086+
for (j = 1; j < WC_BITS_TO_BYTES(DIGIT_BIT) * 3; j++) {
6008760087
ret = randNum(a, j, rng, NULL);
6008860088
if (ret != MP_OKAY)
6008960089
return WC_TEST_RET_ENC_EC(ret);
@@ -60104,7 +60104,7 @@ static wc_test_ret_t mp_test_shbd(mp_int* a, mp_int* b, WC_RNG* rng)
6010460104
#endif
6010560105

6010660106
for (i = 0; i < 10; i++) {
60107-
for (j = 1; j < (DIGIT_BIT + 7) / 8 * 3; j++) {
60107+
for (j = 1; j < WC_BITS_TO_BYTES(DIGIT_BIT) * 3; j++) {
6010860108
ret = randNum(a, j, rng, NULL);
6010960109
if (ret != MP_OKAY)
6011060110
return WC_TEST_RET_ENC_EC(ret);
@@ -60182,11 +60182,11 @@ static wc_test_ret_t mp_test_div(mp_int* a, mp_int* d, mp_int* r, mp_int* rem,
6018260182
return WC_TEST_RET_ENC_EC(ret);
6018360183

6018460184
for (i = 0; i < 100; i++) {
60185-
for (j = 1; j < (DIGIT_BIT + 7) / 8 * 2; j++) {
60185+
for (j = 1; j < WC_BITS_TO_BYTES(DIGIT_BIT) * 2; j++) {
6018660186
ret = randNum(d, j, rng, NULL);
6018760187
if (ret != MP_OKAY)
6018860188
return WC_TEST_RET_ENC_EC(ret);
60189-
for (k = 1; k < (DIGIT_BIT + 7) / 8 * 2 + 1; k++) {
60189+
for (k = 1; k < WC_BITS_TO_BYTES(DIGIT_BIT) * 2 + 1; k++) {
6019060190
ret = randNum(a, k, rng, NULL);
6019160191
if (ret != MP_OKAY)
6019260192
return WC_TEST_RET_ENC_EC(ret);
@@ -60210,7 +60210,7 @@ static wc_test_ret_t mp_test_div(mp_int* a, mp_int* d, mp_int* r, mp_int* rem,
6021060210
}
6021160211
}
6021260212

60213-
ret = randNum(d, (DIGIT_BIT + 7) / 8 * 2, rng, NULL);
60213+
ret = randNum(d, WC_BITS_TO_BYTES(DIGIT_BIT) * 2, rng, NULL);
6021460214
if (ret != MP_OKAY)
6021560215
return WC_TEST_RET_ENC_EC(ret);
6021660216
mp_add(d, d, a);

wolfssl/internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1260,7 +1260,7 @@ enum {
12601260
#elif (defined(WOLFSSL_SP_MATH_ALL) || defined(WOLFSSL_SP_MATH)) && \
12611261
defined(SP_INT_BITS)
12621262
/* SP implementation supports numbers of SP_INT_BITS bits. */
1263-
#define WOLFSSL_MAX_DHKEY_BITS (((SP_INT_BITS + 7) / 8) * 8)
1263+
#define WOLFSSL_MAX_DHKEY_BITS WC_BITS_FULL_BYTES(SP_INT_BITS)
12641264
#else
12651265
#define WOLFSSL_MAX_DHKEY_BITS 4096
12661266
#endif

wolfssl/wolfcrypt/asn.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -855,7 +855,7 @@ extern const WOLFSSL_ObjectInfo wolfssl_object_info[];
855855
#define WC_MAX_RSA_BITS (FP_MAX_BITS / 2)
856856
#elif defined(WOLFSSL_SP_MATH_ALL) || defined(WOLFSSL_SP_MATH)
857857
/* SP implementation supports numbers of SP_INT_BITS bits. */
858-
#define WC_MAX_RSA_BITS (((SP_INT_BITS + 7) / 8) * 8)
858+
#define WC_MAX_RSA_BITS WC_BITS_FULL_BYTES(SP_INT_BITS)
859859
#else
860860
/* Integer maths is dynamic but we only go up to 4096 bits. */
861861
#define WC_MAX_RSA_BITS 4096

wolfssl/wolfcrypt/dh.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ enum {
104104
#endif
105105
#elif defined(WOLFSSL_SP_MATH_ALL) || defined(WOLFSSL_SP_MATH)
106106
/* SP implementation supports numbers of SP_INT_BITS bits. */
107-
#define DH_MAX_SIZE (((SP_INT_BITS + 7) / 8) * 8)
107+
#define DH_MAX_SIZE WC_BITS_FULL_BYTES(SP_INT_BITS)
108108
#if defined(WOLFSSL_MYSQL_COMPATIBLE) && DH_MAX_SIZE < 8192
109109
#error "MySQL needs SP_INT_BITS at least at 8192"
110110
#endif

wolfssl/wolfcrypt/rsa.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ RSA keys can be used to encrypt, decrypt, sign and verify data.
119119
#endif
120120
#elif defined(WOLFSSL_SP_MATH_ALL) || defined(WOLFSSL_SP_MATH)
121121
/* SP implementation supports numbers of SP_INT_BITS bits. */
122-
#define RSA_MAX_SIZE (((SP_INT_BITS + 7) / 8) * 8)
122+
#define RSA_MAX_SIZE WC_BITS_FULL_BYTES(SP_INT_BITS)
123123
#if defined(WOLFSSL_MYSQL_COMPATIBLE) && RSA_MAX_SIZE < 8192
124124
#error "MySQL needs SP_INT_BITS at least at 8192"
125125
#endif

wolfssl/wolfcrypt/settings.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@
6363
#include <wolfssl/options.h>
6464
#endif
6565

66+
#define WC_BITS_TO_BYTES(x) (((x) + 7) >> 3)
67+
#define WC_BITS_FULL_BYTES(x) (WC_BITS_TO_BYTES(x) << 3)
68+
6669
/* Uncomment next line if using IPHONE */
6770
/* #define IPHONE */
6871

@@ -4391,7 +4394,7 @@ extern void uITRON4_free(void *p) ;
43914394
#endif
43924395
#elif defined(WOLFSSL_SP_MATH_ALL) || defined(WOLFSSL_SP_MATH)
43934396
/* SP implementation supports numbers of SP_INT_BITS bits. */
4394-
#define DH_MAX_SIZE (((SP_INT_BITS + 7) / 8) * 8)
4397+
#define DH_MAX_SIZE WC_BITS_FULL_BYTES(SP_INT_BITS)
43954398
#if defined(WOLFSSL_MYSQL_COMPATIBLE) && DH_MAX_SIZE < 8192
43964399
#error "MySQL needs SP_INT_BITS at least at 8192"
43974400
#endif

wolfssl/wolfcrypt/types.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2300,7 +2300,7 @@ enum Max_ASN {
23002300
MAX_ENCODED_SIG_SZ = FP_MAX_BITS / 8,
23012301
#elif (defined(WOLFSSL_SP_MATH_ALL) || defined(WOLFSSL_SP_MATH)) && \
23022302
defined(SP_INT_BITS)
2303-
MAX_ENCODED_SIG_SZ = (SP_INT_BITS + 7) / 8,
2303+
MAX_ENCODED_SIG_SZ = WC_BITS_TO_BYTES(SP_INT_BITS),
23042304
#elif defined(WOLFSSL_HAPROXY)
23052305
MAX_ENCODED_SIG_SZ = 1024, /* Supports 8192 bit keys */
23062306
#else

0 commit comments

Comments
 (0)