Add KeyStorage

This commit is contained in:
mcrakhman 2023-03-25 14:06:20 +01:00 committed by Mikhail Iudin
parent 3778465e3b
commit 52f462ff2c
No known key found for this signature in database
GPG Key ID: FAAAA8BAABDFF1C0
4 changed files with 57 additions and 5 deletions

View File

@ -37,7 +37,7 @@ func defaultObjectTreeDeps(
rootChange *treechangeproto.RawTreeChangeWithId, rootChange *treechangeproto.RawTreeChangeWithId,
treeStorage treestorage.TreeStorage, treeStorage treestorage.TreeStorage,
aclList list.AclList) objectTreeDeps { aclList list.AclList) objectTreeDeps {
changeBuilder := NewChangeBuilder(aclList.KeyStorage(), rootChange) changeBuilder := NewChangeBuilder(crypto.NewKeyStorage(), rootChange)
treeBuilder := newTreeBuilder(treeStorage, changeBuilder) treeBuilder := newTreeBuilder(treeStorage, changeBuilder)
return objectTreeDeps{ return objectTreeDeps{
changeBuilder: changeBuilder, changeBuilder: changeBuilder,
@ -170,7 +170,7 @@ func createObjectTreeRoot(
Seed: seed, Seed: seed,
} }
_, root, err = NewChangeBuilder(aclList.KeyStorage(), nil).BuildRoot(cnt) _, root, err = NewChangeBuilder(crypto.NewKeyStorage(), nil).BuildRoot(cnt)
return return
} }

View File

@ -7,9 +7,10 @@ import (
) )
func Test_EncryptDecrypt(t *testing.T) { func Test_EncryptDecrypt(t *testing.T) {
privKey, pubKey, _ := GenerateEd25519Key(rand.Reader) privKey, pubKey, err := GenerateEd25519Key(rand.Reader)
require.NoError(t, err)
msg := make([]byte, 32768) msg := make([]byte, 32768)
_, err := rand.Read(msg) _, err = rand.Read(msg)
require.NoError(t, err) require.NoError(t, err)
enc, err := pubKey.Encrypt(msg) enc, err := pubKey.Encrypt(msg)
require.NoError(t, err) require.NoError(t, err)

View File

@ -1,9 +1,39 @@
package crypto package crypto
import "bytes"
type KeyStorage interface { type KeyStorage interface {
PubKeyFromProto(protoBytes []byte) (PubKey, error) PubKeyFromProto(protoBytes []byte) (PubKey, error)
} }
func NewKeyStorage() KeyStorage { func NewKeyStorage() KeyStorage {
return nil return &keyStorage{}
}
type pubKeyEntry struct {
protoKey []byte
key PubKey
}
type keyStorage struct {
keys []pubKeyEntry
}
func (k *keyStorage) PubKeyFromProto(protoBytes []byte) (PubKey, error) {
for _, k := range k.keys {
// it is not guaranteed that proto will always marshal to the same bytes (but in our case it probably will)
// but this shouldn't be the problem, because we will just create another copy
if bytes.Equal(protoBytes, k.protoKey) {
return k.key, nil
}
}
key, err := UnmarshalEd25519PublicKeyProto(protoBytes)
if err != nil {
return nil, err
}
k.keys = append(k.keys, pubKeyEntry{
protoKey: protoBytes,
key: key,
})
return key, nil
} }

View File

@ -0,0 +1,21 @@
package crypto
import (
"crypto/rand"
"github.com/stretchr/testify/require"
"testing"
)
func TestKeyStorage_PubKeyFromProto(t *testing.T) {
st := NewKeyStorage().(*keyStorage)
_, pubKey, err := GenerateEd25519Key(rand.Reader)
require.NoError(t, err)
for i := 0; i < 100; i++ {
marshalled, err := pubKey.Marshall()
require.NoError(t, err)
pk, err := st.PubKeyFromProto(marshalled)
require.NoError(t, err)
require.Equal(t, pk.Storage(), pubKey.Storage())
}
require.Equal(t, 1, len(st.keys))
}