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 }