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

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. /*
  35.  * This file will contain all routines dealing with creating a 
  36.  * CMMFCertRepContent structure through Create/Set functions.
  37.  */
  38. #include "cmmf.h"
  39. #include "cmmfi.h"
  40. #include "crmf.h"
  41. #include "crmfi.h"
  42. #include "secitem.h"
  43. #include "secder.h"
  44. CMMFCertRepContent*
  45. CMMF_CreateCertRepContent(void)
  46. {
  47.     CMMFCertRepContent *retCertRep;
  48.     PRArenaPool        *poolp;
  49.     poolp = PORT_NewArena(CRMF_DEFAULT_ARENA_SIZE);
  50.     if (poolp == NULL) {
  51.         goto loser;
  52.     }
  53.     retCertRep = PORT_ArenaZNew(poolp, CMMFCertRepContent);
  54.     if (retCertRep == NULL) {
  55.         goto loser;
  56.     }
  57.     retCertRep->poolp = poolp;
  58.     return retCertRep;
  59.  loser:
  60.     if (poolp != NULL) {
  61.         PORT_FreeArena(poolp, PR_FALSE);
  62.     }
  63.     return NULL;
  64. }
  65. SECStatus 
  66. cmmf_CertOrEncCertSetCertificate(CMMFCertOrEncCert *certOrEncCert,
  67.  PRArenaPool       *poolp,
  68.  CERTCertificate   *inCert)
  69. {
  70.     SECItem               *derDest = NULL;
  71.     SECStatus             rv;
  72.     if (inCert->derCert.data == NULL) {
  73.         derDest = SEC_ASN1EncodeItem(NULL, NULL, inCert, 
  74.      CMMFCertOrEncCertCertificateTemplate);
  75. if (derDest == NULL) {
  76.     goto loser;
  77. }
  78.     } else {
  79.         derDest = SECITEM_DupItem(&inCert->derCert);
  80. if (derDest == NULL) {
  81.     goto loser;
  82. }
  83.     }
  84.     PORT_Assert(certOrEncCert->cert.certificate == NULL);
  85.     certOrEncCert->cert.certificate = CERT_DupCertificate(inCert);
  86.     certOrEncCert->choice = cmmfCertificate;
  87.     if (poolp != NULL) {
  88.         rv = SECITEM_CopyItem(poolp, &certOrEncCert->derValue, derDest);
  89. if (rv != SECSuccess) {
  90.     goto loser;
  91. }
  92.     } else {
  93.         certOrEncCert->derValue = *derDest;
  94.     }
  95.     PORT_Free(derDest);
  96.     return SECSuccess;
  97.  loser:
  98.     if (derDest != NULL) {
  99.         SECITEM_FreeItem(derDest, PR_TRUE);
  100.     }
  101.     return rv;
  102. }
  103. SECStatus
  104. cmmf_ExtractCertsFromList(CERTCertList      *inCertList,
  105.   PRArenaPool       *poolp,
  106.   CERTCertificate ***certArray)
  107. {
  108.     CERTCertificate  **arrayLocalCopy;
  109.     CERTCertListNode  *node;
  110.     int                numNodes = 0, i;
  111.     for (node = CERT_LIST_HEAD(inCertList); !CERT_LIST_END(node, inCertList);
  112.  node = CERT_LIST_NEXT(node)) {
  113.         numNodes++;
  114.     }
  115.     arrayLocalCopy = *certArray = (poolp == NULL) ?
  116.                     PORT_NewArray(CERTCertificate*, (numNodes+1)) :
  117.                     PORT_ArenaNewArray(poolp, CERTCertificate*, (numNodes+1));
  118.     if (arrayLocalCopy == NULL) {
  119.         return SECFailure;
  120.     }
  121.     for (node = CERT_LIST_HEAD(inCertList), i=0; 
  122.  !CERT_LIST_END(node, inCertList);
  123.  node = CERT_LIST_NEXT(node), i++) {
  124.         arrayLocalCopy[i] = CERT_DupCertificate(node->cert);
  125. if (arrayLocalCopy[i] == NULL) {
  126.     int j;
  127.     
  128.     for (j=0; j<i; j++) {
  129.         CERT_DestroyCertificate(arrayLocalCopy[j]);
  130.     }
  131.     if (poolp == NULL) {
  132.         PORT_Free(arrayLocalCopy);
  133.     }
  134.     *certArray = NULL;
  135.     return SECFailure;
  136. }
  137.     }
  138.     arrayLocalCopy[numNodes] = NULL;
  139.     return SECSuccess;
  140. }
  141. SECStatus
  142. CMMF_CertRepContentSetCertResponses(CMMFCertRepContent *inCertRepContent,
  143.     CMMFCertResponse  **inCertResponses,
  144.     int                 inNumResponses)
  145. {
  146.     PRArenaPool       *poolp;
  147.     CMMFCertResponse **respArr, *newResp;
  148.     void              *mark;
  149.     SECStatus          rv;
  150.     int                i;
  151.     PORT_Assert (inCertRepContent != NULL &&
  152.  inCertResponses  != NULL &&
  153.  inNumResponses    > 0);
  154.     if (inCertRepContent == NULL ||
  155. inCertResponses  == NULL ||
  156. inCertRepContent->response != NULL) {
  157.         return SECFailure;
  158.     }
  159.     poolp = inCertRepContent->poolp;
  160.     mark = PORT_ArenaMark(poolp);
  161.     respArr = inCertRepContent->response = 
  162.         PORT_ArenaZNewArray(poolp, CMMFCertResponse*, (inNumResponses+1));
  163.     if (respArr == NULL) {
  164.         goto loser;
  165.     }
  166.     for (i=0; i<inNumResponses; i++) {
  167.         newResp = PORT_ArenaZNew(poolp, CMMFCertResponse);
  168. if (newResp == NULL) {
  169.     goto loser;
  170. }
  171.         rv = cmmf_CopyCertResponse(poolp, newResp, inCertResponses[i]);
  172. if (rv != SECSuccess) {
  173.     goto loser;
  174. }
  175. respArr[i] = newResp;
  176.     }
  177.     respArr[inNumResponses] = NULL;
  178.     PORT_ArenaUnmark(poolp, mark);
  179.     return SECSuccess;
  180.  loser:
  181.     PORT_ArenaRelease(poolp, mark);
  182.     return SECFailure;
  183. }
  184. CMMFCertResponse*
  185. CMMF_CreateCertResponse(long inCertReqId)
  186. {
  187.     SECItem          *dummy;
  188.     CMMFCertResponse *newResp;
  189.     
  190.     newResp = PORT_ZNew(CMMFCertResponse);
  191.     if (newResp == NULL) {
  192.         goto loser;
  193.     }
  194.     dummy = SEC_ASN1EncodeInteger(NULL, &newResp->certReqId, inCertReqId);
  195.     if (dummy != &newResp->certReqId) {
  196.         goto loser;
  197.     }
  198.     return newResp;
  199.  loser:
  200.     if (newResp != NULL) {
  201.         CMMF_DestroyCertResponse(newResp);
  202.     }
  203.     return NULL;
  204. }
  205. SECStatus
  206. CMMF_CertResponseSetPKIStatusInfoStatus(CMMFCertResponse *inCertResp,
  207. CMMFPKIStatus     inPKIStatus)
  208. {
  209.     PORT_Assert (inCertResp != NULL && inPKIStatus >= cmmfGranted
  210.  && inPKIStatus < cmmfNumPKIStatus);
  211.     if  (inCertResp == NULL) {
  212.         return SECFailure;
  213.     }
  214.     return cmmf_PKIStatusInfoSetStatus(&inCertResp->status, NULL,
  215.        inPKIStatus);
  216. }
  217. SECStatus
  218. CMMF_CertResponseSetCertificate (CMMFCertResponse *inCertResp,
  219.  CERTCertificate  *inCertificate)
  220. {
  221.     CMMFCertifiedKeyPair *keyPair = NULL;
  222.     SECStatus             rv = SECFailure;
  223.     PORT_Assert(inCertResp != NULL && inCertificate != NULL);
  224.     if (inCertResp == NULL || inCertificate == NULL) {
  225.         return SECFailure;
  226.     }
  227.     if (inCertResp->certifiedKeyPair == NULL) {
  228.         keyPair = inCertResp->certifiedKeyPair = 
  229.     PORT_ZNew(CMMFCertifiedKeyPair);
  230.     } else {
  231.         keyPair = inCertResp->certifiedKeyPair;
  232.     }
  233.     if (keyPair == NULL) {
  234.         goto loser;
  235.     }
  236.     rv = cmmf_CertOrEncCertSetCertificate(&keyPair->certOrEncCert, NULL,
  237.   inCertificate);
  238.     if (rv != SECSuccess) {
  239.         goto loser;
  240.     }
  241.     return SECSuccess;
  242.  loser:
  243.     if (keyPair) {
  244.         if (keyPair->certOrEncCert.derValue.data) {
  245.     PORT_Free(keyPair->certOrEncCert.derValue.data);
  246. }
  247. PORT_Free(keyPair);
  248.     }
  249.     return rv;
  250. }
  251. SECStatus
  252. CMMF_CertRepContentSetCAPubs(CMMFCertRepContent *inCertRepContent,
  253.      CERTCertList       *inCAPubs)
  254. {
  255.     PRArenaPool      *poolp;
  256.     void             *mark;
  257.     SECStatus         rv;
  258.     PORT_Assert(inCertRepContent != NULL &&
  259. inCAPubs         != NULL &&
  260. inCertRepContent->caPubs == NULL);
  261.     
  262.     if (inCertRepContent == NULL ||
  263. inCAPubs == NULL || inCertRepContent == NULL) {
  264.         return SECFailure;
  265.     }
  266.     poolp = inCertRepContent->poolp;
  267.     mark = PORT_ArenaMark(poolp);
  268.     rv = cmmf_ExtractCertsFromList(inCAPubs, poolp,
  269.    &inCertRepContent->caPubs);
  270.     if (rv != SECSuccess) {
  271.         PORT_ArenaRelease(poolp, mark);
  272.     } else {
  273.         PORT_ArenaUnmark(poolp, mark);
  274.     }
  275.     return rv;
  276. }
  277. CERTCertificate*
  278. CMMF_CertifiedKeyPairGetCertificate(CMMFCertifiedKeyPair *inCertKeyPair,
  279.     CERTCertDBHandle     *inCertdb)
  280. {
  281.     PORT_Assert(inCertKeyPair != NULL);
  282.     if (inCertKeyPair == NULL) {
  283.         return NULL;
  284.     }
  285.     return cmmf_CertOrEncCertGetCertificate(&inCertKeyPair->certOrEncCert,
  286.     inCertdb);
  287. }