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

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 needed by a client that has 
  36.  * to parse a CMMFCertRepContent structure and retirieve the appropriate
  37.  * data.
  38.  */
  39. #include "cmmf.h"
  40. #include "cmmfi.h"
  41. #include "crmf.h"
  42. #include "crmfi.h"
  43. #include "secitem.h"
  44. #include "secder.h"
  45. #include "secasn1.h"
  46. CMMFCertRepContent*
  47. CMMF_CreateCertRepContentFromDER(CERTCertDBHandle *db, const char *buf, 
  48.  long len)
  49. {
  50.     PRArenaPool        *poolp;
  51.     CMMFCertRepContent *certRepContent;
  52.     SECStatus           rv;
  53.     int                 i;
  54.     poolp = PORT_NewArena(CRMF_DEFAULT_ARENA_SIZE);
  55.     if (poolp == NULL) {
  56.         return NULL;
  57.     }
  58.     certRepContent = PORT_ArenaZNew(poolp, CMMFCertRepContent);
  59.     if (certRepContent == NULL) {
  60.         goto loser;
  61.     }
  62.     certRepContent->poolp = poolp;
  63.     rv = SEC_ASN1Decode(poolp, certRepContent, CMMFCertRepContentTemplate,
  64. buf, len);
  65.     if (rv != SECSuccess) {
  66.         goto loser;
  67.     }
  68.     if (certRepContent->response != NULL) {
  69.         for (i=0; certRepContent->response[i] != NULL; i++) {
  70.     rv = cmmf_decode_process_cert_response(poolp, db,
  71.        certRepContent->response[i]);
  72.     if (rv != SECSuccess) {
  73.         goto loser;
  74.     }
  75. }
  76.     }
  77.     certRepContent->isDecoded = PR_TRUE;
  78.     return certRepContent;
  79.  loser:
  80.     PORT_FreeArena(poolp, PR_FALSE);
  81.     return NULL;
  82. }
  83. long
  84. CMMF_CertResponseGetCertReqId(CMMFCertResponse *inCertResp)
  85. {
  86.     PORT_Assert(inCertResp != NULL);
  87.     if (inCertResp == NULL) {
  88.         return -1;
  89.     }
  90.     return DER_GetInteger(&inCertResp->certReqId);
  91. }
  92. PRBool
  93. cmmf_CertRepContentIsIndexValid(CMMFCertRepContent *inCertRepContent,
  94.                                 int                 inIndex)
  95. {
  96.     int numResponses;
  97.     PORT_Assert(inCertRepContent != NULL);
  98.     numResponses = CMMF_CertRepContentGetNumResponses(inCertRepContent);
  99.     return (PRBool)(inIndex >= 0 && inIndex < numResponses);
  100. }
  101. CMMFCertResponse*
  102. CMMF_CertRepContentGetResponseAtIndex(CMMFCertRepContent *inCertRepContent,
  103.       int                 inIndex)
  104. {
  105.     CMMFCertResponse *certResponse;
  106.     SECStatus         rv;
  107.     PORT_Assert(inCertRepContent != NULL &&
  108. cmmf_CertRepContentIsIndexValid(inCertRepContent, inIndex));
  109.     if (inCertRepContent == NULL ||
  110. !cmmf_CertRepContentIsIndexValid(inCertRepContent, inIndex)) {
  111.         return NULL;
  112.     }
  113.     certResponse = PORT_ZNew(CMMFCertResponse);
  114.     rv = cmmf_CopyCertResponse(NULL, certResponse, 
  115.        inCertRepContent->response[inIndex]);
  116.     if (rv != SECSuccess) {
  117.         CMMF_DestroyCertResponse(certResponse);
  118. certResponse = NULL;
  119.     }
  120.     return certResponse;
  121. }
  122. CMMFPKIStatus
  123. CMMF_CertResponseGetPKIStatusInfoStatus(CMMFCertResponse *inCertResp)
  124. {
  125.     PORT_Assert(inCertResp != NULL);
  126.     if (inCertResp == NULL) {
  127.         return cmmfNoPKIStatus;
  128.     }
  129.     return cmmf_PKIStatusInfoGetStatus(&inCertResp->status);
  130. }
  131. CERTCertificate*
  132. CMMF_CertResponseGetCertificate(CMMFCertResponse *inCertResp,
  133. CERTCertDBHandle *inCertdb)
  134. {
  135.     PORT_Assert(inCertResp != NULL);
  136.     if (inCertResp == NULL || inCertResp->certifiedKeyPair == NULL) {
  137.         return NULL;
  138.     }
  139.     
  140.     return cmmf_CertOrEncCertGetCertificate
  141.                                 (&inCertResp->certifiedKeyPair->certOrEncCert,
  142.  inCertdb);
  143.    
  144. }
  145. CERTCertList*
  146. CMMF_CertRepContentGetCAPubs (CMMFCertRepContent *inCertRepContent)
  147. {
  148.     PORT_Assert (inCertRepContent != NULL);
  149.     if (inCertRepContent == NULL || inCertRepContent->caPubs == NULL) {
  150.         return NULL;
  151.     }
  152.     return cmmf_MakeCertList(inCertRepContent->caPubs);
  153. }