Browse Source

Audit use of tor_tls_cert_get_key().

This function is allowed to return NULL if the certified key isn't
RSA. But in a couple of places we were treating this as a bug or
internal error, and in one other place we weren't checking for it at
all!

Caught by Isis during code review for #15055.  The serious bug was
only on the 15055 branch, thank goodness.
Nick Mathewson 7 years ago
parent
commit
f156156d56
3 changed files with 7 additions and 8 deletions
  1. 1 1
      src/common/tortls.c
  2. 3 7
      src/or/channeltls.c
  3. 3 0
      src/or/torcert.c

+ 1 - 1
src/common/tortls.c

@@ -814,7 +814,7 @@ tor_tls_get_my_client_auth_key(void)
 
 /**
  * Return a newly allocated copy of the public key that a certificate
- * certifies.  Return NULL if the cert's key is not RSA.
+ * certifies. Watch out! This returns NULL if the cert's key is not RSA.
  */
 crypto_pk_t *
 tor_tls_cert_get_key(tor_x509_cert_t *cert)

+ 3 - 7
src/or/channeltls.c

@@ -1955,9 +1955,7 @@ channel_tls_process_certs_cell(var_cell_t *cell, channel_tls_t *chan)
 
       identity_rcvd = tor_tls_cert_get_key(id_cert);
       if (!identity_rcvd) {
-        //LCOV_EXCL_START
-        ERR("Internal error: Couldn't get RSA key from ID cert.");
-        //LCOV_EXCL_STOP
+        ERR("Couldn't get RSA key from ID cert.");
       }
       memcpy(chan->conn->handshake_state->authenticated_rsa_peer_id,
              id_digests->d[DIGEST_SHA1], DIGEST_LEN);
@@ -2242,10 +2240,8 @@ channel_tls_process_authenticate_cell(var_cell_t *cell, channel_tls_t *chan)
     size_t keysize;
     int signed_len;
 
-    if (BUG(!pk)) {
-      // LCOV_EXCL_START
-      ERR("Internal error: couldn't get RSA key from AUTH cert.");
-      // LCOV_EXCL_STOP
+    if (! pk) {
+      ERR("Couldn't get RSA key from AUTH cert.");
     }
     crypto_digest256(d, (char*)auth, V3_AUTH_BODY_LEN, DIGEST_SHA256);
 

+ 3 - 0
src/or/torcert.c

@@ -559,6 +559,9 @@ or_handshake_certs_ed25519_ok(int severity,
     ERR("Missing RSA->Ed25519 crosscert");
   }
   crypto_pk_t *rsa_id_key = tor_tls_cert_get_key(rsa_id_cert);
+  if (!rsa_id_key) {
+    ERR("RSA ID cert had no RSA key");
+  }
 
   if (rsa_ed25519_crosscert_check(certs->ed_rsa_crosscert,
                                   certs->ed_rsa_crosscert_len,