Add cipher query functions
Add functions to determine authentication, key-exchange, FIPS and AEAD. Reviewed-by: Emilia Käsper <emilia@openssl.org> Reviewed-by: Rich Salz <rsalz@openssl.org>
This commit is contained in:
3
CHANGES
3
CHANGES
@@ -8,6 +8,9 @@
|
||||
callback, such that updates to the SSL_CTX affect ALPN.
|
||||
[Todd Short]
|
||||
|
||||
*) Add SSL_CIPHER queries for authentication and key-exchange.
|
||||
[Todd Short]
|
||||
|
||||
*) Changes to the DEFAULT cipherlist:
|
||||
- Prefer (EC)DHE handshakes over plain RSA.
|
||||
- Prefer AEAD ciphers over legacy ciphers.
|
||||
|
||||
@@ -60,9 +60,9 @@
|
||||
* [including the GNU Public Licence.]
|
||||
*/
|
||||
|
||||
#define NUM_NID 1037
|
||||
#define NUM_SN 1030
|
||||
#define NUM_LN 1030
|
||||
#define NUM_NID 1054
|
||||
#define NUM_SN 1047
|
||||
#define NUM_LN 1047
|
||||
#define NUM_OBJ 951
|
||||
|
||||
static const unsigned char lvalues[6722]={
|
||||
@@ -2705,6 +2705,23 @@ static const ASN1_OBJECT nid_objs[NUM_NID]={
|
||||
{"X25519","X25519",NID_X25519,9,&(lvalues[6703]),0},
|
||||
{"X448","X448",NID_X448,9,&(lvalues[6712]),0},
|
||||
{"HKDF","hkdf",NID_hkdf,0,NULL,0},
|
||||
{"KxRSA","kx-rsa",NID_kx_rsa,0,NULL,0},
|
||||
{"KxECDHE","kx-ecdhe",NID_kx_ecdhe,0,NULL,0},
|
||||
{"KxDHE","kx-dhe",NID_kx_dhe,0,NULL,0},
|
||||
{"KxECDHE-PSK","kx-ecdhe-psk",NID_kx_ecdhe_psk,0,NULL,0},
|
||||
{"KxDHE-PSK","kx-dhe-psk",NID_kx_dhe_psk,0,NULL,0},
|
||||
{"KxRSA_PSK","kx-rsa-psk",NID_kx_rsa_psk,0,NULL,0},
|
||||
{"KxPSK","kx-psk",NID_kx_psk,0,NULL,0},
|
||||
{"KxSRP","kx-srp",NID_kx_srp,0,NULL,0},
|
||||
{"KxGOST","kx-gost",NID_kx_gost,0,NULL,0},
|
||||
{"AuthRSA","auth-rsa",NID_auth_rsa,0,NULL,0},
|
||||
{"AuthECDSA","auth-ecdsa",NID_auth_ecdsa,0,NULL,0},
|
||||
{"AuthPSK","auth-psk",NID_auth_psk,0,NULL,0},
|
||||
{"AuthDSS","auth-dss",NID_auth_dss,0,NULL,0},
|
||||
{"AuthGOST01","auth-gost01",NID_auth_gost01,0,NULL,0},
|
||||
{"AuthGOST12","auth-gost12",NID_auth_gost12,0,NULL,0},
|
||||
{"AuthSRP","auth-srp",NID_auth_srp,0,NULL,0},
|
||||
{"AuthNULL","auth-null",NID_auth_null,0,NULL,0},
|
||||
};
|
||||
|
||||
static const unsigned int sn_objs[NUM_SN]={
|
||||
@@ -2741,6 +2758,14 @@ static const unsigned int sn_objs[NUM_SN]={
|
||||
960, /* "AES-256-OCB" */
|
||||
428, /* "AES-256-OFB" */
|
||||
914, /* "AES-256-XTS" */
|
||||
1049, /* "AuthDSS" */
|
||||
1047, /* "AuthECDSA" */
|
||||
1050, /* "AuthGOST01" */
|
||||
1051, /* "AuthGOST12" */
|
||||
1053, /* "AuthNULL" */
|
||||
1048, /* "AuthPSK" */
|
||||
1046, /* "AuthRSA" */
|
||||
1052, /* "AuthSRP" */
|
||||
91, /* "BF-CBC" */
|
||||
93, /* "BF-CFB" */
|
||||
92, /* "BF-ECB" */
|
||||
@@ -2829,6 +2854,15 @@ static const unsigned int sn_objs[NUM_SN]={
|
||||
645, /* "ITU-T" */
|
||||
646, /* "JOINT-ISO-ITU-T" */
|
||||
773, /* "KISA" */
|
||||
1039, /* "KxDHE" */
|
||||
1041, /* "KxDHE-PSK" */
|
||||
1038, /* "KxECDHE" */
|
||||
1040, /* "KxECDHE-PSK" */
|
||||
1045, /* "KxGOST" */
|
||||
1043, /* "KxPSK" */
|
||||
1037, /* "KxRSA" */
|
||||
1042, /* "KxRSA_PSK" */
|
||||
1044, /* "KxSRP" */
|
||||
15, /* "L" */
|
||||
856, /* "LocalKeySet" */
|
||||
3, /* "MD2" */
|
||||
@@ -3961,6 +3995,14 @@ static const unsigned int ln_objs[NUM_LN]={
|
||||
484, /* "associatedDomain" */
|
||||
485, /* "associatedName" */
|
||||
501, /* "audio" */
|
||||
1049, /* "auth-dss" */
|
||||
1047, /* "auth-ecdsa" */
|
||||
1050, /* "auth-gost01" */
|
||||
1051, /* "auth-gost12" */
|
||||
1053, /* "auth-null" */
|
||||
1048, /* "auth-psk" */
|
||||
1046, /* "auth-rsa" */
|
||||
1052, /* "auth-srp" */
|
||||
882, /* "authorityRevocationList" */
|
||||
91, /* "bf-cbc" */
|
||||
93, /* "bf-cfb" */
|
||||
@@ -4421,6 +4463,15 @@ static const unsigned int ln_objs[NUM_LN]={
|
||||
956, /* "jurisdictionStateOrProvinceName" */
|
||||
150, /* "keyBag" */
|
||||
773, /* "kisa" */
|
||||
1039, /* "kx-dhe" */
|
||||
1041, /* "kx-dhe-psk" */
|
||||
1038, /* "kx-ecdhe" */
|
||||
1040, /* "kx-ecdhe-psk" */
|
||||
1045, /* "kx-gost" */
|
||||
1043, /* "kx-psk" */
|
||||
1037, /* "kx-rsa" */
|
||||
1042, /* "kx-rsa-psk" */
|
||||
1044, /* "kx-srp" */
|
||||
477, /* "lastModifiedBy" */
|
||||
476, /* "lastModifiedTime" */
|
||||
157, /* "localKeyID" */
|
||||
|
||||
@@ -1034,3 +1034,22 @@ pkInitKDC 1033
|
||||
X25519 1034
|
||||
X448 1035
|
||||
hkdf 1036
|
||||
kx_rsa 1037
|
||||
kx_ecdhe 1038
|
||||
kx_dhe 1039
|
||||
kx_ecdhe_psk 1040
|
||||
kx_dhe_psk 1041
|
||||
kx_rsa_psk 1042
|
||||
kx_psk 1043
|
||||
kx_srp 1044
|
||||
kx_gost 1045
|
||||
auth_rsa 1046
|
||||
auth_ecdsa 1047
|
||||
auth_psk 1048
|
||||
auth_dss 1049
|
||||
auth_gost01 1050
|
||||
auth_gost12 1051
|
||||
auth_srp 1052
|
||||
auth_null 1053
|
||||
fips_none 1054
|
||||
fips_140_2 1055
|
||||
|
||||
@@ -1456,3 +1456,25 @@ id-pkinit 5 : pkInitKDC : Signing KDC Response
|
||||
|
||||
1 3 6 1 4 1 11591 15 1 : X25519
|
||||
1 3 6 1 4 1 11591 15 2 : X448
|
||||
|
||||
# NIDs for cipher key exchange
|
||||
: KxRSA : kx-rsa
|
||||
: KxECDHE : kx-ecdhe
|
||||
: KxDHE : kx-dhe
|
||||
: KxECDHE-PSK : kx-ecdhe-psk
|
||||
: KxDHE-PSK : kx-dhe-psk
|
||||
: KxRSA_PSK : kx-rsa-psk
|
||||
: KxPSK : kx-psk
|
||||
: KxSRP : kx-srp
|
||||
: KxGOST : kx-gost
|
||||
|
||||
# NIDs for cipher authentication
|
||||
: AuthRSA : auth-rsa
|
||||
: AuthECDSA : auth-ecdsa
|
||||
: AuthPSK : auth-psk
|
||||
: AuthDSS : auth-dss
|
||||
: AuthGOST01 : auth-gost01
|
||||
: AuthGOST12 : auth-gost12
|
||||
: AuthSRP : auth-srp
|
||||
: AuthNULL : auth-null
|
||||
|
||||
|
||||
@@ -14,6 +14,9 @@ SSL_CIPHER_get_name, SSL_CIPHER_get_bits, SSL_CIPHER_get_version, SSL_CIPHER_des
|
||||
char *SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, int size);
|
||||
int SSL_CIPHER_get_cipher_nid(const SSL_CIPHER *c);
|
||||
int SSL_CIPHER_get_digest_nid(const SSL_CIPHER *c);
|
||||
int SSL_CIPHER_get_kx_nid(const SSL_CIPHER *c);
|
||||
int SSL_CIPHER_get_auth_nid(const SSL_CIPHER *c);
|
||||
int SSL_CIPHER_is_aead(const SSL_CIPHER *c);
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
@@ -34,6 +37,25 @@ SSL_CIPHER_get_digest_nid() returns the digest NID corresponding to the MAC
|
||||
used by B<c>. If there is no digest (e.g. for AEAD ciphersuites) then
|
||||
B<NID_undef> is returned.
|
||||
|
||||
SSL_CIPHER_get_kx_nid() returns the key exchange NID corresponding to the method
|
||||
used by B<c>. If there is no key exchange, then B<NID_undef> is returned. Examples (not comprehensive):
|
||||
|
||||
NID_kx_rsa
|
||||
NID_kx_ecdhe
|
||||
NID_kx_dhe
|
||||
NID_kx_psk
|
||||
|
||||
SSL_CIPHER_get_auth_nid() returns the authentication NID corresponding to the method
|
||||
used by B<c>. If there is no authentication, then B<NID_undef> is returned.
|
||||
Examples (not comprehensive):
|
||||
|
||||
NID_auth_rsa
|
||||
NID_auth_ecdsa
|
||||
NID_auth_psk
|
||||
|
||||
SSL_CIPHER_is_aead() returns 1 if the cipher B<c> is AEAD (e.g. GCM or
|
||||
ChaCha20/Poly1305), and 0 if it is not AEAD.
|
||||
|
||||
SSL_CIPHER_description() returns a textual description of the cipher used
|
||||
into the buffer B<buf> of length B<len> provided. If B<buf> is provided, it
|
||||
must be at least 128 bytes, otherwise a buffer will be allocated using
|
||||
|
||||
@@ -4536,3 +4536,71 @@
|
||||
#define SN_X448 "X448"
|
||||
#define NID_X448 1035
|
||||
#define OBJ_X448 1L,3L,6L,1L,4L,1L,11591L,15L,2L
|
||||
|
||||
#define SN_kx_rsa "KxRSA"
|
||||
#define LN_kx_rsa "kx-rsa"
|
||||
#define NID_kx_rsa 1037
|
||||
|
||||
#define SN_kx_ecdhe "KxECDHE"
|
||||
#define LN_kx_ecdhe "kx-ecdhe"
|
||||
#define NID_kx_ecdhe 1038
|
||||
|
||||
#define SN_kx_dhe "KxDHE"
|
||||
#define LN_kx_dhe "kx-dhe"
|
||||
#define NID_kx_dhe 1039
|
||||
|
||||
#define SN_kx_ecdhe_psk "KxECDHE-PSK"
|
||||
#define LN_kx_ecdhe_psk "kx-ecdhe-psk"
|
||||
#define NID_kx_ecdhe_psk 1040
|
||||
|
||||
#define SN_kx_dhe_psk "KxDHE-PSK"
|
||||
#define LN_kx_dhe_psk "kx-dhe-psk"
|
||||
#define NID_kx_dhe_psk 1041
|
||||
|
||||
#define SN_kx_rsa_psk "KxRSA_PSK"
|
||||
#define LN_kx_rsa_psk "kx-rsa-psk"
|
||||
#define NID_kx_rsa_psk 1042
|
||||
|
||||
#define SN_kx_psk "KxPSK"
|
||||
#define LN_kx_psk "kx-psk"
|
||||
#define NID_kx_psk 1043
|
||||
|
||||
#define SN_kx_srp "KxSRP"
|
||||
#define LN_kx_srp "kx-srp"
|
||||
#define NID_kx_srp 1044
|
||||
|
||||
#define SN_kx_gost "KxGOST"
|
||||
#define LN_kx_gost "kx-gost"
|
||||
#define NID_kx_gost 1045
|
||||
|
||||
#define SN_auth_rsa "AuthRSA"
|
||||
#define LN_auth_rsa "auth-rsa"
|
||||
#define NID_auth_rsa 1046
|
||||
|
||||
#define SN_auth_ecdsa "AuthECDSA"
|
||||
#define LN_auth_ecdsa "auth-ecdsa"
|
||||
#define NID_auth_ecdsa 1047
|
||||
|
||||
#define SN_auth_psk "AuthPSK"
|
||||
#define LN_auth_psk "auth-psk"
|
||||
#define NID_auth_psk 1048
|
||||
|
||||
#define SN_auth_dss "AuthDSS"
|
||||
#define LN_auth_dss "auth-dss"
|
||||
#define NID_auth_dss 1049
|
||||
|
||||
#define SN_auth_gost01 "AuthGOST01"
|
||||
#define LN_auth_gost01 "auth-gost01"
|
||||
#define NID_auth_gost01 1050
|
||||
|
||||
#define SN_auth_gost12 "AuthGOST12"
|
||||
#define LN_auth_gost12 "auth-gost12"
|
||||
#define NID_auth_gost12 1051
|
||||
|
||||
#define SN_auth_srp "AuthSRP"
|
||||
#define LN_auth_srp "auth-srp"
|
||||
#define NID_auth_srp 1052
|
||||
|
||||
#define SN_auth_null "AuthNULL"
|
||||
#define LN_auth_null "auth-null"
|
||||
#define NID_auth_null 1053
|
||||
|
||||
@@ -1400,6 +1400,9 @@ __owur int SSL_CIPHER_get_bits(const SSL_CIPHER *c, int *alg_bits);
|
||||
__owur char *SSL_CIPHER_get_version(const SSL_CIPHER *c);
|
||||
__owur const char *SSL_CIPHER_get_name(const SSL_CIPHER *c);
|
||||
__owur uint32_t SSL_CIPHER_get_id(const SSL_CIPHER *c);
|
||||
__owur int SSL_CIPHER_get_kx_nid(const SSL_CIPHER *c);
|
||||
__owur int SSL_CIPHER_get_auth_nid(const SSL_CIPHER *c);
|
||||
__owur int SSL_CIPHER_is_aead(const SSL_CIPHER *c);
|
||||
|
||||
__owur int SSL_get_fd(const SSL *s);
|
||||
__owur int SSL_get_rfd(const SSL *s);
|
||||
|
||||
@@ -240,6 +240,29 @@ static const EVP_MD *ssl_digest_methods[SSL_MD_NUM_IDX] = {
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
|
||||
};
|
||||
|
||||
static const ssl_cipher_table ssl_cipher_table_kx[] = {
|
||||
{ SSL_kRSA, NID_kx_rsa },
|
||||
{ SSL_kECDHE, NID_kx_ecdhe },
|
||||
{ SSL_kDHE, NID_kx_dhe },
|
||||
{ SSL_kECDHEPSK, NID_kx_ecdhe_psk },
|
||||
{ SSL_kDHEPSK, NID_kx_dhe_psk },
|
||||
{ SSL_kRSAPSK, NID_kx_rsa_psk },
|
||||
{ SSL_kPSK, NID_kx_psk },
|
||||
{ SSL_kSRP, NID_kx_srp },
|
||||
{ SSL_kGOST, NID_kx_gost }
|
||||
};
|
||||
|
||||
static const ssl_cipher_table ssl_cipher_table_auth[] = {
|
||||
{ SSL_aRSA, NID_auth_rsa },
|
||||
{ SSL_aECDSA, NID_auth_ecdsa },
|
||||
{ SSL_aPSK, NID_auth_psk },
|
||||
{ SSL_aDSS, NID_auth_dss },
|
||||
{ SSL_aGOST01, NID_auth_gost01 },
|
||||
{ SSL_aGOST12, NID_auth_gost12 },
|
||||
{ SSL_aSRP, NID_auth_srp },
|
||||
{ SSL_aNULL, NID_auth_null }
|
||||
};
|
||||
|
||||
/* Utility function for table lookup */
|
||||
static int ssl_cipher_info_find(const ssl_cipher_table * table,
|
||||
size_t table_cnt, uint32_t mask)
|
||||
@@ -2005,10 +2028,10 @@ int SSL_CIPHER_get_cipher_nid(const SSL_CIPHER *c)
|
||||
{
|
||||
int i;
|
||||
if (c == NULL)
|
||||
return -1;
|
||||
return NID_undef;
|
||||
i = ssl_cipher_info_lookup(ssl_cipher_table_cipher, c->algorithm_enc);
|
||||
if (i == -1)
|
||||
return -1;
|
||||
return NID_undef;
|
||||
return ssl_cipher_table_cipher[i].nid;
|
||||
}
|
||||
|
||||
@@ -2016,9 +2039,30 @@ int SSL_CIPHER_get_digest_nid(const SSL_CIPHER *c)
|
||||
{
|
||||
int i;
|
||||
if (c == NULL)
|
||||
return -1;
|
||||
return NID_undef;
|
||||
i = ssl_cipher_info_lookup(ssl_cipher_table_mac, c->algorithm_mac);
|
||||
if (i == -1)
|
||||
return -1;
|
||||
return NID_undef;
|
||||
return ssl_cipher_table_mac[i].nid;
|
||||
}
|
||||
|
||||
int SSL_CIPHER_get_kx_nid(const SSL_CIPHER *c)
|
||||
{
|
||||
int i = ssl_cipher_info_lookup(ssl_cipher_table_kx, c->algorithm_mkey);
|
||||
if (i == -1)
|
||||
return NID_undef;
|
||||
return ssl_cipher_table_kx[i].nid;
|
||||
}
|
||||
|
||||
int SSL_CIPHER_get_auth_nid(const SSL_CIPHER *c)
|
||||
{
|
||||
int i = ssl_cipher_info_lookup(ssl_cipher_table_kx, c->algorithm_auth);
|
||||
if (i == -1)
|
||||
return NID_undef;
|
||||
return ssl_cipher_table_kx[i].nid;
|
||||
}
|
||||
|
||||
int SSL_CIPHER_is_aead(const SSL_CIPHER *c)
|
||||
{
|
||||
return (c->algorithm_mac & SSL_AEAD) ? 1 : 0;
|
||||
}
|
||||
|
||||
@@ -384,3 +384,6 @@ SSL_CTX_get_ct_validation_callback 383 1_1_0 EXIST::FUNCTION:CT
|
||||
SSL_set_default_read_buffer_len 384 1_1_0 EXIST::FUNCTION:
|
||||
SSL_CTX_set_default_read_buffer_len 385 1_1_0 EXIST::FUNCTION:
|
||||
SSL_has_pending 386 1_1_0 EXIST::FUNCTION:
|
||||
SSL_CIPHER_get_auth_nid 387 1_1_0 EXIST::FUNCTION:
|
||||
SSL_CIPHER_get_kx_nid 388 1_1_0 EXIST::FUNCTION:
|
||||
SSL_CIPHER_is_aead 389 1_1_0 EXIST::FUNCTION:
|
||||
|
||||
Reference in New Issue
Block a user