mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2025-12-21 09:40:04 +08:00
Some checks are pending
Test / test (1.20, macos-13) (push) Waiting to run
Test / test (1.20, macos-latest) (push) Waiting to run
Test / test (1.20, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.20, ubuntu-latest) (push) Waiting to run
Test / test (1.20, windows-latest) (push) Waiting to run
Test / test (1.21, macos-13) (push) Waiting to run
Test / test (1.21, macos-latest) (push) Waiting to run
Test / test (1.21, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.21, ubuntu-latest) (push) Waiting to run
Test / test (1.21, windows-latest) (push) Waiting to run
Test / test (1.22, macos-13) (push) Waiting to run
Test / test (1.22, macos-latest) (push) Waiting to run
Test / test (1.22, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.22, ubuntu-latest) (push) Waiting to run
Test / test (1.22, windows-latest) (push) Waiting to run
Test / test (1.23, macos-13) (push) Waiting to run
Test / test (1.23, macos-latest) (push) Waiting to run
Test / test (1.23, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.23, ubuntu-latest) (push) Waiting to run
Test / test (1.23, windows-latest) (push) Waiting to run
Test / test (1.24, macos-13) (push) Waiting to run
Test / test (1.24, macos-latest) (push) Waiting to run
Test / test (1.24, ubuntu-24.04-arm) (push) Waiting to run
Test / test (1.24, ubuntu-latest) (push) Waiting to run
Test / test (1.24, windows-latest) (push) Waiting to run
Trigger CMFA Update / trigger-CMFA-update (push) Waiting to run
64 lines
1.1 KiB
Go
64 lines
1.1 KiB
Go
package encryption
|
|
|
|
import (
|
|
"crypto/aes"
|
|
"crypto/cipher"
|
|
"crypto/rand"
|
|
"io"
|
|
"net"
|
|
)
|
|
|
|
type XorConn struct {
|
|
net.Conn
|
|
key []byte
|
|
ctr cipher.Stream
|
|
peerCtr cipher.Stream
|
|
}
|
|
|
|
func NewXorConn(conn net.Conn, key []byte) *XorConn {
|
|
return &XorConn{Conn: conn, key: key[:16]}
|
|
}
|
|
|
|
func (c *XorConn) Write(b []byte) (int, error) {
|
|
if len(b) == 0 {
|
|
return 0, nil
|
|
}
|
|
var iv []byte
|
|
if c.ctr == nil {
|
|
block, _ := aes.NewCipher(c.key)
|
|
iv = make([]byte, 16)
|
|
rand.Read(iv)
|
|
c.ctr = cipher.NewCTR(block, iv)
|
|
}
|
|
c.ctr.XORKeyStream(b, b) // caller MUST discard b
|
|
if iv != nil {
|
|
b = append(iv, b...)
|
|
}
|
|
if _, err := c.Conn.Write(b); err != nil {
|
|
return 0, err
|
|
}
|
|
if iv != nil {
|
|
b = b[16:] // for len(b)
|
|
}
|
|
return len(b), nil
|
|
}
|
|
|
|
func (c *XorConn) Read(b []byte) (int, error) {
|
|
if len(b) == 0 {
|
|
return 0, nil
|
|
}
|
|
if c.peerCtr == nil {
|
|
peerIv := make([]byte, 16)
|
|
if _, err := io.ReadFull(c.Conn, peerIv); err != nil {
|
|
return 0, err
|
|
}
|
|
block, _ := aes.NewCipher(c.key)
|
|
c.peerCtr = cipher.NewCTR(block, peerIv)
|
|
}
|
|
n, err := c.Conn.Read(b)
|
|
if n > 0 {
|
|
c.peerCtr.XORKeyStream(b[:n], b[:n])
|
|
}
|
|
return n, err
|
|
}
|