Files
mautrix-telegram/pkg/gotd/mtproxy/obfuscator/obfuscator.go
T
2025-06-27 20:03:37 -07:00

53 lines
1.1 KiB
Go

// Package obfuscator contains some MTProxy obfuscation utilities.
package obfuscator
import (
"io"
"github.com/go-faster/errors"
"go.mau.fi/mautrix-telegram/pkg/gotd/mtproxy"
"go.mau.fi/mautrix-telegram/pkg/gotd/mtproxy/faketls"
"go.mau.fi/mautrix-telegram/pkg/gotd/mtproxy/obfuscated2"
)
// Obfuscator represents MTProxy obfuscator.
type Obfuscator interface {
io.ReadWriter
Handshake(protocol [4]byte, dc int, s mtproxy.Secret) error
}
type tls struct {
ftls *faketls.FakeTLS
obfs2 *obfuscated2.Obfuscated2
}
func newTLS(rand io.Reader, conn io.ReadWriter) tls {
ftls := faketls.NewFakeTLS(rand, conn)
obfs2 := obfuscated2.NewObfuscated2(rand, ftls)
return tls{
ftls: ftls,
obfs2: obfs2,
}
}
func (t tls) Write(p []byte) (int, error) {
return t.obfs2.Write(p)
}
func (t tls) Read(p []byte) (int, error) {
return t.obfs2.Read(p)
}
func (t tls) Handshake(protocol [4]byte, dc int, s mtproxy.Secret) error {
if err := t.ftls.Handshake(protocol, dc, s); err != nil {
return errors.Wrap(err, "faketls handshake")
}
if err := t.obfs2.Handshake(protocol, dc, s); err != nil {
return errors.Wrap(err, "obfs2 handshake")
}
return nil
}