jar.c

来自「支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS」· C语言 代码 · 共 834 行 · 第 1/2 页

C
834
字号
       return -1;       }    PORT_Assert (ctx->nextsign->thing != NULL);    signer = (JAR_Signer*)ctx->nextsign->thing->data;    }  /* Find out which linked list to traverse. Then if     necessary, advance to the next linked list. */  while (1)    {    switch (finding)      {      case jarTypeSign:    /* not any more */                           PORT_Assert( finding != jarTypeSign );                           list = signer->certs;                           break;      case jarTypeSect:    list = jar->manifest;                           break;      case jarTypePhy:     list = jar->phy;                           break;      case jarTypeSF:      /* signer, not jar */                           PORT_Assert( signer != NULL );                           list = signer->sf;                           break;      case jarTypeMF:      list = jar->hashes;                           break;      case jarTypeOwner:   list = jar->signers;                           break;      case jarTypeMeta:    list = jar->metainfo;                           break;      default:             PORT_Assert( 1 != 2 );                           break;      }    if (list == NULL)      {      *it = NULL;      return -1;      }    /* When looping over lists of lists, advance       to the next signer. This is done when multiple       signers are possible. */    if (ZZ_ListIterDone (list, ctx->next))      {      if (ctx->nextsign && jar->signers)         {        ctx->nextsign = ctx->nextsign->next;        if (!ZZ_ListIterDone (jar->signers, ctx->nextsign))           {          PORT_Assert (ctx->nextsign->thing != NULL);          signer = (JAR_Signer*)ctx->nextsign->thing->data;          PORT_Assert( signer != NULL );          ctx->next = NULL;          continue;          }        }      *it = NULL;      return -1;      }    /* if the signer changed, still need to fill       in the "next" link */    if (ctx->nextsign && ctx->next == NULL)      {      switch (finding)        {        case jarTypeSF:          ctx->next = ZZ_ListHead (signer->sf);          break;        case jarTypeSign:          ctx->next = ZZ_ListHead (signer->certs);          break;        }      }    PORT_Assert( ctx->next != NULL );    while (!ZZ_ListIterDone (list, ctx->next))      {      *it = ctx->next->thing;      ctx->next = ctx->next->next;      if (!it || !*it || (*it)->type != finding)        continue;      if (ctx->pattern && *ctx->pattern)        {        if (PORT_Strcmp ((*it)->pathname, ctx->pattern))          continue;        }      /* We have a valid match. If this is a jarTypeSign         return the certificate instead.. */      if (ctx->finding == jarTypeSign)        {        JAR_Item *itt;        /* just the first one for now */        if (jar_find_first_cert (signer, jarTypeSign, &itt) >= 0)            {           *it = itt;           return 0;           }        continue;              }      return 0;      }    } /* end while */  }static int jar_find_first_cert     (JAR_Signer *signer, int type, JAR_Item **it)  {  ZZLink *link;  ZZList *list;  int status = JAR_ERR_PNF;  list = signer->certs;  *it = NULL;  if (ZZ_ListEmpty (list))    {    /* empty list */    return JAR_ERR_PNF;    }  for (link = ZZ_ListHead (list);        !ZZ_ListIterDone (list, link);        link = link->next)    {    if (link->thing->type == type)      {      *it = link->thing;      status = 0;      break;      }    }  return status;  }JAR_Signer *JAR_new_signer (void)  {  JAR_Signer *signer;  signer = (JAR_Signer *) PORT_ZAlloc (sizeof (JAR_Signer));  if (signer == NULL)    goto loser;  /* certs */  signer->certs = ZZ_NewList();  if (signer->certs == NULL)    goto loser;  /* sf */  signer->sf = ZZ_NewList();  if (signer->sf == NULL)    goto loser;  return signer;loser:  if (signer)    {    if (signer->certs)       ZZ_DestroyList (signer->certs);    if (signer->sf)       ZZ_DestroyList (signer->sf);    PORT_Free (signer);    }  return NULL;  }void JAR_destroy_signer (JAR_Signer *signer)  {  if (signer)    {    if (signer->owner) PORT_Free (signer->owner);    if (signer->digest) PORT_Free (signer->digest);    jar_destroy_list (signer->sf);    ZZ_DestroyList (signer->sf);    jar_destroy_list (signer->certs);    ZZ_DestroyList (signer->certs);    PORT_Free (signer);    }  }JAR_Signer *jar_get_signer (JAR *jar, char *basename)  {  JAR_Item *it;  JAR_Context *ctx;  JAR_Signer *candidate;  JAR_Signer *signer = NULL;  ctx = JAR_find (jar, NULL, jarTypeOwner);  if (ctx == NULL)    return NULL;  while (JAR_find_next (ctx, &it) >= 0)    {    candidate = (JAR_Signer *) it->data;    if (*basename == '*' || !PORT_Strcmp (candidate->owner, basename))      {      signer = candidate;      break;      }    }  JAR_find_end (ctx);  return signer;  }/* *  J A R _ g e t _ f i l e n a m e * *  Returns the filename associated with *  a JAR structure. * */char *JAR_get_filename (JAR *jar)  {  return jar->filename;  }/* *  J A R _ g e t _ u r l * *  Returns the URL associated with *  a JAR structure. Nobody really uses this now. * */char *JAR_get_url (JAR *jar)  {  return jar->url;  }/* *  J A R _ s e t _ c a l l b a c k * *  Register some manner of callback function for this jar.  * */int JAR_set_callback (int type, JAR *jar,       int (*fn) (int status, JAR *jar,          const char *metafile, char *pathname, char *errortext))  {  if (type == JAR_CB_SIGNAL)    {    jar->signal = fn;    return 0;    }  else    return -1;  }/* *  Callbacks * *//* To return an error string */char *(*jar_fn_GetString) (int) = NULL;/* To return an MWContext for Java */void *(*jar_fn_FindSomeContext) (void) = NULL;/* To fabricate an MWContext for FE_GetPassword */void *(*jar_fn_GetInitContext) (void) = NULL;voidJAR_init_callbacks     (      char *(*string_cb)(int),      void *(*find_cx)(void),      void *(*init_cx)(void)      )  {  jar_fn_GetString = string_cb;  jar_fn_FindSomeContext = find_cx;  jar_fn_GetInitContext = init_cx;  }/* *  J A R _ g e t _ e r r o r * *  This is provided to map internal JAR errors to strings for *  the Java console. Also, a DLL may call this function if it does *  not have access to the XP_GetString function. * *  These strings aren't UI, since they are Java console only. * */char *JAR_get_error (int status)  {   char *errstring = NULL;  switch (status)    {    case JAR_ERR_GENERAL:      errstring = "General JAR file error";      break;    case JAR_ERR_FNF:      errstring = "JAR file not found";      break;    case JAR_ERR_CORRUPT:      errstring = "Corrupt JAR file";      break;    case JAR_ERR_MEMORY:      errstring = "Out of memory";      break;    case JAR_ERR_DISK:      errstring = "Disk error (perhaps out of space)";      break;    case JAR_ERR_ORDER:      errstring = "Inconsistent files in META-INF directory";      break;    case JAR_ERR_SIG:      errstring = "Invalid digital signature file";      break;    case JAR_ERR_METADATA:      errstring = "JAR metadata failed verification";      break;    case JAR_ERR_ENTRY:      errstring = "No Manifest entry for this JAR entry";      break;    case JAR_ERR_HASH:      errstring = "Invalid Hash of this JAR entry";      break;    case JAR_ERR_PK7:      errstring = "Strange PKCS7 or RSA failure";      break;    case JAR_ERR_PNF:      errstring = "Path not found inside JAR file";      break;    default:      if (jar_fn_GetString)        {        errstring = jar_fn_GetString (status);        }      else        {        /* this is not a normal situation, and would only be           called in cases of improper initialization */        char *err;        err = (char*)PORT_Alloc (40);        if (err)          PR_snprintf (err, 39,  "Error %d\n", status);        else          err = "Error! Bad! Out of memory!";        return err;        }      break;    }  return errstring;  }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?