ktls_cipher_suites_linux.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. // Copyright 2010 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. //go:build linux && go1.25 && badlinkname
  5. package ktls
  6. import (
  7. "crypto/tls"
  8. "unsafe"
  9. "github.com/sagernet/sing-box/common/badtls"
  10. )
  11. type kernelCryptoCipherType uint16
  12. const (
  13. TLS_CIPHER_AES_GCM_128 kernelCryptoCipherType = 51
  14. TLS_CIPHER_AES_GCM_128_IV_SIZE kernelCryptoCipherType = 8
  15. TLS_CIPHER_AES_GCM_128_KEY_SIZE kernelCryptoCipherType = 16
  16. TLS_CIPHER_AES_GCM_128_SALT_SIZE kernelCryptoCipherType = 4
  17. TLS_CIPHER_AES_GCM_128_TAG_SIZE kernelCryptoCipherType = 16
  18. TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE kernelCryptoCipherType = 8
  19. TLS_CIPHER_AES_GCM_256 kernelCryptoCipherType = 52
  20. TLS_CIPHER_AES_GCM_256_IV_SIZE kernelCryptoCipherType = 8
  21. TLS_CIPHER_AES_GCM_256_KEY_SIZE kernelCryptoCipherType = 32
  22. TLS_CIPHER_AES_GCM_256_SALT_SIZE kernelCryptoCipherType = 4
  23. TLS_CIPHER_AES_GCM_256_TAG_SIZE kernelCryptoCipherType = 16
  24. TLS_CIPHER_AES_GCM_256_REC_SEQ_SIZE kernelCryptoCipherType = 8
  25. TLS_CIPHER_AES_CCM_128 kernelCryptoCipherType = 53
  26. TLS_CIPHER_AES_CCM_128_IV_SIZE kernelCryptoCipherType = 8
  27. TLS_CIPHER_AES_CCM_128_KEY_SIZE kernelCryptoCipherType = 16
  28. TLS_CIPHER_AES_CCM_128_SALT_SIZE kernelCryptoCipherType = 4
  29. TLS_CIPHER_AES_CCM_128_TAG_SIZE kernelCryptoCipherType = 16
  30. TLS_CIPHER_AES_CCM_128_REC_SEQ_SIZE kernelCryptoCipherType = 8
  31. TLS_CIPHER_CHACHA20_POLY1305 kernelCryptoCipherType = 54
  32. TLS_CIPHER_CHACHA20_POLY1305_IV_SIZE kernelCryptoCipherType = 12
  33. TLS_CIPHER_CHACHA20_POLY1305_KEY_SIZE kernelCryptoCipherType = 32
  34. TLS_CIPHER_CHACHA20_POLY1305_SALT_SIZE kernelCryptoCipherType = 0
  35. TLS_CIPHER_CHACHA20_POLY1305_TAG_SIZE kernelCryptoCipherType = 16
  36. TLS_CIPHER_CHACHA20_POLY1305_REC_SEQ_SIZE kernelCryptoCipherType = 8
  37. // TLS_CIPHER_SM4_GCM kernelCryptoCipherType = 55
  38. // TLS_CIPHER_SM4_GCM_IV_SIZE kernelCryptoCipherType = 8
  39. // TLS_CIPHER_SM4_GCM_KEY_SIZE kernelCryptoCipherType = 16
  40. // TLS_CIPHER_SM4_GCM_SALT_SIZE kernelCryptoCipherType = 4
  41. // TLS_CIPHER_SM4_GCM_TAG_SIZE kernelCryptoCipherType = 16
  42. // TLS_CIPHER_SM4_GCM_REC_SEQ_SIZE kernelCryptoCipherType = 8
  43. // TLS_CIPHER_SM4_CCM kernelCryptoCipherType = 56
  44. // TLS_CIPHER_SM4_CCM_IV_SIZE kernelCryptoCipherType = 8
  45. // TLS_CIPHER_SM4_CCM_KEY_SIZE kernelCryptoCipherType = 16
  46. // TLS_CIPHER_SM4_CCM_SALT_SIZE kernelCryptoCipherType = 4
  47. // TLS_CIPHER_SM4_CCM_TAG_SIZE kernelCryptoCipherType = 16
  48. // TLS_CIPHER_SM4_CCM_REC_SEQ_SIZE kernelCryptoCipherType = 8
  49. TLS_CIPHER_ARIA_GCM_128 kernelCryptoCipherType = 57
  50. TLS_CIPHER_ARIA_GCM_128_IV_SIZE kernelCryptoCipherType = 8
  51. TLS_CIPHER_ARIA_GCM_128_KEY_SIZE kernelCryptoCipherType = 16
  52. TLS_CIPHER_ARIA_GCM_128_SALT_SIZE kernelCryptoCipherType = 4
  53. TLS_CIPHER_ARIA_GCM_128_TAG_SIZE kernelCryptoCipherType = 16
  54. TLS_CIPHER_ARIA_GCM_128_REC_SEQ_SIZE kernelCryptoCipherType = 8
  55. TLS_CIPHER_ARIA_GCM_256 kernelCryptoCipherType = 58
  56. TLS_CIPHER_ARIA_GCM_256_IV_SIZE kernelCryptoCipherType = 8
  57. TLS_CIPHER_ARIA_GCM_256_KEY_SIZE kernelCryptoCipherType = 32
  58. TLS_CIPHER_ARIA_GCM_256_SALT_SIZE kernelCryptoCipherType = 4
  59. TLS_CIPHER_ARIA_GCM_256_TAG_SIZE kernelCryptoCipherType = 16
  60. TLS_CIPHER_ARIA_GCM_256_REC_SEQ_SIZE kernelCryptoCipherType = 8
  61. )
  62. type kernelCrypto interface {
  63. String() string
  64. }
  65. type kernelCryptoInfo struct {
  66. version uint16
  67. cipher_type kernelCryptoCipherType
  68. }
  69. var _ kernelCrypto = &kernelCryptoAES128GCM{}
  70. type kernelCryptoAES128GCM struct {
  71. kernelCryptoInfo
  72. iv [TLS_CIPHER_AES_GCM_128_IV_SIZE]byte
  73. key [TLS_CIPHER_AES_GCM_128_KEY_SIZE]byte
  74. salt [TLS_CIPHER_AES_GCM_128_SALT_SIZE]byte
  75. rec_seq [TLS_CIPHER_AES_GCM_128_REC_SEQ_SIZE]byte
  76. }
  77. func (crypto *kernelCryptoAES128GCM) String() string {
  78. crypto.cipher_type = TLS_CIPHER_AES_GCM_128
  79. return string((*[unsafe.Sizeof(*crypto)]byte)(unsafe.Pointer(crypto))[:])
  80. }
  81. var _ kernelCrypto = &kernelCryptoAES256GCM{}
  82. type kernelCryptoAES256GCM struct {
  83. kernelCryptoInfo
  84. iv [TLS_CIPHER_AES_GCM_256_IV_SIZE]byte
  85. key [TLS_CIPHER_AES_GCM_256_KEY_SIZE]byte
  86. salt [TLS_CIPHER_AES_GCM_256_SALT_SIZE]byte
  87. rec_seq [TLS_CIPHER_AES_GCM_256_REC_SEQ_SIZE]byte
  88. }
  89. func (crypto *kernelCryptoAES256GCM) String() string {
  90. crypto.cipher_type = TLS_CIPHER_AES_GCM_256
  91. return string((*[unsafe.Sizeof(*crypto)]byte)(unsafe.Pointer(crypto))[:])
  92. }
  93. var _ kernelCrypto = &kernelCryptoAES128CCM{}
  94. type kernelCryptoAES128CCM struct {
  95. kernelCryptoInfo
  96. iv [TLS_CIPHER_AES_CCM_128_IV_SIZE]byte
  97. key [TLS_CIPHER_AES_CCM_128_KEY_SIZE]byte
  98. salt [TLS_CIPHER_AES_CCM_128_SALT_SIZE]byte
  99. rec_seq [TLS_CIPHER_AES_CCM_128_REC_SEQ_SIZE]byte
  100. }
  101. func (crypto *kernelCryptoAES128CCM) String() string {
  102. crypto.cipher_type = TLS_CIPHER_AES_CCM_128
  103. return string((*[unsafe.Sizeof(*crypto)]byte)(unsafe.Pointer(crypto))[:])
  104. }
  105. var _ kernelCrypto = &kernelCryptoChacha20Poly1035{}
  106. type kernelCryptoChacha20Poly1035 struct {
  107. kernelCryptoInfo
  108. iv [TLS_CIPHER_CHACHA20_POLY1305_IV_SIZE]byte
  109. key [TLS_CIPHER_CHACHA20_POLY1305_KEY_SIZE]byte
  110. salt [TLS_CIPHER_CHACHA20_POLY1305_SALT_SIZE]byte
  111. rec_seq [TLS_CIPHER_CHACHA20_POLY1305_REC_SEQ_SIZE]byte
  112. }
  113. func (crypto *kernelCryptoChacha20Poly1035) String() string {
  114. crypto.cipher_type = TLS_CIPHER_CHACHA20_POLY1305
  115. return string((*[unsafe.Sizeof(*crypto)]byte)(unsafe.Pointer(crypto))[:])
  116. }
  117. // var _ kernelCrypto = &kernelCryptoSM4GCM{}
  118. // type kernelCryptoSM4GCM struct {
  119. // kernelCryptoInfo
  120. // iv [TLS_CIPHER_SM4_GCM_IV_SIZE]byte
  121. // key [TLS_CIPHER_SM4_GCM_KEY_SIZE]byte
  122. // salt [TLS_CIPHER_SM4_GCM_SALT_SIZE]byte
  123. // rec_seq [TLS_CIPHER_SM4_GCM_REC_SEQ_SIZE]byte
  124. // }
  125. // func (crypto *kernelCryptoSM4GCM) String() string {
  126. // crypto.cipher_type = TLS_CIPHER_SM4_GCM
  127. // return string((*[unsafe.Sizeof(*crypto)]byte)(unsafe.Pointer(crypto))[:])
  128. // }
  129. // var _ kernelCrypto = &kernelCryptoSM4CCM{}
  130. // type kernelCryptoSM4CCM struct {
  131. // kernelCryptoInfo
  132. // iv [TLS_CIPHER_SM4_CCM_IV_SIZE]byte
  133. // key [TLS_CIPHER_SM4_CCM_KEY_SIZE]byte
  134. // salt [TLS_CIPHER_SM4_CCM_SALT_SIZE]byte
  135. // rec_seq [TLS_CIPHER_SM4_CCM_REC_SEQ_SIZE]byte
  136. // }
  137. // func (crypto *kernelCryptoSM4CCM) String() string {
  138. // crypto.cipher_type = TLS_CIPHER_SM4_CCM
  139. // return string((*[unsafe.Sizeof(*crypto)]byte)(unsafe.Pointer(crypto))[:])
  140. // }
  141. var _ kernelCrypto = &kernelCryptoARIA128GCM{}
  142. type kernelCryptoARIA128GCM struct {
  143. kernelCryptoInfo
  144. iv [TLS_CIPHER_ARIA_GCM_128_IV_SIZE]byte
  145. key [TLS_CIPHER_ARIA_GCM_128_KEY_SIZE]byte
  146. salt [TLS_CIPHER_ARIA_GCM_128_SALT_SIZE]byte
  147. rec_seq [TLS_CIPHER_ARIA_GCM_128_REC_SEQ_SIZE]byte
  148. }
  149. func (crypto *kernelCryptoARIA128GCM) String() string {
  150. crypto.cipher_type = TLS_CIPHER_ARIA_GCM_128
  151. return string((*[unsafe.Sizeof(*crypto)]byte)(unsafe.Pointer(crypto))[:])
  152. }
  153. var _ kernelCrypto = &kernelCryptoARIA256GCM{}
  154. type kernelCryptoARIA256GCM struct {
  155. kernelCryptoInfo
  156. iv [TLS_CIPHER_ARIA_GCM_256_IV_SIZE]byte
  157. key [TLS_CIPHER_ARIA_GCM_256_KEY_SIZE]byte
  158. salt [TLS_CIPHER_ARIA_GCM_256_SALT_SIZE]byte
  159. rec_seq [TLS_CIPHER_ARIA_GCM_256_REC_SEQ_SIZE]byte
  160. }
  161. func (crypto *kernelCryptoARIA256GCM) String() string {
  162. crypto.cipher_type = TLS_CIPHER_ARIA_GCM_256
  163. return string((*[unsafe.Sizeof(*crypto)]byte)(unsafe.Pointer(crypto))[:])
  164. }
  165. func kernelCipher(kernel *Support, hc *badtls.RawHalfConn, cipherSuite uint16, isRX bool) kernelCrypto {
  166. if !kernel.TLS {
  167. return nil
  168. }
  169. switch *hc.Version {
  170. case tls.VersionTLS12:
  171. if isRX && !kernel.TLS_Version13_RX {
  172. return nil
  173. }
  174. case tls.VersionTLS13:
  175. if !kernel.TLS_Version13 {
  176. return nil
  177. }
  178. if isRX && !kernel.TLS_Version13_RX {
  179. return nil
  180. }
  181. default:
  182. return nil
  183. }
  184. var key, iv []byte
  185. if *hc.Version == tls.VersionTLS13 {
  186. key, iv = trafficKey(cipherSuiteTLS13ByID(cipherSuite), *hc.TrafficSecret)
  187. /*if isRX {
  188. key, iv = trafficKey(cipherSuiteTLS13ByID(cipherSuite), keyLog.RemoteTrafficSecret)
  189. } else {
  190. key, iv = trafficKey(cipherSuiteTLS13ByID(cipherSuite), keyLog.TrafficSecret)
  191. }*/
  192. } else {
  193. // csPtr := cipherSuiteByID(cipherSuite)
  194. // keysFromMasterSecret(*hc.Version, csPtr, keyLog.Secret, keyLog.Random)
  195. return nil
  196. }
  197. switch cipherSuite {
  198. case tls.TLS_AES_128_GCM_SHA256, tls.TLS_RSA_WITH_AES_128_GCM_SHA256, tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:
  199. crypto := new(kernelCryptoAES128GCM)
  200. crypto.version = *hc.Version
  201. copy(crypto.key[:], key)
  202. copy(crypto.iv[:], iv[4:])
  203. copy(crypto.salt[:], iv[:4])
  204. crypto.rec_seq = *hc.Seq
  205. return crypto
  206. case tls.TLS_AES_256_GCM_SHA384, tls.TLS_RSA_WITH_AES_256_GCM_SHA384, tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384:
  207. if !kernel.TLS_AES_256_GCM {
  208. return nil
  209. }
  210. crypto := new(kernelCryptoAES256GCM)
  211. crypto.version = *hc.Version
  212. copy(crypto.key[:], key)
  213. copy(crypto.iv[:], iv[4:])
  214. copy(crypto.salt[:], iv[:4])
  215. crypto.rec_seq = *hc.Seq
  216. return crypto
  217. //case tls.TLS_AES_128_CCM_SHA256, tls.TLS_RSA_WITH_AES_128_CCM_SHA256, tls.TLS_ECDHE_ECDSA_WITH_AES_128_CCM_SHA256:
  218. // if !kernel.TLS_AES_128_CCM {
  219. // return nil
  220. // }
  221. //
  222. // crypto := new(kernelCryptoAES128CCM)
  223. //
  224. // crypto.version = *hc.Version
  225. // copy(crypto.key[:], key)
  226. // copy(crypto.iv[:], iv[4:])
  227. // copy(crypto.salt[:], iv[:4])
  228. // crypto.rec_seq = *hc.Seq
  229. //
  230. // return crypto
  231. case tls.TLS_CHACHA20_POLY1305_SHA256, tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256:
  232. if !kernel.TLS_CHACHA20_POLY1305 {
  233. return nil
  234. }
  235. crypto := new(kernelCryptoChacha20Poly1035)
  236. crypto.version = *hc.Version
  237. copy(crypto.key[:], key)
  238. copy(crypto.iv[:], iv)
  239. crypto.rec_seq = *hc.Seq
  240. return crypto
  241. //case tls.TLS_RSA_WITH_ARIA_128_GCM_SHA256, tls.TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256, tls.TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256:
  242. // if !kernel.TLS_ARIA_GCM {
  243. // return nil
  244. // }
  245. //
  246. // crypto := new(kernelCryptoARIA128GCM)
  247. //
  248. // crypto.version = *hc.Version
  249. // copy(crypto.key[:], key)
  250. // copy(crypto.iv[:], iv[4:])
  251. // copy(crypto.salt[:], iv[:4])
  252. // crypto.rec_seq = *hc.Seq
  253. //
  254. // return crypto
  255. //case tls.TLS_RSA_WITH_ARIA_256_GCM_SHA384, tls.TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384, tls.TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384:
  256. // if !kernel.TLS_ARIA_GCM {
  257. // return nil
  258. // }
  259. //
  260. // crypto := new(kernelCryptoARIA256GCM)
  261. //
  262. // crypto.version = *hc.Version
  263. // copy(crypto.key[:], key)
  264. // copy(crypto.iv[:], iv[4:])
  265. // copy(crypto.salt[:], iv[:4])
  266. // crypto.rec_seq = *hc.Seq
  267. //
  268. // return crypto
  269. default:
  270. return nil
  271. }
  272. }