MCPcopy Create free account
hub / github.com/HyBuildNet/quic-relay / extractCryptoFrames

Function extractCryptoFrames

internal/proxy/parser.go:551–655  ·  view source on GitHub ↗

extractCryptoFrames extracts all CRYPTO frames from decrypted packet data

(data []byte)

Source from the content-addressed store, hash-verified

549
550// extractCryptoFrames extracts all CRYPTO frames from decrypted packet data
551func extractCryptoFrames(data []byte) []CryptoFrame {
552 var frames []CryptoFrame
553 offset := 0
554
555 for offset < len(data) {
556 frameType, n, err := readVarInt(data[offset:])
557 if err != nil {
558 break
559 }
560 offset += n
561
562 switch frameType {
563 case 0x00: // PADDING
564 // Skip padding bytes
565 for offset < len(data) && data[offset] == 0x00 {
566 offset++
567 }
568 case 0x01: // PING
569 // No payload
570 case 0x02, 0x03: // ACK (RFC 9000 Section 19.3)
571 // Largest Acknowledged
572 if _, n, err := readVarInt(data[offset:]); err != nil {
573 return frames
574 } else {
575 offset += n
576 }
577 // ACK Delay
578 if _, n, err := readVarInt(data[offset:]); err != nil {
579 return frames
580 } else {
581 offset += n
582 }
583 // ACK Range Count
584 rangeCount, n, err := readVarInt(data[offset:])
585 if err != nil {
586 return frames
587 }
588 offset += n
589 // First ACK Range
590 if _, n, err := readVarInt(data[offset:]); err != nil {
591 return frames
592 } else {
593 offset += n
594 }
595 // ACK Ranges
596 for i := uint64(0); i < rangeCount; i++ {
597 // Gap
598 if _, n, err := readVarInt(data[offset:]); err != nil {
599 return frames
600 } else {
601 offset += n
602 }
603 // ACK Range Length
604 if _, n, err := readVarInt(data[offset:]); err != nil {
605 return frames
606 } else {
607 offset += n
608 }

Callers 2

parseFramesFunction · 0.85

Calls 1

readVarIntFunction · 0.85

Tested by

no test coverage detected