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