0

如何在 NSS 中使用 CMS 强制执行定长编码?

我正在尝试让 NSS 的 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

4

1 回答 1

0

CMS 本身是 BER 标准,因此默认情况下 NSS 使用不定编码进行编码。这是因为 NSS 期望通过其管道流式传输数据,为应用程序提供中间结果,而无需在生成任何输出之前接收整个流。

话虽如此,CMS 编码器有一些应用程序,您不关心流式传输数据,而是希望使用明确的编码。NSS 团队最近添加了一个可以关闭无限编码的功能,称为:

NSS_CMSContentInfo_SetDontStream()

在您的顶级内容信息上调用它。不幸的是,它是在 NSS 3.12.10 中添加的,因此您必须升级才能使用它。

如果您有其他 NSS 问题,您应该尝试 Mozilla 加密邮件列表:dev-tech-crypto@lists.mozilla.org

鲍勃

于 2011-08-26T23:17:54.383 回答