From 499388d726541d3cd370569b39267eba2800637b Mon Sep 17 00:00:00 2001 From: number571 Date: Fri, 22 May 2026 12:04:31 +0700 Subject: [PATCH] update --- .../scheme/layer2/hybrid/scheme_test.go | 10 + pkg/crypto/scheme/layer2/symmetric/errors.go | 14 +- pkg/crypto/scheme/layer2/symmetric/scheme.go | 23 +- .../scheme/layer2/symmetric/scheme_test.go | 62 +++- pkg/crypto/symmetric/cipher_test.go | 14 +- pkg/types/types_test.go | 13 + test/result/badge_codelines.svg | 2 +- test/result/badge_coverage.svg | 2 +- test/result/coverage.svg | 264 +++++++++--------- 9 files changed, 243 insertions(+), 161 deletions(-) diff --git a/pkg/crypto/scheme/layer2/hybrid/scheme_test.go b/pkg/crypto/scheme/layer2/hybrid/scheme_test.go index b3e2a0f0..0c97fc79 100644 --- a/pkg/crypto/scheme/layer2/hybrid/scheme_test.go +++ b/pkg/crypto/scheme/layer2/hybrid/scheme_test.go @@ -79,6 +79,16 @@ func TestInvalidKeys(t *testing.T) { t.Error("success decrypt with invalid privkey") return } + + _key := make([]byte, symmetric.CCipherKeySize) + if _, _, err := _scheme.DecryptMessage(symmetric.NewCipherCFB(_key), enc); err == nil { + t.Error("success decrypt with another key type") + return + } + if _, err := _scheme.EncryptMessage(symmetric.NewCipherCFB(_key), enc); err == nil { + t.Error("success encrypt with another key type") + return + } } func TestInvalidScheme(t *testing.T) { diff --git a/pkg/crypto/scheme/layer2/symmetric/errors.go b/pkg/crypto/scheme/layer2/symmetric/errors.go index 018f8cde..fb60810d 100644 --- a/pkg/crypto/scheme/layer2/symmetric/errors.go +++ b/pkg/crypto/scheme/layer2/symmetric/errors.go @@ -4,18 +4,18 @@ const ( errPrefix = "pkg/crypto/scheme/layer2/symmetric = " ) -type SClientError struct { +type SError struct { str string } -func (err *SClientError) Error() string { +func (err *SError) Error() string { return errPrefix + err.str } var ( - ErrInvalidKeyType = &SClientError{"invalid key type"} - ErrDecryptMessage = &SClientError{"decrypt message"} - ErrLimitMessageSize = &SClientError{"limit message size"} - ErrMessageSize = &SClientError{"message size"} - ErrDecodeMessage = &SClientError{"decode message"} + ErrInvalidKeyType = &SError{"invalid key type"} + ErrDecryptMessage = &SError{"decrypt message"} + ErrLimitMessageSize = &SError{"limit message size"} + ErrInvalidMessageSize = &SError{"invalidmessage size"} + ErrDecodeMessage = &SError{"decode message"} ) diff --git a/pkg/crypto/scheme/layer2/symmetric/scheme.go b/pkg/crypto/scheme/layer2/symmetric/scheme.go index 4bf04f09..7feab57f 100644 --- a/pkg/crypto/scheme/layer2/symmetric/scheme.go +++ b/pkg/crypto/scheme/layer2/symmetric/scheme.go @@ -15,7 +15,7 @@ var ( ) const ( - cSaltSize = 16 // bytes + cSaltSize = 16 // salt for key generation ) type sScheme struct { @@ -30,10 +30,7 @@ func NewScheme(pMessageSize uint64) layer2.IScheme { encKey := make([]byte, symmetric.CCipherKeySize) cipher := symmetric.NewCipherGCM(encKey) - encMsg, err := scheme.encryptWithPadding(cipher, []byte{}, 0) - if err != nil { - panic(err) - } + encMsg := scheme.encryptWithPadding(cipher, []byte{}, 0) structSize := uint64(len(encMsg)) if pMessageSize <= structSize { @@ -68,19 +65,17 @@ func (p *sScheme) EncryptMessage(pRecv layer2.IParticipantKey, pMsg []byte) ([]b if resultSize > payloadLimit { return nil, ErrLimitMessageSize } - return p.encryptWithPadding(recv, pMsg, payloadLimit-resultSize) + return p.encryptWithPadding(recv, pMsg, payloadLimit-resultSize), nil } func (p *sScheme) DecryptMessage(pListKeys layer2.IKeysContainer, pMsg []byte) (layer2.IParticipantKey, []byte, error) { - var lenMsg = len(pMsg) - if (uint64(lenMsg) != p.fMessageSize) || (lenMsg < cSaltSize+encoding.CSizeUint32) { - return nil, nil, ErrMessageSize - } - listCiphers, ok := pListKeys.(symmetric.IListCiphers) if !ok { return nil, nil, ErrInvalidKeyType } + if uint64(len(pMsg)) != p.fMessageSize { + return nil, nil, ErrInvalidMessageSize + } salt := pMsg[:cSaltSize] list := listCiphers.Get() @@ -91,7 +86,7 @@ func (p *sScheme) DecryptMessage(pListKeys layer2.IKeysContainer, pMsg []byte) ( cipher := symmetric.NewCipherGCM(encKey) decMsg := cipher.DecryptBytes(pMsg[cSaltSize:]) - if len(decMsg) < encoding.CSizeUint32 { + if decMsg == nil { continue } @@ -114,7 +109,7 @@ func (p *sScheme) encryptWithPadding( pCipher symmetric.ICipher, pMsg []byte, pPadd uint64, -) ([]byte, error) { +) []byte { var ( rand = random.NewRandom() salt = rand.GetBytes(cSaltSize) @@ -128,5 +123,5 @@ func (p *sScheme) encryptWithPadding( return bytes.Join([][]byte{ salt, symmetric.NewCipherGCM(encKey).EncryptBytes(data), - }, []byte{}), nil + }, []byte{}) } diff --git a/pkg/crypto/scheme/layer2/symmetric/scheme_test.go b/pkg/crypto/scheme/layer2/symmetric/scheme_test.go index 94cfcf75..664c5291 100644 --- a/pkg/crypto/scheme/layer2/symmetric/scheme_test.go +++ b/pkg/crypto/scheme/layer2/symmetric/scheme_test.go @@ -2,13 +2,41 @@ package symmetric import ( "bytes" - "fmt" "testing" + "github.com/number571/go-peer/pkg/crypto/asymmetric" "github.com/number571/go-peer/pkg/crypto/random" "github.com/number571/go-peer/pkg/crypto/symmetric" ) +func TestError(t *testing.T) { + t.Parallel() + + str := "value" + err := &SError{str} + if err.Error() != errPrefix+str { + t.Error("incorrect err.Error()") + return + } +} + +func TestPanicNewScheme(t *testing.T) { + t.Parallel() + + tcNewSchemeWithSmallMsgSize(t) +} + +func tcNewSchemeWithSmallMsgSize(t *testing.T) { + defer func() { + if r := recover(); r == nil { + t.Error("nothing panics") + return + } + }() + + _ = NewScheme(8) +} + func TestScheme(t *testing.T) { t.Parallel() @@ -22,6 +50,9 @@ func TestScheme(t *testing.T) { if err != nil { t.Fatal(err) } + if _, err := scheme.EncryptMessage(key, make([]byte, 256)); err == nil { + t.Fatal("success encrypt message with overflow") + } listCiphers := symmetric.NewListCiphers() listCiphers.Add(symmetric.NewCipherGCM(key.ToBytes())) @@ -30,16 +61,37 @@ func TestScheme(t *testing.T) { if err != nil { t.Fatal(err) } + if _, _, err := scheme.DecryptMessage(listCiphers, []byte{}); err == nil { + t.Fatal("success decrypt with invalid message size") + } + + anotherListCiphers := symmetric.NewListCiphers() + anotherListCiphers.Add(symmetric.NewCipherGCM(make([]byte, symmetric.CCipherKeySize))) + if _, _, err := scheme.DecryptMessage(anotherListCiphers, encMsg); err == nil { + t.Fatal("success decrypt with undefined key") + } if !bytes.Equal(key.ToBytes(), gotKey.ToBytes()) { t.Fatal("keys are diff") } if !bytes.Equal(msg, gotMsg) { - fmt.Println(string(gotMsg)) t.Fatal("msgs are diff") } - fmt.Println(scheme.GetMessageSize()) - fmt.Println(scheme.GetMessageSize() - scheme.GetPayloadLimit()) - fmt.Println(scheme.GetPayloadLimit()) + if _, _, err := scheme.DecryptMessage(asymmetric.NewMapPubKeys(), []byte{}); err == nil { + t.Error("success decrypt with another key type") + return + } + if _, err := scheme.EncryptMessage(asymmetric.NewPrivKey().GetPubKey(), []byte{}); err == nil { + t.Error("success encrypt with another key type") + return + } + + if scheme.GetRandomKey().ToString() == scheme.GetRandomKey().ToString() { //nolint:staticcheck + t.Fatal("random got equal values") + } + + // fmt.Println(scheme.GetMessageSize()) + // fmt.Println(scheme.GetMessageSize() - scheme.GetPayloadLimit()) + // fmt.Println(scheme.GetPayloadLimit()) } diff --git a/pkg/crypto/symmetric/cipher_test.go b/pkg/crypto/symmetric/cipher_test.go index 718e035b..a25eaccb 100644 --- a/pkg/crypto/symmetric/cipher_test.go +++ b/pkg/crypto/symmetric/cipher_test.go @@ -2,6 +2,7 @@ package symmetric import ( "bytes" + "crypto/des" //nolint:gosec "testing" "github.com/number571/go-peer/pkg/encoding" @@ -25,7 +26,6 @@ func testPanicEncrypt(t *testing.T) { return } }() - cipher := &sAESCipher{fMode: 999} _ = cipher.EncryptBytes([]byte{}) } @@ -94,4 +94,16 @@ func testEncrypt(t *testing.T, c func(pKey []byte) ICipher) { if cipher.ToString() != encoding.HexEncode(tgKey) { t.Fatal("string key not equal") } + + block, err := des.NewCipher([]byte("abcdefgh")) //nolint:gosec + if err != nil { + t.Fatal(err) + } + anotherCipher := &sAESCipher{fMode: modeGCM, fBlock: block} + if m := anotherCipher.encryptBytesGCM([]byte{}); m != nil { + t.Fatal("success encrypt message with another cipher") + } + if m := anotherCipher.decryptBytesGCM([]byte{}); m != nil { + t.Fatal("success decrypt message with another cipher") + } } diff --git a/pkg/types/types_test.go b/pkg/types/types_test.go index 14e90669..dd7a7da5 100644 --- a/pkg/types/types_test.go +++ b/pkg/types/types_test.go @@ -12,6 +12,19 @@ type tsSomeStruct struct { N int `json:"n"` } +func TestPanic(t *testing.T) { + t.Parallel() + + defer func() { + if r := recover(); r == nil { + t.Error("nothing panics") + return + } + }() + + _ = NewConverter(func() {}) +} + func TestConverter(t *testing.T) { t.Parallel() diff --git a/test/result/badge_codelines.svg b/test/result/badge_codelines.svg index a7ec5d1b..0f13ba68 100644 --- a/test/result/badge_codelines.svg +++ b/test/result/badge_codelines.svg @@ -1 +1 @@ -code lines: 13125code lines13125 \ No newline at end of file +code lines: 13207code lines13207 \ No newline at end of file diff --git a/test/result/badge_coverage.svg b/test/result/badge_coverage.svg index 09558fd2..65824887 100644 --- a/test/result/badge_coverage.svg +++ b/test/result/badge_coverage.svg @@ -1 +1 @@ -coverage: 95%coverage95% \ No newline at end of file +coverage: 96%coverage96% \ No newline at end of file diff --git a/test/result/coverage.svg b/test/result/coverage.svg index bb54ce34..bddf977b 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,12 +91,12 @@ - + network @@ -104,12 +104,12 @@ - + payload @@ -117,12 +117,12 @@ - + state @@ -130,12 +130,12 @@ - + storage @@ -143,25 +143,25 @@ - + types/converter.go - + action.go @@ -169,18 +169,18 @@ - + - + anonymity.go @@ -188,18 +188,18 @@ - + - + head.go @@ -207,12 +207,12 @@ - + logger/log_builder.go @@ -220,12 +220,12 @@ - + queue @@ -233,12 +233,12 @@ - + settings.go @@ -246,12 +246,12 @@ - + asymmetric @@ -259,12 +259,12 @@ - + hashing @@ -272,18 +272,18 @@ - + - + puzzle/puzzle.go @@ -291,12 +291,12 @@ - + random/random.go @@ -304,25 +304,25 @@ - + scheme - + symmetric @@ -330,12 +330,12 @@ - + bytes.go @@ -343,30 +343,30 @@ - + - + - + - + serialize_yaml.go @@ -374,12 +374,12 @@ - + logger.go @@ -387,18 +387,18 @@ - + - + conn @@ -406,12 +406,12 @@ - + connkeeper @@ -419,12 +419,12 @@ - + network.go @@ -432,12 +432,12 @@ - + settings.go @@ -445,12 +445,12 @@ - + joiner @@ -458,12 +458,12 @@ - + payload32.go @@ -471,12 +471,12 @@ - + payload64.go @@ -484,12 +484,12 @@ - + state.go @@ -497,12 +497,12 @@ - + cache/lru.go @@ -510,12 +510,12 @@ - + database @@ -523,18 +523,18 @@ - + - + queue.go @@ -542,12 +542,12 @@ - + settings.go @@ -555,12 +555,12 @@ - + dsa.go @@ -568,12 +568,12 @@ - + kem.go @@ -581,12 +581,12 @@ - + key.go @@ -594,12 +594,12 @@ - + map_pubkeys.go @@ -607,12 +607,12 @@ - + hashing.go @@ -620,12 +620,12 @@ - + hmac.go @@ -633,12 +633,12 @@ - + layer1 @@ -646,25 +646,25 @@ - + layer2 - + cfb.go @@ -672,31 +672,31 @@ - + - + gcm.go - + list_ciphers.go @@ -704,12 +704,12 @@ - + conn.go @@ -717,12 +717,12 @@ - + settings.go @@ -730,12 +730,12 @@ - + connkeeper.go @@ -743,18 +743,18 @@ - + - + joiner32.go @@ -762,12 +762,12 @@ - + database.go @@ -775,12 +775,12 @@ - + message.go @@ -788,13 +788,13 @@ - + - + - + symmetric - + - + scheme.go @@ -839,13 +839,13 @@ - + scheme.go