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

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.  *  JAREVIL
  35.  *
  36.  *  Wrappers to callback in the mozilla thread
  37.  *
  38.  *  Certificate code is unsafe when called outside the
  39.  *  mozilla thread. These functions push an event on the
  40.  *  queue to cause the cert function to run in that thread. 
  41.  *
  42.  */
  43. #include "jar.h"
  44. #include "jarint.h"
  45. #include "jarevil.h"
  46. /* from libevent.h */
  47. #ifdef MOZILLA_CLIENT_OLD
  48. typedef void (*ETVoidPtrFunc) (void * data);
  49. extern void ET_moz_CallFunction (ETVoidPtrFunc fn, void *data);
  50. extern void *mozilla_event_queue;
  51. #endif
  52. /* Special macros facilitate running on Win 16 */
  53. #if defined(XP_PC) && !defined(_WIN32)   /* then we are win 16 */ 
  54.   /* 
  55.    * Allocate the data passed to the callback functions from the heap...
  56.    *
  57.    * This inter-thread structure cannot reside on a thread stack since the 
  58.    * thread's stack is swapped away with the thread under Win16...
  59.    */
  60.  #define ALLOC_OR_DEFINE(type, pointer_var_name, out_of_memory_return_value) 
  61.          type * pointer_var_name = PORT_ZAlloc (sizeof(type));               
  62.          do {                                                                
  63.            if (!pointer_var_name)                                            
  64.              return (out_of_memory_return_value);                            
  65.          } while (0)   /* and now a semicolon can follow :-) */
  66.  #define FREE_IF_ALLOC_IS_USED(pointer_var_name) PORT_Free(pointer_var_name)
  67. #else /* not win 16... so we can alloc via auto variables */
  68.  #define ALLOC_OR_DEFINE(type, pointer_var_name, out_of_memory_return_value) 
  69.          type actual_structure_allocated_in_macro;                           
  70.          type * pointer_var_name = &actual_structure_allocated_in_macro;     
  71.          PORT_Memset (pointer_var_name, 0, sizeof (*pointer_var_name));      
  72.          ((void) 0) /* and now a semicolon can follow  */
  73.  #define FREE_IF_ALLOC_IS_USED(pointer_var_name) ((void) 0)
  74. #endif /* not Win 16 */
  75. /* --- --- --- --- --- --- --- --- --- --- --- --- --- */
  76. /*
  77.  *  JAR_MOZ_encode
  78.  *
  79.  *  Call SEC_PKCS7Encode inside
  80.  *  the mozilla thread
  81.  *
  82.  */
  83. struct EVIL_encode
  84.   {
  85.   int error;
  86.   SECStatus status;
  87.   SEC_PKCS7ContentInfo *cinfo;
  88.   SEC_PKCS7EncoderOutputCallback outputfn;
  89.   void *outputarg;
  90.   PK11SymKey *bulkkey;
  91.   SECKEYGetPasswordKey pwfn;
  92.   void *pwfnarg;
  93.   };
  94. /* This is called inside the mozilla thread */
  95. PR_STATIC_CALLBACK(void) jar_moz_encode_fn (void *data)
  96.   {
  97.   SECStatus status;
  98.   struct EVIL_encode *encode_data = (struct EVIL_encode *)data;
  99.   PORT_SetError (encode_data->error);
  100.   status = SEC_PKCS7Encode (encode_data->cinfo, encode_data->outputfn, 
  101.                             encode_data->outputarg, encode_data->bulkkey, 
  102.                             encode_data->pwfn, encode_data->pwfnarg);
  103.   encode_data->status = status;
  104.   encode_data->error = PORT_GetError();
  105.   }
  106. /* Wrapper for the ET_MOZ call */
  107.  
  108. SECStatus jar_moz_encode
  109.       (
  110.       SEC_PKCS7ContentInfo *cinfo,
  111.       SEC_PKCS7EncoderOutputCallback  outputfn,
  112.       void *outputarg,
  113.       PK11SymKey *bulkkey,
  114.       SECKEYGetPasswordKey pwfn,
  115.       void *pwfnarg
  116.       )
  117.   {
  118.   SECStatus ret;
  119.   ALLOC_OR_DEFINE(struct EVIL_encode, encode_data, SECFailure);
  120.   encode_data->error     = PORT_GetError();
  121.   encode_data->cinfo     = cinfo;
  122.   encode_data->outputfn  = outputfn;
  123.   encode_data->outputarg = outputarg;
  124.   encode_data->bulkkey   = bulkkey;
  125.   encode_data->pwfn      = pwfn;
  126.   encode_data->pwfnarg   = pwfnarg;
  127.   /* Synchronously invoke the callback function on the mozilla thread. */
  128. #ifdef MOZILLA_CLIENT_OLD
  129.   if (mozilla_event_queue)
  130.     ET_moz_CallFunction (jar_moz_encode_fn, encode_data);
  131.   else
  132.     jar_moz_encode_fn (encode_data);
  133. #else
  134.   jar_moz_encode_fn (encode_data);
  135. #endif
  136.   PORT_SetError (encode_data->error);
  137.   ret = encode_data->status;
  138.   /* Free the data passed to the callback function... */
  139.   FREE_IF_ALLOC_IS_USED(encode_data);
  140.   return ret;
  141.   }
  142. /* --- --- --- --- --- --- --- --- --- --- --- --- --- */
  143. /*
  144.  *  JAR_MOZ_verify
  145.  *
  146.  *  Call SEC_PKCS7VerifyDetachedSignature inside
  147.  *  the mozilla thread
  148.  *
  149.  */
  150. struct EVIL_verify
  151.   {
  152.   int error;
  153.   SECStatus status;
  154.   SEC_PKCS7ContentInfo *cinfo;
  155.   SECCertUsage certusage;
  156.   SECItem *detached_digest;
  157.   HASH_HashType digest_type;
  158.   PRBool keepcerts;
  159.   };
  160. /* This is called inside the mozilla thread */
  161. PR_STATIC_CALLBACK(void) jar_moz_verify_fn (void *data)
  162.   {
  163. PRBool result;
  164.   struct EVIL_verify *verify_data = (struct EVIL_verify *)data;
  165.   PORT_SetError (verify_data->error);
  166.   result = SEC_PKCS7VerifyDetachedSignature
  167.         (verify_data->cinfo, verify_data->certusage, verify_data->detached_digest, 
  168.          verify_data->digest_type, verify_data->keepcerts);
  169.   verify_data->status = result==PR_TRUE ? SECSuccess : SECFailure;
  170.   verify_data->error = PORT_GetError();
  171.   }
  172. /* Wrapper for the ET_MOZ call */
  173.  
  174. SECStatus jar_moz_verify
  175.       (
  176.       SEC_PKCS7ContentInfo *cinfo,
  177.       SECCertUsage certusage,
  178.       SECItem *detached_digest,
  179.       HASH_HashType digest_type,
  180.       PRBool keepcerts
  181.       )
  182.   {
  183.   SECStatus ret;
  184.   ALLOC_OR_DEFINE(struct EVIL_verify, verify_data, SECFailure);
  185.   verify_data->error           = PORT_GetError();
  186.   verify_data->cinfo           = cinfo;
  187.   verify_data->certusage       = certusage;
  188.   verify_data->detached_digest = detached_digest;
  189.   verify_data->digest_type     = digest_type;
  190.   verify_data->keepcerts       = keepcerts;
  191.   /* Synchronously invoke the callback function on the mozilla thread. */
  192. #ifdef MOZILLA_CLIENT_OLD
  193.   if (mozilla_event_queue)
  194.     ET_moz_CallFunction (jar_moz_verify_fn, verify_data);
  195.   else
  196.     jar_moz_verify_fn (verify_data);
  197. #else
  198.   jar_moz_verify_fn (verify_data);
  199. #endif
  200.   PORT_SetError (verify_data->error);
  201.   ret = verify_data->status;
  202.   /* Free the data passed to the callback function... */
  203.   FREE_IF_ALLOC_IS_USED(verify_data);
  204.   return ret;
  205.   }
  206. /* --- --- --- --- --- --- --- --- --- --- --- --- --- */
  207. /*
  208.  *  JAR_MOZ_nickname
  209.  *
  210.  *  Call CERT_FindCertByNickname inside
  211.  *  the mozilla thread
  212.  *
  213.  */
  214. struct EVIL_nickname
  215.   {
  216.   int error;
  217.   CERTCertDBHandle *certdb;
  218.   char *nickname;
  219.   CERTCertificate *cert;
  220.   };
  221. /* This is called inside the mozilla thread */
  222. PR_STATIC_CALLBACK(void) jar_moz_nickname_fn (void *data)
  223.   {
  224.   CERTCertificate *cert;
  225.   struct EVIL_nickname *nickname_data = (struct EVIL_nickname *)data;
  226.   PORT_SetError (nickname_data->error);
  227.   cert = CERT_FindCertByNickname (nickname_data->certdb, nickname_data->nickname);
  228.   nickname_data->cert  = cert;
  229.   nickname_data->error = PORT_GetError();
  230.   }
  231. /* Wrapper for the ET_MOZ call */
  232.  
  233. CERTCertificate *jar_moz_nickname (CERTCertDBHandle *certdb, char *nickname)
  234.   {
  235.   CERTCertificate *cert;
  236.   ALLOC_OR_DEFINE(struct EVIL_nickname, nickname_data, NULL );
  237.   nickname_data->error    = PORT_GetError();
  238.   nickname_data->certdb   = certdb;
  239.   nickname_data->nickname = nickname;
  240.   /* Synchronously invoke the callback function on the mozilla thread. */
  241. #ifdef MOZILLA_CLIENT_OLD
  242.   if (mozilla_event_queue)
  243.     ET_moz_CallFunction (jar_moz_nickname_fn, nickname_data);
  244.   else
  245.     jar_moz_nickname_fn (nickname_data);
  246. #else
  247.   jar_moz_nickname_fn (nickname_data);
  248. #endif
  249.   PORT_SetError (nickname_data->error);
  250.   cert = nickname_data->cert;
  251.   /* Free the data passed to the callback function... */
  252.   FREE_IF_ALLOC_IS_USED(nickname_data);
  253.   return cert;
  254.   }
  255. /* --- --- --- --- --- --- --- --- --- --- --- --- --- */
  256. /*
  257.  *  JAR_MOZ_perm
  258.  *
  259.  *  Call CERT_AddTempCertToPerm inside
  260.  *  the mozilla thread
  261.  *
  262.  */
  263. struct EVIL_perm
  264.   {
  265.   int error;
  266.   SECStatus status;
  267.   CERTCertificate *cert;
  268.   char *nickname;
  269.   CERTCertTrust *trust;
  270.   };
  271. /* This is called inside the mozilla thread */
  272. PR_STATIC_CALLBACK(void) jar_moz_perm_fn (void *data)
  273.   {
  274.   SECStatus status;
  275.   struct EVIL_perm *perm_data = (struct EVIL_perm *)data;
  276.   PORT_SetError (perm_data->error);
  277.   status = CERT_AddTempCertToPerm (perm_data->cert, perm_data->nickname, perm_data->trust);
  278.   perm_data->status = status;
  279.   perm_data->error = PORT_GetError();
  280.   }
  281. /* Wrapper for the ET_MOZ call */
  282.  
  283. SECStatus jar_moz_perm 
  284.     (CERTCertificate *cert, char *nickname, CERTCertTrust *trust)
  285.   {
  286.   SECStatus ret;
  287.   ALLOC_OR_DEFINE(struct EVIL_perm, perm_data, SECFailure);
  288.   perm_data->error    = PORT_GetError();
  289.   perm_data->cert     = cert;
  290.   perm_data->nickname = nickname;
  291.   perm_data->trust    = trust;
  292.   /* Synchronously invoke the callback function on the mozilla thread. */
  293. #ifdef MOZILLA_CLIENT_OLD
  294.   if (mozilla_event_queue)
  295.     ET_moz_CallFunction (jar_moz_perm_fn, perm_data);
  296.   else
  297.     jar_moz_perm_fn (perm_data);
  298. #else
  299.   jar_moz_perm_fn (perm_data);
  300. #endif
  301.   PORT_SetError (perm_data->error);
  302.   ret = perm_data->status;
  303.   /* Free the data passed to the callback function... */
  304.   FREE_IF_ALLOC_IS_USED(perm_data);
  305.   return ret;
  306.   }
  307. /* --- --- --- --- --- --- --- --- --- --- --- --- --- */
  308. /*
  309.  *  JAR_MOZ_certkey
  310.  *
  311.  *  Call CERT_FindCertByKey inside
  312.  *  the mozilla thread
  313.  *
  314.  */
  315. struct EVIL_certkey
  316.   {
  317.   int error;
  318.   CERTCertificate *cert;
  319.   CERTCertDBHandle *certdb;
  320.   SECItem *seckey;
  321.   };
  322. /* This is called inside the mozilla thread */
  323. PR_STATIC_CALLBACK(void) jar_moz_certkey_fn (void *data)
  324.   {
  325.   CERTCertificate *cert;
  326.   struct EVIL_certkey *certkey_data = (struct EVIL_certkey *)data;
  327.   PORT_SetError (certkey_data->error);
  328.   cert = CERT_FindCertByKey (certkey_data->certdb, certkey_data->seckey);
  329.   certkey_data->cert = cert;
  330.   certkey_data->error = PORT_GetError();
  331.   }
  332. /* Wrapper for the ET_MOZ call */
  333.  
  334. CERTCertificate *jar_moz_certkey (CERTCertDBHandle *certdb, SECItem *seckey)
  335.   {
  336.   CERTCertificate *cert;
  337.   ALLOC_OR_DEFINE(struct EVIL_certkey, certkey_data, NULL);
  338.   certkey_data->error  = PORT_GetError();
  339.   certkey_data->certdb = certdb;
  340.   certkey_data->seckey = seckey;
  341.   /* Synchronously invoke the callback function on the mozilla thread. */
  342. #ifdef MOZILLA_CLIENT_OLD
  343.   if (mozilla_event_queue)
  344.     ET_moz_CallFunction (jar_moz_certkey_fn, certkey_data);
  345.   else
  346.     jar_moz_certkey_fn (certkey_data);
  347. #else
  348.   jar_moz_certkey_fn (certkey_data);
  349. #endif
  350.   PORT_SetError (certkey_data->error);
  351.   cert = certkey_data->cert;
  352.   /* Free the data passed to the callback function... */
  353.   FREE_IF_ALLOC_IS_USED(certkey_data);
  354.   return cert;
  355.   }
  356. /* --- --- --- --- --- --- --- --- --- --- --- --- --- */
  357. /*
  358.  *  JAR_MOZ_issuer
  359.  *
  360.  *  Call CERT_FindCertIssuer inside
  361.  *  the mozilla thread
  362.  *
  363.  */
  364. struct EVIL_issuer
  365.   {
  366.   int error;
  367.   CERTCertificate *cert;
  368.   CERTCertificate *issuer;
  369.   };
  370. /* This is called inside the mozilla thread */
  371. PR_STATIC_CALLBACK(void) jar_moz_issuer_fn (void *data)
  372.   {
  373.   CERTCertificate *issuer;
  374.   struct EVIL_issuer *issuer_data = (struct EVIL_issuer *)data;
  375.   PORT_SetError (issuer_data->error);
  376.   issuer = CERT_FindCertIssuer (issuer_data->cert, PR_Now(),
  377. certUsageObjectSigner);
  378.   issuer_data->issuer = issuer;
  379.   issuer_data->error = PORT_GetError();
  380.   }
  381. /* Wrapper for the ET_MOZ call */
  382.  
  383. CERTCertificate *jar_moz_issuer (CERTCertificate *cert)
  384.   {
  385.   CERTCertificate *issuer_cert;
  386.   ALLOC_OR_DEFINE(struct EVIL_issuer, issuer_data, NULL);
  387.   issuer_data->error = PORT_GetError();
  388.   issuer_data->cert  = cert;
  389.   /* Synchronously invoke the callback function on the mozilla thread. */
  390. #ifdef MOZILLA_CLIENT_OLD
  391.   if (mozilla_event_queue)
  392.     ET_moz_CallFunction (jar_moz_issuer_fn, issuer_data);
  393.   else
  394.     jar_moz_issuer_fn (issuer_data);
  395. #else
  396.   jar_moz_issuer_fn (issuer_data);
  397. #endif
  398.   PORT_SetError (issuer_data->error);
  399.   issuer_cert = issuer_data->issuer;
  400.   /* Free the data passed to the callback function... */
  401.   FREE_IF_ALLOC_IS_USED(issuer_data);
  402.   return issuer_cert;
  403.   }
  404. /* --- --- --- --- --- --- --- --- --- --- --- --- --- */
  405. /*
  406.  *  JAR_MOZ_dup
  407.  *
  408.  *  Call CERT_DupCertificate inside
  409.  *  the mozilla thread
  410.  *
  411.  */
  412. struct EVIL_dup
  413.   {
  414.   int error;
  415.   CERTCertificate *cert;
  416.   CERTCertificate *return_cert;
  417.   };
  418. /* This is called inside the mozilla thread */
  419. PR_STATIC_CALLBACK(void) jar_moz_dup_fn (void *data)
  420.   {
  421.   CERTCertificate *return_cert;
  422.   struct EVIL_dup *dup_data = (struct EVIL_dup *)data;
  423.   PORT_SetError (dup_data->error);
  424.   return_cert = CERT_DupCertificate (dup_data->cert);
  425.   dup_data->return_cert = return_cert;
  426.   dup_data->error = PORT_GetError();
  427.   }
  428. /* Wrapper for the ET_MOZ call */
  429.  
  430. CERTCertificate *jar_moz_dup (CERTCertificate *cert)
  431.   {
  432.   CERTCertificate *dup_cert;
  433.   ALLOC_OR_DEFINE(struct EVIL_dup, dup_data, NULL);
  434.   dup_data->error = PORT_GetError();
  435.   dup_data->cert  = cert;
  436.   /* Synchronously invoke the callback function on the mozilla thread. */
  437. #ifdef MOZILLA_CLIENT_OLD
  438.   if (mozilla_event_queue)
  439.     ET_moz_CallFunction (jar_moz_dup_fn, dup_data);
  440.   else
  441.     jar_moz_dup_fn (dup_data);
  442. #else
  443.   jar_moz_dup_fn (dup_data);
  444. #endif
  445.   PORT_SetError (dup_data->error);
  446.   dup_cert = dup_data->return_cert;
  447.   /* Free the data passed to the callback function... */
  448.   FREE_IF_ALLOC_IS_USED(dup_data);
  449.   return dup_cert;
  450.   }
  451. /* --- --- --- --- --- --- --- --- --- --- --- --- --- */