Attention is currently required from: Arne Schwabe.

Hello Arne Schwabe, 

I'd like you to reexamine a change. Please visit

    https://gerrit.openvpn.net/c/openvpn/+/2182?usp=email

to look at the new patch set (#2).


Change subject: mbedtls: print peer certificate details like the OpenSSL backend
......................................................................

mbedtls: print peer certificate details like the OpenSSL backend

The OpenSSL backend logs the type, size and curve of the peer's
certificate key, and the certificate signature algorithm. The mbed TLS
backend only logged the key size, which makes it harder to compare logs
of the two backends.

Print the key type, curve and signature algorithm for mbed TLS too, using
the OpenSSL short names for the signature algorithms.

mbed TLS 4 no longer offers functions to get curve or digest names, so
add the PSA curve family and size to our --tls-groups table, and a reverse
lookup to the digest table. While at it, add secp256k1 to the groups table
(used by our EC sample keys), which also makes it usable in --tls-groups.

Change-Id: Iefcfd9f29244d9ae6a5a68b6e9b507b55e3bf448
Signed-off-by: Steffan Karger <[email protected]>
---
M src/openvpn/crypto_mbedtls.c
M src/openvpn/crypto_mbedtls.h
M src/openvpn/ssl_mbedtls.c
3 files changed, 104 insertions(+), 14 deletions(-)


  git pull ssh://gerrit.openvpn.net:29418/openvpn refs/changes/82/2182/2

diff --git a/src/openvpn/crypto_mbedtls.c b/src/openvpn/crypto_mbedtls.c
index 0ea2375..46207bc 100644
--- a/src/openvpn/crypto_mbedtls.c
+++ b/src/openvpn/crypto_mbedtls.c
@@ -648,6 +648,19 @@
     return NULL;
 }

+const char *
+md_name_from_psa_alg(psa_algorithm_t psa_alg)
+{
+    for (size_t i = 0; i < md_info_table_entries; i++)
+    {
+        if (md_info_table[i].psa_alg == psa_alg)
+        {
+            return md_info_table[i].name;
+        }
+    }
+    return NULL;
+}
+
 bool
 md_valid(const char *digest)
 {
diff --git a/src/openvpn/crypto_mbedtls.h b/src/openvpn/crypto_mbedtls.h
index 5c3b670..e5f371a 100644
--- a/src/openvpn/crypto_mbedtls.h
+++ b/src/openvpn/crypto_mbedtls.h
@@ -111,6 +111,12 @@
 } hmac_ctx_t;

 /**
+ * Return the OpenVPN name of the message digest \p psa_alg, or NULL if the
+ * digest is not supported.
+ */
+const char *md_name_from_psa_alg(psa_algorithm_t psa_alg);
+
+/**
  * Log the supplied mbed TLS error, prefixed by supplied prefix.
  *
  * @param flags         Flags to indicate error type and priority.
diff --git a/src/openvpn/ssl_mbedtls.c b/src/openvpn/ssl_mbedtls.c
index 45d7715..ce3b2af 100644
--- a/src/openvpn/ssl_mbedtls.c
+++ b/src/openvpn/ssl_mbedtls.c
@@ -51,6 +51,7 @@
 #include <mbedtls/net_sockets.h>
 #include <mbedtls/oid.h>
 #include <mbedtls/pem.h>
+#include <mbedtls/psa_util.h>
 #include <mbedtls/version.h>

 static const mbedtls_x509_crt_profile openvpn_x509_crt_profile_legacy = {
@@ -260,56 +261,61 @@
 {
     const char *name;
     uint16_t tls_id;
+    psa_ecc_family_t ecc_family; /* 0 for groups that are not elliptic curves 
*/
+    size_t ecc_bits;
 } mbedtls_ecp_curve_info;

 static const mbedtls_ecp_curve_info ecp_curve_info_table[] = {
 /* secp curves. */
 #if defined(PSA_WANT_ECC_SECP_R1_256)
-    { "secp256r1", MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1 },
+    { "secp256r1", MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1, 
PSA_ECC_FAMILY_SECP_R1, 256 },
 #endif
 #if defined(PSA_WANT_ECC_SECP_R1_384)
-    { "secp384r1", MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1 },
+    { "secp384r1", MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1, 
PSA_ECC_FAMILY_SECP_R1, 384 },
 #endif
 #if defined(PSA_WANT_ECC_SECP_R1_521)
-    { "secp521r1", MBEDTLS_SSL_IANA_TLS_GROUP_SECP521R1 },
+    { "secp521r1", MBEDTLS_SSL_IANA_TLS_GROUP_SECP521R1, 
PSA_ECC_FAMILY_SECP_R1, 521 },
+#endif
+#if defined(PSA_WANT_ECC_SECP_K1_256)
+    { "secp256k1", MBEDTLS_SSL_IANA_TLS_GROUP_SECP256K1, 
PSA_ECC_FAMILY_SECP_K1, 256 },
 #endif

 /* Curve25519. */
 #if defined(PSA_WANT_ECC_MONTGOMERY_255)
-    { "X25519", MBEDTLS_SSL_IANA_TLS_GROUP_X25519 },
+    { "X25519", MBEDTLS_SSL_IANA_TLS_GROUP_X25519, PSA_ECC_FAMILY_MONTGOMERY, 
255 },
 #endif

 /* Curve448. */
 #if defined(PSA_WANT_ECC_MONTGOMERY_448)
-    { "X448", MBEDTLS_SSL_IANA_TLS_GROUP_X448 },
+    { "X448", MBEDTLS_SSL_IANA_TLS_GROUP_X448, PSA_ECC_FAMILY_MONTGOMERY, 448 
},
 #endif

 /* Brainpool curves. */
 #if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_256)
-    { "brainpoolP256r1", MBEDTLS_SSL_IANA_TLS_GROUP_BP256R1 },
+    { "brainpoolP256r1", MBEDTLS_SSL_IANA_TLS_GROUP_BP256R1, 
PSA_ECC_FAMILY_BRAINPOOL_P_R1, 256 },
 #endif
 #if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_384)
-    { "brainpoolP384r1", MBEDTLS_SSL_IANA_TLS_GROUP_BP384R1 },
+    { "brainpoolP384r1", MBEDTLS_SSL_IANA_TLS_GROUP_BP384R1, 
PSA_ECC_FAMILY_BRAINPOOL_P_R1, 384 },
 #endif
 #if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_512)
-    { "brainpoolP512r1", MBEDTLS_SSL_IANA_TLS_GROUP_BP512R1 },
+    { "brainpoolP512r1", MBEDTLS_SSL_IANA_TLS_GROUP_BP512R1, 
PSA_ECC_FAMILY_BRAINPOOL_P_R1, 512 },
 #endif

 /* Named Diffie-Hellman groups. */
 #if defined(PSA_WANT_DH_RFC7919_2048)
-    { "ffdhe2048", MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE2048 },
+    { "ffdhe2048", MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE2048, 0, 0 },
 #endif
 #if defined(PSA_WANT_DH_RFC7919_3072)
-    { "ffdhe3072", MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE3072 },
+    { "ffdhe3072", MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE3072, 0, 0 },
 #endif
 #if defined(PSA_WANT_DH_RFC7919_4096)
-    { "ffdhe4096", MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE4096 },
+    { "ffdhe4096", MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE4096, 0, 0 },
 #endif
 #if defined(PSA_WANT_DH_RFC7919_6144)
-    { "ffdhe6144", MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE6144 },
+    { "ffdhe6144", MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE6144, 0, 0 },
 #endif
 #if defined(PSA_WANT_DH_RFC7919_8192)
-    { "ffdhe8192", MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE8192 },
+    { "ffdhe8192", MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE8192, 0, 0 },
 #endif
 };
 static const size_t ecp_curve_info_table_items = sizeof(ecp_curve_info_table) 
/ sizeof(mbedtls_ecp_curve_info);
@@ -1194,6 +1200,71 @@
  * Print information for the end user.
  *
  ***************************************/
+/**
+ * Return the name of the elliptic curve identified by \p family and \p bits,
+ * or NULL if the curve is unknown.
+ */
+static const char *
+get_ecc_curve_name(psa_ecc_family_t family, size_t bits)
+{
+    for (size_t i = 0; i < ecp_curve_info_table_items; i++)
+    {
+        if (ecp_curve_info_table[i].ecc_family == family
+            && ecp_curve_info_table[i].ecc_bits == bits)
+        {
+            return ecp_curve_info_table[i].name;
+        }
+    }
+    return NULL;
+}
+
+/**
+ * Print human readable information about the public key of \p cert into
+ * \p buf, in the same format as the OpenSSL backend.
+ */
+static void
+print_cert_details(const mbedtls_x509_crt *cert, char *buf, size_t buflen)
+{
+    size_t bits = mbedtls_pk_get_bitlen(&cert->pk);
+    psa_key_type_t key_type = mbedtls_pk_get_key_type(&cert->pk);
+
+    char type[64] = "(error getting type)";
+    if (PSA_KEY_TYPE_IS_RSA(key_type))
+    {
+        snprintf(type, sizeof(type), "RSA");
+    }
+    else if (PSA_KEY_TYPE_IS_ECC(key_type))
+    {
+        const char *curve = 
get_ecc_curve_name(PSA_KEY_TYPE_ECC_GET_FAMILY(key_type), bits);
+        snprintf(type, sizeof(type), "EC, curve %s", curve ? curve : 
"(unknown)");
+    }
+
+    /* Use the OpenSSL short names, to have the same output for both backends 
*/
+    char sig[64] = { 0 };
+    const mbedtls_x509_buf no_sig_params = { 0 };
+    mbedtls_md_type_t sig_md;
+    mbedtls_pk_sigalg_t sig_pk;
+    if (MBEDTLS_OID_CMP(MBEDTLS_OID_RSASSA_PSS, &cert->sig_oid) == 0)
+    {
+        /* PSS parameters are not exposed, but OpenSSL omits the hash too */
+        snprintf(sig, sizeof(sig), ", signature: RSASSA-PSS");
+    }
+    else if (mbedtls_x509_get_sig_alg(&cert->sig_oid, &no_sig_params, &sig_md, 
&sig_pk) == 0)
+    {
+        const char *md_name = 
md_name_from_psa_alg(mbedtls_md_psa_alg_from_type(sig_md));
+        if (sig_pk == MBEDTLS_PK_SIGALG_RSA_PKCS1V15 && md_name)
+        {
+            snprintf(sig, sizeof(sig), ", signature: RSA-%s", md_name);
+        }
+        else if (sig_pk == MBEDTLS_PK_SIGALG_ECDSA && md_name)
+        {
+            snprintf(sig, sizeof(sig), ", signature: ecdsa-with-%s", md_name);
+        }
+    }
+
+    snprintf(buf, buflen, ", peer certificate: %zu bits %s%s", bits, type, 
sig);
+}
+
 void
 print_details(struct key_state_ssl *ks_ssl, const char *prefix)
 {
@@ -1208,7 +1279,7 @@
     cert = mbedtls_ssl_get_peer_cert(ks_ssl->ctx);
     if (cert != NULL)
     {
-        snprintf(s2, sizeof(s2), ", %u bit key", (unsigned 
int)mbedtls_pk_get_bitlen(&cert->pk));
+        print_cert_details(cert, s2, sizeof(s2));
     }

     msg(D_HANDSHAKE, "%s%s", s1, s2);

--
To view, visit https://gerrit.openvpn.net/c/openvpn/+/2182?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.openvpn.net/settings?usp=email

Gerrit-MessageType: newpatchset
Gerrit-Project: openvpn
Gerrit-Branch: master
Gerrit-Change-Id: Iefcfd9f29244d9ae6a5a68b6e9b507b55e3bf448
Gerrit-Change-Number: 2182
Gerrit-PatchSet: 2
Gerrit-Owner: Steffan Karger <[email protected]>
Gerrit-Reviewer: Arne Schwabe <[email protected]>
Gerrit-CC: openvpn-devel <[email protected]>
Gerrit-Attention: Arne Schwabe <[email protected]>
_______________________________________________
Openvpn-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openvpn-devel

Reply via email to