|
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,108 @@ 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 | +#if LIBWOLFSSL_VERSION_HEX <= 0x05008002 |
| 4820 | + dataSz = WOLFSSL_MAX_SESSION_TICKET_LEN; |
| 4821 | + dataBuf = (byte*)XMALLOC(dataSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); |
| 4822 | + if (dataBuf != NULL){ |
| 4823 | + /* attempt to get ticket data and ticket size */ |
| 4824 | + ret = wolfSSL_get_SessionTicket(ssl, dataBuf, &dataSz); |
| 4825 | + |
| 4826 | + if (ret == WOLFSSL_SUCCESS && dataSz > 0){ |
| 4827 | + sessionTicket = (*jenv)->NewByteArray(jenv, dataSz); |
| 4828 | + (*jenv)->SetByteArrayRegion(jenv, sessionTicket, 0, dataSz, |
| 4829 | + (jbyte*)dataBuf); |
| 4830 | + } else if (ret == WOLFSSL_SUCCESS && dataSz == 0) { |
| 4831 | + /* no session ticket available */ |
| 4832 | + printf("No ticket available or Session " |
| 4833 | + "ticket len is greater than data buffer len\n"); |
| 4834 | + } |
| 4835 | + |
| 4836 | + XFREE(dataBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER); |
| 4837 | + } |
| 4838 | +#else |
| 4839 | + /* get session ticket length */ |
| 4840 | + ret = wolfSSL_get_SessionTicket(ssl, dataBuf, &dataSz); |
| 4841 | + |
| 4842 | + if (ret == LENGTH_ONLY_E && dataSz > 0) { |
| 4843 | + /* allocate buffer */ |
| 4844 | + dataBuf = (byte*)XMALLOC(dataSz, NULL, DYNAMIC_TYPE_TMP_BUFFER); |
| 4845 | + if (dataBuf != NULL){ |
| 4846 | + /* get ticket data */ |
| 4847 | + ret = wolfSSL_get_SessionTicket(ssl, dataBuf, &dataSz); |
| 4848 | + |
| 4849 | + if (ret == WOLFSSL_SUCCESS && dataSz > 0){ |
| 4850 | + sessionTicket = (*jenv)->NewByteArray(jenv, dataSz); |
| 4851 | + (*jenv)->SetByteArrayRegion(jenv, sessionTicket, 0, dataSz, |
| 4852 | + (jbyte*)dataBuf); |
| 4853 | + } |
| 4854 | + |
| 4855 | + XFREE(dataBuf, NULL, DYNAMIC_TYPE_TMP_BUFFER); |
| 4856 | + } |
| 4857 | + } |
| 4858 | +#endif /* LIBWOLFSSL_VERSION_HEX */ |
| 4859 | + (void)jcl; |
| 4860 | +#else |
| 4861 | + (void)jenv; |
| 4862 | + (void)jcl; |
| 4863 | + (void)sslPtr; |
| 4864 | +#endif /* HAVE_SESSION_TICKET */ |
| 4865 | + return sessionTicket; |
| 4866 | +} |
| 4867 | + |
| 4868 | +JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLSession_setSessionTicket |
| 4869 | + (JNIEnv* jenv, jobject jcl, jlong sslPtr, jbyteArray dataBuf) |
| 4870 | +{ |
| 4871 | + int ret = SSL_FAILURE; |
| 4872 | +#ifdef HAVE_SESSION_TICKET |
| 4873 | + WOLFSSL* ssl = (WOLFSSL*)(uintptr_t)sslPtr; |
| 4874 | + byte* data = NULL; |
| 4875 | + word32 dataSz = 0; |
| 4876 | + |
| 4877 | + if (jenv == NULL || ssl == NULL || dataBuf == NULL) { |
| 4878 | + return BAD_FUNC_ARG; |
| 4879 | + } |
| 4880 | + |
| 4881 | + data = (byte*)(*jenv)->GetByteArrayElements(jenv, dataBuf, NULL); |
| 4882 | + dataSz = (*jenv)->GetArrayLength(jenv, dataBuf); |
| 4883 | + |
| 4884 | + if (data != NULL && dataSz > 0) { |
| 4885 | + ret = wolfSSL_set_SessionTicket(ssl, data, dataSz); |
| 4886 | + if (ret != WOLFSSL_SUCCESS) { |
| 4887 | + (*jenv)->ThrowNew(jenv, |
| 4888 | + (*jenv)->FindClass(jenv, "java/lang/Exception"), |
| 4889 | + "failed to set session ticket!"); |
| 4890 | + } |
| 4891 | + } |
| 4892 | + else { |
| 4893 | + ret = BAD_FUNC_ARG; |
| 4894 | + } |
| 4895 | + (*jenv)->ReleaseByteArrayElements(jenv, dataBuf, |
| 4896 | + (jbyte*)data, JNI_ABORT); |
| 4897 | + (void)jcl; |
| 4898 | +#else |
| 4899 | + (void)jenv; |
| 4900 | + (void)jcl; |
| 4901 | + (void)sslPtr; |
| 4902 | + ret = NOT_COMPILED_IN; |
| 4903 | +#endif /* HAVE_SESSION_TICKET */ |
| 4904 | + return ret; |
| 4905 | +} |
| 4906 | + |
4802 | 4907 | /* return 1 if last alert received was a close_notify alert, otherwise 0 */ |
4803 | 4908 | JNIEXPORT jint JNICALL Java_com_wolfssl_WolfSSLSession_gotCloseNotify |
4804 | 4909 | (JNIEnv* jenv, jobject jcl, jlong sslPtr) |
|
0 commit comments