Skip to content

Commit

Permalink
fix encoding bug in shadowsocks
Browse files Browse the repository at this point in the history
  • Loading branch information
DarienRaymond committed Nov 2, 2018
1 parent 18ddde4 commit 8bb018d
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 2 deletions.
2 changes: 1 addition & 1 deletion proxy/shadowsocks/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ func (c *AEADCipher) DecodePacket(key []byte, b *buf.Buffer) error {
if err != nil {
return err
}
b.Resize(ivLen, ivLen+int32(len(bbb)))
b.Resize(ivLen, int32(len(bbb)))
return nil
}

Expand Down
38 changes: 38 additions & 0 deletions proxy/shadowsocks/config_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package shadowsocks_test

import (
"crypto/rand"
"testing"

"v2ray.com/core/common"
"v2ray.com/core/common/buf"
"v2ray.com/core/common/compare"
"v2ray.com/core/proxy/shadowsocks"
)

func TestAEADCipherUDP(t *testing.T) {
rawAccount := &shadowsocks.Account{
CipherType: shadowsocks.CipherType_AES_128_GCM,
Password: "test",
}
account, err := rawAccount.AsAccount()
common.Must(err)

cipher := account.(*shadowsocks.MemoryAccount).Cipher

key := make([]byte, cipher.KeySize())
common.Must2(rand.Read(key))

payload := make([]byte, 1024)
common.Must2(rand.Read(payload))

b1 := buf.New()
common.Must2(b1.ReadFullFrom(rand.Reader, cipher.IVSize()))
common.Must2(b1.Write(payload))
common.Must(cipher.EncodePacket(key, b1))

common.Must(cipher.DecodePacket(key, b1))
if err := compare.BytesEqualWithDetail(b1.Bytes(), payload); err != nil {
t.Error(err)
}
}
3 changes: 2 additions & 1 deletion proxy/shadowsocks/protocol.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,8 +142,9 @@ func WriteTCPRequest(request *protocol.RequestHeader, writer io.Writer) (buf.Wri
header.SetByte(0, header.Byte(0)|0x10)

authenticator := NewAuthenticator(HeaderKeyGenerator(account.Key, iv))
authPayload := header.Bytes()
authBuffer := header.Extend(AuthSize)
authenticator.Authenticate(header.Bytes(), authBuffer)
authenticator.Authenticate(authPayload, authBuffer)
}

if err := w.WriteMultiBuffer(buf.NewMultiBufferValue(header)); err != nil {
Expand Down

0 comments on commit 8bb018d

Please sign in to comment.