forked from wolfSSL/wolfssl
Save more decoded data from certificate for later use with X.509 functions.
This commit is contained in:
@ -1303,6 +1303,20 @@ void InitDecodedCert(DecodedCert* cert, byte* source, word32 inSz, void* heap)
|
|||||||
#ifdef OPENSSL_EXTRA
|
#ifdef OPENSSL_EXTRA
|
||||||
XMEMSET(&cert->issuerName, 0, sizeof(DecodedName));
|
XMEMSET(&cert->issuerName, 0, sizeof(DecodedName));
|
||||||
XMEMSET(&cert->subjectName, 0, sizeof(DecodedName));
|
XMEMSET(&cert->subjectName, 0, sizeof(DecodedName));
|
||||||
|
cert->extBasicConstSet = 0;
|
||||||
|
cert->extBasicConstCrit = 0;
|
||||||
|
cert->extBasicConstPlSet = 0;
|
||||||
|
cert->pathLength = 0;
|
||||||
|
cert->extSubjAltNameSet = 0;
|
||||||
|
cert->extSubjAltNameCrit = 0;
|
||||||
|
cert->extAuthKeyIdCrit = 0;
|
||||||
|
cert->extSubjKeyIdCrit = 0;
|
||||||
|
cert->extKeyUsageSet = 0;
|
||||||
|
cert->extKeyUsageCrit = 0;
|
||||||
|
cert->extKeyUsage = 0;
|
||||||
|
#ifdef HAVE_ECC
|
||||||
|
cert->pkCurveOID = 0;
|
||||||
|
#endif /* HAVE_ECC */
|
||||||
#endif /* OPENSSL_EXTRA */
|
#endif /* OPENSSL_EXTRA */
|
||||||
#ifdef CYASSL_SEP
|
#ifdef CYASSL_SEP
|
||||||
cert->deviceTypeSz = 0;
|
cert->deviceTypeSz = 0;
|
||||||
@ -1311,6 +1325,10 @@ void InitDecodedCert(DecodedCert* cert, byte* source, word32 inSz, void* heap)
|
|||||||
cert->hwType = NULL;
|
cert->hwType = NULL;
|
||||||
cert->hwSerialNumSz = 0;
|
cert->hwSerialNumSz = 0;
|
||||||
cert->hwSerialNum = NULL;
|
cert->hwSerialNum = NULL;
|
||||||
|
#ifdef OPENSSL_EXTRA
|
||||||
|
cert->extCertPolicySet = 0;
|
||||||
|
cert->extCertPolicyCrit = 0;
|
||||||
|
#endif /* OPENSSL_EXTRA */
|
||||||
#endif /* CYASSL_SEP */
|
#endif /* CYASSL_SEP */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1509,6 +1527,9 @@ static int GetKey(DecodedCert* cert)
|
|||||||
oid += cert->source[cert->srcIdx++];
|
oid += cert->source[cert->srcIdx++];
|
||||||
if (CheckCurve(oid) < 0)
|
if (CheckCurve(oid) < 0)
|
||||||
return ECC_CURVE_OID_E;
|
return ECC_CURVE_OID_E;
|
||||||
|
#ifdef OPENSSL_EXTRA
|
||||||
|
cert->pkCurveOID = oid;
|
||||||
|
#endif /* OPENSSL_EXTRA */
|
||||||
|
|
||||||
/* key header */
|
/* key header */
|
||||||
b = cert->source[cert->srcIdx++];
|
b = cert->source[cert->srcIdx++];
|
||||||
@ -2882,8 +2903,28 @@ static void DecodeBasicCaConstraint(byte* input, int sz, DecodedCert* cert)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (input[idx])
|
if (input[idx++])
|
||||||
cert->isCA = 1;
|
cert->isCA = 1;
|
||||||
|
|
||||||
|
#ifdef OPENSSL_EXTRA
|
||||||
|
/* If there isn't any more data, return. */
|
||||||
|
if (idx >= (word32)sz)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Anything left should be the optional pathlength */
|
||||||
|
if (input[idx++] != ASN_INTEGER) {
|
||||||
|
CYASSL_MSG("\tfail: pathlen not INTEGER");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (input[idx++] != 1) {
|
||||||
|
CYASSL_MSG("\tfail: pathlen too long");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cert->pathLength = input[idx];
|
||||||
|
cert->extBasicConstPlSet = 1;
|
||||||
|
#endif /* OPENSSL_EXTRA */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -3045,7 +3086,6 @@ static void DecodeAuthKeyId(byte* input, int sz, DecodedCert* cert)
|
|||||||
ShaUpdate(&sha, input + idx, length);
|
ShaUpdate(&sha, input + idx, length);
|
||||||
ShaFinal(&sha, cert->extAuthKeyId);
|
ShaFinal(&sha, cert->extAuthKeyId);
|
||||||
}
|
}
|
||||||
cert->extAuthKeyIdSet = 1;
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -3077,12 +3117,44 @@ static void DecodeSubjKeyId(byte* input, int sz, DecodedCert* cert)
|
|||||||
ShaUpdate(&sha, input + idx, length);
|
ShaUpdate(&sha, input + idx, length);
|
||||||
ShaFinal(&sha, cert->extSubjKeyId);
|
ShaFinal(&sha, cert->extSubjKeyId);
|
||||||
}
|
}
|
||||||
cert->extSubjKeyIdSet = 1;
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef OPENSSL_EXTRA
|
||||||
|
static void DecodeKeyUsage(byte* input, int sz, DecodedCert* cert)
|
||||||
|
{
|
||||||
|
word32 idx = 0;
|
||||||
|
int length;
|
||||||
|
byte unusedBits;
|
||||||
|
CYASSL_ENTER("DecodeKeyUsage");
|
||||||
|
|
||||||
|
if (input[idx++] != ASN_BIT_STRING) {
|
||||||
|
CYASSL_MSG("\tfail: key usage expected bit string");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GetLength(input, &idx, &length, sz) < 0) {
|
||||||
|
CYASSL_MSG("\tfail: key usage bad length");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
unusedBits = input[idx++];
|
||||||
|
length--;
|
||||||
|
|
||||||
|
if (length == 2) {
|
||||||
|
cert->extKeyUsage = (input[idx] << 8) | input[idx+1];
|
||||||
|
cert->extKeyUsage >>= unusedBits;
|
||||||
|
}
|
||||||
|
else if (length == 1)
|
||||||
|
cert->extKeyUsage = (input[idx] << 1);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif /* OPENSSL_EXTRA */
|
||||||
|
|
||||||
|
|
||||||
#ifdef CYASSL_SEP
|
#ifdef CYASSL_SEP
|
||||||
static void DecodeCertPolicy(byte* input, int sz, DecodedCert* cert)
|
static void DecodeCertPolicy(byte* input, int sz, DecodedCert* cert)
|
||||||
{
|
{
|
||||||
@ -3138,6 +3210,7 @@ static void DecodeCertExtensions(DecodedCert* cert)
|
|||||||
byte* input = cert->extensions;
|
byte* input = cert->extensions;
|
||||||
int length;
|
int length;
|
||||||
word32 oid;
|
word32 oid;
|
||||||
|
byte critical;
|
||||||
|
|
||||||
CYASSL_ENTER("DecodeCertExtensions");
|
CYASSL_ENTER("DecodeCertExtensions");
|
||||||
|
|
||||||
@ -3162,9 +3235,16 @@ static void DecodeCertExtensions(DecodedCert* cert)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* check for critical flag */
|
/* check for critical flag */
|
||||||
|
critical = 0;
|
||||||
if (input[idx] == ASN_BOOLEAN) {
|
if (input[idx] == ASN_BOOLEAN) {
|
||||||
CYASSL_MSG("\tfound optional critical flag, moving past");
|
int boolLength = 0;
|
||||||
idx += (ASN_BOOL_SIZE + 1);
|
idx++;
|
||||||
|
if (GetLength(input, &idx, &boolLength, sz) < 0) {
|
||||||
|
CYASSL_MSG("\tfail: critical boolean length");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (input[idx++])
|
||||||
|
critical = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* process the extension based on the OID */
|
/* process the extension based on the OID */
|
||||||
@ -3180,6 +3260,10 @@ static void DecodeCertExtensions(DecodedCert* cert)
|
|||||||
|
|
||||||
switch (oid) {
|
switch (oid) {
|
||||||
case BASIC_CA_OID:
|
case BASIC_CA_OID:
|
||||||
|
#ifdef OPENSSL_EXTRA
|
||||||
|
cert->extBasicConstSet = 1;
|
||||||
|
cert->extBasicConstCrit = critical;
|
||||||
|
#endif
|
||||||
DecodeBasicCaConstraint(&input[idx], length, cert);
|
DecodeBasicCaConstraint(&input[idx], length, cert);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -3192,23 +3276,47 @@ static void DecodeCertExtensions(DecodedCert* cert)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case ALT_NAMES_OID:
|
case ALT_NAMES_OID:
|
||||||
|
#ifdef OPENSSL_EXTRA
|
||||||
|
cert->extSubjAltNameSet = 1;
|
||||||
|
cert->extSubjAltNameCrit = critical;
|
||||||
|
#endif
|
||||||
DecodeAltNames(&input[idx], length, cert);
|
DecodeAltNames(&input[idx], length, cert);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AUTH_KEY_OID:
|
case AUTH_KEY_OID:
|
||||||
|
cert->extAuthKeyIdSet = 1;
|
||||||
|
#ifdef OPENSSL_EXTRA
|
||||||
|
cert->extAuthKeyIdCrit = critical;
|
||||||
|
#endif
|
||||||
DecodeAuthKeyId(&input[idx], length, cert);
|
DecodeAuthKeyId(&input[idx], length, cert);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SUBJ_KEY_OID:
|
case SUBJ_KEY_OID:
|
||||||
|
cert->extSubjKeyIdSet = 1;
|
||||||
|
#ifdef OPENSSL_EXTRA
|
||||||
|
cert->extSubjKeyIdCrit = critical;
|
||||||
|
#endif
|
||||||
DecodeSubjKeyId(&input[idx], length, cert);
|
DecodeSubjKeyId(&input[idx], length, cert);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#ifdef CYASSL_SEP
|
#ifdef CYASSL_SEP
|
||||||
case CERT_POLICY_OID:
|
case CERT_POLICY_OID:
|
||||||
|
#ifdef OPENSSL_EXTRA
|
||||||
|
cert->extCertPolicySet = 1;
|
||||||
|
cert->extCertPolicyCrit = critical;
|
||||||
|
#endif
|
||||||
DecodeCertPolicy(&input[idx], length, cert);
|
DecodeCertPolicy(&input[idx], length, cert);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef OPENSSL_EXTRA
|
||||||
|
case KEY_USAGE_OID:
|
||||||
|
cert->extKeyUsageSet = 1;
|
||||||
|
cert->extKeyUsageCrit = critical;
|
||||||
|
DecodeKeyUsage(&input[idx], length, cert);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
default:
|
default:
|
||||||
CYASSL_MSG("\tExtension type not handled, skipping");
|
CYASSL_MSG("\tExtension type not handled, skipping");
|
||||||
break;
|
break;
|
||||||
|
@ -199,7 +199,8 @@ enum Extensions_Sum {
|
|||||||
CA_ISSUER_OID = 117,
|
CA_ISSUER_OID = 117,
|
||||||
AUTH_KEY_OID = 149,
|
AUTH_KEY_OID = 149,
|
||||||
SUBJ_KEY_OID = 128,
|
SUBJ_KEY_OID = 128,
|
||||||
CERT_POLICY_OID = 146
|
CERT_POLICY_OID = 146,
|
||||||
|
KEY_USAGE_OID = 129 /* 2.5.29.15 */
|
||||||
};
|
};
|
||||||
|
|
||||||
enum CertificatePolicy_Sum {
|
enum CertificatePolicy_Sum {
|
||||||
@ -217,6 +218,18 @@ enum VerifyType {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* Key usage extension bits */
|
||||||
|
#define KEYUSE_DIGITAL_SIG 0x0100
|
||||||
|
#define KEYUSE_CONTENT_COMMIT 0x0080
|
||||||
|
#define KEYUSE_KEY_ENCIPHER 0x0040
|
||||||
|
#define KEYUSE_DATA_ENCIPHER 0x0020
|
||||||
|
#define KEYUSE_KEY_AGREE 0x0010
|
||||||
|
#define KEYUSE_KEY_CERT_SIGN 0x0008
|
||||||
|
#define KEYUSE_CRL_SIGN 0x0004
|
||||||
|
#define KEYUSE_ENCIPHER_ONLY 0x0002
|
||||||
|
#define KEYUSE_DECIPHER_ONLY 0x0001
|
||||||
|
|
||||||
|
|
||||||
typedef struct DNS_entry DNS_entry;
|
typedef struct DNS_entry DNS_entry;
|
||||||
|
|
||||||
struct DNS_entry {
|
struct DNS_entry {
|
||||||
@ -297,7 +310,23 @@ struct DecodedCert {
|
|||||||
byte extSubjKeyIdSet; /* Set when the SKID was read from cert */
|
byte extSubjKeyIdSet; /* Set when the SKID was read from cert */
|
||||||
byte extAuthKeyId[SHA_SIZE]; /* Authority Key ID */
|
byte extAuthKeyId[SHA_SIZE]; /* Authority Key ID */
|
||||||
byte extAuthKeyIdSet; /* Set when the AKID was read from cert */
|
byte extAuthKeyIdSet; /* Set when the AKID was read from cert */
|
||||||
byte isCA; /* CA basic constraint true */
|
byte isCA; /* CA basic constraint true */
|
||||||
|
#ifdef OPENSSL_EXTRA
|
||||||
|
byte extBasicConstSet;
|
||||||
|
byte extBasicConstCrit;
|
||||||
|
byte extBasicConstPlSet;
|
||||||
|
word32 pathLength; /* CA basic constraint path length, opt */
|
||||||
|
byte extSubjAltNameSet;
|
||||||
|
byte extSubjAltNameCrit;
|
||||||
|
byte extAuthKeyIdCrit;
|
||||||
|
byte extSubjKeyIdCrit;
|
||||||
|
byte extKeyUsageSet;
|
||||||
|
byte extKeyUsageCrit;
|
||||||
|
word16 extKeyUsage; /* Key usage bitfield */
|
||||||
|
#ifdef HAVE_ECC
|
||||||
|
word32 pkCurveOID; /* Public Key's curve OID */
|
||||||
|
#endif /* HAVE_ECC */
|
||||||
|
#endif
|
||||||
byte* beforeDate;
|
byte* beforeDate;
|
||||||
int beforeDateLen;
|
int beforeDateLen;
|
||||||
byte* afterDate;
|
byte* afterDate;
|
||||||
@ -330,6 +359,10 @@ struct DecodedCert {
|
|||||||
byte* hwType;
|
byte* hwType;
|
||||||
int hwSerialNumSz;
|
int hwSerialNumSz;
|
||||||
byte* hwSerialNum;
|
byte* hwSerialNum;
|
||||||
|
#ifdef OPENSSL_EXTRA
|
||||||
|
byte extCertPolicySet;
|
||||||
|
byte extCertPolicyCrit;
|
||||||
|
#endif /* OPENSSL_EXTRA */
|
||||||
#endif /* CYASSL_SEP */
|
#endif /* CYASSL_SEP */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -78,6 +78,9 @@
|
|||||||
/* Uncomment next line if using Comverge settings */
|
/* Uncomment next line if using Comverge settings */
|
||||||
/* #define COMVERGE */
|
/* #define COMVERGE */
|
||||||
|
|
||||||
|
/* Uncomment next line if using QL SEP settings */
|
||||||
|
/* #define CYASSL_QL */
|
||||||
|
|
||||||
|
|
||||||
#include <cyassl/ctaocrypt/visibility.h>
|
#include <cyassl/ctaocrypt/visibility.h>
|
||||||
|
|
||||||
@ -524,6 +527,37 @@
|
|||||||
#endif /* MICRIUM */
|
#endif /* MICRIUM */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CYASSL_QL
|
||||||
|
#ifndef CYASSL_SEP
|
||||||
|
#define CYASSL_SEP
|
||||||
|
#endif
|
||||||
|
#ifndef OPENSSL_EXTRA
|
||||||
|
#define OPENSSL_EXTRA
|
||||||
|
#endif
|
||||||
|
#ifndef SESSION_CERTS
|
||||||
|
#define SESSION_CERTS
|
||||||
|
#endif
|
||||||
|
#ifndef HAVE_AESCCM
|
||||||
|
#define HAVE_AESCCM
|
||||||
|
#endif
|
||||||
|
#ifndef ATOMIC_USER
|
||||||
|
#define ATOMIC_USER
|
||||||
|
#endif
|
||||||
|
#ifndef CYASSL_DER_LOAD
|
||||||
|
#define CYASSL_DER_LOAD
|
||||||
|
#endif
|
||||||
|
#ifndef KEEP_PEER_CERT
|
||||||
|
#define KEEP_PEER_CERT
|
||||||
|
#endif
|
||||||
|
#ifndef HAVE_ECC
|
||||||
|
#define HAVE_ECC
|
||||||
|
#endif
|
||||||
|
#ifndef SESSION_INDEX
|
||||||
|
#define SESSION_INDEX
|
||||||
|
#endif
|
||||||
|
#endif /* CYASSL_QL */
|
||||||
|
|
||||||
|
|
||||||
#if !defined(XMALLOC_USER) && !defined(MICRIUM_MALLOC) && \
|
#if !defined(XMALLOC_USER) && !defined(MICRIUM_MALLOC) && \
|
||||||
!defined(CYASSL_LEANPSK) && !defined(NO_CYASSL_MEMORY)
|
!defined(CYASSL_LEANPSK) && !defined(NO_CYASSL_MEMORY)
|
||||||
#define USE_CYASSL_MEMORY
|
#define USE_CYASSL_MEMORY
|
||||||
|
@ -1661,6 +1661,10 @@ struct CYASSL_X509 {
|
|||||||
byte hwType[EXTERNAL_SERIAL_SIZE];
|
byte hwType[EXTERNAL_SERIAL_SIZE];
|
||||||
int hwSerialNumSz;
|
int hwSerialNumSz;
|
||||||
byte hwSerialNum[EXTERNAL_SERIAL_SIZE];
|
byte hwSerialNum[EXTERNAL_SERIAL_SIZE];
|
||||||
|
#ifdef OPENSSL_EXTRA
|
||||||
|
byte certPolicySet;
|
||||||
|
byte certPolicyCrit;
|
||||||
|
#endif /* OPENSSL_EXTRA */
|
||||||
#endif
|
#endif
|
||||||
int notBeforeSz;
|
int notBeforeSz;
|
||||||
byte notBefore[MAX_DATE_SZ];
|
byte notBefore[MAX_DATE_SZ];
|
||||||
@ -1670,10 +1674,31 @@ struct CYASSL_X509 {
|
|||||||
buffer sig;
|
buffer sig;
|
||||||
int pubKeyOID;
|
int pubKeyOID;
|
||||||
buffer pubKey;
|
buffer pubKey;
|
||||||
|
#ifdef HAVE_ECC
|
||||||
|
word32 pkCurveOID;
|
||||||
|
#endif /* HAVE_ECC */
|
||||||
buffer derCert; /* may need */
|
buffer derCert; /* may need */
|
||||||
DNS_entry* altNames; /* alt names list */
|
DNS_entry* altNames; /* alt names list */
|
||||||
DNS_entry* altNamesNext; /* hint for retrieval */
|
DNS_entry* altNamesNext; /* hint for retrieval */
|
||||||
byte dynamicMemory; /* dynamic memory flag */
|
byte dynamicMemory; /* dynamic memory flag */
|
||||||
|
byte isCa;
|
||||||
|
#ifdef OPENSSL_EXTRA
|
||||||
|
word32 pathLength;
|
||||||
|
word16 keyUsage;
|
||||||
|
byte basicConstSet;
|
||||||
|
byte basicConstCrit;
|
||||||
|
byte basicConstPlSet;
|
||||||
|
byte subjAltNameSet;
|
||||||
|
byte subjAltNameCrit;
|
||||||
|
byte authKeyIdSet;
|
||||||
|
byte authKeyIdCrit;
|
||||||
|
byte authKeyId[SHA_SIZE];
|
||||||
|
byte subjKeyIdSet;
|
||||||
|
byte subjKeyIdCrit;
|
||||||
|
byte subjKeyId[SHA_SIZE];
|
||||||
|
byte keyUsageSet;
|
||||||
|
byte keyUsageCrit;
|
||||||
|
#endif /* OPENSSL_EXTRA */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
13
cyassl/ssl.h
13
cyassl/ssl.h
@ -99,6 +99,9 @@ typedef struct CYASSL_EVP_PKEY {
|
|||||||
union {
|
union {
|
||||||
char* ptr;
|
char* ptr;
|
||||||
} pkey;
|
} pkey;
|
||||||
|
#ifdef HAVE_ECC
|
||||||
|
int pkey_curve;
|
||||||
|
#endif
|
||||||
} CYASSL_EVP_PKEY;
|
} CYASSL_EVP_PKEY;
|
||||||
|
|
||||||
typedef struct CYASSL_MD4_CTX {
|
typedef struct CYASSL_MD4_CTX {
|
||||||
@ -413,6 +416,16 @@ CYASSL_API int CyaSSL_X509_STORE_CTX_get_error_depth(CYASSL_X509_STORE_CTX*);
|
|||||||
CYASSL_API char* CyaSSL_X509_NAME_oneline(CYASSL_X509_NAME*, char*, int);
|
CYASSL_API char* CyaSSL_X509_NAME_oneline(CYASSL_X509_NAME*, char*, int);
|
||||||
CYASSL_API CYASSL_X509_NAME* CyaSSL_X509_get_issuer_name(CYASSL_X509*);
|
CYASSL_API CYASSL_X509_NAME* CyaSSL_X509_get_issuer_name(CYASSL_X509*);
|
||||||
CYASSL_API CYASSL_X509_NAME* CyaSSL_X509_get_subject_name(CYASSL_X509*);
|
CYASSL_API CYASSL_X509_NAME* CyaSSL_X509_get_subject_name(CYASSL_X509*);
|
||||||
|
CYASSL_API int CyaSSL_X509_ext_isSet_by_NID(CYASSL_X509*, int);
|
||||||
|
CYASSL_API int CyaSSL_X509_ext_get_critical_by_NID(CYASSL_X509*, int);
|
||||||
|
CYASSL_API int CyaSSL_X509_get_isCA(CYASSL_X509*);
|
||||||
|
CYASSL_API int CyaSSL_X509_get_isSet_pathLength(CYASSL_X509*);
|
||||||
|
CYASSL_API unsigned int CyaSSL_X509_get_pathLength(CYASSL_X509*);
|
||||||
|
CYASSL_API unsigned int CyaSSL_X509_get_keyUsage(CYASSL_X509*);
|
||||||
|
CYASSL_API unsigned char* CyaSSL_X509_get_authorityKeyID(
|
||||||
|
CYASSL_X509*, unsigned char*, int*);
|
||||||
|
CYASSL_API unsigned char* CyaSSL_X509_get_subjectKeyID(
|
||||||
|
CYASSL_X509*, unsigned char*, int*);
|
||||||
CYASSL_API int CyaSSL_X509_NAME_entry_count(CYASSL_X509_NAME*);
|
CYASSL_API int CyaSSL_X509_NAME_entry_count(CYASSL_X509_NAME*);
|
||||||
CYASSL_API int CyaSSL_X509_NAME_get_text_by_NID(
|
CYASSL_API int CyaSSL_X509_NAME_get_text_by_NID(
|
||||||
CYASSL_X509_NAME*, int, char*, int);
|
CYASSL_X509_NAME*, int, char*, int);
|
||||||
|
@ -1271,6 +1271,31 @@ void InitX509(CYASSL_X509* x509, int dynamicFlag)
|
|||||||
x509->altNames = NULL;
|
x509->altNames = NULL;
|
||||||
x509->altNamesNext = NULL;
|
x509->altNamesNext = NULL;
|
||||||
x509->dynamicMemory = (byte)dynamicFlag;
|
x509->dynamicMemory = (byte)dynamicFlag;
|
||||||
|
x509->isCa = 0;
|
||||||
|
#ifdef OPENSSL_EXTRA
|
||||||
|
x509->pathLength = 0;
|
||||||
|
x509->basicConstSet = 0;
|
||||||
|
x509->basicConstCrit = 0;
|
||||||
|
x509->basicConstPlSet = 0;
|
||||||
|
x509->subjAltNameSet = 0;
|
||||||
|
x509->subjAltNameCrit = 0;
|
||||||
|
x509->authKeyIdSet = 0;
|
||||||
|
x509->authKeyIdCrit = 0;
|
||||||
|
XMEMSET(x509->authKeyId, 0, SHA_SIZE);
|
||||||
|
x509->subjKeyIdSet = 0;
|
||||||
|
x509->subjKeyIdCrit = 0;
|
||||||
|
XMEMSET(x509->subjKeyId, 0, SHA_SIZE);
|
||||||
|
x509->keyUsageSet = 0;
|
||||||
|
x509->keyUsageCrit = 0;
|
||||||
|
x509->keyUsage = 0;
|
||||||
|
#ifdef HAVE_ECC
|
||||||
|
x509->pkCurveOID = 0;
|
||||||
|
#endif /* HAVE_ECC */
|
||||||
|
#ifdef CYASSL_SEP
|
||||||
|
x509->certPolicySet = 0;
|
||||||
|
x509->certPolicyCrit = 0;
|
||||||
|
#endif /* CYASSL_SEP */
|
||||||
|
#endif /* OPENSSL_EXTRA */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -3156,6 +3181,33 @@ int CopyDecodedToX509(CYASSL_X509* x509, DecodedCert* dCert)
|
|||||||
dCert->altNames = NULL; /* takes ownership */
|
dCert->altNames = NULL; /* takes ownership */
|
||||||
x509->altNamesNext = x509->altNames; /* index hint */
|
x509->altNamesNext = x509->altNames; /* index hint */
|
||||||
|
|
||||||
|
x509->isCa = dCert->isCA;
|
||||||
|
#ifdef OPENSSL_EXTRA
|
||||||
|
x509->pathLength = dCert->pathLength;
|
||||||
|
x509->keyUsage = dCert->extKeyUsage;
|
||||||
|
|
||||||
|
x509->basicConstSet = dCert->extBasicConstSet;
|
||||||
|
x509->basicConstCrit = dCert->extBasicConstCrit;
|
||||||
|
x509->basicConstPlSet = dCert->extBasicConstPlSet;
|
||||||
|
x509->subjAltNameSet = dCert->extSubjAltNameSet;
|
||||||
|
x509->subjAltNameCrit = dCert->extSubjAltNameCrit;
|
||||||
|
x509->authKeyIdSet = dCert->extAuthKeyIdSet;
|
||||||
|
x509->authKeyIdCrit = dCert->extAuthKeyIdCrit;
|
||||||
|
XMEMCPY(x509->authKeyId, dCert->extAuthKeyId, SHA_SIZE);
|
||||||
|
x509->subjKeyIdSet = dCert->extSubjKeyIdSet;
|
||||||
|
x509->subjKeyIdCrit = dCert->extSubjKeyIdCrit;
|
||||||
|
XMEMCPY(x509->subjKeyId, dCert->extSubjKeyId, SHA_SIZE);
|
||||||
|
x509->keyUsageSet = dCert->extKeyUsageSet;
|
||||||
|
x509->keyUsageCrit = dCert->extKeyUsageCrit;
|
||||||
|
#ifdef HAVE_ECC
|
||||||
|
x509->pkCurveOID = dCert->pkCurveOID;
|
||||||
|
#endif /* HAVE_ECC */
|
||||||
|
#ifdef CYASSL_SEP
|
||||||
|
x509->certPolicySet = dCert->extCertPolicySet;
|
||||||
|
x509->certPolicyCrit = dCert->extCertPolicyCrit;
|
||||||
|
#endif /* CYASSL_SEP */
|
||||||
|
#endif /* OPENSSL_EXTRA */
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
167
src/ssl.c
167
src/ssl.c
@ -7092,6 +7092,170 @@ int CyaSSL_set_compression(CYASSL* ssl)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef OPENSSL_EXTRA
|
||||||
|
int CyaSSL_X509_ext_isSet_by_NID(CYASSL_X509* x509, int nid)
|
||||||
|
{
|
||||||
|
int isSet = 0;
|
||||||
|
|
||||||
|
CYASSL_ENTER("CyaSSL_X509_ext_isSet_by_NID");
|
||||||
|
|
||||||
|
if (x509 != NULL) {
|
||||||
|
switch (nid) {
|
||||||
|
case BASIC_CA_OID: isSet = x509->basicConstSet; break;
|
||||||
|
case ALT_NAMES_OID: isSet = x509->subjAltNameSet; break;
|
||||||
|
case AUTH_KEY_OID: isSet = x509->authKeyIdSet; break;
|
||||||
|
case SUBJ_KEY_OID: isSet = x509->subjKeyIdSet; break;
|
||||||
|
case KEY_USAGE_OID: isSet = x509->keyUsageSet; break;
|
||||||
|
#ifdef CYASSL_SEP
|
||||||
|
case CERT_POLICY_OID: isSet = x509->certPolicySet; break;
|
||||||
|
#endif /* CYASSL_SEP */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CYASSL_LEAVE("CyaSSL_X509_ext_isSet_by_NID", isSet);
|
||||||
|
|
||||||
|
return isSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int CyaSSL_X509_ext_get_critical_by_NID(CYASSL_X509* x509, int nid)
|
||||||
|
{
|
||||||
|
int crit = 0;
|
||||||
|
|
||||||
|
CYASSL_ENTER("CyaSSL_X509_ext_get_critical_by_NID");
|
||||||
|
|
||||||
|
if (x509 != NULL) {
|
||||||
|
switch (nid) {
|
||||||
|
case BASIC_CA_OID: crit = x509->basicConstCrit; break;
|
||||||
|
case ALT_NAMES_OID: crit = x509->subjAltNameCrit; break;
|
||||||
|
case AUTH_KEY_OID: crit = x509->authKeyIdCrit; break;
|
||||||
|
case SUBJ_KEY_OID: crit = x509->subjKeyIdCrit; break;
|
||||||
|
case KEY_USAGE_OID: crit = x509->keyUsageCrit; break;
|
||||||
|
#ifdef CYASSL_SEP
|
||||||
|
case CERT_POLICY_OID: crit = x509->certPolicyCrit; break;
|
||||||
|
#endif /* CYASSL_SEP */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CYASSL_LEAVE("CyaSSL_X509_ext_get_critical_by_NID", crit);
|
||||||
|
|
||||||
|
return crit;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
int CyaSSL_X509_get_isCA(CYASSL_X509* x509)
|
||||||
|
{
|
||||||
|
int isCA = 0;
|
||||||
|
|
||||||
|
CYASSL_ENTER("CyaSSL_X509_get_isCA");
|
||||||
|
|
||||||
|
if (x509 != NULL)
|
||||||
|
isCA = x509->isCa;
|
||||||
|
|
||||||
|
CYASSL_LEAVE("CyaSSL_X509_get_isCA", isCA);
|
||||||
|
|
||||||
|
return isCA;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef OPENSSL_EXTRA
|
||||||
|
int CyaSSL_X509_get_isSet_pathLength(CYASSL_X509* x509)
|
||||||
|
{
|
||||||
|
int isSet = 0;
|
||||||
|
|
||||||
|
CYASSL_ENTER("CyaSSL_X509_get_isSet_pathLength");
|
||||||
|
|
||||||
|
if (x509 != NULL)
|
||||||
|
isSet = x509->basicConstPlSet;
|
||||||
|
|
||||||
|
CYASSL_LEAVE("CyaSSL_X509_get_isSet_pathLength", isSet);
|
||||||
|
|
||||||
|
return isSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
word32 CyaSSL_X509_get_pathLength(CYASSL_X509* x509)
|
||||||
|
{
|
||||||
|
word32 pathLength = 0;
|
||||||
|
|
||||||
|
CYASSL_ENTER("CyaSSL_X509_get_pathLength");
|
||||||
|
|
||||||
|
if (x509 != NULL)
|
||||||
|
pathLength = x509->pathLength;
|
||||||
|
|
||||||
|
CYASSL_LEAVE("CyaSSL_X509_get_pathLength", pathLength);
|
||||||
|
|
||||||
|
return pathLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unsigned int CyaSSL_X509_get_keyUsage(CYASSL_X509* x509)
|
||||||
|
{
|
||||||
|
word16 usage = 0;
|
||||||
|
|
||||||
|
CYASSL_ENTER("CyaSSL_X509_get_keyUsage");
|
||||||
|
|
||||||
|
if (x509 != NULL)
|
||||||
|
usage = x509->keyUsage;
|
||||||
|
|
||||||
|
CYASSL_LEAVE("CyaSSL_X509_get_keyUsage", usage);
|
||||||
|
|
||||||
|
return usage;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
byte* CyaSSL_X509_get_authorityKeyID(
|
||||||
|
CYASSL_X509* x509, byte* dst, int* dstLen)
|
||||||
|
{
|
||||||
|
byte *id = NULL;
|
||||||
|
int copySz = min(dstLen != NULL ? *dstLen : 0, SHA_SIZE);
|
||||||
|
|
||||||
|
CYASSL_ENTER("CyaSSL_X509_get_authorityKeyID");
|
||||||
|
|
||||||
|
if (x509 != NULL) {
|
||||||
|
if (x509->authKeyIdSet)
|
||||||
|
id = x509->authKeyId;
|
||||||
|
|
||||||
|
if (dst != NULL && dstLen != NULL && id != NULL && copySz > 0) {
|
||||||
|
XMEMCPY(dst, id, copySz);
|
||||||
|
id = dst;
|
||||||
|
*dstLen = copySz;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CYASSL_LEAVE("CyaSSL_X509_get_authorityKeyID", copySz);
|
||||||
|
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
byte* CyaSSL_X509_get_subjectKeyID(
|
||||||
|
CYASSL_X509* x509, byte* dst, int* dstLen)
|
||||||
|
{
|
||||||
|
byte *id = NULL;
|
||||||
|
int copySz = min(dstLen != NULL ? *dstLen : 0, SHA_SIZE);
|
||||||
|
|
||||||
|
CYASSL_ENTER("CyaSSL_X509_get_subjectKeyID");
|
||||||
|
|
||||||
|
if (x509 != NULL) {
|
||||||
|
if (x509->subjKeyIdSet)
|
||||||
|
id = x509->subjKeyId;
|
||||||
|
|
||||||
|
if (dst != NULL && dstLen != NULL && id != NULL && copySz > 0) {
|
||||||
|
XMEMCPY(dst, id, copySz);
|
||||||
|
id = dst;
|
||||||
|
*dstLen = copySz;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CYASSL_LEAVE("CyaSSL_X509_get_subjectKeyID", copySz);
|
||||||
|
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* copy name into in buffer, at most sz bytes, if buffer is null will
|
/* copy name into in buffer, at most sz bytes, if buffer is null will
|
||||||
malloc buffer, call responsible for freeing */
|
malloc buffer, call responsible for freeing */
|
||||||
char* CyaSSL_X509_NAME_oneline(CYASSL_X509_NAME* name, char* in, int sz)
|
char* CyaSSL_X509_NAME_oneline(CYASSL_X509_NAME* name, char* in, int sz)
|
||||||
@ -8373,6 +8537,9 @@ CYASSL_X509* CyaSSL_X509_load_certificate_file(const char* fname, int format)
|
|||||||
XMEMCPY(key->pkey.ptr,
|
XMEMCPY(key->pkey.ptr,
|
||||||
x509->pubKey.buffer, x509->pubKey.length);
|
x509->pubKey.buffer, x509->pubKey.length);
|
||||||
key->pkey_sz = x509->pubKey.length;
|
key->pkey_sz = x509->pubKey.length;
|
||||||
|
#ifdef HAVE_ECC
|
||||||
|
key->pkey_curve = (int)x509->pkCurveOID;
|
||||||
|
#endif /* HAVE_ECC */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return key;
|
return key;
|
||||||
|
Reference in New Issue
Block a user