Update key store to new spec but keep address field for now

* Also fix address types post-rebase
This commit is contained in:
Gustav Simonsson 2015-05-10 20:30:02 +02:00
parent fe9e95a3fd
commit 2c1b0ff17e
7 changed files with 60 additions and 73 deletions

@ -126,7 +126,7 @@ func (js *jsre) pendingTransactions(call otto.FunctionCall) otto.Value {
// Add the accouns to a new set // Add the accouns to a new set
accountSet := set.New() accountSet := set.New()
for _, account := range accounts { for _, account := range accounts {
accountSet.Add(common.BytesToAddress(account.Address)) accountSet.Add(account.Address)
} }
//ltxs := make([]*tx, len(txs)) //ltxs := make([]*tx, len(txs))

@ -185,7 +185,7 @@ func ImportBlockTestKey(privKeyBytes []byte) error {
ecKey := ToECDSA(privKeyBytes) ecKey := ToECDSA(privKeyBytes)
key := &Key{ key := &Key{
Id: uuid.NewRandom(), Id: uuid.NewRandom(),
Address: PubkeyToAddress(ecKey.PublicKey), Address: common.BytesToAddress(PubkeyToAddress(ecKey.PublicKey)),
PrivateKey: ecKey, PrivateKey: ecKey,
} }
err := ks.StoreKey(key, "") err := ks.StoreKey(key, "")

@ -48,47 +48,47 @@ type Key struct {
} }
type plainKeyJSON struct { type plainKeyJSON struct {
Version string Address string `json:"address"`
Id string PrivateKey string `json:"privatekey"`
Address string Id string `json:"id"`
PrivateKey string Version string `json:"version"`
} }
type encryptedKeyJSON struct { type encryptedKeyJSON struct {
Version string Address string `json:"address"`
Id string Crypto cryptoJSON
Address string Id string `json:"id"`
Crypto cipherJSON Version string `json:"version"`
} }
type cipherJSON struct { type cryptoJSON struct {
MAC string Cipher string `json:"cipher"`
Salt string CipherText string `json:"ciphertext"`
IV string CipherParams cipherparamsJSON `json:"cipherparams"`
KeyHeader keyHeaderJSON KDF string `json:"kdf"`
CipherText string KDFParams scryptParamsJSON `json:"kdfparams"`
MAC string `json:"mac"`
Version string `json:"version"`
} }
type keyHeaderJSON struct { type cipherparamsJSON struct {
Version string IV string `json:"iv"`
Kdf string
KdfParams scryptParamsJSON
} }
type scryptParamsJSON struct { type scryptParamsJSON struct {
N int N int `json:"n"`
R int R int `json:"r"`
P int P int `json:"p"`
DkLen int DkLen int `json:"dklen"`
SaltLen int Salt string `json:"salt"`
} }
func (k *Key) MarshalJSON() (j []byte, err error) { func (k *Key) MarshalJSON() (j []byte, err error) {
jStruct := plainKeyJSON{ jStruct := plainKeyJSON{
version,
k.Id.String(),
hex.EncodeToString(k.Address[:]), hex.EncodeToString(k.Address[:]),
hex.EncodeToString(FromECDSA(k.PrivateKey)), hex.EncodeToString(FromECDSA(k.PrivateKey)),
k.Id.String(),
version,
} }
j, err = json.Marshal(jStruct) j, err = json.Marshal(jStruct)
return j, err return j, err

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

@ -474,7 +474,7 @@ func gasprice(price *big.Int, pct int64) *big.Int {
func accountAddressesSet(accounts []accounts.Account) *set.Set { func accountAddressesSet(accounts []accounts.Account) *set.Set {
accountSet := set.New() accountSet := set.New()
for _, account := range accounts { for _, account := range accounts {
accountSet.Add(common.BytesToAddress(account.Address)) accountSet.Add(account.Address)
} }
return accountSet return accountSet
} }

@ -113,7 +113,7 @@ func (t *BlockTest) InsertPreState(ethereum *eth.Ethereum) (*state.StateDB, erro
if acct.PrivateKey != "" { if acct.PrivateKey != "" {
privkey, err := hex.DecodeString(strings.TrimPrefix(acct.PrivateKey, "0x")) privkey, err := hex.DecodeString(strings.TrimPrefix(acct.PrivateKey, "0x"))
err = crypto.ImportBlockTestKey(privkey) err = crypto.ImportBlockTestKey(privkey)
err = ethereum.AccountManager().TimedUnlock(addr, "", 999999*time.Second) err = ethereum.AccountManager().TimedUnlock(common.BytesToAddress(addr), "", 999999*time.Second)
if err != nil { if err != nil {
return nil, err return nil, err
} }

@ -817,7 +817,7 @@ func (self *XEth) ConfirmTransaction(tx string) bool {
} }
func (self *XEth) doSign(from common.Address, hash common.Hash, didUnlock bool) ([]byte, error) { func (self *XEth) doSign(from common.Address, hash common.Hash, didUnlock bool) ([]byte, error) {
sig, err := self.backend.AccountManager().Sign(accounts.Account{Address: from.Bytes()}, hash.Bytes()) sig, err := self.backend.AccountManager().Sign(accounts.Account{Address: from}, hash.Bytes())
if err == accounts.ErrLocked { if err == accounts.ErrLocked {
if didUnlock { if didUnlock {
return nil, fmt.Errorf("signer account still locked after successful unlock") return nil, fmt.Errorf("signer account still locked after successful unlock")