case GNUTLS_E_ASN1_TYPE_ANY_ERROR:
case GNUTLS_E_ASN1_SYNTAX_ERROR:
case GNUTLS_E_ASN1_DER_OVERFLOW:
- case GNUTLS_E_NO_CERTIFICATE_FOUND:
ret = GNUTLS_A_BAD_CERTIFICATE;
_level = GNUTLS_AL_FATAL;
break;
_level = GNUTLS_AL_FATAL;
break;
case GNUTLS_E_DH_PRIME_UNACCEPTABLE:
+ case GNUTLS_E_NO_CERTIFICATE_FOUND:
ret = GNUTLS_A_INSUFFICIENT_SECURITY;
_level = GNUTLS_AL_FATAL;
break;
_gnutls_recv_handshake(session, &data,
&datasize,
GNUTLS_HANDSHAKE_CERTIFICATE_PKT, optional);
+
if (ret < 0) {
+ /* Handle the case of old SSL3 clients who send
+ * a warning alert instead of an empty certificate to indicate
+ * no certificate.
+ */
if (optional == OPTIONAL_PACKET &&
ret == GNUTLS_E_WARNING_ALERT_RECEIVED &&
gnutls_protocol_get_version(session) == GNUTLS_SSL3 &&
gnutls_assert();
return 0;
}
- /* certificate was required */
- if (optional == MANDATORY_PACKET) {
+
+ /* certificate was required
+ */
+ if (ret == (GNUTLS_E_WARNING_ALERT_RECEIVED || ret == GNUTLS_E_FATAL_ALERT_RECEIVED) &&
+ optional == MANDATORY_PACKET) {
gnutls_assert();
return GNUTLS_E_NO_CERTIFICATE_FOUND;
}
return 0;
}
-
ret =
session->internals.auth_struct->
gnutls_process_client_certificate(session, data, datasize);