|
43 | 43 | /* Default wolfSSL_peek() timeout for wolfSSL_get_session(), ms */ |
44 | 44 | #define WOLFSSL_JNI_DEFAULT_PEEK_TIMEOUT 2000 |
45 | 45 | #endif |
| 46 | +#ifndef WOLFSSL_MAX_SESSION_TICKET_LEN |
| 47 | + #define WOLFSSL_MAX_SESSION_TICKET_LEN 2048 |
| 48 | +#endif |
46 | 49 |
|
47 | 50 | #include <wolfssl/ssl.h> |
48 | 51 | #include <wolfssl/error-ssl.h> |
@@ -4799,6 +4802,101 @@ JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLSession_useSessionTicket |
4799 | 4802 | return ret; |
4800 | 4803 | } |
4801 | 4804 |
|
| 4805 | +JNIEXPORT jbyteArray JNICALL Java_com_wolfssl_WolfSSLSession_getSessionTicket |
| 4806 | + (JNIEnv* jenv, jobject jcl, jlong sslPtr) |
| 4807 | +{ |
| 4808 | + jbyteArray sessionTicket = NULL; |
| 4809 | +#ifdef HAVE_SESSION_TICKET |
| 4810 | + int ret = SSL_FAILURE; |
| 4811 | + WOLFSSL* ssl = (WOLFSSL*)(uintptr_t)sslPtr; |
| 4812 | + word32 dataSz = 0; |
| 4813 | + byte* dataBuf = NULL; |
| 4814 | + |
| 4815 | + if (jenv == NULL || ssl == NULL) { |
| 4816 | + return NULL; |
| 4817 | + } |
| 4818 | + |
| 4819 | + /* retrieve ticket length */ |
| 4820 | + ret = wolfSSL_get_SessionTicket(ssl, NULL, &dataSz); |
| 4821 | + |
| 4822 | + if (ret != WOLFSSL_SUCCESS) { |
| 4823 | +#if LIBWOLFSSL_VERSION_HEX < 0x05008002 |
| 4824 | + /* In older versions of wolfSSL |
| 4825 | + dataSz must be set to a default value */ |
| 4826 | + dataSz = WOLFSSL_MAX_SESSION_TICKET_LEN; |
| 4827 | + dataBuf = XMALLOC(dataSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); |
| 4828 | + ret = wolfSSL_get_SessionTicket(ssl, dataBuf, &dataSz); |
| 4829 | + if (dataBuf != NULL) { |
| 4830 | + sessionTicket = (*jenv)->NewByteArray(jenv, dataSz); |
| 4831 | + (*jenv)->SetByteArrayRegion(jenv, sessionTicket, 0, dataSz, |
| 4832 | + (jbyte*)dataBuf); |
| 4833 | + /* Release old array */ |
| 4834 | + XFREE(dataBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER); |
| 4835 | + } |
| 4836 | +#else |
| 4837 | + if (ret != BAD_FUNC_ARG && dataSz > 0) { |
| 4838 | + dataBuf = XMALLOC(dataSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); |
| 4839 | + sessionTicket = (*jenv)->NewByteArray(jenv, dataSz); |
| 4840 | + if (dataBuf != NULL){ |
| 4841 | + ret = wolfSSL_get_SessionTicket(ssl, dataBuf, &dataSz); |
| 4842 | + } |
| 4843 | + if (ret == WOLFSSL_SUCCESS){ |
| 4844 | + (*jenv)->SetByteArrayRegion(jenv, sessionTicket, 0, dataSz, |
| 4845 | + (jbyte*)dataBuf); |
| 4846 | + XFREE(dataBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER); |
| 4847 | + } |
| 4848 | + } else { |
| 4849 | + printf("failed to get session ticket"); |
| 4850 | + } |
| 4851 | +#endif /* LIBWOLFSSL_VERSION_HEX */ |
| 4852 | + } |
| 4853 | +#else |
| 4854 | + (void)jenv; |
| 4855 | + (void)jcl; |
| 4856 | + (void)sslPtr; |
| 4857 | + (void)dataSz; |
| 4858 | +#endif /* HAVE_SESSION_TICKET */ |
| 4859 | + return sessionTicket; |
| 4860 | +} |
| 4861 | + |
| 4862 | +JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLSession_setSessionTicket |
| 4863 | + (JNIEnv* jenv, jobject jcl, jlong sslPtr, jbyteArray dataBuf) |
| 4864 | +{ |
| 4865 | + int ret = SSL_FAILURE; |
| 4866 | +#ifdef HAVE_SESSION_TICKET |
| 4867 | + WOLFSSL* ssl = (WOLFSSL*)(uintptr_t)sslPtr; |
| 4868 | + byte* data = NULL; |
| 4869 | + word32 dataSz = 0; |
| 4870 | + |
| 4871 | + if (jenv == NULL || ssl == NULL || dataBuf == NULL) { |
| 4872 | + return BAD_FUNC_ARG; |
| 4873 | + } |
| 4874 | + |
| 4875 | + data = (byte*)(*jenv)->GetByteArrayElements(jenv, dataBuf, NULL); |
| 4876 | + dataSz = (*jenv)->GetArrayLength(jenv, dataBuf); |
| 4877 | + |
| 4878 | + if (data != NULL && dataSz > 0) { |
| 4879 | + ret = wolfSSL_set_SessionTicket(ssl, data, dataSz); |
| 4880 | + if (ret != WOLFSSL_SUCCESS) { |
| 4881 | + (*jenv)->ThrowNew(jenv, jcl, |
| 4882 | + "failed to set session ticket!"); |
| 4883 | + } |
| 4884 | + } |
| 4885 | + else { |
| 4886 | + ret = BAD_FUNC_ARG; |
| 4887 | + } |
| 4888 | + (*jenv)->ReleaseByteArrayElements(jenv, dataBuf, |
| 4889 | + (jbyte*)data, JNI_ABORT); |
| 4890 | +#else |
| 4891 | + (void)jenv; |
| 4892 | + (void)jcl; |
| 4893 | + (void)sslPtr; |
| 4894 | + (void)dataSz; |
| 4895 | + ret = NOT_COMPILED_IN; |
| 4896 | +#endif /* HAVE_SESSION_TICKET */ |
| 4897 | + return ret; |
| 4898 | +} |
| 4899 | + |
4802 | 4900 | /* return 1 if last alert received was a close_notify alert, otherwise 0 */ |
4803 | 4901 | JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLSession_gotCloseNotify |
4804 | 4902 | (JNIEnv* jenv, jobject jcl, jlong sslPtr) |
|
0 commit comments