Remove go-threads
This commit is contained in:
parent
20df88bbde
commit
d5a801cff5
3
go.mod
3
go.mod
@ -12,7 +12,6 @@ require (
|
|||||||
github.com/multiformats/go-multihash v0.0.15
|
github.com/multiformats/go-multihash v0.0.15
|
||||||
github.com/prometheus/common v0.18.0
|
github.com/prometheus/common v0.18.0
|
||||||
github.com/stretchr/testify v1.7.0
|
github.com/stretchr/testify v1.7.0
|
||||||
github.com/textileio/go-threads v1.0.2-0.20210304072541-d0f91da84404
|
|
||||||
go.uber.org/zap v1.21.0
|
go.uber.org/zap v1.21.0
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
)
|
)
|
||||||
@ -40,5 +39,3 @@ require (
|
|||||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect
|
golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect
|
||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6 // indirect
|
gopkg.in/alecthomas/kingpin.v2 v2.2.6 // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
replace github.com/textileio/go-threads => github.com/anytypeio/go-threads v1.1.0-rc1.0.20220223104843-a67245cee80e
|
|
||||||
|
|||||||
@ -1,10 +1,13 @@
|
|||||||
package account
|
package account
|
||||||
|
|
||||||
import "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys"
|
import (
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey"
|
||||||
|
)
|
||||||
|
|
||||||
type AccountData struct { // TODO: create a convenient constructor for this
|
type AccountData struct { // TODO: create a convenient constructor for this
|
||||||
Identity string // TODO: this is essentially the same as sign key
|
Identity string // TODO: this is essentially the same as sign key
|
||||||
SignKey keys.SigningPrivKey
|
SignKey signingkey.SigningPrivKey
|
||||||
EncKey keys.EncryptionPrivKey
|
EncKey encryptionkey.EncryptionPrivKey
|
||||||
Decoder keys.SigningPubKeyDecoder
|
Decoder signingkey.SigningPubKeyDecoder
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,8 +5,9 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/pb"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/pb"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey"
|
||||||
"github.com/textileio/go-threads/crypto/symmetric"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric"
|
||||||
"hash/fnv"
|
"hash/fnv"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -21,15 +22,15 @@ type ACLState struct {
|
|||||||
userReadKeys map[uint64]*symmetric.Key
|
userReadKeys map[uint64]*symmetric.Key
|
||||||
userStates map[string]*pb.ACLChangeUserState
|
userStates map[string]*pb.ACLChangeUserState
|
||||||
userInvites map[string]*pb.ACLChangeUserInvite
|
userInvites map[string]*pb.ACLChangeUserInvite
|
||||||
signingPubKeyDecoder keys.SigningPubKeyDecoder
|
signingPubKeyDecoder signingkey.SigningPubKeyDecoder
|
||||||
encryptionKey keys.EncryptionPrivKey
|
encryptionKey encryptionkey.EncryptionPrivKey
|
||||||
identity string
|
identity string
|
||||||
}
|
}
|
||||||
|
|
||||||
func newACLState(
|
func newACLState(
|
||||||
identity string,
|
identity string,
|
||||||
encryptionKey keys.EncryptionPrivKey,
|
encryptionKey encryptionkey.EncryptionPrivKey,
|
||||||
signingPubKeyDecoder keys.SigningPubKeyDecoder) *ACLState {
|
signingPubKeyDecoder signingkey.SigningPubKeyDecoder) *ACLState {
|
||||||
return &ACLState{
|
return &ACLState{
|
||||||
identity: identity,
|
identity: identity,
|
||||||
encryptionKey: encryptionKey,
|
encryptionKey: encryptionKey,
|
||||||
@ -43,8 +44,8 @@ func newACLState(
|
|||||||
func newACLStateFromSnapshotChange(
|
func newACLStateFromSnapshotChange(
|
||||||
snapshotChange *pb.ACLChange,
|
snapshotChange *pb.ACLChange,
|
||||||
identity string,
|
identity string,
|
||||||
encryptionKey keys.EncryptionPrivKey,
|
encryptionKey encryptionkey.EncryptionPrivKey,
|
||||||
signingPubKeyDecoder keys.SigningPubKeyDecoder) (*ACLState, error) {
|
signingPubKeyDecoder signingkey.SigningPubKeyDecoder) (*ACLState, error) {
|
||||||
st := &ACLState{
|
st := &ACLState{
|
||||||
identity: identity,
|
identity: identity,
|
||||||
encryptionKey: encryptionKey,
|
encryptionKey: encryptionKey,
|
||||||
|
|||||||
@ -4,15 +4,15 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/pb"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/pb"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey"
|
||||||
)
|
)
|
||||||
|
|
||||||
type aclStateBuilder struct {
|
type aclStateBuilder struct {
|
||||||
tree *Tree
|
tree *Tree
|
||||||
identity string
|
identity string
|
||||||
key keys.EncryptionPrivKey
|
key encryptionkey.EncryptionPrivKey
|
||||||
decoder keys.SigningPubKeyDecoder
|
decoder signingkey.SigningPubKeyDecoder
|
||||||
}
|
}
|
||||||
|
|
||||||
type decreasedPermissionsParameters struct {
|
type decreasedPermissionsParameters struct {
|
||||||
@ -20,7 +20,7 @@ type decreasedPermissionsParameters struct {
|
|||||||
startChange string
|
startChange string
|
||||||
}
|
}
|
||||||
|
|
||||||
func newACLStateBuilder(decoder keys.SigningPubKeyDecoder, accountData *account.AccountData) *aclStateBuilder {
|
func newACLStateBuilder(decoder signingkey.SigningPubKeyDecoder, accountData *account.AccountData) *aclStateBuilder {
|
||||||
return &aclStateBuilder{
|
return &aclStateBuilder{
|
||||||
decoder: decoder,
|
decoder: decoder,
|
||||||
identity: accountData.Identity,
|
identity: accountData.Identity,
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import (
|
|||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/pb"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/pb"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/treestoragebuilder"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/treestoragebuilder"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
@ -26,7 +26,7 @@ func TestACLTree_UserJoinBuild(t *testing.T) {
|
|||||||
Identity: keychain.GetIdentity("A"),
|
Identity: keychain.GetIdentity("A"),
|
||||||
SignKey: keychain.SigningKeys["A"],
|
SignKey: keychain.SigningKeys["A"],
|
||||||
EncKey: keychain.EncryptionKeys["A"],
|
EncKey: keychain.EncryptionKeys["A"],
|
||||||
Decoder: keys.NewEd25519Decoder(),
|
Decoder: signingkey.NewEd25519Decoder(),
|
||||||
}
|
}
|
||||||
listener := &mockListener{}
|
listener := &mockListener{}
|
||||||
tree, err := BuildACLTree(thr, accountData, listener)
|
tree, err := BuildACLTree(thr, accountData, listener)
|
||||||
@ -61,7 +61,7 @@ func TestACLTree_UserJoinUpdate_Append(t *testing.T) {
|
|||||||
Identity: keychain.GetIdentity("A"),
|
Identity: keychain.GetIdentity("A"),
|
||||||
SignKey: keychain.SigningKeys["A"],
|
SignKey: keychain.SigningKeys["A"],
|
||||||
EncKey: keychain.EncryptionKeys["A"],
|
EncKey: keychain.EncryptionKeys["A"],
|
||||||
Decoder: keys.NewEd25519Decoder(),
|
Decoder: signingkey.NewEd25519Decoder(),
|
||||||
}
|
}
|
||||||
listener := &mockListener{}
|
listener := &mockListener{}
|
||||||
tree, err := BuildACLTree(thr, accountData, listener)
|
tree, err := BuildACLTree(thr, accountData, listener)
|
||||||
@ -111,7 +111,7 @@ func TestACLTree_UserJoinUpdate_Rebuild(t *testing.T) {
|
|||||||
Identity: keychain.GetIdentity("A"),
|
Identity: keychain.GetIdentity("A"),
|
||||||
SignKey: keychain.SigningKeys["A"],
|
SignKey: keychain.SigningKeys["A"],
|
||||||
EncKey: keychain.EncryptionKeys["A"],
|
EncKey: keychain.EncryptionKeys["A"],
|
||||||
Decoder: keys.NewEd25519Decoder(),
|
Decoder: signingkey.NewEd25519Decoder(),
|
||||||
}
|
}
|
||||||
listener := &mockListener{}
|
listener := &mockListener{}
|
||||||
tree, err := BuildACLTree(thr, accountData, listener)
|
tree, err := BuildACLTree(thr, accountData, listener)
|
||||||
@ -162,7 +162,7 @@ func TestACLTree_UserRemoveBuild(t *testing.T) {
|
|||||||
Identity: keychain.GetIdentity("A"),
|
Identity: keychain.GetIdentity("A"),
|
||||||
SignKey: keychain.SigningKeys["A"],
|
SignKey: keychain.SigningKeys["A"],
|
||||||
EncKey: keychain.EncryptionKeys["A"],
|
EncKey: keychain.EncryptionKeys["A"],
|
||||||
Decoder: keys.NewEd25519Decoder(),
|
Decoder: signingkey.NewEd25519Decoder(),
|
||||||
}
|
}
|
||||||
listener := &mockListener{}
|
listener := &mockListener{}
|
||||||
tree, err := BuildACLTree(thr, accountData, listener)
|
tree, err := BuildACLTree(thr, accountData, listener)
|
||||||
@ -193,7 +193,7 @@ func TestACLTree_UserRemoveBeforeBuild(t *testing.T) {
|
|||||||
Identity: keychain.GetIdentity("A"),
|
Identity: keychain.GetIdentity("A"),
|
||||||
SignKey: keychain.SigningKeys["A"],
|
SignKey: keychain.SigningKeys["A"],
|
||||||
EncKey: keychain.EncryptionKeys["A"],
|
EncKey: keychain.EncryptionKeys["A"],
|
||||||
Decoder: keys.NewEd25519Decoder(),
|
Decoder: signingkey.NewEd25519Decoder(),
|
||||||
}
|
}
|
||||||
listener := &mockListener{}
|
listener := &mockListener{}
|
||||||
tree, err := BuildACLTree(thr, accountData, listener)
|
tree, err := BuildACLTree(thr, accountData, listener)
|
||||||
@ -225,7 +225,7 @@ func TestACLTree_InvalidSnapshotBuild(t *testing.T) {
|
|||||||
Identity: keychain.GetIdentity("A"),
|
Identity: keychain.GetIdentity("A"),
|
||||||
SignKey: keychain.SigningKeys["A"],
|
SignKey: keychain.SigningKeys["A"],
|
||||||
EncKey: keychain.EncryptionKeys["A"],
|
EncKey: keychain.EncryptionKeys["A"],
|
||||||
Decoder: keys.NewEd25519Decoder(),
|
Decoder: signingkey.NewEd25519Decoder(),
|
||||||
}
|
}
|
||||||
listener := &mockListener{}
|
listener := &mockListener{}
|
||||||
tree, err := BuildACLTree(thr, accountData, listener)
|
tree, err := BuildACLTree(thr, accountData, listener)
|
||||||
@ -256,7 +256,7 @@ func TestACLTree_ValidSnapshotBuild(t *testing.T) {
|
|||||||
Identity: keychain.GetIdentity("A"),
|
Identity: keychain.GetIdentity("A"),
|
||||||
SignKey: keychain.SigningKeys["A"],
|
SignKey: keychain.SigningKeys["A"],
|
||||||
EncKey: keychain.EncryptionKeys["A"],
|
EncKey: keychain.EncryptionKeys["A"],
|
||||||
Decoder: keys.NewEd25519Decoder(),
|
Decoder: signingkey.NewEd25519Decoder(),
|
||||||
}
|
}
|
||||||
listener := &mockListener{}
|
listener := &mockListener{}
|
||||||
tree, err := BuildACLTree(thr, accountData, listener)
|
tree, err := BuildACLTree(thr, accountData, listener)
|
||||||
|
|||||||
@ -3,22 +3,22 @@ package acltree
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey"
|
||||||
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice"
|
||||||
)
|
)
|
||||||
|
|
||||||
type aclTreeBuilder struct {
|
type aclTreeBuilder struct {
|
||||||
cache map[string]*Change
|
cache map[string]*Change
|
||||||
identityKeys map[string]keys.SigningPubKey
|
identityKeys map[string]signingkey.SigningPubKey
|
||||||
signingPubKeyDecoder keys.SigningPubKeyDecoder
|
signingPubKeyDecoder signingkey.SigningPubKeyDecoder
|
||||||
tree *Tree
|
tree *Tree
|
||||||
treeStorage treestorage.TreeStorage
|
treeStorage treestorage.TreeStorage
|
||||||
|
|
||||||
*changeLoader
|
*changeLoader
|
||||||
}
|
}
|
||||||
|
|
||||||
func newACLTreeBuilder(t treestorage.TreeStorage, decoder keys.SigningPubKeyDecoder) *aclTreeBuilder {
|
func newACLTreeBuilder(t treestorage.TreeStorage, decoder signingkey.SigningPubKeyDecoder) *aclTreeBuilder {
|
||||||
return &aclTreeBuilder{
|
return &aclTreeBuilder{
|
||||||
signingPubKeyDecoder: decoder,
|
signingPubKeyDecoder: decoder,
|
||||||
treeStorage: t,
|
treeStorage: t,
|
||||||
@ -31,7 +31,7 @@ func newACLTreeBuilder(t treestorage.TreeStorage, decoder keys.SigningPubKeyDeco
|
|||||||
|
|
||||||
func (tb *aclTreeBuilder) Init() {
|
func (tb *aclTreeBuilder) Init() {
|
||||||
tb.cache = make(map[string]*Change)
|
tb.cache = make(map[string]*Change)
|
||||||
tb.identityKeys = make(map[string]keys.SigningPubKey)
|
tb.identityKeys = make(map[string]signingkey.SigningPubKey)
|
||||||
tb.tree = &Tree{}
|
tb.tree = &Tree{}
|
||||||
tb.changeLoader.Init(tb.cache, tb.identityKeys)
|
tb.changeLoader.Init(tb.cache, tb.identityKeys)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,7 @@ package acltree
|
|||||||
import (
|
import (
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey"
|
||||||
)
|
)
|
||||||
|
|
||||||
func BuildTreeStorageWithACL(
|
func BuildTreeStorageWithACL(
|
||||||
@ -12,7 +12,7 @@ func BuildTreeStorageWithACL(
|
|||||||
create func(change *treestorage.RawChange) (treestorage.TreeStorage, error)) (treestorage.TreeStorage, error) {
|
create func(change *treestorage.RawChange) (treestorage.TreeStorage, error)) (treestorage.TreeStorage, error) {
|
||||||
bld := newChangeBuilder()
|
bld := newChangeBuilder()
|
||||||
bld.Init(
|
bld.Init(
|
||||||
newACLState(acc.Identity, acc.EncKey, keys.NewEd25519Decoder()),
|
newACLState(acc.Identity, acc.EncKey, signingkey.NewEd25519Decoder()),
|
||||||
&Tree{},
|
&Tree{},
|
||||||
acc)
|
acc)
|
||||||
err := build(bld)
|
err := build(bld)
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import (
|
|||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage"
|
||||||
"github.com/gogo/protobuf/proto"
|
"github.com/gogo/protobuf/proto"
|
||||||
|
|
||||||
"github.com/textileio/go-threads/crypto/symmetric"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ChangeContent struct {
|
type ChangeContent struct {
|
||||||
|
|||||||
@ -4,9 +4,9 @@ import (
|
|||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/pb"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/pb"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/cid"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric"
|
||||||
"github.com/gogo/protobuf/proto"
|
"github.com/gogo/protobuf/proto"
|
||||||
"github.com/textileio/go-threads/crypto/symmetric"
|
|
||||||
"hash/fnv"
|
"hash/fnv"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@ -14,7 +14,7 @@ import (
|
|||||||
type MarshalledChange = []byte
|
type MarshalledChange = []byte
|
||||||
|
|
||||||
type ACLChangeBuilder interface {
|
type ACLChangeBuilder interface {
|
||||||
UserAdd(identity string, encryptionKey keys.EncryptionPubKey, permissions pb.ACLChangeUserPermissions) error
|
UserAdd(identity string, encryptionKey encryptionkey.EncryptionPubKey, permissions pb.ACLChangeUserPermissions) error
|
||||||
AddId(id string) // TODO: this is only for testing
|
AddId(id string) // TODO: this is only for testing
|
||||||
SetMakeSnapshot(bool) // TODO: who should decide this? probably ACLTree so we can delete it
|
SetMakeSnapshot(bool) // TODO: who should decide this? probably ACLTree so we can delete it
|
||||||
}
|
}
|
||||||
@ -68,7 +68,7 @@ func (c *changeBuilder) SetMakeSnapshot(b bool) {
|
|||||||
c.makeSnapshot = b
|
c.makeSnapshot = b
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *changeBuilder) UserAdd(identity string, encryptionKey keys.EncryptionPubKey, permissions pb.ACLChangeUserPermissions) error {
|
func (c *changeBuilder) UserAdd(identity string, encryptionKey encryptionkey.EncryptionPubKey, permissions pb.ACLChangeUserPermissions) error {
|
||||||
var allKeys []*symmetric.Key
|
var allKeys []*symmetric.Key
|
||||||
if c.aclState.currentReadKeyHash != 0 {
|
if c.aclState.currentReadKeyHash != 0 {
|
||||||
for _, key := range c.aclState.userReadKeys {
|
for _, key := range c.aclState.userReadKeys {
|
||||||
|
|||||||
@ -5,23 +5,23 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/pb"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/pb"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys"
|
|
||||||
"github.com/gogo/protobuf/proto"
|
"github.com/gogo/protobuf/proto"
|
||||||
)
|
)
|
||||||
|
|
||||||
type changeLoader struct {
|
type changeLoader struct {
|
||||||
cache map[string]*Change
|
cache map[string]*Change
|
||||||
identityKeys map[string]keys.SigningPubKey
|
identityKeys map[string]signingkey.SigningPubKey
|
||||||
signingPubKeyDecoder keys.SigningPubKeyDecoder
|
signingPubKeyDecoder signingkey.SigningPubKeyDecoder
|
||||||
treeStorage treestorage.TreeStorage
|
treeStorage treestorage.TreeStorage
|
||||||
changeCreator func(id string, ch *pb.ACLChange) *Change
|
changeCreator func(id string, ch *pb.ACLChange) *Change
|
||||||
}
|
}
|
||||||
|
|
||||||
func newChangeLoader(
|
func newChangeLoader(
|
||||||
treeStorage treestorage.TreeStorage,
|
treeStorage treestorage.TreeStorage,
|
||||||
signingPubKeyDecoder keys.SigningPubKeyDecoder,
|
signingPubKeyDecoder signingkey.SigningPubKeyDecoder,
|
||||||
changeCreator func(id string, ch *pb.ACLChange) *Change) *changeLoader {
|
changeCreator func(id string, ch *pb.ACLChange) *Change) *changeLoader {
|
||||||
return &changeLoader{
|
return &changeLoader{
|
||||||
signingPubKeyDecoder: signingPubKeyDecoder,
|
signingPubKeyDecoder: signingPubKeyDecoder,
|
||||||
@ -31,7 +31,7 @@ func newChangeLoader(
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *changeLoader) Init(cache map[string]*Change,
|
func (c *changeLoader) Init(cache map[string]*Change,
|
||||||
identityKeys map[string]keys.SigningPubKey) {
|
identityKeys map[string]signingkey.SigningPubKey) {
|
||||||
c.cache = cache
|
c.cache = cache
|
||||||
c.identityKeys = identityKeys
|
c.identityKeys = identityKeys
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,20 +3,20 @@ package acltree
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey"
|
||||||
)
|
)
|
||||||
|
|
||||||
type snapshotValidator struct {
|
type snapshotValidator struct {
|
||||||
aclTree *Tree
|
aclTree *Tree
|
||||||
identity string
|
identity string
|
||||||
key keys.EncryptionPrivKey
|
key encryptionkey.EncryptionPrivKey
|
||||||
decoder keys.SigningPubKeyDecoder
|
decoder signingkey.SigningPubKeyDecoder
|
||||||
stateBuilder *aclStateBuilder
|
stateBuilder *aclStateBuilder
|
||||||
}
|
}
|
||||||
|
|
||||||
func newSnapshotValidator(
|
func newSnapshotValidator(
|
||||||
decoder keys.SigningPubKeyDecoder,
|
decoder signingkey.SigningPubKeyDecoder,
|
||||||
accountData *account.AccountData) *snapshotValidator {
|
accountData *account.AccountData) *snapshotValidator {
|
||||||
return &snapshotValidator{
|
return &snapshotValidator{
|
||||||
identity: accountData.Identity,
|
identity: accountData.Identity,
|
||||||
|
|||||||
@ -4,8 +4,8 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey"
|
||||||
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys"
|
|
||||||
//"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/lib/logging"
|
//"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/lib/logging"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice"
|
||||||
"github.com/prometheus/common/log"
|
"github.com/prometheus/common/log"
|
||||||
@ -18,15 +18,15 @@ var (
|
|||||||
|
|
||||||
type treeBuilder struct {
|
type treeBuilder struct {
|
||||||
cache map[string]*Change
|
cache map[string]*Change
|
||||||
identityKeys map[string]keys.SigningPubKey
|
identityKeys map[string]signingkey.SigningPubKey
|
||||||
signingPubKeyDecoder keys.SigningPubKeyDecoder
|
signingPubKeyDecoder signingkey.SigningPubKeyDecoder
|
||||||
tree *Tree
|
tree *Tree
|
||||||
treeStorage treestorage.TreeStorage
|
treeStorage treestorage.TreeStorage
|
||||||
|
|
||||||
*changeLoader
|
*changeLoader
|
||||||
}
|
}
|
||||||
|
|
||||||
func newTreeBuilder(t treestorage.TreeStorage, decoder keys.SigningPubKeyDecoder) *treeBuilder {
|
func newTreeBuilder(t treestorage.TreeStorage, decoder signingkey.SigningPubKeyDecoder) *treeBuilder {
|
||||||
return &treeBuilder{
|
return &treeBuilder{
|
||||||
signingPubKeyDecoder: decoder,
|
signingPubKeyDecoder: decoder,
|
||||||
treeStorage: t,
|
treeStorage: t,
|
||||||
@ -39,7 +39,7 @@ func newTreeBuilder(t treestorage.TreeStorage, decoder keys.SigningPubKeyDecoder
|
|||||||
|
|
||||||
func (tb *treeBuilder) Init() {
|
func (tb *treeBuilder) Init() {
|
||||||
tb.cache = make(map[string]*Change)
|
tb.cache = make(map[string]*Change)
|
||||||
tb.identityKeys = make(map[string]keys.SigningPubKey)
|
tb.identityKeys = make(map[string]signingkey.SigningPubKey)
|
||||||
tb.tree = &Tree{}
|
tb.tree = &Tree{}
|
||||||
tb.changeLoader.Init(tb.cache, tb.identityKeys)
|
tb.changeLoader.Init(tb.cache, tb.identityKeys)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import (
|
|||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/account"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/treestoragebuilder"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/treestoragebuilder"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
@ -17,7 +17,7 @@ func TestDocument_NewPlainTextDocument(t *testing.T) {
|
|||||||
Identity: keychain.GetIdentity("A"),
|
Identity: keychain.GetIdentity("A"),
|
||||||
SignKey: keychain.SigningKeys["A"],
|
SignKey: keychain.SigningKeys["A"],
|
||||||
EncKey: keychain.EncryptionKeys["A"],
|
EncKey: keychain.EncryptionKeys["A"],
|
||||||
Decoder: keys.NewEd25519Decoder(),
|
Decoder: signingkey.NewEd25519Decoder(),
|
||||||
}
|
}
|
||||||
|
|
||||||
doc, err := NewPlainTextDocument(data, treestorage.NewInMemoryTreeStorage, "Some text")
|
doc, err := NewPlainTextDocument(data, treestorage.NewInMemoryTreeStorage, "Some text")
|
||||||
@ -35,7 +35,7 @@ func TestDocument_PlainTextDocument_AddText(t *testing.T) {
|
|||||||
Identity: keychain.GetIdentity("A"),
|
Identity: keychain.GetIdentity("A"),
|
||||||
SignKey: keychain.SigningKeys["A"],
|
SignKey: keychain.SigningKeys["A"],
|
||||||
EncKey: keychain.EncryptionKeys["A"],
|
EncKey: keychain.EncryptionKeys["A"],
|
||||||
Decoder: keys.NewEd25519Decoder(),
|
Decoder: signingkey.NewEd25519Decoder(),
|
||||||
}
|
}
|
||||||
|
|
||||||
doc, err := NewPlainTextDocument(data, treestorage.NewInMemoryTreeStorage, "Some text")
|
doc, err := NewPlainTextDocument(data, treestorage.NewInMemoryTreeStorage, "Some text")
|
||||||
|
|||||||
@ -1,12 +1,12 @@
|
|||||||
package treestoragebuilder
|
package treestoragebuilder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey"
|
||||||
"hash/fnv"
|
"hash/fnv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/symmetric"
|
||||||
|
|
||||||
"github.com/textileio/go-threads/crypto/symmetric"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type SymKey struct {
|
type SymKey struct {
|
||||||
@ -15,24 +15,24 @@ type SymKey struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Keychain struct {
|
type Keychain struct {
|
||||||
SigningKeys map[string]keys.SigningPrivKey
|
SigningKeys map[string]signingkey.SigningPrivKey
|
||||||
SigningKeysByIdentity map[string]keys.SigningPrivKey
|
SigningKeysByIdentity map[string]signingkey.SigningPrivKey
|
||||||
EncryptionKeys map[string]keys.EncryptionPrivKey
|
EncryptionKeys map[string]encryptionkey.EncryptionPrivKey
|
||||||
ReadKeys map[string]*SymKey
|
ReadKeys map[string]*SymKey
|
||||||
ReadKeysByHash map[uint64]*SymKey
|
ReadKeysByHash map[uint64]*SymKey
|
||||||
GeneratedIdentities map[string]string
|
GeneratedIdentities map[string]string
|
||||||
coder keys.SigningPubKeyDecoder
|
coder signingkey.SigningPubKeyDecoder
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewKeychain() *Keychain {
|
func NewKeychain() *Keychain {
|
||||||
return &Keychain{
|
return &Keychain{
|
||||||
SigningKeys: map[string]keys.SigningPrivKey{},
|
SigningKeys: map[string]signingkey.SigningPrivKey{},
|
||||||
SigningKeysByIdentity: map[string]keys.SigningPrivKey{},
|
SigningKeysByIdentity: map[string]signingkey.SigningPrivKey{},
|
||||||
EncryptionKeys: map[string]keys.EncryptionPrivKey{},
|
EncryptionKeys: map[string]encryptionkey.EncryptionPrivKey{},
|
||||||
GeneratedIdentities: map[string]string{},
|
GeneratedIdentities: map[string]string{},
|
||||||
ReadKeys: map[string]*SymKey{},
|
ReadKeys: map[string]*SymKey{},
|
||||||
ReadKeysByHash: map[uint64]*SymKey{},
|
ReadKeysByHash: map[uint64]*SymKey{},
|
||||||
coder: keys.NewEd25519Decoder(),
|
coder: signingkey.NewEd25519Decoder(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,7 +54,7 @@ func (k *Keychain) AddEncryptionKey(name string) {
|
|||||||
if _, exists := k.EncryptionKeys[name]; exists {
|
if _, exists := k.EncryptionKeys[name]; exists {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
newPrivKey, _, err := keys.GenerateRandomRSAKeyPair(2048)
|
newPrivKey, _, err := encryptionkey.GenerateRandomRSAKeyPair(2048)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
@ -66,7 +66,7 @@ func (k *Keychain) AddSigningKey(name string) {
|
|||||||
if _, exists := k.SigningKeys[name]; exists {
|
if _, exists := k.SigningKeys[name]; exists {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
newPrivKey, pubKey, err := keys.GenerateRandomEd25519KeyPair()
|
newPrivKey, pubKey, err := signingkey.GenerateRandomEd25519KeyPair()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,14 +9,14 @@ import (
|
|||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/yamltests"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/yamltests"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage"
|
||||||
storagepb "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/pb"
|
storagepb "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/pb"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/slice"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"path"
|
"path"
|
||||||
|
|
||||||
"github.com/gogo/protobuf/proto"
|
"github.com/gogo/protobuf/proto"
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const plainTextDocType uint16 = 1
|
const plainTextDocType uint16 = 1
|
||||||
@ -25,7 +25,7 @@ type treeChange struct {
|
|||||||
*pb.ACLChange
|
*pb.ACLChange
|
||||||
id string
|
id string
|
||||||
readKey *SymKey
|
readKey *SymKey
|
||||||
signKey keys.SigningPrivKey
|
signKey signingkey.SigningPrivKey
|
||||||
|
|
||||||
changesDataDecrypted []byte
|
changesDataDecrypted []byte
|
||||||
}
|
}
|
||||||
@ -297,7 +297,7 @@ func (t *TreeStorageBuilder) parseACLSnapshot(s *ACLSnapshot) *pb.ACLChangeACLSn
|
|||||||
aclUserState.Identity = t.keychain.GetIdentity(state.Identity)
|
aclUserState.Identity = t.keychain.GetIdentity(state.Identity)
|
||||||
|
|
||||||
encKey := t.keychain.
|
encKey := t.keychain.
|
||||||
GetKey(state.EncryptionKey).(keys.EncryptionPrivKey)
|
GetKey(state.EncryptionKey).(encryptionkey.EncryptionPrivKey)
|
||||||
rawKey, _ := encKey.GetPublic().Raw()
|
rawKey, _ := encKey.GetPublic().Raw()
|
||||||
aclUserState.EncryptionKey = rawKey
|
aclUserState.EncryptionKey = rawKey
|
||||||
|
|
||||||
@ -334,7 +334,7 @@ func (t *TreeStorageBuilder) parseACLChange(ch *ACLChange) (convCh *pb.ACLChange
|
|||||||
add := ch.UserAdd
|
add := ch.UserAdd
|
||||||
|
|
||||||
encKey := t.keychain.
|
encKey := t.keychain.
|
||||||
GetKey(add.EncryptionKey).(keys.EncryptionPrivKey)
|
GetKey(add.EncryptionKey).(encryptionkey.EncryptionPrivKey)
|
||||||
rawKey, _ := encKey.GetPublic().Raw()
|
rawKey, _ := encKey.GetPublic().Raw()
|
||||||
|
|
||||||
convCh = &pb.ACLChangeACLContentValue{
|
convCh = &pb.ACLChangeACLContentValue{
|
||||||
@ -351,11 +351,11 @@ func (t *TreeStorageBuilder) parseACLChange(ch *ACLChange) (convCh *pb.ACLChange
|
|||||||
join := ch.UserJoin
|
join := ch.UserJoin
|
||||||
|
|
||||||
encKey := t.keychain.
|
encKey := t.keychain.
|
||||||
GetKey(join.EncryptionKey).(keys.EncryptionPrivKey)
|
GetKey(join.EncryptionKey).(encryptionkey.EncryptionPrivKey)
|
||||||
rawKey, _ := encKey.GetPublic().Raw()
|
rawKey, _ := encKey.GetPublic().Raw()
|
||||||
|
|
||||||
idKey, _ := t.keychain.SigningKeys[join.Identity].GetPublic().Raw()
|
idKey, _ := t.keychain.SigningKeys[join.Identity].GetPublic().Raw()
|
||||||
signKey := t.keychain.GetKey(join.AcceptSignature).(keys.SigningPrivKey)
|
signKey := t.keychain.GetKey(join.AcceptSignature).(signingkey.SigningPrivKey)
|
||||||
signature, err := signKey.Sign(idKey)
|
signature, err := signKey.Sign(idKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
@ -374,9 +374,9 @@ func (t *TreeStorageBuilder) parseACLChange(ch *ACLChange) (convCh *pb.ACLChange
|
|||||||
}
|
}
|
||||||
case ch.UserInvite != nil:
|
case ch.UserInvite != nil:
|
||||||
invite := ch.UserInvite
|
invite := ch.UserInvite
|
||||||
rawAcceptKey, _ := t.keychain.GetKey(invite.AcceptKey).(keys.SigningPrivKey).GetPublic().Raw()
|
rawAcceptKey, _ := t.keychain.GetKey(invite.AcceptKey).(signingkey.SigningPrivKey).GetPublic().Raw()
|
||||||
encKey := t.keychain.
|
encKey := t.keychain.
|
||||||
GetKey(invite.EncryptionKey).(keys.EncryptionPrivKey)
|
GetKey(invite.EncryptionKey).(encryptionkey.EncryptionPrivKey)
|
||||||
rawEncKey, _ := encKey.GetPublic().Raw()
|
rawEncKey, _ := encKey.GetPublic().Raw()
|
||||||
|
|
||||||
convCh = &pb.ACLChangeACLContentValue{
|
convCh = &pb.ACLChangeACLContentValue{
|
||||||
@ -449,7 +449,7 @@ func (t *TreeStorageBuilder) parseACLChange(ch *ACLChange) (convCh *pb.ACLChange
|
|||||||
return convCh
|
return convCh
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TreeStorageBuilder) encryptReadKeys(keys []string, encKey keys.EncryptionPrivKey) (enc [][]byte) {
|
func (t *TreeStorageBuilder) encryptReadKeys(keys []string, encKey encryptionkey.EncryptionPrivKey) (enc [][]byte) {
|
||||||
for _, k := range keys {
|
for _, k := range keys {
|
||||||
realKey := t.keychain.GetKey(k).(*SymKey).Key.Bytes()
|
realKey := t.keychain.GetKey(k).(*SymKey).Key.Bytes()
|
||||||
res, err := encKey.GetPublic().Encrypt(realKey)
|
res, err := encKey.GetPublic().Encrypt(realKey)
|
||||||
|
|||||||
@ -1,14 +1,16 @@
|
|||||||
package keys
|
package encryptionkey
|
||||||
|
|
||||||
|
import "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys"
|
||||||
|
|
||||||
type EncryptionPrivKey interface {
|
type EncryptionPrivKey interface {
|
||||||
Key
|
keys.Key
|
||||||
|
|
||||||
Decrypt([]byte) ([]byte, error)
|
Decrypt([]byte) ([]byte, error)
|
||||||
GetPublic() EncryptionPubKey
|
GetPublic() EncryptionPubKey
|
||||||
}
|
}
|
||||||
|
|
||||||
type EncryptionPubKey interface {
|
type EncryptionPubKey interface {
|
||||||
Key
|
keys.Key
|
||||||
|
|
||||||
Encrypt(data []byte) ([]byte, error)
|
Encrypt(data []byte) ([]byte, error)
|
||||||
}
|
}
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package keys
|
package encryptionkey
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
@ -7,6 +7,7 @@ import (
|
|||||||
"crypto/subtle"
|
"crypto/subtle"
|
||||||
"crypto/x509"
|
"crypto/x509"
|
||||||
"errors"
|
"errors"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys"
|
||||||
"io"
|
"io"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -22,7 +23,7 @@ type EncryptionRsaPubKey struct {
|
|||||||
pubKey rsa.PublicKey
|
pubKey rsa.PublicKey
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *EncryptionRsaPubKey) Equals(key Key) bool {
|
func (e *EncryptionRsaPubKey) Equals(key keys.Key) bool {
|
||||||
other, ok := (key).(*EncryptionRsaPubKey)
|
other, ok := (key).(*EncryptionRsaPubKey)
|
||||||
if !ok {
|
if !ok {
|
||||||
return keyEquals(e, key)
|
return keyEquals(e, key)
|
||||||
@ -40,7 +41,7 @@ func (e *EncryptionRsaPubKey) Encrypt(data []byte) ([]byte, error) {
|
|||||||
return rsa.EncryptOAEP(hash, rand.Reader, &e.pubKey, data, nil)
|
return rsa.EncryptOAEP(hash, rand.Reader, &e.pubKey, data, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *EncryptionRsaPrivKey) Equals(key Key) bool {
|
func (e *EncryptionRsaPrivKey) Equals(key keys.Key) bool {
|
||||||
other, ok := (key).(*EncryptionRsaPrivKey)
|
other, ok := (key).(*EncryptionRsaPrivKey)
|
||||||
if !ok {
|
if !ok {
|
||||||
return keyEquals(e, key)
|
return keyEquals(e, key)
|
||||||
@ -106,7 +107,7 @@ func NewEncryptionRsaPubKeyFromBytes(bytes []byte) (EncryptionPubKey, error) {
|
|||||||
return &EncryptionRsaPubKey{pubKey: *pk}, nil
|
return &EncryptionRsaPubKey{pubKey: *pk}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func keyEquals(k1, k2 Key) bool {
|
func keyEquals(k1, k2 keys.Key) bool {
|
||||||
a, err := k1.Raw()
|
a, err := k1.Raw()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false
|
return false
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package keys
|
package signingkey
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
@ -7,6 +7,7 @@ import (
|
|||||||
"crypto/subtle"
|
"crypto/subtle"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/strkey"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/strkey"
|
||||||
@ -63,10 +64,10 @@ func (k *Ed25519PrivateKey) pubKeyBytes() []byte {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Equals compares two ed25519 private keys.
|
// Equals compares two ed25519 private keys.
|
||||||
func (k *Ed25519PrivateKey) Equals(o Key) bool {
|
func (k *Ed25519PrivateKey) Equals(o keys.Key) bool {
|
||||||
edk, ok := o.(*Ed25519PrivateKey)
|
edk, ok := o.(*Ed25519PrivateKey)
|
||||||
if !ok {
|
if !ok {
|
||||||
return keyEquals(k, o)
|
return keys.KeyEquals(k, o)
|
||||||
}
|
}
|
||||||
|
|
||||||
return subtle.ConstantTimeCompare(k.k, edk.k) == 1
|
return subtle.ConstantTimeCompare(k.k, edk.k) == 1
|
||||||
@ -88,10 +89,10 @@ func (k *Ed25519PublicKey) Raw() ([]byte, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Equals compares two ed25519 public keys.
|
// Equals compares two ed25519 public keys.
|
||||||
func (k *Ed25519PublicKey) Equals(o Key) bool {
|
func (k *Ed25519PublicKey) Equals(o keys.Key) bool {
|
||||||
edk, ok := o.(*Ed25519PublicKey)
|
edk, ok := o.(*Ed25519PublicKey)
|
||||||
if !ok {
|
if !ok {
|
||||||
return keyEquals(k, o)
|
return keys.KeyEquals(k, o)
|
||||||
}
|
}
|
||||||
|
|
||||||
return bytes.Equal(k.k, edk.k)
|
return bytes.Equal(k.k, edk.k)
|
||||||
@ -1,7 +1,9 @@
|
|||||||
package keys
|
package signingkey
|
||||||
|
|
||||||
|
import "github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys"
|
||||||
|
|
||||||
type SigningPrivKey interface {
|
type SigningPrivKey interface {
|
||||||
Key
|
keys.Key
|
||||||
|
|
||||||
Sign([]byte) ([]byte, error)
|
Sign([]byte) ([]byte, error)
|
||||||
|
|
||||||
@ -9,7 +11,7 @@ type SigningPrivKey interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type SigningPubKey interface {
|
type SigningPubKey interface {
|
||||||
Key
|
keys.Key
|
||||||
|
|
||||||
Verify(data []byte, sig []byte) (bool, error)
|
Verify(data []byte, sig []byte) (bool, error)
|
||||||
}
|
}
|
||||||
@ -1,7 +1,21 @@
|
|||||||
package keys
|
package keys
|
||||||
|
|
||||||
|
import "crypto/subtle"
|
||||||
|
|
||||||
type Key interface {
|
type Key interface {
|
||||||
Equals(Key) bool
|
Equals(Key) bool
|
||||||
|
|
||||||
Raw() ([]byte, error)
|
Raw() ([]byte, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func KeyEquals(k1, k2 Key) bool {
|
||||||
|
a, err := k1.Raw()
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
b, err := k2.Raw()
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return subtle.ConstantTimeCompare(a, b) == 1
|
||||||
|
}
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
package keys
|
package symmetric
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/aes"
|
"crypto/aes"
|
||||||
@ -17,17 +17,11 @@ const (
|
|||||||
KeyBytes = 32
|
KeyBytes = 32
|
||||||
)
|
)
|
||||||
|
|
||||||
// Key is a wrapper for a symmetric key.
|
type Key struct {
|
||||||
type key struct {
|
|
||||||
raw []byte
|
raw []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
func (k *key) Equals(k2 Key) bool {
|
func (k *Key) Equals(otherKey *Key) bool {
|
||||||
otherKey, ok := k2.(*key)
|
|
||||||
if !ok {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
otherRaw := otherKey.raw
|
otherRaw := otherKey.raw
|
||||||
keyRaw := k.raw
|
keyRaw := k.raw
|
||||||
|
|
||||||
@ -43,21 +37,21 @@ func (k *key) Equals(k2 Key) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (k *key) Raw() ([]byte, error) {
|
func (k *Key) Raw() ([]byte, error) {
|
||||||
return k.raw, nil
|
return k.raw, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewRandom returns a random key.
|
// NewRandom returns a random key.
|
||||||
func NewRandom() (Key, error) {
|
func NewRandom() (*Key, error) {
|
||||||
raw := make([]byte, KeyBytes)
|
raw := make([]byte, KeyBytes)
|
||||||
if _, err := rand.Read(raw); err != nil {
|
if _, err := rand.Read(raw); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &key{raw: raw}, nil
|
return &Key{raw: raw}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// New returns Key if err is nil and panics otherwise.
|
// New returns Key if err is nil and panics otherwise.
|
||||||
func New() Key {
|
func New() *Key {
|
||||||
k, err := NewRandom()
|
k, err := NewRandom()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
@ -66,15 +60,15 @@ func New() Key {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// FromBytes returns a key by decoding bytes.
|
// FromBytes returns a key by decoding bytes.
|
||||||
func FromBytes(k []byte) (Key, error) {
|
func FromBytes(k []byte) (*Key, error) {
|
||||||
if len(k) != KeyBytes {
|
if len(k) != KeyBytes {
|
||||||
return nil, fmt.Errorf("invalid key")
|
return nil, fmt.Errorf("invalid key")
|
||||||
}
|
}
|
||||||
return &key{raw: k}, nil
|
return &Key{raw: k}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// FromString returns a key by decoding a base32-encoded string.
|
// FromString returns a key by decoding a base32-encoded string.
|
||||||
func FromString(k string) (Key, error) {
|
func FromString(k string) (*Key, error) {
|
||||||
_, b, err := mbase.Decode(k)
|
_, b, err := mbase.Decode(k)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -83,17 +77,17 @@ func FromString(k string) (Key, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Bytes returns raw key bytes.
|
// Bytes returns raw key bytes.
|
||||||
func (k *key) Bytes() []byte {
|
func (k *Key) Bytes() []byte {
|
||||||
return k.raw
|
return k.raw
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalBinary implements BinaryMarshaler.
|
// MarshalBinary implements BinaryMarshaler.
|
||||||
func (k *key) MarshalBinary() ([]byte, error) {
|
func (k *Key) MarshalBinary() ([]byte, error) {
|
||||||
return k.raw, nil
|
return k.raw, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// String returns the base32-encoded string representation of raw key bytes.
|
// String returns the base32-encoded string representation of raw key bytes.
|
||||||
func (k *key) String() string {
|
func (k *Key) String() string {
|
||||||
str, err := mbase.Encode(mbase.Base32, k.raw)
|
str, err := mbase.Encode(mbase.Base32, k.raw)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic("should not error with hardcoded mbase: " + err.Error())
|
panic("should not error with hardcoded mbase: " + err.Error())
|
||||||
@ -102,7 +96,7 @@ func (k *key) String() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Encrypt performs AES-256 GCM encryption on plaintext.
|
// Encrypt performs AES-256 GCM encryption on plaintext.
|
||||||
func (k *key) Encrypt(plaintext []byte) ([]byte, error) {
|
func (k *Key) Encrypt(plaintext []byte) ([]byte, error) {
|
||||||
block, err := aes.NewCipher(k.raw[:KeyBytes])
|
block, err := aes.NewCipher(k.raw[:KeyBytes])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -121,7 +115,7 @@ func (k *key) Encrypt(plaintext []byte) ([]byte, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Decrypt uses key to perform AES-256 GCM decryption on ciphertext.
|
// Decrypt uses key to perform AES-256 GCM decryption on ciphertext.
|
||||||
func (k *key) Decrypt(ciphertext []byte) ([]byte, error) {
|
func (k *Key) Decrypt(ciphertext []byte) ([]byte, error) {
|
||||||
block, err := aes.NewCipher(k.raw[:KeyBytes])
|
block, err := aes.NewCipher(k.raw[:KeyBytes])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
Loading…
x
Reference in New Issue
Block a user