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