summaryrefslogtreecommitdiff
path: root/src/SSL_Certificate.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/SSL_Certificate.c')
-rw-r--r--src/SSL_Certificate.c1060
1 files changed, 103 insertions, 957 deletions
diff --git a/src/SSL_Certificate.c b/src/SSL_Certificate.c
index 1d25e21..f0b6b2d 100644
--- a/src/SSL_Certificate.c
+++ b/src/SSL_Certificate.c
@@ -25,11 +25,9 @@
#include "SSL_Certificate.h"
#include "SSL_Proc.h"
-//debug
-#define PRINTF_CERTIFICATE 0
-
#define CERT_VER_MAXNUM 3
-const stValueString_t g_astCertVersions[] =
+
+const struct ssl_value2string g_certificate_version[] =
{
{ 0, "v1" },
{ 1, "v2" },
@@ -38,7 +36,7 @@ const stValueString_t g_astCertVersions[] =
{ 0, NULL },
};
-const stSerialString_t g_astAlgrithomTypes[] =
+const struct ssl_serial_string g_astAlgrithomTypes[] =
{
{{0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x02}, "md2"},
{{0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x02, 0x04}, "md4"},
@@ -52,7 +50,7 @@ const stSerialString_t g_astAlgrithomTypes[] =
{{0}, NULL},
};
-const stSerialString_t g_astUserItemId[] =
+const struct ssl_serial_string g_astUserItemId[] =
{
{{0X55, 0X04, 0X03}, "commonName"},
{{0X55, 0X04, 0x0a}, "organizationName"},
@@ -72,7 +70,7 @@ int ssl_read_specific_cert(const char* conj_cert_buf, uint32_t conj_buflen, uint
uint32_t unproc_certlen = conj_buflen;
char* cur_cert = NULL;
uint32_t cert_unit_cnt = 0;
- cert_chain_t cert_unit[CERT_TYPE_MAXNUM];
+ struct ssl_certificate_chain cert_unit[CERT_TYPE_MAXNUM];
while (unproc_certlen > 0)
{
@@ -144,7 +142,7 @@ int ssl_read_specific_cert(const char* conj_cert_buf, uint32_t conj_buflen, uint
}
/*return : chain ����*/
-int ssl_read_all_cert(const char* conj_cert_buf, uint32_t conj_buflen, cert_chain_t* cert_unit, uint32_t unit_size)
+int ssl_read_all_cert(const char* conj_cert_buf, uint32_t conj_buflen, struct ssl_certificate_chain* cert_unit, uint32_t unit_size)
{
if(NULL==conj_cert_buf || 0==conj_buflen) return 0;
char* unproc_cert = (char*)conj_cert_buf;
@@ -152,892 +150,33 @@ int ssl_read_all_cert(const char* conj_cert_buf, uint32_t conj_buflen, cert_chai
char* cur_cert = NULL;
uint32_t cert_unit_cnt = 0;
- while ((int)unproc_certlen > 0)
- {
+ while ((int)unproc_certlen > 0)
+ {
if(cert_unit_cnt>=unit_size)
{
break;
}
+
cert_unit[cert_unit_cnt].cert_len = BtoL3BytesNum(unproc_cert);
if((int)cert_unit[cert_unit_cnt].cert_len <0 || cert_unit[cert_unit_cnt].cert_len+SSL_CERTIFICATE_HDRLEN>unproc_certlen)
{
break;
}
+
cur_cert = unproc_cert+SSL_CERTIFICATE_HDRLEN;
- cert_unit[cert_unit_cnt].cert = cur_cert;
- unproc_certlen -= (SSL_CERTIFICATE_HDRLEN+cert_unit[cert_unit_cnt].cert_len);
+ cert_unit[cert_unit_cnt].cert=cur_cert;
+ unproc_certlen -= (SSL_CERTIFICATE_HDRLEN+cert_unit[cert_unit_cnt].cert_len);
unproc_cert += SSL_CERTIFICATE_HDRLEN+cert_unit[cert_unit_cnt].cert_len;
- cert_unit_cnt++;
-
- }
- return cert_unit_cnt;
-}
-
-
-UCHAR ssl_Certificate(char *pcSslCertificateData, int iDataLen, ssl_stream *a_ssl_stream, struct streaminfo* a_tcp,
- unsigned long long region_flag, int thread_seq, void* a_packet)
-{
- int iUnAnaCertLen = iDataLen;
- char *pcCurSslCertificateData = pcSslCertificateData;
- while (iUnAnaCertLen > 0)
- {
- a_ssl_stream->stSSLCert->certlen = BtoL3BytesNum(pcCurSslCertificateData);
- if (a_ssl_stream->stSSLCert->certlen + SSL_CERTIFICATE_HDRLEN > iUnAnaCertLen)
- {
- /**packet trunked is impossible**/
- break;
- }
- pcCurSslCertificateData += SSL_CERTIFICATE_HDRLEN;
- iUnAnaCertLen -= SSL_CERTIFICATE_HDRLEN;
- a_ssl_stream->p_output_buffer->p_data = pcCurSslCertificateData;
- a_ssl_stream->p_output_buffer->data_size = a_ssl_stream->stSSLCert->certlen;
- a_ssl_stream->output_region_mask = SSL_CERTIFICATE_MASK;
- int return_val = ssl_doWithCertificate(&a_ssl_stream, a_tcp, region_flag, thread_seq, a_packet);
- a_ssl_stream->p_output_buffer->p_data = NULL;
- a_ssl_stream->p_output_buffer->data_size = 0;
- if(SSL_RETURN_NORM != return_val)
- {
- return return_val;
- }
- pcCurSslCertificateData += a_ssl_stream->stSSLCert->certlen;
- iUnAnaCertLen -= a_ssl_stream->stSSLCert->certlen;
- }
- return SSL_RETURN_NORM;
-}
-
-void cert_log(ssl_stream *a_ssl_stream)
-{
- FILE* pFile = NULL;
- time_t currTime;
- struct tm *now;
- char strTime[32];
- char logTime[32];
- char filename[64] = {0};
- time(&currTime);
- now = localtime(&currTime);
- memset(strTime, 0, sizeof(strTime) );
- memset(logTime, 0, sizeof(logTime) );
- strftime(strTime, sizeof(strTime), "%Y-%m-%d %H:%M:%S", now);
- strftime(logTime, sizeof(logTime), "%Y-%m-%d", now);
- strcpy(filename, "./ssl_log/ssl_cert_log_");
- strcat(filename, logTime);
- if(((pFile = fopen(filename, "a+"))!=NULL))
- {
- fprintf(pFile,"%s=SSLIssuer==%s\n",strTime, a_ssl_stream->stSSLCert->SSLIssuer);
- fprintf(pFile,"%s=SSLSub==%s\n",strTime, a_ssl_stream->stSSLCert->SSLSub);
- fclose(pFile);
- }
-}
-
-UCHAR ssl_AnalyseCertificate(char *pcSslCertificateData, int iDataLen, ssl_stream *a_ssl_stream, struct streaminfo* a_tcp,
- unsigned long long region_flag, int thread_seq, void* a_packet)
-{
- int iUnAnaCertLen = iDataLen;
- char *pcCurSslCertificateData = pcSslCertificateData;
- int return_val;
- cert_chain_t cert_unit[CERT_MAXNUM];
- int cert_num = 0;
- int cert_cnt = ssl_read_all_cert(pcCurSslCertificateData, iUnAnaCertLen, cert_unit, CERT_MAXNUM);
-
- int i=0;
- int totallen = a_ssl_stream->stSSLCert->totallen;
- for(i=0;i<cert_cnt;i++)
- {
- a_ssl_stream->stSSLCert->totallen = totallen;
- return_val = fn_pGetSSLInfo(cert_unit[i].cert, cert_unit[i].cert_len, a_ssl_stream, a_tcp, region_flag, thread_seq, a_packet);
- if( SSL_RETURN_NORM != return_val) return return_val;
-
- a_ssl_stream->stSSLCert->certlen = cert_unit[i].cert_len;
- a_ssl_stream->output_region_mask = SSL_CERTIFICATE_DETAIL_MASK;
- a_ssl_stream->p_output_buffer->p_data = cert_unit[i].cert;
- a_ssl_stream->p_output_buffer->data_size = a_ssl_stream->stSSLCert->certlen;
-
- switch(cert_num)
- {
- case 0:
- a_ssl_stream->stSSLCert->cert_type = CERT_TYPE_INDIVIDUAL;
- break;
- case 1:
- if(cert_cnt==2)
- {
- a_ssl_stream->stSSLCert->cert_type = CERT_TYPE_ROOT;
- }
- else
- {
- a_ssl_stream->stSSLCert->cert_type = CERT_TYPE_MIDDLE;
- }
- break;
- case 2:
- if(cert_cnt==3)
- {
- a_ssl_stream->stSSLCert->cert_type = CERT_TYPE_ROOT;
- }
- else
- {
- a_ssl_stream->stSSLCert->cert_type = CERT_TYPE_CHAIN;
- }
- break;
- default:
- if(cert_num==cert_cnt-1)
- {
- a_ssl_stream->stSSLCert->cert_type = CERT_TYPE_ROOT;
- }
- else
- {
- a_ssl_stream->stSSLCert->cert_type = CERT_TYPE_CHAIN;
- }
- break;
- }
- return_val = ssl_doWithCertificateDetail(&a_ssl_stream, a_tcp, region_flag, thread_seq, a_packet);
- a_ssl_stream->p_output_buffer->p_data = NULL;
- a_ssl_stream->p_output_buffer->data_size = 0;
- cert_num++;
- /*�ͷ�san�ڴ�*/
- if(a_ssl_stream->stSSLCert->SSLSubAltName!=NULL)
- {
- if(a_ssl_stream->stSSLCert->SSLSubAltName->san_array!=NULL)
- {
- dictator_free(thread_seq,a_ssl_stream->stSSLCert->SSLSubAltName->san_array);
- a_ssl_stream->stSSLCert->SSLSubAltName->san_array = NULL;
- }
- dictator_free(thread_seq,a_ssl_stream->stSSLCert->SSLSubAltName);
- a_ssl_stream->stSSLCert->SSLSubAltName = NULL;
- }
- if(a_ssl_stream->stSSLCert->SSLSubKey!=NULL)
- {
- dictator_free(thread_seq,a_ssl_stream->stSSLCert->SSLSubKey);
- a_ssl_stream->stSSLCert->SSLSubKey = NULL;
- }
-#if PRINTF_CERTIFICATE
- cert_log(a_ssl_stream);
-#endif
- memset(a_ssl_stream->stSSLCert,0,sizeof(st_cert_t));
- if(SSL_RETURN_NORM != return_val && SSL_RETURN_UNNORM != return_val ) return return_val;
- }
- return SSL_RETURN_NORM;
-}
-
-
-char *fn_pcGetElemType(const unsigned char *pucId, int iIdLen, stSerialString_t *pastElemTypes)
-{
- int iLoop = 0;
- int iInLoop = 0;
-
- if (NULL == pucId || iIdLen < 0 || NULL == pastElemTypes)
- {
- return NULL;
- }
-
- for (iLoop = 0; NULL != pastElemTypes[iLoop].pcString; ++iLoop)
- {
- int iAlgIdLen = strlen((const char *)pastElemTypes[iLoop].aucSerial);
-
- if (iAlgIdLen != iIdLen)
- {
- continue;
- }
-
- for (iInLoop = 0; iInLoop < iAlgIdLen; ++iInLoop)
- {
- if (pucId[iInLoop] != pastElemTypes[iLoop].aucSerial[iInLoop])
- {
- //continue;
- break;
- }
- }
-
- if (iInLoop == iAlgIdLen)
- {
- return (char *)(pastElemTypes[iLoop].pcString);
- }
- }
-
- return NULL;
-}
-
-UCHAR fn_pGetSSLInfo_v1(char *pcCert, int iLen, ssl_stream *a_ssl_stream, struct streaminfo *a_tcp,
- unsigned long long region_flag, int thread_seq, void *a_packet)
-
-{
- /**variable define and initialise**/
- int iUnAnalyseLen = iLen;
- char *pcCurData = pcCert;
- char *pcIdString = NULL;
- char *pcCurExtData = NULL;
- char *pcCurElemData = NULL;
- char *pcCurExtItem = NULL;
- char acBuffer[8192] = {0};
- //int iCurExtItemLen; //20220318 cppcheck
- int uiLength = 0;
- int iCurItemLen; //20220318 cppcheck
- int iCurElemLen = 0;
- int iExtenLen = 0;
- int iByteNum = 0;
- int iShowFlag;
- int iLoop = 0;
- st_cert_t *stSSLCert = a_ssl_stream->stSSLCert;
- char* issuer_info = NULL;
- char* sub_info = NULL;
-
- /**validaty check**/
- if (NULL == pcCert || iLen <= 0 || NULL == stSSLCert)
- {
- //printf("1\n");
- return SSL_RETURN_UNNORM;
- }
-
- /**certificate length**/
- uiLength = fn_iSslDecodeTagLength(pcCurData, iUnAnalyseLen, &iByteNum);
- if (uiLength <= 0)
- {
- //printf("2\n");
- return SSL_RETURN_UNNORM;
- }
-
- pcCurData += (iByteNum + 1);
- iUnAnalyseLen -= (iByteNum + 1);
- if (iUnAnalyseLen <= 0)
- {
- // printf("3\n");
- return SSL_RETURN_UNNORM;
- }
-
- /***signed certificate***/
- uiLength = fn_iSslDecodeTagLength(pcCurData, iUnAnalyseLen, &iByteNum);
- if (uiLength <= 0)
- {
- // printf("4\n");
- return SSL_RETURN_UNNORM;
- }
-
- pcCurData = pcCurData + iByteNum + 1;
- iUnAnalyseLen -= (iByteNum + 1);
- if (iUnAnalyseLen <= 0)
- {
- // printf("5\n");
- return SSL_RETURN_UNNORM;
- }
-
- /**version**/
- uiLength = fn_iSslDecodeTagLength(pcCurData, iUnAnalyseLen, &iByteNum);
- if (uiLength <= 0)
- {
- // printf("6\n");
- return SSL_RETURN_UNNORM;
- }
-
- pcCurElemData = pcCurData + iByteNum + 1;
- iCurElemLen = uiLength;
- pcCurData += (iByteNum + 1 + uiLength);
- iUnAnalyseLen -= (iByteNum + 1 + uiLength);
- if (iUnAnalyseLen <= 0)
- {
- // printf("7\n");
- return SSL_RETURN_UNNORM;
- }
-
- /*get the version*/
- uiLength = fn_iSslDecodeTagLength(pcCurElemData, iCurElemLen, &iByteNum);
- if (uiLength <= 0)
- {
- // printf("8\n");
- return SSL_RETURN_UNNORM;
- }
-
- iCurElemLen -= (iByteNum + 1);
- if (0 > iCurElemLen)
- {
- // printf("9\n");
- return SSL_RETURN_UNNORM;
- }
- pcCurElemData += (iByteNum + 1);
-
- if ((unsigned char)pcCurElemData[0] < 3)
- {
- unsigned int i = (unsigned int)pcCurElemData[0];
- memcpy(stSSLCert->SSLVersion, g_astCertVersions[i].pcString, 1 + strlen((const char *)g_astCertVersions[i].pcString));
- }
-
- /**serial number**/
- uiLength = fn_iSslDecodeTagLength(pcCurData, iUnAnalyseLen, &iByteNum);
- if (uiLength <= 0)
- {
- // printf("10\n");
- return SSL_RETURN_UNNORM;
- }
- /*find the serial*/
- iUnAnalyseLen -= (iByteNum + 1 + uiLength);
- if (iUnAnalyseLen <= 0)
- {
- // printf("11\n");
- return SSL_RETURN_UNNORM;
- }
-
-
- for (iLoop = 0; iLoop < (uiLength>=128/3?(128/3-1):uiLength); ++iLoop)
- {
- fn_vPrintNum(stSSLCert->SSLSerialNum+3*iLoop, (unsigned char)pcCurData[iByteNum + 1+iLoop]);
- stSSLCert->SSLSerialNum[3*(1+iLoop)-1] = ' ';
- stSSLCert->SSLSerialNum[3*(1+iLoop)] = '\0';
- }
-
- //memcpy(stSSLRz->SSLSerialNum, pcCurData+iByteNum + 1, uiLength>=128?127:uiLength);
- //stSSLRz->SSLSerialNum[uiLength>=128?127:uiLength] = '\0';
-
- pcCurData += (iByteNum + 1 + uiLength);
-
- /**signature**/
- uiLength = fn_iSslDecodeTagLength(pcCurData, iUnAnalyseLen, &iByteNum);
- if (uiLength <= 0)
- {
- // printf("12\n");
- return SSL_RETURN_UNNORM;
- }
-
- pcCurElemData = pcCurData + iByteNum + 1;
- iCurElemLen = uiLength;
- pcCurData += (iByteNum + 1 + uiLength);
- iUnAnalyseLen -= (iByteNum + 1 + uiLength);
- if (iUnAnalyseLen <= 0)
- {
- // printf("13\n");
- return SSL_RETURN_UNNORM;
- }
- /*get the signature info*/
- uiLength = fn_iSslDecodeTagLength(pcCurElemData, iCurElemLen, &iByteNum);
- if (uiLength <= 0)
- {
- // printf("14\n");
- return SSL_RETURN_UNNORM;
- }
-
- iCurElemLen -= (iByteNum + 1);
- if (0 > iCurElemLen)
- {
- // printf("15\n");
- return SSL_RETURN_UNNORM;
- }
- pcCurElemData += (iByteNum + 1);
-
- pcIdString = fn_pcGetElemType((unsigned char *)pcCurElemData, uiLength, (stSerialString_t*)g_astAlgrithomTypes);
- if (NULL != pcIdString)
- {
- memcpy(stSSLCert->SSLAgID, pcIdString, 1 + strlen((const char *)pcIdString));
- }
-
-
- /**issuer**/
- uiLength = fn_iSslDecodeTagLength(pcCurData, iUnAnalyseLen, &iByteNum);
- if (uiLength <= 0)
- {
- // printf("16\n");
- return SSL_RETURN_UNNORM;
- }
- iUnAnalyseLen -= (iByteNum + 1 + uiLength);
- if (iUnAnalyseLen <= 0)
- {
- // printf("17\n");
- return SSL_RETURN_UNNORM;
- }
- pcCurElemData = pcCurData + iByteNum + 1;
- iCurElemLen = uiLength;
- pcCurData += (iByteNum + 1 + uiLength);
-
-
- /*get the issuer info*/
- while (iCurElemLen > 0)
- {
- uiLength = fn_iSslDecodeTagLength(pcCurElemData, iCurElemLen, &iByteNum);
- if (uiLength <= 0)
- {
- // printf("18\n");
- return SSL_RETURN_UNNORM;
- }
-
- iCurElemLen -= (iByteNum + 1);
- if (0 > iCurElemLen)
- {
- // printf("19\n");
- return SSL_RETURN_UNNORM;
- }
- pcCurElemData += (iByteNum + 1);
-
- uiLength = fn_iSslDecodeTagLength(pcCurElemData, iCurElemLen, &iByteNum);
- if (uiLength <= 0)
- {
- // printf("20\n");
- return SSL_RETURN_UNNORM;
- }
-
- iCurElemLen -= (iByteNum + 1);
- if (0 > iCurElemLen)
- {
- // printf("21\n");
- return SSL_RETURN_UNNORM;
- }
- pcCurElemData += (iByteNum + 1);
-
- /*next level:first elem*/
- uiLength = fn_iSslDecodeTagLength(pcCurElemData, iCurElemLen, &iByteNum);
- if (uiLength <= 0)
- {
- // printf("22\n");
- return SSL_RETURN_UNNORM;
- }
-
- iCurElemLen -= (iByteNum + 1 + uiLength);
- if (0 > iCurElemLen)
- {
- // printf("23\n");
- return SSL_RETURN_UNNORM;
- }
- pcCurElemData += (iByteNum + 1);
- issuer_info = NULL;
- issuer_info = fn_pcGetElemType((unsigned char *)pcCurElemData, uiLength, (stSerialString_t*)g_astUserItemId);
- if (NULL == issuer_info)
- {
- iShowFlag = 0;
- }
- else
- {
- iShowFlag = 1;
- }
- pcCurElemData += uiLength;
- /*second elem*/
- uiLength = fn_iSslDecodeTagLength(pcCurElemData, iCurElemLen, &iByteNum);
- if (uiLength <= 0)
- {
- // printf("24\n");
- return SSL_RETURN_UNNORM;
- }
-
- iCurElemLen -= (iByteNum + 1);
- if (0 > iCurElemLen)
- {
- // printf("25\n");
- return SSL_RETURN_UNNORM;
- }
- pcCurElemData += (iByteNum + 1);
-
- if (1 == iShowFlag)
- {
- //malformation ssl certificate
- if(uiLength>(int)sizeof(acBuffer))
- {
- return SSL_RETURN_DROPME;
- }
- /*issuer detail*/
- if(0==strncmp(issuer_info, "commonName", strlen("commonName")))
- {
- memcpy(stSSLCert->SSLIssuerCN, pcCurElemData, uiLength >= 64 ? 63 : uiLength);
- stSSLCert->SSLIssuerCN[uiLength >= 64 ? 63 : uiLength] = '\0';
- }
- else if(0==strncmp(issuer_info, "organizationName", strlen("organizationName")))
- {
- memcpy(stSSLCert->SSLIssuerO, pcCurElemData, uiLength >= 64? 63 : uiLength);
- stSSLCert->SSLIssuerO[uiLength >= 64 ? 63 : uiLength] = '\0';
- }
- else if(0==strncmp(issuer_info, "countryName", strlen("countryName")))
- {
- memcpy(stSSLCert->SSLIssuerC, pcCurElemData, uiLength >= 64 ? 63 : uiLength);
- stSSLCert->SSLIssuerC[uiLength >= 64 ? 63 : uiLength] = '\0';
- }
- else
- {
- /*not proc*/
- }
- memcpy(acBuffer, pcCurElemData, uiLength);
- acBuffer[uiLength] = ';';
- acBuffer[uiLength+1] = '\0';
- memcpy(acBuffer+strlen((const char *)acBuffer), stSSLCert->SSLIssuer, 1 + strlen((const char *)stSSLCert->SSLIssuer));
- iCurItemLen = strlen((const char *)acBuffer);
- memcpy(stSSLCert->SSLIssuer, acBuffer, iCurItemLen >= 512 ? 511 : iCurItemLen);
- stSSLCert->SSLIssuer[ iCurItemLen >= 512 ? 511 : iCurItemLen] = '\0';
- }
-
- iCurElemLen -= uiLength;
- pcCurElemData += uiLength;
- }
-
-
- /**validaty**/
- uiLength = fn_iSslDecodeTagLength(pcCurData, iUnAnalyseLen, &iByteNum);
- if (uiLength <= 0)
- {
- return SSL_RETURN_UNNORM;
- }
- pcCurElemData = pcCurData + iByteNum + 1;
- iCurElemLen = uiLength;
- pcCurData += (iByteNum + 1 + uiLength);
- iUnAnalyseLen -= (iByteNum + 1 + uiLength);
- if (iUnAnalyseLen <= 0)
- {
- return SSL_RETURN_UNNORM;
- }
- /*get the validaty info*/
- uiLength = fn_iSslDecodeTagLength(pcCurElemData, iCurElemLen, &iByteNum);
- if (uiLength <= 0)
- {
- // printf("26\n");
- return SSL_RETURN_UNNORM;
- }
-
- iCurElemLen -= (iByteNum + 1);
- if (0 > iCurElemLen)
- {
- // printf("27\n");
- return SSL_RETURN_UNNORM;
- }
- pcCurElemData += (iByteNum + 1);
-
- /*utcTime*/
- if (0x0d == uiLength && 0x5a == pcCurElemData[uiLength-1])
- {
- unsigned int str_len = 0;
- sprintf(stSSLCert->SSLFrom, "%c%c-%c%c-%c%c %c%c:%c%c:%c%c(UTC)", pcCurElemData[0], pcCurElemData[1], pcCurElemData[2], pcCurElemData[3],
- pcCurElemData[4], pcCurElemData[5], pcCurElemData[6], pcCurElemData[7], pcCurElemData[8], pcCurElemData[9], pcCurElemData[10], pcCurElemData[11]);
- str_len = MIN(strlen(stSSLCert->SSLFrom), (sizeof(stSSLCert->SSLFrom)-1));
- stSSLCert->SSLFrom[str_len] = '\0';
+ cert_unit_cnt++;
}
- //else if (1)
- else
- {
- /*generalizedTime*/
- memcpy(stSSLCert->SSLFrom, pcCurElemData, uiLength>=80?79:uiLength);
- stSSLCert->SSLFrom[uiLength>=80?79:uiLength] = '\0';
- }
-
- pcCurElemData += uiLength;
-
- uiLength = fn_iSslDecodeTagLength(pcCurElemData, iCurElemLen, &iByteNum);
- if (uiLength <= 0)
- {
- // printf("28\n");
- return SSL_RETURN_UNNORM;
- }
-
- iCurElemLen -= (iByteNum + 1 - uiLength);
- if (0 > iCurElemLen)
- {
- // printf("29\n");
- return SSL_RETURN_UNNORM;
- }
- pcCurElemData += (iByteNum + 1);
-
- if (0x0d == uiLength && 0x5a == pcCurElemData[uiLength-1])
- {
- unsigned int str_len = 0;
- sprintf(stSSLCert->SSLTo, "%c%c-%c%c-%c%c %c%c:%c%c:%c%c(UTC)", pcCurElemData[0], pcCurElemData[1], pcCurElemData[2], pcCurElemData[3],
- pcCurElemData[4], pcCurElemData[5], pcCurElemData[6], pcCurElemData[7], pcCurElemData[8], pcCurElemData[9], pcCurElemData[10], pcCurElemData[11]);
- str_len = MIN(strlen(stSSLCert->SSLTo), (sizeof(stSSLCert->SSLTo)-1));
- stSSLCert->SSLTo[str_len] = '\0';
- }
-// else if (1)
- else
- {
- /*generalizedTime*/
- memcpy(stSSLCert->SSLTo, pcCurElemData, uiLength>=80?79:uiLength);
- stSSLCert->SSLTo[uiLength>=80?79:uiLength] = '\0';
- }
-
- /**subject**/
- uiLength = fn_iSslDecodeTagLength(pcCurData, iUnAnalyseLen, &iByteNum);
- if (uiLength <= 0)
- {
- // printf("30\n");
- return SSL_RETURN_UNNORM;
- }
- iUnAnalyseLen -= (iByteNum + 1 + uiLength);
- if (iUnAnalyseLen <= 0)
- {
- return SSL_RETURN_UNNORM;
- }
- //memcpy(stSSLRz->SSLSub, pcCurData+iByteNum + 1, uiLength);
-
- pcCurElemData = pcCurData + (iByteNum + 1);
- iCurElemLen = uiLength;
-
- pcCurData += (iByteNum + 1 + uiLength);
-
- /*get the subject info*/
- while (iCurElemLen > 0)
- {
- uiLength = fn_iSslDecodeTagLength(pcCurElemData, iCurElemLen, &iByteNum);
- if (uiLength <= 0)
- {
- // printf("31\n");
- return SSL_RETURN_UNNORM;
- }
-
- iCurElemLen -= (iByteNum + 1);
- if (0 > iCurElemLen)
- {
- // printf("32\n");
- return SSL_RETURN_UNNORM;
- }
- pcCurElemData += (iByteNum + 1);
-
- uiLength = fn_iSslDecodeTagLength(pcCurElemData, iCurElemLen, &iByteNum);
- if (uiLength <= 0)
- {
- // printf("33\n");
- return SSL_RETURN_UNNORM;
- }
-
- iCurElemLen -= (iByteNum + 1);
- if (0 > iCurElemLen)
- {
- // printf("34\n");
- return SSL_RETURN_UNNORM;
- }
- pcCurElemData += (iByteNum + 1);
-
- /*next level:first elem*/
- uiLength = fn_iSslDecodeTagLength(pcCurElemData, iCurElemLen, &iByteNum);
- if (uiLength <= 0)
- {
- // printf("35\n");
- return SSL_RETURN_UNNORM;
- }
-
- iCurElemLen -= (iByteNum + 1 + uiLength);
- if (0 > iCurElemLen)
- {
- // printf("36\n");
- return SSL_RETURN_UNNORM;
- }
- pcCurElemData += (iByteNum + 1);
- sub_info = fn_pcGetElemType((unsigned char *)pcCurElemData, uiLength, (stSerialString_t*)g_astUserItemId);
- if (NULL == sub_info)
- {
- iShowFlag = 0;
- }
- else
- {
- iShowFlag = 1;
- }
-
- pcCurElemData += uiLength;
- /*second elem*/
- uiLength = fn_iSslDecodeTagLength(pcCurElemData, iCurElemLen, &iByteNum);
- if (uiLength <= 0)
- {
- // printf("37\n");
- return SSL_RETURN_UNNORM;
- }
-
- iCurElemLen -= (iByteNum + 1);
- if (0 > iCurElemLen)
- {
- return SSL_RETURN_UNNORM;
- }
- pcCurElemData += (iByteNum + 1);
-
- if (1 == iShowFlag)
- {
- //malformation ssl certificate
- if(uiLength>(int)sizeof(acBuffer))
- {
- return SSL_RETURN_DROPME;
- }
- /*sub detail*/
- if(0==strncmp(sub_info, "commonName", strlen("commonName")))
- {
- memcpy(stSSLCert->SSLSubCN, pcCurElemData, uiLength >= 64 ? 63 : uiLength);
- stSSLCert->SSLSubCN[uiLength >= 64 ? 63 : uiLength] = '\0';
- }
- else if(0==strncmp(sub_info, "organizationName", strlen("organizationName")))
- {
- memcpy(stSSLCert->SSLSubO, pcCurElemData, uiLength >= 64? 63 : uiLength);
- stSSLCert->SSLSubO[uiLength >= 64 ? 63 : uiLength] = '\0';
- }
- else if(0==strncmp(sub_info, "countryName", strlen("countryName")))
- {
- memcpy(stSSLCert->SSLSubC, pcCurElemData, uiLength >= 64 ? 63 : uiLength);
- stSSLCert->SSLSubC[uiLength >= 64 ? 63 : uiLength] = '\0';
- }
- else
- {
- /*not proc*/
- }
- memcpy(acBuffer, pcCurElemData, uiLength);
- acBuffer[uiLength] = ';';
- acBuffer[uiLength+1] = '\0';
- memcpy(acBuffer+strlen((const char *)acBuffer), stSSLCert->SSLSub, 1 + strlen((const char *)stSSLCert->SSLSub));
- iCurItemLen = strlen((const char *)acBuffer);
- memcpy(stSSLCert->SSLSub, acBuffer, iCurItemLen >= 512 ? 511 : iCurItemLen);
- stSSLCert->SSLSub[iCurItemLen >= 512 ? 511 : iCurItemLen ] = '\0';
- }
- iCurElemLen -= uiLength;
- pcCurElemData += uiLength;
- }
-
- /*add by 20141120*/
- /**subject public key info**/
- uiLength = fn_iSslDecodeTagLength(pcCurData, iUnAnalyseLen, &iByteNum);
- if (uiLength <= 0)
- {
- return SSL_RETURN_UNNORM;
- }
- pcCurData += (iByteNum + 1 + uiLength);
- iUnAnalyseLen -= (iByteNum + 1 + uiLength);
- if (iUnAnalyseLen <= 0)
- {
- return SSL_RETURN_UNNORM;
- }
-
- /**extensions**/
- /*level 1: extention items length*/
- iExtenLen = fn_iSslDecodeTagLength(pcCurData, iUnAnalyseLen, &iByteNum);
- if (iExtenLen <= 0)
- {
- return SSL_RETURN_UNNORM;
- }
- pcCurExtData = pcCurData + iByteNum + 1;
- pcCurData += (iByteNum + 1 + iExtenLen);
- iUnAnalyseLen -= (iByteNum + 1 + iExtenLen);
- if (iUnAnalyseLen < 0)
- {
- return SSL_RETURN_UNNORM;
- }
-
- /*level 2: extention items*/
- iExtenLen = fn_iSslDecodeTagLength(pcCurExtData, iExtenLen, &iByteNum);
- if (iExtenLen <= 0)
- {
- return SSL_RETURN_UNNORM;
- }
- pcCurExtData += (iByteNum + 1);
-
- while (iExtenLen > 0)
- {
- /*current item length*/
- int iCurExtItemLen = fn_iSslDecodeTagLength(pcCurExtData, iExtenLen, &iByteNum);
- if (iCurExtItemLen <= 0)
- {
- return SSL_RETURN_UNNORM;
- }
-
- pcCurExtItem = pcCurExtData + iByteNum + 1;
- pcCurExtData += (iByteNum + 1 + iCurExtItemLen);
- iExtenLen -= (iByteNum + 1 + iCurExtItemLen);
- if (iExtenLen < 0)
- {
- return SSL_RETURN_UNNORM;
- }
-
- /*extention item id length*/
- uiLength = fn_iSslDecodeTagLength(pcCurExtItem, iCurExtItemLen, &iByteNum);
- if (uiLength <= 0)
- {
- return SSL_RETURN_UNNORM;
- }
- pcCurExtItem += (iByteNum + 1);
- iCurExtItemLen -= (iByteNum + 1);
-
- /*alter subject id*/
- if (3 == uiLength && 0x55 == pcCurExtItem[0] && 0x1d == pcCurExtItem[1] && 0x11 == pcCurExtItem[2])
- {
- /*subject alter name*/
- pcCurExtItem += uiLength;
- iCurExtItemLen -= uiLength;
- uiLength = fn_iSslDecodeTagLength(pcCurExtItem, iCurExtItemLen, &iByteNum);
- if (uiLength <= 0)
- {
- return SSL_RETURN_UNNORM;
- }
- pcCurExtItem += (iByteNum + 1);
- iCurExtItemLen -= (iByteNum + 1);
- if (iCurExtItemLen < 0)
- {
- return SSL_RETURN_UNNORM;
- }
- uiLength = fn_iSslDecodeTagLength(pcCurExtItem, iCurExtItemLen, &iByteNum);
- if (uiLength <= 0)
- {
- return SSL_RETURN_UNNORM;
- }
- pcCurExtItem += (iByteNum + 1);
- iCurExtItemLen -= (iByteNum + 1);
- if (iCurExtItemLen < 0)
- {
- return SSL_RETURN_UNNORM;
- }
- /*get the last piece*/
- pcCurElemData = pcCurExtItem;
- iCurElemLen = uiLength;
- //pcCurExtItem += uiLength; //20220318 cppcheck
- //iCurExtItemLen -= uiLength; //20220318 cppcheck
- /*DNS name*/
- if((char)0x82 == pcCurElemData[0])
- {
- /*SAN:subject alter name*/
- uiLength = fn_iSslDecodeTagLength(pcCurElemData, iCurElemLen, &iByteNum);
- if (uiLength <= 0)
- {
- return SSL_RETURN_UNNORM;
- }
- pcCurElemData += (iByteNum + 1);
- iCurElemLen -= (iByteNum + 1 + uiLength);
- if (iCurElemLen < 0)
- {
- return SSL_RETURN_UNNORM;
- }
- //memcpy(stSSLCert->SSLSubBak, pcCurElemData, uiLength>=512?511:uiLength);
- //stSSLCert->SSLSubBak[uiLength>=512?511:uiLength] = '\0';
- pcCurElemData += uiLength;
- }
- }
- }
-
- /**algorithm identifier**/
- uiLength = fn_iSslDecodeTagLength(pcCurData, iUnAnalyseLen, &iByteNum);
- if (uiLength <= 0)
- {
- return SSL_RETURN_UNNORM;
- }
- pcCurExtData = pcCurData + iByteNum + 1;
- iExtenLen = uiLength;
- //pcCurData += (iByteNum + 1 + uiLength); //20220318 cppcheck
- iUnAnalyseLen -= (iByteNum + 1 + uiLength);
- if (iUnAnalyseLen <= 0)
- {
- return SSL_RETURN_UNNORM;
- }
-
- uiLength = fn_iSslDecodeTagLength(pcCurExtData, iExtenLen, &iByteNum);
- if (uiLength <= 0)
- {
- return SSL_RETURN_UNNORM;
- }
-
- iExtenLen -= (iByteNum + 1);
- if (0 > iExtenLen)
- {
- return SSL_RETURN_UNNORM;
- }
- pcCurExtData += (iByteNum + 1);
-
- pcIdString = fn_pcGetElemType((unsigned char *)pcCurExtData, uiLength, (stSerialString_t*)g_astAlgrithomTypes);
- if (NULL != pcIdString)
- {
- memcpy(stSSLCert->SSLFPAg, pcIdString, 1 + strlen((const char *)pcIdString));
- }
-
- //pcCurExtData += uiLength; //20220318 cppcheck
- /**padding**/
- /**encrypted**/
- return SSL_RETURN_NORM;
+ return cert_unit_cnt;
}
-UCHAR fn_pGetSSLInfo(char *pcCert, int iLen, ssl_stream *a_ssl_stream, struct streaminfo *a_tcp,
- unsigned long long region_flag, int thread_seq, void *a_packet)
+int x509_parse_certificate_detail(struct ssl_certificate *certificate, char *cert_payload, int cert_payload_len, int thread_seq)
{
- int cnt;
- int i = 0;
- char *san = NULL;
-
+ int state=SSL_TRUE;
+ int san_count=0;
X509_NAME *issuer = NULL;
X509_NAME *subject = NULL;
@@ -1054,87 +193,83 @@ UCHAR fn_pGetSSLInfo(char *pcCert, int iLen, ssl_stream *a_ssl_stream, struct
const ASN1_OBJECT *salg;
const X509_ALGOR *tsig_alg;
- //return SSL_RETURN_NORM;
-
- X509 *x509_handle = d2i_X509(NULL, (unsigned char const **)&pcCert, iLen);
+ X509 *x509_handle = d2i_X509(NULL, (unsigned char const **)&cert_payload, cert_payload_len);
if (x509_handle == NULL)
{
- return SSL_RETURN_NORM;
+ return SSL_FLASE;
}
/*version*/
int ver = X509_get_version(x509_handle);
- if(ver>CERT_VER_MAXNUM || ver<0) goto cert_return;
- memcpy(a_ssl_stream->stSSLCert->SSLVersion,
- g_astCertVersions[ver].pcString,
- 1 + strlen((const char *)g_astCertVersions[ver].pcString));
+ if(ver>CERT_VER_MAXNUM || ver<0)
+ {
+ state=SSL_FLASE;
+ goto cert_return;
+ }
+
+ certificate->version.len=(unsigned char)strlen((const char *)g_certificate_version[ver].string);
+ certificate->version.value=(unsigned char *)g_certificate_version[ver].string;
/*serial num*/
serial = X509_get_serialNumber(x509_handle);
if (NULL != serial)
{
- a_ssl_stream->stSSLCert->SSLSerialNumLen = MIN(ASN1_STRING_length(serial), (int)(sizeof(a_ssl_stream->stSSLCert->SSLSerialNum)));
- memcpy(a_ssl_stream->stSSLCert->SSLSerialNum, ASN1_STRING_get0_data(serial), a_ssl_stream->stSSLCert->SSLSerialNumLen);
+ certificate->serial.len=MIN(ASN1_STRING_length(serial), (int)(sizeof(certificate->serial.value)-1));
+ memcpy(certificate->serial.value, ASN1_STRING_get0_data(serial), certificate->serial.len);
}
/*SSL AgID*/
tsig_alg = X509_get0_tbs_sigalg(x509_handle);
X509_ALGOR_get0(&salg, NULL, NULL, tsig_alg);
- OBJ_obj2txt(a_ssl_stream->stSSLCert->SSLAgID, sizeof(a_ssl_stream->stSSLCert->SSLAgID), salg, 1);
+ OBJ_obj2txt((char*)certificate->signature_algorithm.value, sizeof(certificate->signature_algorithm.value), salg, 1);
+ certificate->signature_algorithm.len=strlen((const char *)certificate->signature_algorithm.value);
/*SSL Issuer*/
issuer = X509_get_issuer_name(x509_handle);
if(NULL!=issuer)
{
- X509_NAME_get_text_by_NID(issuer, NID_commonName, a_ssl_stream->stSSLCert->SSLIssuerCN, sizeof(a_ssl_stream->stSSLCert->SSLIssuerCN));
- X509_NAME_get_text_by_NID(issuer, NID_organizationName, a_ssl_stream->stSSLCert->SSLIssuerO, sizeof(a_ssl_stream->stSSLCert->SSLIssuerO));
- X509_NAME_get_text_by_NID(issuer, NID_organizationalUnitName, a_ssl_stream->stSSLCert->SSLIssuerU, sizeof(a_ssl_stream->stSSLCert->SSLIssuerU));
- X509_NAME_get_text_by_NID(issuer, NID_localityName, a_ssl_stream->stSSLCert->SSLIssuerL, sizeof(a_ssl_stream->stSSLCert->SSLIssuerL));
- X509_NAME_get_text_by_NID(issuer, NID_streetAddress, a_ssl_stream->stSSLCert->SSLIssuerS, sizeof(a_ssl_stream->stSSLCert->SSLIssuerS));
- X509_NAME_get_text_by_NID(issuer, NID_stateOrProvinceName, a_ssl_stream->stSSLCert->SSLIssuerP, sizeof(a_ssl_stream->stSSLCert->SSLIssuerP));
- X509_NAME_get_text_by_NID(issuer, NID_countryName, a_ssl_stream->stSSLCert->SSLIssuerC, sizeof(a_ssl_stream->stSSLCert->SSLIssuerC));
-
+ X509_NAME_get_text_by_NID(issuer, NID_commonName, certificate->issuer.common, sizeof(certificate->issuer.common));
+ X509_NAME_get_text_by_NID(issuer, NID_organizationName, certificate->issuer.organization, sizeof(certificate->issuer.organization));
+ X509_NAME_get_text_by_NID(issuer, NID_organizationalUnitName, certificate->issuer.organizational_unit, sizeof(certificate->issuer.organizational_unit));
+ X509_NAME_get_text_by_NID(issuer, NID_localityName, certificate->issuer.locality, sizeof(certificate->issuer.locality));
+ X509_NAME_get_text_by_NID(issuer, NID_streetAddress, certificate->issuer.street_address, sizeof(certificate->issuer.street_address));
+ X509_NAME_get_text_by_NID(issuer, NID_stateOrProvinceName, certificate->issuer.state_or_Province, sizeof(certificate->issuer.state_or_Province));
+ X509_NAME_get_text_by_NID(issuer, NID_countryName, certificate->issuer.country, sizeof(certificate->issuer.country));
- snprintf(a_ssl_stream->stSSLCert->SSLIssuer,
- sizeof(a_ssl_stream->stSSLCert->SSLIssuer),
+ snprintf(certificate->issuer.rdn_sequence_list,
+ sizeof(certificate->issuer.rdn_sequence_list),
"%s;%s;%s;%s;%s;%s;%s",
- a_ssl_stream->stSSLCert->SSLIssuerCN,
- a_ssl_stream->stSSLCert->SSLIssuerO,
- a_ssl_stream->stSSLCert->SSLIssuerU,
- a_ssl_stream->stSSLCert->SSLIssuerL,
- a_ssl_stream->stSSLCert->SSLIssuerS,
- a_ssl_stream->stSSLCert->SSLIssuerP,
- a_ssl_stream->stSSLCert->SSLIssuerC);
+ certificate->issuer.common,
+ certificate->issuer.organization,
+ certificate->issuer.organizational_unit,
+ certificate->issuer.locality,
+ certificate->issuer.street_address,
+ certificate->issuer.state_or_Province,
+ certificate->issuer.country);
}
/*SSL Subject*/
subject = X509_get_subject_name(x509_handle);
if(NULL!=subject)
{
- X509_NAME_get_text_by_NID(subject, NID_commonName, a_ssl_stream->stSSLCert->SSLSubCN, sizeof(a_ssl_stream->stSSLCert->SSLSubCN));
- X509_NAME_get_text_by_NID(subject, NID_organizationName, a_ssl_stream->stSSLCert->SSLSubO, sizeof(a_ssl_stream->stSSLCert->SSLSubO));
- X509_NAME_get_text_by_NID(subject, NID_countryName, a_ssl_stream->stSSLCert->SSLSubC, sizeof(a_ssl_stream->stSSLCert->SSLSubC));
-
-
- X509_NAME_get_text_by_NID(subject, NID_commonName, a_ssl_stream->stSSLCert->SSLSubCN, sizeof(a_ssl_stream->stSSLCert->SSLSubCN));
- X509_NAME_get_text_by_NID(subject, NID_organizationName, a_ssl_stream->stSSLCert->SSLSubO, sizeof(a_ssl_stream->stSSLCert->SSLSubO));
- X509_NAME_get_text_by_NID(subject, NID_organizationalUnitName, a_ssl_stream->stSSLCert->SSLSubU, sizeof(a_ssl_stream->stSSLCert->SSLSubU));
- X509_NAME_get_text_by_NID(subject, NID_localityName, a_ssl_stream->stSSLCert->SSLSubL, sizeof(a_ssl_stream->stSSLCert->SSLSubL));
- X509_NAME_get_text_by_NID(subject, NID_streetAddress, a_ssl_stream->stSSLCert->SSLSubS, sizeof(a_ssl_stream->stSSLCert->SSLSubS));
- X509_NAME_get_text_by_NID(subject, NID_stateOrProvinceName, a_ssl_stream->stSSLCert->SSLSubP, sizeof(a_ssl_stream->stSSLCert->SSLSubP));
- X509_NAME_get_text_by_NID(subject, NID_countryName, a_ssl_stream->stSSLCert->SSLSubC, sizeof(a_ssl_stream->stSSLCert->SSLSubC));
+ X509_NAME_get_text_by_NID(subject, NID_commonName, certificate->subject.common, sizeof(certificate->subject.common));
+ X509_NAME_get_text_by_NID(subject, NID_organizationName, certificate->subject.organization, sizeof(certificate->subject.organization));
+ X509_NAME_get_text_by_NID(subject, NID_countryName, certificate->subject.country, sizeof(certificate->subject.country));
+ X509_NAME_get_text_by_NID(subject, NID_organizationalUnitName, certificate->subject.organizational_unit, sizeof(certificate->subject.organizational_unit));
+ X509_NAME_get_text_by_NID(subject, NID_localityName, certificate->subject.locality, sizeof(certificate->subject.locality));
+ X509_NAME_get_text_by_NID(subject, NID_streetAddress, certificate->subject.street_address, sizeof(certificate->subject.street_address));
+ X509_NAME_get_text_by_NID(subject, NID_stateOrProvinceName, certificate->subject.state_or_Province, sizeof(certificate->subject.state_or_Province));
-
- snprintf(a_ssl_stream->stSSLCert->SSLSub,
- sizeof(a_ssl_stream->stSSLCert->SSLSub),
+ snprintf(certificate->subject.rdn_sequence_list,
+ sizeof(certificate->subject.rdn_sequence_list),
"%s;%s;%s;%s;%s;%s;%s",
- a_ssl_stream->stSSLCert->SSLSubCN,
- a_ssl_stream->stSSLCert->SSLSubO,
- a_ssl_stream->stSSLCert->SSLSubU,
- a_ssl_stream->stSSLCert->SSLSubL,
- a_ssl_stream->stSSLCert->SSLSubS,
- a_ssl_stream->stSSLCert->SSLSubP,
- a_ssl_stream->stSSLCert->SSLSubC);
+ certificate->subject.common,
+ certificate->subject.organization,
+ certificate->subject.organizational_unit,
+ certificate->subject.locality,
+ certificate->subject.street_address,
+ certificate->subject.state_or_Province,
+ certificate->subject.country);
}
/*SSL Subject keyInfo*/
@@ -1142,20 +277,20 @@ UCHAR fn_pGetSSLInfo(char *pcCert, int iLen, ssl_stream *a_ssl_stream, struct
if(pkey!=NULL)
{
//https://www.openssl.org/docs/man3.0/man3/i2d_PublicKey.html
- a_ssl_stream->stSSLCert->SSLSubKeyLen = i2d_PublicKey(pkey, NULL);
- if(a_ssl_stream->stSSLCert->SSLSubKeyLen>0)
+ certificate->subject_key.len=i2d_PublicKey(pkey, NULL);
+ if(certificate->subject_key.len>0)
{
- a_ssl_stream->stSSLCert->SSLSubKey = (unsigned char *)dictator_malloc(thread_seq, a_ssl_stream->stSSLCert->SSLSubKeyLen);
- int ret=i2d_PublicKey(pkey, &(a_ssl_stream->stSSLCert->SSLSubKey)); //!!! point will be changed
+ certificate->subject_key.value=(char *)dictator_malloc(thread_seq, certificate->subject_key.len);
+ int ret=i2d_PublicKey(pkey, (unsigned char **)&(certificate->subject_key.value)); //!!! point will be changed
if(ret>0)
{
- a_ssl_stream->stSSLCert->SSLSubKey = a_ssl_stream->stSSLCert->SSLSubKey-a_ssl_stream->stSSLCert->SSLSubKeyLen;
+ certificate->subject_key.value=certificate->subject_key.value-certificate->subject_key.len;
}
else
{
- dictator_free(thread_seq, (void *)a_ssl_stream->stSSLCert->SSLSubKey);
- a_ssl_stream->stSSLCert->SSLSubKey=NULL;
- a_ssl_stream->stSSLCert->SSLSubKeyLen=0;
+ dictator_free(thread_seq, (void *)certificate->subject_key.value);
+ certificate->subject_key.value=NULL;
+ certificate->subject_key.len=0;
}
}
EVP_PKEY_free(pkey);
@@ -1164,49 +299,60 @@ UCHAR fn_pGetSSLInfo(char *pcCert, int iLen, ssl_stream *a_ssl_stream, struct
/*validity*/
start = X509_get_notBefore(x509_handle);
end = X509_get_notAfter(x509_handle);
- sprintf(a_ssl_stream->stSSLCert->SSLFrom, "%s", start->data);
- sprintf(a_ssl_stream->stSSLCert->SSLTo, "%s", end->data);
+ sprintf(certificate->validity.before, "%s", start->data);
+ sprintf(certificate->validity.after, "%s", end->data);
/*subject bak*/
- subjectAltNames = (GENERAL_NAMES*)X509_get_ext_d2i(x509_handle, NID_subject_alt_name, NULL, NULL);
- if(!subjectAltNames) goto cert_return;
- cnt = sk_GENERAL_NAME_num(subjectAltNames);
- if(cnt>0)
- {
- a_ssl_stream->stSSLCert->SSLSubAltName = (st_san_t*)dictator_malloc(thread_seq, sizeof(st_san_t));
- a_ssl_stream->stSSLCert->SSLSubAltName->san_array = (san_t*)dictator_malloc(thread_seq, cnt*sizeof(san_t));
- memset(a_ssl_stream->stSSLCert->SSLSubAltName->san_array,0,cnt*sizeof(san_t));
- a_ssl_stream->stSSLCert->SSLSubAltName->count = 0;
- for (i = 0; i < cnt; i++)
+ subjectAltNames=(GENERAL_NAMES*)X509_get_ext_d2i(x509_handle, NID_subject_alt_name, NULL, NULL);
+ if(!subjectAltNames)
+ {
+ goto cert_return;
+ }
+
+ san_count=sk_GENERAL_NAME_num(subjectAltNames);
+ if(san_count>0)
+ {
+ certificate->subject_alter.num=0;
+ certificate->subject_alter.name=(char (*)[MAX_ALTER_NAME_LEN])dictator_malloc(thread_seq, san_count * sizeof(char[MAX_ALTER_NAME_LEN]));
+
+ for (int i=0; i<san_count; i++)
{
generalName = sk_GENERAL_NAME_value(subjectAltNames, i);
- if(!generalName) goto cert_return;
+ if(!generalName)
+ {
+ break;
+ }
+
if(GEN_DNS == generalName->type)
{
san_name = (ASN1_STRING*)GENERAL_NAME_get0_value(generalName, NULL);
if(ASN1_STRING_length(san_name)>0)
{
- san = (char*)ASN1_STRING_get0_data(san_name);
- snprintf(a_ssl_stream->stSSLCert->SSLSubAltName->san_array[a_ssl_stream->stSSLCert->SSLSubAltName->count].san,
- sizeof(a_ssl_stream->stSSLCert->SSLSubAltName->san_array[a_ssl_stream->stSSLCert->SSLSubAltName->count].san),
- "%s",
- san);
- a_ssl_stream->stSSLCert->SSLSubAltName->count++;
+ char *san=(char*)ASN1_STRING_get0_data(san_name);
+ int length=MIN(strlen(san), sizeof(certificate->subject_alter.name[certificate->subject_alter.num])-1);
+ memcpy(certificate->subject_alter.name[certificate->subject_alter.num], san, length);
+ certificate->subject_alter.name[certificate->subject_alter.num][length]='\0';
+ certificate->subject_alter.num++;
}
}
}
}
+
if(subjectAltNames)
{
GENERAL_NAMES_free(subjectAltNames);
}
+ //https://www.openssl.org/docs/man1.1.1/man3/X509_ALGOR_get0.html
+ X509_ALGOR_get0(&salg, NULL, NULL, X509_get0_tbs_sigalg(x509_handle));
+ OBJ_obj2txt(certificate->algorithm_identifier.value, sizeof(certificate->algorithm_identifier.value), salg, 1);
+ certificate->algorithm_identifier.len=strlen((const char *)certificate->algorithm_identifier.value);
cert_return:
if (x509_handle != NULL)
{
X509_free(x509_handle);
}
- return SSL_RETURN_NORM;
-}
+ return state;
+}