Преглед изворни кода

Fix: padding length edge case and inadvertently commented out code

Rod Hynes пре 7 година
родитељ
комит
5ad9bad0ea
2 измењених фајлова са 12 додато и 8 уклоњено
  1. 9 5
      psiphon/common/quic/obfuscator.go
  2. 3 3
      psiphon/common/quic/obfuscator_test.go

+ 9 - 5
psiphon/common/quic/obfuscator.go

@@ -350,7 +350,7 @@ func (conn *ObfuscatedPacketConn) WriteTo(p []byte, addr net.Addr) (int, error)
 			maxPaddingLen = MAX_PADDING
 			maxPaddingLen = MAX_PADDING
 		}
 		}
 
 
-		paddingLen := 0 //maxPaddingLen //conn.getPaddingLen(maxPaddingLen)
+		paddingLen := conn.getPaddingLen(maxPaddingLen)
 
 
 		buffer[NONCE_SIZE] = uint8(paddingLen)
 		buffer[NONCE_SIZE] = uint8(paddingLen)
 		padding := buffer[(NONCE_SIZE + 1) : (NONCE_SIZE+1)+paddingLen]
 		padding := buffer[(NONCE_SIZE + 1) : (NONCE_SIZE+1)+paddingLen]
@@ -376,10 +376,12 @@ func (conn *ObfuscatedPacketConn) WriteTo(p []byte, addr net.Addr) (int, error)
 
 
 func (conn *ObfuscatedPacketConn) getPaddingLen(maxPadding int) int {
 func (conn *ObfuscatedPacketConn) getPaddingLen(maxPadding int) int {
 
 
-	// Selects uniformly from [0, n], using the ObfuscatedPacketConn's
+	// Selects uniformly from [0, maxPadding], using the ObfuscatedPacketConn's
 	// random stream.
 	// random stream.
 
 
-	if maxPadding < 0 || maxPadding > 255 {
+	maxRand := 255
+
+	if maxPadding < 0 || maxPadding > maxRand {
 		panic(fmt.Sprintf("unexpected max padding: %d", maxPadding))
 		panic(fmt.Sprintf("unexpected max padding: %d", maxPadding))
 	}
 	}
 
 
@@ -387,8 +389,10 @@ func (conn *ObfuscatedPacketConn) getPaddingLen(maxPadding int) int {
 		return 0
 		return 0
 	}
 	}
 
 
-	maxRand := 255
-	upperBound := maxRand - (maxRand % (maxPadding + 1))
+	upperBound := maxPadding
+	if maxPadding < 255 {
+		upperBound = maxRand - (maxRand % (maxPadding + 1))
+	}
 
 
 	for {
 	for {
 		var value [1]byte
 		var value [1]byte

+ 3 - 3
psiphon/common/quic/obfuscator_test.go

@@ -30,10 +30,10 @@ func TestPaddingLen(t *testing.T) {
 		t.Fatalf("NewObfuscatedPacketConnPacketConn failed: %s", err)
 		t.Fatalf("NewObfuscatedPacketConnPacketConn failed: %s", err)
 	}
 	}
 
 
-	for max := 0; max <= MAX_PADDING; max++ {
+	for max := 0; max <= 255; max++ {
 
 
 		counts := make(map[int]int)
 		counts := make(map[int]int)
-		repeats := 100000
+		repeats := 200000
 
 
 		for r := 0; r < repeats; r++ {
 		for r := 0; r < repeats; r++ {
 			padding := c.getPaddingLen(max)
 			padding := c.getPaddingLen(max)
@@ -46,7 +46,7 @@ func TestPaddingLen(t *testing.T) {
 		expected := repeats / (max + 1)
 		expected := repeats / (max + 1)
 
 
 		for i := 0; i <= max; i++ {
 		for i := 0; i <= max; i++ {
-			if counts[i] < (expected/10)*9 {
+			if counts[i] < (expected/10)*8 {
 				t.Logf("max = %d, counts = %+v", max, counts)
 				t.Logf("max = %d, counts = %+v", max, counts)
 				t.Fatalf("unexpected low count: max = %d, i = %d, count = %d", max, i, counts[i])
 				t.Fatalf("unexpected low count: max = %d, i = %d, count = %d", max, i, counts[i])
 			}
 			}