소스 검색

Address pull request comments

* Use crypto.Sign instead of directly calling secp256k1 lib
* Rename UserAccount to Account and Addr to Address (for consistency)
* Change AccountManager.Sign to take ptr to Account instead of
  address byte array
* Simplify copying of Accounts in Accounts()
* PubkeyToAddress and GetEntropyCSPRNG now exported
Gustav Simonsson 10 년 전
부모
커밋
8d9752a557
5개의 변경된 파일21개의 추가작업 그리고 27개의 파일을 삭제
  1. 12 16
      accounts/account_manager.go
  2. 2 3
      accounts/accounts_test.go
  3. 3 4
      crypto/crypto.go
  4. 1 1
      crypto/key.go
  5. 3 3
      crypto/key_store_passphrase.go

+ 12 - 16
accounts/account_manager.go

@@ -35,12 +35,11 @@ package accounts
 import (
 	crand "crypto/rand"
 	"github.com/ethereum/go-ethereum/crypto"
-	"github.com/ethereum/go-ethereum/crypto/secp256k1"
 )
 
 // TODO: better name for this struct?
-type UserAccount struct {
-	Addr []byte
+type Account struct {
+	Address []byte
 }
 
 type AccountManager struct {
@@ -57,43 +56,40 @@ func NewAccountManager(keyStore crypto.KeyStore2) AccountManager {
 	return *am
 }
 
-func (am *AccountManager) Sign(fromAddr []byte, keyAuth string, toSign []byte) (signature []byte, err error) {
-	key, err := am.keyStore.GetKey(fromAddr, keyAuth)
+func (am *AccountManager) Sign(fromAccount *Account, keyAuth string, toSign []byte) (signature []byte, err error) {
+	key, err := am.keyStore.GetKey(fromAccount.Address, keyAuth)
 	if err != nil {
 		return nil, err
 	}
-	privKey := crypto.FromECDSA(key.PrivateKey)
-	// TODO: what is second value?
-	signature, err = secp256k1.Sign(toSign, privKey)
+	signature, err = crypto.Sign(toSign, key.PrivateKey)
 	return signature, err
 }
 
-func (am AccountManager) NewAccount(auth string) (*UserAccount, error) {
+func (am AccountManager) NewAccount(auth string) (*Account, error) {
 	key, err := am.keyStore.GenerateNewKey(crand.Reader, auth)
 	if err != nil {
 		return nil, err
 	}
-	ua := &UserAccount{
-		Addr: key.Address,
+	ua := &Account{
+		Address: key.Address,
 	}
 	return ua, err
 }
 
 // set of accounts == set of keys in given key store
 // TODO: do we need persistence of accounts as well?
-func (am *AccountManager) Accounts() ([]UserAccount, error) {
+func (am *AccountManager) Accounts() ([]Account, error) {
 	addresses, err := am.keyStore.GetKeyAddresses()
 	if err != nil {
 		return nil, err
 	}
 
-	accounts := make([]UserAccount, len(addresses))
+	accounts := make([]Account, len(addresses))
 
 	for i, addr := range addresses {
-		ua := &UserAccount{
-			Addr: addr,
+		accounts[i] = Account{
+			Address: addr,
 		}
-		accounts[i] = *ua
 	}
 	return accounts, err
 }

+ 2 - 3
accounts/accounts_test.go

@@ -10,9 +10,8 @@ func TestAccountManager(t *testing.T) {
 	am := NewAccountManager(ks)
 	pass := "" // not used but required by API
 	a1, err := am.NewAccount(pass)
-	toSign := make([]byte, 4, 4)
-	toSign = []byte{0, 1, 2, 3}
-	_, err = am.Sign(a1.Addr, pass, toSign)
+	toSign := crypto.GetEntropyCSPRNG(32)
+	_, err = am.Sign(a1, pass, toSign)
 	if err != nil {
 		t.Fatal(err)
 	}

+ 3 - 4
crypto/crypto.go

@@ -133,8 +133,7 @@ func ImportPreSaleKey(keyStore KeyStore2, keyJSON []byte, password string) (*Key
 	if err != nil {
 		return nil, err
 	}
-	id := uuid.NewRandom()
-	key.Id = id
+	key.Id = uuid.NewRandom()
 	err = keyStore.StoreKey(key, password)
 	return key, err
 }
@@ -167,7 +166,7 @@ func decryptPreSaleKey(fileContent []byte, password string) (key *Key, err error
 	ecKey := ToECDSA(ethPriv)
 	key = &Key{
 		Id:         nil,
-		Address:    pubkeyToAddress(ecKey.PublicKey),
+		Address:    PubkeyToAddress(ecKey.PublicKey),
 		PrivateKey: ecKey,
 	}
 	derivedAddr := ethutil.Bytes2Hex(key.Address)
@@ -225,7 +224,7 @@ func PKCS7Unpad(in []byte) []byte {
 	return in[:len(in)-int(padding)]
 }
 
-func pubkeyToAddress(p ecdsa.PublicKey) []byte {
+func PubkeyToAddress(p ecdsa.PublicKey) []byte {
 	pubBytes := FromECDSAPub(&p)
 	return Sha3(pubBytes[1:])[12:]
 }

+ 1 - 1
crypto/key.go

@@ -102,7 +102,7 @@ func NewKey(rand io.Reader) *Key {
 	id := uuid.NewRandom()
 	key := &Key{
 		Id:         id,
-		Address:    pubkeyToAddress(privateKeyECDSA.PublicKey),
+		Address:    PubkeyToAddress(privateKeyECDSA.PublicKey),
 		PrivateKey: privateKeyECDSA,
 	}
 	return key

+ 3 - 3
crypto/key_store_passphrase.go

@@ -116,7 +116,7 @@ func (ks keyStorePassphrase) GetKeyAddresses() (addresses [][]byte, err error) {
 
 func (ks keyStorePassphrase) StoreKey(key *Key, auth string) (err error) {
 	authArray := []byte(auth)
-	salt := getEntropyCSPRNG(32)
+	salt := GetEntropyCSPRNG(32)
 	derivedKey, err := scrypt.Key(authArray, salt, scryptN, scryptr, scryptp, scryptdkLen)
 	if err != nil {
 		return err
@@ -131,7 +131,7 @@ func (ks keyStorePassphrase) StoreKey(key *Key, auth string) (err error) {
 		return err
 	}
 
-	iv := getEntropyCSPRNG(aes.BlockSize) // 16
+	iv := GetEntropyCSPRNG(aes.BlockSize) // 16
 	AES256CBCEncrypter := cipher.NewCBCEncrypter(AES256Block, iv)
 	cipherText := make([]byte, len(toEncrypt))
 	AES256CBCEncrypter.CryptBlocks(cipherText, toEncrypt)
@@ -197,7 +197,7 @@ func DecryptKey(ks keyStorePassphrase, keyAddr []byte, auth string) (keyBytes []
 	return keyBytes, keyId, err
 }
 
-func getEntropyCSPRNG(n int) []byte {
+func GetEntropyCSPRNG(n int) []byte {
 	mainBuff := make([]byte, n)
 	_, err := io.ReadFull(crand.Reader, mainBuff)
 	if err != nil {