Question

Comment appliquer le codage de longueur définie avec la CMS NSS?

Je suis en train d'obtenir l'encodeur CMS de NSS à encode avec DER, mais les gens comme mozilla ont apparemment seulement préoccupés par le codage BER (pour autant que je peux dire.) Je suis en mesure d'obtenir un codage défini avec les types primitifs, mais tous types construits ont un codage de durée indéterminée.

code J'utilise actuellement (avec NSS-3.12.7):

/* Create memory pool (aka an arena.) */
  PLArenaPool * arena = PORT_NewArena(4096);

  /* Create the CMS Message object */
  fprintf(stderr, "Create the CMS Message object\n");
  NSSCMSMessage * cmsMessage = NSS_CMSMessage_Create(arena);
  NSSCMSContentInfo * cinfo = NSS_CMSMessage_GetContentInfo(cmsMessage);

  /* Create a DigestedData object who's parent is cmsMessage */
  fprintf(stderr, "Create a DigestedData object who's parent is cmsMessage\n");
  SECAlgorithmID * id = CreateDigestAlgorithmID(arena, SEC_OID_SHA1);
  NSSCMSDigestedData * digestedData =
    NSS_CMSDigestedData_Create(cmsMessage, id);
  NSSCMSContentInfo * dcinfo =
    NSS_CMSDigestedData_GetContentInfo(digestedData);

  /* Tell the DigestedData object to include the content (not detached.) */
  fprintf(stderr, "Tell the DigestedData object to include the content (Length: %d)\n", in_len);
  SECItem * in_data = CreateSECItemString(arena, in, in_len);
  NSS_CMSContentInfo_SetContent_Data(cmsMessage, dcinfo, in_data, PR_FALSE);

  /* Put digestedData into cmsMessage's contentInfo section */
  fprintf(stderr, "Put digestedData into cmsMessage's contentInfo section\n");
  NSS_CMSContentInfo_SetContent_DigestedData(cmsMessage, cinfo, digestedData);

  /* Encode input data to DER format with following parameters */
  fprintf(stderr, "Encode input data to DER format\n");
  SECItem * encodedOutput = (SECItem*)PORT_ArenaZAlloc(arena, sizeof(SECItem));

  NSSCMSEncoderContext * ecx =
    NSS_CMSEncoder_Start(cmsMessage, NULL, NULL, encodedOutput, arena,
      NULL, NULL, NULL, NULL, NULL, NULL);
  fprintf(stderr, "NSS_CMSEncoder_Update\n");
  NSS_CMSEncoder_Update(ecx, NULL, 0);
  fprintf(stderr, "NSS_CMSEncoder_Finish\n");
  NSS_CMSEncoder_Finish(ecx);

Toute aide appréciée, Chenz

Était-ce utile?

La solution

CMS lui-même est une norme de BER, donc par défaut NSS encode en utilisant un codage de durée indéterminée. En effet, NSS prévoit diffuser les données au travers de pipeline, en fournissant l'application avec des résultats intermédiaires sans avoir à recevoir le flux entier avant qu'elle ne produit aucune sortie.

Cela étant dit, il y a des applications pour l'encodeur CMS où vous ne se soucient pas de streaming les données, et que vous voulez utiliser le codage défini. L'équipe NSS a récemment ajouté une fonction qui interrompra l'encodage indéfini appelé:

NSS_CMSContentInfo_SetDontStream ()

appelez sur votre haut niveau contentinfo. Malheureusement, il a été ajouté dans NSS 3.12.10, vous devrez passer à l'utiliser.

Si vous avez d'autres questions NSS, vous devriez essayer les listes de diffusion de Mozilla crypto: dev-tech-crypto@lists.mozilla.org

bob

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top