Skip to content

Commit 5bb246e

Browse files
committed
Add tests for X509 DER length guards
Cover INT_MAX boundary and zero-length paths in wolfSSL_X509_get_der and wolfSSL_i2d_X509, including caller-provided-buffer no-mutation on error.
1 parent f57a7b7 commit 5bb246e

2 files changed

Lines changed: 118 additions & 1 deletion

File tree

tests/api/test_ossl_x509_io.c

Lines changed: 112 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121

2222
#include <tests/unit.h>
2323

24+
#include <limits.h>
25+
2426
#ifdef NO_INLINE
2527
#include <wolfssl/wolfcrypt/misc.h>
2628
#else
@@ -72,6 +74,116 @@ int test_wolfSSL_i2d_X509(void)
7274
return EXPECT_RESULT();
7375
}
7476

77+
int test_wolfSSL_X509_get_der_length_guards(void)
78+
{
79+
EXPECT_DECLS;
80+
#if defined(OPENSSL_EXTRA) && defined(USE_CERT_BUFFERS_2048) && !defined(NO_RSA)
81+
const unsigned char* cert_buf = server_cert_der_2048;
82+
const byte* der = NULL;
83+
X509* cert = NULL;
84+
const byte* origBuf = NULL;
85+
word32 origLen = 0;
86+
int derSz = 0;
87+
88+
ExpectNotNull(d2i_X509(&cert, &cert_buf, sizeof_server_cert_der_2048));
89+
ExpectNotNull(cert);
90+
ExpectNotNull(cert->derCert);
91+
ExpectNotNull(cert->derCert->buffer);
92+
93+
if (EXPECT_SUCCESS()) {
94+
origLen = cert->derCert->length;
95+
origBuf = cert->derCert->buffer;
96+
cert->derCert->length = (word32)INT_MAX;
97+
der = wolfSSL_X509_get_der(cert, &derSz);
98+
cert->derCert->length = origLen;
99+
ExpectPtrEq(der, origBuf);
100+
ExpectIntEQ(derSz, INT_MAX);
101+
102+
cert->derCert->length = ((word32)INT_MAX) + 1U;
103+
der = wolfSSL_X509_get_der(cert, &derSz);
104+
cert->derCert->length = origLen;
105+
ExpectNull(der);
106+
107+
cert->derCert->length = 0;
108+
der = wolfSSL_X509_get_der(cert, &derSz);
109+
cert->derCert->length = origLen;
110+
ExpectPtrEq(der, origBuf);
111+
ExpectIntEQ(derSz, 0);
112+
113+
ExpectPtrEq(wolfSSL_X509_get_der(cert, &derSz), origBuf);
114+
ExpectIntGT(derSz, 0);
115+
}
116+
117+
X509_free(cert);
118+
#endif
119+
return EXPECT_RESULT();
120+
}
121+
122+
int test_wolfSSL_i2d_X509_der_length_guards(void)
123+
{
124+
EXPECT_DECLS;
125+
#if defined(OPENSSL_EXTRA) && defined(USE_CERT_BUFFERS_2048) && !defined(NO_RSA)
126+
const unsigned char* cert_buf = server_cert_der_2048;
127+
unsigned char* overflowOut = NULL;
128+
unsigned char overflowBuf[4] = { 0x11, 0x22, 0x33, 0x44 };
129+
const unsigned char overflowExpected[4] = { 0x11, 0x22, 0x33, 0x44 };
130+
unsigned char* overflowCallerOut = overflowBuf;
131+
unsigned char* zeroLenOut = NULL;
132+
unsigned char zeroLenBuf[4] = { 0x55, 0x66, 0x77, 0x88 };
133+
const unsigned char zeroLenExpected[4] = { 0x55, 0x66, 0x77, 0x88 };
134+
unsigned char* zeroLenCallerOut = zeroLenBuf;
135+
unsigned char* successOut = NULL;
136+
X509* cert = NULL;
137+
word32 origLen = 0;
138+
int ret = 0;
139+
140+
ExpectNotNull(d2i_X509(&cert, &cert_buf, sizeof_server_cert_der_2048));
141+
ExpectNotNull(cert);
142+
ExpectNotNull(cert->derCert);
143+
ExpectNotNull(cert->derCert->buffer);
144+
145+
if (EXPECT_SUCCESS()) {
146+
origLen = cert->derCert->length;
147+
cert->derCert->length = ((word32)INT_MAX) + 1U;
148+
ret = i2d_X509(cert, &overflowOut);
149+
cert->derCert->length = origLen;
150+
ExpectIntEQ(ret, MEMORY_E);
151+
ExpectNull(overflowOut);
152+
153+
cert->derCert->length = ((word32)INT_MAX) + 1U;
154+
ret = i2d_X509(cert, &overflowCallerOut);
155+
cert->derCert->length = origLen;
156+
ExpectIntEQ(ret, MEMORY_E);
157+
ExpectPtrEq(overflowCallerOut, overflowBuf);
158+
ExpectIntEQ(XMEMCMP(overflowBuf, overflowExpected,
159+
sizeof(overflowBuf)), 0);
160+
161+
cert->derCert->length = 0;
162+
ret = i2d_X509(cert, &zeroLenOut);
163+
cert->derCert->length = origLen;
164+
ExpectIntEQ(ret, MEMORY_E);
165+
ExpectNull(zeroLenOut);
166+
167+
cert->derCert->length = 0;
168+
ret = i2d_X509(cert, &zeroLenCallerOut);
169+
cert->derCert->length = origLen;
170+
ExpectIntEQ(ret, MEMORY_E);
171+
ExpectPtrEq(zeroLenCallerOut, zeroLenBuf);
172+
ExpectIntEQ(XMEMCMP(zeroLenBuf, zeroLenExpected,
173+
sizeof(zeroLenBuf)), 0);
174+
175+
ExpectIntGT(i2d_X509(cert, &successOut), 0);
176+
ExpectNotNull(successOut);
177+
}
178+
179+
XFREE(overflowOut, NULL, DYNAMIC_TYPE_OPENSSL);
180+
XFREE(zeroLenOut, NULL, DYNAMIC_TYPE_OPENSSL);
181+
XFREE(successOut, NULL, DYNAMIC_TYPE_OPENSSL);
182+
X509_free(cert);
183+
#endif
184+
return EXPECT_RESULT();
185+
}
186+
75187
int test_wolfSSL_PEM_read_X509(void)
76188
{
77189
EXPECT_DECLS;
@@ -244,4 +356,3 @@ int test_wolfSSL_PEM_write_bio_X509(void)
244356
#endif
245357
return EXPECT_RESULT();
246358
}
247-

tests/api/test_ossl_x509_io.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,17 @@
2525
#include <tests/api/api_decl.h>
2626

2727
int test_wolfSSL_i2d_X509(void);
28+
int test_wolfSSL_X509_get_der_length_guards(void);
29+
int test_wolfSSL_i2d_X509_der_length_guards(void);
2830
int test_wolfSSL_PEM_read_X509(void);
2931
int test_wolfSSL_PEM_write_bio_X509(void);
3032

3133
#define TEST_OSSL_X509_IO_DECLS \
3234
TEST_DECL_GROUP("ossl_x509_io", test_wolfSSL_i2d_X509), \
35+
TEST_DECL_GROUP("ossl_x509_io", \
36+
test_wolfSSL_X509_get_der_length_guards), \
37+
TEST_DECL_GROUP("ossl_x509_io", \
38+
test_wolfSSL_i2d_X509_der_length_guards), \
3339
TEST_DECL_GROUP("ossl_x509_io", test_wolfSSL_PEM_read_X509), \
3440
TEST_DECL_GROUP("ossl_x509_io", test_wolfSSL_PEM_write_bio_X509)
3541

0 commit comments

Comments
 (0)