Skip to content

Commit e54e348

Browse files
authored
Add SSL_set1_groups to NativeCrypto. (#1443)
1 parent 8bc2c42 commit e54e348

File tree

4 files changed

+85
-0
lines changed

4 files changed

+85
-0
lines changed

common/src/jni/main/cpp/conscrypt/native_crypto.cc

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9861,6 +9861,39 @@ static jstring NativeCrypto_SSL_get_current_cipher(JNIEnv* env, jclass, jlong ss
98619861
return env->NewStringUTF(name);
98629862
}
98639863

9864+
static void NativeCrypto_SSL_set1_groups(JNIEnv* env, jclass, jlong sslAddress,
9865+
CONSCRYPT_UNUSED jobject sslHolder, jintArray groups) {
9866+
CHECK_ERROR_QUEUE_ON_RETURN;
9867+
SSL* ssl = to_SSL(env, sslAddress, /* throwIfNull= */ true);
9868+
JNI_TRACE("ssl=%p NativeCrypto_SSL_set1_groups groups=%p", ssl, groups);
9869+
if (ssl == nullptr) {
9870+
// to_SSL already called conscrypt::jniutil::throwNullPointerException
9871+
return;
9872+
}
9873+
if (groups == nullptr) {
9874+
conscrypt::jniutil::throwNullPointerException(env, "groups == null");
9875+
return;
9876+
}
9877+
ScopedIntArrayRO groups_ro(env, groups);
9878+
if (groups_ro.get() == nullptr) {
9879+
JNI_TRACE("ssl=%p NativeCrypto_SSL_set1_groups => threw exception", ssl);
9880+
conscrypt::jniutil::throwOutOfMemory(env, "Unable to allocate buffer for groups");
9881+
return;
9882+
}
9883+
std::vector<int> groups_vector;
9884+
groups_vector.reserve(groups_ro.size());
9885+
const jint* groups_ptr = groups_ro.get();
9886+
for (int i = 0; i < groups_ro.size(); i++) {
9887+
groups_vector.push_back(groups_ptr[i]);
9888+
}
9889+
9890+
if (!SSL_set1_groups(ssl, groups_vector.data(), groups_vector.size())) {
9891+
conscrypt::jniutil::throwSSLExceptionStr(env, "Error parsing groups");
9892+
ERR_clear_error();
9893+
return;
9894+
}
9895+
}
9896+
98649897
static jstring NativeCrypto_SSL_get_curve_name(JNIEnv* env, jclass, jlong sslAddress,
98659898
CONSCRYPT_UNUSED jobject sslHolder) {
98669899
CHECK_ERROR_QUEUE_ON_RETURN;
@@ -12497,6 +12530,7 @@ static JNINativeMethod sNativeCryptoMethods[] = {
1249712530
CONSCRYPT_NATIVE_METHOD(SSL_get_servername, "(J" REF_SSL ")Ljava/lang/String;"),
1249812531
CONSCRYPT_NATIVE_METHOD(SSL_do_handshake, "(J" REF_SSL FILE_DESCRIPTOR SSL_CALLBACKS "I)V"),
1249912532
CONSCRYPT_NATIVE_METHOD(SSL_get_current_cipher, "(J" REF_SSL ")Ljava/lang/String;"),
12533+
CONSCRYPT_NATIVE_METHOD(SSL_set1_groups, "(J" REF_SSL "[I)V"),
1250012534
CONSCRYPT_NATIVE_METHOD(SSL_get_curve_name, "(J" REF_SSL ")Ljava/lang/String;"),
1250112535
CONSCRYPT_NATIVE_METHOD(SSL_get_version, "(J" REF_SSL ")Ljava/lang/String;"),
1250212536
CONSCRYPT_NATIVE_METHOD(SSL_get0_peer_certificates, "(J" REF_SSL ")[[B"),

common/src/main/java/org/conscrypt/NativeCrypto.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1343,6 +1343,8 @@ static native void SSL_do_handshake(long ssl, NativeSsl ssl_holder, FileDescript
13431343

13441344
public static native String SSL_get_current_cipher(long ssl, NativeSsl ssl_holder);
13451345

1346+
public static native void SSL_set1_groups(long ssl, NativeSsl sslHolder, int[] groups);
1347+
13461348
public static native String SSL_get_curve_name(long ssl, NativeSsl sslHolder);
13471349

13481350
public static native String SSL_get_version(long ssl, NativeSsl ssl_holder);

constants/src/gen/cpp/generate_constants.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,14 @@ int main(int /* argc */, char ** /* argv */) {
6060
CONST(EVP_PKEY_ML_DSA_65);
6161
CONST(EVP_PKEY_ML_DSA_87);
6262

63+
CONST(NID_X25519);
64+
CONST(NID_X9_62_prime256v1);
65+
CONST(NID_secp384r1);
66+
CONST(NID_secp521r1);
67+
CONST(NID_X25519MLKEM768);
68+
CONST(NID_X25519Kyber768Draft00);
69+
CONST(NID_ML_KEM_1024);
70+
6371
CONST(RSA_PKCS1_PADDING);
6472
CONST(RSA_NO_PADDING);
6573
CONST(RSA_PKCS1_OAEP_PADDING);

openjdk/src/test/java/org/conscrypt/NativeCryptoTest.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,47 @@ public void test_SSL_new() throws Exception {
356356
NativeCrypto.SSL_CTX_free(c, null);
357357
}
358358

359+
@Test
360+
public void setGroupsList_validGroups_works() throws Exception {
361+
long c = NativeCrypto.SSL_CTX_new();
362+
long s = NativeCrypto.SSL_new(c, null);
363+
364+
NativeCrypto.SSL_set1_groups(s, null, new int[] {NativeConstants.NID_X25519});
365+
NativeCrypto.SSL_set1_groups(s, null, new int[] {NativeConstants.NID_X9_62_prime256v1});
366+
NativeCrypto.SSL_set1_groups(s, null, new int[] {NativeConstants.NID_secp384r1});
367+
NativeCrypto.SSL_set1_groups(s, null, new int[] {NativeConstants.NID_secp521r1});
368+
NativeCrypto.SSL_set1_groups(s, null, new int[] {NativeConstants.NID_X25519MLKEM768});
369+
NativeCrypto.SSL_set1_groups(
370+
s, null, new int[] {NativeConstants.NID_X25519Kyber768Draft00});
371+
NativeCrypto.SSL_set1_groups(s, null, new int[] {NativeConstants.NID_ML_KEM_1024});
372+
373+
NativeCrypto.SSL_set1_groups(s, null,
374+
new int[] {NativeConstants.NID_X25519, NativeConstants.NID_X9_62_prime256v1,
375+
NativeConstants.NID_secp384r1, NativeConstants.NID_secp521r1,
376+
NativeConstants.NID_X25519MLKEM768,
377+
NativeConstants.NID_X25519Kyber768Draft00,
378+
NativeConstants.NID_ML_KEM_1024});
379+
380+
NativeCrypto.SSL_free(s, null);
381+
NativeCrypto.SSL_CTX_free(c, null);
382+
}
383+
384+
@Test
385+
public void setGroupsList_invalidInput_throws() throws Exception {
386+
long c = NativeCrypto.SSL_CTX_new();
387+
long s = NativeCrypto.SSL_new(c, null);
388+
389+
assertThrows(NullPointerException.class, () -> NativeCrypto.SSL_set1_groups(s, null, null));
390+
391+
assertThrows(SSLException.class,
392+
()
393+
-> NativeCrypto.SSL_set1_groups(
394+
s, null, new int[] {NativeConstants.EVP_PKEY_RSA}));
395+
396+
NativeCrypto.SSL_free(s, null);
397+
NativeCrypto.SSL_CTX_free(c, null);
398+
}
399+
359400
@Test
360401
public void setLocalCertsAndPrivateKey_withNullSSLShouldThrow() throws Exception {
361402
assertThrows(NullPointerException.class,

0 commit comments

Comments
 (0)