forked from wolfSSL/wolfssl
move CipherRequires() to both client and server, VerifyClientSuite() to client only
This commit is contained in:
896
src/internal.c
896
src/internal.c
@ -3129,6 +3129,429 @@ static int BuildFinished(CYASSL* ssl, Hashes* hashes, const byte* sender)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* cipher requirements */
|
||||||
|
enum {
|
||||||
|
REQUIRES_RSA,
|
||||||
|
REQUIRES_DHE,
|
||||||
|
REQUIRES_ECC_DSA,
|
||||||
|
REQUIRES_ECC_STATIC,
|
||||||
|
REQUIRES_PSK,
|
||||||
|
REQUIRES_NTRU,
|
||||||
|
REQUIRES_RSA_SIG
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Does this cipher suite (first, second) have the requirement
|
||||||
|
an ephemeral key exchange will still require the key for signing
|
||||||
|
the key exchange so ECHDE_RSA requires an rsa key thus rsa_kea */
|
||||||
|
static int CipherRequires(byte first, byte second, int requirement)
|
||||||
|
{
|
||||||
|
/* ECC extensions */
|
||||||
|
if (first == ECC_BYTE) {
|
||||||
|
|
||||||
|
switch (second) {
|
||||||
|
|
||||||
|
#ifndef NO_RSA
|
||||||
|
case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA :
|
||||||
|
if (requirement == REQUIRES_ECC_STATIC)
|
||||||
|
return 1;
|
||||||
|
if (requirement == REQUIRES_RSA_SIG)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
#ifndef NO_DES3
|
||||||
|
case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA :
|
||||||
|
if (requirement == REQUIRES_ECC_STATIC)
|
||||||
|
return 1;
|
||||||
|
if (requirement == REQUIRES_RSA_SIG)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef NO_RC4
|
||||||
|
case TLS_ECDHE_RSA_WITH_RC4_128_SHA :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_ECDH_RSA_WITH_RC4_128_SHA :
|
||||||
|
if (requirement == REQUIRES_ECC_STATIC)
|
||||||
|
return 1;
|
||||||
|
if (requirement == REQUIRES_RSA_SIG)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#endif /* NO_RSA */
|
||||||
|
|
||||||
|
#ifndef NO_DES3
|
||||||
|
case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA :
|
||||||
|
if (requirement == REQUIRES_ECC_DSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA :
|
||||||
|
if (requirement == REQUIRES_ECC_STATIC)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifndef NO_RC4
|
||||||
|
case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA :
|
||||||
|
if (requirement == REQUIRES_ECC_DSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_ECDH_ECDSA_WITH_RC4_128_SHA :
|
||||||
|
if (requirement == REQUIRES_ECC_STATIC)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifndef NO_RSA
|
||||||
|
case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA :
|
||||||
|
if (requirement == REQUIRES_ECC_STATIC)
|
||||||
|
return 1;
|
||||||
|
if (requirement == REQUIRES_RSA_SIG)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA :
|
||||||
|
if (requirement == REQUIRES_ECC_DSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA :
|
||||||
|
if (requirement == REQUIRES_ECC_STATIC)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA :
|
||||||
|
if (requirement == REQUIRES_ECC_DSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA :
|
||||||
|
if (requirement == REQUIRES_ECC_STATIC)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 :
|
||||||
|
if (requirement == REQUIRES_ECC_DSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 :
|
||||||
|
if (requirement == REQUIRES_ECC_DSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 :
|
||||||
|
if (requirement == REQUIRES_ECC_STATIC)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 :
|
||||||
|
if (requirement == REQUIRES_ECC_STATIC)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
#ifndef NO_RSA
|
||||||
|
case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 :
|
||||||
|
if (requirement == REQUIRES_ECC_STATIC)
|
||||||
|
return 1;
|
||||||
|
if (requirement == REQUIRES_RSA_SIG)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 :
|
||||||
|
if (requirement == REQUIRES_ECC_STATIC)
|
||||||
|
return 1;
|
||||||
|
if (requirement == REQUIRES_RSA_SIG)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_RSA_WITH_AES_128_CCM_8 :
|
||||||
|
case TLS_RSA_WITH_AES_256_CCM_8 :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
if (requirement == REQUIRES_RSA_SIG)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 :
|
||||||
|
case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
if (requirement == REQUIRES_RSA_SIG)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 :
|
||||||
|
case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 :
|
||||||
|
if (requirement == REQUIRES_RSA_SIG)
|
||||||
|
return 1;
|
||||||
|
if (requirement == REQUIRES_ECC_STATIC)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 :
|
||||||
|
case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 :
|
||||||
|
if (requirement == REQUIRES_ECC_DSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 :
|
||||||
|
case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 :
|
||||||
|
if (requirement == REQUIRES_ECC_DSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 :
|
||||||
|
case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 :
|
||||||
|
if (requirement == REQUIRES_ECC_DSA)
|
||||||
|
return 1;
|
||||||
|
if (requirement == REQUIRES_ECC_STATIC)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_PSK_WITH_AES_128_CCM:
|
||||||
|
case TLS_PSK_WITH_AES_256_CCM:
|
||||||
|
case TLS_PSK_WITH_AES_128_CCM_8:
|
||||||
|
case TLS_PSK_WITH_AES_256_CCM_8:
|
||||||
|
if (requirement == REQUIRES_PSK)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_DHE_PSK_WITH_AES_128_CCM:
|
||||||
|
case TLS_DHE_PSK_WITH_AES_256_CCM:
|
||||||
|
if (requirement == REQUIRES_PSK)
|
||||||
|
return 1;
|
||||||
|
if (requirement == REQUIRES_DHE)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
CYASSL_MSG("Unsupported cipher suite, CipherRequires ECC");
|
||||||
|
return 0;
|
||||||
|
} /* switch */
|
||||||
|
} /* if */
|
||||||
|
if (first != ECC_BYTE) { /* normal suites */
|
||||||
|
switch (second) {
|
||||||
|
|
||||||
|
#ifndef NO_RSA
|
||||||
|
case SSL_RSA_WITH_RC4_128_SHA :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_NTRU_RSA_WITH_RC4_128_SHA :
|
||||||
|
if (requirement == REQUIRES_NTRU)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SSL_RSA_WITH_RC4_128_MD5 :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SSL_RSA_WITH_3DES_EDE_CBC_SHA :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA :
|
||||||
|
if (requirement == REQUIRES_NTRU)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_RSA_WITH_AES_128_CBC_SHA :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_RSA_WITH_AES_128_CBC_SHA256 :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_NTRU_RSA_WITH_AES_128_CBC_SHA :
|
||||||
|
if (requirement == REQUIRES_NTRU)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_RSA_WITH_AES_256_CBC_SHA :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_RSA_WITH_AES_256_CBC_SHA256 :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_RSA_WITH_NULL_SHA :
|
||||||
|
case TLS_RSA_WITH_NULL_SHA256 :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_NTRU_RSA_WITH_AES_256_CBC_SHA :
|
||||||
|
if (requirement == REQUIRES_NTRU)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
case TLS_PSK_WITH_AES_128_GCM_SHA256 :
|
||||||
|
case TLS_PSK_WITH_AES_256_GCM_SHA384 :
|
||||||
|
case TLS_PSK_WITH_AES_128_CBC_SHA256 :
|
||||||
|
case TLS_PSK_WITH_AES_256_CBC_SHA384 :
|
||||||
|
case TLS_PSK_WITH_AES_128_CBC_SHA :
|
||||||
|
case TLS_PSK_WITH_AES_256_CBC_SHA :
|
||||||
|
case TLS_PSK_WITH_NULL_SHA384 :
|
||||||
|
case TLS_PSK_WITH_NULL_SHA256 :
|
||||||
|
case TLS_PSK_WITH_NULL_SHA :
|
||||||
|
if (requirement == REQUIRES_PSK)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 :
|
||||||
|
case TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 :
|
||||||
|
case TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 :
|
||||||
|
case TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 :
|
||||||
|
case TLS_DHE_PSK_WITH_NULL_SHA384 :
|
||||||
|
case TLS_DHE_PSK_WITH_NULL_SHA256 :
|
||||||
|
if (requirement == REQUIRES_DHE)
|
||||||
|
return 1;
|
||||||
|
if (requirement == REQUIRES_PSK)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
#ifndef NO_RSA
|
||||||
|
case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
if (requirement == REQUIRES_DHE)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
if (requirement == REQUIRES_DHE)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_DHE_RSA_WITH_AES_128_CBC_SHA :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
if (requirement == REQUIRES_DHE)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_DHE_RSA_WITH_AES_256_CBC_SHA :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
if (requirement == REQUIRES_DHE)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_RSA_WITH_HC_128_MD5 :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_RSA_WITH_HC_128_SHA :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_RSA_WITH_HC_128_B2B256:
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_RSA_WITH_AES_128_CBC_B2B256:
|
||||||
|
case TLS_RSA_WITH_AES_256_CBC_B2B256:
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_RSA_WITH_RABBIT_SHA :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_RSA_WITH_AES_128_GCM_SHA256 :
|
||||||
|
case TLS_RSA_WITH_AES_256_GCM_SHA384 :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 :
|
||||||
|
case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
if (requirement == REQUIRES_DHE)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA :
|
||||||
|
case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA :
|
||||||
|
case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
|
||||||
|
case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA :
|
||||||
|
case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA :
|
||||||
|
case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
|
||||||
|
case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
|
||||||
|
if (requirement == REQUIRES_RSA)
|
||||||
|
return 1;
|
||||||
|
if (requirement == REQUIRES_RSA_SIG)
|
||||||
|
return 1;
|
||||||
|
if (requirement == REQUIRES_DHE)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
default:
|
||||||
|
CYASSL_MSG("Unsupported cipher suite, CipherRequires");
|
||||||
|
return 0;
|
||||||
|
} /* switch */
|
||||||
|
} /* if ECC / Normal suites else */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifndef NO_CERTS
|
#ifndef NO_CERTS
|
||||||
|
|
||||||
|
|
||||||
@ -8012,6 +8435,31 @@ static void PickHashSigAlgo(CYASSL* ssl,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Make sure client setup is valid for this suite, true on success */
|
||||||
|
int VerifyClientSuite(CYASSL* ssl)
|
||||||
|
{
|
||||||
|
int havePSK = 0;
|
||||||
|
byte first = ssl->options.cipherSuite0;
|
||||||
|
byte second = ssl->options.cipherSuite;
|
||||||
|
|
||||||
|
CYASSL_ENTER("VerifyClientSuite");
|
||||||
|
|
||||||
|
#ifndef NO_PSK
|
||||||
|
havePSK = ssl->options.havePSK;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (CipherRequires(first, second, REQUIRES_PSK)) {
|
||||||
|
CYASSL_MSG("Requires PSK");
|
||||||
|
if (havePSK == 0) {
|
||||||
|
CYASSL_MSG("Don't have PSK");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1; /* success */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifndef NO_CERTS
|
#ifndef NO_CERTS
|
||||||
/* just read in and ignore for now TODO: */
|
/* just read in and ignore for now TODO: */
|
||||||
static int DoCertificateRequest(CYASSL* ssl, const byte* input, word32*
|
static int DoCertificateRequest(CYASSL* ssl, const byte* input, word32*
|
||||||
@ -10146,454 +10594,6 @@ static void PickHashSigAlgo(CYASSL* ssl,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* cipher requirements */
|
|
||||||
enum {
|
|
||||||
REQUIRES_RSA,
|
|
||||||
REQUIRES_DHE,
|
|
||||||
REQUIRES_ECC_DSA,
|
|
||||||
REQUIRES_ECC_STATIC,
|
|
||||||
REQUIRES_PSK,
|
|
||||||
REQUIRES_NTRU,
|
|
||||||
REQUIRES_RSA_SIG
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Does this cipher suite (first, second) have the requirement
|
|
||||||
an ephemeral key exchange will still require the key for signing
|
|
||||||
the key exchange so ECHDE_RSA requires an rsa key thus rsa_kea */
|
|
||||||
static int CipherRequires(byte first, byte second, int requirement)
|
|
||||||
{
|
|
||||||
/* ECC extensions */
|
|
||||||
if (first == ECC_BYTE) {
|
|
||||||
|
|
||||||
switch (second) {
|
|
||||||
|
|
||||||
#ifndef NO_RSA
|
|
||||||
case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA :
|
|
||||||
if (requirement == REQUIRES_ECC_STATIC)
|
|
||||||
return 1;
|
|
||||||
if (requirement == REQUIRES_RSA_SIG)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
#ifndef NO_DES3
|
|
||||||
case TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA :
|
|
||||||
if (requirement == REQUIRES_ECC_STATIC)
|
|
||||||
return 1;
|
|
||||||
if (requirement == REQUIRES_RSA_SIG)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef NO_RC4
|
|
||||||
case TLS_ECDHE_RSA_WITH_RC4_128_SHA :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_ECDH_RSA_WITH_RC4_128_SHA :
|
|
||||||
if (requirement == REQUIRES_ECC_STATIC)
|
|
||||||
return 1;
|
|
||||||
if (requirement == REQUIRES_RSA_SIG)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
#endif /* NO_RSA */
|
|
||||||
|
|
||||||
#ifndef NO_DES3
|
|
||||||
case TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA :
|
|
||||||
if (requirement == REQUIRES_ECC_DSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA :
|
|
||||||
if (requirement == REQUIRES_ECC_STATIC)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
#ifndef NO_RC4
|
|
||||||
case TLS_ECDHE_ECDSA_WITH_RC4_128_SHA :
|
|
||||||
if (requirement == REQUIRES_ECC_DSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_ECDH_ECDSA_WITH_RC4_128_SHA :
|
|
||||||
if (requirement == REQUIRES_ECC_STATIC)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
#ifndef NO_RSA
|
|
||||||
case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA :
|
|
||||||
if (requirement == REQUIRES_ECC_STATIC)
|
|
||||||
return 1;
|
|
||||||
if (requirement == REQUIRES_RSA_SIG)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA :
|
|
||||||
if (requirement == REQUIRES_ECC_DSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA :
|
|
||||||
if (requirement == REQUIRES_ECC_STATIC)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA :
|
|
||||||
if (requirement == REQUIRES_ECC_DSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA :
|
|
||||||
if (requirement == REQUIRES_ECC_STATIC)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 :
|
|
||||||
if (requirement == REQUIRES_ECC_DSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 :
|
|
||||||
if (requirement == REQUIRES_ECC_DSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 :
|
|
||||||
if (requirement == REQUIRES_ECC_STATIC)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 :
|
|
||||||
if (requirement == REQUIRES_ECC_STATIC)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
#ifndef NO_RSA
|
|
||||||
case TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 :
|
|
||||||
if (requirement == REQUIRES_ECC_STATIC)
|
|
||||||
return 1;
|
|
||||||
if (requirement == REQUIRES_RSA_SIG)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 :
|
|
||||||
if (requirement == REQUIRES_ECC_STATIC)
|
|
||||||
return 1;
|
|
||||||
if (requirement == REQUIRES_RSA_SIG)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_RSA_WITH_AES_128_CCM_8 :
|
|
||||||
case TLS_RSA_WITH_AES_256_CCM_8 :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
if (requirement == REQUIRES_RSA_SIG)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 :
|
|
||||||
case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
if (requirement == REQUIRES_RSA_SIG)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 :
|
|
||||||
case TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 :
|
|
||||||
if (requirement == REQUIRES_RSA_SIG)
|
|
||||||
return 1;
|
|
||||||
if (requirement == REQUIRES_ECC_STATIC)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
case TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 :
|
|
||||||
case TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 :
|
|
||||||
if (requirement == REQUIRES_ECC_DSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 :
|
|
||||||
case TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 :
|
|
||||||
if (requirement == REQUIRES_ECC_DSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 :
|
|
||||||
case TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 :
|
|
||||||
if (requirement == REQUIRES_ECC_DSA)
|
|
||||||
return 1;
|
|
||||||
if (requirement == REQUIRES_ECC_STATIC)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_PSK_WITH_AES_128_CCM:
|
|
||||||
case TLS_PSK_WITH_AES_256_CCM:
|
|
||||||
case TLS_PSK_WITH_AES_128_CCM_8:
|
|
||||||
case TLS_PSK_WITH_AES_256_CCM_8:
|
|
||||||
if (requirement == REQUIRES_PSK)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_DHE_PSK_WITH_AES_128_CCM:
|
|
||||||
case TLS_DHE_PSK_WITH_AES_256_CCM:
|
|
||||||
if (requirement == REQUIRES_PSK)
|
|
||||||
return 1;
|
|
||||||
if (requirement == REQUIRES_DHE)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
CYASSL_MSG("Unsupported cipher suite, CipherRequires ECC");
|
|
||||||
return 0;
|
|
||||||
} /* switch */
|
|
||||||
} /* if */
|
|
||||||
if (first != ECC_BYTE) { /* normal suites */
|
|
||||||
switch (second) {
|
|
||||||
|
|
||||||
#ifndef NO_RSA
|
|
||||||
case SSL_RSA_WITH_RC4_128_SHA :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_NTRU_RSA_WITH_RC4_128_SHA :
|
|
||||||
if (requirement == REQUIRES_NTRU)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SSL_RSA_WITH_RC4_128_MD5 :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SSL_RSA_WITH_3DES_EDE_CBC_SHA :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA :
|
|
||||||
if (requirement == REQUIRES_NTRU)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_RSA_WITH_AES_128_CBC_SHA :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_RSA_WITH_AES_128_CBC_SHA256 :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_NTRU_RSA_WITH_AES_128_CBC_SHA :
|
|
||||||
if (requirement == REQUIRES_NTRU)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_RSA_WITH_AES_256_CBC_SHA :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_RSA_WITH_AES_256_CBC_SHA256 :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_RSA_WITH_NULL_SHA :
|
|
||||||
case TLS_RSA_WITH_NULL_SHA256 :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_NTRU_RSA_WITH_AES_256_CBC_SHA :
|
|
||||||
if (requirement == REQUIRES_NTRU)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
case TLS_PSK_WITH_AES_128_GCM_SHA256 :
|
|
||||||
case TLS_PSK_WITH_AES_256_GCM_SHA384 :
|
|
||||||
case TLS_PSK_WITH_AES_128_CBC_SHA256 :
|
|
||||||
case TLS_PSK_WITH_AES_256_CBC_SHA384 :
|
|
||||||
case TLS_PSK_WITH_AES_128_CBC_SHA :
|
|
||||||
case TLS_PSK_WITH_AES_256_CBC_SHA :
|
|
||||||
case TLS_PSK_WITH_NULL_SHA384 :
|
|
||||||
case TLS_PSK_WITH_NULL_SHA256 :
|
|
||||||
case TLS_PSK_WITH_NULL_SHA :
|
|
||||||
if (requirement == REQUIRES_PSK)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 :
|
|
||||||
case TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 :
|
|
||||||
case TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 :
|
|
||||||
case TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 :
|
|
||||||
case TLS_DHE_PSK_WITH_NULL_SHA384 :
|
|
||||||
case TLS_DHE_PSK_WITH_NULL_SHA256 :
|
|
||||||
if (requirement == REQUIRES_DHE)
|
|
||||||
return 1;
|
|
||||||
if (requirement == REQUIRES_PSK)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
#ifndef NO_RSA
|
|
||||||
case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
if (requirement == REQUIRES_DHE)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
if (requirement == REQUIRES_DHE)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_DHE_RSA_WITH_AES_128_CBC_SHA :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
if (requirement == REQUIRES_DHE)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_DHE_RSA_WITH_AES_256_CBC_SHA :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
if (requirement == REQUIRES_DHE)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_RSA_WITH_HC_128_MD5 :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_RSA_WITH_HC_128_SHA :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_RSA_WITH_HC_128_B2B256:
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_RSA_WITH_AES_128_CBC_B2B256:
|
|
||||||
case TLS_RSA_WITH_AES_256_CBC_B2B256:
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_RSA_WITH_RABBIT_SHA :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_RSA_WITH_AES_128_GCM_SHA256 :
|
|
||||||
case TLS_RSA_WITH_AES_256_GCM_SHA384 :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 :
|
|
||||||
case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
if (requirement == REQUIRES_DHE)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA :
|
|
||||||
case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA :
|
|
||||||
case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
|
|
||||||
case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA :
|
|
||||||
case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA :
|
|
||||||
case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 :
|
|
||||||
case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 :
|
|
||||||
if (requirement == REQUIRES_RSA)
|
|
||||||
return 1;
|
|
||||||
if (requirement == REQUIRES_RSA_SIG)
|
|
||||||
return 1;
|
|
||||||
if (requirement == REQUIRES_DHE)
|
|
||||||
return 1;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
default:
|
|
||||||
CYASSL_MSG("Unsupported cipher suite, CipherRequires");
|
|
||||||
return 0;
|
|
||||||
} /* switch */
|
|
||||||
} /* if ECC / Normal suites else */
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Make sure client setup is valid for this suite, true on success */
|
|
||||||
int VerifyClientSuite(CYASSL* ssl)
|
|
||||||
{
|
|
||||||
int havePSK = 0;
|
|
||||||
byte first = ssl->options.cipherSuite0;
|
|
||||||
byte second = ssl->options.cipherSuite;
|
|
||||||
|
|
||||||
CYASSL_ENTER("VerifyClientSuite");
|
|
||||||
|
|
||||||
#ifndef NO_PSK
|
|
||||||
havePSK = ssl->options.havePSK;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (CipherRequires(first, second, REQUIRES_PSK)) {
|
|
||||||
CYASSL_MSG("Requires PSK");
|
|
||||||
if (havePSK == 0) {
|
|
||||||
CYASSL_MSG("Don't have PSK");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1; /* success */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Make sure server cert/key are valid for this suite, true on success */
|
/* Make sure server cert/key are valid for this suite, true on success */
|
||||||
static int VerifyServerSuite(CYASSL* ssl, word16 idx)
|
static int VerifyServerSuite(CYASSL* ssl, word16 idx)
|
||||||
{
|
{
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
|
|
||||||
int SetCipherSpecs(CYASSL* ssl)
|
int SetCipherSpecs(CYASSL* ssl)
|
||||||
{
|
{
|
||||||
|
#ifndef NO_CYASSL_CLIENT
|
||||||
if (ssl->options.side == CYASSL_CLIENT_END) {
|
if (ssl->options.side == CYASSL_CLIENT_END) {
|
||||||
/* server side verified before SetCipherSpecs call */
|
/* server side verified before SetCipherSpecs call */
|
||||||
if (VerifyClientSuite(ssl) != 1) {
|
if (VerifyClientSuite(ssl) != 1) {
|
||||||
@ -46,6 +47,8 @@ int SetCipherSpecs(CYASSL* ssl)
|
|||||||
return UNSUPPORTED_SUITE;
|
return UNSUPPORTED_SUITE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif /* NO_CYASSL_CLIENT */
|
||||||
|
|
||||||
/* ECC extensions, or AES-CCM */
|
/* ECC extensions, or AES-CCM */
|
||||||
if (ssl->options.cipherSuite0 == ECC_BYTE) {
|
if (ssl->options.cipherSuite0 == ECC_BYTE) {
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user