Skip to content

Commit 31f0060

Browse files
committed
fix: chacha20 counter overflow
the implement it's a not safe chacha20 using but for compatible
1 parent c60750d commit 31f0060

File tree

5 files changed

+68
-73
lines changed

5 files changed

+68
-73
lines changed

go.mod

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,16 @@ require (
2020
github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab
2121
github.com/metacubex/bart v0.20.5
2222
github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399
23-
github.com/metacubex/chacha v0.1.2
23+
github.com/metacubex/chacha v0.1.5
2424
github.com/metacubex/fswatch v0.1.1
2525
github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759
2626
github.com/metacubex/quic-go v0.52.1-0.20250522021943-aef454b9e639
2727
github.com/metacubex/randv2 v0.2.0
2828
github.com/metacubex/sing v0.5.4-0.20250605054047-54dc6097da29
2929
github.com/metacubex/sing-mux v0.3.2
3030
github.com/metacubex/sing-quic v0.0.0-20250523120938-f1a248e5ec7f
31-
github.com/metacubex/sing-shadowsocks v0.2.11-0.20250531133822-e545de386d4c
32-
github.com/metacubex/sing-shadowsocks2 v0.2.5-0.20250531133559-f4d53bd59335
31+
github.com/metacubex/sing-shadowsocks v0.2.11-0.20250621023810-0e9ef9dd0c92
32+
github.com/metacubex/sing-shadowsocks2 v0.2.5-0.20250621023950-93d605a2143d
3333
github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2
3434
github.com/metacubex/sing-tun v0.4.7-0.20250611091011-60774779fdd8
3535
github.com/metacubex/sing-vmess v0.2.2

go.sum

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ github.com/metacubex/bart v0.20.5 h1:XkgLZ17QxfxkqKdGsojoM2Zu01mmHyyQSFzt2/calTM
101101
github.com/metacubex/bart v0.20.5/go.mod h1:DCcyfP4MC+Zy7sLK7XeGuMw+P5K9mIRsYOBgiE8icsI=
102102
github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399 h1:oBowHVKZycNtAFbZ6avaCSZJYeme2Nrj+4RpV2cNJig=
103103
github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399/go.mod h1:4xcieuIK+M4bGQmQYZVqEaIYqjS1ahO4kXG7EmDgEro=
104-
github.com/metacubex/chacha v0.1.2 h1:QulCq3eVm3TO6+4nVIWJtmSe7BT2GMrgVHuAoqRQnlc=
105-
github.com/metacubex/chacha v0.1.2/go.mod h1:Djn9bPZxLTXbJFSeyo0/qzEzQI+gUSSzttuzZM75GH8=
104+
github.com/metacubex/chacha v0.1.5 h1:fKWMb/5c7ZrY8Uoqi79PPFxl+qwR7X/q0OrsAubyX2M=
105+
github.com/metacubex/chacha v0.1.5/go.mod h1:Djn9bPZxLTXbJFSeyo0/qzEzQI+gUSSzttuzZM75GH8=
106106
github.com/metacubex/fswatch v0.1.1 h1:jqU7C/v+g0qc2RUFgmAOPoVvfl2BXXUXEumn6oQuxhU=
107107
github.com/metacubex/fswatch v0.1.1/go.mod h1:czrTT7Zlbz7vWft8RQu9Qqh+JoX+Nnb+UabuyN1YsgI=
108108
github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 h1:cjd4biTvOzK9ubNCCkQ+ldc4YSH/rILn53l/xGBFHHI=
@@ -122,10 +122,14 @@ github.com/metacubex/sing-mux v0.3.2 h1:nJv52pyRivHcaZJKk2JgxpaVvj1GAXG81scSa9N7
122122
github.com/metacubex/sing-mux v0.3.2/go.mod h1:3rt1soewn0O6j89GCLmwAQFsq257u0jf2zQSPhTL3Bw=
123123
github.com/metacubex/sing-quic v0.0.0-20250523120938-f1a248e5ec7f h1:mP3vIm+9hRFI0C0Vl3pE0NESF/L85FDbuB0tGgUii6I=
124124
github.com/metacubex/sing-quic v0.0.0-20250523120938-f1a248e5ec7f/go.mod h1:JPTpf7fpnojsSuwRJExhSZSy63pVbp3VM39+zj+sAJM=
125-
github.com/metacubex/sing-shadowsocks v0.2.11-0.20250531133822-e545de386d4c h1:ZfgQx24XIN807046dp9CVBjAh0t9NJIzXG3X5jk+PEM=
126-
github.com/metacubex/sing-shadowsocks v0.2.11-0.20250531133822-e545de386d4c/go.mod h1:MtRM0ZZjR0kaDOzy9zWSt6/4/UlrnsNBq+1FNAF4vBk=
127-
github.com/metacubex/sing-shadowsocks2 v0.2.5-0.20250531133559-f4d53bd59335 h1:nSSdMV+I7Tjcb7s6FzNDMj7jH/ZdryY1DHPlgtFjW98=
128-
github.com/metacubex/sing-shadowsocks2 v0.2.5-0.20250531133559-f4d53bd59335/go.mod h1:WP8+S0kqtnSbX1vlIpo5i8Irm/ijZITEPBcZ26B5unY=
125+
github.com/metacubex/sing-shadowsocks v0.2.11-0.20250621021503-4f85ef9bf4b3 h1:dtiRj7WaCAXp4UhCkmaIiFF6v886qXiuqeIDN4Z//9E=
126+
github.com/metacubex/sing-shadowsocks v0.2.11-0.20250621021503-4f85ef9bf4b3/go.mod h1:/squZ38pXrYjqtg8qn+joVvwbpGNYQNp8yxKsMVbCto=
127+
github.com/metacubex/sing-shadowsocks v0.2.11-0.20250621023810-0e9ef9dd0c92 h1:Y9ebcKya6ow7VHoESCN5+l4zZvg5eaL2IhI5LLCQxQA=
128+
github.com/metacubex/sing-shadowsocks v0.2.11-0.20250621023810-0e9ef9dd0c92/go.mod h1:/squZ38pXrYjqtg8qn+joVvwbpGNYQNp8yxKsMVbCto=
129+
github.com/metacubex/sing-shadowsocks2 v0.2.5-0.20250621021638-dcd503063651 h1:vwLj0DDjPYy4AHEZvfRVf8ih52o6wpBnJxXxqa+ztmE=
130+
github.com/metacubex/sing-shadowsocks2 v0.2.5-0.20250621021638-dcd503063651/go.mod h1:+ukTd0OPFglT3bnKAYTJWYPbuox6HYNXE235r5tHdUk=
131+
github.com/metacubex/sing-shadowsocks2 v0.2.5-0.20250621023950-93d605a2143d h1:Ey3A1tA8lVkRbK1FDmwuWj/57Nr8JMdpoVqe45mFzJg=
132+
github.com/metacubex/sing-shadowsocks2 v0.2.5-0.20250621023950-93d605a2143d/go.mod h1:+ukTd0OPFglT3bnKAYTJWYPbuox6HYNXE235r5tHdUk=
129133
github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2 h1:gXU+MYPm7Wme3/OAY2FFzVq9d9GxPHOqu5AQfg/ddhI=
130134
github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2/go.mod h1:mbfboaXauKJNIHJYxQRa+NJs4JU9NZfkA+I33dS2+9E=
131135
github.com/metacubex/sing-tun v0.4.7-0.20250611091011-60774779fdd8 h1:4zWKqxTx75TbfW2EmlQ3hxM6RTRg2PYOAVMCnU4I61I=
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package shadowstream
2+
3+
import (
4+
"crypto/cipher"
5+
6+
"github.com/metacubex/chacha"
7+
)
8+
9+
func newChaCha20(nonce, key []byte) cipher.Stream {
10+
c, err := chacha.NewChaCha20IgnoreCounterOverflow(nonce, key)
11+
if err != nil {
12+
panic(err) // should never happen
13+
}
14+
return c
15+
}
16+
17+
type chacha20key []byte
18+
19+
func (k chacha20key) IVSize() int { return chacha.NonceSize }
20+
func (k chacha20key) Encrypter(iv []byte) cipher.Stream { return newChaCha20(iv, k) }
21+
func (k chacha20key) Decrypter(iv []byte) cipher.Stream { return k.Encrypter(iv) }
22+
23+
func ChaCha20(key []byte) (Cipher, error) {
24+
if len(key) != chacha.KeySize {
25+
return nil, KeySizeError(chacha.KeySize)
26+
}
27+
return chacha20key(key), nil
28+
}
29+
30+
// IETF-variant of chacha20
31+
type chacha20ietfkey []byte
32+
33+
func (k chacha20ietfkey) IVSize() int { return chacha.INonceSize }
34+
func (k chacha20ietfkey) Decrypter(iv []byte) cipher.Stream { return k.Encrypter(iv) }
35+
func (k chacha20ietfkey) Encrypter(iv []byte) cipher.Stream { return newChaCha20(iv, k) }
36+
37+
func Chacha20IETF(key []byte) (Cipher, error) {
38+
if len(key) != chacha.KeySize {
39+
return nil, KeySizeError(chacha.KeySize)
40+
}
41+
return chacha20ietfkey(key), nil
42+
}
43+
44+
type xchacha20key []byte
45+
46+
func (k xchacha20key) IVSize() int { return chacha.XNonceSize }
47+
func (k xchacha20key) Decrypter(iv []byte) cipher.Stream { return k.Encrypter(iv) }
48+
func (k xchacha20key) Encrypter(iv []byte) cipher.Stream { return newChaCha20(iv, k) }
49+
50+
func Xchacha20(key []byte) (Cipher, error) {
51+
if len(key) != chacha.KeySize {
52+
return nil, KeySizeError(chacha.KeySize)
53+
}
54+
return xchacha20key(key), nil
55+
}

transport/shadowsocks/shadowstream/cipher.go

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ import (
66
"crypto/md5"
77
"crypto/rc4"
88
"strconv"
9-
10-
"golang.org/x/crypto/chacha20"
119
)
1210

1311
// Cipher generates a pair of stream ciphers for encryption and decryption.
@@ -53,45 +51,6 @@ func AESCFB(key []byte) (Cipher, error) {
5351
return &cfbStream{blk}, nil
5452
}
5553

56-
// IETF-variant of chacha20
57-
type chacha20ietfkey []byte
58-
59-
func (k chacha20ietfkey) IVSize() int { return chacha20.NonceSize }
60-
func (k chacha20ietfkey) Decrypter(iv []byte) cipher.Stream { return k.Encrypter(iv) }
61-
func (k chacha20ietfkey) Encrypter(iv []byte) cipher.Stream {
62-
ciph, err := chacha20.NewUnauthenticatedCipher(k, iv)
63-
if err != nil {
64-
panic(err) // should never happen
65-
}
66-
return ciph
67-
}
68-
69-
func Chacha20IETF(key []byte) (Cipher, error) {
70-
if len(key) != chacha20.KeySize {
71-
return nil, KeySizeError(chacha20.KeySize)
72-
}
73-
return chacha20ietfkey(key), nil
74-
}
75-
76-
type xchacha20key []byte
77-
78-
func (k xchacha20key) IVSize() int { return chacha20.NonceSizeX }
79-
func (k xchacha20key) Decrypter(iv []byte) cipher.Stream { return k.Encrypter(iv) }
80-
func (k xchacha20key) Encrypter(iv []byte) cipher.Stream {
81-
ciph, err := chacha20.NewUnauthenticatedCipher(k, iv)
82-
if err != nil {
83-
panic(err) // should never happen
84-
}
85-
return ciph
86-
}
87-
88-
func Xchacha20(key []byte) (Cipher, error) {
89-
if len(key) != chacha20.KeySize {
90-
return nil, KeySizeError(chacha20.KeySize)
91-
}
92-
return xchacha20key(key), nil
93-
}
94-
9554
type rc4Md5Key []byte
9655

9756
func (k rc4Md5Key) IVSize() int {

transport/shadowsocks/shadowstream/old_chacha20.go

Lines changed: 0 additions & 23 deletions
This file was deleted.

0 commit comments

Comments
 (0)