Skip to content

Commit 6498ff3

Browse files
authored
[ARCH-337] Core keystore impl for backwards compatibility (#1686)
1 parent 72fe2e1 commit 6498ff3

File tree

3 files changed

+109
-3
lines changed

3 files changed

+109
-3
lines changed

keystore/core_keystore.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package keystore
2+
3+
import (
4+
"context"
5+
)
6+
7+
// CoreKeystore implements the core.Keystore interface for backwards compatibility with the old keystore
8+
// https://github.com/smartcontractkit/chainlink-common/blob/main/pkg/types/core/keystore.go#L23
9+
// We don't add a dependency directly to chainlink-common here to avoid circular dependencies.
10+
type CoreKeystore struct {
11+
ks Keystore
12+
}
13+
14+
func NewCoreKeystore(ks Keystore) *CoreKeystore {
15+
return &CoreKeystore{ks: ks}
16+
}
17+
18+
func (c *CoreKeystore) Accounts(ctx context.Context) ([]string, error) {
19+
// List all the keys in the keystore.
20+
keys, err := c.ks.GetKeys(ctx, GetKeysRequest{})
21+
if err != nil {
22+
return nil, err
23+
}
24+
accounts := make([]string, 0, len(keys.Keys))
25+
for _, key := range keys.Keys {
26+
accounts = append(accounts, key.KeyInfo.Name)
27+
}
28+
return accounts, nil
29+
}
30+
31+
func (c *CoreKeystore) Sign(ctx context.Context, account string, data []byte) ([]byte, error) {
32+
resp, err := c.ks.Sign(ctx, SignRequest{
33+
KeyName: account,
34+
Data: data,
35+
})
36+
if err != nil {
37+
return nil, err
38+
}
39+
return resp.Signature, nil
40+
}
41+
42+
func (c *CoreKeystore) Decrypt(ctx context.Context, account string, data []byte) ([]byte, error) {
43+
resp, err := c.ks.Decrypt(ctx, DecryptRequest{
44+
KeyName: account,
45+
EncryptedData: data,
46+
})
47+
if err != nil {
48+
return nil, err
49+
}
50+
return resp.Data, nil
51+
}

keystore/core_keystore_test.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package keystore_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/ethereum/go-ethereum/crypto"
7+
"github.com/stretchr/testify/require"
8+
9+
"github.com/smartcontractkit/chainlink-common/keystore"
10+
)
11+
12+
func TestCoreKeystore(t *testing.T) {
13+
ctx := t.Context()
14+
15+
ks, err := keystore.LoadKeystore(t.Context(), keystore.NewMemoryStorage(), "test-password", keystore.WithScryptParams(keystore.FastScryptParams))
16+
require.NoError(t, err)
17+
coreKs := keystore.NewCoreKeystore(ks)
18+
19+
keysResp, err := ks.CreateKeys(ctx, keystore.CreateKeysRequest{
20+
Keys: []keystore.CreateKeyRequest{
21+
{KeyName: "encrypt", KeyType: keystore.X25519},
22+
{KeyName: "sign", KeyType: keystore.ECDSA_S256},
23+
},
24+
})
25+
require.NoError(t, err)
26+
require.Equal(t, 2, len(keysResp.Keys))
27+
28+
accounts, err := coreKs.Accounts(ctx)
29+
require.NoError(t, err)
30+
require.Equal(t, []string{"encrypt", "sign"}, accounts)
31+
32+
signature, err := coreKs.Sign(ctx, "sign", crypto.Keccak256([]byte("test-data-to-sign")))
33+
require.NoError(t, err)
34+
require.NotEmpty(t, signature)
35+
verifyResp, err := ks.Verify(ctx, keystore.VerifyRequest{
36+
KeyType: keysResp.Keys[1].KeyInfo.KeyType,
37+
PublicKey: keysResp.Keys[1].KeyInfo.PublicKey,
38+
Data: crypto.Keccak256([]byte("test-data-to-sign")),
39+
Signature: signature,
40+
})
41+
require.NoError(t, err)
42+
require.True(t, verifyResp.Valid)
43+
44+
encryptedData, err := ks.Encrypt(ctx, keystore.EncryptRequest{
45+
RemoteKeyType: keysResp.Keys[0].KeyInfo.KeyType,
46+
RemotePubKey: keysResp.Keys[0].KeyInfo.PublicKey,
47+
Data: []byte("test-data-to-encrypt"),
48+
})
49+
require.NoError(t, err)
50+
require.NotEmpty(t, encryptedData)
51+
52+
decryptedData, err := coreKs.Decrypt(ctx, "encrypt", encryptedData.EncryptedData)
53+
require.NoError(t, err)
54+
require.Equal(t, []byte("test-data-to-encrypt"), decryptedData)
55+
}

keystore/keystore.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,17 @@ const (
5252
// ECDH_P256:
5353
// - ECDH on P-256
5454
// - Encryption with AES-GCM and HKDF-SHA256
55-
ECDH_P256 KeyType = "ecdh-p256"
55+
ECDH_P256 KeyType = "ECDH_P256"
5656

5757
// Digital signature key types.
5858
// Ed25519:
5959
// - Ed25519 for digital signatures.
6060
// - Supports arbitrary messages sizes, no hashing required.
61-
Ed25519 KeyType = "ed25519"
61+
Ed25519 KeyType = "Ed25519"
6262
// ECDSA_S256:
6363
// - ECDSA on secp256k1 for digital signatures.
6464
// - Only signs 32 byte digests. Caller must hash the data before signing.
65-
ECDSA_S256 KeyType = "ecdsa-secp256k1"
65+
ECDSA_S256 KeyType = "ECDSA_S256"
6666
)
6767

6868
var AllKeyTypes = []KeyType{X25519, ECDH_P256, Ed25519, ECDSA_S256}

0 commit comments

Comments
 (0)