Skip to content

Commit 3df9b7b

Browse files
authored
raise ParserWarn instead of error on bad net-message decryption key (#342)
fixes #326
1 parent 7002436 commit 3df9b7b

File tree

6 files changed

+90
-4
lines changed

6 files changed

+90
-4
lines changed

examples/encrypted-net-messages/enc_net_msg.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ func main() {
4747

4848
p := dem.NewParserWithConfig(f, cfg)
4949

50+
p.RegisterEventHandler(func(warn events.ParserWarn) {
51+
log.Println("WARNING:", warn.Message)
52+
})
53+
5054
p.RegisterEventHandler(func(message events.ChatMessage) {
5155
log.Println(message)
5256
})

examples/encrypted-net-messages/enc_net_msg_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,14 @@ func TestEncryptedNetMessages(t *testing.T) {
1515

1616
main()
1717
}
18+
19+
// Make sure it doesn't error / crash
20+
func TestEncryptedNetMessages_BadKey(t *testing.T) {
21+
if testing.Short() {
22+
t.Skip("skipping test")
23+
}
24+
25+
os.Args = []string{"cmd", "-demo", "../../test/cs-demos/match730_003528806449641685104_1453182610_271.dem", "-info", "../../test/cs-demos/match730_003449478367177343081_1946274414_112.dem.info"}
26+
27+
main()
28+
}

pkg/demoinfocs/demoinfocs_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,51 @@ func TestUnexpectedEndOfDemo(t *testing.T) {
282282
assert.Equal(t, demoinfocs.ErrUnexpectedEndOfDemo, err, "parsing cancelled but error was not ErrUnexpectedEndOfDemo")
283283
}
284284

285+
func TestBadNetMessageDecryptionKey(t *testing.T) {
286+
t.Parallel()
287+
288+
if testing.Short() {
289+
t.Skip("skipping test due to -short flag")
290+
}
291+
292+
const (
293+
demPath = csDemosPath + "/match730_003528806449641685104_1453182610_271.dem"
294+
infoPath = csDemosPath + "/match730_003449478367177343081_1946274414_112.dem.info"
295+
)
296+
297+
infoF, err := os.Open(infoPath)
298+
assert.NoError(t, err)
299+
300+
b, err := ioutil.ReadAll(infoF)
301+
assert.NoError(t, err)
302+
303+
k, err := demoinfocs.MatchInfoDecryptionKey(b)
304+
assert.NoError(t, err)
305+
306+
f, err := os.Open(demPath)
307+
assert.NoError(t, err)
308+
309+
defer f.Close()
310+
311+
cfg := demoinfocs.DefaultParserConfig
312+
cfg.NetMessageDecryptionKey = k
313+
314+
p := demoinfocs.NewParserWithConfig(f, cfg)
315+
316+
var cantReadEncNetMsgWarns []events.ParserWarn
317+
318+
p.RegisterEventHandler(func(warn events.ParserWarn) {
319+
if warn.Type == events.WarnTypeCantReadEncryptedNetMessage {
320+
cantReadEncNetMsgWarns = append(cantReadEncNetMsgWarns, warn)
321+
}
322+
})
323+
324+
err = p.ParseToEnd()
325+
assert.NoError(t, err)
326+
327+
assert.NotEmpty(t, cantReadEncNetMsgWarns)
328+
}
329+
285330
func TestParseToEnd_Cancel(t *testing.T) {
286331
t.Parallel()
287332

pkg/demoinfocs/events/events.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -523,9 +523,14 @@ const (
523523
WarnTypeTeamSwapPlayerNil // TODO: figure out why this happens
524524
WarnTypeGameEventBeforeDescriptors // may occur in POV demos
525525

526-
// WarnTypeMissingNetMessageDecryptionKey occurs when encrypted net-messages are encountered and the decryption key is missing
526+
// WarnTypeMissingNetMessageDecryptionKey occurs when encrypted net-messages are encountered and the decryption key is missing.
527527
// See ParserConfig.NetMessageDecryptionKey
528528
WarnTypeMissingNetMessageDecryptionKey
529+
530+
// WarnTypeCantReadEncryptedNetMessage occurs when an encrypted net-messages can't be decrypted even though the decryption key is set.
531+
// May occur because the decryption key used is incorrect.
532+
// See ParserConfig.NetMessageDecryptionKey
533+
WarnTypeCantReadEncryptedNetMessage
529534
)
530535

531536
// ParserWarn signals that a non-fatal problem occurred during parsing.

pkg/demoinfocs/net_messages.go

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"encoding/binary"
66

77
"github.com/gogo/protobuf/proto"
8-
"github.com/markus-wa/go-unassert"
98
"github.com/markus-wa/ice-cipher-go/pkg/ice"
109

1110
bit "github.com/markus-wa/demoinfocs-golang/v2/internal/bitread"
@@ -97,13 +96,35 @@ func (p *parser) handleEncryptedData(msg *msg.CSVCMsg_EncryptedData) {
9796
r := bytes.NewReader(b)
9897
br := bit.NewSmallBitReader(r)
9998

99+
const (
100+
byteLenPadding = 1
101+
byteLenWritten = 4
102+
)
103+
100104
paddingBytes := br.ReadSingleByte()
105+
106+
if int(paddingBytes) >= len(b)-byteLenPadding-byteLenWritten {
107+
p.eventDispatcher.Dispatch(events.ParserWarn{
108+
Message: "encrypted net-message has invalid number of padding bytes",
109+
Type: events.WarnTypeCantReadEncryptedNetMessage,
110+
})
111+
112+
return
113+
}
114+
101115
br.Skip(int(paddingBytes) << 3)
102116

103117
bBytesWritten := br.ReadBytes(4)
104118
nBytesWritten := int(binary.BigEndian.Uint32(bBytesWritten))
105119

106-
unassert.Same(len(b), 5+int(paddingBytes)+nBytesWritten)
120+
if len(b) != byteLenPadding+byteLenWritten+int(paddingBytes)+nBytesWritten {
121+
p.eventDispatcher.Dispatch(events.ParserWarn{
122+
Message: "encrypted net-message has invalid length",
123+
Type: events.WarnTypeCantReadEncryptedNetMessage,
124+
})
125+
126+
return
127+
}
107128

108129
cmd := br.ReadVarInt32()
109130
size := br.ReadVarInt32()

test/cs-demos

Submodule cs-demos updated from 6ec2aac to e970099

0 commit comments

Comments
 (0)