Frage

Wie mit CMS in NSS?

bestimmte Länge Kodierung erzwungen

Ich versuche, mit DEM NSS CMS-Encoder zu kodieren zu bekommen, aber die Leute wie mozilla haben offenbar nur über BER-Codierung besorgt (soweit ich das sagen kann.) Ich bin in der Lage bestimmte Codierung mit primitiven Typen zu bekommen, aber alle konstruierte Typen haben indefinite Codierung.

Code I bin derzeit mit (mit 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);

Jede Hilfe dankbar, Chenz

War es hilfreich?

Lösung

CMS selbst ist ein BER-Standard, so dass standardmäßig NSS codiert mit unbestimmter Codierung. Dies liegt daran, NSS die Daten durch sie die Pipeline zu streamen erwartet, um die Anwendung mit Zwischenergebnis bereitstellt, ohne den gesamten Strom zu erhalten, die, bevor sie eine Ausgabe produziert.

That being said, gibt es einige Anwendungen für den CMS-Encoder, wo Sie kümmern sich nicht um die Streaming-Daten, und wollen bestimmte Codierung verwenden. Das NSS-Team hat kürzlich eine Funktion, die unbestimmte Codierung deaktivieren aufgerufen:

NSS_CMSContentInfo_SetDontStream ()

rufen Sie es auf Ihrem Top-Level-Content. Leider wurde es hinzugefügt in NSS 3.12.10, so dass Sie sie bewegen müssen werden verwenden.

Wenn Sie andere NSS Fragen haben, sollten Sie versuchen, die Mozilla Krypto-Mailing-Listen: dev-tech-crypto@lists.mozilla.org

bob

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top