256,
256,
},
+#ifdef OPENSSL_SSL_DEBUG_BROKEN_PROTOCOL
+ {
+ 1,
+ "SCSV",
+ SSL3_CK_SCSV,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ },
+#endif
#ifndef OPENSSL_NO_ECDH
/* Cipher C001 */
case SSL_CTRL_SET_CHAIN_CERT_STORE:
return ssl_cert_set_cert_store(s->cert, parg, 1, larg);
+ case SSL_CTRL_GET_PEER_SIGNATURE_NID:
+ if (TLS1_get_version(s) >= TLS1_2_VERSION)
+ {
+ if (s->session && s->session->sess_cert)
+ {
+ const EVP_MD *sig;
+ sig = s->session->sess_cert->peer_key->digest;
+ if (sig)
+ {
+ *(int *)parg = EVP_MD_type(sig);
+ return 1;
+ }
+ }
+ return 0;
+ }
+ /* Might want to do something here for other versions */
+ else
+ return 0;
+
+ case SSL_CTRL_GET_SERVER_TMP_KEY:
+ if (s->server || !s->session || !s->session->sess_cert)
+ return 0;
+ else
+ {
+ SESS_CERT *sc;
+ EVP_PKEY *ptmp;
+ int rv = 0;
+ sc = s->session->sess_cert;
+ if (!sc->peer_rsa_tmp && !sc->peer_dh_tmp
+ && !sc->peer_ecdh_tmp)
+ return 0;
+ ptmp = EVP_PKEY_new();
+ if (!ptmp)
+ return 0;
+ if (0);
+#ifndef OPENSSL_NO_RSA
+ else if (sc->peer_rsa_tmp)
+ rv = EVP_PKEY_set1_RSA(ptmp, sc->peer_rsa_tmp);
+#endif
+#ifndef OPENSSL_NO_DH
+ else if (sc->peer_dh_tmp)
+ rv = EVP_PKEY_set1_DH(ptmp, sc->peer_dh_tmp);
+#endif
+#ifndef OPENSSL_NO_ECDH
+ else if (sc->peer_ecdh_tmp)
+ rv = EVP_PKEY_set1_EC_KEY(ptmp, sc->peer_ecdh_tmp);
+#endif
+ if (rv)
+ {
+ *(EVP_PKEY **)parg = ptmp;
+ return 1;
+ }
+ EVP_PKEY_free(ptmp);
+ return 0;
+ }
+
+ case SSL_CTRL_GET_EC_POINT_FORMATS:
+ {
+ SSL_SESSION *sess = s->session;
+ const unsigned char **pformat = parg;
+ if (!sess || !sess->tlsext_ecpointformatlist)
+ return 0;
+ *pformat = sess->tlsext_ecpointformatlist;
+ return (int)sess->tlsext_ecpointformatlist_length;
+ }
+
default:
break;
}
#ifdef DEBUG_PRINT_UNKNOWN_CIPHERSUITES
if (cp == NULL) fprintf(stderr, "Unknown cipher ID %x\n", (p[0] << 8) | p[1]);
#endif
- if (cp == NULL || cp->valid == 0)
- return NULL;
- else
- return cp;
+ return cp;
}
int ssl3_put_cipher_by_char(const SSL_CIPHER *c, unsigned char *p)
}
#endif
- if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE)
+ if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE || tls1_suiteb(s))
{
prio = srvr;
allow = clnt;
/* if we are considering an ECC cipher suite that uses
* an ephemeral EC key check it */
if (alg_k & SSL_kEECDH)
- ok = ok && tls1_check_ec_tmp_key(s);
+ ok = ok && tls1_check_ec_tmp_key(s, c->id);
#endif /* OPENSSL_NO_EC */
#endif /* OPENSSL_NO_TLSEXT */
{
int ret=0;
const unsigned char *sig;
- size_t siglen;
+ size_t i, siglen;
int have_rsa_sign = 0, have_dsa_sign = 0, have_ecdsa_sign = 0;
int nostrict = 1;
unsigned long alg_k;
memcpy(p, s->cert->ctypes, s->cert->ctype_num);
return (int)s->cert->ctype_num;
}
- /* Else see if we have any signature algorithms configured */
- if (s->cert->client_sigalgs)
- {
- sig = s->cert->client_sigalgs;
- siglen = s->cert->client_sigalgslen;
- }
- else
- {
- sig = s->cert->conf_sigalgs;
- siglen = s->cert->conf_sigalgslen;
- }
- /* If we have sigalgs work out if we can sign with RSA, DSA, ECDSA */
- if (sig)
+ /* get configured sigalgs */
+ siglen = tls12_get_psigalgs(s, &sig);
+ if (s->cert->cert_flags & SSL_CERT_FLAGS_CHECK_TLS_STRICT)
+ nostrict = 0;
+ for (i = 0; i < siglen; i+=2, sig+=2)
{
- size_t i;
- if (s->cert->cert_flags & SSL_CERT_FLAG_TLS_STRICT)
- nostrict = 0;
- for (i = 0; i < siglen; i+=2, sig+=2)
+ switch(sig[1])
{
- switch(sig[1])
- {
- case TLSEXT_signature_rsa:
- have_rsa_sign = 1;
- break;
+ case TLSEXT_signature_rsa:
+ have_rsa_sign = 1;
+ break;
- case TLSEXT_signature_dsa:
- have_dsa_sign = 1;
- break;
+ case TLSEXT_signature_dsa:
+ have_dsa_sign = 1;
+ break;
- case TLSEXT_signature_ecdsa:
- have_ecdsa_sign = 1;
- break;
- }
+ case TLSEXT_signature_ecdsa:
+ have_ecdsa_sign = 1;
+ break;
}
}
- /* Otherwise allow anything */
- else
- {
- have_rsa_sign = 1;
- have_dsa_sign = 1;
- have_ecdsa_sign = 1;
- }
alg_k = s->s3->tmp.new_cipher->algorithm_mkey;