external/conscrypt: add SSL_CIPHER_get_kx_name

This will be used by a future change to avoid needing to know the
OpenSSL-internal SSL_aRSA (etc) constants.

Bug: 20521989
Change-Id: I99d83005530f81956d102426fe28beeaed058cea
diff --git a/src/main/java/org/conscrypt/NativeCrypto.java b/src/main/java/org/conscrypt/NativeCrypto.java
index ecd176f..81986f2 100644
--- a/src/main/java/org/conscrypt/NativeCrypto.java
+++ b/src/main/java/org/conscrypt/NativeCrypto.java
@@ -1373,4 +1373,6 @@
             + SSL3_RT_HEADER_LENGTH;
 
     public static native long ERR_peek_last_error();
+
+    public static native String SSL_CIPHER_get_kx_name(long cipherAddress);
 }
diff --git a/src/main/native/org_conscrypt_NativeCrypto.cpp b/src/main/native/org_conscrypt_NativeCrypto.cpp
index 1bf5590..4dc22dc 100644
--- a/src/main/native/org_conscrypt_NativeCrypto.cpp
+++ b/src/main/native/org_conscrypt_NativeCrypto.cpp
@@ -10086,6 +10086,19 @@
     return ERR_peek_last_error();
 }
 
+static jstring NativeCrypto_SSL_CIPHER_get_kx_name(JNIEnv* env, jclass, jlong cipher_address) {
+    const SSL_CIPHER* cipher = to_SSL_CIPHER(env, cipher_address, true);
+    const char *kx_name = NULL;
+
+#if defined(OPENSSL_IS_BORINGSSL)
+    kx_name = SSL_CIPHER_get_kx_name(cipher);
+#else
+    kx_name = SSL_CIPHER_authentication_method(cipher);
+#endif
+
+    return env->NewStringUTF(kx_name);
+}
+
 #define FILE_DESCRIPTOR "Ljava/io/FileDescriptor;"
 #define SSL_CALLBACKS "L" TO_STRING(JNI_JARJAR_PREFIX) "org/conscrypt/NativeCrypto$SSLHandshakeCallbacks;"
 #define REF_EC_GROUP "L" TO_STRING(JNI_JARJAR_PREFIX) "org/conscrypt/NativeRef$EC_GROUP;"
@@ -10320,6 +10333,7 @@
     NATIVE_METHOD(NativeCrypto, SSL_set_alpn_protos, "(J[B)I"),
     NATIVE_METHOD(NativeCrypto, SSL_get0_alpn_selected, "(J)[B"),
     NATIVE_METHOD(NativeCrypto, ERR_peek_last_error, "()J"),
+    NATIVE_METHOD(NativeCrypto, SSL_CIPHER_get_kx_name, "(J)Ljava/lang/String;"),
 };
 
 static jclass getGlobalRefToClass(JNIEnv* env, const char* className) {