registry.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. //go:build go1.25 && badlinkname
  2. package badtls
  3. import (
  4. "crypto/tls"
  5. "net"
  6. "unsafe"
  7. )
  8. type Methods struct {
  9. readRecord func(c unsafe.Pointer) error
  10. handlePostHandshakeMessage func(c unsafe.Pointer) error
  11. writeRecordLocked func(c unsafe.Pointer, typ uint16, data []byte) (int, error)
  12. setErrorLocked func(hc unsafe.Pointer, err error) error
  13. decrypt func(hc unsafe.Pointer, record []byte) ([]byte, uint8, error)
  14. setTrafficSecret func(hc unsafe.Pointer, suite unsafe.Pointer, level int, secret []byte)
  15. explicitNonceLen func(hc unsafe.Pointer) int
  16. }
  17. var methodRegistry []func(conn net.Conn) (unsafe.Pointer, *Methods, bool)
  18. func init() {
  19. methodRegistry = append(methodRegistry, func(conn net.Conn) (unsafe.Pointer, *Methods, bool) {
  20. tlsConn, loaded := conn.(*tls.Conn)
  21. if !loaded {
  22. return nil, nil, false
  23. }
  24. return unsafe.Pointer(tlsConn), &Methods{
  25. readRecord: stdTLSReadRecord,
  26. handlePostHandshakeMessage: stdTLSHandlePostHandshakeMessage,
  27. writeRecordLocked: stdWriteRecordLocked,
  28. setErrorLocked: stdSetErrorLocked,
  29. decrypt: stdDecrypt,
  30. setTrafficSecret: stdSetTrafficSecret,
  31. explicitNonceLen: stdExplicitNonceLen,
  32. }, true
  33. })
  34. }
  35. //go:linkname stdTLSReadRecord crypto/tls.(*Conn).readRecord
  36. func stdTLSReadRecord(c unsafe.Pointer) error
  37. //go:linkname stdTLSHandlePostHandshakeMessage crypto/tls.(*Conn).handlePostHandshakeMessage
  38. func stdTLSHandlePostHandshakeMessage(c unsafe.Pointer) error
  39. //go:linkname stdWriteRecordLocked crypto/tls.(*Conn).writeRecordLocked
  40. func stdWriteRecordLocked(c unsafe.Pointer, typ uint16, data []byte) (int, error)
  41. //go:linkname stdSetErrorLocked crypto/tls.(*halfConn).setErrorLocked
  42. func stdSetErrorLocked(hc unsafe.Pointer, err error) error
  43. //go:linkname stdDecrypt crypto/tls.(*halfConn).decrypt
  44. func stdDecrypt(hc unsafe.Pointer, record []byte) ([]byte, uint8, error)
  45. //go:linkname stdSetTrafficSecret crypto/tls.(*halfConn).setTrafficSecret
  46. func stdSetTrafficSecret(hc unsafe.Pointer, suite unsafe.Pointer, level int, secret []byte)
  47. //go:linkname stdExplicitNonceLen crypto/tls.(*halfConn).explicitNonceLen
  48. func stdExplicitNonceLen(hc unsafe.Pointer) int