Delay decision on supported certs
diff --git a/lib/picotls.c b/lib/picotls.c
index 94944a8..ba4d74c 100644
--- a/lib/picotls.c
+++ b/lib/picotls.c
@@ -2434,6 +2434,7 @@
static const ptls_raw_extension_t no_unknown_extensions = {UINT16_MAX};
ptls_raw_extension_t *unknown_extensions = (ptls_raw_extension_t *)&no_unknown_extensions;
int ret, skip_early_data = 1;
+ const uint8_t *server_offered_cert_type = NULL;
decode_extensions(src, end, PTLS_HANDSHAKE_TYPE_ENCRYPTED_EXTENSIONS, &type, {
if (tls->ctx->on_extension != NULL &&
@@ -2493,11 +2494,7 @@
ret = PTLS_ALERT_DECODE_ERROR;
goto Exit;
}
- if ((tls->ctx->use_raw_public_keys && *src != PTLS_CERTIFICATE_TYPE_RAW_PUBLIC_KEY) &&
- *src != PTLS_CERTIFICATE_TYPE_X509) {
- ret = PTLS_ALERT_UNSUPPORTED_CERTIFICATE;
- goto Exit;
- }
+ server_offered_cert_type = src;
src = end;
break;
default:
@@ -2517,6 +2514,18 @@
src = end;
});
+ if (tls->ctx->use_raw_public_keys) {
+ if (server_offered_cert_type == NULL || *server_offered_cert_type != PTLS_CERTIFICATE_TYPE_RAW_PUBLIC_KEY) {
+ ret = PTLS_ALERT_UNSUPPORTED_CERTIFICATE;
+ goto Exit;
+ }
+ } else {
+ if (server_offered_cert_type != NULL && *server_offered_cert_type != PTLS_CERTIFICATE_TYPE_X509) {
+ ret = PTLS_ALERT_UNSUPPORTED_CERTIFICATE;
+ goto Exit;
+ }
+ }
+
if (tls->esni != NULL) {
if (esni_nonce == NULL || !ptls_mem_equal(esni_nonce, tls->esni->nonce, PTLS_ESNI_NONCE_SIZE)) {
ret = PTLS_ALERT_ILLEGAL_PARAMETER;