⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 secutil.c

📁 支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS #11, PKCS #12, S/MIME, X.509v3证书等安全协议或标准的开发库编译用到NSPR
💻 C
📖 第 1 页 / 共 5 页
字号:
{    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 + -