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

CA认证

开发平台:

WINDOWS

  1. /*
  2.  * NSS utility functions
  3.  *
  4.  * The contents of this file are subject to the Mozilla Public
  5.  * License Version 1.1 (the "License"); you may not use this file
  6.  * except in compliance with the License. You may obtain a copy of
  7.  * the License at http://www.mozilla.org/MPL/
  8.  * 
  9.  * Software distributed under the License is distributed on an "AS
  10.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  11.  * implied. See the License for the specific language governing
  12.  * rights and limitations under the License.
  13.  * 
  14.  * The Original Code is the Netscape security libraries.
  15.  * 
  16.  * The Initial Developer of the Original Code is Netscape
  17.  * Communications Corporation.  Portions created by Netscape are 
  18.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  19.  * Rights Reserved.
  20.  * 
  21.  * Contributor(s):
  22.  * 
  23.  * Alternatively, the contents of this file may be used under the
  24.  * terms of the GNU General Public License Version 2 or later (the
  25.  * "GPL"), in which case the provisions of the GPL are applicable 
  26.  * instead of those above.  If you wish to allow use of your 
  27.  * version of this file only under the terms of the GPL and not to
  28.  * allow others to use your version of this file under the MPL,
  29.  * indicate your decision by deleting the provisions above and
  30.  * replace them with the notice and other provisions required by
  31.  * the GPL.  If you do not delete the provisions above, a recipient
  32.  * may use your version of this file under either the MPL or the
  33.  * GPL.
  34.  *
  35.  * $Id: cmpcert.c,v 1.1 2000/03/31 19:31:24 relyea%netscape.com Exp $
  36.  */
  37. #include <stdio.h>
  38. #include <string.h>
  39. #include "prerror.h"
  40. #include "secitem.h"
  41. #include "prnetdb.h"
  42. #include "cert.h"
  43. #include "nspr.h"
  44. #include "secder.h"
  45. #include "key.h"
  46. #include "nss.h"
  47. /*
  48.  * Look to see if any of the signers in the cert chain for "cert" are found
  49.  * in the list of caNames.  
  50.  * Returns SECSuccess if so, SECFailure if not.
  51.  */
  52. SECStatus
  53. NSS_CmpCertChainWCANames(CERTCertificate *cert, CERTDistNames *caNames)
  54. {
  55.   SECItem *         caname;
  56.   CERTCertificate * curcert;
  57.   CERTCertificate * oldcert;
  58.   PRInt32           contentlen;
  59.   int               j;
  60.   int               headerlen;
  61.   int               depth;
  62.   SECStatus         rv;
  63.   SECItem           issuerName;
  64.   SECItem           compatIssuerName;
  65.   
  66.   depth=0;
  67.   curcert = CERT_DupCertificate(cert);
  68.   
  69.   while( curcert ) {
  70.     issuerName = curcert->derIssuer;
  71.     
  72.     /* compute an alternate issuer name for compatibility with 2.0
  73.      * enterprise server, which send the CA names without
  74.      * the outer layer of DER hearder
  75.      */
  76.     rv = DER_Lengths(&issuerName, &headerlen, (uint32 *)&contentlen);
  77.     if ( rv == SECSuccess ) {
  78.       compatIssuerName.data = &issuerName.data[headerlen];
  79.       compatIssuerName.len = issuerName.len - headerlen;
  80.     } else {
  81.       compatIssuerName.data = NULL;
  82.       compatIssuerName.len = 0;
  83.     }
  84.     
  85.     for (j = 0; j < caNames->nnames; j++) {
  86.       caname = &caNames->names[j];
  87.       if (SECITEM_CompareItem(&issuerName, caname) == SECEqual) {
  88. rv = SECSuccess;
  89. CERT_DestroyCertificate(curcert);
  90. goto done;
  91.       } else if (SECITEM_CompareItem(&compatIssuerName, caname) == SECEqual) {
  92. rv = SECSuccess;
  93. CERT_DestroyCertificate(curcert);
  94. goto done;
  95.       }
  96.     }
  97.     if ( ( depth <= 20 ) &&
  98.  ( SECITEM_CompareItem(&curcert->derIssuer, &curcert->derSubject)
  99.    != SECEqual ) ) {
  100.       oldcert = curcert;
  101.       curcert = CERT_FindCertByName(curcert->dbhandle,
  102.     &curcert->derIssuer);
  103.       CERT_DestroyCertificate(oldcert);
  104.       depth++;
  105.     } else {
  106.       CERT_DestroyCertificate(curcert);
  107.       curcert = NULL;
  108.     }
  109.   }
  110.   rv = SECFailure;
  111.   
  112. done:
  113.   return rv;
  114. }