Skip to content

Commit

Permalink
keystore helper functions for keys and more tests
Browse files Browse the repository at this point in the history
  • Loading branch information
QuestofIranon committed Jan 13, 2020
1 parent b8419a4 commit cdfc67f
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 2 deletions.
34 changes: 34 additions & 0 deletions crypto.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import (
"fmt"
"golang.org/x/crypto/ed25519"
"golang.org/x/crypto/pbkdf2"
"io"
"io/ioutil"
"strings"

"github.com/hashgraph/hedera-sdk-go/proto"
Expand Down Expand Up @@ -108,6 +110,19 @@ func Ed25519PrivateKeyFromString(s string) (Ed25519PrivateKey, error) {
return Ed25519PrivateKey{}, fmt.Errorf("invalid private key with length %v", len(s))
}

func Ed25519PrivateKeyFromKeystore(ks []byte, passphrase string) (Ed25519PrivateKey, error) {
return parseKeystore(ks, passphrase)
}

func Ed25519PrivateKeyReadKeystore(source io.Reader, passphrase string) (Ed25519PrivateKey, error) {
keystoreBytes, err := ioutil.ReadAll(source)
if err != nil {
return Ed25519PrivateKey{}, fmt.Errorf("failed to read keystore from provided source")
}

return Ed25519PrivateKeyFromKeystore(keystoreBytes, passphrase)
}

func Ed25519PublicKeyFromString(s string) (Ed25519PublicKey, error) {
switch len(s) {
case 64: // raw public key
Expand Down Expand Up @@ -188,6 +203,25 @@ func (sk Ed25519PrivateKey) Bytes() []byte {
return sk.keyData
}

func (sk Ed25519PrivateKey) Keystore(passphrase string) ([]byte, error) {
return newKeystore(sk.keyData, passphrase)
}

func (sk Ed25519PrivateKey) WriteKeystore(destination io.Writer, passphrase string) error {
keystore, err := sk.Keystore(passphrase)
if err != nil {
return err
}

_, err = destination.Write(keystore)

if err != nil {
return fmt.Errorf("could not write keystore to destination")
}

return nil
}

func (pk Ed25519PublicKey) Bytes() []byte {
return pk.keyData
}
Expand Down
37 changes: 37 additions & 0 deletions crypto_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package hedera

import (
"bytes"
"crypto/ed25519"
"strings"
"testing"
Expand Down Expand Up @@ -140,3 +141,39 @@ func TestGeneratedMnemonicToWorkingPrivateKey(t *testing.T) {

assert.True(t, ed25519.Verify(privateKey.publicKey.Bytes(), message, signature))
}

func TestEd25519PrivateKeyFromKeystore(t *testing.T) {
privatekey, err := Ed25519PrivateKeyFromKeystore([]byte(testKeystore), passphrase)
assert.NoError(t, err)

actualPrivateKey, err := Ed25519PrivateKeyFromString(testKeystoreKeyString)
assert.NoError(t, err)

assert.Equal(t, actualPrivateKey.keyData, privatekey.keyData)
}

func TestEd25519PrivateKey_Keystore(t *testing.T) {
privateKey, err := Ed25519PrivateKeyFromString(testPrivateKeyStr)
assert.NoError(t, err)

keystore, err := privateKey.Keystore(passphrase)
assert.NoError(t, err)

ksPrivateKey, err := parseKeystore(keystore, passphrase)
assert.NoError(t, err)

assert.Equal(t, privateKey.keyData, ksPrivateKey.keyData)
}

func TestEd25519PrivateKey_ReadKeystore(t *testing.T) {
actualPrivateKey, err := Ed25519PrivateKeyFromString(testKeystoreKeyString)
assert.NoError(t, err)

keystoreReader := bytes.NewReader([]byte(testKeystore))

privateKey, err := Ed25519PrivateKeyReadKeystore(keystoreReader, passphrase)
assert.NoError(t, err)

assert.Equal(t, actualPrivateKey.keyData, privateKey.keyData)
}

2 changes: 1 addition & 1 deletion keystore.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ func randomBytes(n uint) ([]byte, error) {
return b, nil
}

func NewKeystore(privateKey []byte, passphrase string) ([]byte, error) {
func newKeystore(privateKey []byte, passphrase string) ([]byte, error) {
salt, err := randomBytes(saltLen)
if err != nil {
return nil, fmt.Errorf("could not generate salt bytes")
Expand Down
2 changes: 1 addition & 1 deletion keystore_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ func TestEncryptAndDecryptKeyStore(t *testing.T) {
privateKey, err := Ed25519PrivateKeyFromString(testPrivateKeyStr)
assert.NoError(t, err)

keyStore, err := NewKeystore(privateKey.Bytes(), passphrase)
keyStore, err := newKeystore(privateKey.Bytes(), passphrase)
assert.NoError(t, err)

ksPrivateKey, err := parseKeystore(keyStore, passphrase)
Expand Down

0 comments on commit cdfc67f

Please sign in to comment.