diff --git a/pkg/anonymity/qb/adapters/adapter.go b/pkg/anonymity/qb/adapters/adapter.go
index d4e4fdcd..acc787db 100644
--- a/pkg/anonymity/qb/adapters/adapter.go
+++ b/pkg/anonymity/qb/adapters/adapter.go
@@ -3,7 +3,7 @@ package adapters
import (
"context"
- "github.com/number571/go-peer/pkg/message/layer1"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/layer1"
)
var (
diff --git a/pkg/anonymity/qb/adapters/adapters_test.go b/pkg/anonymity/qb/adapters/adapters_test.go
index 0edaa102..1c330633 100644
--- a/pkg/anonymity/qb/adapters/adapters_test.go
+++ b/pkg/anonymity/qb/adapters/adapters_test.go
@@ -5,7 +5,7 @@ import (
"context"
"testing"
- "github.com/number571/go-peer/pkg/message/layer1"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/layer1"
"github.com/number571/go-peer/pkg/payload"
)
diff --git a/pkg/anonymity/qb/adapters/types.go b/pkg/anonymity/qb/adapters/types.go
index 617f98e5..f33bf491 100644
--- a/pkg/anonymity/qb/adapters/types.go
+++ b/pkg/anonymity/qb/adapters/types.go
@@ -3,7 +3,7 @@ package adapters
import (
"context"
- "github.com/number571/go-peer/pkg/message/layer1"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/layer1"
)
type IAdapter interface {
diff --git a/pkg/anonymity/qb/anonymity.go b/pkg/anonymity/qb/anonymity.go
index 26bfb10c..48d0e2c9 100644
--- a/pkg/anonymity/qb/anonymity.go
+++ b/pkg/anonymity/qb/anonymity.go
@@ -11,10 +11,9 @@ import (
"github.com/number571/go-peer/pkg/anonymity/qb/queue"
"github.com/number571/go-peer/pkg/crypto/hashing"
"github.com/number571/go-peer/pkg/crypto/hybrid"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/layer1"
"github.com/number571/go-peer/pkg/crypto/random"
"github.com/number571/go-peer/pkg/logger"
- "github.com/number571/go-peer/pkg/message/layer1"
- "github.com/number571/go-peer/pkg/message/layer2"
"github.com/number571/go-peer/pkg/payload"
"github.com/number571/go-peer/pkg/state"
"github.com/number571/go-peer/pkg/storage/database"
@@ -234,7 +233,7 @@ func (p *sNode) consumeMessage(pCtx context.Context, pNetMsg layer1.IMessage) er
// check network message on correct format
if ok := p.checkMessageLayer1(pNetMsg); !ok {
- // another network mask || message settings
+ // another network mask || message settings on adapter's side
p.fLogger.PushWarn(logBuilder.WithType(anon_logger.CLogWarnIncorrectLayer1))
return ErrInvalidLayer1Message
}
@@ -242,11 +241,10 @@ func (p *sNode) consumeMessage(pCtx context.Context, pNetMsg layer1.IMessage) er
scheme := p.fQBProcessor.GetScheme()
encMsg := pNetMsg.GetPayload().GetBody()
- // load encrypted message without decryption try
- if _, err := layer2.LoadMessage(scheme.GetMessageSize(), encMsg); err != nil {
- // problem from sender's side (invalid structure)
+ // check size on static payload structure.
+ if uint64(len(encMsg)) != scheme.GetMessageSize() {
p.fLogger.PushWarn(logBuilder.WithType(anon_logger.CLogWarnMessageNull))
- return errors.Join(ErrLoadMessage, err)
+ return ErrInvalidPayloadSize
}
// try store hash of message
diff --git a/pkg/anonymity/qb/anonymity_test.go b/pkg/anonymity/qb/anonymity_test.go
index 75d767bd..5ce6851a 100644
--- a/pkg/anonymity/qb/anonymity_test.go
+++ b/pkg/anonymity/qb/anonymity_test.go
@@ -15,11 +15,11 @@ import (
"github.com/number571/go-peer/pkg/anonymity/qb/queue"
"github.com/number571/go-peer/pkg/crypto/asymmetric"
"github.com/number571/go-peer/pkg/crypto/hybrid"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/layer1"
"github.com/number571/go-peer/pkg/crypto/hybrid/macro"
"github.com/number571/go-peer/pkg/crypto/random"
"github.com/number571/go-peer/pkg/encoding"
"github.com/number571/go-peer/pkg/logger"
- "github.com/number571/go-peer/pkg/message/layer1"
"github.com/number571/go-peer/pkg/network"
"github.com/number571/go-peer/pkg/payload"
"github.com/number571/go-peer/pkg/storage/cache"
diff --git a/pkg/anonymity/qb/errors.go b/pkg/anonymity/qb/errors.go
index f88c48e2..244ee530 100644
--- a/pkg/anonymity/qb/errors.go
+++ b/pkg/anonymity/qb/errors.go
@@ -19,7 +19,7 @@ var (
ErrRetryLimit = &SAnonymityError{"retry limit"}
ErrEnqueueMessage = &SAnonymityError{"enqueue message"}
ErrUnknownType = &SAnonymityError{"unknown type"}
- ErrLoadMessage = &SAnonymityError{"load message"}
+ ErrInvalidPayloadSize = &SAnonymityError{"invalid payload size"}
ErrInvalidLayer1Message = &SAnonymityError{"invalid layer1 message"}
ErrStoreHashIntoDatabase = &SAnonymityError{"store hash into database"}
ErrStoreHashWithProduce = &SAnonymityError{"store hash with produce"}
diff --git a/pkg/anonymity/qb/examples/echo/construct.go b/pkg/anonymity/qb/examples/echo/construct_a.go
similarity index 83%
rename from pkg/anonymity/qb/examples/echo/construct.go
rename to pkg/anonymity/qb/examples/echo/construct_a.go
index 8ec0e71b..80a0041d 100644
--- a/pkg/anonymity/qb/examples/echo/construct.go
+++ b/pkg/anonymity/qb/examples/echo/construct_a.go
@@ -1,3 +1,5 @@
+//go:build !symmetric
+
package main
import (
@@ -11,9 +13,10 @@ import (
anon_logger "github.com/number571/go-peer/pkg/anonymity/qb/logger"
"github.com/number571/go-peer/pkg/anonymity/qb/queue"
"github.com/number571/go-peer/pkg/crypto/asymmetric"
+ "github.com/number571/go-peer/pkg/crypto/hybrid"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/layer1"
"github.com/number571/go-peer/pkg/crypto/hybrid/macro"
"github.com/number571/go-peer/pkg/logger"
- "github.com/number571/go-peer/pkg/message/layer1"
"github.com/number571/go-peer/pkg/network"
"github.com/number571/go-peer/pkg/network/conn"
"github.com/number571/go-peer/pkg/storage/cache"
@@ -29,7 +32,11 @@ const (
type sNode struct {
fNetwork network.INode
fAnonymity anonymity.INode
- fPrivKey asymmetric.IPrivKey
+ fKey hybrid.IParticipantKey
+}
+
+func printTagVersion() {
+ fmt.Println("build_tag: asymmetric (default)")
}
func newNode(serviceName, address string) *sNode {
@@ -126,5 +133,15 @@ func newNode(serviceName, address string) *sNode {
),
),
)
- return &sNode{networkNode, anonymityNode, privKey}
+ return &sNode{networkNode, anonymityNode, privKey.GetPubKey()}
+}
+
+func exchangeKeys(node1, node2 *sNode) (hybrid.IParticipantKey, hybrid.IParticipantKey) {
+ pubKey1 := node1.fKey.(asymmetric.IPubKey)
+ pubKey2 := node2.fKey.(asymmetric.IPubKey)
+
+ node1.fAnonymity.GetKeysContainer().(asymmetric.IMapPubKeys).SetPubKey(pubKey2)
+ node2.fAnonymity.GetKeysContainer().(asymmetric.IMapPubKeys).SetPubKey(pubKey1)
+
+ return pubKey1, pubKey2
}
diff --git a/pkg/anonymity/qb/examples/echo/construct_s.go b/pkg/anonymity/qb/examples/echo/construct_s.go
new file mode 100644
index 00000000..1d642f35
--- /dev/null
+++ b/pkg/anonymity/qb/examples/echo/construct_s.go
@@ -0,0 +1,146 @@
+//go:build symmetric
+
+package main
+
+import (
+ "context"
+ "fmt"
+ "os"
+ "time"
+
+ anonymity "github.com/number571/go-peer/pkg/anonymity/qb"
+ "github.com/number571/go-peer/pkg/anonymity/qb/adapters"
+ anon_logger "github.com/number571/go-peer/pkg/anonymity/qb/logger"
+ "github.com/number571/go-peer/pkg/anonymity/qb/queue"
+ "github.com/number571/go-peer/pkg/crypto/hybrid"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/layer1"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/micro"
+ "github.com/number571/go-peer/pkg/crypto/random"
+ "github.com/number571/go-peer/pkg/crypto/symmetric"
+ "github.com/number571/go-peer/pkg/logger"
+ "github.com/number571/go-peer/pkg/network"
+ "github.com/number571/go-peer/pkg/network/conn"
+ "github.com/number571/go-peer/pkg/storage/cache"
+ "github.com/number571/go-peer/pkg/storage/database"
+)
+
+const (
+ networkMask = uint32(0x11223344)
+ msgSize = uint64(128)
+ workSize = uint64(10)
+)
+
+type sNode struct {
+ fNetwork network.INode
+ fAnonymity anonymity.INode
+ fKey hybrid.IParticipantKey // not used
+}
+
+func printTagVersion() {
+ fmt.Println("build_tag: symmetric")
+}
+
+func newNode(serviceName, address string) *sNode {
+ msgChan := make(chan layer1.IMessage)
+ scheme := micro.NewScheme(msgSize)
+
+ networkNode := network.NewNode(
+ network.NewSettings(&network.SSettings{
+ FAddress: address,
+ FMaxConnects: 256,
+ FReadTimeout: time.Minute,
+ FWriteTimeout: time.Minute,
+ FConnSettings: conn.NewSettings(&conn.SSettings{
+ FMessageSettings: layer1.NewSettings(&layer1.SSettings{
+ FWorkSizeBits: workSize,
+ }),
+ FLimitMessageSizeBytes: msgSize,
+ FWaitReadTimeout: time.Hour,
+ FDialTimeout: time.Minute,
+ FReadTimeout: time.Minute,
+ FWriteTimeout: time.Minute,
+ }),
+ }),
+ cache.NewLRUCache(1024),
+ ).HandleFunc(
+ networkMask,
+ func(ctx context.Context, _ network.INode, _ conn.IConn, msg layer1.IMessage) error {
+ msgChan <- msg
+ return nil
+ },
+ )
+ anonymityNode := anonymity.NewNode(
+ anonymity.NewSettings(&anonymity.SSettings{
+ FServiceName: serviceName,
+ FFetchTimeout: time.Minute,
+ }),
+ logger.NewLogger(
+ logger.NewSettings(&logger.SSettings{
+ FInfo: os.Stdout,
+ FWarn: os.Stdout,
+ FErro: os.Stderr,
+ }),
+ func(ia logger.ILogArg) string {
+ logGetter, ok := ia.(anon_logger.ILogGetter)
+ if !ok {
+ panic("got invalid log arg")
+ }
+ return fmt.Sprintf(
+ "name=%s code=%02x hash=%X proof=%08d bytes=%d",
+ logGetter.GetService(),
+ logGetter.GetType(),
+ logGetter.GetHash()[:16],
+ logGetter.GetProof(),
+ logGetter.GetSize(),
+ )
+ },
+ ),
+ adapters.NewAdapterByFuncs(
+ func(ctx context.Context, msg layer1.IMessage) error {
+ return networkNode.BroadcastMessage(ctx, msg)
+ },
+ func(ctx context.Context) (layer1.IMessage, error) {
+ select {
+ case <-ctx.Done():
+ return nil, ctx.Err()
+ case msg := <-msgChan:
+ _ = networkNode.BroadcastMessage(ctx, msg)
+ return msg, nil
+ }
+ },
+ ),
+ func() database.IKVDatabase {
+ db, err := database.NewKVDatabase("./database_" + serviceName + ".db")
+ if err != nil {
+ panic(err)
+ }
+ return db
+ }(),
+ symmetric.NewListCiphers(),
+ queue.NewQBProblemProcessor(
+ queue.NewSettings(&queue.SSettings{
+ FMessageConstructSettings: layer1.NewConstructSettings(&layer1.SConstructSettings{
+ FSettings: layer1.NewSettings(&layer1.SSettings{
+ FWorkSizeBits: workSize,
+ }),
+ }),
+ FNetworkMask: networkMask,
+ FQueuePeriod: 2 * time.Second,
+ FConsumersCap: 1,
+ FQueuePoolCap: [2]uint64{32, 32},
+ }),
+ scheme,
+ ),
+ )
+ return &sNode{networkNode, anonymityNode, nil}
+}
+
+func exchangeKeys(node1, node2 *sNode) (hybrid.IParticipantKey, hybrid.IParticipantKey) {
+ key := random.NewRandom().GetBytes(symmetric.CCipherKeySize)
+ cipher := symmetric.NewCipher(key)
+
+ node1.fAnonymity.GetKeysContainer().(symmetric.IListCiphers).Add(cipher)
+ node2.fAnonymity.GetKeysContainer().(symmetric.IListCiphers).Add(cipher)
+
+ return cipher, cipher
+}
diff --git a/pkg/anonymity/qb/examples/echo/main.go b/pkg/anonymity/qb/examples/echo/main.go
index e0a1e090..fdb32dde 100644
--- a/pkg/anonymity/qb/examples/echo/main.go
+++ b/pkg/anonymity/qb/examples/echo/main.go
@@ -6,7 +6,6 @@ import (
"time"
anonymity "github.com/number571/go-peer/pkg/anonymity/qb"
- "github.com/number571/go-peer/pkg/crypto/asymmetric"
"github.com/number571/go-peer/pkg/crypto/hybrid"
"github.com/number571/go-peer/pkg/payload"
)
@@ -16,17 +15,21 @@ const (
nodeRouter = uint32(0xA557711A)
)
+func init() {
+ printTagVersion()
+}
+
func main() {
nodeService := runServiceNode()
nodeClient := runClientNode()
- pubKeyService, _ := exchangeKeys(nodeService, nodeClient)
+ keyToService, _ := exchangeKeys(nodeService, nodeClient)
ctx := context.Background()
for {
resp, _ := nodeClient.fAnonymity.FetchPayload(
ctx,
- pubKeyService,
+ keyToService,
payload.NewPayload32(nodeRouter, []byte("hello, world!")),
)
fmt.Println(string(resp))
@@ -59,13 +62,3 @@ func runServiceNode() *sNode {
time.Sleep(time.Second) // wait listener
return node
}
-
-func exchangeKeys(node1, node2 *sNode) (asymmetric.IPubKey, asymmetric.IPubKey) {
- pubKey1 := node1.fPrivKey.GetPubKey()
- pubKey2 := node2.fPrivKey.GetPubKey()
-
- node1.fAnonymity.GetKeysContainer().(asymmetric.IMapPubKeys).SetPubKey(pubKey2)
- node2.fAnonymity.GetKeysContainer().(asymmetric.IMapPubKeys).SetPubKey(pubKey1)
-
- return pubKey1, pubKey2
-}
diff --git a/pkg/anonymity/qb/examples/ping-pong/construct.go b/pkg/anonymity/qb/examples/ping-pong/construct_a.go
similarity index 83%
rename from pkg/anonymity/qb/examples/ping-pong/construct.go
rename to pkg/anonymity/qb/examples/ping-pong/construct_a.go
index 8ec0e71b..80a0041d 100644
--- a/pkg/anonymity/qb/examples/ping-pong/construct.go
+++ b/pkg/anonymity/qb/examples/ping-pong/construct_a.go
@@ -1,3 +1,5 @@
+//go:build !symmetric
+
package main
import (
@@ -11,9 +13,10 @@ import (
anon_logger "github.com/number571/go-peer/pkg/anonymity/qb/logger"
"github.com/number571/go-peer/pkg/anonymity/qb/queue"
"github.com/number571/go-peer/pkg/crypto/asymmetric"
+ "github.com/number571/go-peer/pkg/crypto/hybrid"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/layer1"
"github.com/number571/go-peer/pkg/crypto/hybrid/macro"
"github.com/number571/go-peer/pkg/logger"
- "github.com/number571/go-peer/pkg/message/layer1"
"github.com/number571/go-peer/pkg/network"
"github.com/number571/go-peer/pkg/network/conn"
"github.com/number571/go-peer/pkg/storage/cache"
@@ -29,7 +32,11 @@ const (
type sNode struct {
fNetwork network.INode
fAnonymity anonymity.INode
- fPrivKey asymmetric.IPrivKey
+ fKey hybrid.IParticipantKey
+}
+
+func printTagVersion() {
+ fmt.Println("build_tag: asymmetric (default)")
}
func newNode(serviceName, address string) *sNode {
@@ -126,5 +133,15 @@ func newNode(serviceName, address string) *sNode {
),
),
)
- return &sNode{networkNode, anonymityNode, privKey}
+ return &sNode{networkNode, anonymityNode, privKey.GetPubKey()}
+}
+
+func exchangeKeys(node1, node2 *sNode) (hybrid.IParticipantKey, hybrid.IParticipantKey) {
+ pubKey1 := node1.fKey.(asymmetric.IPubKey)
+ pubKey2 := node2.fKey.(asymmetric.IPubKey)
+
+ node1.fAnonymity.GetKeysContainer().(asymmetric.IMapPubKeys).SetPubKey(pubKey2)
+ node2.fAnonymity.GetKeysContainer().(asymmetric.IMapPubKeys).SetPubKey(pubKey1)
+
+ return pubKey1, pubKey2
}
diff --git a/pkg/anonymity/qb/examples/ping-pong/construct_s.go b/pkg/anonymity/qb/examples/ping-pong/construct_s.go
new file mode 100644
index 00000000..1d8eff76
--- /dev/null
+++ b/pkg/anonymity/qb/examples/ping-pong/construct_s.go
@@ -0,0 +1,146 @@
+//go:build symmetric
+
+package main
+
+import (
+ "context"
+ "fmt"
+ "os"
+ "time"
+
+ anonymity "github.com/number571/go-peer/pkg/anonymity/qb"
+ "github.com/number571/go-peer/pkg/anonymity/qb/adapters"
+ anon_logger "github.com/number571/go-peer/pkg/anonymity/qb/logger"
+ "github.com/number571/go-peer/pkg/anonymity/qb/queue"
+ "github.com/number571/go-peer/pkg/crypto/hybrid"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/layer1"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/micro"
+ "github.com/number571/go-peer/pkg/crypto/random"
+ "github.com/number571/go-peer/pkg/crypto/symmetric"
+ "github.com/number571/go-peer/pkg/logger"
+ "github.com/number571/go-peer/pkg/network"
+ "github.com/number571/go-peer/pkg/network/conn"
+ "github.com/number571/go-peer/pkg/storage/cache"
+ "github.com/number571/go-peer/pkg/storage/database"
+)
+
+const (
+ networkMask = uint32(0x11223344)
+ msgSize = uint64(128)
+ workSize = uint64(10)
+)
+
+type sNode struct {
+ fNetwork network.INode
+ fAnonymity anonymity.INode
+ fKey hybrid.IParticipantKey // not used
+}
+
+func printTagVersion() {
+ fmt.Println("build_tag: symmetric")
+}
+
+func newNode(serviceName, address string) *sNode {
+ msgChan := make(chan layer1.IMessage)
+ networkNode := network.NewNode(
+ network.NewSettings(&network.SSettings{
+ FAddress: address,
+ FMaxConnects: 256,
+ FReadTimeout: time.Minute,
+ FWriteTimeout: time.Minute,
+ FConnSettings: conn.NewSettings(&conn.SSettings{
+ FMessageSettings: layer1.NewSettings(&layer1.SSettings{
+ FWorkSizeBits: workSize,
+ }),
+ FLimitMessageSizeBytes: msgSize,
+ FWaitReadTimeout: time.Hour,
+ FDialTimeout: time.Minute,
+ FReadTimeout: time.Minute,
+ FWriteTimeout: time.Minute,
+ }),
+ }),
+ cache.NewLRUCache(1024),
+ ).HandleFunc(
+ networkMask,
+ func(ctx context.Context, _ network.INode, _ conn.IConn, msg layer1.IMessage) error {
+ msgChan <- msg
+ return nil
+ },
+ )
+ anonymityNode := anonymity.NewNode(
+ anonymity.NewSettings(&anonymity.SSettings{
+ FServiceName: serviceName,
+ FFetchTimeout: time.Minute,
+ }),
+ logger.NewLogger(
+ logger.NewSettings(&logger.SSettings{
+ FInfo: os.Stdout,
+ FWarn: os.Stdout,
+ FErro: os.Stderr,
+ }),
+ func(ia logger.ILogArg) string {
+ logGetter, ok := ia.(anon_logger.ILogGetter)
+ if !ok {
+ panic("got invalid log arg")
+ }
+ return fmt.Sprintf(
+ "name=%s code=%02x hash=%X proof=%08d bytes=%d",
+ logGetter.GetService(),
+ logGetter.GetType(),
+ logGetter.GetHash()[:16],
+ logGetter.GetProof(),
+ logGetter.GetSize(),
+ )
+ },
+ ),
+ adapters.NewAdapterByFuncs(
+ func(ctx context.Context, msg layer1.IMessage) error {
+ return networkNode.BroadcastMessage(ctx, msg)
+ },
+ func(ctx context.Context) (layer1.IMessage, error) {
+ select {
+ case <-ctx.Done():
+ return nil, ctx.Err()
+ case msg := <-msgChan:
+ _ = networkNode.BroadcastMessage(ctx, msg)
+ return msg, nil
+ }
+ },
+ ),
+ func() database.IKVDatabase {
+ db, err := database.NewKVDatabase("./database_" + serviceName + ".db")
+ if err != nil {
+ panic(err)
+ }
+ return db
+ }(),
+ symmetric.NewListCiphers(),
+ queue.NewQBProblemProcessor(
+ queue.NewSettings(&queue.SSettings{
+ FMessageConstructSettings: layer1.NewConstructSettings(&layer1.SConstructSettings{
+ FSettings: layer1.NewSettings(&layer1.SSettings{
+ FWorkSizeBits: workSize,
+ }),
+ }),
+ FNetworkMask: networkMask,
+ FQueuePeriod: 2 * time.Second,
+ FConsumersCap: 1,
+ FQueuePoolCap: [2]uint64{32, 32},
+ }),
+ micro.NewScheme(
+ msgSize,
+ ),
+ ),
+ )
+ return &sNode{networkNode, anonymityNode, nil}
+}
+
+func exchangeKeys(node1, node2 *sNode) (hybrid.IParticipantKey, hybrid.IParticipantKey) {
+ key := random.NewRandom().GetBytes(symmetric.CCipherKeySize)
+ cipher := symmetric.NewCipher(key)
+
+ node1.fAnonymity.GetKeysContainer().(symmetric.IListCiphers).Add(cipher)
+ node2.fAnonymity.GetKeysContainer().(symmetric.IListCiphers).Add(cipher)
+
+ return cipher, cipher
+}
diff --git a/pkg/anonymity/qb/examples/ping-pong/main.go b/pkg/anonymity/qb/examples/ping-pong/main.go
index 6c9efbb6..d0681746 100644
--- a/pkg/anonymity/qb/examples/ping-pong/main.go
+++ b/pkg/anonymity/qb/examples/ping-pong/main.go
@@ -6,7 +6,6 @@ import (
"time"
anonymity "github.com/number571/go-peer/pkg/anonymity/qb"
- "github.com/number571/go-peer/pkg/crypto/asymmetric"
"github.com/number571/go-peer/pkg/crypto/hybrid"
"github.com/number571/go-peer/pkg/encoding"
"github.com/number571/go-peer/pkg/payload"
@@ -39,16 +38,20 @@ var (
}
)
+func init() {
+ printTagVersion()
+}
+
func main() {
nodeService := runServiceNode()
nodeClient := runClientNode()
- pubKeyService, _ := exchangeKeys(nodeService, nodeClient)
+ keyService, _ := exchangeKeys(nodeService, nodeClient)
numBytes := encoding.Uint64ToBytes(0)
_ = nodeClient.fAnonymity.SendPayload(
context.Background(),
- pubKeyService,
+ keyService,
payload.NewPayload64(uint64(nodeRouter), numBytes[:]),
)
@@ -77,13 +80,3 @@ func runServiceNode() *sNode {
time.Sleep(time.Second) // wait listener
return node
}
-
-func exchangeKeys(node1, node2 *sNode) (asymmetric.IPubKey, asymmetric.IPubKey) {
- pubKey1 := node1.fPrivKey.GetPubKey()
- pubKey2 := node2.fPrivKey.GetPubKey()
-
- node1.fAnonymity.GetKeysContainer().(asymmetric.IMapPubKeys).SetPubKey(pubKey2)
- node2.fAnonymity.GetKeysContainer().(asymmetric.IMapPubKeys).SetPubKey(pubKey1)
-
- return pubKey1, pubKey2
-}
diff --git a/pkg/anonymity/qb/queue/examples/queue/main.go b/pkg/anonymity/qb/queue/examples/queue/main.go
index 4ac8330a..ce191219 100644
--- a/pkg/anonymity/qb/queue/examples/queue/main.go
+++ b/pkg/anonymity/qb/queue/examples/queue/main.go
@@ -9,9 +9,8 @@ import (
"github.com/number571/go-peer/pkg/anonymity/qb/queue"
"github.com/number571/go-peer/pkg/crypto/asymmetric"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/layer1"
"github.com/number571/go-peer/pkg/crypto/hybrid/macro"
- "github.com/number571/go-peer/pkg/message/layer1"
- "github.com/number571/go-peer/pkg/message/layer2"
"github.com/number571/go-peer/pkg/payload"
)
@@ -60,13 +59,12 @@ func main() {
if netMsg == nil {
panic("net message is nil")
}
- msg, err := layer2.LoadMessage(q.GetScheme().GetMessageSize(), netMsg.GetPayload().GetBody())
- if err != nil {
- panic(err)
+ if uint64(len(netMsg.GetPayload().GetBody())) != (q.GetScheme().GetMessageSize()) {
+ panic("payload size is invalid")
}
pubKey, decMsg, err := q.GetScheme().DecryptMessage(
asymmetric.NewMapPubKeys(privKey.GetPubKey()),
- msg.ToBytes(),
+ netMsg.GetPayload().GetBody(),
)
if err != nil {
panic(err)
diff --git a/pkg/anonymity/qb/queue/queue.go b/pkg/anonymity/qb/queue/queue.go
index c0e4a1f0..feeeec9e 100644
--- a/pkg/anonymity/qb/queue/queue.go
+++ b/pkg/anonymity/qb/queue/queue.go
@@ -9,9 +9,9 @@ import (
"github.com/number571/go-peer/pkg/crypto/hashing"
"github.com/number571/go-peer/pkg/crypto/hybrid"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/layer1"
"github.com/number571/go-peer/pkg/crypto/random"
"github.com/number571/go-peer/pkg/encoding"
- "github.com/number571/go-peer/pkg/message/layer1"
"github.com/number571/go-peer/pkg/payload"
"github.com/number571/go-peer/pkg/state"
)
diff --git a/pkg/anonymity/qb/queue/queue_test.go b/pkg/anonymity/qb/queue/queue_test.go
index 1c4efbf1..1933774f 100644
--- a/pkg/anonymity/qb/queue/queue_test.go
+++ b/pkg/anonymity/qb/queue/queue_test.go
@@ -10,8 +10,8 @@ import (
"time"
"github.com/number571/go-peer/pkg/crypto/asymmetric"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/layer1"
"github.com/number571/go-peer/pkg/crypto/hybrid/macro"
- "github.com/number571/go-peer/pkg/message/layer1"
"github.com/number571/go-peer/pkg/payload"
testutils "github.com/number571/go-peer/test/utils"
)
diff --git a/pkg/anonymity/qb/queue/settings.go b/pkg/anonymity/qb/queue/settings.go
index 93765b32..fb90b431 100644
--- a/pkg/anonymity/qb/queue/settings.go
+++ b/pkg/anonymity/qb/queue/settings.go
@@ -3,7 +3,7 @@ package queue
import (
"time"
- "github.com/number571/go-peer/pkg/message/layer1"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/layer1"
)
var (
diff --git a/pkg/anonymity/qb/queue/types.go b/pkg/anonymity/qb/queue/types.go
index e0c7f46e..66e817ad 100644
--- a/pkg/anonymity/qb/queue/types.go
+++ b/pkg/anonymity/qb/queue/types.go
@@ -5,7 +5,7 @@ import (
"time"
"github.com/number571/go-peer/pkg/crypto/hybrid"
- "github.com/number571/go-peer/pkg/message/layer1"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/layer1"
"github.com/number571/go-peer/pkg/types"
)
diff --git a/pkg/message/layer1/doc.go b/pkg/crypto/hybrid/layer1/doc.go
similarity index 90%
rename from pkg/message/layer1/doc.go
rename to pkg/crypto/hybrid/layer1/doc.go
index de5691e5..ac0c38e5 100644
--- a/pkg/message/layer1/doc.go
+++ b/pkg/crypto/hybrid/layer1/doc.go
@@ -1,6 +1,6 @@
// Package message is used to create network messages for the purpose of confirming integrity and proof of work.
//
-// The main purpose of the message is the possibility of retransmission with verification by the network key and hide the structure of the true message.
+// The main purpose of the message is the possibility of retransmission with verification by the network key and hide the structure of the true layer2.
/*
NETWORK MESSAGE FORMAT
@@ -14,6 +14,6 @@
P - proof of work
E - encrypt
- Scheme: https://github.com/number571/go-peer/blob/master/images/go-peer_layer1_message.jpg
+ Scheme: https://github.com/number571/go-peer/blob/master/images/go-peer_layer1_layer2.jpg
*/
package layer1
diff --git a/pkg/message/layer1/errors.go b/pkg/crypto/hybrid/layer1/errors.go
similarity index 94%
rename from pkg/message/layer1/errors.go
rename to pkg/crypto/hybrid/layer1/errors.go
index 582a57c3..8be82a36 100644
--- a/pkg/message/layer1/errors.go
+++ b/pkg/crypto/hybrid/layer1/errors.go
@@ -1,7 +1,7 @@
package layer1
const (
- errPrefix = "pkg/message/layer1 = "
+ errPrefix = "pkg/crypto/hybrid/layer1 = "
)
type SMessageError struct {
diff --git a/pkg/message/layer1/message.go b/pkg/crypto/hybrid/layer1/message.go
similarity index 100%
rename from pkg/message/layer1/message.go
rename to pkg/crypto/hybrid/layer1/message.go
diff --git a/pkg/message/layer1/message_bench_test.go b/pkg/crypto/hybrid/layer1/message_bench_test.go
similarity index 100%
rename from pkg/message/layer1/message_bench_test.go
rename to pkg/crypto/hybrid/layer1/message_bench_test.go
diff --git a/pkg/message/layer1/message_test.go b/pkg/crypto/hybrid/layer1/message_test.go
similarity index 100%
rename from pkg/message/layer1/message_test.go
rename to pkg/crypto/hybrid/layer1/message_test.go
diff --git a/pkg/message/layer1/settings.go b/pkg/crypto/hybrid/layer1/settings.go
similarity index 100%
rename from pkg/message/layer1/settings.go
rename to pkg/crypto/hybrid/layer1/settings.go
diff --git a/pkg/message/layer1/types.go b/pkg/crypto/hybrid/layer1/types.go
similarity index 100%
rename from pkg/message/layer1/types.go
rename to pkg/crypto/hybrid/layer1/types.go
diff --git a/pkg/crypto/hybrid/macro/client.go b/pkg/crypto/hybrid/macro/client.go
index 717cae32..302dc9eb 100644
--- a/pkg/crypto/hybrid/macro/client.go
+++ b/pkg/crypto/hybrid/macro/client.go
@@ -8,7 +8,6 @@ import (
"github.com/number571/go-peer/pkg/crypto/hybrid"
"github.com/number571/go-peer/pkg/crypto/random"
"github.com/number571/go-peer/pkg/crypto/symmetric"
- "github.com/number571/go-peer/pkg/message/layer2"
"github.com/number571/go-peer/pkg/payload/joiner"
)
@@ -85,7 +84,7 @@ func (p *sScheme) EncryptMessage(pRecv hybrid.IParticipantKey, pMsg []byte) ([]b
}
// Decrypt message with private key of receiver.
-// No one else except the sender will be able to decrypt the message.
+// No one else except the sender will be able to decrypt the layer2.
func (p *sScheme) DecryptMessage(pMapPubKeys hybrid.IKeysContainer, pMsg []byte) (hybrid.IParticipantKey, []byte, error) {
mapPubKeys, ok := pMapPubKeys.(asymmetric.IMapPubKeys)
if !ok {
@@ -93,7 +92,7 @@ func (p *sScheme) DecryptMessage(pMapPubKeys hybrid.IKeysContainer, pMsg []byte)
}
// Load message's structure from encrypted bytes.
- msg, err := layer2.LoadMessage(p.fMessageSize, pMsg)
+ msg, err := loadMessage(p.fMessageSize, pMsg)
if err != nil {
return nil, nil, ErrInitCheckMessage
}
@@ -173,7 +172,7 @@ func (p *sScheme) encryptWithPadding(
}
cipher := symmetric.NewCipher(sk)
- return layer2.NewMessage(
+ return newMessage(
ct,
cipher.EncryptBytes(joiner.NewBytesJoiner32([][]byte{
pkey.GetHasher().ToBytes(),
diff --git a/pkg/crypto/hybrid/macro/client_test.go b/pkg/crypto/hybrid/macro/client_test.go
index 83b14a70..4a2b829e 100644
--- a/pkg/crypto/hybrid/macro/client_test.go
+++ b/pkg/crypto/hybrid/macro/client_test.go
@@ -11,7 +11,6 @@ import (
"github.com/number571/go-peer/pkg/crypto/random"
"github.com/number571/go-peer/pkg/crypto/symmetric"
"github.com/number571/go-peer/pkg/encoding"
- "github.com/number571/go-peer/pkg/message/layer2"
"github.com/number571/go-peer/pkg/payload/joiner"
)
@@ -274,7 +273,7 @@ func tcEncryptWithParamsInvalidPKID(
}
cipher := symmetric.NewCipher(sk)
- return layer2.NewMessage(
+ return newMessage(
ct,
cipher.EncryptBytes(joiner.NewBytesJoiner32([][]byte{
[]byte("123"),
diff --git a/pkg/crypto/hybrid/macro/doc.go b/pkg/crypto/hybrid/macro/doc.go
index 035becf6..fa38610b 100644
--- a/pkg/crypto/hybrid/macro/doc.go
+++ b/pkg/crypto/hybrid/macro/doc.go
@@ -1,6 +1,15 @@
// Package client makes it possible to encrypt and decrypt messages using a monolithic cryptographic protocol.
//
/*
+ MESSAGE FORMAT
+
+ E( PubK, K ) || E( K, M )
+ where
+ PubK - public key
+ K - secret key
+ M - message bytes
+ E - encrypt
+
CLIENT MESSAGE PROTOCOL
Protocol participants:
@@ -42,6 +51,6 @@
IF ≠, than protocol is interrupted.
More information in article: https://github.com/number571/go-peer/blob/master/docs/monolithic_cryptographic_protocol.pdf
- Scheme: https://github.com/number571/go-peer/blob/master/images/go-peer_layer2_message.jpg
+ Scheme: https://github.com/number571/go-peer/blob/master/images/go-peer_layer2_layer2.jpg
*/
package macro
diff --git a/pkg/crypto/hybrid/macro/errors.go b/pkg/crypto/hybrid/macro/errors.go
index d96c97c1..9c7b9612 100644
--- a/pkg/crypto/hybrid/macro/errors.go
+++ b/pkg/crypto/hybrid/macro/errors.go
@@ -23,4 +23,7 @@ var (
ErrInvalidHashSign = &SSchemeError{"invalid hash sign"}
ErrEncryptSymmetricKey = &SSchemeError{"encrypt symmetric key"}
ErrDecodeBytesJoiner = &SSchemeError{"decode bytes joiner"}
+ ErrUnknownMessageType = &SSchemeError{"unknown type of message"}
+ ErrLoadMessageBytes = &SSchemeError{"load message bytes"}
+ ErrSizeMessageBytes = &SSchemeError{"size message bytes"}
)
diff --git a/pkg/message/layer2/message.go b/pkg/crypto/hybrid/macro/message.go
similarity index 85%
rename from pkg/message/layer2/message.go
rename to pkg/crypto/hybrid/macro/message.go
index a5820102..36189078 100644
--- a/pkg/message/layer2/message.go
+++ b/pkg/crypto/hybrid/macro/message.go
@@ -1,4 +1,4 @@
-package layer2
+package macro
import (
"bytes"
@@ -17,7 +17,7 @@ type sMessage struct {
fEncd []byte
}
-func NewMessage(pEnck, pEncd []byte) IMessage {
+func newMessage(pEnck, pEncd []byte) IMessage {
if len(pEnck) != asymmetric.CKEMCiphertextSize {
panic(`len(pEnck) != asymmetric.CKEMCiphertextSize`)
}
@@ -28,7 +28,7 @@ func NewMessage(pEnck, pEncd []byte) IMessage {
}
// Message can be created only with client module.
-func LoadMessage(pSize uint64, pMsg interface{}) (IMessage, error) {
+func loadMessage(pSize uint64, pMsg interface{}) (IMessage, error) {
kSize := uint64(asymmetric.CKEMCiphertextSize)
if kSize >= pSize {
return nil, ErrSizeMessageBytes
@@ -45,7 +45,7 @@ func LoadMessage(pSize uint64, pMsg interface{}) (IMessage, error) {
if uint64(len(recvMsg)) != pSize {
return nil, ErrLoadMessageBytes
}
- return NewMessage(recvMsg[:kSize], recvMsg[kSize:]), nil
+ return newMessage(recvMsg[:kSize], recvMsg[kSize:]), nil
}
func (p *sMessage) GetEnck() []byte {
diff --git a/pkg/message/layer2/message_test.go b/pkg/crypto/hybrid/macro/message_test.go
similarity index 66%
rename from pkg/message/layer2/message_test.go
rename to pkg/crypto/hybrid/macro/message_test.go
index 685c3ee5..813eacf4 100644
--- a/pkg/message/layer2/message_test.go
+++ b/pkg/crypto/hybrid/macro/message_test.go
@@ -1,4 +1,4 @@
-package layer2
+package macro
import (
"bytes"
@@ -17,18 +17,7 @@ var (
tgStringMessage string
)
-func TestError(t *testing.T) {
- t.Parallel()
-
- str := "value"
- err := &SMessageError{str}
- if err.Error() != errPrefix+str {
- t.Error("incorrect err.Error()")
- return
- }
-}
-
-func TestPanicNewMessage(t *testing.T) {
+func TestPanicnewMessage(t *testing.T) {
t.Parallel()
defer func() {
@@ -38,7 +27,7 @@ func TestPanicNewMessage(t *testing.T) {
}
}()
- _ = NewMessage([]byte{}, []byte{})
+ _ = newMessage([]byte{}, []byte{})
}
func TestInvalidMessage(t *testing.T) {
@@ -46,23 +35,23 @@ func TestInvalidMessage(t *testing.T) {
msgSize := uint64(2 << 10)
- if _, err := LoadMessage(msgSize, struct{}{}); err == nil {
+ if _, err := loadMessage(msgSize, struct{}{}); err == nil {
t.Error("success load message with unknown type")
return
}
- if _, err := LoadMessage(msgSize, []byte{123}); err == nil {
+ if _, err := loadMessage(msgSize, []byte{123}); err == nil {
t.Error("success load invalid message")
return
}
msgBytes := joiner.NewBytesJoiner32([][]byte{[]byte("aaa"), []byte("bbb")})
- if _, err := LoadMessage(msgSize, msgBytes); err == nil {
+ if _, err := loadMessage(msgSize, msgBytes); err == nil {
t.Error("success load invalid message")
return
}
- if _, err := LoadMessage(1, msgBytes); err == nil {
+ if _, err := loadMessage(1, msgBytes); err == nil {
t.Error("success load message with keysize > msgsize")
return
}
@@ -73,14 +62,14 @@ func TestMessage(t *testing.T) {
msgSize := uint64(8 << 10)
- msg1, err := LoadMessage(msgSize, tgBinaryMessage)
+ msg1, err := loadMessage(msgSize, tgBinaryMessage)
if err != nil {
t.Error(err)
return
}
testMessage(t, msgSize, msg1)
- msg2, err := LoadMessage(msgSize, tgStringMessage)
+ msg2, err := loadMessage(msgSize, tgStringMessage)
if err != nil {
t.Error(err)
return
@@ -100,7 +89,7 @@ func testMessage(t *testing.T, msgSize uint64, msg IMessage) {
}
msgBytes := bytes.Join([][]byte{msg.GetEnck(), msg.GetEncd()}, []byte{})
- if _, err := LoadMessage(msgSize, msgBytes); err != nil {
+ if _, err := loadMessage(msgSize, msgBytes); err != nil {
t.Error("new message is invalid")
return
}
diff --git a/pkg/message/layer2/test_binary.msg b/pkg/crypto/hybrid/macro/test_binary.msg
similarity index 100%
rename from pkg/message/layer2/test_binary.msg
rename to pkg/crypto/hybrid/macro/test_binary.msg
diff --git a/pkg/message/layer2/test_string.msg b/pkg/crypto/hybrid/macro/test_string.msg
similarity index 100%
rename from pkg/message/layer2/test_string.msg
rename to pkg/crypto/hybrid/macro/test_string.msg
diff --git a/pkg/message/layer2/types.go b/pkg/crypto/hybrid/macro/types.go
similarity index 55%
rename from pkg/message/layer2/types.go
rename to pkg/crypto/hybrid/macro/types.go
index 04de370a..0bbf6b2c 100644
--- a/pkg/message/layer2/types.go
+++ b/pkg/crypto/hybrid/macro/types.go
@@ -1,8 +1,6 @@
-package layer2
+package macro
-import (
- "github.com/number571/go-peer/pkg/types"
-)
+import "github.com/number571/go-peer/pkg/types"
type IMessage interface {
types.IConverter
diff --git a/pkg/crypto/hybrid/micro/client.go b/pkg/crypto/hybrid/micro/client.go
index 9b19c85d..b9270879 100644
--- a/pkg/crypto/hybrid/micro/client.go
+++ b/pkg/crypto/hybrid/micro/client.go
@@ -8,7 +8,6 @@ import (
"github.com/number571/go-peer/pkg/crypto/random"
"github.com/number571/go-peer/pkg/crypto/symmetric"
"github.com/number571/go-peer/pkg/encoding"
- "github.com/number571/go-peer/pkg/types"
)
var (
@@ -29,8 +28,8 @@ func NewScheme(pMessageSize uint64) hybrid.IScheme {
fMessageSize: pMessageSize,
}
- tmpKey := random.NewRandom().GetBytes(symmetric.CCipherKeySize)
- encMsg, err := scheme.encryptWithPadding(tmpKey, []byte{}, 0)
+ tmpCipher := symmetric.NewCipher(random.NewRandom().GetBytes(symmetric.CCipherKeySize))
+ encMsg, err := scheme.encryptWithPadding(tmpCipher, []byte{}, 0)
if err != nil {
panic(err)
}
@@ -45,7 +44,7 @@ func NewScheme(pMessageSize uint64) hybrid.IScheme {
}
func (p *sScheme) GetRandomKey() hybrid.IParticipantKey {
- return types.NewConverter(random.NewRandom().GetBytes(symmetric.CCipherKeySize))
+ return symmetric.NewCipher(random.NewRandom().GetBytes(symmetric.CCipherKeySize))
}
func (p *sScheme) GetMessageSize() uint64 {
@@ -56,9 +55,9 @@ func (p *sScheme) GetPayloadLimit() uint64 {
return p.fPayloadLimit
}
-func (p *sScheme) EncryptMessage(pKey hybrid.IParticipantKey, pMsg []byte) ([]byte, error) {
- recv := pKey.ToBytes()
- if len(recv) != symmetric.CCipherKeySize {
+func (p *sScheme) EncryptMessage(pRecv hybrid.IParticipantKey, pMsg []byte) ([]byte, error) {
+ recv, ok := pRecv.(symmetric.ICipher)
+ if !ok {
return nil, ErrInvalidKeyType
}
var (
@@ -72,19 +71,16 @@ func (p *sScheme) EncryptMessage(pKey hybrid.IParticipantKey, pMsg []byte) ([]by
}
func (p *sScheme) DecryptMessage(pListKeys hybrid.IKeysContainer, pMsg []byte) (hybrid.IParticipantKey, []byte, error) {
- listKeys, ok := pListKeys.([]hybrid.IParticipantKey)
- if !ok {
- return nil, nil, ErrInvalidKeyType
- }
if uint64(len(pMsg)) != p.fMessageSize {
return nil, nil, ErrMessageSize
}
- for _, k := range listKeys {
- cipher := symmetric.NewCipher(k.ToBytes())
- if cipher == nil {
- continue
- }
- dec := cipher.DecryptBytes(pMsg)
+ listCiphers, ok := pListKeys.(symmetric.IListCiphers)
+ if !ok {
+ return nil, nil, ErrInvalidKeyType
+ }
+ list := listCiphers.Get()
+ for _, c := range list {
+ dec := c.DecryptBytes(pMsg)
if len(dec) <= cSaltSize+hashing.CHasherSize+encoding.CSizeUint32 {
continue
}
@@ -93,7 +89,7 @@ func (p *sScheme) DecryptMessage(pListKeys hybrid.IKeysContainer, pMsg []byte) (
hmac = dec[cSaltSize : cSaltSize+hashing.CHasherSize]
data = dec[cSaltSize+hashing.CHasherSize:]
)
- check := hashing.NewHMACHasher(k.ToBytes(), bytes.Join(
+ check := hashing.NewHMACHasher(c.ToBytes(), bytes.Join(
[][]byte{salt, data},
[]byte{},
)).ToBytes()
@@ -107,13 +103,13 @@ func (p *sScheme) DecryptMessage(pListKeys hybrid.IKeysContainer, pMsg []byte) (
if msgSize > uint32(len(msg)) { // nolint: gosec
return nil, nil, ErrDecodeMessage
}
- return k, msg[:msgSize], nil
+ return c, msg[:msgSize], nil
}
return nil, nil, ErrDecryptMessage
}
func (p *sScheme) encryptWithPadding(
- pKey []byte,
+ pCipher symmetric.ICipher,
pMsg []byte,
pPadd uint64,
) ([]byte, error) {
@@ -123,11 +119,10 @@ func (p *sScheme) encryptWithPadding(
)
lenb := encoding.Uint32ToBytes(uint32(len(pMsg))) // nolint: gosec
data := bytes.Join([][]byte{lenb[:], pMsg, rand.GetBytes(pPadd)}, []byte{})
- cipher := symmetric.NewCipher(pKey)
- return cipher.EncryptBytes(bytes.Join(
+ return pCipher.EncryptBytes(bytes.Join(
[][]byte{
salt,
- hashing.NewHMACHasher(pKey, bytes.Join(
+ hashing.NewHMACHasher(pCipher.ToBytes(), bytes.Join(
[][]byte{salt, data},
[]byte{},
)).ToBytes(),
diff --git a/pkg/crypto/hybrid/micro/doc.go b/pkg/crypto/hybrid/micro/doc.go
index 7f6a37a0..87cf4103 100644
--- a/pkg/crypto/hybrid/micro/doc.go
+++ b/pkg/crypto/hybrid/micro/doc.go
@@ -1,47 +1,6 @@
// Package client makes it possible to encrypt and decrypt messages using a monolithic cryptographic protocol.
//
/*
- CLIENT MESSAGE PROTOCOL
- Protocol participants:
- A - sender,
- B - receiver.
-
- Steps of participant A:
- 1. K = G( N ), R = G( N ),
- where
- G - generator pseudo random bytes,
- N - count of bytes for generator,
- K - encryption session key,
- R - pseudo random bytes (salt).
- 2. HP = H( R || P || PubKA || PubKB ),
- where
- HP - message hash,
- H - hash function,
- P - plaintext,
- PubKX - public key of X participant.
- 3. CP = [ E( PubKB, K ), E( K, PubKA ), E( K, R ), E( K, P ), E( K, HP ), E( K, S( PrivKA, HP ) ) ],
- where
- CP - encrypted message,
- E - encryption function,
- S - sign function,
- PrivKX - private key of X participant.
-
- Steps of participant B:
- 4. K = D( PrivKB, E( PubKB, K ) ),
- where
- D - decryption function.
- IF ≠, than protocol is interrupted.
- 5. PubKA = D( K, E( K, PubKA ) ).
- IF ≠, than protocol is interrupted.
- 6. HP = V( PubKA, D( K, E( K, S( PrivKA, D( K, E( K, HP) ) ) ) ) ),
- where
- V - signature verification function.
- IF ≠, than protocol is interrupted.
- 7. HP = H( D( K, E( K, R ) ) || D( K, E( K, P ) ) || PubKA || PubKB ),
- IF ≠, than protocol is interrupted.
-
- More information in article: https://github.com/number571/go-peer/blob/master/docs/monolithic_cryptographic_protocol.pdf
- Scheme: https://github.com/number571/go-peer/blob/master/images/go-peer_layer2_message.jpg
-*/
+ */
package micro
diff --git a/pkg/crypto/hybrid/micro/micro_test.go b/pkg/crypto/hybrid/micro/micro_test.go
index 4d7d5285..e8820c1b 100644
--- a/pkg/crypto/hybrid/micro/micro_test.go
+++ b/pkg/crypto/hybrid/micro/micro_test.go
@@ -5,27 +5,28 @@ import (
"fmt"
"testing"
- "github.com/number571/go-peer/pkg/crypto/hybrid"
"github.com/number571/go-peer/pkg/crypto/random"
"github.com/number571/go-peer/pkg/crypto/symmetric"
- "github.com/number571/go-peer/pkg/types"
)
func TestScheme(t *testing.T) {
t.Parallel()
var (
- key = types.NewConverter(random.NewRandom().GetBytes(symmetric.CCipherKeySize))
+ key = symmetric.NewCipher(random.NewRandom().GetBytes(symmetric.CCipherKeySize))
msg = []byte("hello, world!")
)
- scheme := NewScheme(200)
+ scheme := NewScheme(128)
encMsg, err := scheme.EncryptMessage(key, msg)
if err != nil {
t.Fatal(err)
}
- gotKey, gotMsg, err := scheme.DecryptMessage([]hybrid.IParticipantKey{key}, encMsg)
+ listCiphers := symmetric.NewListCiphers()
+ listCiphers.Add(symmetric.NewCipher(key.ToBytes()))
+
+ gotKey, gotMsg, err := scheme.DecryptMessage(listCiphers, encMsg)
if err != nil {
t.Fatal(err)
}
@@ -38,7 +39,7 @@ func TestScheme(t *testing.T) {
t.Fatal("msgs are diff")
}
- // fmt.Println(scheme.GetMessageSize())
- // fmt.Println(scheme.GetMessageSize() - scheme.GetPayloadLimit())
- // fmt.Println(scheme.GetPayloadLimit())
+ fmt.Println(scheme.GetMessageSize())
+ fmt.Println(scheme.GetMessageSize() - scheme.GetPayloadLimit())
+ fmt.Println(scheme.GetPayloadLimit())
}
diff --git a/pkg/crypto/symmetric/symmetric.go b/pkg/crypto/symmetric/cipher.go
similarity index 81%
rename from pkg/crypto/symmetric/symmetric.go
rename to pkg/crypto/symmetric/cipher.go
index 101c573a..b574a839 100644
--- a/pkg/crypto/symmetric/symmetric.go
+++ b/pkg/crypto/symmetric/cipher.go
@@ -5,6 +5,7 @@ import (
"crypto/cipher"
"github.com/number571/go-peer/pkg/crypto/random"
+ "github.com/number571/go-peer/pkg/encoding"
)
var (
@@ -17,6 +18,7 @@ const (
)
type sAESCipher struct {
+ fKey []byte
fBlock cipher.Block
}
@@ -25,7 +27,7 @@ func NewCipher(pKey []byte) ICipher {
return nil
}
block, _ := aes.NewCipher(pKey)
- return &sAESCipher{fBlock: block}
+ return &sAESCipher{fKey: pKey, fBlock: block}
}
func (p *sAESCipher) EncryptBytes(pMsg []byte) []byte {
@@ -52,3 +54,11 @@ func (p *sAESCipher) DecryptBytes(pMsg []byte) []byte {
stream.XORKeyStream(result, pMsg[blockSize:])
return result
}
+
+func (p *sAESCipher) ToBytes() []byte {
+ return p.fKey
+}
+
+func (p *sAESCipher) ToString() string {
+ return encoding.HexEncode(p.fKey)
+}
diff --git a/pkg/crypto/symmetric/symmetric_test.go b/pkg/crypto/symmetric/cipher_test.go
similarity index 100%
rename from pkg/crypto/symmetric/symmetric_test.go
rename to pkg/crypto/symmetric/cipher_test.go
diff --git a/pkg/crypto/symmetric/list_ciphers.go b/pkg/crypto/symmetric/list_ciphers.go
new file mode 100644
index 00000000..4cce4361
--- /dev/null
+++ b/pkg/crypto/symmetric/list_ciphers.go
@@ -0,0 +1,71 @@
+package symmetric
+
+import (
+ "sync"
+)
+
+var (
+ _ IListCiphers = &sListCiphers{}
+)
+
+type sListCiphers struct {
+ fMtx *sync.RWMutex
+ fMap map[string]interface{}
+ fList []ICipher
+}
+
+func NewListCiphers(pCiphers ...ICipher) IListCiphers {
+ listCiphers := &sListCiphers{
+ fMtx: &sync.RWMutex{},
+ fMap: make(map[string]interface{}, 128),
+ fList: make([]ICipher, 0, 128),
+ }
+ for _, v := range pCiphers {
+ listCiphers.Add(v)
+ }
+ return listCiphers
+}
+
+func (p *sListCiphers) Add(pCipher ICipher) bool {
+ p.fMtx.Lock()
+ defer p.fMtx.Unlock()
+
+ strKey := pCipher.ToString()
+ if _, ok := p.fMap[strKey]; ok {
+ return false
+ }
+ p.fMap[strKey] = struct{}{}
+
+ p.fList = append(p.fList, pCipher)
+ return true
+}
+
+func (p *sListCiphers) Del(pCipher ICipher) bool {
+ p.fMtx.Lock()
+ defer p.fMtx.Unlock()
+
+ strKey := pCipher.ToString()
+ if _, ok := p.fMap[strKey]; !ok {
+ return false
+ }
+
+ for i, v := range p.fList {
+ if strKey != v.ToString() {
+ continue
+ }
+ p.fList = append(p.fList[:i], p.fList[i+1:]...)
+ delete(p.fMap, strKey)
+ return true
+ }
+
+ panic("cipher not found in list (but exist in map)")
+}
+
+func (p *sListCiphers) Get() []ICipher {
+ p.fMtx.RLock()
+ defer p.fMtx.RUnlock()
+
+ list := make([]ICipher, len(p.fList))
+ copy(list, p.fList)
+ return list
+}
diff --git a/pkg/crypto/symmetric/types.go b/pkg/crypto/symmetric/types.go
index 06f46d54..c4f2526a 100644
--- a/pkg/crypto/symmetric/types.go
+++ b/pkg/crypto/symmetric/types.go
@@ -1,6 +1,16 @@
package symmetric
+import "github.com/number571/go-peer/pkg/types"
+
+type IListCiphers interface {
+ Get() []ICipher
+ Add(ICipher) bool
+ Del(ICipher) bool
+}
+
type ICipher interface {
+ types.IConverter
+
EncryptBytes(pMsg []byte) []byte
DecryptBytes(pMsg []byte) []byte
}
diff --git a/pkg/message/layer2/doc.go b/pkg/message/layer2/doc.go
deleted file mode 100644
index 5731fc71..00000000
--- a/pkg/message/layer2/doc.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// Package message used as an encapsulated ciphertext.
-//
-/*
- MESSAGE FORMAT
-
- E( PubK, K ) || E( K, M )
- where
- PubK - public key
- K - secret key
- M - message bytes
- E - encrypt
-
- More information in pkg/client
-*/
-package layer2
diff --git a/pkg/message/layer2/errors.go b/pkg/message/layer2/errors.go
deleted file mode 100644
index 03241e97..00000000
--- a/pkg/message/layer2/errors.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package layer2
-
-const (
- errPrefix = "pkg/message/layer2 = "
-)
-
-type SMessageError struct {
- str string
-}
-
-func (err *SMessageError) Error() string {
- return errPrefix + err.str
-}
-
-var (
- ErrUnknownMessageType = &SMessageError{"unknown type of message"}
- ErrLoadMessageBytes = &SMessageError{"load message bytes"}
- ErrSizeMessageBytes = &SMessageError{"size message bytes"}
-)
diff --git a/pkg/network/conn/conn.go b/pkg/network/conn/conn.go
index 670ee87b..eb8a95cd 100644
--- a/pkg/network/conn/conn.go
+++ b/pkg/network/conn/conn.go
@@ -8,8 +8,8 @@ import (
"sync"
"time"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/layer1"
"github.com/number571/go-peer/pkg/encoding"
- "github.com/number571/go-peer/pkg/message/layer1"
"github.com/number571/go-peer/pkg/payload/joiner"
)
diff --git a/pkg/network/conn/conn_test.go b/pkg/network/conn/conn_test.go
index a2719412..a346121a 100644
--- a/pkg/network/conn/conn_test.go
+++ b/pkg/network/conn/conn_test.go
@@ -11,9 +11,9 @@ import (
"testing"
"time"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/layer1"
"github.com/number571/go-peer/pkg/crypto/random"
"github.com/number571/go-peer/pkg/encoding"
- "github.com/number571/go-peer/pkg/message/layer1"
"github.com/number571/go-peer/pkg/payload"
testutils "github.com/number571/go-peer/test/utils"
)
diff --git a/pkg/network/conn/settings.go b/pkg/network/conn/settings.go
index 2625585c..94c40e50 100644
--- a/pkg/network/conn/settings.go
+++ b/pkg/network/conn/settings.go
@@ -3,7 +3,7 @@ package conn
import (
"time"
- "github.com/number571/go-peer/pkg/message/layer1"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/layer1"
)
var (
diff --git a/pkg/network/conn/types.go b/pkg/network/conn/types.go
index 982d6874..1d2864ad 100644
--- a/pkg/network/conn/types.go
+++ b/pkg/network/conn/types.go
@@ -6,7 +6,7 @@ import (
"net"
"time"
- "github.com/number571/go-peer/pkg/message/layer1"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/layer1"
)
type IConn interface {
diff --git a/pkg/network/connkeeper/connkeeper_test.go b/pkg/network/connkeeper/connkeeper_test.go
index 26ca4513..4c24ab83 100644
--- a/pkg/network/connkeeper/connkeeper_test.go
+++ b/pkg/network/connkeeper/connkeeper_test.go
@@ -8,7 +8,7 @@ import (
"testing"
"time"
- "github.com/number571/go-peer/pkg/message/layer1"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/layer1"
"github.com/number571/go-peer/pkg/network"
"github.com/number571/go-peer/pkg/network/conn"
"github.com/number571/go-peer/pkg/storage/cache"
diff --git a/pkg/network/examples/broadcast/main.go b/pkg/network/examples/broadcast/main.go
index a1487e40..0075cb1c 100644
--- a/pkg/network/examples/broadcast/main.go
+++ b/pkg/network/examples/broadcast/main.go
@@ -5,7 +5,7 @@ import (
"fmt"
"time"
- "github.com/number571/go-peer/pkg/message/layer1"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/layer1"
"github.com/number571/go-peer/pkg/network"
"github.com/number571/go-peer/pkg/network/conn"
"github.com/number571/go-peer/pkg/payload"
diff --git a/pkg/network/examples/echo/main.go b/pkg/network/examples/echo/main.go
index c3d66ed1..77281f4f 100644
--- a/pkg/network/examples/echo/main.go
+++ b/pkg/network/examples/echo/main.go
@@ -5,7 +5,7 @@ import (
"fmt"
"time"
- "github.com/number571/go-peer/pkg/message/layer1"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/layer1"
"github.com/number571/go-peer/pkg/network"
"github.com/number571/go-peer/pkg/network/conn"
"github.com/number571/go-peer/pkg/payload"
diff --git a/pkg/network/examples/ping-pong/main.go b/pkg/network/examples/ping-pong/main.go
index 0895bacc..8cb2d4b5 100644
--- a/pkg/network/examples/ping-pong/main.go
+++ b/pkg/network/examples/ping-pong/main.go
@@ -6,7 +6,7 @@ import (
"strconv"
"time"
- "github.com/number571/go-peer/pkg/message/layer1"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/layer1"
"github.com/number571/go-peer/pkg/network"
"github.com/number571/go-peer/pkg/network/conn"
"github.com/number571/go-peer/pkg/payload"
diff --git a/pkg/network/network.go b/pkg/network/network.go
index 61fe6e40..6d08c3b0 100644
--- a/pkg/network/network.go
+++ b/pkg/network/network.go
@@ -7,8 +7,8 @@ import (
"sync"
"time"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/layer1"
"github.com/number571/go-peer/pkg/encoding"
- "github.com/number571/go-peer/pkg/message/layer1"
"github.com/number571/go-peer/pkg/network/conn"
"github.com/number571/go-peer/pkg/storage/cache"
)
diff --git a/pkg/network/network_test.go b/pkg/network/network_test.go
index ba711cc8..b278bbe0 100644
--- a/pkg/network/network_test.go
+++ b/pkg/network/network_test.go
@@ -10,7 +10,7 @@ import (
"testing"
"time"
- "github.com/number571/go-peer/pkg/message/layer1"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/layer1"
"github.com/number571/go-peer/pkg/network/conn"
"github.com/number571/go-peer/pkg/payload"
"github.com/number571/go-peer/pkg/storage/cache"
diff --git a/pkg/network/types.go b/pkg/network/types.go
index e3467261..84674891 100644
--- a/pkg/network/types.go
+++ b/pkg/network/types.go
@@ -4,7 +4,7 @@ import (
"context"
"time"
- "github.com/number571/go-peer/pkg/message/layer1"
+ "github.com/number571/go-peer/pkg/crypto/hybrid/layer1"
"github.com/number571/go-peer/pkg/network/conn"
"github.com/number571/go-peer/pkg/storage/cache"
"github.com/number571/go-peer/pkg/types"
diff --git a/test/result/badge_codelines.svg b/test/result/badge_codelines.svg
index a2e21b1e..015c77d8 100644
--- a/test/result/badge_codelines.svg
+++ b/test/result/badge_codelines.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/test/result/badge_coverage.svg b/test/result/badge_coverage.svg
index 65824887..09558fd2 100644
--- a/test/result/badge_coverage.svg
+++ b/test/result/badge_coverage.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/test/result/coverage.svg b/test/result/coverage.svg
index c5a638cc..520605d9 100644
--- a/test/result/coverage.svg
+++ b/test/result/coverage.svg
@@ -7,7 +7,7 @@
>
-
+
-
+
-
+
-
+
anonymity/qb
@@ -52,25 +52,25 @@
-
+
crypto
-
+
encoding
@@ -78,12 +78,12 @@
-
+
logger
@@ -91,25 +91,12 @@
-
+
message
-
-
-
-
-
-
-
-network
@@ -117,12 +104,12 @@
-
+
payload
@@ -130,12 +117,12 @@
-
+
state
@@ -143,12 +130,12 @@
-
+
storage
@@ -156,12 +143,12 @@
-
+
types/converter.go
@@ -169,24 +156,31 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
+
action.go
+
+
+
+
+
+
+
+
+
+
+
+
+
+anonymity.go
@@ -194,18 +188,18 @@
-
+
-
+
head.go
@@ -213,12 +207,12 @@
-
+
logger/log_builder.go
@@ -226,12 +220,12 @@
-
+
queue
@@ -239,18 +233,25 @@
-
-
-
-
-
-
-
+
settings.go
+
+
+
+
+
+
+
+asymmetric
@@ -258,12 +259,12 @@
-
+
hashing
@@ -271,12 +272,12 @@
-
+
hybrid
@@ -284,18 +285,18 @@
-
+
-
+
puzzle/puzzle.go
@@ -303,12 +304,12 @@
-
+
random/random.go
@@ -316,25 +317,25 @@
-
+
symmetric/symmetric.go
+ transform="translate(214.788720,310.755035) scale(1.000000)"
+ style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(0, 0, 0); fill-opacity: 1.00; white-space: pre;"
+ data-math="N">symmetric
-
+
bytes.go
@@ -342,37 +343,43 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
hex.go
+ data-math="N">serialize_yaml.go
-
-
-
-
-
-
-
-
-
-
-
-
-
+
logger.go
@@ -380,44 +387,18 @@
-
+
-
+
layer1
-
-
-
-
-
-
-
-layer2
-
-
-
-
-
-
-
-conn
@@ -425,12 +406,12 @@
-
+
connkeeper
@@ -438,12 +419,12 @@
-
+
network.go
@@ -451,12 +432,12 @@
-
+
settings.go
@@ -464,12 +445,12 @@
-
+
joiner
@@ -477,12 +458,12 @@
-
+
payload32.go
@@ -490,12 +471,12 @@
-
+
payload64.go
@@ -503,12 +484,12 @@
-
+
state.go
@@ -516,12 +497,12 @@
-
+
cache/lru.go
@@ -529,12 +510,12 @@
-
+
database
@@ -542,18 +523,18 @@
-
+
-
+
queue.go
@@ -561,12 +542,12 @@
-
+
settings.go
@@ -574,12 +555,12 @@
-
+
dsa.go
@@ -587,12 +568,12 @@
-
+
kem.go
@@ -600,12 +581,12 @@
-
+
key.go
@@ -613,25 +594,18 @@
-
+
-map_pubkeys.go
-
-
+
hashing.go
@@ -639,18 +613,38 @@
-
-
-
-
-
-
-
+
hmac.go
+
+
+
+
+
+
+
+layer1
+
+
+
+
+
+
+
+macro
@@ -658,12 +652,12 @@
-
+
micro
@@ -671,51 +665,38 @@
-
+
message.go
+ data-math="N">cipher.go
-
+
settings.go
+ transform="translate(222.788720,332.355035) scale(0.385945)"
+ style="font-family: Open Sans, verdana, arial, sans-serif !important; font-size: 12px; fill: rgb(0, 0, 0); fill-opacity: 1.00; white-space: pre;"
+ data-math="N">list_ciphers.go
-
+
message.go
-
-
-
-
-
-
-
-conn.go
@@ -723,12 +704,12 @@
-
+
settings.go
@@ -736,12 +717,12 @@
-
+
connkeeper.go
@@ -749,31 +730,31 @@
-
+
+
+
+
+
+
+
settings.go
+ data-math="N">joiner32.go
-
-
-
-
-
-
-
+
database.go
@@ -781,12 +762,38 @@
-
+
message.go
+
+
+
+
+
+
+
+settings.go
+
+
+
+
+
+
+
+client.go
@@ -794,12 +801,25 @@
-
+
message.go
+
+
+
+
+
+
+
+client.go