github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/crypto/ecies/params.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:36</date> 10 //</624450085073195009> 11 12 //版权所有(c)2013 Kyle Isom<kyle@tyrfingr.is> 13 //版权所有(c)2012 The Go作者。版权所有。 14 // 15 //以源和二进制形式重新分配和使用,有或无 16 //允许修改,前提是以下条件 17 //遇见: 18 // 19 //*源代码的再分配必须保留上述版权。 20 //注意,此条件列表和以下免责声明。 21 //*二进制形式的再分配必须复制上述内容 22 //版权声明、此条件列表和以下免责声明 23 //在提供的文件和/或其他材料中, 24 //分布。 25 //*无论是谷歌公司的名称还是其 26 //贡献者可用于支持或推广源自 27 //本软件未经事先明确书面许可。 28 // 29 //本软件由版权所有者和贡献者提供。 30 //“原样”和任何明示或暗示的保证,包括但不包括 31 //仅限于对适销性和适用性的暗示保证 32 //不承认特定目的。在任何情况下,版权 33 //所有人或出资人对任何直接、间接、附带的, 34 //特殊、惩戒性或后果性损害(包括但不包括 35 //仅限于采购替代货物或服务;使用损失, 36 //数据或利润;或业务中断),无论如何引起的 37 //责任理论,无论是合同责任、严格责任还是侵权责任。 38 //(包括疏忽或其他)因使用不当而引起的 39 //即使已告知此类损坏的可能性。 40 41 package ecies 42 43 //此文件包含用于ECIES加密的参数,指定 44 //对称加密和HMAC参数。 45 46 import ( 47 "crypto" 48 "crypto/aes" 49 "crypto/cipher" 50 "crypto/elliptic" 51 "crypto/sha256" 52 "crypto/sha512" 53 "fmt" 54 "hash" 55 56 ethcrypto "github.com/ethereum/go-ethereum/crypto" 57 ) 58 59 var ( 60 DefaultCurve = ethcrypto.S256() 61 ErrUnsupportedECDHAlgorithm = fmt.Errorf("ecies: unsupported ECDH algorithm") 62 ErrUnsupportedECIESParameters = fmt.Errorf("ecies: unsupported ECIES parameters") 63 ) 64 65 type ECIESParams struct { 66 Hash func() hash.Hash //哈希函数 67 hashAlgo crypto.Hash 68 Cipher func([]byte) (cipher.Block, error) //对称加密 69 BlockSize int //对称密码的块大小 70 KeyLen int //对称密钥长度 71 } 72 73 //Standard ECIES parameters: 74 //*使用AES128和HMAC-SHA-256-16的ECIES 75 //*使用AES256和HMAC-SHA-256-32的ECIE 76 //* ECIES using AES256 and HMAC-SHA-384-48 77 //*使用AES256和HMAC-SHA-512-64的ECIES 78 79 var ( 80 ECIES_AES128_SHA256 = &ECIESParams{ 81 Hash: sha256.New, 82 hashAlgo: crypto.SHA256, 83 Cipher: aes.NewCipher, 84 BlockSize: aes.BlockSize, 85 KeyLen: 16, 86 } 87 88 ECIES_AES256_SHA256 = &ECIESParams{ 89 Hash: sha256.New, 90 hashAlgo: crypto.SHA256, 91 Cipher: aes.NewCipher, 92 BlockSize: aes.BlockSize, 93 KeyLen: 32, 94 } 95 96 ECIES_AES256_SHA384 = &ECIESParams{ 97 Hash: sha512.New384, 98 hashAlgo: crypto.SHA384, 99 Cipher: aes.NewCipher, 100 BlockSize: aes.BlockSize, 101 KeyLen: 32, 102 } 103 104 ECIES_AES256_SHA512 = &ECIESParams{ 105 Hash: sha512.New, 106 hashAlgo: crypto.SHA512, 107 Cipher: aes.NewCipher, 108 BlockSize: aes.BlockSize, 109 KeyLen: 32, 110 } 111 ) 112 113 var paramsFromCurve = map[elliptic.Curve]*ECIESParams{ 114 ethcrypto.S256(): ECIES_AES128_SHA256, 115 elliptic.P256(): ECIES_AES128_SHA256, 116 elliptic.P384(): ECIES_AES256_SHA384, 117 elliptic.P521(): ECIES_AES256_SHA512, 118 } 119 120 func AddParamsForCurve(curve elliptic.Curve, params *ECIESParams) { 121 paramsFromCurve[curve] = params 122 } 123 124 //paramsfromcurve为选定的椭圆曲线选择最佳参数。 125 //仅支持曲线P256、P38 4和P512。 126 func ParamsFromCurve(curve elliptic.Curve) (params *ECIESParams) { 127 return paramsFromCurve[curve] 128 } 129