网络安全服务(
NSS )是用于安全客户端和服务器应用程序的跨平台开发的一组库。
与OpenSSL一样,NSS软件包提供了使用命令行实用程序来实现各种PKI功能(密钥生成,颁发x509v3证书,使用电子签名,TLS支持等)的功能。 这些实用程序之一,即Pretty-print(PP),使您可以方便地查看x509 v3证书和电子签名(pkcs#7)等的内容。 此外,证书可以采用DER和PEM编码:
bash-4.3$ pp -h Usage: pp [-t type] [-a] [-i input] [-o output] [-w] [-u] Pretty prints a file containing ASN.1 data in DER or ascii format. -t type Specify input and display type: public-key (pk), certificate (c), certificate-request (cr), certificate-identity (ci), pkcs7 (p7), crl or name (n). (Use either the long type name or the shortcut.) -a Input is in ascii encoded form (RFC1113) -i input Define an input file to use (default is stdin) -o output Define an output file to use (default is stdout) -w Don't wrap long output lines -u Use UTF-8 (default is to show non-ascii as .) bash-4.3$
此外,-u参数(UTF-8编码)的存在允许以俄语编码查看证书。 但是,仔细
查看 NSS软件包命令行实用程序的GUI屏幕截图,您会发现一些证书数据只是消失了:

开始搜索丢失的信息。 在命令行中启动了“ cute print”实用程序(即Pretty-print的翻译方式),以查看通信部总局的根证书:
$pp – certificate –u –i _.cer … Subject: "CN= ,INN=007710474375,OGRN=1047702026701,O= ,STREET="125375 . , . , . 7",L=,ST=77 . ,C=RU,E=dit@minsvya z.ru" …. $
结果证实了数据丢失。 此外,屏幕上还出现了两个不可显示的符号(带有问号的黑色侧面菱形?内部)。 分析表明,这些不可显示的字符分别具有代码0xD0和0xBE:

俄语字母“ o”以UTF-8的十六进制表示形式消失了,编码为0xD00xBE。 代码0xD0和0xBE是我们不可显示的字符。 在这些字节之间出现什么样的字符? 这是一个“漂亮”的印刷品-印刷文字的对齐符号。
怎么了 “漂亮”打印的输入(文件/nss/cmd/lib/secutil.c,功能secu_PrintRawStringQuotesOptional)以SECITEM形式接收数据,即 每个字节数组的地址及其长度:
for (i = 0; i < si->len; i++) { unsigned char val = si->data[i]; unsigned char c; if (SECU_GetWrapEnabled() && column > 76) { SECU_Newline(out); SECU_Indent(out, level); column = level * INDENT_MULT; } if (utf8DisplayEnabled) { if (val < 32) c = '.'; else c = val; } else { c = printable[val]; } fprintf(out, "%c", c); column++; }
并且,如果提供了(SECU_GetWrapEnabled()== True)以便进行漂亮的打印(PP实用程序没有–w参数)并且一行中的字节数超过了76(列> 76),则在下一个字符之后添加新行(SECU_Newline)和必要的缩进(SECU_Indent ) 同时,没有开发人员认为如果使用UTF-8编码(utf8DisplayEnabled),则只能在下一个字符而不是字节之后才产生美感,因为采用UTF-8编码的字节和字符的概念可能不一致。 如果我们谈论俄语字母,那么每个字母都
用两个字节
编码 。 我们的俄语字母“ o”(0xD00xBE)恰好出现了这样的差距。
出路是什么? secu_PrintRawStringQuotesOptional函数中的所有内容都非常简单,可以替换该行:
if (SECU_GetWrapEnabled() && column > 76) {
在以下形式的一行上:
if (SECU_GetWrapEnabled() && column > 76 && (val <= 0x7F || val == 0xD0 || val == 0xD1)) {
如果现在重新构建PP实用程序并将其安装在系统中,则“漂亮”的印刷品将证明其名称为“伟大,强大,真实和免费的俄语!”。 (I.S. Turgenev):

如果我们谈论印刷的美,那么不仅可以通过行中的字符数添加连字符,而且可以通过空格,逗号,冒号和其他字符来更正确地添加连字符。 我不是在谈论转移的语义分析。 但这已经是人工智能领域。
最后,这是NSS实用程序中第二个发现的错误。 第一个是在
oidcalc实用程序中发现的。