github.com/Psiphon-Labs/psiphon-tunnel-core@v2.0.28+incompatible/psiphon/common/obfuscator/passthrough_test.go (about) 1 /* 2 * Copyright (c) 2020, Psiphon Inc. 3 * All rights reserved. 4 * 5 * This program is free software: you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation, either version 3 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program. If not, see <http://www.gnu.org/licenses/>. 17 * 18 */ 19 20 package obfuscator 21 22 import ( 23 "bytes" 24 "fmt" 25 "testing" 26 "time" 27 ) 28 29 func TestTLSPassthrough(t *testing.T) { 30 31 // Use artificially low time factor period for test 32 timePeriodSeconds = 2 33 34 correctMasterKey := "correct-master-key" 35 incorrectMasterKey := "incorrect-master-key" 36 37 for _, useTimeFactor := range []bool{false, true} { 38 39 t.Run(fmt.Sprintf("useTimeFactor: %v", useTimeFactor), func(t *testing.T) { 40 41 // test: valid passthrough message 42 43 validMessage, err := MakeTLSPassthroughMessage(useTimeFactor, correctMasterKey) 44 if err != nil { 45 t.Fatalf("MakeTLSPassthroughMessage failed: %s", err) 46 } 47 48 startTime := time.Now() 49 50 if !VerifyTLSPassthroughMessage(useTimeFactor, correctMasterKey, validMessage) { 51 t.Fatalf("unexpected invalid passthrough message") 52 } 53 54 correctElapsedTime := time.Now().Sub(startTime) 55 56 // test: passthrough messages are not identical 57 58 anotherValidMessage, err := MakeTLSPassthroughMessage(useTimeFactor, correctMasterKey) 59 if err != nil { 60 t.Fatalf("MakeTLSPassthroughMessage failed: %s", err) 61 } 62 63 if bytes.Equal(validMessage, anotherValidMessage) { 64 t.Fatalf("unexpected identical passthrough messages") 65 } 66 67 // test: valid passthrough message still valid within time factor period 68 69 time.Sleep(1 * time.Millisecond) 70 71 if !VerifyTLSPassthroughMessage(useTimeFactor, correctMasterKey, validMessage) { 72 t.Fatalf("unexpected invalid delayed passthrough message") 73 } 74 75 // test: valid passthrough message now invalid after time factor period 76 77 time.Sleep(time.Duration(timePeriodSeconds)*time.Second + time.Millisecond) 78 79 verified := VerifyTLSPassthroughMessage(useTimeFactor, correctMasterKey, validMessage) 80 81 if verified && useTimeFactor { 82 t.Fatalf("unexpected replayed passthrough message") 83 } 84 85 // test: invalid passthrough message with incorrect key 86 87 invalidMessage, err := MakeTLSPassthroughMessage(useTimeFactor, incorrectMasterKey) 88 if err != nil { 89 t.Fatalf("MakeTLSPassthroughMessage failed: %s", err) 90 } 91 92 startTime = time.Now() 93 94 if VerifyTLSPassthroughMessage(useTimeFactor, correctMasterKey, invalidMessage) { 95 t.Fatalf("unexpected valid passthrough message") 96 } 97 98 incorrectElapsedTime := time.Now().Sub(startTime) 99 100 // test: valid/invalid elapsed times are nearly identical 101 102 timeDiff := correctElapsedTime - incorrectElapsedTime 103 if timeDiff < 0 { 104 timeDiff = -timeDiff 105 } 106 107 if timeDiff.Microseconds() > 500 { 108 t.Fatalf("unexpected elapsed time difference: %v", timeDiff) 109 } 110 111 // test: invalid message length and elapsed time 112 113 startTime = time.Now() 114 115 if VerifyTLSPassthroughMessage(useTimeFactor, correctMasterKey, invalidMessage[:16]) { 116 t.Fatalf("unexpected valid passthrough message with invalid length") 117 } 118 119 incorrectElapsedTime = time.Now().Sub(startTime) 120 121 timeDiff = correctElapsedTime - incorrectElapsedTime 122 if timeDiff < 0 { 123 timeDiff = -timeDiff 124 } 125 126 if timeDiff.Microseconds() > 100 { 127 t.Fatalf("unexpected elapsed time difference") 128 } 129 }) 130 } 131 }