📄 secutil.c
字号:
{ SECItem decodedValue; SECStatus rv; int64 invalidTime; char *formattedTime = NULL; decodedValue.data = NULL; rv = SEC_ASN1DecodeItem (NULL, &decodedValue, SEC_GeneralizedTimeTemplate, value); if (rv == SECSuccess) { rv = DER_GeneralizedTimeToTime(&invalidTime, &decodedValue); if (rv == SECSuccess) { formattedTime = CERT_GenTime2FormattedAscii (invalidTime, "%a %b %d %H:%M:%S %Y"); SECU_Indent(out, level +1); fprintf (out, "%s: %s\n", msg, formattedTime); PORT_Free (formattedTime); } } PORT_Free (decodedValue.data); return (rv);}static SECStatusPrintExtKeyUsageExten (FILE *out, SECItem *value, char *msg, int level){ CERTOidSequence *os; SECItem **op; SECU_Indent(out, level); fprintf(out, "Extended Key Usage Extension:\n"); os = CERT_DecodeOidSequence(value); if( (CERTOidSequence *)NULL == os ) { return SECFailure; } if( (SECItem **)NULL == op ) { return SECFailure; } for( op = os->oids; *op; op++ ) { SECOidData *od = SECOID_FindOID(*op); if( (SECOidData *)NULL == od ) { SECU_Indent(out, level+1); SECU_PrintAsHex(out, *op, "Unknown:", level+2); secu_Newline(out); continue; } SECU_Indent(out, level+1); if( od->desc ) fprintf(out, "%s", od->desc); else SECU_PrintAsHex(out, &od->oid, "", level+2); secu_Newline(out); } return SECSuccess;}char *itemToString(SECItem *item){ char *string; string = PORT_ZAlloc(item->len+1); if (string == NULL) return NULL; PORT_Memcpy(string,item->data,item->len); string[item->len] = 0; return string;}static SECStatussecu_PrintPolicyQualifier(FILE *out,CERTPolicyQualifier *policyQualifier,char *msg,int level){ CERTUserNotice *userNotice; SECItem **itemList = NULL; char *string; SECU_PrintObjectID(out, &policyQualifier->qualifierID , "Policy Qualifier Name", level); switch (policyQualifier->oid) { case SEC_OID_PKIX_USER_NOTICE_QUALIFIER: userNotice = CERT_DecodeUserNotice(&policyQualifier->qualifierValue); if (userNotice) { if (userNotice->noticeReference.organization.len != 0) { string=itemToString(&userNotice->noticeReference.organization); itemList = userNotice->noticeReference.noticeNumbers; while (*itemList) { SECU_PrintInteger(out,*itemList,string,level+1); itemList++; } PORT_Free(string); } if (userNotice->displayText.len != 0) { SECU_PrintString(out,&userNotice->displayText, "Display Text", level+1); } break; } /* fall through on error */ case SEC_OID_PKIX_CPS_POINTER_QUALIFIER: default: secu_PrintAny(out, &policyQualifier->qualifierValue, "Policy Qualifier Data", level+1); break; } return SECSuccess;}static SECStatussecu_PrintPolicyInfo(FILE *out,CERTPolicyInfo *policyInfo,char *msg,int level){ CERTPolicyQualifier **policyQualifiers; policyQualifiers = policyInfo->policyQualifiers; SECU_PrintObjectID(out, &policyInfo->policyID , "Policy Name", level); while (*policyQualifiers != NULL) { secu_PrintPolicyQualifier(out,*policyQualifiers,"",level+1); policyQualifiers++; } return SECSuccess;}static SECStatussecu_PrintPolicy(FILE *out, SECItem *value, char *msg, int level){ CERTCertificatePolicies *policies = NULL; CERTPolicyInfo **policyInfos; if (msg) { SECU_Indent(out, level); fprintf(out,"%s: \n",msg); level++; } policies = CERT_DecodeCertificatePoliciesExtension(value); if (policies == NULL) { SECU_PrintAsHex(out, value, "Invalid Policy Data", level); return SECFailure; } policyInfos = policies->policyInfos; while (*policyInfos != NULL) { secu_PrintPolicyInfo(out,*policyInfos,"",level); policyInfos++; } CERT_DestroyCertificatePoliciesExtension(policies); return SECSuccess;}char *nsTypeBits[] = {"SSL Client","SSL Server","S/MIME","Object Signing","Reserved","SSL CA","S/MIME CA","ObjectSigning CA" };static SECStatussecu_PrintBasicConstraints(FILE *out, SECItem *value, char *msg, int level) { CERTBasicConstraints constraints; SECStatus rv; SECU_Indent(out, level); if (msg) { fprintf(out,"%s: ",msg); } rv = CERT_DecodeBasicConstraintValue(&constraints,value); if (rv == SECSuccess && constraints.isCA) { fprintf(out,"Is a CA with a maximum path length of %d.\n", constraints.pathLenConstraint); } else { fprintf(out,"Is not a CA.\n"); } return SECSuccess;}static SECStatussecu_PrintNSCertType(FILE *out, SECItem *value, char *msg, int level) { char NS_Type=0; int len, i, found=0; if (value->data[1] & 0x80) { len = 3; } else { len = value->data[1]; } if ((value->data[0] != SEC_ASN1_BIT_STRING) || (len < 2)) { secu_PrintAny(out, value, "Data", level); return SECSuccess; } NS_Type=value->data[3]; if (msg) { SECU_Indent(out, level); fprintf(out,"%s: ",msg); } else { SECU_Indent(out, level); fprintf(out,"Netscape Certificate Type: "); } for (i=0; i < 8; i++) { if ( (0x80 >> i) & NS_Type) { fprintf(out,"%c%s",found?',':'<',nsTypeBits[i]); found = 1; } } if (found) { fprintf(out,">\n"); } else { fprintf(out,"none\n"); } return SECSuccess;}voidSECU_PrintExtensions(FILE *out, CERTCertExtension **extensions, char *msg, int level){ SECOidTag oidTag; if ( extensions ) { SECU_Indent(out, level); fprintf(out, "%s:\n", msg); while ( *extensions ) { SECItem *tmpitem; SECU_Indent(out, level+1); fprintf(out, "Name:\n"); tmpitem = &(*extensions)->id; SECU_PrintObjectID(out, tmpitem, NULL, level+2); tmpitem = &(*extensions)->critical; if ( tmpitem->len ) { secu_PrintBoolean(out, tmpitem, "Critical", level+1); } oidTag = SECOID_FindOIDTag (&((*extensions)->id)); tmpitem = &((*extensions)->value); switch (oidTag) { case SEC_OID_X509_INVALID_DATE: case SEC_OID_NS_CERT_EXT_CERT_RENEWAL_TIME: secu_PrintX509InvalidDate(out, tmpitem, "Date", level + 1); break; case SEC_OID_X509_CERTIFICATE_POLICIES: secu_PrintPolicy(out, tmpitem, "Data", level +1); break; case SEC_OID_NS_CERT_EXT_BASE_URL: case SEC_OID_NS_CERT_EXT_REVOCATION_URL: case SEC_OID_NS_CERT_EXT_CA_REVOCATION_URL: case SEC_OID_NS_CERT_EXT_CA_CRL_URL: case SEC_OID_NS_CERT_EXT_CA_CERT_URL: case SEC_OID_NS_CERT_EXT_CERT_RENEWAL_URL: case SEC_OID_NS_CERT_EXT_CA_POLICY_URL: case SEC_OID_NS_CERT_EXT_HOMEPAGE_URL: case SEC_OID_NS_CERT_EXT_LOST_PASSWORD_URL: case SEC_OID_OCSP_RESPONDER: SECU_PrintString(out,tmpitem, "URL", level+1); break; case SEC_OID_NS_CERT_EXT_COMMENT: SECU_PrintString(out,tmpitem, "Comment", level+1); break; case SEC_OID_NS_CERT_EXT_SSL_SERVER_NAME: SECU_PrintString(out,tmpitem, "ServerName", level+1); break; case SEC_OID_NS_CERT_EXT_CERT_TYPE: secu_PrintNSCertType(out,tmpitem,"Data",level+1); break; case SEC_OID_X509_BASIC_CONSTRAINTS: secu_PrintBasicConstraints(out,tmpitem,"Data",level+1); break; case SEC_OID_X509_SUBJECT_ALT_NAME: case SEC_OID_X509_ISSUER_ALT_NAME: /* * We should add at least some of the more interesting cases * here, but need to have subroutines to back them up. */ case SEC_OID_NS_CERT_EXT_NETSCAPE_OK: case SEC_OID_NS_CERT_EXT_ISSUER_LOGO: case SEC_OID_NS_CERT_EXT_SUBJECT_LOGO: case SEC_OID_NS_CERT_EXT_ENTITY_LOGO: case SEC_OID_NS_CERT_EXT_USER_PICTURE: case SEC_OID_NS_KEY_USAGE_GOVT_APPROVED: /* x.509 v3 Extensions */ case SEC_OID_X509_SUBJECT_DIRECTORY_ATTR: case SEC_OID_X509_SUBJECT_KEY_ID: case SEC_OID_X509_KEY_USAGE: case SEC_OID_X509_PRIVATE_KEY_USAGE_PERIOD: case SEC_OID_X509_NAME_CONSTRAINTS: case SEC_OID_X509_CRL_DIST_POINTS: case SEC_OID_X509_POLICY_MAPPINGS: case SEC_OID_X509_POLICY_CONSTRAINTS: case SEC_OID_X509_AUTH_KEY_ID: goto defualt; case SEC_OID_X509_EXT_KEY_USAGE: PrintExtKeyUsageExten(out, tmpitem, "", level+1); break; case SEC_OID_X509_AUTH_INFO_ACCESS: case SEC_OID_X509_CRL_NUMBER: case SEC_OID_X509_REASON_CODE: /* PKIX OIDs */ case SEC_OID_PKIX_OCSP: case SEC_OID_PKIX_OCSP_BASIC_RESPONSE: case SEC_OID_PKIX_OCSP_NONCE: case SEC_OID_PKIX_OCSP_CRL: case SEC_OID_PKIX_OCSP_RESPONSE: case SEC_OID_PKIX_OCSP_NO_CHECK: case SEC_OID_PKIX_OCSP_ARCHIVE_CUTOFF: case SEC_OID_PKIX_OCSP_SERVICE_LOCATOR: case SEC_OID_PKIX_REGCTRL_REGTOKEN: case SEC_OID_PKIX_REGCTRL_AUTHENTICATOR: case SEC_OID_PKIX_REGCTRL_PKIPUBINFO: case SEC_OID_PKIX_REGCTRL_PKI_ARCH_OPTIONS: case SEC_OID_PKIX_REGCTRL_OLD_CERT_ID: case SEC_OID_PKIX_REGCTRL_PROTOCOL_ENC_KEY: case SEC_OID_PKIX_REGINFO_UTF8_PAIRS: case SEC_OID_PKIX_REGINFO_CERT_REQUEST: case SEC_OID_EXT_KEY_USAGE_SERVER_AUTH: case SEC_OID_EXT_KEY_USAGE_CLIENT_AUTH: case SEC_OID_EXT_KEY_USAGE_CODE_SIGN: case SEC_OID_EXT_KEY_USAGE_EMAIL_PROTECT: case SEC_OID_EXT_KEY_USAGE_TIME_STAMP: default: defualt: /*SECU_PrintAsHex(out, tmpitem, "Data", level+1); */ secu_PrintAny(out, tmpitem, "Data", level+1); break; } secu_Newline(out); extensions++; } }}voidSECU_PrintName(FILE *out, CERTName *name, char *msg, int level){ char *str; SECU_Indent(out, level); fprintf(out, "%s: ", msg); str = CERT_NameToAscii(name); if (!str) str = "!Invalid AVA!"; fprintf(out, str); secu_Newline(out);}static int keyindex;static SECStatussecu_PrintKeyNickname(DBT *k, DBT *d, void *data){ FILE *out; char *name; unsigned char *buf; buf = (unsigned char *)d->data; out = (FILE *)data; name = (char *)PORT_Alloc(buf[2]); if (name == NULL) { return(SECFailure); } PORT_Memcpy(name, (buf + 3 + buf[1]), buf[2]); /* print everything but password-check entry */ if (PORT_Strcmp(name, "password-check") != 0) { keyindex++; fprintf(out, "<%d> %s\n", keyindex, name); } PORT_Free(name); return (SECSuccess);}intSECU_PrintKeyNames(SECKEYKeyDBHandle *handle, FILE *out){ int rv; SECU_Indent(out, 0); fprintf(out, "Version %d database\n\n", SECKEY_GetKeyDBVersion(handle)); fprintf(out, "<Key Index> Key Name\n--------\n"); keyindex = 0; rv = SECKEY_TraverseKeys(handle, secu_PrintKeyNickname, out); if (rv) { return -1; } return 0;}#if 0struct indexedkey{ int index; SECKEY_LowPrivateKey *key;};static SECStatussecu_GetKeyIndex(DBT *k, DBT *d, void *data){ char *name; unsigned char *buf; struct indexedkey *idkey = (struct indexedkey*)data; /*SECKEYLowPrivateKey *key = *(SECKEYLowPrivateKey**)data;*/ buf = (unsigned char *)d->data; name = (char *)PORT_Alloc(buf[2]); if (name == NULL) { return(SECFailure); } PORT_Memcpy(name, (buf + 3 + buf[1]), buf[2]); /* print everything but password-check entry */ if (PORT_Strcmp(name, "password-check") != 0) { keyindex++; if (keyindex == idkey->index) idkey->key = SECKEY_DecryptKey(k,idkey->slot->password, SECKEY_GetDefaultKeyDB()); } PORT_Free(name); return (SECSuccess);}SECKEYLowPrivateKey*secu_GetPrivKeyFromIndex(int index, PK11Slot slot);{ /*SECKEYLowPrivateKey* key;*/ struct indexedkey idkey = { index, NULL }; keyindex = 0; rv = SECKEY_TraverseKeys(SECKEY_GetDefaultKeyDB(), secu_GetKeyIndex, &idkey); if (rv) { return NULL; } return key;}#endifvoidprintflags(char *trusts, unsigned int flags){ if (flags & CERTDB_VALID_CA) if (!(flags & CERTDB_TRUSTED_CA) && !(flags & CERTDB_TRUSTED_CLIENT_CA)) PORT_Strcat(trusts, "c"); if (flags & CERTDB_VALID_PEER) if (!(flags & CERTDB_TRUSTED)) PORT_Strcat(trusts, "p"); if (flags & CERTDB_TRUSTED_CA) PORT_Strcat(trusts, "C"); if (flags & CERTDB_TRUSTED_CLIENT_CA) PORT_Strcat(trusts, "T"); if (flags & CERTDB_TRUSTED) PORT_Strcat(trusts, "P"); if (flags & CERTDB_USER) PORT_Strcat(trusts, "u"); if (flags & CERTDB_SEND_WARN) PORT_Strcat(trusts, "w"); if (flags & CERTDB_INVISIBLE_CA) PORT_Strcat(trusts, "I"); if (flags & CERTDB_GOVT_APPROVED_CA) PORT_Strcat(trusts, "G"); return;}/* callback for listing certs through pkcs11 */SECStatusSECU_PrintCertNickname(CERTCertificate *cert, void *data){ CERTCertTrust *trust; FILE *out; char trusts[30]; char *name; PORT_Memset (trusts, 0, sizeof (trusts)); out = (FILE *)data; if ( cert->dbEntry ) { name = cert->dbEntry->nickname; if ( name == NULL ) { name = cert->emailAddr; } trust = &cert->dbEntry->trust; printflags(trusts, trust->sslFlags); PORT_Strcat(trusts, ","); printflags(trusts, trust->emailFlags); PORT_Strcat(trusts, ","); printflags(trusts, trust->objectSigningFlags); fprintf(out, "%-60s %-5s\n", name, trusts); } else { name = cert->nickname; if ( name == NULL ) { name = cert->emailAddr; } trust = cert->trust; if (trust) { printflags(trusts, trust->sslFlags); PORT_Strcat(trusts, ","); printflags(trusts, trust->emailFlags); PORT_Strcat(trusts, ","); printflags(trusts, trust->objectSigningFlags); } else { PORT_Memcpy(trusts,",,",3); } fprintf(out, "%-60s %-5s\n", name, trusts); } return (SECSuccess);}typedef struct {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -