extractCryptoFrames extracts all CRYPTO frames from decrypted packet data
(data []byte)
| 549 | |
| 550 | // extractCryptoFrames extracts all CRYPTO frames from decrypted packet data |
| 551 | func 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 | } |
no test coverage detected