Fix for 164744 - implement new functions for pk12util . r=wtc
git-svn-id: svn://10.0.0.236/trunk@131051 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -552,38 +552,6 @@ p12u_WriteToExportFile(void *arg, const char *buf, unsigned long len)
|
||||
}
|
||||
}
|
||||
|
||||
static SECStatus
|
||||
cert_UserCertsOnly(CERTCertList *certList)
|
||||
{
|
||||
CERTCertListNode *node, *freenode;
|
||||
CERTCertificate *cert;
|
||||
PRUint32 numusercerts = 0;
|
||||
|
||||
node = CERT_LIST_HEAD(certList);
|
||||
|
||||
while ( ! CERT_LIST_END(node, certList) ) {
|
||||
cert = node->cert;
|
||||
if ( !( cert->trust->sslFlags & CERTDB_USER ) &&
|
||||
!( cert->trust->emailFlags & CERTDB_USER ) &&
|
||||
!( cert->trust->objectSigningFlags & CERTDB_USER ) ) {
|
||||
/* Not a User Cert, so remove this cert from the list */
|
||||
freenode = node;
|
||||
node = CERT_LIST_NEXT(node);
|
||||
CERT_RemoveCertListNode(freenode);
|
||||
} else {
|
||||
/* Is a User cert, so leave it in the list */
|
||||
node = CERT_LIST_NEXT(node);
|
||||
numusercerts ++;
|
||||
}
|
||||
}
|
||||
|
||||
if (numusercerts) {
|
||||
return(SECSuccess);
|
||||
} else {
|
||||
return(SECFailure);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
P12U_ExportPKCS12Object(char *nn, char *outfile, PK11SlotInfo *inSlot,
|
||||
secuPWData *slotPw, secuPWData *p12FilePw)
|
||||
@@ -609,10 +577,11 @@ P12U_ExportPKCS12Object(char *nn, char *outfile, PK11SlotInfo *inSlot,
|
||||
return;
|
||||
}
|
||||
|
||||
if (SECSuccess != cert_UserCertsOnly(certlist)) {
|
||||
SECU_PrintError(progName,"find user certs from nickname failed");
|
||||
if ((SECSuccess != CERT_FilterCertListForUserCerts(certlist)) ||
|
||||
CERT_LIST_EMPTY(certlist)) {
|
||||
SECU_PrintError(progName,"no user certs from given nickname");
|
||||
pk12uErrno = PK12UERR_FINDCERTBYNN;
|
||||
return;
|
||||
goto loser;
|
||||
}
|
||||
|
||||
/* Password to use for PKCS12 file. */
|
||||
@@ -689,10 +658,11 @@ P12U_ExportPKCS12Object(char *nn, char *outfile, PK11SlotInfo *inSlot,
|
||||
pk12uErrno = PK12UERR_ADDCERTKEY;
|
||||
goto loser;
|
||||
}
|
||||
CERT_DestroyCertificate(cert);
|
||||
node->cert = NULL;
|
||||
}
|
||||
|
||||
CERT_DestroyCertList(certlist);
|
||||
certlist = NULL;
|
||||
|
||||
if(SEC_PKCS12Encode(p12ecx, p12u_WriteToExportFile, p12cxt)
|
||||
!= SECSuccess) {
|
||||
SECU_PrintError(progName,"PKCS12 encode failed");
|
||||
@@ -710,17 +680,10 @@ P12U_ExportPKCS12Object(char *nn, char *outfile, PK11SlotInfo *inSlot,
|
||||
loser:
|
||||
SEC_PKCS12DestroyExportContext(p12ecx);
|
||||
|
||||
for (node = CERT_LIST_HEAD(certlist);!CERT_LIST_END(node,certlist);node=CERT_LIST_NEXT(node))
|
||||
{
|
||||
CERTCertificate* cert = node->cert;
|
||||
if (!node->cert) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if(cert) {
|
||||
CERT_DestroyCertificate(cert);
|
||||
}
|
||||
}
|
||||
if (certlist) {
|
||||
CERT_DestroyCertList(certlist);
|
||||
certlist = NULL;
|
||||
}
|
||||
|
||||
if (slotPw)
|
||||
PR_Free(slotPw->data);
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
/*
|
||||
* cert.h - public data structures and prototypes for the certificate library
|
||||
*
|
||||
* $Id: cert.h,v 1.22 2002-09-23 21:31:35 wtc%netscape.com Exp $
|
||||
* $Id: cert.h,v 1.23 2002-10-03 03:34:35 jpierre%netscape.com Exp $
|
||||
*/
|
||||
|
||||
#ifndef _CERT_H_
|
||||
@@ -968,6 +968,11 @@ CERT_DupCertList(CERTCertificateList * oldList);
|
||||
|
||||
extern void CERT_DestroyCertificateList(CERTCertificateList *list);
|
||||
|
||||
/* is cert a user cert ? ie. does it have CERTDB_USER trust,
|
||||
ie. a private key
|
||||
*/
|
||||
PRBool CERT_IsUserCert(CERTCertificate* cert);
|
||||
|
||||
/* is cert a newer than cert b? */
|
||||
PRBool CERT_IsNewer(CERTCertificate *certa, CERTCertificate *certb);
|
||||
|
||||
@@ -1241,6 +1246,12 @@ SECStatus
|
||||
CERT_FilterCertListByCANames(CERTCertList *certList, int nCANames,
|
||||
char **caNames, SECCertUsage usage);
|
||||
|
||||
/*
|
||||
* Filter a list of certificates, removing those certs that aren't user certs
|
||||
*/
|
||||
SECStatus
|
||||
CERT_FilterCertListForUserCerts(CERTCertList *certList);
|
||||
|
||||
/*
|
||||
* Collect the nicknames from all certs in a CertList. If the cert is not
|
||||
* valid, append a string to that nickname.
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
/*
|
||||
* Certificate handling code
|
||||
*
|
||||
* $Id: certdb.c,v 1.43 2002-10-01 14:32:07 ian.mcgreer%sun.com Exp $
|
||||
* $Id: certdb.c,v 1.44 2002-10-03 03:34:36 jpierre%netscape.com Exp $
|
||||
*/
|
||||
|
||||
#include "nssilock.h"
|
||||
@@ -2603,6 +2603,45 @@ loser:
|
||||
return(SECFailure);
|
||||
}
|
||||
|
||||
PRBool CERT_IsUserCert(CERTCertificate* cert)
|
||||
{
|
||||
if ( (cert->trust->sslFlags & CERTDB_USER ) ||
|
||||
(cert->trust->emailFlags & CERTDB_USER ) ||
|
||||
(cert->trust->objectSigningFlags & CERTDB_USER ) ) {
|
||||
return PR_TRUE;
|
||||
} else {
|
||||
return PR_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
SECStatus
|
||||
CERT_FilterCertListForUserCerts(CERTCertList *certList)
|
||||
{
|
||||
CERTCertListNode *node, *freenode;
|
||||
CERTCertificate *cert;
|
||||
|
||||
if (!certList) {
|
||||
return SECFailure;
|
||||
}
|
||||
|
||||
node = CERT_LIST_HEAD(certList);
|
||||
|
||||
while ( ! CERT_LIST_END(node, certList) ) {
|
||||
cert = node->cert;
|
||||
if ( PR_TRUE != CERT_IsUserCert(cert) ) {
|
||||
/* Not a User Cert, so remove this cert from the list */
|
||||
freenode = node;
|
||||
node = CERT_LIST_NEXT(node);
|
||||
CERT_RemoveCertListNode(freenode);
|
||||
} else {
|
||||
/* Is a User cert, so leave it in the list */
|
||||
node = CERT_LIST_NEXT(node);
|
||||
}
|
||||
}
|
||||
|
||||
return(SECSuccess);
|
||||
}
|
||||
|
||||
static PZLock *certRefCountLock = NULL;
|
||||
|
||||
/*
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
/*
|
||||
* certt.h - public data structures for the certificate library
|
||||
*
|
||||
* $Id: certt.h,v 1.21 2002-10-01 14:32:09 ian.mcgreer%sun.com Exp $
|
||||
* $Id: certt.h,v 1.22 2002-10-03 03:34:36 jpierre%netscape.com Exp $
|
||||
*/
|
||||
#ifndef _CERTT_H_
|
||||
#define _CERTT_H_
|
||||
@@ -371,6 +371,7 @@ struct CERTCertListStr {
|
||||
#define CERT_LIST_HEAD(l) ((CERTCertListNode *)PR_LIST_HEAD(&l->list))
|
||||
#define CERT_LIST_NEXT(n) ((CERTCertListNode *)n->links.next)
|
||||
#define CERT_LIST_END(n,l) (((void *)n) == ((void *)&l->list))
|
||||
#define CERT_LIST_EMPTY(l) CERT_LIST_END(CERT_LIST_HEAD(l), l)
|
||||
|
||||
struct CERTCrlEntryStr {
|
||||
SECItem serialNumber;
|
||||
|
||||
@@ -89,32 +89,6 @@ CERT_MatchNickname(char *name1, char *name2) {
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
static SECStatus
|
||||
cert_UserCertsOnly(CERTCertList *certList)
|
||||
{
|
||||
CERTCertListNode *node, *freenode;
|
||||
CERTCertificate *cert;
|
||||
|
||||
node = CERT_LIST_HEAD(certList);
|
||||
|
||||
while ( ! CERT_LIST_END(node, certList) ) {
|
||||
cert = node->cert;
|
||||
if ( !( cert->trust->sslFlags & CERTDB_USER ) &&
|
||||
!( cert->trust->emailFlags & CERTDB_USER ) &&
|
||||
!( cert->trust->objectSigningFlags & CERTDB_USER ) ) {
|
||||
/* Not a User Cert, so remove this cert from the list */
|
||||
freenode = node;
|
||||
node = CERT_LIST_NEXT(node);
|
||||
CERT_RemoveCertListNode(freenode);
|
||||
} else {
|
||||
/* Is a User cert, so leave it in the list */
|
||||
node = CERT_LIST_NEXT(node);
|
||||
}
|
||||
}
|
||||
|
||||
return(SECSuccess);
|
||||
}
|
||||
|
||||
/*
|
||||
* Find all user certificates that match the given criteria.
|
||||
*
|
||||
@@ -181,7 +155,7 @@ CERT_FindUserCertsByUsage(CERTCertDBHandle *handle,
|
||||
certList = CERT_CreateSubjectCertList(certList, handle,
|
||||
&cert->derSubject, time, validOnly);
|
||||
|
||||
cert_UserCertsOnly(certList);
|
||||
CERT_FilterCertListForUserCerts(certList);
|
||||
|
||||
/* drop the extra reference */
|
||||
CERT_DestroyCertificate(cert);
|
||||
@@ -312,7 +286,7 @@ CERT_FindUserCertByUsage(CERTCertDBHandle *handle,
|
||||
certList = CERT_CreateSubjectCertList(certList, handle,
|
||||
&cert->derSubject, time, validOnly);
|
||||
|
||||
cert_UserCertsOnly(certList);
|
||||
CERT_FilterCertListForUserCerts(certList);
|
||||
|
||||
/* drop the extra reference */
|
||||
CERT_DestroyCertificate(cert);
|
||||
|
||||
@@ -691,8 +691,10 @@ CERT_DecodeOCSPResponse;
|
||||
CERT_DestroyOCSPCertID;
|
||||
CERT_DestroyOCSPRequest;
|
||||
CERT_EncodeOCSPRequest;
|
||||
CERT_FilterCertListForUserCerts;
|
||||
CERT_GetOCSPResponseStatus;
|
||||
CERT_GetOCSPStatusForCertID;
|
||||
CERT_IsUserCert;
|
||||
CERT_RemoveCertListNode;
|
||||
CERT_VerifyCACertForUsage;
|
||||
CERT_VerifyCertificate;
|
||||
|
||||
Reference in New Issue
Block a user