ss2022.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package shadowsocks2022
  2. import (
  3. "crypto/cipher"
  4. "github.com/lunixbochs/struc"
  5. "github.com/v2fly/v2ray-core/v5/common/net"
  6. "github.com/v2fly/v2ray-core/v5/common/protocol"
  7. "io"
  8. )
  9. //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen
  10. type KeyDerivation interface {
  11. GetSessionSubKey(effectivePsk, Salt []byte, OutKey []byte) error
  12. GetIdentitySubKey(effectivePsk, Salt []byte, OutKey []byte) error
  13. }
  14. type Method interface {
  15. GetSessionSubKeyAndSaltLength() int
  16. GetStreamAEAD(SessionSubKey []byte) (cipher.AEAD, error)
  17. GenerateEIH(CurrentIdentitySubKey []byte, nextPskHash []byte, out []byte) error
  18. }
  19. type ExtensibleIdentityHeaders interface {
  20. struc.Custom
  21. }
  22. type DestinationAddress interface {
  23. net.Address
  24. }
  25. type RequestSalt interface {
  26. struc.Custom
  27. isRequestSalt()
  28. Bytes() []byte
  29. FillAllFrom(reader io.Reader) error
  30. }
  31. type TCPRequestHeader1PreSessionKey struct {
  32. Salt RequestSalt
  33. EIH ExtensibleIdentityHeaders
  34. }
  35. type TCPRequestHeader2FixedLength struct {
  36. Type byte
  37. Timestamp uint64
  38. HeaderLength uint16
  39. }
  40. type TCPRequestHeader3VariableLength struct {
  41. DestinationAddress DestinationAddress
  42. Contents struct {
  43. PaddingLength uint16 `struc:"sizeof=Padding"`
  44. Padding []byte
  45. }
  46. }
  47. type TCPRequestHeader struct {
  48. PreSessionKeyHeader TCPRequestHeader1PreSessionKey
  49. FixedLengthHeader TCPRequestHeader2FixedLength
  50. Header TCPRequestHeader3VariableLength
  51. }
  52. type TCPResponseHeader1PreSessionKey struct {
  53. Salt RequestSalt
  54. }
  55. type TCPResponseHeader2FixedLength struct {
  56. Type byte
  57. Timestamp uint64
  58. RequestSalt RequestSalt
  59. InitialPayloadLength uint16
  60. }
  61. type TCPResponseHeader struct {
  62. PreSessionKeyHeader TCPResponseHeader1PreSessionKey
  63. Header TCPResponseHeader2FixedLength
  64. }
  65. const TCPHeaderTypeClientToServerStream = byte(0x00)
  66. const TCPHeaderTypeServerToClientStream = byte(0x01)
  67. const TCPMinPaddingLength = 0
  68. const TCPMaxPaddingLength = 900
  69. var addrParser = protocol.NewAddressParser(
  70. protocol.AddressFamilyByte(0x01, net.AddressFamilyIPv4),
  71. protocol.AddressFamilyByte(0x04, net.AddressFamilyIPv6),
  72. protocol.AddressFamilyByte(0x03, net.AddressFamilyDomain),
  73. )