Как обеспечить кодирование определенной длины с CMS в NSS? - PullRequest
0 голосов
/ 09 сентября 2010

Как применить кодирование определенной длины с CMS в NSS?

Я пытаюсь заставить кодировщик NMS CMS кодировать с помощью 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);

Любая помощь приветствуется, Chenz

1 Ответ

0 голосов
/ 27 августа 2011

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

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

NSS_CMSContentInfo_SetDontStream ()

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

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

bob

...