feat(protocol): carry complete encoded media frames
This commit is contained in:
@@ -14,11 +14,6 @@ import (
|
||||
protocol "git.sechmachine.io.vn/sechmachine/VerseVDI-Protocol/gen/go/protocol"
|
||||
)
|
||||
|
||||
const (
|
||||
datagramHeaderBytes = 21
|
||||
maximumFrameBytes = 65536
|
||||
)
|
||||
|
||||
func main() {
|
||||
entries, err := os.ReadDir("fixtures/conformance")
|
||||
if err != nil {
|
||||
@@ -320,16 +315,24 @@ func classifyDatagram(encoded string) string {
|
||||
if err != nil {
|
||||
return "invalid:hex"
|
||||
}
|
||||
if len(raw) < datagramHeaderBytes {
|
||||
if len(raw) < 3 {
|
||||
return "invalid:truncated"
|
||||
}
|
||||
if string(raw[:2]) != "VD" {
|
||||
return "invalid:magic"
|
||||
}
|
||||
if raw[2] != 1 {
|
||||
if raw[2] != 1 && raw[2] != 2 {
|
||||
return "invalid:unsupported_version"
|
||||
}
|
||||
headerBytes := 21
|
||||
limits := map[byte]int{1: 1024, 2: 2048, 3: 65515, 10: 1179, 11: 1179, 12: 1179}
|
||||
if raw[2] == 2 {
|
||||
headerBytes = 23
|
||||
limits = map[byte]int{10: 1177, 11: 1177}
|
||||
}
|
||||
if len(raw) < headerBytes {
|
||||
return "invalid:truncated"
|
||||
}
|
||||
limit, ok := limits[raw[3]]
|
||||
if !ok {
|
||||
return "invalid:unknown_channel"
|
||||
@@ -337,17 +340,27 @@ func classifyDatagram(encoded string) string {
|
||||
if raw[4] != 0 {
|
||||
return "invalid:flags"
|
||||
}
|
||||
if raw[18] == 0 || raw[17] >= raw[18] {
|
||||
fragmentIndex, fragmentCount := int(raw[17]), int(raw[18])
|
||||
payloadOffset := 19
|
||||
if raw[2] == 2 {
|
||||
fragmentIndex = int(raw[17])<<8 | int(raw[18])
|
||||
fragmentCount = int(raw[19])<<8 | int(raw[20])
|
||||
payloadOffset = 21
|
||||
if fragmentCount > 891 {
|
||||
return "invalid:fragment_limit"
|
||||
}
|
||||
}
|
||||
if fragmentCount == 0 || fragmentIndex >= fragmentCount {
|
||||
return "invalid:fragment"
|
||||
}
|
||||
payloadLength := int(raw[19])<<8 | int(raw[20])
|
||||
payloadLength := int(raw[payloadOffset])<<8 | int(raw[payloadOffset+1])
|
||||
if payloadLength > limit {
|
||||
return "invalid:payload_limit"
|
||||
}
|
||||
if len(raw) != datagramHeaderBytes+payloadLength {
|
||||
if len(raw) != headerBytes+payloadLength {
|
||||
return "invalid:length_mismatch"
|
||||
}
|
||||
if len(raw) > maximumFrameBytes {
|
||||
if raw[2] == 1 && len(raw) > 65536 || raw[2] == 2 && len(raw) > 1200 {
|
||||
return "invalid:frame_limit"
|
||||
}
|
||||
return "valid"
|
||||
|
||||
Reference in New Issue
Block a user