Go 代码测试覆盖度
在 Go 语言中,本身提供了一些命令来展示代码的覆盖度,我们可以通过执行这些命令来查看哪些语句被测试覆盖到了,哪些没有,进而可以编写更多的 case 来提高代码的覆盖度。
执行下面的命令,可以得出项目里面所有 package 的覆盖度
1 | go test ./... -cover |
在 Go 语言中,本身提供了一些命令来展示代码的覆盖度,我们可以通过执行这些命令来查看哪些语句被测试覆盖到了,哪些没有,进而可以编写更多的 case 来提高代码的覆盖度。
执行下面的命令,可以得出项目里面所有 package 的覆盖度
1 | go test ./... -cover |
SPHINCS 于 2015 年由 Bernstein, Daniel J., Daira Hopwood, Andreas Hülsing 等人提出,具体的论文见 SPHINCS: practical stateless hash-based signatures。
SPHINCS 是一个无状态的签名系统。有状态指的是每次签名时需要记录系统的信息,比如是第几次签名,在验证的时候需要使用该参数,而无状态的签名系统则不需要保存这些信息。相对于有状态的签名系统,无状态的签名系统不需要记录签名的状态,符合标准的 API 且方便在不同主机上移植,无状态的签名系统是更好的选择。
Cargo 和其他很多工具一样,遵循语义版本控制系统,程序库以
$$\text{major.minor.patch}$$
格式指定,其中
major
:项目进行重大更新,且包含不向后兼容的功能minor
:仅在以向后兼容的方式添加新功能patch
:仅在以向后兼容的方式修复错误,并且没有添加任何新的功能本文建立在 WOTS 签名系统基础上,若还尚不熟悉该签名系统,可参考另一篇文章 Winternitz One Time Signature,论文见 W-OTS+ – Shorter Signatures for Hash-Based Signature Schemes,该算法产生的一对密钥只能签名一条消息。
下面按照 $(GEN, SIG, VER)$ 三元组描述该算法。
$$(pk, sk) \leftarrow GEN(1^k)$$
首先,我们需要确定 $w$ 参数该参数决定哈希私钥多少次构造公钥,此外还需确定哈希之后摘要的长度 $m$ ,或者可以认为是采用的哈希函数族,$n$ 为其他哈希值长度。
HORST 属于 FTS,由 HORS 改进而来,相比较 HORS 而言,牺牲了运行时间,但是减少了公钥的大小,同时算法中引入了掩码的计算。
HORST 中的公钥是二叉哈希树 (binary hash tree) 的根节点,叶子节点是 HOSR 公钥的 $(t=2^\tau)$ 个 $block$ 。
本文的介绍建立在 HORS 之上,若还尚未了解 HORS 签名系统机制,可以参考另一篇文章 Hash to Obtain Random Subset (HORS),此外,提出 HORST 的论文见 SPHINCS: practical stateless hash-based signatures。