@@ -4007,11 +4007,12 @@ const EVP_HPKE_KEM* getHpkeKem(JNIEnv* env, jint kemValue) {
40074007 }
40084008}
40094009
4010- static jobject NativeCrypto_EVP_HPKE_CTX_setup_recipient (JNIEnv* env, jclass, jint kemValue,
4011- jint kdfValue, jint aeadValue,
4012- jbyteArray privateKeyArray,
4013- jbyteArray encArray,
4014- jbyteArray infoArray) {
4010+ static jobject NativeCrypto_EVP_HPKE_CTX_setup_base_mode_recipient (JNIEnv* env, jclass,
4011+ jint kemValue,jint kdfValue,
4012+ jint aeadValue,
4013+ jbyteArray privateKeyArray,
4014+ jbyteArray encArray,
4015+ jbyteArray infoArray) {
40154016 CHECK_ERROR_QUEUE_ON_RETURN;
40164017 JNI_TRACE (" EVP_HPKE_CTX_setup_recipient(%d, %d, %d, %p, %p, %p)" , kemValue, kdfValue, aeadValue,
40174018 privateKeyArray, encArray, infoArray);
@@ -4082,10 +4083,11 @@ static jobject NativeCrypto_EVP_HPKE_CTX_setup_recipient(JNIEnv* env, jclass, ji
40824083 return ctxObject.release ();
40834084}
40844085
4085- static jobjectArray NativeCrypto_EVP_HPKE_CTX_setup_sender (JNIEnv* env, jclass, jint kemValue,
4086- jint kdfValue, jint aeadValue,
4087- jbyteArray publicKeyArray,
4088- jbyteArray infoArray) {
4086+ static jobjectArray NativeCrypto_EVP_HPKE_CTX_setup_base_mode_sender (JNIEnv* env, jclass,
4087+ jint kemValue,jint kdfValue,
4088+ jint aeadValue,
4089+ jbyteArray publicKeyArray,
4090+ jbyteArray infoArray) {
40894091 CHECK_ERROR_QUEUE_ON_RETURN;
40904092 JNI_TRACE (" EVP_HPKE_CTX_setup_sender(%d, %d, %d, %p, %p)" , kemValue, kdfValue, aeadValue,
40914093 publicKeyArray, infoArray);
@@ -4165,7 +4167,7 @@ static jobjectArray NativeCrypto_EVP_HPKE_CTX_setup_sender(JNIEnv* env, jclass,
41654167 return result.release ();
41664168}
41674169
4168- static jobjectArray NativeCrypto_EVP_HPKE_CTX_setup_sender_with_seed_for_testing (
4170+ static jobjectArray NativeCrypto_EVP_HPKE_CTX_setup_base_mode_sender_with_seed_for_testing (
41694171 JNIEnv* env, jclass, jint kemValue, jint kdfValue, jint aeadValue,
41704172 jbyteArray publicKeyArray, jbyteArray infoArray, jbyteArray seedArray) {
41714173 CHECK_ERROR_QUEUE_ON_RETURN;
@@ -4861,6 +4863,20 @@ static jobjectArray NativeCrypto_get_X509_GENERAL_NAME_stack(JNIEnv* env, jclass
48614863 return joa.release ();
48624864}
48634865
4866+ /*
4867+ * Converts an ASN1_TIME to epoch time in milliseconds.
4868+ */
4869+ static jlong ASN1_TIME_convert_to_posix (JNIEnv* env, const ASN1_TIME* time) {
4870+ int64_t retval;
4871+ if (!ASN1_TIME_to_posix (time, &retval)) {
4872+ JNI_TRACE (" ASN1_TIME_convert_to_posix(%p) => Invalid date value" , time);
4873+ conscrypt::jniutil::throwParsingException (env, " Invalid date value" );
4874+ return 0 ;
4875+ }
4876+ // ASN1_TIME_to_posix can only return years from 0000 to 9999, so this won't overflow.
4877+ return static_cast <jlong>(retval * 1000 );
4878+ }
4879+
48644880static jlong NativeCrypto_X509_get_notBefore (JNIEnv* env, jclass, jlong x509Ref,
48654881 CONSCRYPT_UNUSED jobject holder) {
48664882 CHECK_ERROR_QUEUE_ON_RETURN;
@@ -4875,7 +4891,7 @@ static jlong NativeCrypto_X509_get_notBefore(JNIEnv* env, jclass, jlong x509Ref,
48754891
48764892 ASN1_TIME* notBefore = X509_get_notBefore (x509);
48774893 JNI_TRACE (" X509_get_notBefore(%p) => %p" , x509, notBefore);
4878- return reinterpret_cast < uintptr_t >( notBefore);
4894+ return ASN1_TIME_convert_to_posix (env, notBefore);
48794895}
48804896
48814897static jlong NativeCrypto_X509_get_notAfter (JNIEnv* env, jclass, jlong x509Ref,
@@ -4892,7 +4908,7 @@ static jlong NativeCrypto_X509_get_notAfter(JNIEnv* env, jclass, jlong x509Ref,
48924908
48934909 ASN1_TIME* notAfter = X509_get_notAfter (x509);
48944910 JNI_TRACE (" X509_get_notAfter(%p) => %p" , x509, notAfter);
4895- return reinterpret_cast < uintptr_t >( notAfter);
4911+ return ASN1_TIME_convert_to_posix (env, notAfter);
48964912}
48974913
48984914// NOLINTNEXTLINE(runtime/int)
@@ -5528,7 +5544,7 @@ static jlong NativeCrypto_get_X509_REVOKED_revocationDate(JNIEnv* env, jclass,
55285544
55295545 JNI_TRACE (" get_X509_REVOKED_revocationDate(%p) => %p" , revoked,
55305546 X509_REVOKED_get0_revocationDate (revoked));
5531- return reinterpret_cast < uintptr_t >( X509_REVOKED_get0_revocationDate (revoked));
5547+ return ASN1_TIME_convert_to_posix (env, X509_REVOKED_get0_revocationDate (revoked));
55325548}
55335549
55345550#ifdef __GNUC__
@@ -5622,7 +5638,7 @@ static jlong NativeCrypto_X509_CRL_get_lastUpdate(JNIEnv* env, jclass, jlong x50
56225638
56235639 ASN1_TIME* lastUpdate = X509_CRL_get_lastUpdate (crl);
56245640 JNI_TRACE (" X509_CRL_get_lastUpdate(%p) => %p" , crl, lastUpdate);
5625- return reinterpret_cast < uintptr_t >( lastUpdate);
5641+ return ASN1_TIME_convert_to_posix (env, lastUpdate);
56265642}
56275643
56285644static jlong NativeCrypto_X509_CRL_get_nextUpdate (JNIEnv* env, jclass, jlong x509CrlRef,
@@ -5639,7 +5655,7 @@ static jlong NativeCrypto_X509_CRL_get_nextUpdate(JNIEnv* env, jclass, jlong x50
56395655
56405656 ASN1_TIME* nextUpdate = X509_CRL_get_nextUpdate (crl);
56415657 JNI_TRACE (" X509_CRL_get_nextUpdate(%p) => %p" , crl, nextUpdate);
5642- return reinterpret_cast < uintptr_t >( nextUpdate);
5658+ return ASN1_TIME_convert_to_posix (env, nextUpdate);
56435659}
56445660
56455661static jbyteArray NativeCrypto_i2d_X509_REVOKED (JNIEnv* env, jclass, jlong x509RevokedRef) {
@@ -5663,63 +5679,6 @@ static jint NativeCrypto_X509_supported_extension(JNIEnv* env, jclass, jlong x50
56635679 return X509_supported_extension (ext);
56645680}
56655681
5666- static inline bool decimal_to_integer (const char * data, size_t len, int * out) {
5667- int ret = 0 ;
5668- for (size_t i = 0 ; i < len; i++) {
5669- ret *= 10 ;
5670- if (data[i] < ' 0' || data[i] > ' 9' ) {
5671- return false ;
5672- }
5673- ret += data[i] - ' 0' ;
5674- }
5675- *out = ret;
5676- return true ;
5677- }
5678-
5679- static void NativeCrypto_ASN1_TIME_to_Calendar (JNIEnv* env, jclass, jlong asn1TimeRef,
5680- jobject calendar) {
5681- CHECK_ERROR_QUEUE_ON_RETURN;
5682- ASN1_TIME* asn1Time = reinterpret_cast <ASN1_TIME*>(static_cast <uintptr_t >(asn1TimeRef));
5683- JNI_TRACE (" ASN1_TIME_to_Calendar(%p, %p)" , asn1Time, calendar);
5684-
5685- if (asn1Time == nullptr ) {
5686- conscrypt::jniutil::throwNullPointerException (env, " asn1Time == null" );
5687- return ;
5688- }
5689-
5690- if (!ASN1_TIME_check (asn1Time)) {
5691- conscrypt::jniutil::throwParsingException (env, " Invalid date format" );
5692- return ;
5693- }
5694-
5695- bssl::UniquePtr<ASN1_GENERALIZEDTIME> gen (ASN1_TIME_to_generalizedtime (asn1Time, nullptr ));
5696- if (gen.get () == nullptr ) {
5697- conscrypt::jniutil::throwParsingException (env,
5698- " ASN1_TIME_to_generalizedtime returned null" );
5699- return ;
5700- }
5701-
5702- if (ASN1_STRING_length (gen.get ()) < 14 || ASN1_STRING_get0_data (gen.get ()) == nullptr ) {
5703- conscrypt::jniutil::throwNullPointerException (env, " gen->length < 14 || gen->data == null" );
5704- return ;
5705- }
5706-
5707- int year, mon, mday, hour, min, sec;
5708- const char * data = reinterpret_cast <const char *>(ASN1_STRING_get0_data (gen.get ()));
5709- if (!decimal_to_integer (data, 4 , &year) ||
5710- !decimal_to_integer (data + 4 , 2 , &mon) ||
5711- !decimal_to_integer (data + 6 , 2 , &mday) ||
5712- !decimal_to_integer (data + 8 , 2 , &hour) ||
5713- !decimal_to_integer (data + 10 , 2 , &min) ||
5714- !decimal_to_integer (data + 12 , 2 , &sec)) {
5715- conscrypt::jniutil::throwParsingException (env, " Invalid date format" );
5716- return ;
5717- }
5718-
5719- env->CallVoidMethod (calendar, conscrypt::jniutil::calendar_setMethod, year, mon - 1 , mday, hour,
5720- min, sec);
5721- }
5722-
57235682// A CbsHandle is a structure used to manage resources allocated by asn1_read-*
57245683// functions so that they can be freed properly when finished. This struct owns
57255684// all objects pointed to by its members.
@@ -11135,9 +11094,9 @@ static JNINativeMethod sNativeCryptoMethods[] = {
1113511094 CONSCRYPT_NATIVE_METHOD(EVP_HPKE_CTX_free, " (J)V" ),
1113611095 CONSCRYPT_NATIVE_METHOD(EVP_HPKE_CTX_open, " (" REF_EVP_HPKE_CTX " [B[B)[B" ),
1113711096 CONSCRYPT_NATIVE_METHOD(EVP_HPKE_CTX_seal, " (" REF_EVP_HPKE_CTX " [B[B)[B" ),
11138- CONSCRYPT_NATIVE_METHOD(EVP_HPKE_CTX_setup_recipient , " (III[B[B[B)Ljava/lang/Object;" ),
11139- CONSCRYPT_NATIVE_METHOD(EVP_HPKE_CTX_setup_sender , " (III[B[B)[Ljava/lang/Object;" ),
11140- CONSCRYPT_NATIVE_METHOD(EVP_HPKE_CTX_setup_sender_with_seed_for_testing ,
11097+ CONSCRYPT_NATIVE_METHOD(EVP_HPKE_CTX_setup_base_mode_recipient , " (III[B[B[B)Ljava/lang/Object;" ),
11098+ CONSCRYPT_NATIVE_METHOD(EVP_HPKE_CTX_setup_base_mode_sender , " (III[B[B)[Ljava/lang/Object;" ),
11099+ CONSCRYPT_NATIVE_METHOD(EVP_HPKE_CTX_setup_base_mode_sender_with_seed_for_testing ,
1114111100 " (III[B[B[B)[Ljava/lang/Object;" ),
1114211101 CONSCRYPT_NATIVE_METHOD(HMAC_CTX_new, " ()J" ),
1114311102 CONSCRYPT_NATIVE_METHOD(HMAC_CTX_free, " (J)V" ),
@@ -11218,7 +11177,6 @@ static JNINativeMethod sNativeCryptoMethods[] = {
1121811177 CONSCRYPT_NATIVE_METHOD(X509_REVOKED_dup, " (J)J" ),
1121911178 CONSCRYPT_NATIVE_METHOD(i2d_X509_REVOKED, " (J)[B" ),
1122011179 CONSCRYPT_NATIVE_METHOD(X509_supported_extension, " (J)I" ),
11221- CONSCRYPT_NATIVE_METHOD(ASN1_TIME_to_Calendar, " (JLjava/util/Calendar;)V" ),
1122211180 CONSCRYPT_NATIVE_METHOD(asn1_read_init, " ([B)J" ),
1122311181 CONSCRYPT_NATIVE_METHOD(asn1_read_sequence, " (J)J" ),
1122411182 CONSCRYPT_NATIVE_METHOD(asn1_read_next_tag_is, " (JI)Z" ),
0 commit comments