mirror of https://github.com/wolfSSL/wolfssl
Add wolfSSL_get_sigalg_info
This commit is contained in:
parent
7c2344c389
commit
9337cfbb16
|
@ -14882,7 +14882,7 @@ int wolfSSL_dtls_cid_get_tx(WOLFSSL* ssl, unsigned char* buffer,
|
||||||
wolfSSL_get_client_suites_sigalgs(ssl, &suites, &suiteSz, &hashSigAlgo,
|
wolfSSL_get_client_suites_sigalgs(ssl, &suites, &suiteSz, &hashSigAlgo,
|
||||||
&hashSigAlgoSz);
|
&hashSigAlgoSz);
|
||||||
|
|
||||||
// Choose certificate to load based on ciphersuites
|
// Choose certificate to load based on ciphersuites and sigalgs
|
||||||
}
|
}
|
||||||
|
|
||||||
WOLFSSL* ctx;
|
WOLFSSL* ctx;
|
||||||
|
@ -14890,8 +14890,8 @@ int wolfSSL_dtls_cid_get_tx(WOLFSSL* ssl, unsigned char* buffer,
|
||||||
wolfSSL_CTX_set_cert_cb(ctx, certCB, NULL);
|
wolfSSL_CTX_set_cert_cb(ctx, certCB, NULL);
|
||||||
\endcode
|
\endcode
|
||||||
|
|
||||||
\sa wolfSSL_new
|
\sa wolfSSL_get_ciphersuite_info
|
||||||
\sa wolfSSL_free
|
\sa wolfSSL_get_sigalg_info
|
||||||
*/
|
*/
|
||||||
void wolfSSL_get_client_suites_sigalgs(const WOLFSSL* ssl,
|
void wolfSSL_get_client_suites_sigalgs(const WOLFSSL* ssl,
|
||||||
const byte** suites, word16* suiteSz,
|
const byte** suites, word16* suiteSz,
|
||||||
|
@ -14919,8 +14919,39 @@ void wolfSSL_get_client_suites_sigalgs(const WOLFSSL* ssl,
|
||||||
haveECC = 1;
|
haveECC = 1;
|
||||||
\endcode
|
\endcode
|
||||||
|
|
||||||
\sa wolfSSL_new
|
\sa wolfSSL_get_client_suites_sigalgs
|
||||||
\sa wolfSSL_free
|
\sa wolfSSL_get_sigalg_info
|
||||||
*/
|
*/
|
||||||
WOLFSSL_CIPHERSUITE_INFO wolfSSL_get_ciphersuite_info(byte first,
|
WOLFSSL_CIPHERSUITE_INFO wolfSSL_get_ciphersuite_info(byte first,
|
||||||
byte second);
|
byte second);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\ingroup TLS
|
||||||
|
|
||||||
|
\brief This returns information about the hash and signature algorithm
|
||||||
|
directly from the raw ciphersuite bytes.
|
||||||
|
|
||||||
|
\param [in] first First byte of the hash and signature algorith
|
||||||
|
\param [in] second Second byte of the hash and signature algorith
|
||||||
|
\param [out] hashAlgo The enum wc_HashType of the MAC algorithm
|
||||||
|
\param [out] sigAlgo The enum Key_Sum of the authentication algorithm
|
||||||
|
|
||||||
|
_Example_
|
||||||
|
\code
|
||||||
|
enum wc_HashType hashAlgo;
|
||||||
|
enum Key_Sum sigAlgo;
|
||||||
|
|
||||||
|
wolfSSL_get_sigalg_info(hashSigAlgo[idx+0], hashSigAlgo[idx+1],
|
||||||
|
&hashAlgo, &sigAlgo);
|
||||||
|
|
||||||
|
if (sigAlgo == RSAk || sigAlgo == RSAPSSk)
|
||||||
|
haveRSA = 1;
|
||||||
|
else if (sigAlgo == ECDSAk)
|
||||||
|
haveECC = 1;
|
||||||
|
\endcode
|
||||||
|
|
||||||
|
\sa wolfSSL_get_client_suites_sigalgs
|
||||||
|
\sa wolfSSL_get_ciphersuite_info
|
||||||
|
*/
|
||||||
|
void wolfSSL_get_sigalg_info(byte first, byte second,
|
||||||
|
enum wc_HashType* hashAlgo, enum Key_Sum* sigAlgo);
|
||||||
|
|
|
@ -4236,7 +4236,7 @@ void InitSuites(Suites* suites, ProtocolVersion pv, int keySz, word16 haveRSA,
|
||||||
* hashalgo The hash algorithm.
|
* hashalgo The hash algorithm.
|
||||||
* hsType The signature type.
|
* hsType The signature type.
|
||||||
*/
|
*/
|
||||||
static WC_INLINE void DecodeSigAlg(const byte* input, byte* hashAlgo, byte* hsType)
|
WC_INLINE void DecodeSigAlg(const byte* input, byte* hashAlgo, byte* hsType)
|
||||||
{
|
{
|
||||||
*hsType = invalid_sa_algo;
|
*hsType = invalid_sa_algo;
|
||||||
switch (input[0]) {
|
switch (input[0]) {
|
||||||
|
@ -4324,7 +4324,7 @@ static WC_INLINE void DecodeSigAlg(const byte* input, byte* hashAlgo, byte* hsTy
|
||||||
#if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
|
#if !defined(NO_DH) || defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
|
||||||
defined(HAVE_CURVE448) || (!defined(NO_RSA) && defined(WC_RSA_PSS))
|
defined(HAVE_CURVE448) || (!defined(NO_RSA) && defined(WC_RSA_PSS))
|
||||||
|
|
||||||
static enum wc_HashType HashAlgoToType(int hashAlgo)
|
enum wc_HashType HashAlgoToType(int hashAlgo)
|
||||||
{
|
{
|
||||||
switch (hashAlgo) {
|
switch (hashAlgo) {
|
||||||
#ifdef WOLFSSL_SHA512
|
#ifdef WOLFSSL_SHA512
|
||||||
|
|
106
src/ssl.c
106
src/ssl.c
|
@ -16338,6 +16338,112 @@ int wolfSSL_set_compression(WOLFSSL* ssl)
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wolfSSL_get_sigalg_info(byte first, byte second,
|
||||||
|
enum wc_HashType* hashAlgo, enum Key_Sum* sigAlgo)
|
||||||
|
{
|
||||||
|
byte input[2];
|
||||||
|
byte hashType;
|
||||||
|
byte sigType;
|
||||||
|
|
||||||
|
if (hashAlgo == NULL || sigAlgo == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
input[0] = first;
|
||||||
|
input[1] = second;
|
||||||
|
DecodeSigAlg(input, &hashType, &sigType);
|
||||||
|
|
||||||
|
/* cast so that compiler reminds us of unimplemented values */
|
||||||
|
switch ((enum SignatureAlgorithm)sigType) {
|
||||||
|
case anonymous_sa_algo:
|
||||||
|
*sigAlgo = (enum Key_Sum)0;
|
||||||
|
break;
|
||||||
|
case rsa_sa_algo:
|
||||||
|
*sigAlgo = RSAk;
|
||||||
|
break;
|
||||||
|
case dsa_sa_algo:
|
||||||
|
*sigAlgo = DSAk;
|
||||||
|
break;
|
||||||
|
case ecc_dsa_sa_algo:
|
||||||
|
*sigAlgo = ECDSAk;
|
||||||
|
break;
|
||||||
|
case rsa_pss_sa_algo:
|
||||||
|
*sigAlgo = RSAPSSk;
|
||||||
|
break;
|
||||||
|
case ed25519_sa_algo:
|
||||||
|
*sigAlgo = ED25519k;
|
||||||
|
break;
|
||||||
|
case rsa_pss_pss_algo:
|
||||||
|
*sigAlgo = RSAPSSk;
|
||||||
|
break;
|
||||||
|
case ed448_sa_algo:
|
||||||
|
*sigAlgo = ED448k;
|
||||||
|
break;
|
||||||
|
case falcon_level1_sa_algo:
|
||||||
|
*sigAlgo = FALCON_LEVEL1k;
|
||||||
|
break;
|
||||||
|
case falcon_level5_sa_algo:
|
||||||
|
*sigAlgo = FALCON_LEVEL5k;
|
||||||
|
break;
|
||||||
|
case dilithium_level2_sa_algo:
|
||||||
|
*sigAlgo = DILITHIUM_LEVEL2k;
|
||||||
|
break;
|
||||||
|
case dilithium_level3_sa_algo:
|
||||||
|
*sigAlgo = DILITHIUM_LEVEL3k;
|
||||||
|
break;
|
||||||
|
case dilithium_level5_sa_algo:
|
||||||
|
*sigAlgo = DILITHIUM_LEVEL5k;
|
||||||
|
break;
|
||||||
|
case sm2_sa_algo:
|
||||||
|
*sigAlgo = SM2k;
|
||||||
|
break;
|
||||||
|
case invalid_sa_algo:
|
||||||
|
default:
|
||||||
|
*hashAlgo = WC_HASH_TYPE_NONE;
|
||||||
|
*sigAlgo = (enum Key_Sum)0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* cast so that compiler reminds us of unimplemented values */
|
||||||
|
switch((enum wc_MACAlgorithm)hashType) {
|
||||||
|
case no_mac:
|
||||||
|
case rmd_mac: /* Don't have a RIPEMD type in wc_HashType */
|
||||||
|
*hashAlgo = WC_HASH_TYPE_NONE;
|
||||||
|
break;
|
||||||
|
case md5_mac:
|
||||||
|
*hashAlgo = WC_HASH_TYPE_MD5;
|
||||||
|
break;
|
||||||
|
case sha_mac:
|
||||||
|
*hashAlgo = WC_HASH_TYPE_SHA;
|
||||||
|
break;
|
||||||
|
case sha224_mac:
|
||||||
|
*hashAlgo = WC_HASH_TYPE_SHA224;
|
||||||
|
break;
|
||||||
|
case sha256_mac:
|
||||||
|
*hashAlgo = WC_HASH_TYPE_SHA256;
|
||||||
|
break;
|
||||||
|
case sha384_mac:
|
||||||
|
*hashAlgo = WC_HASH_TYPE_SHA384;
|
||||||
|
break;
|
||||||
|
case sha512_mac:
|
||||||
|
*hashAlgo = WC_HASH_TYPE_SHA512;
|
||||||
|
break;
|
||||||
|
case blake2b_mac:
|
||||||
|
*hashAlgo = WC_HASH_TYPE_BLAKE2B;
|
||||||
|
break;
|
||||||
|
case sm3_mac:
|
||||||
|
#ifdef WOLFSSL_SM3
|
||||||
|
*hashAlgo = WC_HASH_TYPE_SM3;
|
||||||
|
#else
|
||||||
|
*hashAlgo = WC_HASH_TYPE_NONE;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
*hashAlgo = WC_HASH_TYPE_NONE;
|
||||||
|
*sigAlgo = (enum Key_Sum)0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Internal wrapper for calling certSetupCb
|
* Internal wrapper for calling certSetupCb
|
||||||
* @param ssl The SSL/TLS Object
|
* @param ssl The SSL/TLS Object
|
||||||
|
|
73
tests/api.c
73
tests/api.c
|
@ -44865,31 +44865,16 @@ static int test_wolfSSL_cert_cb_dyn_ciphers_certCB(WOLFSSL* ssl, void* arg)
|
||||||
haveECC = 0;
|
haveECC = 0;
|
||||||
}
|
}
|
||||||
for (idx = 0; idx < hashSigAlgoSz; idx += 2) {
|
for (idx = 0; idx < hashSigAlgoSz; idx += 2) {
|
||||||
/* Based on DecodeSigAlg. Enums are not exposed so need to use magic
|
enum wc_HashType hashAlgo;
|
||||||
* numbers. */
|
enum Key_Sum sigAlgo;
|
||||||
switch (hashSigAlgo[idx+0]) {
|
|
||||||
case 8:
|
wolfSSL_get_sigalg_info(hashSigAlgo[idx+0], hashSigAlgo[idx+1],
|
||||||
switch (hashSigAlgo[idx+1]) {
|
&hashAlgo, &sigAlgo);
|
||||||
case 7: /* ED25519 */
|
|
||||||
case 8: /* ED448 */
|
if (sigAlgo == RSAk || sigAlgo == RSAPSSk)
|
||||||
haveECC = 1;
|
haveRSA = 1;
|
||||||
break;
|
else if (sigAlgo == ECDSAk)
|
||||||
default:
|
haveECC = 1;
|
||||||
/* RSA-PSS */
|
|
||||||
haveRSA = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
switch (hashSigAlgo[idx+1]) {
|
|
||||||
case 1: /* RSA */
|
|
||||||
haveRSA = 1;
|
|
||||||
break;
|
|
||||||
case 3: /* ECC */
|
|
||||||
haveECC = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (haveRSA) {
|
if (haveRSA) {
|
||||||
|
@ -45082,6 +45067,43 @@ static int test_wolfSSL_ciphersuite_auth(void)
|
||||||
return EXPECT_RESULT();
|
return EXPECT_RESULT();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int test_wolfSSL_sigalg_info(void)
|
||||||
|
{
|
||||||
|
EXPECT_DECLS;
|
||||||
|
#if defined(OPENSSL_EXTRA) || defined(WOLFSSL_EXTRA)
|
||||||
|
byte hashSigAlgo[WOLFSSL_MAX_SIGALGO];
|
||||||
|
word16 len = 0;
|
||||||
|
word16 idx = 0;
|
||||||
|
int allSigAlgs = SIG_ECDSA | SIG_RSA | SIG_SM2 | SIG_FALCON | SIG_DILITHIUM;
|
||||||
|
|
||||||
|
InitSuitesHashSigAlgo_ex2(hashSigAlgo, allSigAlgs, 1, 0xFFFFFFFF, &len);
|
||||||
|
for (idx = 0; idx < len; idx += 2) {
|
||||||
|
enum wc_HashType hashAlgo;
|
||||||
|
enum Key_Sum sigAlgo;
|
||||||
|
|
||||||
|
wolfSSL_get_sigalg_info(hashSigAlgo[idx+0], hashSigAlgo[idx+1],
|
||||||
|
&hashAlgo, &sigAlgo);
|
||||||
|
|
||||||
|
ExpectIntNE(hashAlgo, 0);
|
||||||
|
ExpectIntNE(sigAlgo, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
InitSuitesHashSigAlgo_ex2(hashSigAlgo, allSigAlgs | SIG_ANON, 1,
|
||||||
|
0xFFFFFFFF, &len);
|
||||||
|
for (idx = 0; idx < len; idx += 2) {
|
||||||
|
enum wc_HashType hashAlgo;
|
||||||
|
enum Key_Sum sigAlgo;
|
||||||
|
|
||||||
|
wolfSSL_get_sigalg_info(hashSigAlgo[idx+0], hashSigAlgo[idx+1],
|
||||||
|
&hashAlgo, &sigAlgo);
|
||||||
|
|
||||||
|
ExpectIntNE(hashAlgo, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
return EXPECT_RESULT();
|
||||||
|
}
|
||||||
|
|
||||||
static int test_wolfSSL_SESSION(void)
|
static int test_wolfSSL_SESSION(void)
|
||||||
{
|
{
|
||||||
EXPECT_DECLS;
|
EXPECT_DECLS;
|
||||||
|
@ -69268,6 +69290,7 @@ TEST_CASE testCases[] = {
|
||||||
TEST_DECL(test_wolfSSL_cert_cb),
|
TEST_DECL(test_wolfSSL_cert_cb),
|
||||||
TEST_DECL(test_wolfSSL_cert_cb_dyn_ciphers),
|
TEST_DECL(test_wolfSSL_cert_cb_dyn_ciphers),
|
||||||
TEST_DECL(test_wolfSSL_ciphersuite_auth),
|
TEST_DECL(test_wolfSSL_ciphersuite_auth),
|
||||||
|
TEST_DECL(test_wolfSSL_sigalg_info),
|
||||||
/* Can't memory test as tcp_connect aborts. */
|
/* Can't memory test as tcp_connect aborts. */
|
||||||
TEST_DECL(test_wolfSSL_SESSION),
|
TEST_DECL(test_wolfSSL_SESSION),
|
||||||
TEST_DECL(test_wolfSSL_SESSION_expire_downgrade),
|
TEST_DECL(test_wolfSSL_SESSION_expire_downgrade),
|
||||||
|
|
|
@ -2352,7 +2352,8 @@ WOLFSSL_LOCAL void InitSuitesHashSigAlgo_ex(byte* hashSigAlgo, int haveECDSAsig,
|
||||||
int haveRSAsig, int haveFalconSig,
|
int haveRSAsig, int haveFalconSig,
|
||||||
int haveDilithiumSig, int haveAnon,
|
int haveDilithiumSig, int haveAnon,
|
||||||
int tls1_2, int keySz, word16* len);
|
int tls1_2, int keySz, word16* len);
|
||||||
WOLFSSL_LOCAL void InitSuitesHashSigAlgo_ex2(byte* hashSigAlgo, int have,
|
/* use wolfSSL_API visibility to be able to test in tests/api.c */
|
||||||
|
WOLFSSL_API void InitSuitesHashSigAlgo_ex2(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);
|
||||||
|
@ -6325,6 +6326,10 @@ WOLFSSL_LOCAL word32 LowResTimer(void);
|
||||||
|
|
||||||
WOLFSSL_LOCAL int FindSuiteSSL(const WOLFSSL* ssl, byte* suite);
|
WOLFSSL_LOCAL int FindSuiteSSL(const WOLFSSL* ssl, byte* suite);
|
||||||
|
|
||||||
|
WOLFSSL_LOCAL void DecodeSigAlg(const byte* input, byte* hashAlgo,
|
||||||
|
byte* hsType);
|
||||||
|
WOLFSSL_LOCAL enum wc_HashType HashAlgoToType(int hashAlgo);
|
||||||
|
|
||||||
#ifndef NO_CERTS
|
#ifndef NO_CERTS
|
||||||
WOLFSSL_LOCAL void InitX509Name(WOLFSSL_X509_NAME* name, int dynamicFlag,
|
WOLFSSL_LOCAL void InitX509Name(WOLFSSL_X509_NAME* name, int dynamicFlag,
|
||||||
void* heap);
|
void* heap);
|
||||||
|
|
|
@ -1531,9 +1531,7 @@ WOLFSSL_API int wolfSSL_sk_push_node(WOLFSSL_STACK** stack, WOLFSSL_STACK* in);
|
||||||
WOLFSSL_API WOLFSSL_STACK* wolfSSL_sk_get_node(WOLFSSL_STACK* sk, int idx);
|
WOLFSSL_API WOLFSSL_STACK* wolfSSL_sk_get_node(WOLFSSL_STACK* sk, int idx);
|
||||||
WOLFSSL_API int wolfSSL_sk_push(WOLFSSL_STACK *st, const void *data);
|
WOLFSSL_API int wolfSSL_sk_push(WOLFSSL_STACK *st, const void *data);
|
||||||
|
|
||||||
#if defined(HAVE_OCSP) || defined(HAVE_CRL)
|
|
||||||
#include "wolfssl/wolfcrypt/asn.h"
|
#include "wolfssl/wolfcrypt/asn.h"
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || defined(WOLFSSL_QT)
|
#if defined(OPENSSL_ALL) || defined(OPENSSL_EXTRA) || defined(WOLFSSL_QT)
|
||||||
WOLFSSL_API int wolfSSL_sk_ACCESS_DESCRIPTION_push(
|
WOLFSSL_API int wolfSSL_sk_ACCESS_DESCRIPTION_push(
|
||||||
|
@ -2132,6 +2130,8 @@ typedef struct WOLFSSL_CIPHERSUITE_INFO {
|
||||||
} WOLFSSL_CIPHERSUITE_INFO;
|
} WOLFSSL_CIPHERSUITE_INFO;
|
||||||
WOLFSSL_API WOLFSSL_CIPHERSUITE_INFO wolfSSL_get_ciphersuite_info(byte first,
|
WOLFSSL_API WOLFSSL_CIPHERSUITE_INFO wolfSSL_get_ciphersuite_info(byte first,
|
||||||
byte second);
|
byte second);
|
||||||
|
WOLFSSL_API void wolfSSL_get_sigalg_info(byte first,
|
||||||
|
byte second, enum wc_HashType* hashAlgo, enum Key_Sum* sigAlgo);
|
||||||
WOLFSSL_LOCAL int CertSetupCbWrapper(WOLFSSL* ssl);
|
WOLFSSL_LOCAL int CertSetupCbWrapper(WOLFSSL* ssl);
|
||||||
|
|
||||||
WOLFSSL_API void* wolfSSL_X509_STORE_CTX_get_ex_data(
|
WOLFSSL_API void* wolfSSL_X509_STORE_CTX_get_ex_data(
|
||||||
|
|
Loading…
Reference in New Issue