respcmn.c
来自「支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS」· C语言 代码 · 共 415 行
C
415 行
/* -*- 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. */#include "cmmf.h"#include "cmmfi.h"#include "secitem.h"SECStatus cmmf_DestroyPKIStatusInfo (CMMFPKIStatusInfo *info, PRBool freeit){ if (info->status.data != NULL) { PORT_Free(info->status.data); } if (info->statusString.data != NULL) { PORT_Free(info->statusString.data); } if (info->failInfo.data != NULL) { PORT_Free(info->failInfo.data); } if (freeit) { PORT_Free(info); } return SECSuccess;}SECStatusCMMF_DestroyCertResponse(CMMFCertResponse *inCertResp){ PORT_Assert(inCertResp != NULL); if (inCertResp != NULL) { if (inCertResp->certReqId.data != NULL) { PORT_Free(inCertResp->certReqId.data); } cmmf_DestroyPKIStatusInfo(&inCertResp->status, PR_FALSE); if (inCertResp->certifiedKeyPair != NULL) { CMMF_DestroyCertifiedKeyPair(inCertResp->certifiedKeyPair); } PORT_Free(inCertResp); } return SECSuccess;}SECStatusCMMF_DestroyCertRepContent(CMMFCertRepContent *inCertRepContent){ CMMFCertifiedKeyPair *certKeyPair; int i; PORT_Assert(inCertRepContent != NULL); if (inCertRepContent != NULL && inCertRepContent->poolp != NULL) { if (!inCertRepContent->isDecoded) { if (inCertRepContent->response != NULL) { for (i=0; inCertRepContent->response[i] != NULL; i++) { certKeyPair = inCertRepContent->response[i]->certifiedKeyPair; if (certKeyPair != NULL && certKeyPair->certOrEncCert.choice == cmmfCertificate && certKeyPair->certOrEncCert.cert.certificate != NULL) { CERT_DestroyCertificate (certKeyPair->certOrEncCert.cert.certificate); } } } if (inCertRepContent->caPubs != NULL) { for (i=0; inCertRepContent->caPubs[i] != NULL; i++) { CERT_DestroyCertificate(inCertRepContent->caPubs[i]); } } } PORT_FreeArena(inCertRepContent->poolp, PR_TRUE); } return SECSuccess;}SECStatusCMMF_DestroyPOPODecKeyChallContent(CMMFPOPODecKeyChallContent *inDecKeyCont){ PORT_Assert(inDecKeyCont != NULL); if (inDecKeyCont != NULL && inDecKeyCont->poolp) { PORT_FreeArena(inDecKeyCont->poolp, PR_FALSE); } return SECSuccess;}SECStatuscrmf_create_prtime(SECItem *src, PRTime **dest){ *dest = PORT_ZNew(PRTime); return DER_UTCTimeToTime(*dest, src);}CRMFCertExtension*crmf_copy_cert_extension(PRArenaPool *poolp, CRMFCertExtension *inExtension){ PRBool isCritical; SECOidTag id; SECItem *data; CRMFCertExtension *newExt; PORT_Assert(inExtension != NULL); if (inExtension == NULL) { return NULL; } id = CRMF_CertExtensionGetOidTag(inExtension); isCritical = CRMF_CertExtensionGetIsCritical(inExtension); data = CRMF_CertExtensionGetValue(inExtension); newExt = crmf_create_cert_extension(poolp, id, isCritical, data); SECITEM_FreeItem(data, PR_TRUE); return newExt; }static SECItem*cmmf_encode_certificate(CERTCertificate *inCert){ return SEC_ASN1EncodeItem(NULL, NULL, inCert, SEC_SignedCertificateTemplate);}CERTCertList*cmmf_MakeCertList(CERTCertificate **inCerts){ CERTCertList *certList; CERTCertificate *currCert; SECItem *derCert, *freeCert = NULL; SECStatus rv; int i; certList = CERT_NewCertList(); if (certList == NULL) { return NULL; } for (i=0; inCerts[i] != NULL; i++) { derCert = &inCerts[i]->derCert; if (derCert->data == NULL) { derCert = freeCert = cmmf_encode_certificate(inCerts[i]); } currCert=CERT_DecodeDERCertificate(derCert, PR_TRUE, NULL); if (freeCert != NULL) { SECITEM_FreeItem(freeCert, PR_TRUE); freeCert = NULL; } if (currCert == NULL) { goto loser; } rv = CERT_AddCertToListTail(certList, currCert); if (rv != SECSuccess) { goto loser; } } return certList; loser: CERT_DestroyCertList(certList); return NULL;}CMMFPKIStatuscmmf_PKIStatusInfoGetStatus(CMMFPKIStatusInfo *inStatus){ long derVal; derVal = DER_GetInteger(&inStatus->status); if (derVal == -1 || derVal < cmmfGranted || derVal >= cmmfNumPKIStatus) { return cmmfNoPKIStatus; } return (CMMFPKIStatus)derVal;}intCMMF_CertRepContentGetNumResponses(CMMFCertRepContent *inCertRepContent){ int numResponses = 0; PORT_Assert (inCertRepContent != NULL); if (inCertRepContent != NULL && inCertRepContent->response != NULL) { while (inCertRepContent->response[numResponses] != NULL) { numResponses++; } } return numResponses;}SECStatuscmmf_DestroyCertOrEncCert(CMMFCertOrEncCert *certOrEncCert, PRBool freeit){ switch (certOrEncCert->choice) { case cmmfCertificate: CERT_DestroyCertificate(certOrEncCert->cert.certificate); break; case cmmfEncryptedCert: crmf_destroy_encrypted_value(certOrEncCert->cert.encryptedCert, PR_TRUE); break; default: break; } if (freeit) { PORT_Free(certOrEncCert); } return SECSuccess;}SECStatuscmmf_copy_secitem (PRArenaPool *poolp, SECItem *dest, SECItem *src){ SECStatus rv; if (src->data != NULL) { rv = SECITEM_CopyItem(poolp, dest, src); } else { dest->data = NULL; dest->len = 0; rv = SECSuccess; } return rv;}SECStatusCMMF_DestroyCertifiedKeyPair(CMMFCertifiedKeyPair *inCertKeyPair){ PORT_Assert(inCertKeyPair != NULL); if (inCertKeyPair != NULL) { cmmf_DestroyCertOrEncCert(&inCertKeyPair->certOrEncCert, PR_FALSE); } if (inCertKeyPair->privateKey) { crmf_destroy_encrypted_value(inCertKeyPair->privateKey, PR_TRUE); } if (inCertKeyPair->derPublicationInfo.data) { PORT_Free(inCertKeyPair->derPublicationInfo.data); } PORT_Free(inCertKeyPair); return SECSuccess;}SECStatuscmmf_CopyCertResponse(PRArenaPool *poolp, CMMFCertResponse *dest, CMMFCertResponse *src){ SECStatus rv; if (src->certReqId.data != NULL) { rv = SECITEM_CopyItem(poolp, &dest->certReqId, &src->certReqId); if (rv != SECSuccess) { return rv; } } rv = cmmf_CopyPKIStatusInfo(poolp, &dest->status, &src->status); if (rv != SECSuccess) { return rv; } if (src->certifiedKeyPair != NULL) { dest->certifiedKeyPair = (poolp == NULL) ? PORT_ZNew(CMMFCertifiedKeyPair) : PORT_ArenaZNew(poolp, CMMFCertifiedKeyPair); if (dest->certifiedKeyPair == NULL) { return SECFailure; } rv = cmmf_CopyCertifiedKeyPair(poolp, dest->certifiedKeyPair, src->certifiedKeyPair); if (rv != SECSuccess) { return rv; } } return SECSuccess;}static SECStatuscmmf_CopyCertOrEncCert(PRArenaPool *poolp, CMMFCertOrEncCert *dest, CMMFCertOrEncCert *src){ SECStatus rv = SECSuccess; CRMFEncryptedValue *encVal; dest->choice = src->choice; rv = cmmf_copy_secitem(poolp, &dest->derValue, &src->derValue); switch (src->choice) { case cmmfCertificate: dest->cert.certificate = CERT_DupCertificate(src->cert.certificate); break; case cmmfEncryptedCert: dest->cert.encryptedCert = encVal = (poolp == NULL) ? PORT_ZNew(CRMFEncryptedValue) : PORT_ArenaZNew(poolp, CRMFEncryptedValue); if (encVal == NULL) { return SECFailure; } rv = crmf_copy_encryptedvalue(poolp, src->cert.encryptedCert, encVal); if (rv != SECSuccess) { return rv; } break; default: rv = SECFailure; } return rv;}SECStatuscmmf_CopyCertifiedKeyPair(PRArenaPool *poolp, CMMFCertifiedKeyPair *dest, CMMFCertifiedKeyPair *src){ SECStatus rv; rv = cmmf_CopyCertOrEncCert(poolp, &dest->certOrEncCert, &src->certOrEncCert); if (rv != SECSuccess) { return rv; } if (src->privateKey != NULL) { CRMFEncryptedValue *encVal; encVal = dest->privateKey = (poolp == NULL) ? PORT_ZNew(CRMFEncryptedValue) : PORT_ArenaZNew(poolp, CRMFEncryptedValue); if (encVal == NULL) { return SECFailure; } rv = crmf_copy_encryptedvalue(poolp, src->privateKey, dest->privateKey); if (rv != SECSuccess) { return rv; } } rv = cmmf_copy_secitem(poolp, &dest->derPublicationInfo, &src->derPublicationInfo); return rv;}SECStatuscmmf_CopyPKIStatusInfo(PRArenaPool *poolp, CMMFPKIStatusInfo *dest, CMMFPKIStatusInfo *src){ SECStatus rv; rv = cmmf_copy_secitem (poolp, &dest->status, &src->status); if (rv != SECSuccess) { return rv; } rv = cmmf_copy_secitem (poolp, &dest->statusString, &src->statusString); if (rv != SECSuccess) { return rv; } rv = cmmf_copy_secitem (poolp, &dest->failInfo, &src->failInfo); return rv;}CERTCertificate*cmmf_CertOrEncCertGetCertificate(CMMFCertOrEncCert *certOrEncCert, CERTCertDBHandle *certdb){ if (certOrEncCert->choice != cmmfCertificate || certOrEncCert->cert.certificate == NULL) { return NULL; } return CERT_NewTempCertificate(certdb, &certOrEncCert->cert.certificate->derCert, NULL, PR_FALSE, PR_TRUE);}SECStatus cmmf_PKIStatusInfoSetStatus(CMMFPKIStatusInfo *statusInfo, PRArenaPool *poolp, CMMFPKIStatus inStatus){ SECItem *dummy; if (inStatus <cmmfGranted || inStatus >= cmmfNumPKIStatus) { return SECFailure; } dummy = SEC_ASN1EncodeInteger(poolp, &statusInfo->status, inStatus); PORT_Assert(dummy == &statusInfo->status); if (dummy != &statusInfo->status) { SECITEM_FreeItem(dummy, PR_TRUE); return SECFailure; } return SECSuccess;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?