1
1
package shadowsocks
2
2
3
3
import (
4
- "crypto/cipher"
5
- "crypto/hmac"
6
4
"crypto/rand"
7
- "crypto/sha256"
8
- "hash/crc32"
9
5
"io"
10
6
11
7
"github.com/xtls/xray-core/common"
@@ -54,91 +50,67 @@ func (r *FullReader) Read(p []byte) (n int, err error) {
54
50
55
51
// ReadTCPSession reads a Shadowsocks TCP session from the given reader, returns its header and remaining parts.
56
52
func ReadTCPSession (validator * Validator , reader io.Reader ) (* protocol.RequestHeader , buf.Reader , error ) {
57
- hashkdf := hmac .New (sha256 .New , []byte ("SSBSKDF" ))
58
-
59
- behaviorSeed := crc32 .ChecksumIEEE (hashkdf .Sum (nil ))
60
-
53
+ behaviorSeed := validator .GetBehaviorSeed ()
61
54
behaviorRand := dice .NewDeterministicDice (int64 (behaviorSeed ))
62
55
BaseDrainSize := behaviorRand .Roll (3266 )
63
56
RandDrainMax := behaviorRand .Roll (64 ) + 1
64
57
RandDrainRolled := dice .Roll (RandDrainMax )
65
58
DrainSize := BaseDrainSize + 16 + 38 + RandDrainRolled
66
59
readSizeRemain := DrainSize
67
60
68
- var r2 buf.Reader
61
+ var r buf.Reader
69
62
buffer := buf .New ()
70
63
defer buffer .Release ()
71
64
72
- var user * protocol.MemoryUser
73
- var ivLen int32
74
- var iv []byte
75
- var err error
76
-
77
- count := validator .Count ()
78
- if count == 0 {
65
+ if _ , err := buffer .ReadFullFrom (reader , 50 ); err != nil {
79
66
readSizeRemain -= int (buffer .Len ())
80
67
DrainConnN (reader , readSizeRemain )
81
- return nil , nil , newError ("invalid user" )
82
- } else if count > 1 {
83
- var aead cipher.AEAD
84
-
85
- if _ , err := buffer .ReadFullFrom (reader , 50 ); err != nil {
86
- readSizeRemain -= int (buffer .Len ())
87
- DrainConnN (reader , readSizeRemain )
88
- return nil , nil , newError ("failed to read 50 bytes" ).Base (err )
89
- }
68
+ return nil , nil , newError ("failed to read 50 bytes" ).Base (err )
69
+ }
90
70
91
- bs := buffer .Bytes ()
92
- user , aead , _ , ivLen , err = validator .Get (bs , protocol .RequestCommandTCP )
71
+ bs := buffer .Bytes ()
72
+ user , aead , _ , ivLen , err : = validator .Get (bs , protocol .RequestCommandTCP )
93
73
94
- if user != nil {
95
- if ivLen > 0 {
96
- iv = append ([]byte (nil ), bs [:ivLen ]... )
97
- }
98
- reader = & FullReader {reader , bs [ivLen :]}
74
+ switch err {
75
+ case ErrNotFound :
76
+ readSizeRemain -= int (buffer .Len ())
77
+ DrainConnN (reader , readSizeRemain )
78
+ return nil , nil , newError ("failed to match an user" ).Base (err )
79
+ case ErrIVNotUnique :
80
+ readSizeRemain -= int (buffer .Len ())
81
+ DrainConnN (reader , readSizeRemain )
82
+ return nil , nil , newError ("failed iv check" ).Base (err )
83
+ default :
84
+ reader = & FullReader {reader , bs [ivLen :]}
85
+ readSizeRemain -= int (ivLen )
86
+
87
+ if aead != nil {
99
88
auth := & crypto.AEADAuthenticator {
100
89
AEAD : aead ,
101
90
NonceGenerator : crypto .GenerateInitialAEADNonce (),
102
91
}
103
- r2 = crypto .NewAuthenticationReader (auth , & crypto.AEADChunkSizeParser {
92
+ r = crypto .NewAuthenticationReader (auth , & crypto.AEADChunkSizeParser {
104
93
Auth : auth ,
105
94
}, reader , protocol .TransferTypeStream , nil )
106
95
} else {
107
- readSizeRemain -= int (buffer .Len ())
108
- DrainConnN (reader , readSizeRemain )
109
- return nil , nil , newError ("failed to match an user" ).Base (err )
110
- }
111
- } else {
112
- user , ivLen = validator .GetOnlyUser ()
113
- account := user .Account .(* MemoryAccount )
114
- hashkdf .Write (account .Key )
115
- if ivLen > 0 {
116
- if _ , err := buffer .ReadFullFrom (reader , ivLen ); err != nil {
117
- readSizeRemain -= int (buffer .Len ())
96
+ account := user .Account .(* MemoryAccount )
97
+ iv := append ([]byte (nil ), buffer .BytesTo (ivLen )... )
98
+ r , err = account .Cipher .NewDecryptionReader (account .Key , iv , reader )
99
+ if err != nil {
118
100
DrainConnN (reader , readSizeRemain )
119
- return nil , nil , newError ("failed to read IV " ).Base (err )
101
+ return nil , nil , newError ("failed to initialize decoding stream " ).Base (err ). AtError ( )
120
102
}
121
- iv = append ([]byte (nil ), buffer .BytesTo (ivLen )... )
122
- }
123
-
124
- r , err := account .Cipher .NewDecryptionReader (account .Key , iv , reader )
125
- if err != nil {
126
- readSizeRemain -= int (buffer .Len ())
127
- DrainConnN (reader , readSizeRemain )
128
- return nil , nil , newError ("failed to initialize decoding stream" ).Base (err ).AtError ()
129
103
}
130
- r2 = r
131
104
}
132
105
133
- br := & buf.BufferedReader {Reader : r2 }
106
+ br := & buf.BufferedReader {Reader : r }
134
107
135
108
request := & protocol.RequestHeader {
136
109
Version : Version ,
137
110
User : user ,
138
111
Command : protocol .RequestCommandTCP ,
139
112
}
140
113
141
- readSizeRemain -= int (buffer .Len ())
142
114
buffer .Clear ()
143
115
144
116
addr , port , err := addrParser .ReadAddressPort (buffer , br )
@@ -157,13 +129,6 @@ func ReadTCPSession(validator *Validator, reader io.Reader) (*protocol.RequestHe
157
129
return nil , nil , newError ("invalid remote address." )
158
130
}
159
131
160
- account := user .Account .(* MemoryAccount )
161
- if ivError := account .CheckIV (iv ); ivError != nil {
162
- readSizeRemain -= int (buffer .Len ())
163
- DrainConnN (reader , readSizeRemain )
164
- return nil , nil , newError ("failed iv check" ).Base (ivError )
165
- }
166
-
167
132
return request , br , nil
168
133
}
169
134
@@ -273,34 +238,25 @@ func DecodeUDPPacket(validator *Validator, payload *buf.Buffer) (*protocol.Reque
273
238
return nil , nil , newError ("len(bs) <= 32" )
274
239
}
275
240
276
- var user * protocol.MemoryUser
277
- var err error
278
-
279
- count := validator .Count ()
280
- if count == 0 {
281
- return nil , nil , newError ("invalid user" )
282
- } else if count > 1 {
283
- var d []byte
284
- user , _ , d , _ , err = validator .Get (bs , protocol .RequestCommandUDP )
285
-
286
- if user != nil {
241
+ user , _ , d , _ , err := validator .Get (bs , protocol .RequestCommandUDP )
242
+ switch err {
243
+ case ErrIVNotUnique :
244
+ return nil , nil , newError ("failed iv check" ).Base (err )
245
+ case ErrNotFound :
246
+ return nil , nil , newError ("failed to match an user" ).Base (err )
247
+ default :
248
+ account := user .Account .(* MemoryAccount )
249
+ if account .Cipher .IsAEAD () {
287
250
payload .Clear ()
288
251
payload .Write (d )
289
252
} else {
290
- return nil , nil , newError ("failed to decrypt UDP payload" ).Base (err )
291
- }
292
- } else {
293
- user , _ = validator .GetOnlyUser ()
294
- account := user .Account .(* MemoryAccount )
295
-
296
- var iv []byte
297
- if ! account .Cipher .IsAEAD () && account .Cipher .IVSize () > 0 {
298
- // Keep track of IV as it gets removed from payload in DecodePacket.
299
- iv = make ([]byte , account .Cipher .IVSize ())
300
- copy (iv , payload .BytesTo (account .Cipher .IVSize ()))
301
- }
302
- if err = account .Cipher .DecodePacket (account .Key , payload ); err != nil {
303
- return nil , nil , newError ("failed to decrypt UDP payload" ).Base (err )
253
+ if account .Cipher .IVSize () > 0 {
254
+ iv := make ([]byte , account .Cipher .IVSize ())
255
+ copy (iv , payload .BytesTo (account .Cipher .IVSize ()))
256
+ }
257
+ if err = account .Cipher .DecodePacket (account .Key , payload ); err != nil {
258
+ return nil , nil , newError ("failed to decrypt UDP payload" ).Base (err )
259
+ }
304
260
}
305
261
}
306
262
0 commit comments