--- /media/dados1/mozilla-firefox/security/nss/lib/certdb/certdb.c 2006-02-16 00:14:18.000000000 +0000 +++ certdb.c 2007-07-09 00:48:46.000000000 +0000 @@ -297,6 +297,7 @@ return(SECFailure); } +/* PT */ SECStatus CERT_IssuerNameFromDERCert(SECItem *derCert, SECItem *derName) { @@ -319,20 +320,25 @@ } PORT_Memset(derName, 0, sizeof(SECItem)); + rv = SEC_QuickDERDecodeItem(arena, derName, SEC_CertIssuerTemplate, &sd.data); if ( rv ) { goto loser; } - tmpptr = derName->data; +/* tmpptr = derName->data; */ + tmpptr = CERT_DecodeDERCertificateIssuer(derCert); + + + derName->len=strlen(tmpptr)+1; derName->data = (unsigned char*)PORT_Alloc(derName->len); if ( derName->data == NULL ) { goto loser; } PORT_Memcpy(derName->data, tmpptr, derName->len); - + PORT_Free(tmpptr); PORT_FreeArena(arena, PR_FALSE); return(SECSuccess); @@ -940,6 +946,186 @@ return(0); } +/* +** Decode a DER encoded certificate and return the subject in ASCII +*/ +char * +CERT_DecodeDERCertificateSubject(SECItem *derSignedCert) +{ + CERTCertificate *cert; + PRArenaPool *arena; + void *data; + int rv; + int len; + char *tmpname,*tmpname2; + + /* make a new arena */ + arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); + + if ( !arena ) { + return 0; + } + + /* allocate the certificate structure */ + cert = (CERTCertificate *)PORT_ArenaZAlloc(arena, sizeof(CERTCertificate)); + + if ( !cert ) { + goto loser; + } + + cert->arena = arena; + cert->derCert = *derSignedCert; + + + /* decode the certificate info */ + rv = SEC_QuickDERDecodeItem(arena, cert, SEC_SignedCertificateTemplate, + &cert->derCert); + + if ( rv ) { + goto loser; + } + + if (cert_HasUnknownCriticalExten (cert->extensions) == PR_TRUE) { + cert->options.bits.hasUnsupportedCriticalExt = PR_TRUE; + } + + /* generate and save the database key for the cert + rv = CERT_KeyFromIssuerAndSN(arena, &cert->derIssuer, &cert->serialNumber, + &cert->certKey); + if ( rv ) { + goto loser; + } */ + + /* initialize the subjectKeyID + rv = cert_GetKeyID(cert); + if ( rv != SECSuccess ) { + goto loser; + } + + /* initialize keyUsage + rv = GetKeyUsage(cert); + if ( rv != SECSuccess ) { + goto loser; + } + + /* initialize the certType + rv = cert_GetCertType(cert); + if ( rv != SECSuccess ) { + goto loser; + } + */ + + tmpname = CERT_NameToAscii(&cert->subject); +/* tmpname2 = CERT_NameToAscii(&cert->subject); */ + + + return tmpname; + +/* tmpname = CERT_NameToAscii(&cert->serialNumber); */ + + + +loser: + + if ( arena ) { + PORT_FreeArena(arena, PR_FALSE); + } + + return(0); +} + +/* + * take a DER certificate and return the subject + * PT + */ +char * +CERT_DecodeDERCertificateIssuer(SECItem *derSignedCert) +{ + CERTCertificate *cert; + PRArenaPool *arena; + void *data; + int rv; + int len; + char *tmpname,*tmpname2; + + /* make a new arena */ + arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); + + if ( !arena ) { + return 0; + } + + /* allocate the certificate structure */ + cert = (CERTCertificate *)PORT_ArenaZAlloc(arena, sizeof(CERTCertificate)); + + if ( !cert ) { + goto loser; + } + + cert->arena = arena; + cert->derCert = *derSignedCert; + + + /* decode the certificate info */ + rv = SEC_QuickDERDecodeItem(arena, cert, SEC_SignedCertificateTemplate, + &cert->derCert); + + if ( rv ) { + goto loser; + } + + if (cert_HasUnknownCriticalExten (cert->extensions) == PR_TRUE) { + cert->options.bits.hasUnsupportedCriticalExt = PR_TRUE; + } + + /* generate and save the database key for the cert + rv = CERT_KeyFromIssuerAndSN(arena, &cert->derIssuer, &cert->serialNumber, + &cert->certKey); + + if ( rv ) { + goto loser; + } */ + + /* initialize the subjectKeyID + rv = cert_GetKeyID(cert); + if ( rv != SECSuccess ) { + goto loser; + } + + /* initialize keyUsage + rv = GetKeyUsage(cert); + if ( rv != SECSuccess ) { + goto loser; + } + + /* initialize the certType + rv = cert_GetCertType(cert); + if ( rv != SECSuccess ) { + goto loser; + } + */ + + tmpname = CERT_NameToAscii(&cert->issuer); +/* tmpname2 = CERT_NameToAscii(&cert->subject); */ + + + return tmpname; + +/* tmpname = CERT_NameToAscii(&cert->serialNumber); */ + + + +loser: + + if ( arena ) { + PORT_FreeArena(arena, PR_FALSE); + } + + return(0); +} + + + CERTCertificate * __CERT_DecodeDERCertificate(SECItem *derSignedCert, PRBool copyDER, char *nickname)