registry_utls.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. //go:build go1.25 && badlinkname
  2. package badtls
  3. import (
  4. "net"
  5. "unsafe"
  6. N "github.com/sagernet/sing/common/network"
  7. "github.com/metacubex/utls"
  8. )
  9. func init() {
  10. methodRegistry = append(methodRegistry, func(conn net.Conn) (unsafe.Pointer, *Methods, bool) {
  11. var pointer unsafe.Pointer
  12. if uConn, loaded := N.CastReader[*tls.Conn](conn); loaded {
  13. pointer = unsafe.Pointer(uConn)
  14. } else if uConn, loaded := N.CastReader[*tls.UConn](conn); loaded {
  15. pointer = unsafe.Pointer(uConn.Conn)
  16. } else {
  17. return nil, nil, false
  18. }
  19. return pointer, &Methods{
  20. readRecord: utlsReadRecord,
  21. handlePostHandshakeMessage: utlsHandlePostHandshakeMessage,
  22. writeRecordLocked: utlsWriteRecordLocked,
  23. setErrorLocked: utlsSetErrorLocked,
  24. decrypt: utlsDecrypt,
  25. setTrafficSecret: utlsSetTrafficSecret,
  26. explicitNonceLen: utlsExplicitNonceLen,
  27. }, true
  28. })
  29. }
  30. //go:linkname utlsReadRecord github.com/metacubex/utls.(*Conn).readRecord
  31. func utlsReadRecord(c unsafe.Pointer) error
  32. //go:linkname utlsHandlePostHandshakeMessage github.com/metacubex/utls.(*Conn).handlePostHandshakeMessage
  33. func utlsHandlePostHandshakeMessage(c unsafe.Pointer) error
  34. //go:linkname utlsWriteRecordLocked github.com/metacubex/utls.(*Conn).writeRecordLocked
  35. func utlsWriteRecordLocked(hc unsafe.Pointer, typ uint16, data []byte) (int, error)
  36. //go:linkname utlsSetErrorLocked github.com/metacubex/utls.(*halfConn).setErrorLocked
  37. func utlsSetErrorLocked(hc unsafe.Pointer, err error) error
  38. //go:linkname utlsDecrypt github.com/metacubex/utls.(*halfConn).decrypt
  39. func utlsDecrypt(hc unsafe.Pointer, record []byte) ([]byte, uint8, error)
  40. //go:linkname utlsSetTrafficSecret github.com/metacubex/utls.(*halfConn).setTrafficSecret
  41. func utlsSetTrafficSecret(hc unsafe.Pointer, suite unsafe.Pointer, level int, secret []byte)
  42. //go:linkname utlsExplicitNonceLen github.com/metacubex/utls.(*halfConn).explicitNonceLen
  43. func utlsExplicitNonceLen(hc unsafe.Pointer) int