Domanda

Come far rispettare la codifica lunghezza definita con CMS in NSS?

Sto cercando di ottenere encoder CMS di NSS per codificare con DER, ma la gente come Mozilla hanno apparentemente preoccupato solo di codifica BER (per quanto posso dire.) Sono in grado di ottenere la codifica definita con tipi primitivi, ma tutti tipi costruiti hanno codifica indefinito.

Codice Attualmente sto usando (con 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);

Qualsiasi aiuto apprezzato, Chenz

È stato utile?

Soluzione

CMS stesso è uno standard BER, in modo da codifica NSS predefinite che utilizzano la codifica a tempo indeterminato. Questo perché NSS prevede di trasmettere i dati attraverso di essa la conduttura, fornendo l'applicazione con risultati intermedi senza dover ricevere l'intero flusso prima di produrre qualsiasi output.

Detto questo, ci sono alcune applicazioni per l'encoder CMS dove non si preoccupano lo streaming dei dati, e si desidera utilizzare la codifica definita. Il team di NSS ha recentemente aggiunto una funzione che si spegne la codifica a tempo indeterminato chiamato:

NSS_CMSContentInfo_SetDontStream ()

chiamano sul tuo ContentInfo livello superiore. Purtroppo era aggiunto nel NSS 3.12.10, quindi dovrete spostare fino a usarlo.

Se avete altre domande NSS, si dovrebbe provare il Mozilla crypto mailing lists: dev-tech-crypto@lists.mozilla.org

Bob

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top