github.com/karalabe/go-ethereum@v0.8.5/crypto/ecies/params.go (about)

     1  package ecies
     2  
     3  // This file contains parameters for ECIES encryption, specifying the
     4  // symmetric encryption and HMAC parameters.
     5  
     6  import (
     7  	"crypto"
     8  	"crypto/aes"
     9  	"crypto/cipher"
    10  	"crypto/elliptic"
    11  	"crypto/sha256"
    12  	"crypto/sha512"
    13  	"fmt"
    14  	"hash"
    15  )
    16  
    17  // The default curve for this package is the NIST P256 curve, which
    18  // provides security equivalent to AES-128.
    19  var DefaultCurve = elliptic.P256()
    20  
    21  var (
    22  	ErrUnsupportedECDHAlgorithm   = fmt.Errorf("ecies: unsupported ECDH algorithm")
    23  	ErrUnsupportedECIESParameters = fmt.Errorf("ecies: unsupported ECIES parameters")
    24  )
    25  
    26  type ECIESParams struct {
    27  	Hash      func() hash.Hash // hash function
    28  	hashAlgo  crypto.Hash
    29  	Cipher    func([]byte) (cipher.Block, error) // symmetric cipher
    30  	BlockSize int                                // block size of symmetric cipher
    31  	KeyLen    int                                // length of symmetric key
    32  }
    33  
    34  // Standard ECIES parameters:
    35  // * ECIES using AES128 and HMAC-SHA-256-16
    36  // * ECIES using AES256 and HMAC-SHA-256-32
    37  // * ECIES using AES256 and HMAC-SHA-384-48
    38  // * ECIES using AES256 and HMAC-SHA-512-64
    39  
    40  var (
    41  	ECIES_AES128_SHA256 = &ECIESParams{
    42  		Hash:      sha256.New,
    43  		hashAlgo:  crypto.SHA256,
    44  		Cipher:    aes.NewCipher,
    45  		BlockSize: aes.BlockSize,
    46  		KeyLen:    16,
    47  	}
    48  
    49  	ECIES_AES256_SHA256 = &ECIESParams{
    50  		Hash:      sha256.New,
    51  		hashAlgo:  crypto.SHA256,
    52  		Cipher:    aes.NewCipher,
    53  		BlockSize: aes.BlockSize,
    54  		KeyLen:    32,
    55  	}
    56  
    57  	ECIES_AES256_SHA384 = &ECIESParams{
    58  		Hash:      sha512.New384,
    59  		hashAlgo:  crypto.SHA384,
    60  		Cipher:    aes.NewCipher,
    61  		BlockSize: aes.BlockSize,
    62  		KeyLen:    32,
    63  	}
    64  
    65  	ECIES_AES256_SHA512 = &ECIESParams{
    66  		Hash:      sha512.New,
    67  		hashAlgo:  crypto.SHA512,
    68  		Cipher:    aes.NewCipher,
    69  		BlockSize: aes.BlockSize,
    70  		KeyLen:    32,
    71  	}
    72  )
    73  
    74  var paramsFromCurve = map[elliptic.Curve]*ECIESParams{
    75  	elliptic.P256(): ECIES_AES128_SHA256,
    76  	elliptic.P384(): ECIES_AES256_SHA384,
    77  	elliptic.P521(): ECIES_AES256_SHA512,
    78  }
    79  
    80  func AddParamsForCurve(curve elliptic.Curve, params *ECIESParams) {
    81  	paramsFromCurve[curve] = params
    82  }
    83  
    84  // ParamsFromCurve selects parameters optimal for the selected elliptic curve.
    85  // Only the curves P256, P384, and P512 are supported.
    86  func ParamsFromCurve(curve elliptic.Curve) (params *ECIESParams) {
    87  	return paramsFromCurve[curve]
    88  
    89  	/*
    90  		switch curve {
    91  		case elliptic.P256():
    92  			return ECIES_AES128_SHA256
    93  		case elliptic.P384():
    94  			return ECIES_AES256_SHA384
    95  		case elliptic.P521():
    96  			return ECIES_AES256_SHA512
    97  		default:
    98  			return nil
    99  		}
   100  	*/
   101  }
   102  
   103  // ASN.1 encode the ECIES parameters relevant to the encryption operations.
   104  func paramsToASNECIES(params *ECIESParams) (asnParams asnECIESParameters) {
   105  	if nil == params {
   106  		return
   107  	}
   108  	asnParams.KDF = asnNISTConcatenationKDF
   109  	asnParams.MAC = hmacFull
   110  	switch params.KeyLen {
   111  	case 16:
   112  		asnParams.Sym = aes128CTRinECIES
   113  	case 24:
   114  		asnParams.Sym = aes192CTRinECIES
   115  	case 32:
   116  		asnParams.Sym = aes256CTRinECIES
   117  	}
   118  	return
   119  }
   120  
   121  // ASN.1 encode the ECIES parameters relevant to ECDH.
   122  func paramsToASNECDH(params *ECIESParams) (algo asnECDHAlgorithm) {
   123  	switch params.hashAlgo {
   124  	case crypto.SHA224:
   125  		algo = dhSinglePass_stdDH_sha224kdf
   126  	case crypto.SHA256:
   127  		algo = dhSinglePass_stdDH_sha256kdf
   128  	case crypto.SHA384:
   129  		algo = dhSinglePass_stdDH_sha384kdf
   130  	case crypto.SHA512:
   131  		algo = dhSinglePass_stdDH_sha512kdf
   132  	}
   133  	return
   134  }
   135  
   136  // ASN.1 decode the ECIES parameters relevant to the encryption stage.
   137  func asnECIEStoParams(asnParams asnECIESParameters, params *ECIESParams) {
   138  	if !asnParams.KDF.Cmp(asnNISTConcatenationKDF) {
   139  		params = nil
   140  		return
   141  	} else if !asnParams.MAC.Cmp(hmacFull) {
   142  		params = nil
   143  		return
   144  	}
   145  
   146  	switch {
   147  	case asnParams.Sym.Cmp(aes128CTRinECIES):
   148  		params.KeyLen = 16
   149  		params.BlockSize = 16
   150  		params.Cipher = aes.NewCipher
   151  	case asnParams.Sym.Cmp(aes192CTRinECIES):
   152  		params.KeyLen = 24
   153  		params.BlockSize = 16
   154  		params.Cipher = aes.NewCipher
   155  	case asnParams.Sym.Cmp(aes256CTRinECIES):
   156  		params.KeyLen = 32
   157  		params.BlockSize = 16
   158  		params.Cipher = aes.NewCipher
   159  	default:
   160  		params = nil
   161  	}
   162  }
   163  
   164  // ASN.1 decode the ECIES parameters relevant to ECDH.
   165  func asnECDHtoParams(asnParams asnECDHAlgorithm, params *ECIESParams) {
   166  	if asnParams.Cmp(dhSinglePass_stdDH_sha224kdf) {
   167  		params.hashAlgo = crypto.SHA224
   168  		params.Hash = sha256.New224
   169  	} else if asnParams.Cmp(dhSinglePass_stdDH_sha256kdf) {
   170  		params.hashAlgo = crypto.SHA256
   171  		params.Hash = sha256.New
   172  	} else if asnParams.Cmp(dhSinglePass_stdDH_sha384kdf) {
   173  		params.hashAlgo = crypto.SHA384
   174  		params.Hash = sha512.New384
   175  	} else if asnParams.Cmp(dhSinglePass_stdDH_sha512kdf) {
   176  		params.hashAlgo = crypto.SHA512
   177  		params.Hash = sha512.New
   178  	} else {
   179  		params = nil
   180  	}
   181  }