github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/crypto/ecies/params.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 //版权所有(c)2013 Kyle Isom<kyle@tyrfingr.is> 10 //版权所有(c)2012 The Go作者。版权所有。 11 // 12 //以源和二进制形式重新分配和使用,有或无 13 //允许修改,前提是以下条件 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 package ecies 39 40 //此文件包含用于ECIES加密的参数,指定 41 //对称加密和HMAC参数。 42 43 import ( 44 "crypto" 45 "crypto/aes" 46 "crypto/cipher" 47 "crypto/elliptic" 48 "crypto/sha256" 49 "crypto/sha512" 50 "fmt" 51 "hash" 52 53 ethcrypto "github.com/ethereum/go-ethereum/crypto" 54 ) 55 56 var ( 57 DefaultCurve = ethcrypto.S256() 58 ErrUnsupportedECDHAlgorithm = fmt.Errorf("ecies: unsupported ECDH algorithm") 59 ErrUnsupportedECIESParameters = fmt.Errorf("ecies: unsupported ECIES parameters") 60 ) 61 62 type ECIESParams struct { 63 Hash func() hash.Hash //哈希函数 64 hashAlgo crypto.Hash 65 Cipher func([]byte) (cipher.Block, error) //对称加密 66 BlockSize int //对称密码的块大小 67 KeyLen int //对称密钥长度 68 } 69 70 //标准ECIES参数: 71 //*使用AES128和HMAC-SHA-256-16的ECIES 72 //*使用AES256和HMAC-SHA-256-32的ECIE 73 //*使用AES256和HMAC-SHA-384-48的ECIES 74 //*使用AES256和HMAC-SHA-512-64的ECIES 75 76 var ( 77 ECIES_AES128_SHA256 = &ECIESParams{ 78 Hash: sha256.New, 79 hashAlgo: crypto.SHA256, 80 Cipher: aes.NewCipher, 81 BlockSize: aes.BlockSize, 82 KeyLen: 16, 83 } 84 85 ECIES_AES256_SHA256 = &ECIESParams{ 86 Hash: sha256.New, 87 hashAlgo: crypto.SHA256, 88 Cipher: aes.NewCipher, 89 BlockSize: aes.BlockSize, 90 KeyLen: 32, 91 } 92 93 ECIES_AES256_SHA384 = &ECIESParams{ 94 Hash: sha512.New384, 95 hashAlgo: crypto.SHA384, 96 Cipher: aes.NewCipher, 97 BlockSize: aes.BlockSize, 98 KeyLen: 32, 99 } 100 101 ECIES_AES256_SHA512 = &ECIESParams{ 102 Hash: sha512.New, 103 hashAlgo: crypto.SHA512, 104 Cipher: aes.NewCipher, 105 BlockSize: aes.BlockSize, 106 KeyLen: 32, 107 } 108 ) 109 110 var paramsFromCurve = map[elliptic.Curve]*ECIESParams{ 111 ethcrypto.S256(): ECIES_AES128_SHA256, 112 elliptic.P256(): ECIES_AES128_SHA256, 113 elliptic.P384(): ECIES_AES256_SHA384, 114 elliptic.P521(): ECIES_AES256_SHA512, 115 } 116 117 func AddParamsForCurve(curve elliptic.Curve, params *ECIESParams) { 118 paramsFromCurve[curve] = params 119 } 120 121 //paramsfromcurve为选定的椭圆曲线选择最佳参数。 122 //仅支持曲线P256、P38 4和P512。 123 func ParamsFromCurve(curve elliptic.Curve) (params *ECIESParams) { 124 return paramsFromCurve[curve] 125 }