package
0.0.0-20200929032655-f6a69397212e
Repository: https://github.com/sea-project/sea-pkg.git
Documentation: pkg.go.dev

# README

Travis CI GoDoc Go Report Card

包btcec实现了工作所需的椭圆曲线加密 比特币(secp256k1暂不适用)。它的设计目的是使它可以与 go附带的标准加密/ecdsa包。一套全面的测试 提供以确保适当的功能。

虽然这个包最初是为btcd编写的,但它是故意为btcd编写的 设计成可以作为任何需要的项目的独立包使用 使用secp256k1椭圆曲线密码学。

代码走读

各文件方法表

序号Go文件/函数或方法作用
1btcec.go该文件主要提缩短操作变量、实现secp256k1的曲线的方法
   | `NAF` | NAF取一个正整数k,并以两个字节片的形式返回非相邻表单(NAF),使得最小化操作数量成为可能,因为返回的结果int至少为50%。
  | ==`S256`== | S256会返回一条实现secp256k1的曲线

2 | ecdsa.go | 主要提供了生成公私钥对、签名转公钥、使用hash和签名对公钥进行序列化、公钥转地址等方法  | ==PubKey== | 私钥返公钥  | ==ToECDSA== | 私钥返ecdsa私钥。  | ==Sign== | 私钥签名  | Serialize | 私钥序列化,==暂时未调用==  | ==IsEqual==| 公钥对比  | ==PubkeyToAddress== | 公钥转地址  | SerializeCompressed | 序列化公钥为33字节的压缩格式  | SerializeHybrid | 序列化公钥为65字节的混合格式  | SerializeUncompressed | 序列化公钥为65字节的未压缩格式  | ==ToECDSA== | 公钥返ecdsa公钥  | ==Decrypt== | 私钥解密。  | ==DoubleHashB== | 计算Hash,返回32位的固定字符串。  | ==Encrypt== | 公钥加密  | FromECDSAPub | 椭圆加密公钥转坐标,作用是为公钥转地址方法提供支持  | ==GenerateKeyPair== | 生成公私钥对  | GenerateSharedSecret | 基于公私钥生成共享密钥  | ==Keccak256== | sha3 256加密内容  | ==ParsePubKey== | 验证公钥是否有效  | PrivKeyFromBytes | 根据传入的byte数组(密码)和椭圆曲线,返回一个公私钥  | ==UnmarshalPubkey== | 将公钥的byte[]转换为secp256k1公钥。  | Keccak256Hash | Keccak256Hash计算并返回输入数据的Keccak256散列,将其转换为内部散列数据结构,==暂时未调用==。 3 | field.go | 该文件主要提供了基于fieldVal结构体的一系列和算法有关的方法,该文件的作用是精度算法来提高性能,如果你没有很好的算法基础,建议你了解一下这个包的作用就可以了。 4 | genprecomps.go | 此文件在常规构建过程中由于以下构建标记而被忽略。它由go generate调用,用于自动生成用于加速操作的预计算表。 5 | gensecp256k1.go | 用于生成secp256k1.go文件 6 | precompute.go | 提供了包内可用调用的loadS256BytePoints方法,作用是用于加速secp256k1曲线标量基乘法的预计算字节点进行解压缩和反序列化,从而使用这种方法在init时生成内存中的数据结构非常快。 7 | secp256k1.go | 作用为在生成椭圆曲线时提供加速,由gensecp256k1文件生成 8 | signature.go | 提供了对签名的序列化、验签、签名对比等方法。  | IsEqual | 将签名的实例和传入的签名进行对比,==暂时未调用==  | ==Serialize== | 对签名进行序列化  | ==Verify== | 通过调用ecdsa的公钥来验证哈希的签名是否正确  | RecoverCompact | 验证压缩签名,正确就返回公钥,错误则返回错误信息  | ==SignCompact== | 使用自定的私钥生成压缩签名

单元测试

序号Go文件/测试用例方法说明
1ecdsa_test.go主要测试了包含创建公私钥、加密解密、加签验签等流程
 | `Test_Sign` | 测试私钥加签
   | `Test_ToECDSA` | 私钥转ecdsa的私钥
   | `Test_PubKey` | 私钥返回对应的公钥
   | `Benchmark_Sign` | 对加签进行压测
  | `Test_GenerateKeyPair` | 测试生成公私钥对
  | `Test_PubkeyToAddress` | 测试公钥转地址、
   | `Test_Verify` | 测试通过公钥和hash对签名进行验签
   | `Test_ParsePubKey` | 测试验证公钥是否有效
   | `Test_SignAndVerify` | 私钥加签,用验证后的公钥进行解签,hash由一个hash算法生成。
   | `Test_EncryptAndDecode` | 测试公钥进行加密,私钥进行解密
   | `Benchmark_Verify` | 对加签和验签进行压测
   | `Benchmark_SerializeCompressed` | 对序列化一个33字节的公钥进行压测
   | `Benchmark_SerializeHybrid` | 对序列化一个65字节混合格式的公钥进行压测
   | `Benchmark_SerializeUncompressed` | 对序列化一个65字节的未压缩的公钥进行压测
  | `Test_SigToPub` | 测试签名转公钥(只对以太坊的有效)
  | `TestEcrecover` | 使用hsah和签名转换后的公钥,进行序列化(只对以太坊的有效)
  | `Test_Keccak256` | 测试sha3 256加密内容
  | `Test_FromECDSAPub` | 测试椭圆加密公钥转坐标
  | `Test_Decode` | 测椭圆加密验证 - 对x,y轴的值是否存在曲线上进行验证,待验证
  | `Test_SignAndVerify` | 测试使用secp256k1私钥对消息进行签名,该私钥首先从原始字节解析并序列化生成的签名。
  | `Test_UnmarshalPubkey` | 测试通过hash和签名反向推出公钥
  | `Test_Flow` | 测试整体流程
  | `Test_Flow2` | 测试整体流程,并采用第二种加签验签的方式
  | `Test_Flow3` | 测试整体流程,并采用第二种加签验签的方式,并使用通过数据和hash解析出的公钥来进行验签