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 @@ -code lines: 11707code lines11707 \ No newline at end of file +code lines: 11224code lines11224 \ 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 @@ -coverage: 96%coverage96% \ No newline at end of file +coverage: 95%coverage95% \ 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