cmmfresp.c

来自「支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS」· C语言 代码 · 共 313 行

C
313
字号
/* -*- Mode: C; tab-width: 8 -*-*//* * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/MPL/ *  * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. *  * The Original Code is the Netscape security libraries. *  * The Initial Developer of the Original Code is Netscape * Communications Corporation.  Portions created by Netscape are  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All * Rights Reserved. *  * Contributor(s): *  * Alternatively, the contents of this file may be used under the * terms of the GNU General Public License Version 2 or later (the * "GPL"), in which case the provisions of the GPL are applicable  * instead of those above.  If you wish to allow use of your  * version of this file only under the terms of the GPL and not to * allow others to use your version of this file under the MPL, * indicate your decision by deleting the provisions above and * replace them with the notice and other provisions required by * the GPL.  If you do not delete the provisions above, a recipient * may use your version of this file under either the MPL or the * GPL. *//* * This file will contain all routines dealing with creating a  * CMMFCertRepContent structure through Create/Set functions. */#include "cmmf.h"#include "cmmfi.h"#include "crmf.h"#include "crmfi.h"#include "secitem.h"#include "secder.h"CMMFCertRepContent*CMMF_CreateCertRepContent(void){    CMMFCertRepContent *retCertRep;    PRArenaPool        *poolp;    poolp = PORT_NewArena(CRMF_DEFAULT_ARENA_SIZE);    if (poolp == NULL) {        goto loser;    }    retCertRep = PORT_ArenaZNew(poolp, CMMFCertRepContent);    if (retCertRep == NULL) {        goto loser;    }    retCertRep->poolp = poolp;    return retCertRep; loser:    if (poolp != NULL) {        PORT_FreeArena(poolp, PR_FALSE);    }    return NULL;}SECStatus cmmf_CertOrEncCertSetCertificate(CMMFCertOrEncCert *certOrEncCert,				 PRArenaPool       *poolp,				 CERTCertificate   *inCert){    SECItem               *derDest = NULL;    SECStatus             rv;    if (inCert->derCert.data == NULL) {        derDest = SEC_ASN1EncodeItem(NULL, NULL, inCert, 				     CMMFCertOrEncCertCertificateTemplate);	if (derDest == NULL) {	    goto loser;	}    } else {        derDest = SECITEM_DupItem(&inCert->derCert);	if (derDest == NULL) {	    goto loser;	}    }    PORT_Assert(certOrEncCert->cert.certificate == NULL);    certOrEncCert->cert.certificate = CERT_DupCertificate(inCert);    certOrEncCert->choice = cmmfCertificate;    if (poolp != NULL) {        rv = SECITEM_CopyItem(poolp, &certOrEncCert->derValue, derDest);	if (rv != SECSuccess) {	    goto loser;	}    } else {        certOrEncCert->derValue = *derDest;    }    PORT_Free(derDest);    return SECSuccess; loser:    if (derDest != NULL) {        SECITEM_FreeItem(derDest, PR_TRUE);    }    return rv;}SECStatuscmmf_ExtractCertsFromList(CERTCertList      *inCertList,			  PRArenaPool       *poolp,			  CERTCertificate ***certArray){    CERTCertificate  **arrayLocalCopy;    CERTCertListNode  *node;    int                numNodes = 0, i;    for (node = CERT_LIST_HEAD(inCertList); !CERT_LIST_END(node, inCertList);	 node = CERT_LIST_NEXT(node)) {        numNodes++;    }    arrayLocalCopy = *certArray = (poolp == NULL) ?                    PORT_NewArray(CERTCertificate*, (numNodes+1)) :                    PORT_ArenaNewArray(poolp, CERTCertificate*, (numNodes+1));    if (arrayLocalCopy == NULL) {        return SECFailure;    }    for (node = CERT_LIST_HEAD(inCertList), i=0; 	 !CERT_LIST_END(node, inCertList);	 node = CERT_LIST_NEXT(node), i++) {        arrayLocalCopy[i] = CERT_DupCertificate(node->cert);	if (arrayLocalCopy[i] == NULL) {	    int j;	    	    for (j=0; j<i; j++) {	        CERT_DestroyCertificate(arrayLocalCopy[j]);	    }	    if (poolp == NULL) {	        PORT_Free(arrayLocalCopy);	    }	    *certArray = NULL;	    return SECFailure;	}    }    arrayLocalCopy[numNodes] = NULL;    return SECSuccess;}SECStatusCMMF_CertRepContentSetCertResponses(CMMFCertRepContent *inCertRepContent,				    CMMFCertResponse  **inCertResponses,				    int                 inNumResponses){    PRArenaPool       *poolp;    CMMFCertResponse **respArr, *newResp;    void              *mark;    SECStatus          rv;    int                i;    PORT_Assert (inCertRepContent != NULL &&		 inCertResponses  != NULL &&		 inNumResponses    > 0);    if (inCertRepContent == NULL ||	inCertResponses  == NULL ||	inCertRepContent->response != NULL) {        return SECFailure;    }    poolp = inCertRepContent->poolp;    mark = PORT_ArenaMark(poolp);    respArr = inCertRepContent->response =         PORT_ArenaZNewArray(poolp, CMMFCertResponse*, (inNumResponses+1));    if (respArr == NULL) {        goto loser;    }    for (i=0; i<inNumResponses; i++) {        newResp = PORT_ArenaZNew(poolp, CMMFCertResponse);	if (newResp == NULL) {	    goto loser;	}        rv = cmmf_CopyCertResponse(poolp, newResp, inCertResponses[i]);	if (rv != SECSuccess) {	    goto loser;	}	respArr[i] = newResp;    }    respArr[inNumResponses] = NULL;    PORT_ArenaUnmark(poolp, mark);    return SECSuccess; loser:    PORT_ArenaRelease(poolp, mark);    return SECFailure;}CMMFCertResponse*CMMF_CreateCertResponse(long inCertReqId){    SECItem          *dummy;    CMMFCertResponse *newResp;        newResp = PORT_ZNew(CMMFCertResponse);    if (newResp == NULL) {        goto loser;    }    dummy = SEC_ASN1EncodeInteger(NULL, &newResp->certReqId, inCertReqId);    if (dummy != &newResp->certReqId) {        goto loser;    }    return newResp; loser:    if (newResp != NULL) {        CMMF_DestroyCertResponse(newResp);    }    return NULL;}SECStatusCMMF_CertResponseSetPKIStatusInfoStatus(CMMFCertResponse *inCertResp,					CMMFPKIStatus     inPKIStatus){    PORT_Assert (inCertResp != NULL && inPKIStatus >= cmmfGranted		 && inPKIStatus < cmmfNumPKIStatus);    if  (inCertResp == NULL) {        return SECFailure;    }    return cmmf_PKIStatusInfoSetStatus(&inCertResp->status, NULL,				       inPKIStatus);}SECStatusCMMF_CertResponseSetCertificate (CMMFCertResponse *inCertResp,				 CERTCertificate  *inCertificate){    CMMFCertifiedKeyPair *keyPair = NULL;    SECStatus             rv = SECFailure;    PORT_Assert(inCertResp != NULL && inCertificate != NULL);    if (inCertResp == NULL || inCertificate == NULL) {        return SECFailure;    }    if (inCertResp->certifiedKeyPair == NULL) {        keyPair = inCertResp->certifiedKeyPair = 	    PORT_ZNew(CMMFCertifiedKeyPair);    } else {        keyPair = inCertResp->certifiedKeyPair;    }    if (keyPair == NULL) {        goto loser;    }    rv = cmmf_CertOrEncCertSetCertificate(&keyPair->certOrEncCert, NULL,					  inCertificate);    if (rv != SECSuccess) {        goto loser;    }    return SECSuccess; loser:    if (keyPair) {        if (keyPair->certOrEncCert.derValue.data) {	    PORT_Free(keyPair->certOrEncCert.derValue.data);	}	PORT_Free(keyPair);    }    return rv;}SECStatusCMMF_CertRepContentSetCAPubs(CMMFCertRepContent *inCertRepContent,			     CERTCertList       *inCAPubs){    PRArenaPool      *poolp;    void             *mark;    SECStatus         rv;    PORT_Assert(inCertRepContent != NULL &&		inCAPubs         != NULL &&		inCertRepContent->caPubs == NULL);        if (inCertRepContent == NULL ||	inCAPubs == NULL || inCertRepContent == NULL) {        return SECFailure;    }    poolp = inCertRepContent->poolp;    mark = PORT_ArenaMark(poolp);    rv = cmmf_ExtractCertsFromList(inCAPubs, poolp,				   &inCertRepContent->caPubs);    if (rv != SECSuccess) {        PORT_ArenaRelease(poolp, mark);    } else {        PORT_ArenaUnmark(poolp, mark);    }    return rv;}CERTCertificate*CMMF_CertifiedKeyPairGetCertificate(CMMFCertifiedKeyPair *inCertKeyPair,				    CERTCertDBHandle     *inCertdb){    PORT_Assert(inCertKeyPair != NULL);    if (inCertKeyPair == NULL) {        return NULL;    }    return cmmf_CertOrEncCertGetCertificate(&inCertKeyPair->certOrEncCert,					    inCertdb);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?