forked from wolfSSL/wolfssl
fedora crypto-policies: initial support.
This commit is contained in:
19
configure.ac
19
configure.ac
@ -8993,6 +8993,25 @@ AC_ARG_WITH([libsuffix],
|
|||||||
)
|
)
|
||||||
AC_SUBST(LIBSUFFIX)
|
AC_SUBST(LIBSUFFIX)
|
||||||
|
|
||||||
|
# Support system wide crypto-policy file:
|
||||||
|
# - Pass path to your wolfssl.config system crypto-policy file.
|
||||||
|
# - Pass no argument to use default.
|
||||||
|
AC_ARG_WITH([sys-crypto-policy],
|
||||||
|
[AS_HELP_STRING([--with-sys-crypto-policy=PATH],[Support for system-wide crypto-policy file. (default: disabled)])],
|
||||||
|
[ SYS_CRYPTO_POLICY=$withval],
|
||||||
|
[ SYS_CRYPTO_POLICY=no ]
|
||||||
|
)
|
||||||
|
|
||||||
|
if test "$SYS_CRYPTO_POLICY" != "no"; then
|
||||||
|
if test "$SYS_CRYPTO_POLICY" = "yes"; then
|
||||||
|
# Default to the wolfssl fedora crypto-policy file.
|
||||||
|
SYS_CRYPTO_POLICY="/etc/crypto-policies/back-ends/wolfssl.config"
|
||||||
|
fi
|
||||||
|
|
||||||
|
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SYS_CRYPTO_POLICY"
|
||||||
|
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_CRYPTO_POLICY_FILE=\"$SYS_CRYPTO_POLICY\""
|
||||||
|
fi
|
||||||
|
|
||||||
AC_ARG_ENABLE([context-extra-user-data],
|
AC_ARG_ENABLE([context-extra-user-data],
|
||||||
[AS_HELP_STRING([--enable-context-extra-user-data],[Enables option for storing user-defined data in TLS API contexts, with optional argument the number of slots to allocate (default: disabled)])],
|
[AS_HELP_STRING([--enable-context-extra-user-data],[Enables option for storing user-defined data in TLS API contexts, with optional argument the number of slots to allocate (default: disabled)])],
|
||||||
[ ENABLED_EX_DATA=$enableval ],
|
[ ENABLED_EX_DATA=$enableval ],
|
||||||
|
@ -1168,7 +1168,7 @@ static int ClientWriteRead(WOLFSSL* ssl, const char* msg, int msgSz,
|
|||||||
/* 4. add the same message into Japanese section */
|
/* 4. add the same message into Japanese section */
|
||||||
/* (will be translated later) */
|
/* (will be translated later) */
|
||||||
/* 5. add printf() into suitable position of Usage() */
|
/* 5. add printf() into suitable position of Usage() */
|
||||||
static const char* client_usage_msg[][77] = {
|
static const char* client_usage_msg[][78] = {
|
||||||
/* English */
|
/* English */
|
||||||
{
|
{
|
||||||
" NOTE: All files relative to wolfSSL home dir\n", /* 0 */
|
" NOTE: All files relative to wolfSSL home dir\n", /* 0 */
|
||||||
@ -1404,9 +1404,12 @@ static const char* client_usage_msg[][77] = {
|
|||||||
"--rpk Use RPK for the defined certificates\n", /* 74 */
|
"--rpk Use RPK for the defined certificates\n", /* 74 */
|
||||||
#endif
|
#endif
|
||||||
"--files-are-der Specified files are in DER, not PEM format\n", /* 75 */
|
"--files-are-der Specified files are in DER, not PEM format\n", /* 75 */
|
||||||
|
#ifdef WOLFSSL_SYS_CRYPTO_POLICY
|
||||||
|
"--crypto-policy <path to crypto policy file>\n", /* 76 */
|
||||||
|
#endif
|
||||||
"\n"
|
"\n"
|
||||||
"For simpler wolfSSL TLS client examples, visit\n"
|
"For simpler wolfSSL TLS client examples, visit\n"
|
||||||
"https://github.com/wolfSSL/wolfssl-examples/tree/master/tls\n", /* 76 */
|
"https://github.com/wolfSSL/wolfssl-examples/tree/master/tls\n", /* 77 */
|
||||||
NULL,
|
NULL,
|
||||||
},
|
},
|
||||||
#ifndef NO_MULTIBYTE_PRINT
|
#ifndef NO_MULTIBYTE_PRINT
|
||||||
@ -1649,10 +1652,13 @@ static const char* client_usage_msg[][77] = {
|
|||||||
"--rpk Use RPK for the defined certificates\n", /* 74 */
|
"--rpk Use RPK for the defined certificates\n", /* 74 */
|
||||||
#endif
|
#endif
|
||||||
"--files-are-der Specified files are in DER, not PEM format\n", /* 75 */
|
"--files-are-der Specified files are in DER, not PEM format\n", /* 75 */
|
||||||
|
#ifdef WOLFSSL_SYS_CRYPTO_POLICY
|
||||||
|
"--crypto-policy <path to crypto policy file>\n", /* 76 */
|
||||||
|
#endif
|
||||||
"\n"
|
"\n"
|
||||||
"より簡単なwolfSSL TLS クライアントの例については"
|
"より簡単なwolfSSL TLS クライアントの例については"
|
||||||
"下記にアクセスしてください\n"
|
"下記にアクセスしてください\n"
|
||||||
"https://github.com/wolfSSL/wolfssl-examples/tree/master/tls\n", /* 76 */
|
"https://github.com/wolfSSL/wolfssl-examples/tree/master/tls\n", /* 77 */
|
||||||
NULL,
|
NULL,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
@ -2069,6 +2075,9 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args)
|
|||||||
{ "rpk", 0, 267 },
|
{ "rpk", 0, 267 },
|
||||||
#endif /* HAVE_RPK */
|
#endif /* HAVE_RPK */
|
||||||
{ "files-are-der", 0, 268 },
|
{ "files-are-der", 0, 268 },
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
{ "crypto-policy", 1, 269 },
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
{ 0, 0, 0 }
|
{ 0, 0, 0 }
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
@ -2213,6 +2222,10 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args)
|
|||||||
int useRPK = 0;
|
int useRPK = 0;
|
||||||
#endif /* HAVE_RPK */
|
#endif /* HAVE_RPK */
|
||||||
int fileFormat = WOLFSSL_FILETYPE_PEM;
|
int fileFormat = WOLFSSL_FILETYPE_PEM;
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
const char * policy = NULL;
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
|
||||||
|
|
||||||
char buffer[WOLFSSL_MAX_ERROR_SZ];
|
char buffer[WOLFSSL_MAX_ERROR_SZ];
|
||||||
|
|
||||||
@ -2932,6 +2945,12 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args)
|
|||||||
case 268:
|
case 268:
|
||||||
fileFormat = WOLFSSL_FILETYPE_ASN1;
|
fileFormat = WOLFSSL_FILETYPE_ASN1;
|
||||||
break;
|
break;
|
||||||
|
case 269:
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
policy = myoptarg;
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
Usage();
|
Usage();
|
||||||
XEXIT_T(MY_EX_USAGE);
|
XEXIT_T(MY_EX_USAGE);
|
||||||
@ -3159,6 +3178,13 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args)
|
|||||||
if (method == NULL)
|
if (method == NULL)
|
||||||
err_sys("unable to get method");
|
err_sys("unable to get method");
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
if (policy != NULL) {
|
||||||
|
if (wolfSSL_crypto_policy_enable(policy) != WOLFSSL_SUCCESS) {
|
||||||
|
err_sys("wolfSSL_crypto_policy_enable failed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
|
||||||
#ifdef WOLFSSL_STATIC_MEMORY
|
#ifdef WOLFSSL_STATIC_MEMORY
|
||||||
#if defined(DEBUG_WOLFSSL) && !defined(WOLFSSL_STATIC_MEMORY_LEAN)
|
#if defined(DEBUG_WOLFSSL) && !defined(WOLFSSL_STATIC_MEMORY_LEAN)
|
||||||
@ -4821,7 +4847,6 @@ exit:
|
|||||||
{
|
{
|
||||||
func_args args;
|
func_args args;
|
||||||
|
|
||||||
|
|
||||||
StartTCP();
|
StartTCP();
|
||||||
|
|
||||||
#if defined(WOLFSSL_SRTP) && defined(WOLFSSL_COND)
|
#if defined(WOLFSSL_SRTP) && defined(WOLFSSL_COND)
|
||||||
|
1
examples/crypto_policies/default/wolfssl.txt
Normal file
1
examples/crypto_policies/default/wolfssl.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
@SECLEVEL=2:EECDH:kRSA:EDH:PSK:DHEPSK:ECDHEPSK:RSAPSK:!RC4:!eNULL:!aNULL
|
1
examples/crypto_policies/future/wolfssl.txt
Normal file
1
examples/crypto_policies/future/wolfssl.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
@SECLEVEL=3:EECDH:EDH:PSK:DHEPSK:ECDHEPSK:!RSAPSK:!kRSA:!AES128:!RC4:!eNULL:!aNULL:!SHA1
|
1
examples/crypto_policies/legacy/wolfssl.txt
Normal file
1
examples/crypto_policies/legacy/wolfssl.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
@SECLEVEL=1:EECDH:kRSA:EDH:PSK:DHEPSK:ECDHEPSK:RSAPSK:!eNULL:!aNULL
|
@ -873,7 +873,7 @@ static void SetKeyShare(WOLFSSL* ssl, int onlyKeyShare, int useX25519,
|
|||||||
/* 4. add the same message into Japanese section */
|
/* 4. add the same message into Japanese section */
|
||||||
/* (will be translated later) */
|
/* (will be translated later) */
|
||||||
/* 5. add printf() into suitable position of Usage() */
|
/* 5. add printf() into suitable position of Usage() */
|
||||||
static const char* server_usage_msg[][65] = {
|
static const char* server_usage_msg[][66] = {
|
||||||
/* English */
|
/* English */
|
||||||
{
|
{
|
||||||
" NOTE: All files relative to wolfSSL home dir\n", /* 0 */
|
" NOTE: All files relative to wolfSSL home dir\n", /* 0 */
|
||||||
@ -1056,11 +1056,14 @@ static const char* server_usage_msg[][65] = {
|
|||||||
#ifdef WOLFSSL_DUAL_ALG_CERTS
|
#ifdef WOLFSSL_DUAL_ALG_CERTS
|
||||||
"--altPrivKey <file> Generate alternative signature with this key.\n",
|
"--altPrivKey <file> Generate alternative signature with this key.\n",
|
||||||
/* 65 */
|
/* 65 */
|
||||||
|
#endif
|
||||||
|
#ifdef WOLFSSL_SYS_CRYPTO_POLICY
|
||||||
|
"--crypto-policy <path to crypto policy file>\n", /* 66 */
|
||||||
#endif
|
#endif
|
||||||
"\n"
|
"\n"
|
||||||
"For simpler wolfSSL TLS server examples, visit\n"
|
"For simpler wolfSSL TLS server examples, visit\n"
|
||||||
"https://github.com/wolfSSL/wolfssl-examples/tree/master/tls\n",
|
"https://github.com/wolfSSL/wolfssl-examples/tree/master/tls\n",
|
||||||
/* 66 */
|
/* 67 */
|
||||||
NULL,
|
NULL,
|
||||||
},
|
},
|
||||||
#ifndef NO_MULTIBYTE_PRINT
|
#ifndef NO_MULTIBYTE_PRINT
|
||||||
@ -1261,12 +1264,15 @@ static const char* server_usage_msg[][65] = {
|
|||||||
#ifdef WOLFSSL_DUAL_ALG_CERTS
|
#ifdef WOLFSSL_DUAL_ALG_CERTS
|
||||||
"--altPrivKey <file> Generate alternative signature with this key.\n",
|
"--altPrivKey <file> Generate alternative signature with this key.\n",
|
||||||
/* 65 */
|
/* 65 */
|
||||||
|
#endif
|
||||||
|
#ifdef WOLFSSL_SYS_CRYPTO_POLICY
|
||||||
|
"--crypto-policy <path to crypto policy file>\n", /* 66 */
|
||||||
#endif
|
#endif
|
||||||
"\n"
|
"\n"
|
||||||
"より簡単なwolfSSL TSL クライアントの例については"
|
"より簡単なwolfSSL TSL クライアントの例については"
|
||||||
"下記にアクセスしてください\n"
|
"下記にアクセスしてください\n"
|
||||||
"https://github.com/wolfSSL/wolfssl-examples/tree/master/tls\n",
|
"https://github.com/wolfSSL/wolfssl-examples/tree/master/tls\n",
|
||||||
/* 66 */
|
/* 67 */
|
||||||
NULL,
|
NULL,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
@ -1545,6 +1551,9 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args)
|
|||||||
#ifdef WOLFSSL_DUAL_ALG_CERTS
|
#ifdef WOLFSSL_DUAL_ALG_CERTS
|
||||||
{ "altPrivKey", 1, 267},
|
{ "altPrivKey", 1, 267},
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
{ "crypto-policy", 1, 268 },
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
{ 0, 0, 0 }
|
{ 0, 0, 0 }
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
@ -1669,6 +1678,9 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args)
|
|||||||
#if defined(HAVE_CRL) && !defined(NO_FILESYSTEM)
|
#if defined(HAVE_CRL) && !defined(NO_FILESYSTEM)
|
||||||
char* crlDir = NULL;
|
char* crlDir = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
const char * policy = NULL;
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
|
||||||
#ifdef WOLFSSL_STATIC_MEMORY
|
#ifdef WOLFSSL_STATIC_MEMORY
|
||||||
/* Note: Actual memory used is much less, this is the entire buffer buckets,
|
/* Note: Actual memory used is much less, this is the entire buffer buckets,
|
||||||
@ -2438,6 +2450,11 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args)
|
|||||||
altPrivKey = myoptarg;
|
altPrivKey = myoptarg;
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
case 268:
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
policy = myoptarg;
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
break;
|
||||||
|
|
||||||
case -1:
|
case -1:
|
||||||
default:
|
default:
|
||||||
@ -2592,6 +2609,14 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args)
|
|||||||
if (method == NULL)
|
if (method == NULL)
|
||||||
err_sys_ex(runWithErrors, "unable to get method");
|
err_sys_ex(runWithErrors, "unable to get method");
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
if (policy != NULL) {
|
||||||
|
if (wolfSSL_crypto_policy_enable(policy) != WOLFSSL_SUCCESS) {
|
||||||
|
err_sys("wolfSSL_crypto_policy_enable failed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
|
||||||
#ifdef WOLFSSL_STATIC_MEMORY
|
#ifdef WOLFSSL_STATIC_MEMORY
|
||||||
#if defined(DEBUG_WOLFSSL) && !defined(WOLFSSL_STATIC_MEMORY_LEAN)
|
#if defined(DEBUG_WOLFSSL) && !defined(WOLFSSL_STATIC_MEMORY_LEAN)
|
||||||
/* print off helper buffer sizes for use with static memory
|
/* print off helper buffer sizes for use with static memory
|
||||||
|
467
src/internal.c
467
src/internal.c
@ -2264,6 +2264,225 @@ int InitSSL_Side(WOLFSSL* ssl, word16 side)
|
|||||||
}
|
}
|
||||||
#endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
|
#endif /* OPENSSL_EXTRA || WOLFSSL_EITHER_SIDE */
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
/* Check the wolfssl method meets minimum requirements for
|
||||||
|
* the given security level.
|
||||||
|
*
|
||||||
|
* Returns 0 if method meets security level.
|
||||||
|
* Returns CRYPTO_POLICY_FORBIDDEN otherwise.
|
||||||
|
* */
|
||||||
|
static int wolfSSL_crypto_policy_method_allowed(WOLFSSL_METHOD * method,
|
||||||
|
int level)
|
||||||
|
{
|
||||||
|
if (level == 0) {
|
||||||
|
/* permissive, no restrictions. */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WOLFSSL_DTLS
|
||||||
|
if (method->version.major == DTLS_MAJOR) {
|
||||||
|
if (method->version.minor == DTLS_MINOR) {
|
||||||
|
/* sec level must be 1 or lower. */
|
||||||
|
if (level > 1) {
|
||||||
|
return CRYPTO_POLICY_FORBIDDEN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif /* WOLFSSL_DTLS */
|
||||||
|
{
|
||||||
|
if (method->version.minor == SSLv3_MINOR) {
|
||||||
|
/* sec level must be 0. */
|
||||||
|
if (level > 0) {
|
||||||
|
return CRYPTO_POLICY_FORBIDDEN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (method->version.minor == TLSv1_MINOR ||
|
||||||
|
method->version.minor == TLSv1_1_MINOR) {
|
||||||
|
/* sec level must be 1 or lower. */
|
||||||
|
if (level > 1) {
|
||||||
|
return CRYPTO_POLICY_FORBIDDEN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* nothing else to check, all other combinations ok. */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Configure the CTX to conform to the security policy.
|
||||||
|
*
|
||||||
|
* Also, check the WOLFSSL_METHOD against the supplied security
|
||||||
|
* level.
|
||||||
|
*
|
||||||
|
* Returns CRYPTO_POLICY_FORBIDDEN if not allowed per policy.
|
||||||
|
* Returns BAD_FUNC_ARG on null args.
|
||||||
|
* Returns 0 if ok.
|
||||||
|
* */
|
||||||
|
int wolfSSL_crypto_policy_init_ctx(WOLFSSL_CTX * ctx,
|
||||||
|
WOLFSSL_METHOD * method)
|
||||||
|
{
|
||||||
|
byte minDowngrade = 0x00;
|
||||||
|
#ifdef WOLFSSL_DTLS
|
||||||
|
int dtls = 0;
|
||||||
|
#endif /* WOLFSSL_DTLS */
|
||||||
|
int level = 0;
|
||||||
|
#if !defined(NO_DH) || !defined(NO_RSA)
|
||||||
|
word16 minKeySz = 0; /* minimum DH or RSA key size */
|
||||||
|
#endif /* !NO_DH || !NO_RSA*/
|
||||||
|
#ifdef HAVE_ECC
|
||||||
|
short minEccKeySz = 0; /* minimum allowed ECC key size */
|
||||||
|
#endif /* HAVE_ECC */
|
||||||
|
|
||||||
|
|
||||||
|
if (ctx == NULL || method == NULL) {
|
||||||
|
return BAD_FUNC_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WOLFSSL_DTLS
|
||||||
|
dtls = (method->version.major == DTLS_MAJOR);
|
||||||
|
#endif /* WOLFSSL_DTLS */
|
||||||
|
|
||||||
|
/* get the crypto policy security level. */
|
||||||
|
level = wolfSSL_crypto_policy_get_level();
|
||||||
|
|
||||||
|
if (level < 0 || level > 5) {
|
||||||
|
WOLFSSL_MSG_EX("crypto_policy_init_ctx: invalid level: %d", level);
|
||||||
|
return BAD_FUNC_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check requested method per security level. */
|
||||||
|
if (wolfSSL_crypto_policy_method_allowed(method, level) != 0) {
|
||||||
|
WOLFSSL_MSG_EX("crypto_policy_init_ctx: "
|
||||||
|
"method=%d, SECLEVEL=%d combination not allowed",
|
||||||
|
method->version.minor, level);
|
||||||
|
return CRYPTO_POLICY_FORBIDDEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set appropriate min downgrade per security level. */
|
||||||
|
#ifdef WOLFSSL_DTLS
|
||||||
|
if (dtls) {
|
||||||
|
switch (level) {
|
||||||
|
case 1:
|
||||||
|
minDowngrade = DTLS_MINOR;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
case 4:
|
||||||
|
case 5:
|
||||||
|
minDowngrade = DTLSv1_2_MINOR;
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
default:
|
||||||
|
/* Permissive, no restrictions. Allow defaults. */
|
||||||
|
minDowngrade = WOLFSSL_MIN_DTLS_DOWNGRADE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif /* WOLFSSL_DTLS */
|
||||||
|
{
|
||||||
|
switch (level) {
|
||||||
|
case 1:
|
||||||
|
/* prohibit SSLv3 and lower. */
|
||||||
|
minDowngrade = TLSv1_MINOR;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
case 4:
|
||||||
|
case 5:
|
||||||
|
/* prohibit TLSv1_1 and lower. */
|
||||||
|
minDowngrade = TLSv1_2_MINOR;
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
default:
|
||||||
|
ctx->minDowngrade = WOLFSSL_MIN_DOWNGRADE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set min RSA and DH key size. */
|
||||||
|
#if !defined(NO_DH) || !defined(NO_RSA)
|
||||||
|
switch (level) {
|
||||||
|
case 1:
|
||||||
|
minKeySz = 128; /* 1024 bits / 8 */
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
minKeySz = 256; /* 2048 bits / 8 */
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
minKeySz = 384; /* 3072 bits / 8 */
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
minKeySz = 960; /* 7680 bits / 8 */
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
minKeySz = 1920; /* 15360 bits / 8 */
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif /* !NO_DH || !NO_RSA*/
|
||||||
|
|
||||||
|
/* Set min ECC key size. */
|
||||||
|
#ifdef HAVE_ECC
|
||||||
|
switch (level) {
|
||||||
|
case 1:
|
||||||
|
minEccKeySz = 20; /* 160 bits / 8 */
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
minEccKeySz = 28; /* 224 bits / 8 */
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
minEccKeySz = 32; /* 256 bits / 8 */
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
minEccKeySz = 48; /* 384 bits / 8 */
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
minEccKeySz = 64; /* 512 bits / 8 */
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif /* HAVE_ECC */
|
||||||
|
|
||||||
|
/* Finally set the ctx values. */
|
||||||
|
ctx->minDowngrade = minDowngrade;
|
||||||
|
ctx->secLevel = level;
|
||||||
|
ctx->method = method;
|
||||||
|
|
||||||
|
#if !defined(NO_DH) || !defined(NO_RSA)
|
||||||
|
if (minKeySz > 0) {
|
||||||
|
#ifndef NO_DH
|
||||||
|
if (minKeySz > MAX_DHKEY_SZ) {
|
||||||
|
WOLFSSL_MSG_EX("crypto_policy_init_ctx: minKeySz=%d, "
|
||||||
|
"but MAX_DHKEY_SZ=%d",
|
||||||
|
minKeySz, MAX_DHKEY_SZ);
|
||||||
|
return CRYPTO_POLICY_FORBIDDEN;
|
||||||
|
}
|
||||||
|
ctx->minDhKeySz = minKeySz;
|
||||||
|
ctx->maxDhKeySz = MAX_DHKEY_SZ;
|
||||||
|
#endif /* NO_DH */
|
||||||
|
#ifndef NO_RSA
|
||||||
|
ctx->minRsaKeySz = minKeySz;
|
||||||
|
#endif /* NO_RSA */
|
||||||
|
}
|
||||||
|
#endif /* !NO_DH || !NO_RSA*/
|
||||||
|
|
||||||
|
#ifdef HAVE_ECC
|
||||||
|
if (minEccKeySz > 0) {
|
||||||
|
ctx->minEccKeySz = minEccKeySz;
|
||||||
|
}
|
||||||
|
#endif /* HAVE_ECC */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
|
||||||
/* Initialize SSL context, return 0 on success */
|
/* Initialize SSL context, return 0 on success */
|
||||||
int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap)
|
int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap)
|
||||||
{
|
{
|
||||||
@ -2317,6 +2536,7 @@ int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap)
|
|||||||
#ifndef NO_RSA
|
#ifndef NO_RSA
|
||||||
ctx->minRsaKeySz = MIN_RSAKEY_SZ;
|
ctx->minRsaKeySz = MIN_RSAKEY_SZ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_ECC
|
#ifdef HAVE_ECC
|
||||||
ctx->minEccKeySz = MIN_ECCKEY_SZ;
|
ctx->minEccKeySz = MIN_ECCKEY_SZ;
|
||||||
ctx->eccTempKeySz = ECDHE_SIZE;
|
ctx->eccTempKeySz = ECDHE_SIZE;
|
||||||
@ -2541,6 +2761,14 @@ int InitSSL_Ctx(WOLFSSL_CTX* ctx, WOLFSSL_METHOD* method, void* heap)
|
|||||||
ctx->doAppleNativeCertValidationFlag = 0;
|
ctx->doAppleNativeCertValidationFlag = 0;
|
||||||
#endif /* defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) */
|
#endif /* defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) */
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
ret = wolfSSL_crypto_policy_init_ctx(ctx, method);
|
||||||
|
if (ret != 0) {
|
||||||
|
WOLFSSL_MSG_EX("crypto_policy_init_ctx returned %d", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3220,8 +3448,8 @@ int AllocateSuites(WOLFSSL* ssl)
|
|||||||
void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
||||||
word16 havePSK, word16 haveDH, word16 haveECDSAsig,
|
word16 havePSK, word16 haveDH, word16 haveECDSAsig,
|
||||||
word16 haveECC, word16 haveStaticRSA, word16 haveStaticECC,
|
word16 haveECC, word16 haveStaticRSA, word16 haveStaticECC,
|
||||||
word16 haveFalconSig, word16 haveDilithiumSig, word16 haveAnon,
|
word16 haveAnon, word16 haveNull, word16 haveAES128,
|
||||||
word16 haveNull, int side)
|
word16 haveSHA1, word16 haveRC4, int side)
|
||||||
{
|
{
|
||||||
word16 idx = 0;
|
word16 idx = 0;
|
||||||
int tls = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_MINOR;
|
int tls = pv.major == SSLv3_MAJOR && pv.minor >= TLSv1_MINOR;
|
||||||
@ -3257,8 +3485,9 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
(void)haveRSAsig; /* non ecc builds won't read */
|
(void)haveRSAsig; /* non ecc builds won't read */
|
||||||
(void)haveAnon; /* anon ciphers optional */
|
(void)haveAnon; /* anon ciphers optional */
|
||||||
(void)haveNull;
|
(void)haveNull;
|
||||||
(void)haveFalconSig;
|
(void)haveAES128;
|
||||||
(void)haveDilithiumSig;
|
(void)haveSHA1;
|
||||||
|
(void)haveRC4;
|
||||||
|
|
||||||
if (suites == NULL) {
|
if (suites == NULL) {
|
||||||
WOLFSSL_MSG("InitSuites pointer error");
|
WOLFSSL_MSG("InitSuites pointer error");
|
||||||
@ -3277,7 +3506,7 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_AES_128_GCM_SHA256
|
#ifdef BUILD_TLS_AES_128_GCM_SHA256
|
||||||
if (tls1_3) {
|
if (tls1_3 && haveAES128) {
|
||||||
suites->suites[idx++] = TLS13_BYTE;
|
suites->suites[idx++] = TLS13_BYTE;
|
||||||
suites->suites[idx++] = TLS_AES_128_GCM_SHA256;
|
suites->suites[idx++] = TLS_AES_128_GCM_SHA256;
|
||||||
}
|
}
|
||||||
@ -3291,14 +3520,14 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_AES_128_CCM_SHA256
|
#ifdef BUILD_TLS_AES_128_CCM_SHA256
|
||||||
if (tls1_3) {
|
if (tls1_3 && haveAES128) {
|
||||||
suites->suites[idx++] = TLS13_BYTE;
|
suites->suites[idx++] = TLS13_BYTE;
|
||||||
suites->suites[idx++] = TLS_AES_128_CCM_SHA256;
|
suites->suites[idx++] = TLS_AES_128_CCM_SHA256;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_AES_128_CCM_8_SHA256
|
#ifdef BUILD_TLS_AES_128_CCM_8_SHA256
|
||||||
if (tls1_3) {
|
if (tls1_3 && haveAES128) {
|
||||||
suites->suites[idx++] = TLS13_BYTE;
|
suites->suites[idx++] = TLS13_BYTE;
|
||||||
suites->suites[idx++] = TLS_AES_128_CCM_8_SHA256;
|
suites->suites[idx++] = TLS_AES_128_CCM_8_SHA256;
|
||||||
}
|
}
|
||||||
@ -3365,7 +3594,7 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
|
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
|
||||||
if (tls1_2 && haveECC) {
|
if (tls1_2 && haveECC && haveAES128) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256;
|
suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256;
|
||||||
}
|
}
|
||||||
@ -3385,9 +3614,10 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
|
|
||||||
#ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
|
#ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
|
||||||
#ifdef OPENSSL_EXTRA
|
#ifdef OPENSSL_EXTRA
|
||||||
if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) {
|
if ((tls1_2 && haveRSA && haveAES128) ||
|
||||||
|
(tls1_2 && haveECDSAsig && haveAES128)) {
|
||||||
#else
|
#else
|
||||||
if (tls1_2 && haveRSA) {
|
if (tls1_2 && haveRSA && haveAES128) {
|
||||||
#endif
|
#endif
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256;
|
suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256;
|
||||||
@ -3402,7 +3632,7 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
|
#ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
|
||||||
if (tls1_2 && haveDH && haveRSA) {
|
if (tls1_2 && haveDH && haveRSA && haveAES128) {
|
||||||
suites->suites[idx++] = CIPHER_BYTE;
|
suites->suites[idx++] = CIPHER_BYTE;
|
||||||
suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_GCM_SHA256;
|
suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_GCM_SHA256;
|
||||||
}
|
}
|
||||||
@ -3416,7 +3646,7 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
|
#ifdef BUILD_TLS_RSA_WITH_AES_128_GCM_SHA256
|
||||||
if (tls1_2 && haveRSA && haveStaticRSA) {
|
if (tls1_2 && haveRSA && haveStaticRSA && haveAES128) {
|
||||||
suites->suites[idx++] = CIPHER_BYTE;
|
suites->suites[idx++] = CIPHER_BYTE;
|
||||||
suites->suites[idx++] = TLS_RSA_WITH_AES_128_GCM_SHA256;
|
suites->suites[idx++] = TLS_RSA_WITH_AES_128_GCM_SHA256;
|
||||||
}
|
}
|
||||||
@ -3430,7 +3660,7 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
|
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
|
||||||
if (tls1_2 && haveECC && haveStaticECC) {
|
if (tls1_2 && haveECC && haveStaticECC && haveAES128) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256;
|
suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256;
|
||||||
}
|
}
|
||||||
@ -3444,7 +3674,7 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
|
#ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
|
||||||
if (tls1_2 && haveRSAsig && haveStaticECC) {
|
if (tls1_2 && haveRSAsig && haveStaticECC && haveAES128) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256;
|
suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256;
|
||||||
}
|
}
|
||||||
@ -3458,7 +3688,7 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256
|
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256
|
||||||
if (tls1_2 && haveECC) {
|
if (tls1_2 && haveECC && haveAES128) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256;
|
suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256;
|
||||||
}
|
}
|
||||||
@ -3472,7 +3702,7 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
|
#ifdef BUILD_TLS_DH_anon_WITH_AES_128_CBC_SHA
|
||||||
if (tls1_2 && haveDH && haveAnon) {
|
if (tls1_2 && haveDH && haveAnon && haveAES128 && haveSHA1) {
|
||||||
suites->suites[idx++] = CIPHER_BYTE;
|
suites->suites[idx++] = CIPHER_BYTE;
|
||||||
suites->suites[idx++] = TLS_DH_anon_WITH_AES_128_CBC_SHA;
|
suites->suites[idx++] = TLS_DH_anon_WITH_AES_128_CBC_SHA;
|
||||||
}
|
}
|
||||||
@ -3486,7 +3716,7 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
|
#ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256
|
||||||
if (tls1_2 && haveDH && havePSK) {
|
if (tls1_2 && haveDH && havePSK && haveAES128) {
|
||||||
suites->suites[idx++] = CIPHER_BYTE;
|
suites->suites[idx++] = CIPHER_BYTE;
|
||||||
suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_GCM_SHA256;
|
suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_GCM_SHA256;
|
||||||
}
|
}
|
||||||
@ -3500,7 +3730,7 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
|
#ifdef BUILD_TLS_PSK_WITH_AES_128_GCM_SHA256
|
||||||
if (tls1_2 && havePSK) {
|
if (tls1_2 && havePSK && haveAES128) {
|
||||||
suites->suites[idx++] = CIPHER_BYTE;
|
suites->suites[idx++] = CIPHER_BYTE;
|
||||||
suites->suites[idx++] = TLS_PSK_WITH_AES_128_GCM_SHA256;
|
suites->suites[idx++] = TLS_PSK_WITH_AES_128_GCM_SHA256;
|
||||||
}
|
}
|
||||||
@ -3534,7 +3764,7 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
/* Place as higher priority for MYSQL */
|
/* Place as higher priority for MYSQL */
|
||||||
#if defined(WOLFSSL_MYSQL_COMPATIBLE)
|
#if defined(WOLFSSL_MYSQL_COMPATIBLE)
|
||||||
#ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
|
#ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
|
||||||
if (tls && haveDH && haveRSA) {
|
if (tls && haveDH && haveRSA && haveSHA1) {
|
||||||
suites->suites[idx++] = CIPHER_BYTE;
|
suites->suites[idx++] = CIPHER_BYTE;
|
||||||
suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
|
suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
|
||||||
}
|
}
|
||||||
@ -3543,9 +3773,10 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
|
|
||||||
#ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
|
#ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
|
||||||
#ifdef OPENSSL_EXTRA
|
#ifdef OPENSSL_EXTRA
|
||||||
if ((tls1_2 && haveRSA) || (tls1_2 && haveECDSAsig)) {
|
if ((tls1_2 && haveRSA && haveAES128) ||
|
||||||
|
(tls1_2 && haveECDSAsig && haveAES128)) {
|
||||||
#else
|
#else
|
||||||
if (tls1_2 && haveRSA) {
|
if (tls1_2 && haveRSA && haveAES128) {
|
||||||
#endif
|
#endif
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256;
|
suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256;
|
||||||
@ -3553,21 +3784,21 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
|
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
|
||||||
if (tls1_2 && haveECC) {
|
if (tls1_2 && haveECC && haveAES128) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256;
|
suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
|
#ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
|
||||||
if (tls1_2 && haveRSAsig && haveStaticECC) {
|
if (tls1_2 && haveRSAsig && haveStaticECC && haveAES128) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256;
|
suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
|
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
|
||||||
if (tls1_2 && haveECC && haveStaticECC) {
|
if (tls1_2 && haveECC && haveStaticECC && haveAES128) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256;
|
suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256;
|
||||||
}
|
}
|
||||||
@ -3606,56 +3837,56 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
|
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
|
||||||
if (tls && haveECC) {
|
if (tls && haveECC && haveSHA1) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA;
|
suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
|
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
|
||||||
if (tls && haveECC && haveStaticECC) {
|
if (tls && haveECC && haveStaticECC && haveSHA1) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA;
|
suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
|
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
|
||||||
if (tls && haveECC) {
|
if (tls && haveECC && haveAES128 && haveSHA1) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA;
|
suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
|
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
|
||||||
if (tls && haveECC && haveStaticECC) {
|
if (tls && haveECC && haveStaticECC && haveAES128 && haveSHA1) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA;
|
suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
|
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
|
||||||
if (!dtls && tls && haveECC) {
|
if (!dtls && tls && haveECC && haveSHA1 && haveRC4) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_RC4_128_SHA;
|
suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_RC4_128_SHA;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
|
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_RC4_128_SHA
|
||||||
if (!dtls && tls && haveECC && haveStaticECC) {
|
if (!dtls && tls && haveECC && haveStaticECC && haveSHA1 && haveRC4) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_RC4_128_SHA;
|
suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_RC4_128_SHA;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
|
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
|
||||||
if (tls && haveECC) {
|
if (tls && haveECC && haveSHA1) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA;
|
suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
|
#ifdef BUILD_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
|
||||||
if (tls && haveECC && haveStaticECC) {
|
if (tls && haveECC && haveStaticECC && haveSHA1) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA;
|
suites->suites[idx++] = TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA;
|
||||||
}
|
}
|
||||||
@ -3663,9 +3894,9 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
|
|
||||||
#ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
|
#ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
|
||||||
#ifdef OPENSSL_EXTRA
|
#ifdef OPENSSL_EXTRA
|
||||||
if ((tls && haveRSA) || (tls && haveECDSAsig)) {
|
if ((tls && haveRSA && haveSHA1) || (tls && haveECDSAsig && haveSHA1)) {
|
||||||
#else
|
#else
|
||||||
if (tls && haveRSA) {
|
if (tls && haveRSA && haveSHA1) {
|
||||||
#endif
|
#endif
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA;
|
suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA;
|
||||||
@ -3673,7 +3904,7 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
|
#ifdef BUILD_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
|
||||||
if (tls && haveRSAsig && haveStaticECC) {
|
if (tls && haveRSAsig && haveStaticECC && haveSHA1) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA;
|
suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_256_CBC_SHA;
|
||||||
}
|
}
|
||||||
@ -3681,9 +3912,10 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
|
|
||||||
#ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
|
#ifdef BUILD_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
|
||||||
#ifdef OPENSSL_EXTRA
|
#ifdef OPENSSL_EXTRA
|
||||||
if ((tls && haveRSA) || (tls && haveECDSAsig)) {
|
if ((tls && haveRSA && haveAES128 && haveSHA1) ||
|
||||||
|
(tls && haveECDSAsig && haveAES128 && haveSHA1)) {
|
||||||
#else
|
#else
|
||||||
if (tls && haveRSA) {
|
if (tls && haveRSA && haveAES128 && haveSHA1) {
|
||||||
#endif
|
#endif
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA;
|
suites->suites[idx++] = TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA;
|
||||||
@ -3691,21 +3923,21 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
|
#ifdef BUILD_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
|
||||||
if (tls && haveRSAsig && haveStaticECC) {
|
if (tls && haveRSAsig && haveStaticECC && haveAES128 && haveSHA1) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA;
|
suites->suites[idx++] = TLS_ECDH_RSA_WITH_AES_128_CBC_SHA;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
|
#ifdef BUILD_TLS_ECDHE_RSA_WITH_RC4_128_SHA
|
||||||
if (!dtls && tls && haveRSA) {
|
if (!dtls && tls && haveRSA && haveSHA1 && haveRC4) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDHE_RSA_WITH_RC4_128_SHA;
|
suites->suites[idx++] = TLS_ECDHE_RSA_WITH_RC4_128_SHA;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
|
#ifdef BUILD_TLS_ECDH_RSA_WITH_RC4_128_SHA
|
||||||
if (!dtls && tls && haveRSAsig && haveStaticECC) {
|
if (!dtls && tls && haveRSAsig && haveStaticECC && haveSHA1 && haveRC4) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDH_RSA_WITH_RC4_128_SHA;
|
suites->suites[idx++] = TLS_ECDH_RSA_WITH_RC4_128_SHA;
|
||||||
}
|
}
|
||||||
@ -3713,9 +3945,9 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
|
|
||||||
#ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
|
#ifdef BUILD_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
|
||||||
#ifdef OPENSSL_EXTRA
|
#ifdef OPENSSL_EXTRA
|
||||||
if ((tls && haveRSA) || (tls && haveECDSAsig)) {
|
if ((tls && haveRSA && haveSHA1) || (tls && haveECDSAsig && haveSHA1)) {
|
||||||
#else
|
#else
|
||||||
if (tls && haveRSA) {
|
if (tls && haveRSA && haveSHA1) {
|
||||||
#endif
|
#endif
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA;
|
suites->suites[idx++] = TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA;
|
||||||
@ -3723,21 +3955,21 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
|
#ifdef BUILD_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
|
||||||
if (tls && haveRSAsig && haveStaticECC) {
|
if (tls && haveRSAsig && haveStaticECC && haveSHA1) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA;
|
suites->suites[idx++] = TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
|
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM
|
||||||
if (tls1_2 && haveECC) {
|
if (tls1_2 && haveECC && haveAES128) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM;
|
suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
|
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
|
||||||
if (tls1_2 && haveECC) {
|
if (tls1_2 && haveECC && haveAES128) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8;
|
suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8;
|
||||||
}
|
}
|
||||||
@ -3751,7 +3983,7 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
|
#ifdef BUILD_TLS_RSA_WITH_AES_128_CCM_8
|
||||||
if (tls1_2 && haveRSA && haveStaticRSA) {
|
if (tls1_2 && haveRSA && haveStaticRSA && haveAES128) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_RSA_WITH_AES_128_CCM_8;
|
suites->suites[idx++] = TLS_RSA_WITH_AES_128_CCM_8;
|
||||||
}
|
}
|
||||||
@ -3778,9 +4010,9 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
|
|
||||||
#ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
|
#ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
|
||||||
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
|
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
|
||||||
if (tls1_2 && haveDH && haveRSA)
|
if (tls1_2 && haveDH && haveRSA && haveAES128)
|
||||||
#else
|
#else
|
||||||
if (tls && haveDH && haveRSA)
|
if (tls && haveDH && haveRSA && haveAES128)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
suites->suites[idx++] = CIPHER_BYTE;
|
suites->suites[idx++] = CIPHER_BYTE;
|
||||||
@ -3791,7 +4023,7 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
/* Place as higher priority for MYSQL testing */
|
/* Place as higher priority for MYSQL testing */
|
||||||
#if !defined(WOLFSSL_MYSQL_COMPATIBLE)
|
#if !defined(WOLFSSL_MYSQL_COMPATIBLE)
|
||||||
#ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
|
#ifdef BUILD_TLS_DHE_RSA_WITH_AES_256_CBC_SHA
|
||||||
if (tls && haveDH && haveRSA) {
|
if (tls && haveDH && haveRSA && haveSHA1) {
|
||||||
suites->suites[idx++] = CIPHER_BYTE;
|
suites->suites[idx++] = CIPHER_BYTE;
|
||||||
suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
|
suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_256_CBC_SHA;
|
||||||
}
|
}
|
||||||
@ -3799,14 +4031,14 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
|
#ifdef BUILD_TLS_DHE_RSA_WITH_AES_128_CBC_SHA
|
||||||
if (tls && haveDH && haveRSA) {
|
if (tls && haveDH && haveRSA && haveAES128 && haveSHA1) {
|
||||||
suites->suites[idx++] = CIPHER_BYTE;
|
suites->suites[idx++] = CIPHER_BYTE;
|
||||||
suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA;
|
suites->suites[idx++] = TLS_DHE_RSA_WITH_AES_128_CBC_SHA;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
|
#ifdef BUILD_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA
|
||||||
if (tls && haveDH && haveRSA) {
|
if (tls && haveDH && haveRSA && haveSHA1) {
|
||||||
suites->suites[idx++] = CIPHER_BYTE;
|
suites->suites[idx++] = CIPHER_BYTE;
|
||||||
suites->suites[idx++] = TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA;
|
suites->suites[idx++] = TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA;
|
||||||
}
|
}
|
||||||
@ -3826,9 +4058,9 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
|
|
||||||
#ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
|
#ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA256
|
||||||
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
|
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
|
||||||
if (tls1_2 && haveRSA && haveStaticRSA)
|
if (tls1_2 && haveRSA && haveStaticRSA && haveAES128)
|
||||||
#else
|
#else
|
||||||
if (tls && haveRSA && haveStaticRSA)
|
if (tls && haveRSA && haveStaticRSA && haveAES128)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
suites->suites[idx++] = CIPHER_BYTE;
|
suites->suites[idx++] = CIPHER_BYTE;
|
||||||
@ -3837,14 +4069,14 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
|
#ifdef BUILD_TLS_RSA_WITH_AES_256_CBC_SHA
|
||||||
if (tls && haveRSA && haveStaticRSA) {
|
if (tls && haveRSA && haveStaticRSA && haveSHA1) {
|
||||||
suites->suites[idx++] = CIPHER_BYTE;
|
suites->suites[idx++] = CIPHER_BYTE;
|
||||||
suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA;
|
suites->suites[idx++] = TLS_RSA_WITH_AES_256_CBC_SHA;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
|
#ifdef BUILD_TLS_RSA_WITH_AES_128_CBC_SHA
|
||||||
if (tls && haveRSA && haveStaticRSA) {
|
if (tls && haveRSA && haveStaticRSA && haveAES128 && haveSHA1) {
|
||||||
suites->suites[idx++] = CIPHER_BYTE;
|
suites->suites[idx++] = CIPHER_BYTE;
|
||||||
suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA;
|
suites->suites[idx++] = TLS_RSA_WITH_AES_128_CBC_SHA;
|
||||||
}
|
}
|
||||||
@ -3881,7 +4113,7 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
|
#ifdef BUILD_TLS_ECDHE_ECDSA_WITH_NULL_SHA
|
||||||
if (tls && haveECC && haveNull) {
|
if (tls && haveECC && haveNull && haveSHA1) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_NULL_SHA;
|
suites->suites[idx++] = TLS_ECDHE_ECDSA_WITH_NULL_SHA;
|
||||||
}
|
}
|
||||||
@ -3895,7 +4127,7 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_RSA_WITH_NULL_SHA
|
#ifdef BUILD_TLS_RSA_WITH_NULL_SHA
|
||||||
if (tls && haveRSA && haveNull && haveStaticRSA) {
|
if (tls && haveRSA && haveNull && haveStaticRSA && haveSHA1) {
|
||||||
suites->suites[idx++] = CIPHER_BYTE;
|
suites->suites[idx++] = CIPHER_BYTE;
|
||||||
suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA;
|
suites->suites[idx++] = TLS_RSA_WITH_NULL_SHA;
|
||||||
}
|
}
|
||||||
@ -3914,7 +4146,7 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
|
#ifdef BUILD_TLS_PSK_WITH_AES_256_CBC_SHA
|
||||||
if (tls && havePSK) {
|
if (tls && havePSK && haveSHA1) {
|
||||||
suites->suites[idx++] = CIPHER_BYTE;
|
suites->suites[idx++] = CIPHER_BYTE;
|
||||||
suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA;
|
suites->suites[idx++] = TLS_PSK_WITH_AES_256_CBC_SHA;
|
||||||
}
|
}
|
||||||
@ -3946,9 +4178,9 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
|
|
||||||
#ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
|
#ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256
|
||||||
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
|
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
|
||||||
if (tls1_2 && haveDH && havePSK)
|
if (tls1_2 && haveDH && havePSK && haveAES128)
|
||||||
#else
|
#else
|
||||||
if (tls && haveDH && havePSK)
|
if (tls && haveDH && havePSK && haveAES128)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
suites->suites[idx++] = CIPHER_BYTE;
|
suites->suites[idx++] = CIPHER_BYTE;
|
||||||
@ -3958,9 +4190,9 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
|
|
||||||
#ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
|
#ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA256
|
||||||
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
|
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
|
||||||
if (tls1_2 && havePSK)
|
if (tls1_2 && havePSK && haveAES128)
|
||||||
#else
|
#else
|
||||||
if (tls1 && havePSK)
|
if (tls1 && havePSK && haveAES128)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
suites->suites[idx++] = CIPHER_BYTE;
|
suites->suites[idx++] = CIPHER_BYTE;
|
||||||
@ -3969,14 +4201,14 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
|
#ifdef BUILD_TLS_PSK_WITH_AES_128_CBC_SHA
|
||||||
if (tls && havePSK) {
|
if (tls && havePSK && haveAES128 && haveSHA1) {
|
||||||
suites->suites[idx++] = CIPHER_BYTE;
|
suites->suites[idx++] = CIPHER_BYTE;
|
||||||
suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA;
|
suites->suites[idx++] = TLS_PSK_WITH_AES_128_CBC_SHA;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
|
#ifdef BUILD_TLS_DHE_PSK_WITH_AES_128_CCM
|
||||||
if (tls && haveDH && havePSK) {
|
if (tls && haveDH && havePSK && haveAES128) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CCM;
|
suites->suites[idx++] = TLS_DHE_PSK_WITH_AES_128_CCM;
|
||||||
}
|
}
|
||||||
@ -4027,9 +4259,9 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
|
|
||||||
#ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
|
#ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256
|
||||||
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
|
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
|
||||||
if (tls1_2 && havePSK)
|
if (tls1_2 && havePSK && haveAES128)
|
||||||
#else
|
#else
|
||||||
if (tls && havePSK)
|
if (tls && havePSK && haveAES128)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
@ -4039,9 +4271,9 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
|
|
||||||
#ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256
|
#ifdef BUILD_TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256
|
||||||
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
|
#ifndef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
|
||||||
if (tls1_2 && havePSK)
|
if (tls1_2 && havePSK && haveAES128)
|
||||||
#else
|
#else
|
||||||
if (tls && havePSK)
|
if (tls && havePSK && haveAES128)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
suites->suites[idx++] = ECDHE_PSK_BYTE;
|
suites->suites[idx++] = ECDHE_PSK_BYTE;
|
||||||
@ -4050,7 +4282,7 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
|
#ifdef BUILD_TLS_PSK_WITH_AES_128_CCM
|
||||||
if (tls && havePSK) {
|
if (tls && havePSK && haveAES128) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM;
|
suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM;
|
||||||
}
|
}
|
||||||
@ -4064,7 +4296,7 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
|
#ifdef BUILD_TLS_PSK_WITH_AES_128_CCM_8
|
||||||
if (tls && havePSK) {
|
if (tls && havePSK && haveAES128) {
|
||||||
suites->suites[idx++] = ECC_BYTE;
|
suites->suites[idx++] = ECC_BYTE;
|
||||||
suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM_8;
|
suites->suites[idx++] = TLS_PSK_WITH_AES_128_CCM_8;
|
||||||
}
|
}
|
||||||
@ -4145,49 +4377,49 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
|
#ifdef BUILD_SSL_RSA_WITH_RC4_128_SHA
|
||||||
if (!dtls && haveRSA && haveStaticRSA) {
|
if (!dtls && haveRSA && haveStaticRSA && haveSHA1 && haveRC4) {
|
||||||
suites->suites[idx++] = CIPHER_BYTE;
|
suites->suites[idx++] = CIPHER_BYTE;
|
||||||
suites->suites[idx++] = SSL_RSA_WITH_RC4_128_SHA;
|
suites->suites[idx++] = SSL_RSA_WITH_RC4_128_SHA;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
|
#ifdef BUILD_SSL_RSA_WITH_RC4_128_MD5
|
||||||
if (!dtls && haveRSA && haveStaticRSA) {
|
if (!dtls && haveRSA && haveStaticRSA && haveRC4) {
|
||||||
suites->suites[idx++] = CIPHER_BYTE;
|
suites->suites[idx++] = CIPHER_BYTE;
|
||||||
suites->suites[idx++] = SSL_RSA_WITH_RC4_128_MD5;
|
suites->suites[idx++] = SSL_RSA_WITH_RC4_128_MD5;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
|
#ifdef BUILD_SSL_RSA_WITH_3DES_EDE_CBC_SHA
|
||||||
if (haveRSA && haveStaticRSA) {
|
if (haveRSA && haveStaticRSA && haveSHA1) {
|
||||||
suites->suites[idx++] = CIPHER_BYTE;
|
suites->suites[idx++] = CIPHER_BYTE;
|
||||||
suites->suites[idx++] = SSL_RSA_WITH_3DES_EDE_CBC_SHA;
|
suites->suites[idx++] = SSL_RSA_WITH_3DES_EDE_CBC_SHA;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
|
#ifdef BUILD_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA
|
||||||
if (tls && haveRSA && haveStaticRSA) {
|
if (tls && haveRSA && haveStaticRSA && haveSHA1) {
|
||||||
suites->suites[idx++] = CIPHER_BYTE;
|
suites->suites[idx++] = CIPHER_BYTE;
|
||||||
suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA;
|
suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_128_CBC_SHA;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
|
#ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA
|
||||||
if (tls && haveDH && haveRSA && haveStaticRSA) {
|
if (tls && haveDH && haveRSA && haveStaticRSA && haveSHA1) {
|
||||||
suites->suites[idx++] = CIPHER_BYTE;
|
suites->suites[idx++] = CIPHER_BYTE;
|
||||||
suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA;
|
suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
|
#ifdef BUILD_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA
|
||||||
if (tls && haveRSA && haveStaticRSA) {
|
if (tls && haveRSA && haveStaticRSA && haveSHA1) {
|
||||||
suites->suites[idx++] = CIPHER_BYTE;
|
suites->suites[idx++] = CIPHER_BYTE;
|
||||||
suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA;
|
suites->suites[idx++] = TLS_RSA_WITH_CAMELLIA_256_CBC_SHA;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
|
#ifdef BUILD_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA
|
||||||
if (tls && haveDH && haveRSA && haveStaticRSA) {
|
if (tls && haveDH && haveRSA && haveStaticRSA && haveSHA1) {
|
||||||
suites->suites[idx++] = CIPHER_BYTE;
|
suites->suites[idx++] = CIPHER_BYTE;
|
||||||
suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA;
|
suites->suites[idx++] = TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA;
|
||||||
}
|
}
|
||||||
@ -4284,8 +4516,6 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
|||||||
(void)haveRSAsig; /* non ecc builds won't read */
|
(void)haveRSAsig; /* non ecc builds won't read */
|
||||||
(void)haveAnon; /* anon ciphers optional */
|
(void)haveAnon; /* anon ciphers optional */
|
||||||
(void)haveNull;
|
(void)haveNull;
|
||||||
(void)haveFalconSig;
|
|
||||||
(void)haveDilithiumSig;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) || \
|
#if !defined(NO_WOLFSSL_SERVER) || !defined(NO_CERTS) || \
|
||||||
@ -6393,19 +6623,19 @@ int wolfSSL_CTX_IsPrivatePkSet(WOLFSSL_CTX* ctx)
|
|||||||
static void InitSuites_EitherSide(Suites* suites, ProtocolVersion pv, int keySz,
|
static void InitSuites_EitherSide(Suites* suites, ProtocolVersion pv, int keySz,
|
||||||
word16 haveRSA, word16 havePSK, word16 haveDH, word16 haveECDSAsig,
|
word16 haveRSA, word16 havePSK, word16 haveDH, word16 haveECDSAsig,
|
||||||
word16 haveECC, word16 haveStaticECC,
|
word16 haveECC, word16 haveStaticECC,
|
||||||
word16 haveFalconSig, word16 haveDilithiumSig, word16 haveAnon,
|
word16 haveAnon,
|
||||||
int side)
|
int side)
|
||||||
{
|
{
|
||||||
/* make sure server has DH params, and add PSK if there */
|
/* make sure server has DH params, and add PSK if there */
|
||||||
if (side == WOLFSSL_SERVER_END) {
|
if (side == WOLFSSL_SERVER_END) {
|
||||||
InitSuites(suites, pv, keySz, haveRSA, havePSK, haveDH, haveECDSAsig,
|
InitSuites(suites, pv, keySz, haveRSA, havePSK, haveDH, haveECDSAsig,
|
||||||
haveECC, TRUE, haveStaticECC, haveFalconSig,
|
haveECC, TRUE, haveStaticECC,
|
||||||
haveDilithiumSig, haveAnon, TRUE, side);
|
haveAnon, TRUE, TRUE, TRUE, TRUE, side);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
InitSuites(suites, pv, keySz, haveRSA, havePSK, TRUE, haveECDSAsig,
|
InitSuites(suites, pv, keySz, haveRSA, havePSK, TRUE, haveECDSAsig,
|
||||||
haveECC, TRUE, haveStaticECC, haveFalconSig,
|
haveECC, TRUE, haveStaticECC,
|
||||||
haveDilithiumSig, haveAnon, TRUE, side);
|
haveAnon, TRUE, TRUE, TRUE, TRUE, side);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6429,7 +6659,7 @@ void InitSSL_CTX_Suites(WOLFSSL_CTX* ctx)
|
|||||||
#endif
|
#endif
|
||||||
InitSuites_EitherSide(ctx->suites, ctx->method->version, keySz,
|
InitSuites_EitherSide(ctx->suites, ctx->method->version, keySz,
|
||||||
haveRSA, havePSK, ctx->haveDH, ctx->haveECDSAsig, ctx->haveECC,
|
haveRSA, havePSK, ctx->haveDH, ctx->haveECDSAsig, ctx->haveECC,
|
||||||
ctx->haveStaticECC, ctx->haveFalconSig, ctx->haveDilithiumSig,
|
ctx->haveStaticECC,
|
||||||
haveAnon, ctx->method->side);
|
haveAnon, ctx->method->side);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6484,7 +6714,6 @@ int InitSSL_Suites(WOLFSSL* ssl)
|
|||||||
InitSuites_EitherSide(ssl->suites, ssl->version, keySz, haveRSA,
|
InitSuites_EitherSide(ssl->suites, ssl->version, keySz, haveRSA,
|
||||||
havePSK, ssl->options.haveDH, ssl->options.haveECDSAsig,
|
havePSK, ssl->options.haveDH, ssl->options.haveECDSAsig,
|
||||||
ssl->options.haveECC, ssl->options.haveStaticECC,
|
ssl->options.haveECC, ssl->options.haveStaticECC,
|
||||||
ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
|
|
||||||
ssl->options.useAnon, ssl->options.side);
|
ssl->options.useAnon, ssl->options.side);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -7725,6 +7954,9 @@ int InitSSL(WOLFSSL* ssl, WOLFSSL_CTX* ctx, int writeDup)
|
|||||||
ssl->response_idx = 0;
|
ssl->response_idx = 0;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
ssl->secLevel = ctx->secLevel;
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
/* Returns 0 on success, not WOLFSSL_SUCCESS (1) */
|
/* Returns 0 on success, not WOLFSSL_SUCCESS (1) */
|
||||||
WOLFSSL_MSG_EX("InitSSL done. return 0 (success)");
|
WOLFSSL_MSG_EX("InitSSL done. return 0 (success)");
|
||||||
return 0;
|
return 0;
|
||||||
@ -25886,6 +26118,9 @@ const char* wolfSSL_ERR_reason_error_string(unsigned long e)
|
|||||||
case CRL_MISSING:
|
case CRL_MISSING:
|
||||||
return "CRL missing, not loaded";
|
return "CRL missing, not loaded";
|
||||||
|
|
||||||
|
case CRYPTO_POLICY_FORBIDDEN:
|
||||||
|
return "Operation forbidden by system crypto-policy";
|
||||||
|
|
||||||
case MONITOR_SETUP_E:
|
case MONITOR_SETUP_E:
|
||||||
return "CRL monitor setup error";
|
return "CRL monitor setup error";
|
||||||
|
|
||||||
@ -27313,6 +27548,9 @@ static int ParseCipherList(Suites* suites,
|
|||||||
word16 haveNull = 1; /* allowed by default if compiled in */
|
word16 haveNull = 1; /* allowed by default if compiled in */
|
||||||
int callInitSuites = 0;
|
int callInitSuites = 0;
|
||||||
word16 havePSK = 0;
|
word16 havePSK = 0;
|
||||||
|
word16 haveAES128 = 1; /* allowed by default if compiled in */
|
||||||
|
word16 haveSHA1 = 1; /* allowed by default if compiled in */
|
||||||
|
word16 haveRC4 = 1; /* allowed by default if compiled in */
|
||||||
#endif
|
#endif
|
||||||
const int suiteSz = GetCipherNamesSize();
|
const int suiteSz = GetCipherNamesSize();
|
||||||
const char* next = list;
|
const char* next = list;
|
||||||
@ -27337,8 +27575,8 @@ static int ParseCipherList(Suites* suites,
|
|||||||
#else
|
#else
|
||||||
0,
|
0,
|
||||||
#endif
|
#endif
|
||||||
haveRSA, 1, 1, !haveRSA, 1, haveRSA, !haveRSA, 1, 1, 0, 0,
|
haveRSA, 1, 1, !haveRSA, 1, haveRSA, !haveRSA, 0, 0, 1,
|
||||||
side
|
1, 1, side
|
||||||
);
|
);
|
||||||
return 1; /* wolfSSL default */
|
return 1; /* wolfSSL default */
|
||||||
}
|
}
|
||||||
@ -27539,6 +27777,29 @@ static int ParseCipherList(Suites* suites,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
if (XSTRCMP(name, "AES128") == 0) {
|
||||||
|
haveAES128 = allowing;
|
||||||
|
callInitSuites = 1;
|
||||||
|
ret = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (XSTRCMP(name, "SHA1") == 0) {
|
||||||
|
haveSHA1 = allowing;
|
||||||
|
callInitSuites = 1;
|
||||||
|
ret = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (XSTRCMP(name, "RC4") == 0) {
|
||||||
|
haveRC4 = allowing;
|
||||||
|
callInitSuites = 1;
|
||||||
|
ret = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
|
||||||
if (XSTRCMP(name, "LOW") == 0 || XSTRCMP(name, "MEDIUM") == 0) {
|
if (XSTRCMP(name, "LOW") == 0 || XSTRCMP(name, "MEDIUM") == 0) {
|
||||||
/* No way to limit or allow low bit sizes */
|
/* No way to limit or allow low bit sizes */
|
||||||
if (allowing) {
|
if (allowing) {
|
||||||
@ -27560,6 +27821,14 @@ static int ParseCipherList(Suites* suites,
|
|||||||
/* wolfSSL doesn't support "export" ciphers. We can skip this */
|
/* wolfSSL doesn't support "export" ciphers. We can skip this */
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
if (XSTRNCMP(name, WOLFSSL_SECLEVEL_STR,
|
||||||
|
strlen(WOLFSSL_SECLEVEL_STR)) == 0) {
|
||||||
|
/* Skip the "@SECLEVEL=N" string, we'll process it elsewhere. */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
#endif /* OPENSSL_EXTRA */
|
#endif /* OPENSSL_EXTRA */
|
||||||
|
|
||||||
for (i = 0; i < suiteSz; i++) {
|
for (i = 0; i < suiteSz; i++) {
|
||||||
@ -27699,10 +27968,9 @@ static int ParseCipherList(Suites* suites,
|
|||||||
(word16)((haveSig & SIG_ECDSA) != 0),
|
(word16)((haveSig & SIG_ECDSA) != 0),
|
||||||
(word16)haveECC, (word16)haveStaticRSA,
|
(word16)haveECC, (word16)haveStaticRSA,
|
||||||
(word16)haveStaticECC,
|
(word16)haveStaticECC,
|
||||||
(word16)((haveSig & SIG_FALCON) != 0),
|
|
||||||
(word16)((haveSig & SIG_DILITHIUM) != 0),
|
|
||||||
(word16)((haveSig & SIG_ANON) != 0),
|
(word16)((haveSig & SIG_ANON) != 0),
|
||||||
(word16)haveNull, side);
|
(word16)haveNull, (word16)haveAES128,
|
||||||
|
(word16)haveSHA1, (word16)haveRC4, side);
|
||||||
/* Restore user ciphers ahead of defaults */
|
/* Restore user ciphers ahead of defaults */
|
||||||
XMEMMOVE(suites->suites + idx, suites->suites,
|
XMEMMOVE(suites->suites + idx, suites->suites,
|
||||||
min(suites->suiteSz, WOLFSSL_MAX_SUITE_SZ-idx));
|
min(suites->suiteSz, WOLFSSL_MAX_SUITE_SZ-idx));
|
||||||
@ -27713,7 +27981,7 @@ static int ParseCipherList(Suites* suites,
|
|||||||
{
|
{
|
||||||
suites->suiteSz = (word16)idx;
|
suites->suiteSz = (word16)idx;
|
||||||
InitSuitesHashSigAlgo(suites->hashSigAlgo, haveSig, 1, keySz,
|
InitSuitesHashSigAlgo(suites->hashSigAlgo, haveSig, 1, keySz,
|
||||||
&suites->hashSigAlgoSz);
|
&suites->hashSigAlgoSz);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_RENEGOTIATION_INDICATION
|
#ifdef HAVE_RENEGOTIATION_INDICATION
|
||||||
@ -36885,9 +37153,8 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
|
|||||||
InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
|
InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
|
||||||
ssl->options.haveDH, ssl->options.haveECDSAsig,
|
ssl->options.haveDH, ssl->options.haveECDSAsig,
|
||||||
ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
|
ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
|
||||||
ssl->options.haveFalconSig,
|
ssl->options.useAnon,
|
||||||
ssl->options.haveDilithiumSig, ssl->options.useAnon,
|
TRUE, TRUE, TRUE, TRUE, ssl->options.side);
|
||||||
TRUE, ssl->options.side);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* suite size */
|
/* suite size */
|
||||||
@ -37317,9 +37584,8 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
|
|||||||
InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
|
InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
|
||||||
ssl->options.haveDH, ssl->options.haveECDSAsig,
|
ssl->options.haveDH, ssl->options.haveECDSAsig,
|
||||||
ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
|
ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
|
||||||
ssl->options.haveFalconSig,
|
ssl->options.useAnon,
|
||||||
ssl->options.haveDilithiumSig, ssl->options.useAnon,
|
TRUE, TRUE, TRUE, TRUE, ssl->options.side);
|
||||||
TRUE, ssl->options.side);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check if option is set to not allow the current version
|
/* check if option is set to not allow the current version
|
||||||
@ -37395,9 +37661,8 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
|
|||||||
InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
|
InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
|
||||||
ssl->options.haveDH, ssl->options.haveECDSAsig,
|
ssl->options.haveDH, ssl->options.haveECDSAsig,
|
||||||
ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
|
ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
|
||||||
ssl->options.haveFalconSig,
|
ssl->options.useAnon,
|
||||||
ssl->options.haveDilithiumSig, ssl->options.useAnon,
|
TRUE, TRUE, TRUE, TRUE, ssl->options.side);
|
||||||
TRUE, ssl->options.side);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
441
src/ssl.c
441
src/ssl.c
@ -281,6 +281,13 @@ int wc_OBJ_sn2nid(const char *sn)
|
|||||||
|
|
||||||
#ifndef WOLFCRYPT_ONLY
|
#ifndef WOLFCRYPT_ONLY
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
/* The system wide crypto-policy. Configured by wolfSSL_crypto_policy_enable.
|
||||||
|
* */
|
||||||
|
static struct SystemCryptoPolicy crypto_policy;
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
|
||||||
#if !defined(NO_RSA) || !defined(NO_DH) || defined(HAVE_ECC) || \
|
#if !defined(NO_RSA) || !defined(NO_DH) || defined(HAVE_ECC) || \
|
||||||
(defined(OPENSSL_EXTRA) && defined(WOLFSSL_KEY_GEN) && !defined(NO_DSA))
|
(defined(OPENSSL_EXTRA) && defined(WOLFSSL_KEY_GEN) && !defined(NO_DSA))
|
||||||
|
|
||||||
@ -1026,6 +1033,10 @@ int GetEchConfigsEx(WOLFSSL_EchConfig* configs, byte* output, word32* outputLen)
|
|||||||
}
|
}
|
||||||
#endif /* WOLFSSL_TLS13 && HAVE_ECH */
|
#endif /* WOLFSSL_TLS13 && HAVE_ECH */
|
||||||
|
|
||||||
|
#ifdef OPENSSL_EXTRA
|
||||||
|
static int wolfSSL_parse_cipher_list(WOLFSSL_CTX* ctx, WOLFSSL* ssl,
|
||||||
|
Suites* suites, const char* list);
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_FSPSM_TLS)
|
#if defined(WOLFSSL_RENESAS_TSIP_TLS) || defined(WOLFSSL_RENESAS_FSPSM_TLS)
|
||||||
#include <wolfssl/wolfcrypt/port/Renesas/renesas_cmn.h>
|
#include <wolfssl/wolfcrypt/port/Renesas/renesas_cmn.h>
|
||||||
@ -1125,6 +1136,30 @@ WOLFSSL_CTX* wolfSSL_CTX_new_ex(WOLFSSL_METHOD* method, void* heap)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
/* Load the crypto-policy ciphers if configured. */
|
||||||
|
if (ctx && wolfSSL_crypto_policy_is_enabled()) {
|
||||||
|
const char * list = wolfSSL_crypto_policy_get_ciphers();
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if (list != NULL && *list != '\0') {
|
||||||
|
if (AllocateCtxSuites(ctx) != 0) {
|
||||||
|
WOLFSSL_MSG("allocate ctx suites failed");
|
||||||
|
wolfSSL_CTX_free(ctx);
|
||||||
|
ctx = NULL;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ret = wolfSSL_parse_cipher_list(ctx, NULL, ctx->suites, list);
|
||||||
|
if (ret != WOLFSSL_SUCCESS) {
|
||||||
|
WOLFSSL_MSG("parse cipher list failed");
|
||||||
|
wolfSSL_CTX_free(ctx);
|
||||||
|
ctx = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
|
||||||
WOLFSSL_LEAVE("wolfSSL_CTX_new_ex", 0);
|
WOLFSSL_LEAVE("wolfSSL_CTX_new_ex", 0);
|
||||||
return ctx;
|
return ctx;
|
||||||
}
|
}
|
||||||
@ -2709,6 +2744,14 @@ int wolfSSL_CTX_SetMinEccKey_Sz(WOLFSSL_CTX* ctx, short keySz)
|
|||||||
return BAD_FUNC_ARG;
|
return BAD_FUNC_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
if (crypto_policy.enabled) {
|
||||||
|
if (ctx->minEccKeySz > (keySz / 8)) {
|
||||||
|
return CRYPTO_POLICY_FORBIDDEN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
|
||||||
ctx->minEccKeySz = keySz / 8;
|
ctx->minEccKeySz = keySz / 8;
|
||||||
#ifndef NO_CERTS
|
#ifndef NO_CERTS
|
||||||
ctx->cm->minEccKeySz = keySz / 8;
|
ctx->cm->minEccKeySz = keySz / 8;
|
||||||
@ -2725,6 +2768,14 @@ int wolfSSL_SetMinEccKey_Sz(WOLFSSL* ssl, short keySz)
|
|||||||
return BAD_FUNC_ARG;
|
return BAD_FUNC_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
if (crypto_policy.enabled) {
|
||||||
|
if (ssl->options.minEccKeySz > (keySz / 8)) {
|
||||||
|
return CRYPTO_POLICY_FORBIDDEN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
|
||||||
ssl->options.minEccKeySz = keySz / 8;
|
ssl->options.minEccKeySz = keySz / 8;
|
||||||
return WOLFSSL_SUCCESS;
|
return WOLFSSL_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -2739,6 +2790,14 @@ int wolfSSL_CTX_SetMinRsaKey_Sz(WOLFSSL_CTX* ctx, short keySz)
|
|||||||
return BAD_FUNC_ARG;
|
return BAD_FUNC_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
if (crypto_policy.enabled) {
|
||||||
|
if (ctx->minRsaKeySz > (keySz / 8)) {
|
||||||
|
return CRYPTO_POLICY_FORBIDDEN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
|
||||||
ctx->minRsaKeySz = keySz / 8;
|
ctx->minRsaKeySz = keySz / 8;
|
||||||
ctx->cm->minRsaKeySz = keySz / 8;
|
ctx->cm->minRsaKeySz = keySz / 8;
|
||||||
return WOLFSSL_SUCCESS;
|
return WOLFSSL_SUCCESS;
|
||||||
@ -2752,6 +2811,14 @@ int wolfSSL_SetMinRsaKey_Sz(WOLFSSL* ssl, short keySz)
|
|||||||
return BAD_FUNC_ARG;
|
return BAD_FUNC_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
if (crypto_policy.enabled) {
|
||||||
|
if (ssl->options.minRsaKeySz > (keySz / 8)) {
|
||||||
|
return CRYPTO_POLICY_FORBIDDEN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
|
||||||
ssl->options.minRsaKeySz = keySz / 8;
|
ssl->options.minRsaKeySz = keySz / 8;
|
||||||
return WOLFSSL_SUCCESS;
|
return WOLFSSL_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -2784,6 +2851,14 @@ int wolfSSL_CTX_SetMinDhKey_Sz(WOLFSSL_CTX* ctx, word16 keySz_bits)
|
|||||||
if (ctx == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
|
if (ctx == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
|
||||||
return BAD_FUNC_ARG;
|
return BAD_FUNC_ARG;
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
if (crypto_policy.enabled) {
|
||||||
|
if (ctx->minDhKeySz > (keySz_bits / 8)) {
|
||||||
|
return CRYPTO_POLICY_FORBIDDEN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
|
||||||
ctx->minDhKeySz = keySz_bits / 8;
|
ctx->minDhKeySz = keySz_bits / 8;
|
||||||
return WOLFSSL_SUCCESS;
|
return WOLFSSL_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -2794,6 +2869,14 @@ int wolfSSL_SetMinDhKey_Sz(WOLFSSL* ssl, word16 keySz_bits)
|
|||||||
if (ssl == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
|
if (ssl == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
|
||||||
return BAD_FUNC_ARG;
|
return BAD_FUNC_ARG;
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
if (crypto_policy.enabled) {
|
||||||
|
if (ssl->options.minDhKeySz > (keySz_bits / 8)) {
|
||||||
|
return CRYPTO_POLICY_FORBIDDEN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
|
||||||
ssl->options.minDhKeySz = keySz_bits / 8;
|
ssl->options.minDhKeySz = keySz_bits / 8;
|
||||||
return WOLFSSL_SUCCESS;
|
return WOLFSSL_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -2804,6 +2887,14 @@ int wolfSSL_CTX_SetMaxDhKey_Sz(WOLFSSL_CTX* ctx, word16 keySz_bits)
|
|||||||
if (ctx == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
|
if (ctx == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
|
||||||
return BAD_FUNC_ARG;
|
return BAD_FUNC_ARG;
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
if (crypto_policy.enabled) {
|
||||||
|
if (ctx->minDhKeySz > (keySz_bits / 8)) {
|
||||||
|
return CRYPTO_POLICY_FORBIDDEN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
|
||||||
ctx->maxDhKeySz = keySz_bits / 8;
|
ctx->maxDhKeySz = keySz_bits / 8;
|
||||||
return WOLFSSL_SUCCESS;
|
return WOLFSSL_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -2814,6 +2905,14 @@ int wolfSSL_SetMaxDhKey_Sz(WOLFSSL* ssl, word16 keySz_bits)
|
|||||||
if (ssl == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
|
if (ssl == NULL || keySz_bits > 16000 || keySz_bits % 8 != 0)
|
||||||
return BAD_FUNC_ARG;
|
return BAD_FUNC_ARG;
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
if (crypto_policy.enabled) {
|
||||||
|
if (ssl->options.minDhKeySz > (keySz_bits / 8)) {
|
||||||
|
return CRYPTO_POLICY_FORBIDDEN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
|
||||||
ssl->options.maxDhKeySz = keySz_bits / 8;
|
ssl->options.maxDhKeySz = keySz_bits / 8;
|
||||||
return WOLFSSL_SUCCESS;
|
return WOLFSSL_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -4858,6 +4957,12 @@ int wolfSSL_CTX_SetMinVersion(WOLFSSL_CTX* ctx, int version)
|
|||||||
return BAD_FUNC_ARG;
|
return BAD_FUNC_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
if (crypto_policy.enabled) {
|
||||||
|
return CRYPTO_POLICY_FORBIDDEN;
|
||||||
|
}
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
|
||||||
return SetMinVersionHelper(&ctx->minDowngrade, version);
|
return SetMinVersionHelper(&ctx->minDowngrade, version);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4872,6 +4977,12 @@ int wolfSSL_SetMinVersion(WOLFSSL* ssl, int version)
|
|||||||
return BAD_FUNC_ARG;
|
return BAD_FUNC_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
if (crypto_policy.enabled) {
|
||||||
|
return CRYPTO_POLICY_FORBIDDEN;
|
||||||
|
}
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
|
||||||
return SetMinVersionHelper(&ssl->options.minDowngrade, version);
|
return SetMinVersionHelper(&ssl->options.minDowngrade, version);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4981,8 +5092,7 @@ int wolfSSL_SetVersion(WOLFSSL* ssl, int version)
|
|||||||
InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
|
InitSuites(ssl->suites, ssl->version, keySz, haveRSA, havePSK,
|
||||||
ssl->options.haveDH, ssl->options.haveECDSAsig,
|
ssl->options.haveDH, ssl->options.haveECDSAsig,
|
||||||
ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
|
ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
|
||||||
ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
|
ssl->options.useAnon, TRUE, TRUE, TRUE, TRUE, ssl->options.side);
|
||||||
ssl->options.useAnon, TRUE, ssl->options.side);
|
|
||||||
return WOLFSSL_SUCCESS;
|
return WOLFSSL_SUCCESS;
|
||||||
}
|
}
|
||||||
#endif /* !leanpsk */
|
#endif /* !leanpsk */
|
||||||
@ -5864,6 +5974,11 @@ int wolfSSL_Init(void)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
/* System wide crypto policy disabled by default. */
|
||||||
|
XMEMSET(&crypto_policy, 0, sizeof(crypto_policy));
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
|
||||||
if (ret == WOLFSSL_SUCCESS) {
|
if (ret == WOLFSSL_SUCCESS) {
|
||||||
initRefCount++;
|
initRefCount++;
|
||||||
}
|
}
|
||||||
@ -5880,6 +5995,286 @@ int wolfSSL_Init(void)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
/* Helper function for wolfSSL_crypto_policy_enable and
|
||||||
|
* wolfSSL_crypto_policy_enable_buffer.
|
||||||
|
*
|
||||||
|
* Parses the crypto policy string, verifies values,
|
||||||
|
* and sets in global crypto policy struct. Not thread
|
||||||
|
* safe. String length has already been verified.
|
||||||
|
*
|
||||||
|
* Returns WOLFSSL_SUCCESS on success.
|
||||||
|
* Returns CRYPTO_POLICY_FORBIDDEN if already enabled.
|
||||||
|
* Returns < 0 on misc error.
|
||||||
|
* */
|
||||||
|
static int crypto_policy_parse(void)
|
||||||
|
{
|
||||||
|
const char * hdr = WOLFSSL_SECLEVEL_STR;
|
||||||
|
int sec_level = 0;
|
||||||
|
size_t i = 0;
|
||||||
|
|
||||||
|
/* All policies should begin with "@SECLEVEL=<N>" (N={0..5}) followed
|
||||||
|
* by bulk cipher list. */
|
||||||
|
if (XMEMCMP(crypto_policy.str, hdr, strlen(hdr)) != 0) {
|
||||||
|
WOLFSSL_MSG("error: crypto policy: invalid header");
|
||||||
|
return WOLFSSL_BAD_FILE;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
/* Extract the security level. */
|
||||||
|
char * policy_mem = crypto_policy.str;
|
||||||
|
policy_mem += strlen(hdr);
|
||||||
|
sec_level = (int) (*policy_mem - '0');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sec_level < MIN_WOLFSSL_SEC_LEVEL ||
|
||||||
|
sec_level > MAX_WOLFSSL_SEC_LEVEL) {
|
||||||
|
WOLFSSL_MSG_EX("error: invalid SECLEVEL: %d", sec_level);
|
||||||
|
return WOLFSSL_BAD_FILE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remove trailing '\r' or '\n'. */
|
||||||
|
for (i = 0; i < MAX_WOLFSSL_CRYPTO_POLICY_SIZE; ++i) {
|
||||||
|
if (crypto_policy.str[i] == '\0') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (crypto_policy.str[i] == '\r' || crypto_policy.str[i] == '\n') {
|
||||||
|
crypto_policy.str[i] = '\0';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(DEBUG_WOLFSSL_VERBOSE)
|
||||||
|
WOLFSSL_MSG_EX("info: SECLEVEL=%d", sec_level);
|
||||||
|
WOLFSSL_MSG_EX("info: using crypto-policy file: %s, %ld", policy_file, sz);
|
||||||
|
#endif /* DEBUG_WOLFSSL_VERBOSE */
|
||||||
|
|
||||||
|
crypto_policy.secLevel = sec_level;
|
||||||
|
crypto_policy.enabled = 1;
|
||||||
|
|
||||||
|
return WOLFSSL_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef NO_FILESYSTEM
|
||||||
|
/* Enables wolfSSL system wide crypto-policy, using the given policy
|
||||||
|
* file arg. If NULL is passed, then the default system crypto-policy
|
||||||
|
* file that was set at configure time will be used instead.
|
||||||
|
*
|
||||||
|
* While enabled:
|
||||||
|
* - TLS methods, min key sizes, and cipher lists are all configured
|
||||||
|
* automatically by the policy.
|
||||||
|
* - Attempting to use lesser strength parameters will fail with
|
||||||
|
* error CRYPTO_POLICY_FORBIDDEN.
|
||||||
|
*
|
||||||
|
* Disable with wolfSSL_crypto_policy_disable.
|
||||||
|
*
|
||||||
|
* Note: the wolfSSL_crypto_policy_X API are not thread safe, and should
|
||||||
|
* only be called at program init time.
|
||||||
|
*
|
||||||
|
* Returns WOLFSSL_SUCCESS on success.
|
||||||
|
* Returns CRYPTO_POLICY_FORBIDDEN if already enabled.
|
||||||
|
* Returns < 0 on misc error.
|
||||||
|
* */
|
||||||
|
int wolfSSL_crypto_policy_enable(const char * policy_file)
|
||||||
|
{
|
||||||
|
XFILE file;
|
||||||
|
long sz = 0;
|
||||||
|
size_t n_read = 0;
|
||||||
|
|
||||||
|
WOLFSSL_ENTER("wolfSSL_crypto_policy_enable");
|
||||||
|
|
||||||
|
if (wolfSSL_crypto_policy_is_enabled()) {
|
||||||
|
WOLFSSL_MSG_EX("error: crypto policy already enabled: %s",
|
||||||
|
policy_file);
|
||||||
|
return CRYPTO_POLICY_FORBIDDEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (policy_file == NULL) {
|
||||||
|
/* Use the configure-time default if NULL passed. */
|
||||||
|
policy_file = WC_STRINGIFY(WOLFSSL_CRYPTO_POLICY_FILE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (policy_file == NULL || *policy_file == '\0') {
|
||||||
|
WOLFSSL_MSG("error: crypto policy empty file");
|
||||||
|
return BAD_FUNC_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
XMEMSET(&crypto_policy, 0, sizeof(crypto_policy));
|
||||||
|
|
||||||
|
file = XFOPEN(policy_file, "rb");
|
||||||
|
|
||||||
|
if (file == XBADFILE) {
|
||||||
|
WOLFSSL_MSG_EX("error: crypto policy file open failed: %s",
|
||||||
|
policy_file);
|
||||||
|
return WOLFSSL_BAD_FILE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (XFSEEK(file, 0, XSEEK_END) != 0) {
|
||||||
|
WOLFSSL_MSG_EX("error: crypto policy file seek end failed: %s",
|
||||||
|
policy_file);
|
||||||
|
XFCLOSE(file);
|
||||||
|
return WOLFSSL_BAD_FILE;
|
||||||
|
}
|
||||||
|
|
||||||
|
sz = XFTELL(file);
|
||||||
|
|
||||||
|
if (XFSEEK(file, 0, XSEEK_SET) != 0) {
|
||||||
|
WOLFSSL_MSG_EX("error: crypto policy file seek failed: %s",
|
||||||
|
policy_file);
|
||||||
|
XFCLOSE(file);
|
||||||
|
return WOLFSSL_BAD_FILE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sz <= 0 || sz > MAX_WOLFSSL_CRYPTO_POLICY_SIZE) {
|
||||||
|
WOLFSSL_MSG_EX("error: crypto policy file %s, invalid size: %ld",
|
||||||
|
policy_file, sz);
|
||||||
|
XFCLOSE(file);
|
||||||
|
return WOLFSSL_BAD_FILE;
|
||||||
|
}
|
||||||
|
|
||||||
|
n_read = XFREAD(crypto_policy.str, 1, sz, file);
|
||||||
|
XFCLOSE(file);
|
||||||
|
|
||||||
|
if (n_read != (size_t) sz) {
|
||||||
|
WOLFSSL_MSG_EX("error: crypto policy file %s: read %zu, "
|
||||||
|
"expected %ld", policy_file, n_read, sz);
|
||||||
|
return WOLFSSL_BAD_FILE;
|
||||||
|
}
|
||||||
|
|
||||||
|
crypto_policy.str[n_read] = '\0';
|
||||||
|
|
||||||
|
return crypto_policy_parse();
|
||||||
|
}
|
||||||
|
#endif /* ! NO_FILESYSTEM */
|
||||||
|
|
||||||
|
/* Same behavior as wolfSSL_crypto_policy_enable, but loads
|
||||||
|
* via memory buf instead of file.
|
||||||
|
*
|
||||||
|
* Returns WOLFSSL_SUCCESS on success.
|
||||||
|
* Returns CRYPTO_POLICY_FORBIDDEN if already enabled.
|
||||||
|
* Returns < 0 on misc error.
|
||||||
|
* */
|
||||||
|
int wolfSSL_crypto_policy_enable_buffer(const char * buf)
|
||||||
|
{
|
||||||
|
size_t sz = 0;
|
||||||
|
|
||||||
|
WOLFSSL_ENTER("wolfSSL_crypto_policy_enable_buffer");
|
||||||
|
|
||||||
|
if (wolfSSL_crypto_policy_is_enabled()) {
|
||||||
|
WOLFSSL_MSG_EX("error: crypto policy already enabled");
|
||||||
|
return CRYPTO_POLICY_FORBIDDEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buf == NULL || *buf == '\0') {
|
||||||
|
return BAD_FUNC_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
sz = XSTRLEN(buf);
|
||||||
|
|
||||||
|
if (sz == 0 || sz > MAX_WOLFSSL_CRYPTO_POLICY_SIZE) {
|
||||||
|
return BAD_FUNC_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
XMEMSET(&crypto_policy, 0, sizeof(crypto_policy));
|
||||||
|
XMEMCPY(crypto_policy.str, buf, sz);
|
||||||
|
|
||||||
|
return crypto_policy_parse();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns whether the system wide crypto-policy is enabled.
|
||||||
|
*
|
||||||
|
* Returns 1 if enabled.
|
||||||
|
* 0 if disabled.
|
||||||
|
* */
|
||||||
|
int wolfSSL_crypto_policy_is_enabled(void)
|
||||||
|
{
|
||||||
|
WOLFSSL_ENTER("wolfSSL_crypto_policy_is_enabled");
|
||||||
|
|
||||||
|
return crypto_policy.enabled == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Disables the system wide crypto-policy.
|
||||||
|
* note: SSL and CTX structures already instantiated will
|
||||||
|
* keep their security policy parameters. This will only
|
||||||
|
* affect new instantiations.
|
||||||
|
* */
|
||||||
|
void wolfSSL_crypto_policy_disable(void)
|
||||||
|
{
|
||||||
|
WOLFSSL_ENTER("wolfSSL_crypto_policy_disable");
|
||||||
|
crypto_policy.enabled = 0;
|
||||||
|
XMEMSET(&crypto_policy, 0, sizeof(crypto_policy));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the crypto-policy bulk cipher list string.
|
||||||
|
* String is not owned by caller, should not be freed.
|
||||||
|
*
|
||||||
|
* Returns pointer to bulk cipher list string.
|
||||||
|
* Returns NULL if NOT enabled, or on error.
|
||||||
|
* */
|
||||||
|
const char * wolfSSL_crypto_policy_get_ciphers(void)
|
||||||
|
{
|
||||||
|
WOLFSSL_ENTER("wolfSSL_crypto_policy_get_ciphers");
|
||||||
|
|
||||||
|
if (crypto_policy.enabled == 1) {
|
||||||
|
/* The crypto policy config will have
|
||||||
|
* this form:
|
||||||
|
* "@SECLEVEL=2:kEECDH:kRSA..." */
|
||||||
|
return crypto_policy.str;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get the configured crypto-policy security level.
|
||||||
|
* A security level of 0 does not impose any additional
|
||||||
|
* restrictions.
|
||||||
|
*
|
||||||
|
* Returns 1 - 5 if enabled.
|
||||||
|
* Returns 0 if NOT enabled.
|
||||||
|
* */
|
||||||
|
int wolfSSL_crypto_policy_get_level(void)
|
||||||
|
{
|
||||||
|
if (crypto_policy.enabled == 1) {
|
||||||
|
return crypto_policy.secLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Get security level from ssl structure.
|
||||||
|
* @param ssl a pointer to WOLFSSL structure
|
||||||
|
*/
|
||||||
|
int wolfSSL_get_security_level(const WOLFSSL * ssl)
|
||||||
|
{
|
||||||
|
if (ssl == NULL) {
|
||||||
|
return BAD_FUNC_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ssl->secLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef NO_WOLFSSL_STUB
|
||||||
|
/*
|
||||||
|
* Set security level (wolfSSL doesn't support setting the security level).
|
||||||
|
*
|
||||||
|
* The security level can only be set through a system wide crypto-policy
|
||||||
|
* with wolfSSL_crypto_policy_enable().
|
||||||
|
*
|
||||||
|
* @param ssl a pointer to WOLFSSL structure
|
||||||
|
* @param level security level
|
||||||
|
*/
|
||||||
|
void wolfSSL_set_security_level(WOLFSSL * ssl, int level)
|
||||||
|
{
|
||||||
|
WOLFSSL_ENTER("wolfSSL_set_security_level");
|
||||||
|
(void)ssl;
|
||||||
|
(void)level;
|
||||||
|
}
|
||||||
|
#endif /* !NO_WOLFSSL_STUB */
|
||||||
|
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
|
||||||
|
|
||||||
#define WOLFSSL_SSL_LOAD_INCLUDED
|
#define WOLFSSL_SSL_LOAD_INCLUDED
|
||||||
#include <src/ssl_load.c>
|
#include <src/ssl_load.c>
|
||||||
@ -10470,6 +10865,10 @@ int wolfSSL_Cleanup(void)
|
|||||||
if (!release)
|
if (!release)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
wolfSSL_crypto_policy_disable();
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
|
||||||
#ifdef OPENSSL_EXTRA
|
#ifdef OPENSSL_EXTRA
|
||||||
wolfSSL_BN_free_one();
|
wolfSSL_BN_free_one();
|
||||||
#endif
|
#endif
|
||||||
@ -10915,8 +11314,7 @@ int wolfSSL_set_compression(WOLFSSL* ssl)
|
|||||||
InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
|
InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
|
||||||
ssl->options.haveDH, ssl->options.haveECDSAsig,
|
ssl->options.haveDH, ssl->options.haveECDSAsig,
|
||||||
ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
|
ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
|
||||||
ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
|
ssl->options.useAnon, TRUE, TRUE, TRUE, TRUE, ssl->options.side);
|
||||||
ssl->options.useAnon, TRUE, ssl->options.side);
|
|
||||||
}
|
}
|
||||||
#ifdef OPENSSL_EXTRA
|
#ifdef OPENSSL_EXTRA
|
||||||
/**
|
/**
|
||||||
@ -10972,8 +11370,7 @@ int wolfSSL_set_compression(WOLFSSL* ssl)
|
|||||||
InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
|
InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
|
||||||
ssl->options.haveDH, ssl->options.haveECDSAsig,
|
ssl->options.haveDH, ssl->options.haveECDSAsig,
|
||||||
ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
|
ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
|
||||||
ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
|
ssl->options.useAnon, TRUE, TRUE, TRUE, TRUE, ssl->options.side);
|
||||||
ssl->options.useAnon, TRUE, ssl->options.side);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* wolfSSL_get_psk_identity_hint(const WOLFSSL* ssl)
|
const char* wolfSSL_get_psk_identity_hint(const WOLFSSL* ssl)
|
||||||
@ -12707,6 +13104,7 @@ int wolfSSL_CTX_set_min_proto_version(WOLFSSL_CTX* ctx, int version)
|
|||||||
if (ctx == NULL) {
|
if (ctx == NULL) {
|
||||||
return WOLFSSL_FAILURE;
|
return WOLFSSL_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (version != 0) {
|
if (version != 0) {
|
||||||
proto = version;
|
proto = version;
|
||||||
ctx->minProto = 0; /* turn min proto flag off */
|
ctx->minProto = 0; /* turn min proto flag off */
|
||||||
@ -16374,9 +16772,8 @@ long wolfSSL_set_options(WOLFSSL* ssl, long op)
|
|||||||
InitSuites(ssl->suites, ssl->version, keySz, haveRSA,
|
InitSuites(ssl->suites, ssl->version, keySz, haveRSA,
|
||||||
havePSK, ssl->options.haveDH, ssl->options.haveECDSAsig,
|
havePSK, ssl->options.haveDH, ssl->options.haveECDSAsig,
|
||||||
ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
|
ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
|
||||||
ssl->options.haveFalconSig,
|
ssl->options.useAnon,
|
||||||
ssl->options.haveDilithiumSig, ssl->options.useAnon,
|
TRUE, TRUE, TRUE, TRUE, ssl->options.side);
|
||||||
TRUE, ssl->options.side);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* Only preserve overlapping suites */
|
/* Only preserve overlapping suites */
|
||||||
@ -16397,7 +16794,7 @@ long wolfSSL_set_options(WOLFSSL* ssl, long op)
|
|||||||
* - haveStaticECC turns off haveRSA
|
* - haveStaticECC turns off haveRSA
|
||||||
* - haveECDSAsig turns off haveRSAsig */
|
* - haveECDSAsig turns off haveRSAsig */
|
||||||
InitSuites(&tmpSuites, ssl->version, 0, 1, 1, 1, haveECDSAsig, 1, 1,
|
InitSuites(&tmpSuites, ssl->version, 0, 1, 1, 1, haveECDSAsig, 1, 1,
|
||||||
haveStaticECC, 1, 1, 1, 1, ssl->options.side);
|
haveStaticECC, 1, 1, 1, 1, 1, ssl->options.side);
|
||||||
for (in = 0, out = 0; in < ssl->suites->suiteSz; in += SUITE_LEN) {
|
for (in = 0, out = 0; in < ssl->suites->suiteSz; in += SUITE_LEN) {
|
||||||
if (FindSuite(&tmpSuites, ssl->suites->suites[in],
|
if (FindSuite(&tmpSuites, ssl->suites->suites[in],
|
||||||
ssl->suites->suites[in+1]) >= 0) {
|
ssl->suites->suites[in+1]) >= 0) {
|
||||||
@ -23870,8 +24267,12 @@ int wolfSSL_CTX_set_dh_auto(WOLFSSL_CTX* ctx, int onoff)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* set security level (wolfSSL doesn't support security level)
|
* Set security level (wolfSSL doesn't support setting the security level).
|
||||||
* @param ctx a pointer to WOLFSSL_EVP_PKEY_CTX structure
|
*
|
||||||
|
* The security level can only be set through a system wide crypto-policy
|
||||||
|
* with wolfSSL_crypto_policy_enable().
|
||||||
|
*
|
||||||
|
* @param ctx a pointer to WOLFSSL_CTX structure
|
||||||
* @param level security level
|
* @param level security level
|
||||||
*/
|
*/
|
||||||
void wolfSSL_CTX_set_security_level(WOLFSSL_CTX* ctx, int level)
|
void wolfSSL_CTX_set_security_level(WOLFSSL_CTX* ctx, int level)
|
||||||
@ -23880,16 +24281,20 @@ void wolfSSL_CTX_set_security_level(WOLFSSL_CTX* ctx, int level)
|
|||||||
(void)ctx;
|
(void)ctx;
|
||||||
(void)level;
|
(void)level;
|
||||||
}
|
}
|
||||||
/**
|
|
||||||
* get security level (wolfSSL doesn't support security level)
|
int wolfSSL_CTX_get_security_level(const WOLFSSL_CTX * ctx)
|
||||||
* @param ctx a pointer to WOLFSSL_EVP_PKEY_CTX structure
|
|
||||||
* @return always 0(level 0)
|
|
||||||
*/
|
|
||||||
int wolfSSL_CTX_get_security_level(const WOLFSSL_CTX* ctx)
|
|
||||||
{
|
{
|
||||||
WOLFSSL_ENTER("wolfSSL_CTX_get_security_level");
|
WOLFSSL_ENTER("wolfSSL_CTX_get_security_level");
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
if (ctx == NULL) {
|
||||||
|
return BAD_FUNC_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ctx->secLevel;
|
||||||
|
#else
|
||||||
(void)ctx;
|
(void)ctx;
|
||||||
return 0;
|
return 0;
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
|
#if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
|
||||||
|
@ -2201,9 +2201,9 @@ static int ProcessBufferResetSuites(WOLFSSL_CTX* ctx, WOLFSSL* ssl, int type)
|
|||||||
InitSuites(ssl->suites, ssl->version, ssl->buffers.keySz,
|
InitSuites(ssl->suites, ssl->version, ssl->buffers.keySz,
|
||||||
WOLFSSL_HAVE_RSA, SSL_HAVE_PSK(ssl), ssl->options.haveDH,
|
WOLFSSL_HAVE_RSA, SSL_HAVE_PSK(ssl), ssl->options.haveDH,
|
||||||
ssl->options.haveECDSAsig, ssl->options.haveECC, TRUE,
|
ssl->options.haveECDSAsig, ssl->options.haveECC, TRUE,
|
||||||
ssl->options.haveStaticECC, ssl->options.haveFalconSig,
|
ssl->options.haveStaticECC,
|
||||||
ssl->options.haveDilithiumSig, ssl->options.useAnon, TRUE,
|
ssl->options.useAnon, TRUE,
|
||||||
ssl->options.side);
|
TRUE, TRUE, TRUE, ssl->options.side);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2218,8 +2218,8 @@ static int ProcessBufferResetSuites(WOLFSSL_CTX* ctx, WOLFSSL* ssl, int type)
|
|||||||
InitSuites(ctx->suites, ctx->method->version, ctx->privateKeySz,
|
InitSuites(ctx->suites, ctx->method->version, ctx->privateKeySz,
|
||||||
WOLFSSL_HAVE_RSA, CTX_HAVE_PSK(ctx), ctx->haveDH,
|
WOLFSSL_HAVE_RSA, CTX_HAVE_PSK(ctx), ctx->haveDH,
|
||||||
ctx->haveECDSAsig, ctx->haveECC, TRUE, ctx->haveStaticECC,
|
ctx->haveECDSAsig, ctx->haveECC, TRUE, ctx->haveStaticECC,
|
||||||
ctx->haveFalconSig, ctx->haveDilithiumSig, CTX_USE_ANON(ctx),
|
CTX_USE_ANON(ctx),
|
||||||
TRUE, ctx->method->side);
|
TRUE, TRUE, TRUE, TRUE, ctx->method->side);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5309,9 +5309,9 @@ static int wolfssl_set_tmp_dh(WOLFSSL* ssl, unsigned char* p, int pSz,
|
|||||||
InitSuites(ssl->suites, ssl->version, SSL_KEY_SZ(ssl),
|
InitSuites(ssl->suites, ssl->version, SSL_KEY_SZ(ssl),
|
||||||
WOLFSSL_HAVE_RSA, SSL_HAVE_PSK(ssl), ssl->options.haveDH,
|
WOLFSSL_HAVE_RSA, SSL_HAVE_PSK(ssl), ssl->options.haveDH,
|
||||||
ssl->options.haveECDSAsig, ssl->options.haveECC, TRUE,
|
ssl->options.haveECDSAsig, ssl->options.haveECC, TRUE,
|
||||||
ssl->options.haveStaticECC, ssl->options.haveFalconSig,
|
ssl->options.haveStaticECC,
|
||||||
ssl->options.haveDilithiumSig, ssl->options.useAnon, TRUE,
|
ssl->options.useAnon, TRUE,
|
||||||
ssl->options.side);
|
TRUE, TRUE, TRUE, ssl->options.side);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -13976,8 +13976,7 @@ void wolfSSL_set_psk_client_cs_callback(WOLFSSL* ssl,
|
|||||||
InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
|
InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
|
||||||
ssl->options.haveDH, ssl->options.haveECDSAsig,
|
ssl->options.haveDH, ssl->options.haveECDSAsig,
|
||||||
ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
|
ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
|
||||||
ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
|
ssl->options.useAnon, TRUE, TRUE, TRUE, TRUE, ssl->options.side);
|
||||||
ssl->options.useAnon, TRUE, ssl->options.side);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the PSK callback that returns the cipher suite for a client to use
|
/* Set the PSK callback that returns the cipher suite for a client to use
|
||||||
@ -14029,8 +14028,7 @@ void wolfSSL_set_psk_client_tls13_callback(WOLFSSL* ssl,
|
|||||||
InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
|
InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
|
||||||
ssl->options.haveDH, ssl->options.haveECDSAsig,
|
ssl->options.haveDH, ssl->options.haveECDSAsig,
|
||||||
ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
|
ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
|
||||||
ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
|
ssl->options.useAnon, TRUE, TRUE, TRUE, TRUE, ssl->options.side);
|
||||||
ssl->options.useAnon, TRUE, ssl->options.side);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the PSK callback that returns the cipher suite for a server to use
|
/* Set the PSK callback that returns the cipher suite for a server to use
|
||||||
@ -14079,8 +14077,7 @@ void wolfSSL_set_psk_server_tls13_callback(WOLFSSL* ssl,
|
|||||||
InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
|
InitSuites(ssl->suites, ssl->version, keySz, haveRSA, TRUE,
|
||||||
ssl->options.haveDH, ssl->options.haveECDSAsig,
|
ssl->options.haveDH, ssl->options.haveECDSAsig,
|
||||||
ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
|
ssl->options.haveECC, TRUE, ssl->options.haveStaticECC,
|
||||||
ssl->options.haveFalconSig, ssl->options.haveDilithiumSig,
|
ssl->options.useAnon, TRUE, TRUE, TRUE, TRUE, ssl->options.side);
|
||||||
ssl->options.useAnon, TRUE, ssl->options.side);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get name of first supported cipher suite that uses the hash indicated.
|
/* Get name of first supported cipher suite that uses the hash indicated.
|
||||||
|
705
tests/api.c
705
tests/api.c
@ -92005,7 +92005,11 @@ static int test_wolfSSL_security_level(void)
|
|||||||
#endif
|
#endif
|
||||||
SSL_CTX_set_security_level(NULL, 1);
|
SSL_CTX_set_security_level(NULL, 1);
|
||||||
SSL_CTX_set_security_level(ctx, 1);
|
SSL_CTX_set_security_level(ctx, 1);
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
ExpectIntEQ(SSL_CTX_get_security_level(NULL), BAD_FUNC_ARG);
|
||||||
|
#else
|
||||||
ExpectIntEQ(SSL_CTX_get_security_level(NULL), 0);
|
ExpectIntEQ(SSL_CTX_get_security_level(NULL), 0);
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
/* Stub so nothing happens. */
|
/* Stub so nothing happens. */
|
||||||
ExpectIntEQ(SSL_CTX_get_security_level(ctx), 0);
|
ExpectIntEQ(SSL_CTX_get_security_level(ctx), 0);
|
||||||
|
|
||||||
@ -92017,6 +92021,703 @@ static int test_wolfSSL_security_level(void)
|
|||||||
return EXPECT_RESULT();
|
return EXPECT_RESULT();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* System wide crypto-policy test.
|
||||||
|
*
|
||||||
|
* Loads three different policies (legacy, default, future),
|
||||||
|
* then tests crypt_policy api.
|
||||||
|
* */
|
||||||
|
static int test_wolfSSL_crypto_policy(void)
|
||||||
|
{
|
||||||
|
EXPECT_DECLS;
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY) && !defined(NO_TLS)
|
||||||
|
int rc = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
|
||||||
|
const char * policy_list[] = {
|
||||||
|
"examples/crypto_policies/legacy/wolfssl.txt",
|
||||||
|
"examples/crypto_policies/default/wolfssl.txt",
|
||||||
|
"examples/crypto_policies/future/wolfssl.txt",
|
||||||
|
};
|
||||||
|
const char * ciphers_list[] = {
|
||||||
|
"@SECLEVEL=1:EECDH:kRSA:EDH:PSK:DHEPSK:ECDHEPSK:RSAPSK"
|
||||||
|
":!eNULL:!aNULL",
|
||||||
|
"@SECLEVEL=2:EECDH:kRSA:EDH:PSK:DHEPSK:ECDHEPSK:RSAPSK"
|
||||||
|
":!RC4:!eNULL:!aNULL",
|
||||||
|
"@SECLEVEL=3:EECDH:EDH:PSK:DHEPSK:ECDHEPSK:!RSAPSK:!kRSA"
|
||||||
|
":!AES128:!RC4:!eNULL:!aNULL:!SHA1",
|
||||||
|
};
|
||||||
|
int seclevel_list[] = { 1, 2, 3 };
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < 3; ++i) {
|
||||||
|
const char * ciphers = NULL;
|
||||||
|
int n_diff = 0;
|
||||||
|
WOLFSSL_CTX * ctx = NULL;
|
||||||
|
WOLFSSL * ssl = NULL;
|
||||||
|
|
||||||
|
/* Enable crypto policy. */
|
||||||
|
rc = wolfSSL_crypto_policy_enable(policy_list[i]);
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
|
||||||
|
rc = wolfSSL_crypto_policy_is_enabled();
|
||||||
|
ExpectIntEQ(rc, 1);
|
||||||
|
|
||||||
|
/* Trying to enable while already enabled should return
|
||||||
|
* forbidden. */
|
||||||
|
rc = wolfSSL_crypto_policy_enable(policy_list[i]);
|
||||||
|
ExpectIntEQ(rc, CRYPTO_POLICY_FORBIDDEN);
|
||||||
|
|
||||||
|
/* Security level and ciphers should match what is expected. */
|
||||||
|
rc = wolfSSL_crypto_policy_get_level();
|
||||||
|
ExpectIntEQ(rc, seclevel_list[i]);
|
||||||
|
|
||||||
|
ciphers = wolfSSL_crypto_policy_get_ciphers();
|
||||||
|
ExpectNotNull(ciphers);
|
||||||
|
|
||||||
|
if (ciphers != NULL) {
|
||||||
|
n_diff = XSTRNCMP(ciphers, ciphers_list[i], strlen(ciphers));
|
||||||
|
#ifdef DEBUG_WOLFSSL
|
||||||
|
if (n_diff) {
|
||||||
|
printf("error: got \n%s, expected \n%s\n",
|
||||||
|
ciphers, ciphers_list[i]);
|
||||||
|
}
|
||||||
|
#endif /* DEBUG_WOLFSSL */
|
||||||
|
ExpectIntEQ(n_diff, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TLSv1_2_method should work for all policies. */
|
||||||
|
ctx = wolfSSL_CTX_new(wolfTLSv1_2_method());
|
||||||
|
ExpectNotNull(ctx);
|
||||||
|
|
||||||
|
if (ctx != NULL) {
|
||||||
|
ssl = wolfSSL_new(ctx);
|
||||||
|
ExpectNotNull(ssl);
|
||||||
|
|
||||||
|
/* These API should be rejected while enabled. */
|
||||||
|
rc = wolfSSL_CTX_SetMinVersion(ctx, WOLFSSL_TLSV1_3);
|
||||||
|
ExpectIntEQ(rc, CRYPTO_POLICY_FORBIDDEN);
|
||||||
|
|
||||||
|
rc = wolfSSL_SetMinVersion(ssl, WOLFSSL_TLSV1_3);
|
||||||
|
ExpectIntEQ(rc, CRYPTO_POLICY_FORBIDDEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ctx != NULL) {
|
||||||
|
wolfSSL_CTX_free(ctx);
|
||||||
|
ctx = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ssl != NULL) {
|
||||||
|
wolfSSL_free(ssl);
|
||||||
|
ssl = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wolfSSL_crypto_policy_disable();
|
||||||
|
|
||||||
|
/* Do the same test by buffer. */
|
||||||
|
rc = wolfSSL_crypto_policy_enable_buffer(ciphers_list[i]);
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
|
||||||
|
rc = wolfSSL_crypto_policy_is_enabled();
|
||||||
|
ExpectIntEQ(rc, 1);
|
||||||
|
|
||||||
|
/* Security level and ciphers should match what is expected. */
|
||||||
|
rc = wolfSSL_crypto_policy_get_level();
|
||||||
|
ExpectIntEQ(rc, seclevel_list[i]);
|
||||||
|
|
||||||
|
ciphers = wolfSSL_crypto_policy_get_ciphers();
|
||||||
|
ExpectNotNull(ciphers);
|
||||||
|
|
||||||
|
if (ciphers != NULL) {
|
||||||
|
n_diff = XSTRNCMP(ciphers, ciphers_list[i], strlen(ciphers));
|
||||||
|
#ifdef DEBUG_WOLFSSL
|
||||||
|
if (n_diff) {
|
||||||
|
printf("error: got \n%s, expected \n%s\n",
|
||||||
|
ciphers, ciphers_list[i]);
|
||||||
|
}
|
||||||
|
#endif /* DEBUG_WOLFSSL */
|
||||||
|
ExpectIntEQ(n_diff, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
wolfSSL_crypto_policy_disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
wolfSSL_crypto_policy_disable();
|
||||||
|
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY && !NO_TLS */
|
||||||
|
return EXPECT_RESULT();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* System wide crypto-policy test: certs and keys.
|
||||||
|
*
|
||||||
|
* Loads three different policies (legacy, default, future),
|
||||||
|
* then tests loading different certificates and keys of
|
||||||
|
* varying strength.
|
||||||
|
* */
|
||||||
|
static int test_wolfSSL_crypto_policy_certs_and_keys(void)
|
||||||
|
{
|
||||||
|
EXPECT_DECLS;
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY) && !defined(NO_TLS)
|
||||||
|
int rc = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
|
||||||
|
const char * policy_list[] = {
|
||||||
|
"examples/crypto_policies/legacy/wolfssl.txt",
|
||||||
|
"examples/crypto_policies/default/wolfssl.txt",
|
||||||
|
"examples/crypto_policies/future/wolfssl.txt",
|
||||||
|
};
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < 3; ++i) {
|
||||||
|
WOLFSSL_CTX * ctx = NULL;
|
||||||
|
WOLFSSL * ssl = NULL;
|
||||||
|
int is_legacy = 0;
|
||||||
|
int is_future = 0;
|
||||||
|
/* certs */
|
||||||
|
const char * cert1024 = "certs/1024/client-cert.pem";
|
||||||
|
const char * cert2048 = "certs/client-cert.pem";
|
||||||
|
const char * cert3072 = "certs/3072/client-cert.pem";
|
||||||
|
const char * cert256 = "certs/client-ecc-cert.pem";
|
||||||
|
const char * cert384 = "certs/client-ecc384-cert.pem";
|
||||||
|
/* keys */
|
||||||
|
const char * key1024 = "certs/1024/client-key.pem";
|
||||||
|
const char * key2048 = "certs/client-key.pem";
|
||||||
|
const char * key3072 = "certs/3072/client-key.pem";
|
||||||
|
const char * key256 = "certs/ecc-key.pem";
|
||||||
|
const char * key384 = "certs/client-ecc384-key.pem";
|
||||||
|
|
||||||
|
is_legacy = (XSTRSTR(policy_list[i], "legacy") != NULL) ? 1 : 0;
|
||||||
|
is_future = (XSTRSTR(policy_list[i], "future") != NULL) ? 1 : 0;
|
||||||
|
|
||||||
|
/* Enable crypto policy. */
|
||||||
|
rc = wolfSSL_crypto_policy_enable(policy_list[i]);
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
|
||||||
|
rc = wolfSSL_crypto_policy_is_enabled();
|
||||||
|
ExpectIntEQ(rc, 1);
|
||||||
|
|
||||||
|
/* TLSv1_2_method should work for all policies. */
|
||||||
|
ctx = wolfSSL_CTX_new(wolfTLSv1_2_method());
|
||||||
|
ExpectNotNull(ctx);
|
||||||
|
|
||||||
|
/* Test certs of varying strength. */
|
||||||
|
if (ctx != NULL) {
|
||||||
|
/* VERIFY_PEER must be set for key/cert checks to be done. */
|
||||||
|
wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_PEER, NULL);
|
||||||
|
|
||||||
|
/* Test loading a cert with 1024 RSA key size.
|
||||||
|
* This should fail for all but legacy. */
|
||||||
|
rc = wolfSSL_CTX_use_certificate_chain_file(ctx, cert1024);
|
||||||
|
|
||||||
|
if (is_legacy) {
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Test loading a cert with 2048 RSA key size.
|
||||||
|
* Future crypto-policy is min 3072 RSA and DH key size,
|
||||||
|
* and should fail. */
|
||||||
|
rc = wolfSSL_CTX_use_certificate_chain_file(ctx, cert2048);
|
||||||
|
|
||||||
|
if (is_future) {
|
||||||
|
/* Future crypto-policy is min 3072 RSA and DH key size, this
|
||||||
|
* and should fail. */
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_FAILURE);
|
||||||
|
|
||||||
|
/* Set to VERIFY_NONE. This will disable key size checks,
|
||||||
|
* it should now succeed. */
|
||||||
|
wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_NONE, NULL);
|
||||||
|
rc = wolfSSL_CTX_use_certificate_chain_file(ctx, cert2048);
|
||||||
|
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
|
||||||
|
/* Set back to verify peer. */
|
||||||
|
wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_PEER, NULL);
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Test loading a CA cert with 3072 RSA key size.
|
||||||
|
* This should succeed for all policies. */
|
||||||
|
rc = wolfSSL_CTX_use_certificate_chain_file(ctx, cert3072);
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
|
||||||
|
/* Test loading an ecc cert with 256 key size.
|
||||||
|
* This should succeed for all policies. */
|
||||||
|
rc = wolfSSL_CTX_use_certificate_chain_file(ctx, cert256);
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
|
||||||
|
/* Test loading an ecc cert with 384 key size.
|
||||||
|
* This should succeed for all policies. */
|
||||||
|
rc = wolfSSL_CTX_use_certificate_chain_file(ctx, cert384);
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
|
||||||
|
/* cleanup */
|
||||||
|
wolfSSL_CTX_free(ctx);
|
||||||
|
ctx = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TLSv1_2_method should work for all policies. */
|
||||||
|
ctx = wolfSSL_CTX_new(wolfTLSv1_2_method());
|
||||||
|
ExpectNotNull(ctx);
|
||||||
|
|
||||||
|
/* Repeat same tests for keys of varying strength. */
|
||||||
|
if (ctx != NULL) {
|
||||||
|
/* 1024 RSA */
|
||||||
|
rc = SSL_CTX_use_PrivateKey_file(ctx, key1024,
|
||||||
|
SSL_FILETYPE_PEM);
|
||||||
|
|
||||||
|
if (is_legacy) {
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 2048 RSA */
|
||||||
|
rc = SSL_CTX_use_PrivateKey_file(ctx, key2048,
|
||||||
|
SSL_FILETYPE_PEM);
|
||||||
|
|
||||||
|
if (!is_future) {
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 3072 RSA */
|
||||||
|
rc = SSL_CTX_use_PrivateKey_file(ctx, key3072,
|
||||||
|
SSL_FILETYPE_PEM);
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
|
||||||
|
/* 256 ecc */
|
||||||
|
rc = SSL_CTX_use_PrivateKey_file(ctx, key256,
|
||||||
|
SSL_FILETYPE_PEM);
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
|
||||||
|
/* 384 ecc */
|
||||||
|
rc = SSL_CTX_use_PrivateKey_file(ctx, key384,
|
||||||
|
SSL_FILETYPE_PEM);
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
|
||||||
|
/* cleanup */
|
||||||
|
wolfSSL_CTX_free(ctx);
|
||||||
|
ctx = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_ECC
|
||||||
|
/* Test set ecc min key size. */
|
||||||
|
ctx = wolfSSL_CTX_new(wolfTLSv1_2_method());
|
||||||
|
ExpectNotNull(ctx);
|
||||||
|
|
||||||
|
if (ctx != NULL) {
|
||||||
|
ssl = SSL_new(ctx);
|
||||||
|
ExpectNotNull(ssl);
|
||||||
|
|
||||||
|
/* Test setting ctx. */
|
||||||
|
rc = wolfSSL_CTX_SetMinEccKey_Sz(ctx, 160);
|
||||||
|
if (is_legacy) {
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ExpectIntEQ(rc, CRYPTO_POLICY_FORBIDDEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = wolfSSL_CTX_SetMinEccKey_Sz(ctx, 224);
|
||||||
|
if (!is_future) {
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ExpectIntEQ(rc, CRYPTO_POLICY_FORBIDDEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = wolfSSL_CTX_SetMinEccKey_Sz(ctx, 256);
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
|
||||||
|
/* Test setting ssl. */
|
||||||
|
if (ssl != NULL) {
|
||||||
|
rc = wolfSSL_SetMinEccKey_Sz(ssl, 160);
|
||||||
|
if (is_legacy) {
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ExpectIntEQ(rc, CRYPTO_POLICY_FORBIDDEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = wolfSSL_SetMinEccKey_Sz(ssl, 224);
|
||||||
|
if (!is_future) {
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ExpectIntEQ(rc, CRYPTO_POLICY_FORBIDDEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = wolfSSL_SetMinEccKey_Sz(ssl, 256);
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
|
||||||
|
wolfSSL_free(ssl);
|
||||||
|
ssl = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* cleanup */
|
||||||
|
wolfSSL_CTX_free(ctx);
|
||||||
|
ctx = NULL;
|
||||||
|
}
|
||||||
|
#endif /* HAVE_ECC */
|
||||||
|
|
||||||
|
#if !defined(NO_RSA)
|
||||||
|
/* Test set rsa min key size. */
|
||||||
|
ctx = wolfSSL_CTX_new(wolfTLSv1_2_method());
|
||||||
|
ExpectNotNull(ctx);
|
||||||
|
|
||||||
|
if (ctx != NULL) {
|
||||||
|
ssl = SSL_new(ctx);
|
||||||
|
ExpectNotNull(ssl);
|
||||||
|
|
||||||
|
/* Test setting ctx. */
|
||||||
|
rc = wolfSSL_CTX_SetMinRsaKey_Sz(ctx, 1024);
|
||||||
|
if (is_legacy) {
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ExpectIntEQ(rc, CRYPTO_POLICY_FORBIDDEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = wolfSSL_CTX_SetMinRsaKey_Sz(ctx, 2048);
|
||||||
|
if (!is_future) {
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ExpectIntEQ(rc, CRYPTO_POLICY_FORBIDDEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = wolfSSL_CTX_SetMinRsaKey_Sz(ctx, 3072);
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
|
||||||
|
/* Test setting ssl. */
|
||||||
|
if (ssl != NULL) {
|
||||||
|
rc = wolfSSL_SetMinRsaKey_Sz(ssl, 1024);
|
||||||
|
if (is_legacy) {
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ExpectIntEQ(rc, CRYPTO_POLICY_FORBIDDEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = wolfSSL_SetMinRsaKey_Sz(ssl, 2048);
|
||||||
|
if (!is_future) {
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ExpectIntEQ(rc, CRYPTO_POLICY_FORBIDDEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = wolfSSL_SetMinRsaKey_Sz(ssl, 3072);
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
|
||||||
|
wolfSSL_free(ssl);
|
||||||
|
ssl = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* cleanup */
|
||||||
|
wolfSSL_CTX_free(ctx);
|
||||||
|
ctx = NULL;
|
||||||
|
}
|
||||||
|
#endif /* !NO_RSA */
|
||||||
|
|
||||||
|
wolfSSL_crypto_policy_disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
wolfSSL_crypto_policy_disable();
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY && !NO_TLS */
|
||||||
|
return EXPECT_RESULT();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* System wide crypto-policy test: tls and dtls methods.
|
||||||
|
* */
|
||||||
|
static int test_wolfSSL_crypto_policy_tls_methods(void)
|
||||||
|
{
|
||||||
|
EXPECT_DECLS;
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY) && !defined(NO_TLS)
|
||||||
|
int rc = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
|
||||||
|
const char * policy_list[] = {
|
||||||
|
"examples/crypto_policies/legacy/wolfssl.txt",
|
||||||
|
"examples/crypto_policies/default/wolfssl.txt",
|
||||||
|
"examples/crypto_policies/future/wolfssl.txt",
|
||||||
|
};
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < 3; ++i) {
|
||||||
|
WOLFSSL_CTX * ctx = NULL;
|
||||||
|
int is_legacy = 0;
|
||||||
|
|
||||||
|
is_legacy = (XSTRSTR(policy_list[i], "legacy") != NULL) ? 1 : 0;
|
||||||
|
|
||||||
|
/* Enable crypto policy. */
|
||||||
|
rc = wolfSSL_crypto_policy_enable(policy_list[i]);
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
|
||||||
|
rc = wolfSSL_crypto_policy_is_enabled();
|
||||||
|
ExpectIntEQ(rc, 1);
|
||||||
|
|
||||||
|
/* Try to use old TLS methods. Only allowed with legacy. */
|
||||||
|
#if !defined(NO_OLD_TLS)
|
||||||
|
ctx = wolfSSL_CTX_new(wolfTLSv1_1_method());
|
||||||
|
|
||||||
|
if (is_legacy) {
|
||||||
|
ExpectNotNull(ctx);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ExpectNull(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ctx != NULL) {
|
||||||
|
wolfSSL_CTX_free(ctx);
|
||||||
|
ctx = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_ALLOW_TLSV10)
|
||||||
|
ctx = wolfSSL_CTX_new(wolfTLSv1_method());
|
||||||
|
|
||||||
|
if (is_legacy) {
|
||||||
|
ExpectNotNull(ctx);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ExpectNull(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ctx != NULL) {
|
||||||
|
wolfSSL_CTX_free(ctx);
|
||||||
|
ctx = NULL;
|
||||||
|
}
|
||||||
|
#endif /* WOLFSSL_ALLOW_TLSV10 */
|
||||||
|
#else
|
||||||
|
(void) is_legacy;
|
||||||
|
#endif /* !NO_OLD_TLS */
|
||||||
|
|
||||||
|
/* TLSv1_2_method should work for all policies. */
|
||||||
|
ctx = wolfSSL_CTX_new(wolfTLSv1_2_method());
|
||||||
|
ExpectNotNull(ctx);
|
||||||
|
|
||||||
|
if (ctx != NULL) {
|
||||||
|
wolfSSL_CTX_free(ctx);
|
||||||
|
ctx = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx = wolfSSL_CTX_new(wolfTLSv1_3_method());
|
||||||
|
ExpectNotNull(ctx);
|
||||||
|
|
||||||
|
if (ctx != NULL) {
|
||||||
|
wolfSSL_CTX_free(ctx);
|
||||||
|
ctx = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx = wolfSSL_CTX_new(TLS_method());
|
||||||
|
ExpectNotNull(ctx);
|
||||||
|
|
||||||
|
if (ctx != NULL) {
|
||||||
|
wolfSSL_CTX_free(ctx);
|
||||||
|
ctx = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WOLFSSL_DTLS
|
||||||
|
ctx = wolfSSL_CTX_new(DTLS_method());
|
||||||
|
ExpectNotNull(ctx);
|
||||||
|
|
||||||
|
if (ctx != NULL) {
|
||||||
|
wolfSSL_CTX_free(ctx);
|
||||||
|
ctx = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx = wolfSSL_CTX_new(wolfDTLSv1_2_method());
|
||||||
|
ExpectNotNull(ctx);
|
||||||
|
|
||||||
|
if (ctx != NULL) {
|
||||||
|
wolfSSL_CTX_free(ctx);
|
||||||
|
ctx = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef NO_OLD_TLS
|
||||||
|
/* Only allowed with legacy. */
|
||||||
|
ctx = wolfSSL_CTX_new(wolfDTLSv1_method());
|
||||||
|
|
||||||
|
if (is_legacy) {
|
||||||
|
ExpectNotNull(ctx);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ExpectNull(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ctx != NULL) {
|
||||||
|
wolfSSL_CTX_free(ctx);
|
||||||
|
ctx = NULL;
|
||||||
|
}
|
||||||
|
#endif /* !NO_OLD_TLS */
|
||||||
|
#endif /* WOLFSSL_DTLS */
|
||||||
|
|
||||||
|
wolfSSL_crypto_policy_disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
wolfSSL_crypto_policy_disable();
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY && !NO_TLS */
|
||||||
|
return EXPECT_RESULT();
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY) && !defined(NO_TLS)
|
||||||
|
/* Helper function for test_wolfSSL_crypto_policy_ciphers.
|
||||||
|
* Searches ssl suites for cipher string.
|
||||||
|
*
|
||||||
|
* Returns 1 if found.
|
||||||
|
* Returns 0 if not found.
|
||||||
|
* Returns < 0 if error.
|
||||||
|
* */
|
||||||
|
static int crypto_policy_cipher_found(const WOLFSSL * ssl,
|
||||||
|
const char * cipher,
|
||||||
|
int match)
|
||||||
|
{
|
||||||
|
WOLF_STACK_OF(WOLFSSL_CIPHER) * sk = NULL;
|
||||||
|
WOLFSSL_CIPHER * current = NULL;
|
||||||
|
const char * suite;
|
||||||
|
int found = 0;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
if (ssl == NULL || cipher == NULL || *cipher == '\0') {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sk = wolfSSL_get_ciphers_compat(ssl);
|
||||||
|
|
||||||
|
if (sk == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
current = wolfSSL_sk_SSL_CIPHER_value(sk, i++);
|
||||||
|
if (current) {
|
||||||
|
suite = wolfSSL_CIPHER_get_name(current);
|
||||||
|
if (suite) {
|
||||||
|
if (match == 1) {
|
||||||
|
/* prefix match */
|
||||||
|
if (XSTRNCMP(suite, cipher, XSTRLEN(cipher)) == 0) {
|
||||||
|
found = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (match == -1) {
|
||||||
|
/* postfix match */
|
||||||
|
if (XSTRLEN(suite) > XSTRLEN(cipher)) {
|
||||||
|
const char * postfix = suite + XSTRLEN(suite)
|
||||||
|
- XSTRLEN(cipher);
|
||||||
|
if (XSTRNCMP(postfix, cipher, XSTRLEN(cipher)) == 0) {
|
||||||
|
found = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* needle in haystack match */
|
||||||
|
if (XSTRSTR(suite, cipher)) {
|
||||||
|
found = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (current);
|
||||||
|
|
||||||
|
return found == 1;
|
||||||
|
}
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY && !NO_TLS */
|
||||||
|
|
||||||
|
/* System wide crypto-policy test: ciphers.
|
||||||
|
* */
|
||||||
|
static int test_wolfSSL_crypto_policy_ciphers(void)
|
||||||
|
{
|
||||||
|
EXPECT_DECLS;
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY) && !defined(NO_TLS)
|
||||||
|
int rc = WC_NO_ERR_TRACE(WOLFSSL_FAILURE);
|
||||||
|
const char * policy_list[] = {
|
||||||
|
"examples/crypto_policies/legacy/wolfssl.txt",
|
||||||
|
"examples/crypto_policies/default/wolfssl.txt",
|
||||||
|
"examples/crypto_policies/future/wolfssl.txt",
|
||||||
|
};
|
||||||
|
int seclevel_list[] = { 1, 2, 3 };
|
||||||
|
int i = 0;
|
||||||
|
int is_legacy = 0;
|
||||||
|
int is_future = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < 3; ++i) {
|
||||||
|
WOLFSSL_CTX * ctx = NULL;
|
||||||
|
WOLFSSL * ssl = NULL;
|
||||||
|
int found = 0;
|
||||||
|
|
||||||
|
is_legacy = (XSTRSTR(policy_list[i], "legacy") != NULL) ? 1 : 0;
|
||||||
|
is_future = (XSTRSTR(policy_list[i], "future") != NULL) ? 1 : 0;
|
||||||
|
|
||||||
|
(void) is_legacy;
|
||||||
|
|
||||||
|
/* Enable crypto policy. */
|
||||||
|
rc = wolfSSL_crypto_policy_enable(policy_list[i]);
|
||||||
|
ExpectIntEQ(rc, WOLFSSL_SUCCESS);
|
||||||
|
|
||||||
|
rc = wolfSSL_crypto_policy_is_enabled();
|
||||||
|
ExpectIntEQ(rc, 1);
|
||||||
|
|
||||||
|
ctx = wolfSSL_CTX_new(TLS_method());
|
||||||
|
ExpectNotNull(ctx);
|
||||||
|
|
||||||
|
ssl = SSL_new(ctx);
|
||||||
|
ExpectNotNull(ssl);
|
||||||
|
|
||||||
|
rc = wolfSSL_CTX_get_security_level(ctx);
|
||||||
|
ExpectIntEQ(rc, seclevel_list[i]);
|
||||||
|
|
||||||
|
rc = wolfSSL_get_security_level(ssl);
|
||||||
|
ExpectIntEQ(rc, seclevel_list[i]);
|
||||||
|
|
||||||
|
found = crypto_policy_cipher_found(ssl, "RC4", 0);
|
||||||
|
ExpectIntEQ(found, is_legacy);
|
||||||
|
|
||||||
|
/* We return a different cipher string depending on build settings. */
|
||||||
|
#if !defined(WOLFSSL_CIPHER_INTERNALNAME) && \
|
||||||
|
!defined(NO_ERROR_STRINGS) && !defined(WOLFSSL_QT)
|
||||||
|
found = crypto_policy_cipher_found(ssl, "AES_128", 0);
|
||||||
|
ExpectIntEQ(found, !is_future);
|
||||||
|
|
||||||
|
found = crypto_policy_cipher_found(ssl, "TLS_DHE_RSA_WITH_AES", 1);
|
||||||
|
ExpectIntEQ(found, !is_future);
|
||||||
|
|
||||||
|
found = crypto_policy_cipher_found(ssl, "_SHA", -1);
|
||||||
|
ExpectIntEQ(found, !is_future);
|
||||||
|
#else
|
||||||
|
found = crypto_policy_cipher_found(ssl, "AES128", 0);
|
||||||
|
ExpectIntEQ(found, !is_future);
|
||||||
|
|
||||||
|
found = crypto_policy_cipher_found(ssl, "DHE-RSA-AES", 1);
|
||||||
|
ExpectIntEQ(found, !is_future);
|
||||||
|
|
||||||
|
found = crypto_policy_cipher_found(ssl, "-SHA", -1);
|
||||||
|
ExpectIntEQ(found, !is_future);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (ssl != NULL) {
|
||||||
|
SSL_free(ssl);
|
||||||
|
ssl = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ctx != NULL) {
|
||||||
|
wolfSSL_CTX_free(ctx);
|
||||||
|
ctx = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wolfSSL_crypto_policy_disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
wolfSSL_crypto_policy_disable();
|
||||||
|
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY && !NO_TLS */
|
||||||
|
return EXPECT_RESULT();
|
||||||
|
}
|
||||||
|
|
||||||
static int test_wolfSSL_SSL_in_init(void)
|
static int test_wolfSSL_SSL_in_init(void)
|
||||||
{
|
{
|
||||||
EXPECT_DECLS;
|
EXPECT_DECLS;
|
||||||
@ -101317,6 +102018,10 @@ TEST_CASE testCases[] = {
|
|||||||
#endif
|
#endif
|
||||||
TEST_DECL(test_wolfSSL_CTX_get_min_proto_version),
|
TEST_DECL(test_wolfSSL_CTX_get_min_proto_version),
|
||||||
TEST_DECL(test_wolfSSL_security_level),
|
TEST_DECL(test_wolfSSL_security_level),
|
||||||
|
TEST_DECL(test_wolfSSL_crypto_policy),
|
||||||
|
TEST_DECL(test_wolfSSL_crypto_policy_certs_and_keys),
|
||||||
|
TEST_DECL(test_wolfSSL_crypto_policy_tls_methods),
|
||||||
|
TEST_DECL(test_wolfSSL_crypto_policy_ciphers),
|
||||||
TEST_DECL(test_wolfSSL_SSL_in_init),
|
TEST_DECL(test_wolfSSL_SSL_in_init),
|
||||||
TEST_DECL(test_wolfSSL_CTX_set_timeout),
|
TEST_DECL(test_wolfSSL_CTX_set_timeout),
|
||||||
TEST_DECL(test_wolfSSL_set_psk_use_session_callback),
|
TEST_DECL(test_wolfSSL_set_psk_use_session_callback),
|
||||||
|
@ -221,6 +221,7 @@ enum wolfSSL_ErrorCodes {
|
|||||||
HRR_COOKIE_ERROR = -505, /* HRR msg cookie mismatch */
|
HRR_COOKIE_ERROR = -505, /* HRR msg cookie mismatch */
|
||||||
UNSUPPORTED_CERTIFICATE = -506, /* unsupported certificate type */
|
UNSUPPORTED_CERTIFICATE = -506, /* unsupported certificate type */
|
||||||
|
|
||||||
|
/* PEM and EVP errors */
|
||||||
WOLFSSL_PEM_R_NO_START_LINE_E = -507,
|
WOLFSSL_PEM_R_NO_START_LINE_E = -507,
|
||||||
WOLFSSL_PEM_R_PROBLEMS_GETTING_PASSWORD_E = -508,
|
WOLFSSL_PEM_R_PROBLEMS_GETTING_PASSWORD_E = -508,
|
||||||
WOLFSSL_PEM_R_BAD_PASSWORD_READ_E = -509,
|
WOLFSSL_PEM_R_BAD_PASSWORD_READ_E = -509,
|
||||||
@ -232,7 +233,10 @@ enum wolfSSL_ErrorCodes {
|
|||||||
WOLFSSL_EVP_R_DECODE_ERROR = -514,
|
WOLFSSL_EVP_R_DECODE_ERROR = -514,
|
||||||
WOLFSSL_EVP_R_PRIVATE_KEY_DECODE_ERROR = -515,
|
WOLFSSL_EVP_R_PRIVATE_KEY_DECODE_ERROR = -515,
|
||||||
|
|
||||||
WOLFSSL_LAST_E = -515
|
CRYPTO_POLICY_FORBIDDEN = -516, /* operation forbidden by system
|
||||||
|
* crypto-policy */
|
||||||
|
|
||||||
|
WOLFSSL_LAST_E = -516
|
||||||
|
|
||||||
/* codes -1000 to -1999 are reserved for wolfCrypt. */
|
/* codes -1000 to -1999 are reserved for wolfCrypt. */
|
||||||
};
|
};
|
||||||
|
@ -1852,6 +1852,12 @@ enum Misc {
|
|||||||
#ifndef MAX_WOLFSSL_FILE_SIZE
|
#ifndef MAX_WOLFSSL_FILE_SIZE
|
||||||
MAX_WOLFSSL_FILE_SIZE = 1024UL * 1024UL * 4, /* 4 mb file size alloc limit */
|
MAX_WOLFSSL_FILE_SIZE = 1024UL * 1024UL * 4, /* 4 mb file size alloc limit */
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
MAX_WOLFSSL_CRYPTO_POLICY_SIZE = 1024UL, /* Crypto-policy file is one line.
|
||||||
|
* It should not be large. */
|
||||||
|
MIN_WOLFSSL_SEC_LEVEL = 0,
|
||||||
|
MAX_WOLFSSL_SEC_LEVEL = 5,
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
|
||||||
CERT_MIN_SIZE = 256, /* min PEM cert size with header/footer */
|
CERT_MIN_SIZE = 256, /* min PEM cert size with header/footer */
|
||||||
|
|
||||||
@ -2409,16 +2415,16 @@ typedef struct CipherSuite {
|
|||||||
|
|
||||||
/* use wolfSSL_API visibility to be able to test in tests/api.c */
|
/* use wolfSSL_API visibility to be able to test in tests/api.c */
|
||||||
WOLFSSL_API void InitSuitesHashSigAlgo(byte* hashSigAlgo, int have,
|
WOLFSSL_API void InitSuitesHashSigAlgo(byte* hashSigAlgo, int have,
|
||||||
int tls1_2, int keySz,
|
int tls1_2, int keySz, word16* len);
|
||||||
word16* len);
|
|
||||||
WOLFSSL_LOCAL int AllocateCtxSuites(WOLFSSL_CTX* ctx);
|
WOLFSSL_LOCAL int AllocateCtxSuites(WOLFSSL_CTX* ctx);
|
||||||
WOLFSSL_LOCAL int AllocateSuites(WOLFSSL* ssl);
|
WOLFSSL_LOCAL int AllocateSuites(WOLFSSL* ssl);
|
||||||
WOLFSSL_LOCAL void InitSuites(Suites* suites, ProtocolVersion pv, int keySz,
|
WOLFSSL_LOCAL void InitSuites(Suites* suites, ProtocolVersion pv, int keySz,
|
||||||
word16 haveRSA, word16 havePSK, word16 haveDH,
|
word16 haveRSA, word16 havePSK, word16 haveDH,
|
||||||
word16 haveECDSAsig, word16 haveECC,
|
word16 haveECDSAsig, word16 haveECC,
|
||||||
word16 haveStaticRSA, word16 haveStaticECC,
|
word16 haveStaticRSA, word16 haveStaticECC,
|
||||||
word16 haveFalconSig, word16 haveDilithiumSig,
|
word16 haveAnon, word16 haveNull,
|
||||||
word16 haveAnon, word16 haveNull, int side);
|
word16 haveAES128, word16 haveSHA1,
|
||||||
|
word16 haveRC4, int side);
|
||||||
|
|
||||||
typedef struct TLSX TLSX;
|
typedef struct TLSX TLSX;
|
||||||
WOLFSSL_LOCAL int MatchSuite_ex(const WOLFSSL* ssl, Suites* peerSuites,
|
WOLFSSL_LOCAL int MatchSuite_ex(const WOLFSSL* ssl, Suites* peerSuites,
|
||||||
@ -4177,6 +4183,9 @@ struct WOLFSSL_CTX {
|
|||||||
byte *sigSpec;
|
byte *sigSpec;
|
||||||
word16 sigSpecSz;
|
word16 sigSpecSz;
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
int secLevel; /* The security level of system-wide crypto policy. */
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
};
|
};
|
||||||
|
|
||||||
WOLFSSL_LOCAL
|
WOLFSSL_LOCAL
|
||||||
@ -6257,8 +6266,20 @@ struct WOLFSSL {
|
|||||||
byte *peerSigSpec; /* This pointer always owns the memory. */
|
byte *peerSigSpec; /* This pointer always owns the memory. */
|
||||||
word16 peerSigSpecSz;
|
word16 peerSigSpecSz;
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
int secLevel; /* The security level of system-wide crypto policy. */
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
#define WOLFSSL_SECLEVEL_STR "@SECLEVEL="
|
||||||
|
struct SystemCryptoPolicy {
|
||||||
|
int enabled;
|
||||||
|
int secLevel;
|
||||||
|
char str[MAX_WOLFSSL_CRYPTO_POLICY_SIZE + 1]; /* + 1 for null term */
|
||||||
|
};
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* wolfSSL_PEM_read_bio_X509 pushes an ASN_NO_PEM_HEADER error
|
* wolfSSL_PEM_read_bio_X509 pushes an ASN_NO_PEM_HEADER error
|
||||||
* to the error queue on file end. This should not be left
|
* to the error queue on file end. This should not be left
|
||||||
|
@ -3202,6 +3202,24 @@ WOLFSSL_ABI WOLFSSL_API int wolfSSL_Init(void);
|
|||||||
/* call when done to cleanup/free session cache mutex / resources */
|
/* call when done to cleanup/free session cache mutex / resources */
|
||||||
WOLFSSL_ABI WOLFSSL_API int wolfSSL_Cleanup(void);
|
WOLFSSL_ABI WOLFSSL_API int wolfSSL_Cleanup(void);
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
#ifndef NO_FILESYSTEM
|
||||||
|
WOLFSSL_API int wolfSSL_crypto_policy_enable(const char * policy);
|
||||||
|
#endif /* ! NO_FILESYSTEM */
|
||||||
|
WOLFSSL_API int wolfSSL_crypto_policy_enable_buffer(const char * buf);
|
||||||
|
WOLFSSL_API void wolfSSL_crypto_policy_disable(void);
|
||||||
|
WOLFSSL_API int wolfSSL_crypto_policy_is_enabled(void);
|
||||||
|
WOLFSSL_API const char * wolfSSL_crypto_policy_get_ciphers(void);
|
||||||
|
WOLFSSL_API int wolfSSL_crypto_policy_get_level(void);
|
||||||
|
WOLFSSL_LOCAL int wolfSSL_crypto_policy_init_ctx(WOLFSSL_CTX * ctx,
|
||||||
|
WOLFSSL_METHOD * method);
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
/* compat functions. */
|
||||||
|
WOLFSSL_API int wolfSSL_get_security_level(const WOLFSSL * ssl);
|
||||||
|
#ifndef NO_WOLFSSL_STUB
|
||||||
|
WOLFSSL_API void wolfSSL_set_security_level(WOLFSSL * ssl, int level);
|
||||||
|
#endif /* !NO_WOLFSSL_STUB */
|
||||||
|
|
||||||
/* which library version do we have */
|
/* which library version do we have */
|
||||||
WOLFSSL_API const char* wolfSSL_lib_version(void);
|
WOLFSSL_API const char* wolfSSL_lib_version(void);
|
||||||
#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
|
#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
|
||||||
@ -5807,7 +5825,6 @@ WOLFSSL_API int wolfSSL_EVP_PKEY_param_check(WOLFSSL_EVP_PKEY_CTX* ctx);
|
|||||||
#endif
|
#endif
|
||||||
WOLFSSL_API void wolfSSL_CTX_set_security_level(WOLFSSL_CTX* ctx, int level);
|
WOLFSSL_API void wolfSSL_CTX_set_security_level(WOLFSSL_CTX* ctx, int level);
|
||||||
WOLFSSL_API int wolfSSL_CTX_get_security_level(const WOLFSSL_CTX* ctx);
|
WOLFSSL_API int wolfSSL_CTX_get_security_level(const WOLFSSL_CTX* ctx);
|
||||||
|
|
||||||
WOLFSSL_API int wolfSSL_SESSION_is_resumable(const WOLFSSL_SESSION *s);
|
WOLFSSL_API int wolfSSL_SESSION_is_resumable(const WOLFSSL_SESSION *s);
|
||||||
|
|
||||||
WOLFSSL_API void wolfSSL_CRYPTO_free(void *str, const char *file, int line);
|
WOLFSSL_API void wolfSSL_CRYPTO_free(void *str, const char *file, int line);
|
||||||
|
@ -4333,6 +4333,16 @@ extern void uITRON4_free(void *p) ;
|
|||||||
#error "Please disable DSA if disabling SHA-1"
|
#error "Please disable DSA if disabling SHA-1"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_SYS_CRYPTO_POLICY)
|
||||||
|
#if !defined(WOLFSSL_CRYPTO_POLICY_FILE)
|
||||||
|
#error "WOLFSSL_SYS_CRYPTO_POLICY requires a crypto policy file"
|
||||||
|
#endif /* ! WOLFSSL_CRYPTO_POLICY_FILE */
|
||||||
|
|
||||||
|
#if !defined(OPENSSL_EXTRA)
|
||||||
|
#error "WOLFSSL_SYS_CRYPTO_POLICY requires OPENSSL_EXTRA"
|
||||||
|
#endif /* ! OPENSSL_EXTRA */
|
||||||
|
#endif /* WOLFSSL_SYS_CRYPTO_POLICY */
|
||||||
|
|
||||||
/* if configure.ac turned on this feature, HAVE_ENTROPY_MEMUSE will be set,
|
/* if configure.ac turned on this feature, HAVE_ENTROPY_MEMUSE will be set,
|
||||||
* also define HAVE_WOLFENTROPY */
|
* also define HAVE_WOLFENTROPY */
|
||||||
#ifdef HAVE_ENTROPY_MEMUSE
|
#ifdef HAVE_ENTROPY_MEMUSE
|
||||||
|
Reference in New Issue
Block a user