crypto_stream_manager.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package quic
  2. import (
  3. "fmt"
  4. "v2ray.com/core/external/github.com/lucas-clemente/quic-go/internal/protocol"
  5. "v2ray.com/core/external/github.com/lucas-clemente/quic-go/internal/wire"
  6. )
  7. type cryptoDataHandler interface {
  8. HandleMessage([]byte, protocol.EncryptionLevel) bool
  9. }
  10. type cryptoStreamManager struct {
  11. cryptoHandler cryptoDataHandler
  12. initialStream cryptoStream
  13. handshakeStream cryptoStream
  14. }
  15. func newCryptoStreamManager(
  16. cryptoHandler cryptoDataHandler,
  17. initialStream cryptoStream,
  18. handshakeStream cryptoStream,
  19. ) *cryptoStreamManager {
  20. return &cryptoStreamManager{
  21. cryptoHandler: cryptoHandler,
  22. initialStream: initialStream,
  23. handshakeStream: handshakeStream,
  24. }
  25. }
  26. func (m *cryptoStreamManager) HandleCryptoFrame(frame *wire.CryptoFrame, encLevel protocol.EncryptionLevel) (bool /* encryption level changed */, error) {
  27. var str cryptoStream
  28. switch encLevel {
  29. case protocol.EncryptionInitial:
  30. str = m.initialStream
  31. case protocol.EncryptionHandshake:
  32. str = m.handshakeStream
  33. default:
  34. return false, fmt.Errorf("received CRYPTO frame with unexpected encryption level: %s", encLevel)
  35. }
  36. if err := str.HandleCryptoFrame(frame); err != nil {
  37. return false, err
  38. }
  39. for {
  40. data := str.GetCryptoData()
  41. if data == nil {
  42. return false, nil
  43. }
  44. if encLevelFinished := m.cryptoHandler.HandleMessage(data, encLevel); encLevelFinished {
  45. return true, str.Finish()
  46. }
  47. }
  48. }