@item Key exchange:
RSA, DHE-RSA, DHE-DSS, SRP, SRP-RSA, SRP-DSS,
-PSK, DHE-PSK, ANON-DH, RSA-EXPORT. The
-key exchange methods do not have a catch all.
+PSK, DHE-PSK, ECDHE-RSA, ANON-ECDH, ANON-DH, RSA-EXPORT. The
+Catch all name is KX-ALL which will add all the algorithms from NORMAL
+priority.
@item MAC:
MD5, SHA1, SHA256, AEAD (used with
SIGN-DSA-SHA224, SIGN-DSA-SHA256, SIGN-RSA-MD5. Catch all
is SIGN-ALL. This is only valid for TLS 1.2 and later.
+@item Elliptic curves:
+CURVE-SECP224R1, CURVE-SECP256R1, CURVE-SECP384R1, CURVE-SECP521R1. Catch all is CURVE-ALL.
+
@end table
{
gnutls_mac_algorithm_t ret = GNUTLS_MAC_UNKNOWN;
- GNUTLS_HASH_LOOP (if (strcasecmp (p->name, name) == 0) ret = p->id);
+ GNUTLS_HASH_LOOP (
+ if (strcasecmp (p->name, name) == 0)
+ {
+ ret = p->id;
+ break;
+ }
+ );
return ret;
}
{
gnutls_cipher_algorithm_t ret = GNUTLS_CIPHER_UNKNOWN;
- GNUTLS_CIPHER_LOOP (if (strcasecmp (p->name, name) == 0) ret = p->id);
+ GNUTLS_CIPHER_LOOP (
+ if (strcasecmp (p->name, name) == 0)
+ {
+ ret = p->id;
+ break;
+ }
+ );
return ret;
}
{
gnutls_cipher_algorithm_t ret = GNUTLS_KX_UNKNOWN;
- GNUTLS_KX_LOOP (if (strcasecmp (p->name, name) == 0) ret = p->algorithm);
+ GNUTLS_KX_LOOP (
+ if (strcasecmp (p->name, name) == 0)
+ {
+ ret = p->algorithm;
+ break;
+ }
+ );
return ret;
}
{
gnutls_protocol_t ret = GNUTLS_VERSION_UNKNOWN;
- GNUTLS_VERSION_LOOP (if (strcasecmp (p->name, name) == 0) ret = p->id);
+ GNUTLS_VERSION_LOOP (
+ if (strcasecmp (p->name, name) == 0)
+ {
+ ret = p->id;
+ break;
+ }
+ );
return ret;
}
{
gnutls_sign_algorithm_t ret = GNUTLS_SIGN_UNKNOWN;
- GNUTLS_SIGN_LOOP (if (strcasecmp (p->name, name) == 0) ret = p->id);
+ GNUTLS_SIGN_LOOP (
+ if (strcasecmp (p->name, name) == 0)
+ {
+ ret = p->id;
+ break;
+ }
+ );
return ret;
#define GNUTLS_ECC_CURVE_LOOP(b) \
{ const gnutls_ecc_curve_entry_st *p; \
for(p = ecc_curves; p->name != NULL; p++) { b ; } }
+/*-
+ * _gnutls_ecc_curve_get_id:
+ * @name: is a MAC algorithm name
+ *
+ * The names are compared in a case insensitive way.
+ *
+ * Returns: return a #ecc_curve_t value corresponding to
+ * the specified cipher, or %GNUTLS_ECC_CURVE_INVALID on error.
+ -*/
+ecc_curve_t
+_gnutls_ecc_curve_get_id (const char *name)
+{
+ ecc_curve_t ret = GNUTLS_ECC_CURVE_INVALID;
+
+ GNUTLS_ECC_CURVE_LOOP (
+ if (strcasecmp (p->name, name) == 0)
+ {
+ ret = p->id;
+ break;
+ }
+ );
+
+ return ret;
+}
/*-
* _gnutls_ecc_curve_get_name:
{
GNUTLS_SEC_PARAM_LOOP (if (p->sec_param == param)
{
- ret = p->dsa_bits; break;}
+ ret = p->dsa_bits; break;
+ }
);
return ret;
}
GNUTLS_SEC_PARAM_LOOP (if (p->sec_param == param)
{
- ret = p->pk_bits; break;}
+ ret = p->pk_bits; break;
+ }
);
return ret;
GNUTLS_SEC_PARAM_LOOP (if (p->pk_bits >= pk_bits)
{
- ret = p->subgroup_bits; break;}
+ ret = p->subgroup_bits; break;
+ }
);
return ret;
GNUTLS_SEC_PARAM_LOOP (if (p->sec_param == param)
{
- ret = p->name; break;}
+ ret = p->name; break;
+ }
);
return ret;
GNUTLS_SEC_PARAM_LOOP (if (p->pk_bits > bits)
{
- break;}
+ break;
+ }
ret = p->sec_param;);
return ret;
#endif
}
-static const int supported_ecc_default[] = {
+static const int supported_ecc_normal[] = {
+ GNUTLS_ECC_CURVE_SECP224R1,
GNUTLS_ECC_CURVE_SECP256R1,
GNUTLS_ECC_CURVE_SECP384R1,
GNUTLS_ECC_CURVE_SECP521R1,
0
};
+static const int supported_ecc_secure128[] = {
+ GNUTLS_ECC_CURVE_SECP256R1,
+ GNUTLS_ECC_CURVE_SECP384R1,
+ GNUTLS_ECC_CURVE_SECP521R1,
+ 0
+};
+
+static const int supported_ecc_secure256[] = {
+ GNUTLS_ECC_CURVE_SECP521R1,
+ 0
+};
+
static const int protocol_priority[] = {
GNUTLS_TLS1_2,
GNUTLS_TLS1_1,
*
* "NONE:+VERS-TLS-ALL:+AES-128-CBC:+RSA:+SHA1:+COMP-NULL:+SIGN-RSA-SHA1",
*
+ * "NONE:+VERS-TLS-ALL:+AES-128-CBC:+ECDHE-RSA:+SHA1:+COMP-NULL:+SIGN-RSA-SHA1:+CURVE-SECP256R1",
+ *
* "NORMAL:%COMPAT" is the most compatible mode.
*
* Returns: On syntax error %GNUTLS_E_INVALID_REQUEST is returned,
_set_priority (&(*priority_cache)->compression, comp_priority);
_set_priority (&(*priority_cache)->cert_type, cert_type_priority);
_set_priority (&(*priority_cache)->sign_algo, sign_priority_default);
- _set_priority (&(*priority_cache)->supported_ecc, supported_ecc_default);
+ _set_priority (&(*priority_cache)->supported_ecc, supported_ecc_normal);
i = 0;
}
else
{
- _set_priority (&(*priority_cache)->supported_ecc, supported_ecc_default);
i = 1;
}
_set_priority (&(*priority_cache)->mac, mac_priority_normal);
_set_priority (&(*priority_cache)->sign_algo,
sign_priority_default);
+ _set_priority (&(*priority_cache)->supported_ecc, supported_ecc_normal);
}
else if (strcasecmp (broken_list[i], "NORMAL") == 0)
{
_set_priority (&(*priority_cache)->mac, mac_priority_normal);
_set_priority (&(*priority_cache)->sign_algo,
sign_priority_default);
+ _set_priority (&(*priority_cache)->supported_ecc, supported_ecc_normal);
}
else if (strcasecmp (broken_list[i], "SECURE256") == 0
|| strcasecmp (broken_list[i], "SECURE") == 0)
_set_priority (&(*priority_cache)->mac, mac_priority_secure);
_set_priority (&(*priority_cache)->sign_algo,
sign_priority_secure256);
+ _set_priority (&(*priority_cache)->supported_ecc, supported_ecc_secure256);
}
else if (strcasecmp (broken_list[i], "SECURE128") == 0)
{
_set_priority (&(*priority_cache)->mac, mac_priority_secure);
_set_priority (&(*priority_cache)->sign_algo,
sign_priority_secure128);
+ _set_priority (&(*priority_cache)->supported_ecc, supported_ecc_secure128);
}
else if (strcasecmp (broken_list[i], "EXPORT") == 0)
{
_set_priority (&(*priority_cache)->mac, mac_priority_secure);
_set_priority (&(*priority_cache)->sign_algo,
sign_priority_default);
+ _set_priority (&(*priority_cache)->supported_ecc, supported_ecc_normal);
} /* now check if the element is something like -ALGO */
else if (broken_list[i][0] == '!' || broken_list[i][0] == '+'
|| broken_list[i][0] == '-')
goto error;
}
} /* now check if the element is something like -ALGO */
+ else if (strncasecmp (&broken_list[i][1], "CURVE-", 6) == 0)
+ {
+ if (strncasecmp (&broken_list[i][1], "CURVE-ALL", 9) == 0)
+ {
+ bulk_fn (&(*priority_cache)->supported_ecc,
+ supported_ecc_normal);
+ }
+ else
+ {
+ if ((algo =
+ _gnutls_ecc_curve_get_id (&broken_list[i][7])) !=
+ GNUTLS_ECC_CURVE_INVALID)
+ fn (&(*priority_cache)->supported_ecc, algo);
+ else
+ goto error;
+ }
+ } /* now check if the element is something like -ALGO */
else if (strncasecmp (&broken_list[i][1], "CTYPE-", 6) == 0)
{
if (strncasecmp (&broken_list[i][1], "CTYPE-ALL", 9) == 0)
bulk_fn (&(*priority_cache)->mac,
mac_priority_secure);
}
- else if (strncasecmp (&broken_list[i][1], "CIPHER-ALL", 7) == 0)
+ else if (strncasecmp (&broken_list[i][1], "CIPHER-ALL", 10) == 0)
{
bulk_fn (&(*priority_cache)->cipher,
cipher_priority_normal);
}
+ else if (strncasecmp (&broken_list[i][1], "KX-ALL", 6) == 0)
+ {
+ bulk_fn (&(*priority_cache)->kx,
+ kx_priority_secure);
+ }
else
goto error;
}