|  | @@ -10,10 +10,13 @@ import (
 | 
	
		
			
				|  |  |  	"fmt"
 | 
	
		
			
				|  |  |  	"io"
 | 
	
		
			
				|  |  |  	mrand "math/rand"
 | 
	
		
			
				|  |  | +	"time"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	"github.com/v2ray/v2ray-core"
 | 
	
		
			
				|  |  | +	v2hash "github.com/v2ray/v2ray-core/hash"
 | 
	
		
			
				|  |  |  	v2io "github.com/v2ray/v2ray-core/io"
 | 
	
		
			
				|  |  |  	"github.com/v2ray/v2ray-core/log"
 | 
	
		
			
				|  |  | +	v2math "github.com/v2ray/v2ray-core/math"
 | 
	
		
			
				|  |  |  	v2net "github.com/v2ray/v2ray-core/net"
 | 
	
		
			
				|  |  |  )
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -57,7 +60,6 @@ func NewVMessRequestReader(vUserSet core.UserSet) *VMessRequestReader {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  func (r *VMessRequestReader) Read(reader io.Reader) (*VMessRequest, error) {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  	buffer := make([]byte, 256)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	nBytes, err := reader.Read(buffer[:core.IDBytesLen])
 | 
	
	
		
			
				|  | @@ -76,7 +78,7 @@ func (r *VMessRequestReader) Read(reader io.Reader) (*VMessRequest, error) {
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  |  		return nil, err
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	aesStream := cipher.NewCFBDecrypter(aesCipher, core.TimestampHash(timeSec))
 | 
	
		
			
				|  |  | +	aesStream := cipher.NewCFBDecrypter(aesCipher, v2hash.Int64Hash(timeSec))
 | 
	
		
			
				|  |  |  	decryptor := v2io.NewCryptionReader(aesStream, reader)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
	
		
			
				|  | @@ -180,18 +182,25 @@ func (r *VMessRequestReader) Read(reader io.Reader) (*VMessRequest, error) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  type VMessRequestWriter struct {
 | 
	
		
			
				|  |  | +	idHash           v2hash.CounterHash
 | 
	
		
			
				|  |  | +	randomRangeInt64 v2math.RandomInt64InRange
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -func NewVMessRequestWriter() *VMessRequestWriter {
 | 
	
		
			
				|  |  | -	return &VMessRequestWriter{}
 | 
	
		
			
				|  |  | +func NewVMessRequestWriter(idHash v2hash.CounterHash, randomRangeInt64 v2math.RandomInt64InRange) *VMessRequestWriter {
 | 
	
		
			
				|  |  | +	return &VMessRequestWriter{
 | 
	
		
			
				|  |  | +		idHash:           idHash,
 | 
	
		
			
				|  |  | +		randomRangeInt64: randomRangeInt64,
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  func (w *VMessRequestWriter) Write(writer io.Writer, request *VMessRequest) error {
 | 
	
		
			
				|  |  |  	buffer := make([]byte, 0, 300)
 | 
	
		
			
				|  |  | -	userHash, timeSec := request.UserId.TimeRangeHash(30)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	log.Debug("Writing userhash: %v", userHash)
 | 
	
		
			
				|  |  | -	buffer = append(buffer, userHash...)
 | 
	
		
			
				|  |  | +	counter := w.randomRangeInt64(time.Now().UTC().Unix(), 30)
 | 
	
		
			
				|  |  | +	idHash := w.idHash.Hash(request.UserId.Bytes, counter)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	log.Debug("Writing userhash: %v", idHash)
 | 
	
		
			
				|  |  | +	buffer = append(buffer, idHash...)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	encryptionBegin := len(buffer)
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -241,7 +250,7 @@ func (w *VMessRequestWriter) Write(writer io.Writer, request *VMessRequest) erro
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  |  		return err
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	aesStream := cipher.NewCFBEncrypter(aesCipher, core.TimestampHash(timeSec))
 | 
	
		
			
				|  |  | +	aesStream := cipher.NewCFBEncrypter(aesCipher, v2hash.Int64Hash(counter))
 | 
	
		
			
				|  |  |  	cWriter := v2io.NewCryptionWriter(aesStream, writer)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	_, err = writer.Write(buffer[0:encryptionBegin])
 |