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

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. /*
  34.  * Pretty-print some well-known BER or DER encoded data (e.g. certificates,
  35.  * keys, pkcs7)
  36.  *
  37.  * $Id: pp.c,v 1.2 2000/10/06 21:40:52 nelsonb%netscape.com Exp $
  38.  */
  39. #include "secutil.h"
  40. #if defined(__sun) && !defined(SVR4)
  41. extern int fprintf(FILE *, char *, ...);
  42. #endif
  43. #include "plgetopt.h"
  44. #include "pk11func.h"
  45. #include "nspr.h"
  46. #include "nss.h"
  47. static void Usage(char *progName)
  48. {
  49.     fprintf(stderr,
  50.     "Usage:  %s -t type [-a] [-i input] [-o output]n",
  51.     progName);
  52.     fprintf(stderr, "%-20s Specify the input type (must be one of %s,n",
  53.     "-t type", SEC_CT_PRIVATE_KEY);
  54.     fprintf(stderr, "%-20s %s, %s, %s,n", "", SEC_CT_PUBLIC_KEY,
  55.     SEC_CT_CERTIFICATE, SEC_CT_CERTIFICATE_REQUEST);
  56.     fprintf(stderr, "%-20s %s or %s)n", "", SEC_CT_PKCS7, SEC_CT_CRL);    
  57.     fprintf(stderr, "%-20s Input is in ascii encoded form (RFC1113)n",
  58.     "-a");
  59.     fprintf(stderr, "%-20s Define an input file to use (default is stdin)n",
  60.     "-i input");
  61.     fprintf(stderr, "%-20s Define an output file to use (default is stdout)n",
  62.     "-o output");
  63.     exit(-1);
  64. }
  65. int main(int argc, char **argv)
  66. {
  67.     int rv, ascii;
  68.     char *progName;
  69.     FILE *outFile;
  70.     PRFileDesc *inFile;
  71.     SECItem der, data;
  72.     char *typeTag;
  73.     PLOptState *optstate;
  74.     progName = strrchr(argv[0], '/');
  75.     progName = progName ? progName+1 : argv[0];
  76.     ascii = 0;
  77.     inFile = 0;
  78.     outFile = 0;
  79.     typeTag = 0;
  80.     optstate = PL_CreateOptState(argc, argv, "at:i:o:");
  81.     while ( PL_GetNextOpt(optstate) == PL_OPT_OK ) {
  82. switch (optstate->option) {
  83.   case '?':
  84.     Usage(progName);
  85.     break;
  86.   case 'a':
  87.     ascii = 1;
  88.     break;
  89.   case 'i':
  90.     inFile = PR_Open(optstate->value, PR_RDONLY, 0);
  91.     if (!inFile) {
  92. fprintf(stderr, "%s: unable to open "%s" for readingn",
  93. progName, optstate->value);
  94. return -1;
  95.     }
  96.     break;
  97.   case 'o':
  98.     outFile = fopen(optstate->value, "w");
  99.     if (!outFile) {
  100. fprintf(stderr, "%s: unable to open "%s" for writingn",
  101. progName, optstate->value);
  102. return -1;
  103.     }
  104.     break;
  105.   case 't':
  106.     typeTag = strdup(optstate->value);
  107.     break;
  108. }
  109.     }
  110.     if (!typeTag) Usage(progName);
  111.     if (!inFile) inFile = PR_STDIN;
  112.     if (!outFile) outFile = stdout;
  113.     PR_Init(PR_SYSTEM_THREAD, PR_PRIORITY_NORMAL, 1);
  114.     rv = NSS_NoDB_Init(NULL);
  115.     if (rv != SECSuccess) {
  116. fprintf(stderr, "%s: NSS_NoDB_Init failedn", progName);
  117. exit(1);
  118.     }
  119.     rv = SECU_ReadDERFromFile(&der, inFile, ascii);
  120.     if (rv != SECSuccess) {
  121. fprintf(stderr, "%s: SECU_ReadDERFromFile failedn", progName);
  122. exit(1);
  123.     }
  124.     /* Data is untyped, using the specified type */
  125.     data.data = der.data;
  126.     data.len = der.len;
  127.     /* Pretty print it */
  128.     if (PORT_Strcmp(typeTag, SEC_CT_CERTIFICATE) == 0) {
  129. rv = SECU_PrintSignedData(outFile, &data, "Certificate", 0,
  130.      SECU_PrintCertificate);
  131.     } else if (PORT_Strcmp(typeTag, SEC_CT_CERTIFICATE_REQUEST) == 0) {
  132. rv = SECU_PrintSignedData(outFile, &data, "Certificate Request", 0,
  133.      SECU_PrintCertificateRequest);
  134.     } else if (PORT_Strcmp (typeTag, SEC_CT_CRL) == 0) {
  135. rv = SECU_PrintSignedData (outFile, &data, "CRL", 0, SECU_PrintCrl);
  136.     } else if (PORT_Strcmp(typeTag, SEC_CT_PRIVATE_KEY) == 0) {
  137. rv = SECU_PrintPrivateKey(outFile, &data, "Private Key", 0);
  138.     } else if (PORT_Strcmp(typeTag, SEC_CT_PUBLIC_KEY) == 0) {
  139. rv = SECU_PrintPublicKey(outFile, &data, "Public Key", 0);
  140.     } else if (PORT_Strcmp(typeTag, SEC_CT_PKCS7) == 0) {
  141. rv = SECU_PrintPKCS7ContentInfo(outFile, &data,
  142. "PKCS #7 Content Info", 0);
  143.     } else {
  144. fprintf(stderr, "%s: don't know how to print out '%s' filesn",
  145. progName, typeTag);
  146. return -1;
  147.     }
  148.     if (rv) {
  149. fprintf(stderr, "%s: problem converting data (%s)n",
  150. progName, SECU_Strerror(PORT_GetError()));
  151. return -1;
  152.     }
  153.     return 0;
  154. }