@@ -67,6 +67,66 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_WolfSSLX509StoreCtx_isCertPath
6767 return 0 ;
6868}
6969
70+ /* Check if wolfSSL supports custom verification time (check_time)
71+ * in WOLFSSL_X509_STORE. This was added in wolfSSL after 5.8.4 and is
72+ * needed for PKIXBuilderParameters.setDate() support.
73+ *
74+ * To detect support, we set check_time on a WOLFSSL_X509_STORE, init a
75+ * WOLFSSL_X509_STORE_CTX from it, and verify that check_time was propagated
76+ * to the context. Older wolfSSL versions do not propagate. */
77+ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_WolfSSLX509StoreCtx_isNativeStoreCheckTimeSupported
78+ (JNIEnv * env , jclass jcl )
79+ {
80+ #ifdef OPENSSL_EXTRA
81+ WOLFSSL_X509_STORE * store = NULL ;
82+ WOLFSSL_X509_STORE_CTX * ctx = NULL ;
83+ int supported = 0 ;
84+
85+ (void )env ;
86+ (void )jcl ;
87+
88+ if (!isCertPathBuilderAvailable ()) {
89+ return 0 ;
90+ }
91+
92+ store = wolfSSL_X509_STORE_new ();
93+ if (store == NULL ) {
94+ return 0 ;
95+ }
96+
97+ ctx = wolfSSL_X509_STORE_CTX_new ();
98+ if (ctx == NULL ) {
99+ wolfSSL_X509_STORE_free (store );
100+ return 0 ;
101+ }
102+
103+ /* Set a test check_time on the store, using 1000000 just to test */
104+ if (store -> param != NULL ) {
105+ store -> param -> check_time = (time_t )1000000 ;
106+ store -> param -> flags |= WOLFSSL_USE_CHECK_TIME ;
107+ }
108+
109+ /* Init ctx with the store and check if check_time
110+ * was propagated from store->param to ctx->param */
111+ if (wolfSSL_X509_STORE_CTX_init (ctx , store , NULL , NULL ) ==
112+ WOLFSSL_SUCCESS ) {
113+ if (ctx -> param != NULL &&
114+ ctx -> param -> check_time == (time_t )1000000 ) {
115+ supported = 1 ;
116+ }
117+ }
118+
119+ wolfSSL_X509_STORE_CTX_free (ctx );
120+ wolfSSL_X509_STORE_free (store );
121+
122+ return supported ;
123+ #else
124+ (void )env ;
125+ (void )jcl ;
126+ return 0 ;
127+ #endif
128+ }
129+
70130JNIEXPORT jlong JNICALL Java_com_wolfssl_wolfcrypt_WolfSSLX509StoreCtx_wolfSSL_1X509_1STORE_1new
71131 (JNIEnv * env , jclass jcl )
72132{
@@ -90,6 +150,71 @@ JNIEXPORT jlong JNICALL Java_com_wolfssl_wolfcrypt_WolfSSLX509StoreCtx_wolfSSL_1
90150 return (jlong )(uintptr_t )store ;
91151}
92152
153+ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_WolfSSLX509StoreCtx_wolfSSL_1X509_1STORE_1set_1flags
154+ (JNIEnv * env , jclass jcl , jlong storePtr , jlong flags )
155+ {
156+ int ret = 0 ;
157+ #ifdef OPENSSL_EXTRA
158+ WOLFSSL_X509_STORE * store = (WOLFSSL_X509_STORE * )(uintptr_t )storePtr ;
159+
160+ (void )env ;
161+ (void )jcl ;
162+
163+ if (store == NULL ) {
164+ return BAD_FUNC_ARG ;
165+ }
166+
167+ if (store -> param == NULL ) {
168+ return BAD_FUNC_ARG ;
169+ }
170+
171+ /* Set flags directly on store->param->flags for NO_CHECK_TIME */
172+ store -> param -> flags |= (unsigned long )flags ;
173+
174+ #else
175+ (void )env ;
176+ (void )jcl ;
177+ (void )storePtr ;
178+ (void )flags ;
179+ ret = NOT_COMPILED_IN ;
180+ #endif
181+
182+ return ret ;
183+ }
184+
185+ JNIEXPORT jint JNICALL Java_com_wolfssl_wolfcrypt_WolfSSLX509StoreCtx_wolfSSL_1X509_1STORE_1set_1time
186+ (JNIEnv * env , jclass jcl , jlong storePtr , jlong epochSeconds )
187+ {
188+ int ret = 0 ;
189+ #ifdef OPENSSL_EXTRA
190+ WOLFSSL_X509_STORE * store = (WOLFSSL_X509_STORE * )(uintptr_t )storePtr ;
191+
192+ (void )env ;
193+ (void )jcl ;
194+
195+ if (store == NULL ) {
196+ return BAD_FUNC_ARG ;
197+ }
198+
199+ if (store -> param == NULL ) {
200+ return BAD_FUNC_ARG ;
201+ }
202+
203+ /* Set custom check time and enable the flag */
204+ store -> param -> check_time = (time_t )epochSeconds ;
205+ store -> param -> flags |= WOLFSSL_USE_CHECK_TIME ;
206+
207+ #else
208+ (void )env ;
209+ (void )jcl ;
210+ (void )storePtr ;
211+ (void )epochSeconds ;
212+ ret = NOT_COMPILED_IN ;
213+ #endif
214+
215+ return ret ;
216+ }
217+
93218JNIEXPORT void JNICALL Java_com_wolfssl_wolfcrypt_WolfSSLX509StoreCtx_wolfSSL_1X509_1STORE_1free
94219 (JNIEnv * env , jclass jcl , jlong storePtr )
95220{
0 commit comments