From bba9662a5b11d02af81d849e42402443108a6bc4 Mon Sep 17 00:00:00 2001 From: fumiama Date: Mon, 27 Dec 2021 23:24:41 +0800 Subject: [PATCH] complete en/decode --- go.mod | 1 + go.sum | 25 ++++++++++++++++++++++++- gold/link/crypto.go | 17 +++++++++-------- gold/link/link.go | 5 +++-- gold/link/peer.go | 5 +++-- upper/services/tunnel/tunnel_test.go | 2 +- 6 files changed, 41 insertions(+), 14 deletions(-) diff --git a/go.mod b/go.mod index 9468650..ccb2c6b 100644 --- a/go.mod +++ b/go.mod @@ -4,5 +4,6 @@ go 1.16 require ( github.com/fumiama/go-x25519 v1.0.0 + github.com/fumiama/gofastTEA v0.0.6 github.com/sirupsen/logrus v1.8.1 ) diff --git a/go.sum b/go.sum index ff24595..c101dc2 100644 --- a/go.sum +++ b/go.sum @@ -1,20 +1,43 @@ +github.com/Mrs4s/MiraiGo v0.0.0-20211120033824-43b23f4e6fcb h1:Rkj28fqIwGx/EgBzRYtpmJRfH6wqVn7cNdc7aJ0QE4M= +github.com/Mrs4s/MiraiGo v0.0.0-20211120033824-43b23f4e6fcb/go.mod h1:imVKbfKqqeit+C/eaWGb4MKQ3z3gN6pRpBU5RMtp5so= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fumiama/go-x25519 v1.0.0 h1:hiGg9EhseVmGCc8T1jECVkj8Keu/aJ1ZK05RM8Vuavo= github.com/fumiama/go-x25519 v1.0.0/go.mod h1:8VOhfyGZzw4IUs4nCjQFqW9cA3V/QpSCtP3fo2dLNg4= +github.com/fumiama/gofastTEA v0.0.6 h1:Yni3MXDbJVa/c4CecgdZDgCJK+fLdvGph+OBqY2mtiI= +github.com/fumiama/gofastTEA v0.0.6/go.mod h1:+sBZ05nCA2skZkursHNvyr8kULlEetrYTM2y5kA4rQc= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/tidwall/gjson v1.11.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= diff --git a/gold/link/crypto.go b/gold/link/crypto.go index d66406c..5e83e89 100644 --- a/gold/link/crypto.go +++ b/gold/link/crypto.go @@ -2,6 +2,9 @@ package link import ( "net" + "unsafe" + + tea "github.com/fumiama/gofastTEA" ) var ( @@ -9,7 +12,7 @@ var ( // 利用 Curve25519 生成 // https://pkg.go.dev/golang.org/x/crypto/curve25519 // https://www.zhihu.com/question/266758647 - privKey []byte + privKey [32]byte // 本机虚拟 ip me net.IP // 本机 endpoint @@ -17,7 +20,7 @@ var ( ) // SetMyself 设置本机参数 -func SetMyself(privateKey []byte, myIP string, myEndpoint string) { +func SetMyself(privateKey [32]byte, myIP string, myEndpoint string) { privKey = privateKey var err error myend, err = net.ResolveUDPAddr("udp", myEndpoint) @@ -31,8 +34,7 @@ func SetMyself(privateKey []byte, myIP string, myEndpoint string) { } } -// Encode 使用 ChaCha20-Poly1305 加密 -// https://pkg.go.dev/golang.org/x/crypto/chacha20poly1305 +// Encode 使用 TEA 加密 func (l *Link) Encode(b []byte) (eb []byte, err error) { if b == nil { return @@ -42,13 +44,12 @@ func (l *Link) Encode(b []byte) (eb []byte, err error) { } else { // 在此处填写加密逻辑,密钥是l.key,输入是b,输出是eb // 不用写return,直接赋值给eb即可 - eb = b + eb = (*tea.TEA)(unsafe.Pointer(&privKey)).Encrypt(b) } return } -// Decode 使用 ChaCha20-Poly1305 解密 -// https://pkg.go.dev/golang.org/x/crypto/chacha20poly1305 +// Decode 使用 TEA 解密 func (l *Link) Decode(b []byte) (db []byte, err error) { if b == nil { return @@ -58,7 +59,7 @@ func (l *Link) Decode(b []byte) (db []byte, err error) { } else { // 在此处填写解密逻辑,密钥是l.key,输入是b,输出是db // 不用写return,直接赋值给db即可 - db = b + db = (*tea.TEA)(unsafe.Pointer(&privKey)).Decrypt(b) } return } diff --git a/gold/link/link.go b/gold/link/link.go index 8d11f09..2f6373a 100644 --- a/gold/link/link.go +++ b/gold/link/link.go @@ -5,8 +5,9 @@ import ( "net" "sync" - "github.com/fumiama/WireGold/gold/head" "github.com/sirupsen/logrus" + + "github.com/fumiama/WireGold/gold/head" ) // Link 是本机到 peer 的连接抽象 @@ -33,7 +34,7 @@ type Link struct { // 连接的状态,详见下方 const status int // 连接所用对称加密密钥 - key *[]byte + key *[32]byte } const ( diff --git a/gold/link/peer.go b/gold/link/peer.go index d0d7885..c985f80 100644 --- a/gold/link/peer.go +++ b/gold/link/peer.go @@ -2,6 +2,7 @@ package link import ( "net" + "unsafe" curve "github.com/fumiama/go-x25519" @@ -24,10 +25,10 @@ func AddPeer(peerip string, pubicKey *[32]byte, endPoint string, allowedIPs []st allowtrans: allowTrans, } if pubicKey != nil { - c := curve.Get(privKey) + c := curve.Get(privKey[:]) k, err := c.Shared(pubicKey) if err == nil { - l.key = &k + l.key = (*[32]byte)(*(*unsafe.Pointer)(unsafe.Pointer(&k))) } } if endPoint != "" { diff --git a/upper/services/tunnel/tunnel_test.go b/upper/services/tunnel/tunnel_test.go index 74313dc..877daab 100644 --- a/upper/services/tunnel/tunnel_test.go +++ b/upper/services/tunnel/tunnel_test.go @@ -9,7 +9,7 @@ import ( func TestTunnel(t *testing.T) { logrus.SetLevel(logrus.DebugLevel) - link.SetMyself(nil, "192.168.1.2", "127.0.0.1:1236") + link.SetMyself([32]byte{}, "192.168.1.2", "127.0.0.1:1236") link.AddPeer("192.168.1.2", nil, "127.0.0.1:1236", nil, 0, false) tunn, err := Create("192.168.1.2", 1, 1) if err != nil {