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

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.  *  JARJART
  35.  *
  36.  *  JAR functions used by Jartool
  37.  */
  38. /* This allows manifest files above 64k to be
  39.    processed on non-win16 platforms */
  40. #include "jar.h"
  41. #include "jarint.h"
  42. #include "jarjart.h"
  43. #include "blapi.h" /* JAR is supposed to be above the line!! */
  44. #include "pk11func.h" /* PK11 wrapper funcs are all above the line. */
  45. /* from certdb.h */
  46. #define CERTDB_USER (1<<6)
  47. #if 0
  48. /* from certdb.h */
  49. typedef SECStatus (* PermCertCallback)(CERTCertificate *cert, SECItem *k, void *pdata);
  50. /* from certdb.h */
  51. SECStatus SEC_TraversePermCerts
  52.    (CERTCertDBHandle *handle, PermCertCallback certfunc, void *udata);
  53. #endif
  54. /*
  55.  *  S O B _ l i s t _ c e r t s
  56.  *
  57.  *  Return a list of newline separated certificate nicknames
  58.  *  (this function used by the Jartool)
  59.  * 
  60.  */
  61. static SECStatus jar_list_cert_callback 
  62.      (CERTCertificate *cert, SECItem *k, void *data)
  63.   {
  64.   char *name;
  65.   char **ugly_list;
  66.   int trusted;
  67.   ugly_list = (char **) data;
  68.   if (cert && cert->dbEntry)
  69.     {
  70.     /* name = cert->dbEntry->nickname; */
  71.     name = cert->nickname;
  72.     trusted = cert->trust->objectSigningFlags & CERTDB_USER;
  73.     /* Add this name or email to list */
  74.     if (name && trusted)
  75.       {
  76.       *ugly_list = (char*)PORT_Realloc
  77.            (*ugly_list, PORT_Strlen (*ugly_list) + PORT_Strlen (name) + 2);
  78.       if (*ugly_list)
  79.         {
  80.         if (**ugly_list)
  81.           PORT_Strcat (*ugly_list, "n");
  82.         PORT_Strcat (*ugly_list, name);
  83.         }
  84.       }
  85.     }
  86.   return (SECSuccess);
  87.   }
  88. /*
  89.  *  S O B _ J A R _ l i s t _ c e r t s
  90.  *
  91.  *  Return a linfeed separated ascii list of certificate
  92.  *  nicknames for the Jartool.
  93.  *
  94.  */
  95. char *JAR_JAR_list_certs (void)
  96.   {
  97.   SECStatus status;
  98.   CERTCertDBHandle *certdb;
  99.   char *ugly_list;
  100.   certdb = JAR_open_database();
  101.   /* a little something */
  102.   ugly_list = (char*)PORT_ZAlloc (16);
  103.   if (ugly_list)
  104.     {
  105.     *ugly_list = 0;
  106.     status = SEC_TraversePermCerts 
  107.             (certdb, jar_list_cert_callback, (void *) &ugly_list);
  108.     }
  109.   JAR_close_database (certdb);
  110.   return status ? NULL : ugly_list;
  111.   }
  112. int JAR_JAR_validate_archive (char *filename)
  113.   {
  114.   JAR *jar;
  115.   int status = -1;
  116.   jar = JAR_new();
  117.   if (jar)
  118.     {
  119.     status = JAR_pass_archive (jar, jarArchGuess, filename, "");
  120.     if (status == 0)
  121.       status = jar->valid;
  122.     JAR_destroy (jar);
  123.     }
  124.   return status;
  125.   }
  126. char *JAR_JAR_get_error (int status)
  127.   {
  128.   return JAR_get_error (status);
  129.   }
  130. /*
  131.  *  S O B _ J A R _  h a s h
  132.  *
  133.  *  Hash algorithm interface for use by the Jartool. Since we really
  134.  *  don't know the private sizes of the context, and Java does need to
  135.  *  know this number, allocate 512 bytes for it.
  136.  *
  137.  *  In april 1997 hashes in this file were changed to call PKCS11,
  138.  *  as FIPS requires that when a smartcard has failed validation, 
  139.  *  hashes are not to be performed. But because of the difficulty of
  140.  *  preserving pointer context between calls to the JAR_JAR hashing
  141.  *  functions, the hash routines are called directly, though after
  142.  *  checking to see if hashing is allowed.
  143.  *
  144.  */
  145. void *JAR_JAR_new_hash (int alg)
  146.   {
  147.   void *context;
  148.   MD5Context *md5;
  149.   SHA1Context *sha1;
  150.   /* this is a hack because this whole PORT_ZAlloc stuff looks scary */
  151.   if (!PK11_HashOK (alg == 1 ? SEC_OID_MD5 : SEC_OID_SHA1))
  152.     return NULL;
  153.   context = PORT_ZAlloc (512);
  154.   if (context)
  155.     {
  156.     switch (alg)
  157.       {
  158.       case 1:  /* MD5 */
  159.                md5 = (MD5Context *) context;
  160.                MD5_Begin (md5);
  161.                break;
  162.       case 2:  /* SHA1 */
  163.                sha1 = (SHA1Context *) context;
  164.                SHA1_Begin (sha1);
  165.                break;
  166.       }
  167.     }
  168.   return context;
  169.   }
  170. void *JAR_JAR_hash (int alg, void *cookie, int length, void *data)
  171.   {
  172.   MD5Context *md5;
  173.   SHA1Context *sha1;
  174.   /* this is a hack because this whole PORT_ZAlloc stuff looks scary */
  175.   if (!PK11_HashOK (alg == 1 ? SEC_OID_MD5 : SEC_OID_SHA1))
  176.     return NULL;
  177.   if (length > 0)
  178.     {
  179.     switch (alg)
  180.       {
  181.       case 1:  /* MD5 */
  182.                md5 = (MD5Context *) cookie;
  183.                MD5_Update (md5, (unsigned char*)data, length);
  184.                break;
  185.       case 2:  /* SHA1 */
  186.                sha1 = (SHA1Context *) cookie;
  187.                SHA1_Update (sha1, (unsigned char*)data, length);
  188.                break;
  189.       }
  190.     }
  191.   return cookie;
  192.   }
  193. void *JAR_JAR_end_hash (int alg, void *cookie)
  194.   {
  195.   int length;
  196.   unsigned char *data;
  197.   char *ascii; 
  198.   MD5Context *md5;
  199.   SHA1Context *sha1;
  200.   unsigned int md5_length;
  201.   unsigned char md5_digest [MD5_LENGTH];
  202.   unsigned int sha1_length;
  203.   unsigned char sha1_digest [SHA1_LENGTH];
  204.   /* this is a hack because this whole PORT_ZAlloc stuff looks scary */
  205.   if (!PK11_HashOK (alg == 1 ? SEC_OID_MD5 : SEC_OID_SHA1)) 
  206.     return NULL;
  207.   switch (alg)
  208.     {
  209.     case 1:  /* MD5 */
  210.              md5 = (MD5Context *) cookie;
  211.              MD5_End (md5, md5_digest, &md5_length, MD5_LENGTH);
  212.              /* MD5_DestroyContext (md5, PR_TRUE); */
  213.              data = md5_digest;
  214.              length = md5_length;
  215.              break;
  216.     case 2:  /* SHA1 */
  217.              sha1 = (SHA1Context *) cookie;
  218.              SHA1_End (sha1, sha1_digest, &sha1_length, SHA1_LENGTH);
  219.              /* SHA1_DestroyContext (sha1, PR_TRUE); */
  220.              data = sha1_digest;
  221.              length = sha1_length;
  222.              break;
  223.     default: return NULL;
  224.     }
  225.   /* Instead of destroy context, since we created it */
  226.   /* PORT_Free (cookie); */
  227.   ascii = BTOA_DataToAscii(data, length);
  228.   return ascii ? PORT_Strdup (ascii) : NULL;
  229.   }
  230. /*
  231.  *  S O B _ J A R _ s i g n _ a r c h i v e
  232.  *
  233.  *  A simple API to sign a JAR archive.
  234.  *
  235.  */
  236. int JAR_JAR_sign_archive 
  237.       (char *nickname, char *password, char *sf, char *outsig)
  238.   {
  239.   char *out_fn;
  240.   int status = JAR_ERR_GENERAL;
  241.   JAR_FILE sf_fp; 
  242.   JAR_FILE out_fp;
  243.   CERTCertDBHandle *certdb;
  244.   SECKEYKeyDBHandle *keydb;
  245.   CERTCertificate *cert;
  246.   /* open cert and key databases */
  247.   certdb = JAR_open_database();
  248.   if (certdb == NULL)
  249.     return JAR_ERR_GENERAL;
  250.   keydb = jar_open_key_database();
  251.   if (keydb == NULL)
  252.     return JAR_ERR_GENERAL;
  253.   out_fn = PORT_Strdup (sf);
  254.   if (out_fn == NULL || PORT_Strlen (sf) < 5)
  255.     return JAR_ERR_GENERAL;
  256.   sf_fp = JAR_FOPEN (sf, "rb");
  257.   out_fp = JAR_FOPEN (outsig, "wb");
  258.   cert = CERT_FindCertByNickname (certdb, nickname);
  259.   if (cert && sf_fp && out_fp)
  260.     {
  261.     status = jar_create_pk7 (certdb, keydb, cert, password, sf_fp, out_fp);
  262.     }
  263.   /* remove password from prying eyes */
  264.   PORT_Memset (password, 0, PORT_Strlen (password));
  265.   JAR_FCLOSE (sf_fp);
  266.   JAR_FCLOSE (out_fp);
  267.   JAR_close_database (certdb);
  268.   jar_close_key_database (keydb);
  269.   return status;
  270.   }