struct bind_conf *s;
const uint8_t *extension_data;
size_t extension_len;
- int has_rsa = 0, has_ecdsa = 0, has_ecdsa_sig = 0;
+ int has_rsa_sig = 0, has_ecdsa_sig = 0;
char *wildp = NULL;
const uint8_t *servername;
sign = *extension_data++;
switch (sign) {
case TLSEXT_signature_rsa:
- has_rsa = 1;
+ has_rsa_sig = 1;
break;
case TLSEXT_signature_ecdsa:
has_ecdsa_sig = 1;
default:
continue;
}
- if (has_ecdsa_sig && has_rsa)
+ if (has_ecdsa_sig && has_rsa_sig)
break;
}
} else {
/* without TLSEXT_TYPE_signature_algorithms extension (< TLSv1.2) */
- has_rsa = 1;
+ has_rsa_sig = 1;
}
if (has_ecdsa_sig) { /* in very rare case: has ecdsa sign but not a ECDSA cipher */
const SSL_CIPHER *cipher;
size_t len;
const uint8_t *cipher_suites;
+ has_ecdsa_sig = 0;
#ifdef OPENSSL_IS_BORINGSSL
len = ctx->cipher_suites_len;
cipher_suites = ctx->cipher_suites;
cipher = SSL_CIPHER_find(ssl, cipher_suites);
#endif
if (cipher && SSL_CIPHER_get_auth_nid(cipher) == NID_auth_ecdsa) {
- has_ecdsa = 1;
+ has_ecdsa_sig = 1;
break;
}
}
if (!container_of(n, struct sni_ctx, name)->neg) {
switch(container_of(n, struct sni_ctx, name)->kinfo.sig) {
case TLSEXT_signature_ecdsa:
- if (has_ecdsa) {
+ if (!node_ecdsa)
node_ecdsa = n;
- goto find_one;
- }
break;
case TLSEXT_signature_rsa:
- if (has_rsa && !node_rsa) {
+ if (!node_rsa)
node_rsa = n;
- if (!has_ecdsa)
- goto find_one;
- }
break;
default: /* TLSEXT_signature_anonymous|dsa */
if (!node_anonymous)
if (!container_of(n, struct sni_ctx, name)->neg) {
switch(container_of(n, struct sni_ctx, name)->kinfo.sig) {
case TLSEXT_signature_ecdsa:
- if (has_ecdsa) {
+ if (!node_ecdsa)
node_ecdsa = n;
- goto find_one;
- }
break;
case TLSEXT_signature_rsa:
- if (has_rsa && !node_rsa) {
+ if (!node_rsa)
node_rsa = n;
- if (!has_ecdsa)
- goto find_one;
- }
break;
default: /* TLSEXT_signature_anonymous|dsa */
if (!node_anonymous)
}
}
}
- find_one:
/* select by key_signature priority order */
- node = node_ecdsa ? node_ecdsa : (node_rsa ? node_rsa : node_anonymous);
-
+ node = (has_ecdsa_sig && node_ecdsa) ? node_ecdsa
+ : ((has_rsa_sig && node_rsa) ? node_rsa
+ : (node_anonymous ? node_anonymous
+ : (node_ecdsa ? node_ecdsa /* no ecdsa signature case (< TLSv1.2) */
+ : node_rsa /* no rsa signature case (far far away) */
+ )));
if (node) {
/* switch ctx */
struct ssl_bind_conf *conf = container_of(node, struct sni_ctx, name)->conf;