From 5eda81240c4a5e860fabdf2419a9087d495be272 Mon Sep 17 00:00:00 2001 From: Markus Walther Date: Mon, 2 Dec 2024 23:13:13 +0000 Subject: [PATCH] remove unused encryption support --- README.md | 3 - examples/README.md | 1 - examples/common.go | 3 +- examples/encrypted-net-messages/README.md | 14 --- .../encrypted-net-messages/enc_net_msg.go | 60 ------------- .../enc_net_msg_test.go | 28 ------ pkg/demoinfocs/demoinfocs_test.go | 88 +------------------ pkg/demoinfocs/events/events.go | 10 --- pkg/demoinfocs/matchinfo.go | 27 ------ pkg/demoinfocs/parser.go | 6 -- 10 files changed, 3 insertions(+), 237 deletions(-) delete mode 100644 examples/encrypted-net-messages/README.md delete mode 100644 examples/encrypted-net-messages/enc_net_msg.go delete mode 100644 examples/encrypted-net-messages/enc_net_msg_test.go delete mode 100644 pkg/demoinfocs/matchinfo.go diff --git a/README.md b/README.md index 07c375e6..efe7a19c 100644 --- a/README.md +++ b/README.md @@ -154,13 +154,10 @@ The full API documentation is available here on [pkg.go.dev](https://pkg.go.dev/ * Chat & console messages 1 - [docs](https://pkg.go.dev/github.com/markus-wa/demoinfocs-golang/v4/pkg/demoinfocs/events?tab=doc#ChatMessage) / [example](https://github.com/markus-wa/demoinfocs-golang/tree/master/examples/print-events) * Matchmaking ranks (official MM demos only) - [docs](https://pkg.go.dev/github.com/markus-wa/demoinfocs-golang/v4/pkg/demoinfocs/events?tab=doc#RankUpdate) * Full POV demo support -* Support for encrypted net-messages (if the [decryption key](https://pkg.go.dev/github.com/markus-wa/demoinfocs-golang/v4@master/pkg/demoinfocs#ParserConfig) is provided) * JavaScript (browser / Node.js) support via WebAssembly - [example](https://github.com/markus-wa/demoinfocs-wasm) * [Easy debugging via build-flags](#debugging) * Built with performance & concurrency in mind -1. In MM demos the chat is encrypted, so [`ParserConfig.NetMessageDecryptionKey`](https://pkg.go.dev/github.com/markus-wa/demoinfocs-golang/v4@master/pkg/demoinfocs#ParserConfig) needs to be set - see also [`MatchInfoDecryptionKey()`](https://pkg.go.dev/github.com/markus-wa/demoinfocs-golang/v4@master/pkg/demoinfocs#MatchInfoDecryptionKey). - ## Performance / Benchmarks Two of the top priorities of this parser are performance and concurrency. diff --git a/examples/README.md b/examples/README.md index 72b3d8a1..50a88303 100644 --- a/examples/README.md +++ b/examples/README.md @@ -11,7 +11,6 @@ Here you can find a overview of examples on how to use demoinfocs-golang. |[voice-capture](voice-capture)|Capture voice data from players| |[entities](entities)|Using unhandled data from entities (`Parser.ServerClasses()`)| |[net-messages](net-messages)|Parsing and handling custom net-messages| -|[encrypted-net-messages](encrypted-net-messages)|Parsing and handling encrypted net-messages (e.g. text chat in MM demos)| |[print-events](print-events)|Printing kills, scores & chat messages| |[mocking](mocking)|Using the `fake` package to write unit tests for your code| |[web-assembly](web-assembly)|Using the library from JavaScript (browser/node) with [WebAssembly](https://webassembly.org/)| diff --git a/examples/common.go b/examples/common.go index 90bab480..b0d71d57 100644 --- a/examples/common.go +++ b/examples/common.go @@ -3,7 +3,6 @@ package examples import ( "flag" "io" - "io/ioutil" "os" ) @@ -43,7 +42,7 @@ func RedirectStdout(f func()) { // Discard the output in a separate goroutine so writing to stdout can't block indefinitely go func() { - for err := error(nil); err == nil; _, err = io.Copy(ioutil.Discard, r) { + for err := error(nil); err == nil; _, err = io.Copy(io.Discard, r) { } }() diff --git a/examples/encrypted-net-messages/README.md b/examples/encrypted-net-messages/README.md deleted file mode 100644 index d7dc0054..00000000 --- a/examples/encrypted-net-messages/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Parsing & handling encrypted net-messages - -See also [net-messages](../net-messages) for regular net-messages. - -This example shows how to have the parser deal with encrypted net-messages. - -For Valve MM games, the decryption key can be obtained from `.dem.info` files using `MatchInfoDecryptionKey()`. -The key then needs to be passed to `ParserConfig.NetMessageDecryptionKey`. - -## Run - - go run enc_net_nsg.go -demo path/to/demo.dem -info path/to/demo.dem.info - -This prints chat messages from the passed demo (assuming the `.dem.info` file contains the correct decryption key). diff --git a/examples/encrypted-net-messages/enc_net_msg.go b/examples/encrypted-net-messages/enc_net_msg.go deleted file mode 100644 index 80193c36..00000000 --- a/examples/encrypted-net-messages/enc_net_msg.go +++ /dev/null @@ -1,60 +0,0 @@ -package main - -import ( - "flag" - "io/ioutil" - "log" - "os" - - dem "github.com/markus-wa/demoinfocs-golang/v4/pkg/demoinfocs" - "github.com/markus-wa/demoinfocs-golang/v4/pkg/demoinfocs/events" -) - -func checkErr(err error) { - if err != nil { - panic(err) - } -} - -func main() { - fl := new(flag.FlagSet) - - demPathPtr := fl.String("demo", "", "Demo file `path`") - infoPathPtr := fl.String("info", "", "Info file `path`") - - err := fl.Parse(os.Args[1:]) - checkErr(err) - - demPath := *demPathPtr - infoPath := *infoPathPtr - - infoF, err := os.Open(infoPath) - checkErr(err) - - b, err := ioutil.ReadAll(infoF) - checkErr(err) - - k, err := dem.MatchInfoDecryptionKey(b) - checkErr(err) - - f, err := os.Open(demPath) - checkErr(err) - - defer f.Close() - - cfg := dem.DefaultParserConfig - cfg.NetMessageDecryptionKey = k - - p := dem.NewParserWithConfig(f, cfg) - - p.RegisterEventHandler(func(warn events.ParserWarn) { - log.Println("WARNING:", warn.Message) - }) - - p.RegisterEventHandler(func(message events.ChatMessage) { - log.Println(message) - }) - - err = p.ParseToEnd() - checkErr(err) -} diff --git a/examples/encrypted-net-messages/enc_net_msg_test.go b/examples/encrypted-net-messages/enc_net_msg_test.go deleted file mode 100644 index ae350f58..00000000 --- a/examples/encrypted-net-messages/enc_net_msg_test.go +++ /dev/null @@ -1,28 +0,0 @@ -package main - -import ( - "os" - "testing" -) - -// Just make sure the example runs -func TestEncryptedNetMessages(t *testing.T) { - if testing.Short() { - t.Skip("skipping test") - } - - os.Args = []string{"cmd", "-demo", "../../test/cs-demos/match730_003528806449641685104_1453182610_271.dem", "-info", "../../test/cs-demos/match730_003528806449641685104_1453182610_271.dem.info"} - - main() -} - -// Make sure it doesn't error / crash -func TestEncryptedNetMessages_BadKey(t *testing.T) { - if testing.Short() { - t.Skip("skipping test") - } - - os.Args = []string{"cmd", "-demo", "../../test/cs-demos/match730_003528806449641685104_1453182610_271.dem", "-info", "../../test/cs-demos/match730_003449478367177343081_1946274414_112.dem.info"} - - main() -} diff --git a/pkg/demoinfocs/demoinfocs_test.go b/pkg/demoinfocs/demoinfocs_test.go index 70a0abd8..d7e35ae6 100644 --- a/pkg/demoinfocs/demoinfocs_test.go +++ b/pkg/demoinfocs/demoinfocs_test.go @@ -7,7 +7,6 @@ import ( "flag" "fmt" "io" - "io/ioutil" "os" "regexp" "runtime" @@ -247,89 +246,6 @@ func TestS2POV(t *testing.T) { assertions.NoError(err, "error occurred in ParseToEnd()") } -func TestEncryptedNetMessages(t *testing.T) { - t.Parallel() - - if testing.Short() { - t.Skip("skipping test due to -short flag") - } - - infoF, err := os.Open(csDemosPath + "/match730_003528806449641685104_1453182610_271.dem.info") - assert.NoError(t, err) - - b, err := ioutil.ReadAll(infoF) - assert.NoError(t, err) - - k, err := demoinfocs.MatchInfoDecryptionKey(b) - assert.NoError(t, err) - - f, err := os.Open(csDemosPath + "/match730_003528806449641685104_1453182610_271.dem") - assert.NoError(t, err) - defer mustClose(t, f) - - cfg := demoinfocs.DefaultParserConfig - cfg.NetMessageDecryptionKey = k - - p := demoinfocs.NewParserWithConfig(f, cfg) - - p.RegisterEventHandler(func(message events.ChatMessage) { - t.Log(message) - }) - - err = p.ParseToEnd() - assert.NoError(t, err) -} - -func TestMatchInfoDecryptionKey_Error(t *testing.T) { - _, err := demoinfocs.MatchInfoDecryptionKey([]byte{0}) - assert.Error(t, err) -} - -func TestBadNetMessageDecryptionKey(t *testing.T) { - t.Parallel() - - if testing.Short() { - t.Skip("skipping test due to -short flag") - } - - const ( - demPath = csDemosPath + "/match730_003528806449641685104_1453182610_271.dem" - infoPath = csDemosPath + "/match730_003449478367177343081_1946274414_112.dem.info" - ) - - infoF, err := os.Open(infoPath) - assert.NoError(t, err) - - b, err := ioutil.ReadAll(infoF) - assert.NoError(t, err) - - k, err := demoinfocs.MatchInfoDecryptionKey(b) - assert.NoError(t, err) - - f, err := os.Open(demPath) - assert.NoError(t, err) - - defer f.Close() - - cfg := demoinfocs.DefaultParserConfig - cfg.NetMessageDecryptionKey = k - - p := demoinfocs.NewParserWithConfig(f, cfg) - - var cantReadEncNetMsgWarns []events.ParserWarn - - p.RegisterEventHandler(func(warn events.ParserWarn) { - if warn.Type == events.WarnTypeCantReadEncryptedNetMessage { - cantReadEncNetMsgWarns = append(cantReadEncNetMsgWarns, warn) - } - }) - - err = p.ParseToEnd() - assert.NoError(t, err) - - assert.NotEmpty(t, cantReadEncNetMsgWarns) -} - func TestParseToEnd_Cancel(t *testing.T) { t.Parallel() @@ -605,7 +521,7 @@ func assertGolden(tb testing.TB, assertions *assert.Assertions, testCase string, gzipReader, err := gzip.NewReader(f) assertions.NoError(err, "error creating gzip reader for %q", goldenFile) - expected, err := ioutil.ReadAll(gzipReader) + expected, err := io.ReadAll(gzipReader) assertions.NoError(err, "error reading gzipped data from %q", goldenFile) mustCloseAssert(assertions, gzipReader, f) @@ -627,7 +543,7 @@ func removePointers(s []byte) []byte { } func writeFile(assertions *assert.Assertions, file string, data []byte) { - err := ioutil.WriteFile(file, data, 0600) + err := os.WriteFile(file, data, 0600) assertions.NoError(err, "failed to write to file %q", file) } diff --git a/pkg/demoinfocs/events/events.go b/pkg/demoinfocs/events/events.go index 4dc4960f..c1c50cb6 100644 --- a/pkg/demoinfocs/events/events.go +++ b/pkg/demoinfocs/events/events.go @@ -592,16 +592,6 @@ const ( WarnTypeTeamSwapPlayerNil // TODO: figure out why this happens WarnTypeGameEventBeforeDescriptors // may occur in POV demos WarnUnknownDemoCommandMessageType // occur when we have an unknown EDemoCommands message type, the protobuf messages probably need to be updated - - // WarnTypeMissingNetMessageDecryptionKey occurs when encrypted net-messages are encountered and the decryption key is missing. - // See ParserConfig.NetMessageDecryptionKey - WarnTypeMissingNetMessageDecryptionKey - - // WarnTypeCantReadEncryptedNetMessage occurs when an encrypted net-messages can't be decrypted even though the decryption key is set. - // May occur because the decryption key used is incorrect. - // See ParserConfig.NetMessageDecryptionKey - WarnTypeCantReadEncryptedNetMessage - WarnTypeUnknownEquipmentIndex WarnTypeMissingItemDefinitionIndex WarnTypeStringTableParsingFailure // Should happen only with CS2 POV demos diff --git a/pkg/demoinfocs/matchinfo.go b/pkg/demoinfocs/matchinfo.go deleted file mode 100644 index 7421871b..00000000 --- a/pkg/demoinfocs/matchinfo.go +++ /dev/null @@ -1,27 +0,0 @@ -package demoinfocs - -import ( - "fmt" - "strings" - - "github.com/pkg/errors" - "google.golang.org/protobuf/proto" - - "github.com/markus-wa/demoinfocs-golang/v4/pkg/demoinfocs/msgs2" -) - -// MatchInfoDecryptionKey extracts the net-message decryption key stored in `match730_*.dem.info`. -// Pass the whole contents of `match730_*.dem.info` to this function to get the key. -// See also: ParserConfig.NetMessageDecryptionKey -func MatchInfoDecryptionKey(b []byte) ([]byte, error) { - m := new(msgs2.CDataGCCStrike15V2_MatchInfo) - - err := proto.Unmarshal(b, m) - if err != nil { - return nil, errors.Wrap(err, "failed to unmarshal MatchInfo message") - } - - k := []byte(strings.ToUpper(fmt.Sprintf("%016x", m.Watchablematchinfo.GetClDecryptdataKeyPub()))) - - return k, nil -} diff --git a/pkg/demoinfocs/parser.go b/pkg/demoinfocs/parser.go index 362ccfa7..578c242f 100644 --- a/pkg/demoinfocs/parser.go +++ b/pkg/demoinfocs/parser.go @@ -80,7 +80,6 @@ type parser struct { demoInfoProvider demoInfoProvider // Provides demo infos to other packages that the core package depends on err error // Contains a error that occurred during parsing if any errLock sync.Mutex // Used to sync up error mutations between parsing & handling go-routines - decryptionKey []byte // Stored in `match730_*.dem.info` see MatchInfoDecryptionKey(). source2FallbackGameEventListBin []byte // sv_hibernate_when_empty bug workaround ignorePacketEntitiesPanic bool // Used to ignore PacketEntities parsing panics (some POV demos seem to have broken rare broken PacketEntities) /** @@ -347,10 +346,6 @@ type ParserConfig struct { // See https://github.com/markus-wa/demoinfocs-golang/issues/314 IgnoreErrBombsiteIndexNotFound bool - // NetMessageDecryptionKey tells the parser how to decrypt certain encrypted net-messages. - // See MatchInfoDecryptionKey() on how to retrieve the key from `match730_*.dem.info` files. - NetMessageDecryptionKey []byte - // DisableMimicSource1Events tells the parser to not mimic Source 1 game events for Source 2 demos. // Unfortunately Source 2 demos *may* not contain Source 1 game events, that's why the parser will try to mimic them. // It has an impact only with Source 2 demos and is false by default. @@ -392,7 +387,6 @@ func NewParserWithConfig(demostream io.Reader, config ParserConfig) Parser { p.gameEventHandler = newGameEventHandler(&p, config.IgnoreErrBombsiteIndexNotFound) p.bombsiteA.index = -1 p.bombsiteB.index = -1 - p.decryptionKey = config.NetMessageDecryptionKey p.recordingPlayerSlot = -1 p.disableMimicSource1GameEvents = config.DisableMimicSource1Events p.source2FallbackGameEventListBin = config.Source2FallbackGameEventListBin