pass server-name as argument as it can be ECH.public_name
diff --git a/include/picotls.h b/include/picotls.h
index b9048a4..3d20d43 100644
--- a/include/picotls.h
+++ b/include/picotls.h
@@ -657,9 +657,11 @@
* callback to the invocation of the verify_sign callback, verify_sign is called with both data and sign set to an empty buffer.
* The implementor of the callback should use that as the opportunity to free any temporary data allocated for the verify_sign
* callback.
+ * The name of the server to be verified, if any, is provided explicitly as `server_name`. When ECH is offered by the client but
+ * the was rejected by the server, this value can be different from that being sent via `ptls_get_server_name`.
*/
typedef struct st_ptls_verify_certificate_t {
- int (*cb)(struct st_ptls_verify_certificate_t *self, ptls_t *tls,
+ int (*cb)(struct st_ptls_verify_certificate_t *self, ptls_t *tls, const char *server_name,
int (**verify_sign)(void *verify_ctx, uint16_t algo, ptls_iovec_t data, ptls_iovec_t sign), void **verify_data,
ptls_iovec_t *certs, size_t num_certs);
/**
diff --git a/lib/openssl.c b/lib/openssl.c
index a153765..767dbef 100644
--- a/lib/openssl.c
+++ b/lib/openssl.c
@@ -1294,7 +1294,7 @@
return ret;
}
-static int verify_cert(ptls_verify_certificate_t *_self, ptls_t *tls,
+static int verify_cert(ptls_verify_certificate_t *_self, ptls_t *tls, const char *server_name,
int (**verifier)(void *, uint16_t, ptls_iovec_t, ptls_iovec_t), void **verify_data, ptls_iovec_t *certs,
size_t num_certs)
{
@@ -1319,7 +1319,7 @@
}
sk_X509_push(chain, interm);
}
- ret = verify_cert_chain(self->cert_store, cert, chain, ptls_is_server(tls), ptls_get_server_name(tls), &ossl_x509_err);
+ ret = verify_cert_chain(self->cert_store, cert, chain, ptls_is_server(tls), server_name, &ossl_x509_err);
} else {
ret = PTLS_ALERT_CERTIFICATE_REQUIRED;
ossl_x509_err = 0;
@@ -1389,7 +1389,7 @@
return NULL;
}
-static int verify_raw_cert(ptls_verify_certificate_t *_self, ptls_t *tls,
+static int verify_raw_cert(ptls_verify_certificate_t *_self, ptls_t *tls, const char *server_name,
int (**verifier)(void *, uint16_t algo, ptls_iovec_t, ptls_iovec_t), void **verify_data,
ptls_iovec_t *certs, size_t num_certs)
{
diff --git a/lib/picotls.c b/lib/picotls.c
index 8d89acb..8754b06 100644
--- a/lib/picotls.c
+++ b/lib/picotls.c
@@ -3065,7 +3065,15 @@
});
if (tls->ctx->verify_certificate != NULL) {
- if ((ret = tls->ctx->verify_certificate->cb(tls->ctx->verify_certificate, tls, &tls->certificate_verify.cb,
+ const char *server_name = NULL;
+ if (!ptls_is_server(tls)) {
+ if (tls->ech.offered && !ptls_is_ech_handshake(tls, NULL, NULL)) {
+ server_name = tls->ech.client.public_name;
+ } else {
+ server_name = tls->server_name;
+ }
+ }
+ if ((ret = tls->ctx->verify_certificate->cb(tls->ctx->verify_certificate, tls, server_name, &tls->certificate_verify.cb,
&tls->certificate_verify.verify_ctx, certs, num_certs)) != 0)
goto Exit;
}