index.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package tf
  2. import (
  3. "encoding/binary"
  4. )
  5. const (
  6. recordLayerHeaderLen int = 5
  7. handshakeHeaderLen int = 6
  8. randomDataLen int = 32
  9. sessionIDHeaderLen int = 1
  10. cipherSuiteHeaderLen int = 2
  11. compressMethodHeaderLen int = 1
  12. extensionsHeaderLen int = 2
  13. extensionHeaderLen int = 4
  14. sniExtensionHeaderLen int = 5
  15. contentType uint8 = 22
  16. handshakeType uint8 = 1
  17. sniExtensionType uint16 = 0
  18. sniNameDNSHostnameType uint8 = 0
  19. tlsVersionBitmask uint16 = 0xFFFC
  20. tls13 uint16 = 0x0304
  21. )
  22. type myServerName struct {
  23. Index int
  24. Length int
  25. ServerName string
  26. }
  27. func indexTLSServerName(payload []byte) *myServerName {
  28. if len(payload) < recordLayerHeaderLen || payload[0] != contentType {
  29. return nil
  30. }
  31. segmentLen := binary.BigEndian.Uint16(payload[3:5])
  32. if len(payload) < recordLayerHeaderLen+int(segmentLen) {
  33. return nil
  34. }
  35. serverName := indexTLSServerNameFromHandshake(payload[recordLayerHeaderLen : recordLayerHeaderLen+int(segmentLen)])
  36. if serverName == nil {
  37. return nil
  38. }
  39. serverName.Length += recordLayerHeaderLen
  40. return serverName
  41. }
  42. func indexTLSServerNameFromHandshake(hs []byte) *myServerName {
  43. if len(hs) < handshakeHeaderLen+randomDataLen+sessionIDHeaderLen {
  44. return nil
  45. }
  46. if hs[0] != handshakeType {
  47. return nil
  48. }
  49. handshakeLen := uint32(hs[1])<<16 | uint32(hs[2])<<8 | uint32(hs[3])
  50. if len(hs[4:]) != int(handshakeLen) {
  51. return nil
  52. }
  53. tlsVersion := uint16(hs[4])<<8 | uint16(hs[5])
  54. if tlsVersion&tlsVersionBitmask != 0x0300 && tlsVersion != tls13 {
  55. return nil
  56. }
  57. sessionIDLen := hs[38]
  58. if len(hs) < handshakeHeaderLen+randomDataLen+sessionIDHeaderLen+int(sessionIDLen) {
  59. return nil
  60. }
  61. cs := hs[handshakeHeaderLen+randomDataLen+sessionIDHeaderLen+int(sessionIDLen):]
  62. if len(cs) < cipherSuiteHeaderLen {
  63. return nil
  64. }
  65. csLen := uint16(cs[0])<<8 | uint16(cs[1])
  66. if len(cs) < cipherSuiteHeaderLen+int(csLen)+compressMethodHeaderLen {
  67. return nil
  68. }
  69. compressMethodLen := uint16(cs[cipherSuiteHeaderLen+int(csLen)])
  70. if len(cs) < cipherSuiteHeaderLen+int(csLen)+compressMethodHeaderLen+int(compressMethodLen) {
  71. return nil
  72. }
  73. currentIndex := cipherSuiteHeaderLen + int(csLen) + compressMethodHeaderLen + int(compressMethodLen)
  74. serverName := indexTLSServerNameFromExtensions(cs[currentIndex:])
  75. if serverName == nil {
  76. return nil
  77. }
  78. serverName.Index += currentIndex
  79. return serverName
  80. }
  81. func indexTLSServerNameFromExtensions(exs []byte) *myServerName {
  82. if len(exs) == 0 {
  83. return nil
  84. }
  85. if len(exs) < extensionsHeaderLen {
  86. return nil
  87. }
  88. exsLen := uint16(exs[0])<<8 | uint16(exs[1])
  89. exs = exs[extensionsHeaderLen:]
  90. if len(exs) < int(exsLen) {
  91. return nil
  92. }
  93. for currentIndex := extensionsHeaderLen; len(exs) > 0; {
  94. if len(exs) < extensionHeaderLen {
  95. return nil
  96. }
  97. exType := uint16(exs[0])<<8 | uint16(exs[1])
  98. exLen := uint16(exs[2])<<8 | uint16(exs[3])
  99. if len(exs) < extensionHeaderLen+int(exLen) {
  100. return nil
  101. }
  102. sex := exs[extensionHeaderLen : extensionHeaderLen+int(exLen)]
  103. switch exType {
  104. case sniExtensionType:
  105. if len(sex) < sniExtensionHeaderLen {
  106. return nil
  107. }
  108. sniType := sex[2]
  109. if sniType != sniNameDNSHostnameType {
  110. return nil
  111. }
  112. sniLen := uint16(sex[3])<<8 | uint16(sex[4])
  113. sex = sex[sniExtensionHeaderLen:]
  114. return &myServerName{
  115. Index: currentIndex + extensionHeaderLen + sniExtensionHeaderLen,
  116. Length: int(sniLen),
  117. ServerName: string(sex),
  118. }
  119. }
  120. exs = exs[4+exLen:]
  121. currentIndex += 4 + int(exLen)
  122. }
  123. return nil
  124. }