@@ -16493,6 +16493,93 @@ static int test_wolfSSL_sigalg_info(void)
1649316493 return EXPECT_RESULT();
1649416494}
1649516495
16496+ static int test_wolfSSL_d2i_SSL_SESSION_bounds_check(void)
16497+ {
16498+ EXPECT_DECLS;
16499+ #if defined(OPENSSL_EXTRA) && defined(HAVE_EXT_CACHE) && \
16500+ defined(SESSION_CERTS)
16501+ WOLFSSL_SESSION* sess = NULL;
16502+ WOLFSSL_SESSION* restored = NULL;
16503+ unsigned char* sessDer = NULL;
16504+ unsigned char* modData = NULL;
16505+ const unsigned char* ptr = NULL;
16506+ unsigned char* pp = NULL;
16507+ int sz = 0;
16508+ int idx = 0;
16509+ int sessionIDSz = 0;
16510+ int altIDLen = 0;
16511+ int chainOffset = 0;
16512+ int newLen = 0;
16513+ word16 oversized = 0;
16514+
16515+ wolfSSL_Init();
16516+
16517+ /* Create and serialize a valid empty session to learn the format */
16518+ ExpectNotNull(sess = wolfSSL_SESSION_new());
16519+ ExpectIntGT((sz = wolfSSL_i2d_SSL_SESSION(sess, NULL)), 0);
16520+ ExpectNotNull(sessDer = (unsigned char*)XMALLOC(sz, NULL,
16521+ DYNAMIC_TYPE_OPENSSL));
16522+ pp = sessDer;
16523+ ExpectIntGT(wolfSSL_i2d_SSL_SESSION(sess, &pp), 0);
16524+ wolfSSL_SESSION_free(sess);
16525+ sess = NULL;
16526+
16527+ /* Calculate offset to chain.count field:
16528+ * side(1) + bornOn(4) + timeout(4) + sessionIDSz(1) + sessionID(var)
16529+ * + masterSecret(SECRET_LEN=48) + haveEMS(1) + altIDLen(1) + altID(var)
16530+ */
16531+ idx = 1 + 4 + 4;
16532+ if (EXPECT_SUCCESS()) {
16533+ sessionIDSz = sessDer[idx++];
16534+ idx += sessionIDSz + SECRET_LEN + 1;
16535+ altIDLen = sessDer[idx++];
16536+ if (altIDLen == ID_LEN)
16537+ idx += ID_LEN;
16538+ chainOffset = idx;
16539+ }
16540+
16541+ /*
16542+ * The deserialization must reject this with a BUFFER_ERROR (return NULL).
16543+ */
16544+ newLen = chainOffset + 1 + 50;
16545+ ExpectNotNull(modData = (unsigned char*)XMALLOC(newLen, NULL,
16546+ DYNAMIC_TYPE_TMP_BUFFER));
16547+ if (EXPECT_SUCCESS()) {
16548+ XMEMCPY(modData, sessDer, chainOffset);
16549+ modData[chainOffset] = MAX_CHAIN_DEPTH + 1;
16550+ XMEMSET(modData + chainOffset + 1, 0, newLen - chainOffset - 1);
16551+ }
16552+ ptr = modData;
16553+ ExpectNull(restored = wolfSSL_d2i_SSL_SESSION(NULL, &ptr, (long)newLen));
16554+ XFREE(modData, NULL, DYNAMIC_TYPE_TMP_BUFFER);
16555+ modData = NULL;
16556+
16557+ /*
16558+ * chain.count is valid (1), but the cert length field is too large.
16559+ */
16560+ newLen = chainOffset + 1 + 2 + 100;
16561+ ExpectNotNull(modData = (unsigned char*)XMALLOC(newLen, NULL,
16562+ DYNAMIC_TYPE_TMP_BUFFER));
16563+ if (EXPECT_SUCCESS()) {
16564+ XMEMCPY(modData, sessDer, chainOffset);
16565+ idx = chainOffset;
16566+ modData[idx++] = 1; /* chain.count = 1 */
16567+ oversized = MAX_X509_SIZE + 1;
16568+ modData[idx++] = (byte)(oversized >> 8);
16569+ modData[idx++] = (byte)(oversized & 0xFF);
16570+ XMEMSET(modData + idx, 0xCC, newLen - idx);
16571+ }
16572+ ptr = modData;
16573+ ExpectNull(restored = wolfSSL_d2i_SSL_SESSION(NULL, &ptr, (long)newLen));
16574+ XFREE(modData, NULL, DYNAMIC_TYPE_TMP_BUFFER);
16575+ modData = NULL;
16576+
16577+ XFREE(sessDer, NULL, DYNAMIC_TYPE_OPENSSL);
16578+ wolfSSL_Cleanup();
16579+ #endif
16580+ return EXPECT_RESULT();
16581+ }
16582+
1649616583static int test_wolfSSL_SESSION(void)
1649716584{
1649816585 EXPECT_DECLS;
@@ -31747,6 +31834,7 @@ TEST_CASE testCases[] = {
3174731834 TEST_DECL(test_wolfSSL_ciphersuite_auth),
3174831835 TEST_DECL(test_wolfSSL_sigalg_info),
3174931836 /* Can't memory test as tcp_connect aborts. */
31837+ TEST_DECL(test_wolfSSL_d2i_SSL_SESSION_bounds_check),
3175031838 TEST_DECL(test_wolfSSL_SESSION),
3175131839 TEST_DECL(test_wolfSSL_SESSION_expire_downgrade),
3175231840 TEST_DECL(test_wolfSSL_CTX_sess_set_remove_cb),
0 commit comments