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

CA认证

开发平台:

WINDOWS

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is the Netscape security libraries.
  13.  * 
  14.  * The Initial Developer of the Original Code is Netscape
  15.  * Communications Corporation.  Portions created by Netscape are 
  16.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  17.  * Rights Reserved.
  18.  * 
  19.  * Contributor(s):
  20.  * 
  21.  * Alternatively, the contents of this file may be used under the
  22.  * terms of the GNU General Public License Version 2 or later (the
  23.  * "GPL"), in which case the provisions of the GPL are applicable 
  24.  * instead of those above.  If you wish to allow use of your 
  25.  * version of this file only under the terms of the GPL and not to
  26.  * allow others to use your version of this file under the MPL,
  27.  * indicate your decision by deleting the provisions above and
  28.  * replace them with the notice and other provisions required by
  29.  * the GPL.  If you do not delete the provisions above, a recipient
  30.  * may use your version of this file under either the MPL or the
  31.  * GPL.
  32.  */
  33. #include "signtool.h"
  34. #include "pk11func.h"
  35. #include "certdb.h"
  36. static int num_trav_certs = 0;
  37. static SECStatus cert_trav_callback(CERTCertificate *cert, SECItem *k,
  38. void *data);
  39. /*********************************************************************
  40.  *
  41.  * L i s t C e r t s
  42.  */
  43. int
  44. ListCerts(char *key, int list_certs)
  45. {
  46. SECStatus rv;
  47. char *ugly_list;
  48. CERTCertDBHandle *db;
  49. CERTCertificate *cert;
  50. CERTVerifyLog errlog;
  51. errlog.arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
  52. if( errlog.arena == NULL) {
  53. out_of_memory();
  54. }
  55. errlog.head = NULL;
  56. errlog.tail = NULL;
  57. errlog.count = 0;
  58. ugly_list = PORT_ZAlloc (16);
  59. if (ugly_list == NULL) {
  60. out_of_memory();
  61. }
  62. *ugly_list = 0;
  63. db= OpenCertDB(PR_TRUE /*readOnly*/); 
  64. if (list_certs == 2) {
  65. PR_fprintf(outputFD, "nS Certificatesn");
  66. PR_fprintf(outputFD, "- ------------n");
  67. } else {
  68. PR_fprintf(outputFD, "nObject signing certificatesn");
  69. PR_fprintf(outputFD, "---------------------------------------n");
  70. }
  71. num_trav_certs = 0;
  72. /* Traverse non-internal DBs */
  73. rv = PK11_TraverseSlotCerts(cert_trav_callback, (void*)&list_certs,
  74. NULL /*wincx*/);
  75. /* Traverse Internal DB */
  76. rv = SEC_TraversePermCerts(db, cert_trav_callback, (void*)&list_certs);
  77. if (num_trav_certs == 0) {
  78. PR_fprintf(outputFD,
  79. "You don't appear to have any object signing certificates.n");
  80. }
  81. if (list_certs == 2) {
  82. PR_fprintf(outputFD, "- ------------n");
  83. } else {
  84. PR_fprintf(outputFD, "---------------------------------------n");
  85. }
  86. if (rv) {
  87. return -1;
  88. }
  89. if (list_certs == 1) {
  90. PR_fprintf(outputFD,
  91. "For a list including CA's, use "%s -L"n", PROGRAM_NAME);
  92. }
  93. if(list_certs == 2) {
  94. PR_fprintf(outputFD,
  95. "Certificates that can be used to sign objects have *'s to "
  96.  "their left.n");
  97. }
  98. if (key) {
  99. /* Do an analysis of the given cert */
  100. SECStatus rv;
  101. cert = PK11_FindCertFromNickname(key, NULL /*wincx*/);
  102. if (cert) {
  103. PR_fprintf(outputFD,
  104. "nThe certificate with nickname "%s" was found:n",
  105.  cert->nickname);
  106. PR_fprintf(outputFD,
  107. "tsubject name: %sn", cert->subjectName);
  108. PR_fprintf(outputFD,
  109. "tissuer name: %sn", cert->issuerName);
  110. PR_fprintf(outputFD, "n");
  111. rv = CERT_CertTimesValid (cert);
  112. if(rv != SECSuccess) {
  113. PR_fprintf(outputFD, "**This certificate is expired**n");
  114. } else {
  115. PR_fprintf(outputFD, "This certificate is not expired.n");
  116. }
  117. rv = CERT_VerifyCert (db, cert, PR_TRUE,
  118. certUsageObjectSigner, PR_Now(), NULL, &errlog);
  119. if (rv != SECSuccess) {
  120. if(errlog.count > 0) {
  121. PR_fprintf(outputFD,
  122. "**Certificate validation failed for the "
  123.  "following reason(s):**n");
  124. } else {
  125. PR_fprintf(outputFD, "**Certificate validation failed**");
  126. }
  127. } else {
  128. PR_fprintf(outputFD, "This certificate is valid.n");
  129. }
  130. displayVerifyLog(&errlog);
  131. } else {
  132. PR_fprintf(outputFD,
  133. "The certificate with nickname "%s" was NOT FOUNDn",
  134.  key);
  135. }
  136.     }
  137. if(errlog.arena != NULL) {
  138. PORT_FreeArena(errlog.arena, PR_FALSE);
  139. }
  140. return 0;
  141. }
  142. /********************************************************************
  143.  *
  144.  * c e r t _ t r a v _ c a l l b a c k
  145.  */
  146. static SECStatus
  147. cert_trav_callback(CERTCertificate *cert, SECItem *k, void *data)
  148. {
  149. int isSigningCert;
  150. int list_certs = 1;
  151. char *name, *issuerCN, *expires;
  152. CERTCertificate *issuerCert = NULL;
  153. if(data) {
  154. list_certs = *((int*)data);
  155. }
  156.   if (cert->nickname)
  157.     {
  158.     name = cert->nickname;
  159. isSigningCert = cert->nsCertType & NS_CERT_TYPE_OBJECT_SIGNING;
  160.     issuerCert = CERT_FindCertIssuer (cert, PR_Now(), certUsageObjectSigner);
  161.     issuerCN = CERT_GetCommonName (&cert->issuer);
  162.     if (!isSigningCert && list_certs == 1)
  163.       return (SECSuccess);
  164.     /* Add this name or email to list */
  165.     if (name)
  166.       {
  167.       int rv;
  168.       num_trav_certs++;
  169. if(list_certs == 2) {
  170. PR_fprintf(outputFD, "%s ", isSigningCert ? "*" : " ");
  171. }
  172. PR_fprintf(outputFD, "%sn", name);
  173.       if (list_certs == 1)
  174.         {
  175. if(issuerCert == NULL) {
  176. PR_fprintf(outputFD,
  177. "t++ Error ++ Unable to find issuer certificaten");
  178. return SECSuccess; /*function was a success even if cert is bogus*/
  179. }
  180.         if (issuerCN == NULL)
  181.           PR_fprintf(outputFD, "    Issued by: %sn", issuerCert->nickname);
  182.         else
  183.           PR_fprintf(outputFD,
  184. "    Issued by: %s (%s)n", issuerCert->nickname, issuerCN);
  185.  
  186.         expires = DER_UTCDayToAscii (&cert->validity.notAfter);
  187.         if (expires)
  188.           PR_fprintf(outputFD, "    Expires: %sn", expires);
  189.         rv = CERT_CertTimesValid (cert);
  190.         if (rv != SECSuccess)
  191.           PR_fprintf(outputFD, "    ++ Error ++ THIS CERTIFICATE IS EXPIREDn");
  192.         if (rv == SECSuccess)
  193.           {
  194.           rv = CERT_VerifyCertNow (cert->dbhandle, cert,
  195.                     PR_TRUE, certUsageObjectSigner, NULL);
  196.           if (rv != SECSuccess)
  197.             {
  198.             rv = PORT_GetError();
  199.             PR_fprintf(outputFD,
  200. "    ++ Error ++ THIS CERTIFICATE IS NOT VALID (%s)n",
  201. secErrorString(rv));            }
  202.           }
  203.         expires = DER_UTCDayToAscii (&issuerCert->validity.notAfter);
  204.         if (expires == NULL) expires = "(unknown)";
  205.         rv = CERT_CertTimesValid (issuerCert);
  206.         if (rv != SECSuccess)
  207.           PR_fprintf(outputFD,
  208. "    ++ Error ++ ISSUER CERT "%s" EXPIRED ON %sn", 
  209.              issuerCert->nickname, expires);
  210.         if (rv == SECSuccess)
  211.           {
  212.   /*
  213.           rv = CERT_VerifyCertNow (issuerCert->dbhandle, issuerCert, 
  214.                     PR_TRUE, certUsageVerifyCA, NULL);
  215.     */
  216.           rv = CERT_VerifyCertNow (issuerCert->dbhandle, issuerCert, 
  217.                     PR_TRUE, certUsageAnyCA, NULL);
  218.           if (rv != SECSuccess)
  219.             {
  220.             rv = PORT_GetError();
  221.             PR_fprintf(outputFD,
  222. "    ++ Error ++ ISSUER CERT "%s" IS NOT VALID (%s)n", issuerCert->nickname, secErrorString(rv));
  223.             }
  224.           }
  225.         }
  226.       }
  227.     }
  228.   return (SECSuccess);
  229. }