)]}'
{
  "commit": "60c2867092af66bbe369f00d8214b6d06fcb376a",
  "tree": "4afd1d29e947c804ba1b56b96c531e2cb41cdb6a",
  "parents": [
    "69eec38a25a709553db67e5cba43b43c23e26848"
  ],
  "author": {
    "name": "David Benjamin",
    "email": "davidben@google.com",
    "time": "Fri Mar 01 12:37:47 2024 -0500"
  },
  "committer": {
    "name": "Boringssl LUCI CQ",
    "email": "boringssl-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "time": "Wed Mar 06 17:36:42 2024 +0000"
  },
  "message": "Check client certificate types in TLS \u003c\u003d 1.2\n\nTLS \u003c\u003d 1.2 servers indicate supported client certificate key types with\na certificate_types field in the CertificateRequest. Historically, we\u0027ve\njust ignored this field, because we\u0027ve always outsourced certificate\nselection to the caller anyway. This meant that, if you configured an\nRSA client certificate in response to a server that requested only ECDSA\ncertificates, we would happily send the certificate and leave it to the\nserver to decide if it was happy.\n\nStrictly speaking, this was in violation of RFC 5246:\n\n   -  The end-entity certificate provided by the client MUST contain a\n      key that is compatible with certificate_types. [...]\n\nAlthough prior TLS versions didn\u0027t say anything useful about this either\nway.\n\nOnce we move certificate selection into the library, we\u0027ll want to start\nevaluating supported algorithms ourselves. A natural implementation of\nit will, as a side effect, cause us to enforce this match, even when\nonly a single certificate is configured. Since this is unlikely to have\nany real compatibility impact (every TLS server I\u0027ve seen just hardcodes\nthis list), let\u0027s just try turning it on. On the off chance it does\nbreak someone, I\u0027ve left a flag, SSL_set_check_client_certificate_type,\nfor folks to turn this check off. The flag will most likely be\nunnecessary, in which case we can retire it after a few months.\n\nIf this does cause a problem, we can opt to turn it off for the default\ncertificate, or only enable it when multiple certificates are\nconfigured, or lean on the sigalgs list (doesn\u0027t work for 1.0/1.1), but\nthese all result in some slightly suboptimal behavior, so I think we\nshould treat them as contingency plans.\n\nUpdate-Note: A TLS 1.2 (or below) client, using client certificates,\nconnecting to a TLS server which doesn\u0027t support its certificate type\nwill now fail the connection slightly earlier, rather than sending the\ncertificate and waiting for the server to reject it. The connection\nshould fail either way, but now it will fail earlier with\nSSL_R_UNKNOWN_CERTIFICATE_TYPE. If the server was buggy and did not\ncorrectly advertise its own capabilities (very very unlikely), this may\ncause a connection to fail despite previously succeeding. We have\nincluded a temporary API, SSL_set_check_client_certificate_type, to\ndisable this behavior in the unlikely event this has any impact, but\nplease contact the BoringSSL team if you need it, as it will interfere\nwith improvements down the line.\n\nThis change does not affect servers requesting client certificates, only\nclients sending them.\n\nBug: 249\nChange-Id: I159bc444c4ee79fbe5c476d4253b48d58d2538be\nReviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/66687\nCommit-Queue: David Benjamin \u003cdavidben@google.com\u003e\nReviewed-by: Bob Beck \u003cbbe@google.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "f3aac2b356a2c544d67846f0f78d57dc559d7437",
      "old_mode": 33188,
      "old_path": "include/openssl/ssl.h",
      "new_id": "d0e5d6531c9de4a0787b94361a87aced348adc90",
      "new_mode": 33188,
      "new_path": "include/openssl/ssl.h"
    },
    {
      "type": "modify",
      "old_id": "102fa85d270952fc3cfc7996a6e11b55fbd1b6d5",
      "old_mode": 33188,
      "old_path": "ssl/handshake_client.cc",
      "new_id": "226299910857b894c84490e8f5b8e31e3d4ee320",
      "new_mode": 33188,
      "new_path": "ssl/handshake_client.cc"
    },
    {
      "type": "modify",
      "old_id": "d64f6c482f200d4af764a218d70f4a8da2909622",
      "old_mode": 33188,
      "old_path": "ssl/internal.h",
      "new_id": "844c579f674d8300869459f8009118ab97fbc441",
      "new_mode": 33188,
      "new_path": "ssl/internal.h"
    },
    {
      "type": "modify",
      "old_id": "55f426c3198fe8d8b9493eaf5cc0717d8a239d5e",
      "old_mode": 33188,
      "old_path": "ssl/ssl_lib.cc",
      "new_id": "b0d296868943f8b58f9941609348d61f98af7d27",
      "new_mode": 33188,
      "new_path": "ssl/ssl_lib.cc"
    },
    {
      "type": "modify",
      "old_id": "5a534936bc85d2af90a0cbdcafcb141526e4b55b",
      "old_mode": 33188,
      "old_path": "ssl/test/runner/runner.go",
      "new_id": "bbb4d3671bd415e6077d3cf4623d792e4d5fd526",
      "new_mode": 33188,
      "new_path": "ssl/test/runner/runner.go"
    },
    {
      "type": "modify",
      "old_id": "d359894bbd77061658ac855a7bd22413a119695f",
      "old_mode": 33188,
      "old_path": "ssl/test/test_config.cc",
      "new_id": "1883558d0c5f8f56a0ac0912332f5dee9bed2fda",
      "new_mode": 33188,
      "new_path": "ssl/test/test_config.cc"
    },
    {
      "type": "modify",
      "old_id": "4be2b604cecd0c9a31e203df77c3dbd23b0fd30d",
      "old_mode": 33188,
      "old_path": "ssl/test/test_config.h",
      "new_id": "8911a661bcc779b7490caf7c591e34e8b8c13077",
      "new_mode": 33188,
      "new_path": "ssl/test/test_config.h"
    }
  ]
}
