Skip to content

Commit a2f2d18

Browse files
committed
Restructure a bit
1 parent 3f29c6a commit a2f2d18

File tree

17 files changed

+82
-101
lines changed

17 files changed

+82
-101
lines changed
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
# Keystore
22
Design principles:
3+
- Use structs for typed extensibility of the interfaces. Easy
4+
to wrap via a network layer if needed.
35
- Storage abstract. Keystore interfaces can be implemented with memory, file, database, etc. for storage to be useable in a variety of
46
contexts. Use write through caching to maintain synchronization between in memory keys and stored keys.
57
- Only the Admin interface mutates the keystore, all other interfaces
68
are read only.
79
- Client side key naming. Keystore itself doesn't impose certain key algorithims/curves be used for specific contexts, it just supports a the minimum viable set of algorithms/curves for chainlink wide use cases. Clients define a name for each key which represents
810
the context in which they wish to use it.
9-
- Common serialization/encryption for all storage types. Protobuf serialization (compact, versioned) for key material and then key material encrypted before persistence with a passphase.
11+
- Common serialization/encryption for all storage types. Protobuf serialization (compact, versioned) for key material and then key material encrypted before persistence with a passphase.
12+
13+
Notes
14+
- keystore/internal is copied from https://github.com/smartcontractkit/chainlink/blob/develop/core/services/keystore/internal/raw.go#L3. Intention is to switch to core to use this library at which point we can remove the core copy.
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,10 +116,10 @@ func (ks *keystore) CreateKeys(ctx context.Context, req CreateKeysRequest) (Crea
116116
createdAt: time.Now(),
117117
metadata: []byte{},
118118
}
119-
case Secp256k1:
119+
case EcdsaSecp256k1:
120120
privateKeyECDSA, err := ecdsa.GenerateKey(crypto.S256(), rand.Reader)
121121
if err != nil {
122-
return CreateKeysResponse{}, fmt.Errorf("failed to generate Secp256k1 key: %w", err)
122+
return CreateKeysResponse{}, fmt.Errorf("failed to generate EcdsaSecp256k1 key: %w", err)
123123
}
124124
ksCopy[keyReq.Name] = key{
125125
keyType: keyReq.KeyType,
Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,64 @@
1-
package keystore
1+
package keystore_test
22

33
import (
44
"context"
55
"testing"
66

7+
"github.com/smartcontractkit/chainlink-common/pkg/keystore"
78
"github.com/smartcontractkit/chainlink-common/pkg/keystore/storage"
89
"github.com/stretchr/testify/require"
910
)
1011

11-
func TestKeystore(t *testing.T) {
12+
func TestKeystore_AdminReader(t *testing.T) {
1213
storage := storage.NewMemoryStorage()
13-
ks, err := NewKeystore(storage, "test-password")
14+
ks, err := keystore.NewKeystore(storage, "test-password")
1415
require.NoError(t, err)
1516
ctx := context.Background()
1617

17-
req := CreateKeysRequest{
18-
Keys: []CreateKeyRequest{
19-
{Name: "test-ed25519", KeyType: Ed25519},
20-
{Name: "test-secp256k1", KeyType: Secp256k1},
21-
{Name: "test-x25519", KeyType: X25519},
18+
req := keystore.CreateKeysRequest{
19+
Keys: []keystore.CreateKeyRequest{
20+
{Name: "test-ed25519", KeyType: keystore.Ed25519},
21+
{Name: "test-secp256k1", KeyType: keystore.EcdsaSecp256k1},
22+
{Name: "test-x25519", KeyType: keystore.X25519},
2223
},
2324
}
2425

2526
resp, err := ks.CreateKeys(ctx, req)
2627
require.NoError(t, err)
2728
require.Len(t, resp.Keys, 3)
2829

29-
expectedTypes := []KeyType{Ed25519, Secp256k1, X25519}
30+
expectedTypes := []keystore.KeyType{keystore.Ed25519, keystore.EcdsaSecp256k1, keystore.X25519}
3031
for i, key := range resp.Keys {
3132
require.Equal(t, expectedTypes[i], key.KeyInfo.KeyType)
3233
require.Equal(t, req.Keys[i].Name, key.KeyInfo.Name)
3334
require.NotEmpty(t, key.KeyInfo.PublicKey, "Expected non-empty public key for %s", key.KeyInfo.Name)
3435
}
3536

36-
getReq := GetKeysRequest{
37+
getReq := keystore.GetKeysRequest{
3738
Names: []string{"test-ed25519", "test-secp256k1"},
3839
}
3940

4041
getResp, err := ks.GetKeys(ctx, getReq)
4142
require.NoError(t, err)
4243
require.Len(t, getResp.Keys, 2)
4344

44-
allKeysReq := GetKeysRequest{}
45+
allKeysReq := keystore.GetKeysRequest{}
4546
allKeysResp, err := ks.GetKeys(ctx, allKeysReq)
4647
require.NoError(t, err)
4748
require.Len(t, allKeysResp.Keys, 3)
4849

49-
deleteReq := DeleteKeysRequest{
50+
deleteReq := keystore.DeleteKeysRequest{
5051
Names: []string{"test-x25519"},
5152
}
5253

5354
_, err = ks.DeleteKeys(ctx, deleteReq)
5455
require.NoError(t, err)
5556

56-
deleteVerifyReq := GetKeysRequest{Names: []string{"test-x25519"}}
57+
deleteVerifyReq := keystore.GetKeysRequest{Names: []string{"test-x25519"}}
5758
_, err = ks.GetKeys(ctx, deleteVerifyReq)
5859
require.Error(t, err)
5960

60-
finalKeysReq := GetKeysRequest{}
61+
finalKeysReq := keystore.GetKeysRequest{}
6162
finalKeysResp, err := ks.GetKeys(ctx, finalKeysReq)
6263
require.NoError(t, err)
6364
require.Len(t, finalKeysResp.Keys, 2)
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66

77
const (
88
X25519 KeyType = "X25519"
9-
// TODO: Support P256
9+
// TODO: Support P256 for DKG.
1010
)
1111

1212
type EncryptRequest struct {
@@ -41,3 +41,5 @@ type Encryptor interface {
4141
Decrypt(ctx context.Context, req DecryptRequest) (DecryptResponse, error)
4242
DeriveSharedSecret(ctx context.Context, req DeriveSharedSecretRequest) (DeriveSharedSecretResponse, error)
4343
}
44+
45+
// TODO: Encryptor implementation.
File renamed without changes.
File renamed without changes.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ func (k key) publicKey() []byte {
4848
switch k.keyType {
4949
case Ed25519:
5050
return ed25519.PublicKey(internal.Bytes(k.privateKey))
51-
case Secp256k1:
51+
case EcdsaSecp256k1:
5252
privateKey, err := ecdsaPrivateKeyFromBytes(k.privateKey)
5353
if err != nil {
5454
panic(err)

0 commit comments

Comments
 (0)