Вопрос

Как принять определенную длину, кодирующую CMS в NSS?

Я пытаюсь получить кодировщик CMS NSS, чтобы кодировать с DER, но люди, поскольку Mozilla, по-видимому, только беспокоились о кодировке BER (насколько я могу сказать.) Я могу получить определенную кодировку с примитивными типами, но все построенные типы имеют неопределенное кодирование.

Код я в настоящее время использую (с 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);

Любая помощь оценила, Ченц

Это было полезно?

Решение

Сама CMS - это стандарт BER, поэтому по умолчанию NSS кодирует использование неопределенного кодирования. Это связано с тем, что NSS рассчитывает поток данных через его трубопровод, обеспечивая приложение промежуточным результатом без необходимости получать весь поток, прежде чем он дает любой выход.

Это, как говорят, есть некоторые приложения для кодировщика CMS, где вы не заботитесь о потоковой передаче данных и хотите использовать определенную кодировку. Команда NSS недавно добавила функцию, которая выключит неопределенные кодировки:

Nss_cmscontentinfo_setdontstream ()

Назовите это на верхнем уровне ContentInfo. К сожалению, он был добавлен в NSS 3.12.10, поэтому вам придется перейти к его использованию.

Если у вас есть другие вопросы NSS, вы должны попробовать список Mozilla Crypto Mailing: dev-tech-crypto@lists.mozilla.org

боб

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top