advisor.c
来自「支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS」· C语言 代码 · 共 2,020 行 · 第 1/5 页
C
2,020 行
if (!serverCN) { goto loser; }#if 0 /* Create resource for the server cert */ rv = SSM_CreateResource(SSM_RESTYPE_CERTIFICATE, socketStatusRes->m_cert, SSMRESOURCE(res)->m_connection, (long *) &serverCertResID, (SSMResource**)&serverCertRes); if (rv != PR_SUCCESS) { goto loser; }#else serverCertRes = socketStatusRes->m_cert; serverCertResID = serverCertRes->super.m_id;#endif if (socketStatusRes->m_level == SSL_SECURITY_STATUS_ON_HIGH) { SSM_GetUTF8Text(cx, "high_grade_encryption", &encryption_level); } else { SSM_GetUTF8Text(cx, "low_grade_encryption", &encryption_level); } PR_FREEIF(cx->m_result); cx->m_result = PR_smprintf(fmt, res->hostname, issuerName, target->m_id, serverCertResID, encryption_level, socketStatusRes->m_cipherName, socketStatusRes->m_secretKeySize); PR_Free(fmt); PR_Free(issuerName); PR_Free(serverCN); PR_Free(encryption_level); SSM_FreeResource(&socketStatusRes->super); return SSM_SUCCESS; } else if(socketStatusRes->m_error == SEC_ERROR_UNTRUSTED_ISSUER) { rv = SSM_GetAndExpandTextKeyedByString(cx, "sa_navigator_ssl_bad_issuer", &fmt); if (rv != SSM_SUCCESS) { goto loser; } /* Get the common name of the issuer */ issuerName = CERT_NameToAscii(&socketStatusRes->m_cert->cert->issuer); if (!issuerName) { goto loser; } /* Get the common name of the server cert */ serverCN = CERT_GetCommonName(&socketStatusRes->m_cert->cert->subject); if (!serverCN) { goto loser; }#if 0 /* Create resource for the server cert */ rv = SSM_CreateResource(SSM_RESTYPE_CERTIFICATE, socketStatusRes->m_cert, SSMRESOURCE(res)->m_connection, (long *) &serverCertResID, (SSMResource**)&serverCertRes); if (rv != PR_SUCCESS) { goto loser; }#else serverCertRes = socketStatusRes->m_cert; serverCertResID = serverCertRes->super.m_id;#endif /* Create a resource for the issuer cert (if it exists) */ issuerCert = CERT_FindCertIssuer(socketStatusRes->m_cert->cert, PR_Now(), certUsageAnyCA); if (issuerCert) { /* Create resource for the issuer cert */ rv = SSM_CreateResource(SSM_RESTYPE_CERTIFICATE, issuerCert, SSMRESOURCE(res)->m_connection, (long *) &issuerCertResID, (SSMResource**)&issuerCertRes); if (rv != PR_SUCCESS) { goto loser; } } else { issuerCertResID = 0; } if (socketStatusRes->m_level == SSL_SECURITY_STATUS_ON_HIGH) { SSM_GetUTF8Text(cx, "high_grade_encryption", &encryption_level); } else { SSM_GetUTF8Text(cx, "low_grade_encryption", &encryption_level); } PR_FREEIF(cx->m_result); cx->m_result = PR_smprintf(fmt, res->hostname, issuerName, target->m_id, serverCertResID, issuerCertResID, encryption_level, socketStatusRes->m_cipherName, socketStatusRes->m_secretKeySize); PR_Free(fmt); PR_Free(issuerName); PR_Free(serverCN); PR_Free(encryption_level); SSM_FreeResource(&socketStatusRes->super); return SSM_SUCCESS; } else if (socketStatusRes->m_error == SSL_ERROR_BAD_CERT_DOMAIN) { rv = SSM_GetAndExpandTextKeyedByString(cx, "sa_navigator_ssl_bad_cert_domain", &fmt); if (rv != SSM_SUCCESS) { goto loser; } /* Get the common name of the server cert */ serverCN = CERT_GetCommonName(&socketStatusRes->m_cert->cert->subject); if (!serverCN) { goto loser; } if (socketStatusRes->m_level == SSL_SECURITY_STATUS_ON_HIGH) { SSM_GetUTF8Text(cx, "high_grade_encryption", &encryption_level); } else { SSM_GetUTF8Text(cx, "low_grade_encryption", &encryption_level); } PR_FREEIF(cx->m_result); cx->m_result = PR_smprintf(fmt, res->hostname, serverCN, encryption_level, socketStatusRes->m_cipherName, socketStatusRes->m_secretKeySize); PR_Free(fmt); PR_Free(serverCN); PR_Free(encryption_level); SSM_FreeResource(&socketStatusRes->super); return SSM_SUCCESS; } else { rv = SSM_GetAndExpandTextKeyedByString(cx, "sa_navigator_ssl_unknown_error", &fmt); if (rv != SSM_SUCCESS) { goto loser; }#if 0 /* Create resource for the server cert */ rv = SSM_CreateResource(SSM_RESTYPE_CERTIFICATE, socketStatusRes->m_cert, SSMRESOURCE(res)->m_connection, (long *) &serverCertResID, (SSMResource**)&serverCertRes); if (rv != PR_SUCCESS) { goto loser; }#else serverCertRes = socketStatusRes->m_cert; serverCertResID = serverCertRes->super.m_id;#endif if (socketStatusRes->m_level == SSL_SECURITY_STATUS_ON_HIGH) { SSM_GetUTF8Text(cx, "high_grade_encryption", &encryption_level); } else { SSM_GetUTF8Text(cx, "low_grade_encryption", &encryption_level); } PR_FREEIF(cx->m_result); cx->m_result = PR_smprintf(fmt, res->hostname, target->m_id, serverCertResID, encryption_level, socketStatusRes->m_cipherName, socketStatusRes->m_secretKeySize); PR_Free(fmt); SSM_FreeResource(&socketStatusRes->super); return SSM_SUCCESS; } } }loser: PR_FREEIF(fmt); PR_FREEIF(serverCN); PR_FREEIF(issuerName); if (socketStatusRes) { SSM_FreeResource(&socketStatusRes->super); } return SSM_FAILURE;}static CERTCertificate * get_signer_cert(SSMSecurityAdvisorContext *res){ CERTCertificate * cert = NULL; /* Get the signing cert */ if (res->signedP7CInfoRes || res->encryptedP7CInfoRes) { SEC_PKCS7SignerInfo **signerinfos; SEC_PKCS7ContentInfo *ci = res->signedP7CInfoRes->m_cinfo; if (!ci) ci = res->encryptedP7CInfoRes->m_cinfo; /* Finding the signers cert */ switch(ci->contentTypeTag->offset) { default: case SEC_OID_PKCS7_DATA: case SEC_OID_PKCS7_DIGESTED_DATA: case SEC_OID_PKCS7_ENVELOPED_DATA: case SEC_OID_PKCS7_ENCRYPTED_DATA: /* Could only get here if SEC_PKCS7ContentIsSigned * is broken. */ { PORT_Assert (0); cert=NULL; } break; case SEC_OID_PKCS7_SIGNED_DATA: { SEC_PKCS7SignedData *sdp; sdp = ci->content.signedData; signerinfos = sdp->signerInfos; cert = signerinfos[0]->cert; } break; case SEC_OID_PKCS7_SIGNED_ENVELOPED_DATA: { SEC_PKCS7SignedAndEnvelopedData *saedp; saedp = ci->content.signedAndEnvelopedData; signerinfos = saedp->signerInfos; cert = signerinfos[0]->cert; } break; } /* finding the signer cert */ } return cert;}char*SSM_GetOCSPURL(CERTCertificate *cert, PrefSet *prefs){ SSMStatus rv; PRBool boolval = PR_FALSE; char *responderURL = NULL; /* Is there a default responder installed */ rv = PREF_GetBoolPref(prefs, "security.OCSP.useDefaultResponder", &boolval); if (boolval) { PREF_CopyStringPref(prefs, "security.OCSP.URL", &responderURL); } else { responderURL = CERT_GetOCSPAuthorityInfoAccessLocation(cert); } return responderURL;}static CERTCertificate * get_encryption_cert(SSMSecurityAdvisorContext *res){ return NULL;}static char *sa_get_algorithm_string(SEC_PKCS7ContentInfo *cinfo){ SECAlgorithmID *algid; SECOidTag algtag; const char *alg_name; int key_size; if (!cinfo) return 0; algid = SEC_PKCS7GetEncryptionAlgorithm(cinfo); if (!algid) return 0; algtag = SECOID_GetAlgorithmTag(algid); alg_name = SECOID_FindOIDTagDescription(algtag); key_size = SEC_PKCS7GetKeyLength(cinfo); if (!alg_name || !*alg_name) return 0; else if (key_size > 0) return PR_smprintf("%d-bits %s", key_size, alg_name); else return PL_strdup(alg_name);}PRBoolSSM_IsOCSPEnabled(SSMControlConnection *connection) { SSMStatus rv; PRBool isOCSPEnabled = PR_FALSE; rv = PREF_GetBoolPref(connection->m_prefs, "security.OCSP.enabled", &isOCSPEnabled); return (rv == SSM_SUCCESS) ? isOCSPEnabled : PR_FALSE; }char *SSM_GetGenericOCSPWarning(SSMControlConnection *ctrl, CERTCertificate *cert){ char *retString = NULL; char *responderURL = NULL; SSMTextGenContext *cx = NULL; SSMStatus rv; retString = PL_strdup(""); if (SSM_IsOCSPEnabled(ctrl)) { responderURL = SSM_GetOCSPURL(cert, ctrl->m_prefs); if (responderURL == NULL) { goto done; } rv = SSMTextGen_NewTopLevelContext(NULL, &cx); if (rv != SSM_SUCCESS) { goto done; } SSM_GetAndExpandTextKeyedByString(cx, "ocsp_fail_message_generic", &retString); } done: PR_FREEIF(responderURL); if (cx) { SSMTextGen_DestroyContext(cx); } return retString;}SSMStatus sa_message(SSMTextGenContext *cx){ SSMStatus rv = SSM_SUCCESS; SSMResource *target = NULL; SSMSecurityAdvisorContext* res = NULL; char *fmt = NULL, *fmtSigned = NULL, *fmtEncrypted = NULL; char *genericOCSPWarning = NULL; /* get the connection object */ target = SSMTextGen_GetTargetObject(cx); PR_ASSERT(target != NULL); res = (SSMSecurityAdvisorContext*)target; /* Deal with the signed part first */ if (!res->signed_b) { rv = SSM_GetAndExpandTextKeyedByString(cx, "sa_message_not_signed", &fmtSigned); if (rv != SSM_SUCCESS) { goto loser; } } else { if (res->verifyError == 0) { char *signer_email; CERTCertificate *signerCert = NULL; SSMResourceCert *signerCertRes = NULL; int signerCertResID; rv = SSM_GetAndExpandTextKeyedByString(cx, "sa_message_signed", &fmt); if (rv != SSM_SUCCESS) { goto loser; } signerCert = get_signer_cert(res); if (!signerCert) { goto loser; } /* Get the signers email address */ if (res->signedP7CInfoRes) { signer_email = SEC_PKCS7GetSignerEmailAddress(res->signedP7CInfoRes->m_cinfo); } if (!signer_email && res->encryptedP7CInfoRes) { signer_email = SEC_PKCS7GetSignerEmailAddress(res->encryptedP7CInfoRes->m_cinfo); } /* Create a cert resource for this certificate */ rv = SSM_CreateResource(SSM_RESTYPE_CERTIFICATE, signerCert, SSMRESOURCE(res)->m_connection, (long *) &signerCertResID, (SSMResource**)&signerCertRes); if (rv != PR_SUCCESS) { goto loser; } fmtSigned = PR_smprintf(fmt, signer_email, target->m_id, signerCertResID); PR_Free(fmt); } else { CERTCertificate *signerCert; /* Get the signing certificate */ signerCert = get_signer_cert(res); if (!signerCert) { goto loser; } genericOCSPWarning = SSM_GetGenericOCSPWarning(target->m_connection, signerCert); switch(res->verifyError) { case SEC_ERROR_PKCS7_BAD_SIGNATURE: { rv = SSM_GetAndExpandTextKeyedByString(cx, "sa_message_signed_bad_signature", &fmt); if (rv != SSM_SUCCESS) { goto loser; } fmtSigned = PR_smprintf(fmt, genericOCSPWarning); PR_FREEIF(fmt); } break; /* This case handles both expired and not yet valid certs */ case SEC_ERROR_EXPIRED_CERTIFICATE: { rv = SSM_GetAndExpandTextKeyedByString(cx, "sa_message_signed_expired_signing_cert", &fmt); if (rv != SSM_SUCCESS) { goto loser; } fmtSigned = PR_smprintf(fmt, genericOCSPWarning); PR_FREEIF(fmt); } break; case SEC_ERROR_REVOKED_CERTIFICATE: { rv = SSM_GetAndExpandTextKeyedByString(cx, "sa_message_signed_revoked_signing_cert", &fmt); if (rv != SSM_SUCCESS) { goto loser; } fmtSigned = PR_smprintf(fmt, genericOCSPWarning); PR_FREEIF(fmt); } break; case SEC_ERROR_UNKNOWN_IS
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?