SwiftQuic
SwiftQuic is an open-source Swift implementation of the QUIC protocol.
⚠️ This implementation is under heavy development and is not ready for production!
Current Progress
- Complete a standard handshake using TLS 1.3
- Open a stream and echo data
Note: The above can be done between either...
- A Swift Server and Client or
- Between Swift and Go (using the Go Quic library)
- Check out the GoInteropTests for more info.
How It Works
- All of the Crypto stuff is mostly contained within the Crypto folder and the
PacketProtectorHandler
- The NIO Pipeline configuration is discussed here
- The TLS Handshake uses a slightly modified version of
swift-nio-ssl
available here - The main connection logic is handled in the
read
andwrite
methods of the Client and Server Handlers for the time being (these will eventually be merged into a more generalized StateHandler).
TODO's
- A proper / robust Handshake algorithm that handles versions negotiation, 0RTT data, etc...
- A proper / robust ACK Handler / Emitter
- A proper / robust Connection Muxer
- A proper / robust Stream Muxer
- Connection State Management
- Stream State Management
- Connection and Stream termination / clean up
- HTTP3 support
- Connection and Stream API
- ... Everything else 😅
There's loads to do, so if you can, please feel free to contribute to the project 🤝
If you have any questions or comments please start a discussion, we're happy to chat!
Credit
- SwiftNIO - Most of the NIO networking code is heavily inspired by existing NIO projects. Massive thanks and credit to the SwiftNIO team.
- Quiche
- Go Quic
- Kenneth Laskoski for kickstarting this effort!