如何在NSS中使用CMS执行确定的长度?
-
01-10-2019 - |
题
如何在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);
任何帮助都赞赏,钦兹
解决方案
CMS本身是BER标准,因此默认情况下使用不定编码的NSS编码。这是因为NSS期望通过其管道流式传输数据,从而为应用程序提供了中间结果,而无需在产生任何输出之前接收整个流。
话虽如此,您不在乎流式传输数据,而是想使用确定的编码。 NSS团队最近添加了一个函数,该函数将关闭不确定的编码:
nss_cmscontentinfo_setdontstream()
在您的顶级ContentInfo上调用它。不幸的是,它是在NSS 3.12.10中添加的,因此您必须向上移动才能使用它。
如果您还有其他NSS问题,则应尝试Mozilla Crypto邮件列表:Dev-tech-crypto@lists.mozilla.org
鲍勃
不隶属于 StackOverflow