respcmn.c
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:11k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /* -*- Mode: C; tab-width: 8 -*-*/
  2. /*
  3.  * The contents of this file are subject to the Mozilla Public
  4.  * License Version 1.1 (the "License"); you may not use this file
  5.  * except in compliance with the License. You may obtain a copy of
  6.  * the License at http://www.mozilla.org/MPL/
  7.  * 
  8.  * Software distributed under the License is distributed on an "AS
  9.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  10.  * implied. See the License for the specific language governing
  11.  * rights and limitations under the License.
  12.  * 
  13.  * The Original Code is the Netscape security libraries.
  14.  * 
  15.  * The Initial Developer of the Original Code is Netscape
  16.  * Communications Corporation.  Portions created by Netscape are 
  17.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  18.  * Rights Reserved.
  19.  * 
  20.  * Contributor(s):
  21.  * 
  22.  * Alternatively, the contents of this file may be used under the
  23.  * terms of the GNU General Public License Version 2 or later (the
  24.  * "GPL"), in which case the provisions of the GPL are applicable 
  25.  * instead of those above.  If you wish to allow use of your 
  26.  * version of this file only under the terms of the GPL and not to
  27.  * allow others to use your version of this file under the MPL,
  28.  * indicate your decision by deleting the provisions above and
  29.  * replace them with the notice and other provisions required by
  30.  * the GPL.  If you do not delete the provisions above, a recipient
  31.  * may use your version of this file under either the MPL or the
  32.  * GPL.
  33.  */
  34. #include "cmmf.h"
  35. #include "cmmfi.h"
  36. #include "secitem.h"
  37. SECStatus 
  38. cmmf_DestroyPKIStatusInfo (CMMFPKIStatusInfo *info, PRBool freeit)
  39. {
  40.     if (info->status.data != NULL) {
  41.         PORT_Free(info->status.data);
  42.     }
  43.     if (info->statusString.data != NULL) {
  44.         PORT_Free(info->statusString.data);
  45.     }
  46.     if (info->failInfo.data != NULL) {
  47.         PORT_Free(info->failInfo.data);
  48.     }
  49.     if (freeit) {
  50.         PORT_Free(info);
  51.     }
  52.     return SECSuccess;
  53. }
  54. SECStatus
  55. CMMF_DestroyCertResponse(CMMFCertResponse *inCertResp)
  56. {
  57.     PORT_Assert(inCertResp != NULL);
  58.     if (inCertResp != NULL) {
  59.         if (inCertResp->certReqId.data != NULL) {
  60.     PORT_Free(inCertResp->certReqId.data);
  61. }
  62. cmmf_DestroyPKIStatusInfo(&inCertResp->status, PR_FALSE);
  63. if (inCertResp->certifiedKeyPair != NULL) {
  64.     CMMF_DestroyCertifiedKeyPair(inCertResp->certifiedKeyPair);
  65. }
  66. PORT_Free(inCertResp);
  67.     }
  68.     return SECSuccess;
  69. }
  70. SECStatus
  71. CMMF_DestroyCertRepContent(CMMFCertRepContent *inCertRepContent)
  72. {
  73.     CMMFCertifiedKeyPair *certKeyPair;
  74.     int i;
  75.     PORT_Assert(inCertRepContent != NULL);
  76.     if (inCertRepContent != NULL && inCertRepContent->poolp != NULL) {
  77. if (!inCertRepContent->isDecoded) {
  78.   if (inCertRepContent->response != NULL) {
  79.     for (i=0; inCertRepContent->response[i] != NULL; i++) {
  80.         certKeyPair = inCertRepContent->response[i]->certifiedKeyPair;
  81. if (certKeyPair != NULL                    &&
  82.     certKeyPair->certOrEncCert.choice == cmmfCertificate &&
  83.     certKeyPair->certOrEncCert.cert.certificate != NULL) {
  84.     CERT_DestroyCertificate
  85.                  (certKeyPair->certOrEncCert.cert.certificate);
  86. }
  87.     }
  88.   }
  89.   if (inCertRepContent->caPubs != NULL) {
  90.     for (i=0; inCertRepContent->caPubs[i] != NULL; i++) {
  91.         CERT_DestroyCertificate(inCertRepContent->caPubs[i]);
  92.     }
  93.   }
  94. }
  95.         PORT_FreeArena(inCertRepContent->poolp, PR_TRUE);
  96.     }
  97.     return SECSuccess;
  98. }
  99. SECStatus
  100. CMMF_DestroyPOPODecKeyChallContent(CMMFPOPODecKeyChallContent *inDecKeyCont)
  101. {
  102.     PORT_Assert(inDecKeyCont != NULL);
  103.     if (inDecKeyCont != NULL && inDecKeyCont->poolp) {
  104.         PORT_FreeArena(inDecKeyCont->poolp, PR_FALSE);
  105.     }
  106.     return SECSuccess;
  107. }
  108. SECStatus
  109. crmf_create_prtime(SECItem *src, PRTime **dest)
  110. {
  111.    *dest = PORT_ZNew(PRTime);
  112.     return DER_UTCTimeToTime(*dest, src);
  113. }
  114. CRMFCertExtension*
  115. crmf_copy_cert_extension(PRArenaPool *poolp, CRMFCertExtension *inExtension)
  116. {
  117.     PRBool             isCritical;
  118.     SECOidTag          id;
  119.     SECItem           *data;
  120.     CRMFCertExtension *newExt;
  121.     PORT_Assert(inExtension != NULL);
  122.     if (inExtension == NULL) {
  123.         return NULL;
  124.     }
  125.     id         = CRMF_CertExtensionGetOidTag(inExtension);
  126.     isCritical = CRMF_CertExtensionGetIsCritical(inExtension);
  127.     data       = CRMF_CertExtensionGetValue(inExtension);
  128.     newExt = crmf_create_cert_extension(poolp, id, 
  129. isCritical,
  130. data);
  131.     SECITEM_FreeItem(data, PR_TRUE);
  132.     return newExt;    
  133. }
  134. static SECItem*
  135. cmmf_encode_certificate(CERTCertificate *inCert)
  136. {
  137.     return SEC_ASN1EncodeItem(NULL, NULL, inCert, 
  138.       SEC_SignedCertificateTemplate);
  139. }
  140. CERTCertList*
  141. cmmf_MakeCertList(CERTCertificate **inCerts)
  142. {
  143.     CERTCertList    *certList;
  144.     CERTCertificate *currCert;
  145.     SECItem         *derCert, *freeCert = NULL;
  146.     SECStatus        rv;
  147.     int              i;
  148.     certList = CERT_NewCertList();
  149.     if (certList == NULL) {
  150.         return NULL;
  151.     }
  152.     for (i=0; inCerts[i] != NULL; i++) {
  153.         derCert = &inCerts[i]->derCert;
  154. if (derCert->data == NULL) {
  155.     derCert = freeCert = cmmf_encode_certificate(inCerts[i]);
  156. }
  157. currCert=CERT_DecodeDERCertificate(derCert, PR_TRUE, NULL);
  158. if (freeCert != NULL) {
  159.     SECITEM_FreeItem(freeCert, PR_TRUE);
  160.     freeCert = NULL;
  161. }
  162. if (currCert == NULL) {
  163.     goto loser;
  164. }
  165. rv = CERT_AddCertToListTail(certList, currCert);
  166. if (rv != SECSuccess) {
  167.     goto loser;
  168. }
  169.     }
  170.     return certList;
  171.  loser:
  172.     CERT_DestroyCertList(certList);
  173.     return NULL;
  174. }
  175. CMMFPKIStatus
  176. cmmf_PKIStatusInfoGetStatus(CMMFPKIStatusInfo *inStatus)
  177. {
  178.     long derVal;
  179.     derVal = DER_GetInteger(&inStatus->status);
  180.     if (derVal == -1 || derVal < cmmfGranted || derVal >= cmmfNumPKIStatus) {
  181.         return cmmfNoPKIStatus;
  182.     }
  183.     return (CMMFPKIStatus)derVal;
  184. }
  185. int
  186. CMMF_CertRepContentGetNumResponses(CMMFCertRepContent *inCertRepContent)
  187. {
  188.     int numResponses = 0;
  189.     PORT_Assert (inCertRepContent != NULL);
  190.     if (inCertRepContent != NULL && inCertRepContent->response != NULL) {
  191.         while (inCertRepContent->response[numResponses] != NULL) {
  192.     numResponses++;
  193. }
  194.     }
  195.     return numResponses;
  196. }
  197. SECStatus
  198. cmmf_DestroyCertOrEncCert(CMMFCertOrEncCert *certOrEncCert, PRBool freeit)
  199. {
  200.     switch (certOrEncCert->choice) {
  201.     case cmmfCertificate:
  202.         CERT_DestroyCertificate(certOrEncCert->cert.certificate);
  203. break;
  204.     case cmmfEncryptedCert:
  205.         crmf_destroy_encrypted_value(certOrEncCert->cert.encryptedCert,
  206.      PR_TRUE);
  207. break;
  208.     default:
  209.         break;
  210.     }
  211.     if (freeit) {
  212.         PORT_Free(certOrEncCert);
  213.     }
  214.     return SECSuccess;
  215. }
  216. SECStatus
  217. cmmf_copy_secitem (PRArenaPool *poolp, SECItem *dest, SECItem *src)
  218. {
  219.     SECStatus rv;
  220.     if (src->data != NULL) {
  221.         rv = SECITEM_CopyItem(poolp, dest, src);
  222.     } else {
  223.         dest->data = NULL;
  224. dest->len  = 0;
  225. rv = SECSuccess;
  226.     }
  227.     return rv;
  228. }
  229. SECStatus
  230. CMMF_DestroyCertifiedKeyPair(CMMFCertifiedKeyPair *inCertKeyPair)
  231. {
  232.     PORT_Assert(inCertKeyPair != NULL);
  233.     if (inCertKeyPair != NULL) {
  234.         cmmf_DestroyCertOrEncCert(&inCertKeyPair->certOrEncCert, PR_FALSE);
  235.     }
  236.     if (inCertKeyPair->privateKey) {
  237.         crmf_destroy_encrypted_value(inCertKeyPair->privateKey, PR_TRUE);
  238.     }
  239.     if (inCertKeyPair->derPublicationInfo.data) {
  240.         PORT_Free(inCertKeyPair->derPublicationInfo.data);
  241.     }
  242.     PORT_Free(inCertKeyPair);
  243.     return SECSuccess;
  244. }
  245. SECStatus
  246. cmmf_CopyCertResponse(PRArenaPool      *poolp, 
  247.       CMMFCertResponse *dest,
  248.       CMMFCertResponse *src)
  249. {
  250.     SECStatus rv;
  251.     if (src->certReqId.data != NULL) {
  252.         rv = SECITEM_CopyItem(poolp, &dest->certReqId, &src->certReqId);
  253. if (rv != SECSuccess) {
  254.     return rv;
  255. }
  256.     }
  257.     rv = cmmf_CopyPKIStatusInfo(poolp, &dest->status, &src->status);
  258.     if (rv != SECSuccess) {
  259.         return rv;
  260.     }
  261.     if (src->certifiedKeyPair != NULL) {
  262.         dest->certifiedKeyPair = (poolp == NULL) ?
  263.                                   PORT_ZNew(CMMFCertifiedKeyPair) :
  264.                           PORT_ArenaZNew(poolp, CMMFCertifiedKeyPair);
  265. if (dest->certifiedKeyPair == NULL) {
  266.     return SECFailure;
  267. }
  268.         rv = cmmf_CopyCertifiedKeyPair(poolp, dest->certifiedKeyPair,
  269.        src->certifiedKeyPair);
  270. if (rv != SECSuccess) {
  271.     return rv;
  272. }
  273.     }
  274.     return SECSuccess;
  275. }
  276. static SECStatus
  277. cmmf_CopyCertOrEncCert(PRArenaPool *poolp, CMMFCertOrEncCert *dest,
  278.        CMMFCertOrEncCert *src)
  279. {
  280.     SECStatus           rv = SECSuccess;
  281.     CRMFEncryptedValue *encVal;
  282.     dest->choice = src->choice;
  283.     rv = cmmf_copy_secitem(poolp, &dest->derValue, &src->derValue);
  284.     switch (src->choice) {
  285.     case cmmfCertificate:
  286.         dest->cert.certificate = CERT_DupCertificate(src->cert.certificate);
  287. break;
  288.     case cmmfEncryptedCert:
  289.         dest->cert.encryptedCert = encVal = (poolp == NULL) ?
  290.                              PORT_ZNew(CRMFEncryptedValue) :
  291.      PORT_ArenaZNew(poolp, CRMFEncryptedValue);
  292. if (encVal == NULL) {
  293.     return SECFailure;
  294. }
  295.         rv = crmf_copy_encryptedvalue(poolp, src->cert.encryptedCert, encVal);
  296. if (rv != SECSuccess) {
  297.     return rv;
  298. }
  299. break;
  300.     default:
  301.         rv = SECFailure;
  302.     }
  303.     return rv;
  304. }
  305. SECStatus
  306. cmmf_CopyCertifiedKeyPair(PRArenaPool *poolp, CMMFCertifiedKeyPair *dest,
  307.   CMMFCertifiedKeyPair *src)
  308. {
  309.     SECStatus rv;
  310.     rv = cmmf_CopyCertOrEncCert(poolp, &dest->certOrEncCert, 
  311. &src->certOrEncCert);
  312.     if (rv != SECSuccess) {
  313.         return rv;
  314.     }
  315.     if (src->privateKey != NULL) {
  316.         CRMFEncryptedValue *encVal;
  317. encVal = dest->privateKey = (poolp == NULL) ?
  318.                              PORT_ZNew(CRMFEncryptedValue) :
  319.                                      PORT_ArenaZNew(poolp, CRMFEncryptedValue);
  320. if (encVal == NULL) {
  321.     return SECFailure;
  322. }
  323.         rv = crmf_copy_encryptedvalue(poolp, src->privateKey, 
  324.       dest->privateKey);
  325. if (rv != SECSuccess) {
  326.     return rv;
  327. }
  328.     }
  329.     rv = cmmf_copy_secitem(poolp, &dest->derPublicationInfo, 
  330.    &src->derPublicationInfo);
  331.     return rv;
  332. }
  333. SECStatus
  334. cmmf_CopyPKIStatusInfo(PRArenaPool *poolp, CMMFPKIStatusInfo *dest,
  335.        CMMFPKIStatusInfo *src)
  336. {
  337.     SECStatus rv;
  338.     rv = cmmf_copy_secitem (poolp, &dest->status, &src->status);
  339.     if (rv != SECSuccess) {
  340.         return rv;
  341.     }
  342.     rv = cmmf_copy_secitem (poolp, &dest->statusString, &src->statusString);
  343.     if (rv != SECSuccess) {
  344.         return rv;
  345.     }
  346.     rv = cmmf_copy_secitem (poolp, &dest->failInfo, &src->failInfo);
  347.     return rv;
  348. }
  349. CERTCertificate*
  350. cmmf_CertOrEncCertGetCertificate(CMMFCertOrEncCert *certOrEncCert,
  351.  CERTCertDBHandle  *certdb)
  352. {
  353.     if (certOrEncCert->choice           != cmmfCertificate || 
  354. certOrEncCert->cert.certificate == NULL) {
  355.         return NULL;
  356.     }
  357.     return CERT_NewTempCertificate(certdb,
  358.    &certOrEncCert->cert.certificate->derCert,
  359.    NULL, PR_FALSE, PR_TRUE);
  360. }
  361. SECStatus 
  362. cmmf_PKIStatusInfoSetStatus(CMMFPKIStatusInfo    *statusInfo,
  363.     PRArenaPool          *poolp,
  364.     CMMFPKIStatus         inStatus)
  365. {
  366.     SECItem *dummy;
  367.     
  368.     if (inStatus <cmmfGranted || inStatus >= cmmfNumPKIStatus) {
  369.         return SECFailure;
  370.     }
  371.     dummy = SEC_ASN1EncodeInteger(poolp, &statusInfo->status, inStatus); 
  372.     PORT_Assert(dummy == &statusInfo->status);
  373.     if (dummy != &statusInfo->status) {
  374.         SECITEM_FreeItem(dummy, PR_TRUE);
  375. return SECFailure;
  376.     }
  377.     return SECSuccess;
  378. }