forked from cerc-io/plugeth
Update key store to new spec but keep address field for now
* Also fix address types post-rebase
This commit is contained in:
parent
fe9e95a3fd
commit
2c1b0ff17e
@ -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")
|
||||||
|
Loading…
Reference in New Issue
Block a user