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  }