Pregunta

¿Cómo hacer cumplir la codificación de longitud definida con el CMS en NSS?

Estoy tratando de conseguir codificador CMS de NSS para codificar con DER, pero la gente como Mozilla aparentemente sólo se han preocupado por codificación BER (por lo que puedo decir.) Soy capaz de obtener la codificación definitiva con los tipos primitivos, pero todos tipos construidos tienen codificación indefinida.

Código actualmente estoy 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);

Cualquier ayuda apreciado, Chenz

¿Fue útil?

Solución

sí CMS es un estándar de BER, lo que por defecto codifica NSS utilizando codificación indefinida. Esto se debe a NSS espera para transmitir los datos a través de él de la tubería, proporcionar la aplicación con resultados intermedios sin tener que recibir toda la corriente antes de que se produce ninguna salida.

Una vez dicho esto, hay algunas aplicaciones para el codificador de CMS en el que no se preocupan por la transmisión de los datos, y desea utilizar la codificación definitiva. El equipo NSS ha añadido recientemente la función que se apague la codificación indefinida llamada:

NSS_CMSContentInfo_SetDontStream ()

lo llaman en su ContentInfo nivel superior. Por desgracia, se añadió en NSS 3.12.10, por lo que tendrá que pasar a utilizarlo.

Si usted tiene otras preguntas NSS, usted debe tratar las listas de correo cripto Mozilla: dev-tech-crypto@lists.mozilla.org

bob

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top