github.com/mikelsr/quic-go@v0.36.1-0.20230701132136-1d9415b66898/crypto_stream_manager.go (about) 1 package quic 2 3 import ( 4 "fmt" 5 6 "github.com/mikelsr/quic-go/internal/protocol" 7 "github.com/mikelsr/quic-go/internal/wire" 8 ) 9 10 type cryptoDataHandler interface { 11 HandleMessage([]byte, protocol.EncryptionLevel) error 12 } 13 14 type cryptoStreamManager struct { 15 cryptoHandler cryptoDataHandler 16 17 initialStream cryptoStream 18 handshakeStream cryptoStream 19 oneRTTStream cryptoStream 20 } 21 22 func newCryptoStreamManager( 23 cryptoHandler cryptoDataHandler, 24 initialStream cryptoStream, 25 handshakeStream cryptoStream, 26 oneRTTStream cryptoStream, 27 ) *cryptoStreamManager { 28 return &cryptoStreamManager{ 29 cryptoHandler: cryptoHandler, 30 initialStream: initialStream, 31 handshakeStream: handshakeStream, 32 oneRTTStream: oneRTTStream, 33 } 34 } 35 36 func (m *cryptoStreamManager) HandleCryptoFrame(frame *wire.CryptoFrame, encLevel protocol.EncryptionLevel) error { 37 var str cryptoStream 38 //nolint:exhaustive // CRYPTO frames cannot be sent in 0-RTT packets. 39 switch encLevel { 40 case protocol.EncryptionInitial: 41 str = m.initialStream 42 case protocol.EncryptionHandshake: 43 str = m.handshakeStream 44 case protocol.Encryption1RTT: 45 str = m.oneRTTStream 46 default: 47 return fmt.Errorf("received CRYPTO frame with unexpected encryption level: %s", encLevel) 48 } 49 if err := str.HandleCryptoFrame(frame); err != nil { 50 return err 51 } 52 for { 53 data := str.GetCryptoData() 54 if data == nil { 55 return nil 56 } 57 if err := m.cryptoHandler.HandleMessage(data, encLevel); err != nil { 58 return err 59 } 60 } 61 } 62 63 func (m *cryptoStreamManager) GetPostHandshakeData(maxSize protocol.ByteCount) *wire.CryptoFrame { 64 if !m.oneRTTStream.HasData() { 65 return nil 66 } 67 return m.oneRTTStream.PopCryptoFrame(maxSize) 68 } 69 70 func (m *cryptoStreamManager) Drop(encLevel protocol.EncryptionLevel) error { 71 //nolint:exhaustive // 1-RTT keys should never get dropped. 72 switch encLevel { 73 case protocol.EncryptionInitial: 74 return m.initialStream.Finish() 75 case protocol.EncryptionHandshake: 76 return m.handshakeStream.Finish() 77 case protocol.Encryption0RTT: 78 return nil 79 default: 80 panic(fmt.Sprintf("dropped unexpected encryption level: %s", encLevel)) 81 } 82 }