|
|
|
@ -143,41 +143,36 @@ func (ks keyStorePassphrase) StoreKey(key *Key, auth string) (err error) { |
|
|
|
|
cipherText := make([]byte, len(toEncrypt)) |
|
|
|
|
AES128CBCEncrypter.CryptBlocks(cipherText, toEncrypt) |
|
|
|
|
|
|
|
|
|
paramsJSON := scryptParamsJSON{ |
|
|
|
|
N: scryptN, |
|
|
|
|
R: scryptr, |
|
|
|
|
P: scryptp, |
|
|
|
|
DkLen: scryptdkLen, |
|
|
|
|
SaltLen: 32, |
|
|
|
|
} |
|
|
|
|
mac := Sha3(derivedKey[16:32], cipherText) |
|
|
|
|
|
|
|
|
|
keyHeaderJSON := keyHeaderJSON{ |
|
|
|
|
Version: keyHeaderVersion, |
|
|
|
|
Kdf: keyHeaderKDF, |
|
|
|
|
KdfParams: paramsJSON, |
|
|
|
|
scryptParamsJSON := scryptParamsJSON{ |
|
|
|
|
N: scryptN, |
|
|
|
|
R: scryptr, |
|
|
|
|
P: scryptp, |
|
|
|
|
DkLen: scryptdkLen, |
|
|
|
|
Salt: hex.EncodeToString(salt), |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
keyHeaderJSONStr, err := json.Marshal(keyHeaderJSON) |
|
|
|
|
if err != nil { |
|
|
|
|
return err |
|
|
|
|
cipherParamsJSON := cipherparamsJSON{ |
|
|
|
|
IV: hex.EncodeToString(iv), |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
mac := Sha3(keyHeaderJSONStr, derivedKey[16:32], cipherText) |
|
|
|
|
|
|
|
|
|
cipherStruct := cipherJSON{ |
|
|
|
|
hex.EncodeToString(mac), |
|
|
|
|
hex.EncodeToString(salt), |
|
|
|
|
hex.EncodeToString(iv), |
|
|
|
|
keyHeaderJSON, |
|
|
|
|
hex.EncodeToString(cipherText), |
|
|
|
|
cryptoStruct := cryptoJSON{ |
|
|
|
|
Cipher: "aes-128-cbc", |
|
|
|
|
CipherText: hex.EncodeToString(cipherText), |
|
|
|
|
CipherParams: cipherParamsJSON, |
|
|
|
|
KDF: "scrypt", |
|
|
|
|
KDFParams: scryptParamsJSON, |
|
|
|
|
MAC: hex.EncodeToString(mac), |
|
|
|
|
Version: "1", |
|
|
|
|
} |
|
|
|
|
keyStruct := encryptedKeyJSON{ |
|
|
|
|
version, |
|
|
|
|
key.Id.String(), |
|
|
|
|
encryptedKeyJSON := encryptedKeyJSON{ |
|
|
|
|
hex.EncodeToString(key.Address[:]), |
|
|
|
|
cipherStruct, |
|
|
|
|
cryptoStruct, |
|
|
|
|
key.Id.String(), |
|
|
|
|
version, |
|
|
|
|
} |
|
|
|
|
keyJSON, err := json.Marshal(keyStruct) |
|
|
|
|
keyJSON, err := json.Marshal(encryptedKeyJSON) |
|
|
|
|
if err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
@ -212,33 +207,25 @@ func DecryptKey(ks keyStorePassphrase, keyAddr common.Address, auth string) (key |
|
|
|
|
return nil, nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
salt, err := hex.DecodeString(keyProtected.Crypto.Salt) |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
iv, err := hex.DecodeString(keyProtected.Crypto.IV) |
|
|
|
|
iv, err := hex.DecodeString(keyProtected.Crypto.CipherParams.IV) |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
keyHeader := keyProtected.Crypto.KeyHeader |
|
|
|
|
cipherText, err := hex.DecodeString(keyProtected.Crypto.CipherText) |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// used in MAC
|
|
|
|
|
keyHeaderJSONStr, err := json.Marshal(keyHeader) |
|
|
|
|
salt, err := hex.DecodeString(keyProtected.Crypto.KDFParams.Salt) |
|
|
|
|
if err != nil { |
|
|
|
|
return nil, nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// TODO: make this more generic when we support different KDF params / key versions
|
|
|
|
|
n := keyHeader.KdfParams.N |
|
|
|
|
r := keyHeader.KdfParams.R |
|
|
|
|
p := keyHeader.KdfParams.P |
|
|
|
|
dkLen := keyHeader.KdfParams.DkLen |
|
|
|
|
n := keyProtected.Crypto.KDFParams.N |
|
|
|
|
r := keyProtected.Crypto.KDFParams.R |
|
|
|
|
p := keyProtected.Crypto.KDFParams.P |
|
|
|
|
dkLen := keyProtected.Crypto.KDFParams.DkLen |
|
|
|
|
|
|
|
|
|
authArray := []byte(auth) |
|
|
|
|
derivedKey, err := scrypt.Key(authArray, salt, n, r, p, dkLen) |
|
|
|
@ -246,7 +233,7 @@ func DecryptKey(ks keyStorePassphrase, keyAddr common.Address, auth string) (key |
|
|
|
|
return nil, nil, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
calculatedMAC := Sha3(keyHeaderJSONStr, derivedKey[16:32], cipherText) |
|
|
|
|
calculatedMAC := Sha3(derivedKey[16:32], cipherText) |
|
|
|
|
if !bytes.Equal(calculatedMAC, mac) { |
|
|
|
|
err = errors.New("Decryption failed: MAC mismatch") |
|
|
|
|
return nil, nil, err |
|
|
|
|