github.com/metacubex/mihomo@v1.18.5/component/sniffer/sniff_test.go (about) 1 package sniffer 2 3 import ( 4 "bytes" 5 "encoding/hex" 6 "github.com/stretchr/testify/assert" 7 "testing" 8 ) 9 10 func TestQuicHeaders(t *testing.T) { 11 cases := []struct { 12 input string 13 domain string 14 }{ 15 { 16 input: "cd0000000108f1fb7bcc78aa5e7203a8f86400421531fe825b19541876db6c55c38890cd73149d267a084afee6087304095417a3033df6a81bbb71d8512e7a3e16df1e277cae5df3182cb214b8fe982ba3fdffbaa9ffec474547d55945f0fddbeadfb0b5243890b2fa3da45169e2bd34ec04b2e29382f48d612b28432a559757504d158e9e505407a77dd34f4b60b8d3b555ee85aacd6648686802f4de25e7216b19e54c5f78e8a5963380c742d861306db4c16e4f7fc94957aa50b9578a0b61f1e406b2ad5f0cd3cd271c4d99476409797b0c3cb3efec256118912d4b7e4fd79d9cb9016b6e5eaa4f5e57b637b217755daf8968a4092bed0ed5413f5d04904b3a61e4064f9211b2629e5b52a89c7b19f37a713e41e27743ea6dfa736dfa1bb0a4b2bc8c8dc632c6ce963493a20c550e6fdb2475213665e9a85cfc394da9cec0cf41f0c8abed3fc83be5245b2b5aa5e825d29349f721d30774ef5bf965b540f3d8d98febe20956b1fc8fa047e10e7d2f921c9c6622389e02322e80621a1cf5264e245b7276966eb02932584e3f7038bd36aa908766ad3fb98344025dec18670d6db43a1c5daac00937fce7b7c7d61ff4e6efd01a2bdee0ee183108b926393df4f3d74bbcbb015f240e7e346b7d01c41111a401225ce3b095ab4623a5836169bf9599eeca79d1d2e9b2202b5960a09211e978058d6fc0484eff3e91ce4649a5e3ba15b906d334cf66e28d9ff575406e1ae1ac2febafd72870b6f5d58fc5fb949cb1f40feb7c1d9ce5e71b", 17 domain: "www.google.com", 18 }, 19 { 20 input: "c3000000011266f50524e8d0fe88cbf51e3ad71a13198235000044c82dc5d943fb34cc6d5c5e433610dc7a44f5951935c2c1d14ac641b02472340a892c4492dbfe3f8262109108fc36d96bdc1e9e46b5f1f6ef6104add2aafbfd8e79246eb3b4637541aaed7d195571724e642ab4d31c909f1db86e7d8516117ce8716bd1e3acb664c499086b0f3bc7258595420e7bb969f934457d195e832ffff4ffddf11123eeadacc48190e356c8f0f6abc381deb7e285e3b0613a795b19bddb9f002ffdf6fd70f0ff2072302b33d2421aac6540bb9f0e85c7237af0dd56225b2264d769160febab952e64bd5155f23e58c6113891143f946591032b41816aed3ac54f521f60605f86791de24c5765b664c1348cc53d5d631b4bbefe1915f2b21fefafb47badeb72d8ba1fd5c3cfeb0ba9d0112396f170e94cd33952c4fa87997b870931bf1a300e8e127f530815ff087815b4f9d004cbcd17013ac143847572a1655a5b36e054e8b9951d747c2c6ff25d7b2edb13a2a6b8074062332f2191f6830cf435a4ed9db5d9c4eb43a143bf3edf0c48f6f9435dafad4afb743a5a33990379df953ecd388e848aff0ebba9ccc052b8303c0bd1fee7e7553af1894e81b7772818bb69249540ccb8cfb47b1517abaf71c81c3bd271f1a5f1b66465f850f377c9db682b8e543c3d0c10fcd2dee263630889b7d1d521d1d27e866ea4ab5f43790d6a7f76ceefd5783678ca92cc131fa42fc4a01e2a81cad734ddf17a53e1bda8e0a21afc9e8c1118c9459b13519f5b3c3d9692c92234f01129d47ae8ec70625170847472801190b46d36f73b868f55f5a18a3cb05af6d38610e0829e4fbf13ddcc202341702e43dcf33be76ff4afe327e5783287c137aad075752940b41e7d9f5146e36d908897c6d7a9fdc343fde2d9c9d6e6a6b237669bd3e6abe0a732861a679eadfa29a876c6a646953c9361830811b012b26b31c9e7158f8de9c9a108346ddee3dd3886da6258364c1281bff8e055f6384e3a23e198b5e6b726fa7f811b3338072019d4b5fd05891770d11e3ed6ab5f7ed33db1c6220c5aa8fa1909949ac55d5435b75982e17aa80940fa574f0aba4dc340129cad491fdf1f5e05c4e83e36ad29ff38f15e1c9436c792024442f57f07583d671dd05446c84ea20b471303f6ae4e5e13f244d671e0ebe94d3d5c17d3f3f378cdd51fa8a6d2c977c78a2397dd1e251cd979803d617d45f575e5d9db0a28b3c4c25fe2af24af5bddac09786b6d6d8aa19cfbd5409bdbfed7d518ef5c863f3ee757bd9d37cddc546cc57d2e52b6ae58789f297a300f1d76c3842603eae4b1224de31a939a68875c86e697aeebf7ebc65568f43fc681bacab830ac4a2164d324e90067125bad702192d01cb3cb3d2689ae681967e86fd7ac93a25cf2e905c88ca5ad7d11962f021754cf3f61224517bd3411d5b5a83955bcea79d702466d073a6eaadc1202b3693e555b051a5b19457023a01e7f943742bb7f5f8aeba8d4e363973aebdccfb12479619cfb93e833be702a307e796dc7431a48abd9b755b392c510b98cd20ef778e2ac88d6a04f23ba8a253d7eb7c13e0c88c3a21f7e23857c58704d139703a47e0965bf2dc8810dc36894ac1f3da73c155e271c106a718b2d184e4e5637c820fe909984642960edfc9e62ac50af5dd3feee6bc560ced7bda676d4e290c9c5916fad52180bbc83d3483e95c79bac15c209936f21042dc2b6253eefdac06e7f4745044eaa0acedabf1d1c8cd9402738", 21 domain: "cloudflare-dns.com", 22 }, 23 } 24 q, err := NewQuicSniffer(SnifferConfig{}) 25 assert.NoError(t, err) 26 27 for _, test := range cases { 28 pkt, err := hex.DecodeString(test.input) 29 assert.NoError(t, err) 30 oriPkt := bytes.Clone(pkt) 31 domain, err := q.SniffData(pkt) 32 assert.NoError(t, err) 33 assert.Equal(t, test.domain, domain) 34 assert.Equal(t, oriPkt, pkt) // ensure input data not changed 35 } 36 } 37 38 func TestTLSHeaders(t *testing.T) { 39 cases := []struct { 40 input []byte 41 domain string 42 err bool 43 }{ 44 { 45 input: []byte{ 46 0x16, 0x03, 0x01, 0x00, 0xc8, 0x01, 0x00, 0x00, 47 0xc4, 0x03, 0x03, 0x1a, 0xac, 0xb2, 0xa8, 0xfe, 48 0xb4, 0x96, 0x04, 0x5b, 0xca, 0xf7, 0xc1, 0xf4, 49 0x2e, 0x53, 0x24, 0x6e, 0x34, 0x0c, 0x58, 0x36, 50 0x71, 0x97, 0x59, 0xe9, 0x41, 0x66, 0xe2, 0x43, 51 0xa0, 0x13, 0xb6, 0x00, 0x00, 0x20, 0x1a, 0x1a, 52 0xc0, 0x2b, 0xc0, 0x2f, 0xc0, 0x2c, 0xc0, 0x30, 53 0xcc, 0xa9, 0xcc, 0xa8, 0xcc, 0x14, 0xcc, 0x13, 54 0xc0, 0x13, 0xc0, 0x14, 0x00, 0x9c, 0x00, 0x9d, 55 0x00, 0x2f, 0x00, 0x35, 0x00, 0x0a, 0x01, 0x00, 56 0x00, 0x7b, 0xba, 0xba, 0x00, 0x00, 0xff, 0x01, 57 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 58 0x14, 0x00, 0x00, 0x11, 0x63, 0x2e, 0x73, 0x2d, 59 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 60 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x00, 0x17, 0x00, 61 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x0d, 0x00, 62 0x14, 0x00, 0x12, 0x04, 0x03, 0x08, 0x04, 0x04, 63 0x01, 0x05, 0x03, 0x08, 0x05, 0x05, 0x01, 0x08, 64 0x06, 0x06, 0x01, 0x02, 0x01, 0x00, 0x05, 0x00, 65 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 66 0x00, 0x00, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x0c, 67 0x02, 0x68, 0x32, 0x08, 0x68, 0x74, 0x74, 0x70, 68 0x2f, 0x31, 0x2e, 0x31, 0x00, 0x0b, 0x00, 0x02, 69 0x01, 0x00, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x08, 70 0xaa, 0xaa, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x18, 71 0xaa, 0xaa, 0x00, 0x01, 0x00, 72 }, 73 domain: "c.s-microsoft.com", 74 err: false, 75 }, 76 { 77 input: []byte{ 78 0x16, 0x03, 0x01, 0x00, 0xee, 0x01, 0x00, 0x00, 79 0xea, 0x03, 0x03, 0xe7, 0x91, 0x9e, 0x93, 0xca, 80 0x78, 0x1b, 0x3c, 0xe0, 0x65, 0x25, 0x58, 0xb5, 81 0x93, 0xe1, 0x0f, 0x85, 0xec, 0x9a, 0x66, 0x8e, 82 0x61, 0x82, 0x88, 0xc8, 0xfc, 0xae, 0x1e, 0xca, 83 0xd7, 0xa5, 0x63, 0x20, 0xbd, 0x1c, 0x00, 0x00, 84 0x8b, 0xee, 0x09, 0xe3, 0x47, 0x6a, 0x0e, 0x74, 85 0xb0, 0xbc, 0xa3, 0x02, 0xa7, 0x35, 0xe8, 0x85, 86 0x70, 0x7c, 0x7a, 0xf0, 0x00, 0xdf, 0x4a, 0xea, 87 0x87, 0x01, 0x14, 0x91, 0x00, 0x20, 0xea, 0xea, 88 0xc0, 0x2b, 0xc0, 0x2f, 0xc0, 0x2c, 0xc0, 0x30, 89 0xcc, 0xa9, 0xcc, 0xa8, 0xcc, 0x14, 0xcc, 0x13, 90 0xc0, 0x13, 0xc0, 0x14, 0x00, 0x9c, 0x00, 0x9d, 91 0x00, 0x2f, 0x00, 0x35, 0x00, 0x0a, 0x01, 0x00, 92 0x00, 0x81, 0x9a, 0x9a, 0x00, 0x00, 0xff, 0x01, 93 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 94 0x16, 0x00, 0x00, 0x13, 0x77, 0x77, 0x77, 0x30, 95 0x37, 0x2e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x74, 96 0x61, 0x6c, 0x65, 0x2e, 0x6e, 0x65, 0x74, 0x00, 97 0x17, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 98 0x0d, 0x00, 0x14, 0x00, 0x12, 0x04, 0x03, 0x08, 99 0x04, 0x04, 0x01, 0x05, 0x03, 0x08, 0x05, 0x05, 100 0x01, 0x08, 0x06, 0x06, 0x01, 0x02, 0x01, 0x00, 101 0x05, 0x00, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 102 0x00, 0x12, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0e, 103 0x00, 0x0c, 0x02, 0x68, 0x32, 0x08, 0x68, 0x74, 104 0x74, 0x70, 0x2f, 0x31, 0x2e, 0x31, 0x75, 0x50, 105 0x00, 0x00, 0x00, 0x0b, 0x00, 0x02, 0x01, 0x00, 106 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x08, 0x9a, 0x9a, 107 0x00, 0x1d, 0x00, 0x17, 0x00, 0x18, 0x8a, 0x8a, 108 0x00, 0x01, 0x00, 109 }, 110 domain: "www07.clicktale.net", 111 err: false, 112 }, 113 { 114 input: []byte{ 115 0x16, 0x03, 0x01, 0x00, 0xe6, 0x01, 0x00, 0x00, 0xe2, 0x03, 0x03, 0x81, 0x47, 0xc1, 116 0x66, 0xd5, 0x1b, 0xfa, 0x4b, 0xb5, 0xe0, 0x2a, 0xe1, 0xa7, 0x87, 0x13, 0x1d, 0x11, 0xaa, 0xc6, 117 0xce, 0xfc, 0x7f, 0xab, 0x94, 0xc8, 0x62, 0xad, 0xc8, 0xab, 0x0c, 0xdd, 0xcb, 0x20, 0x6f, 0x9d, 118 0x07, 0xf1, 0x95, 0x3e, 0x99, 0xd8, 0xf3, 0x6d, 0x97, 0xee, 0x19, 0x0b, 0x06, 0x1b, 0xf4, 0x84, 119 0x0b, 0xb6, 0x8f, 0xcc, 0xde, 0xe2, 0xd0, 0x2d, 0x6b, 0x0c, 0x1f, 0x52, 0x53, 0x13, 0x00, 0x08, 120 0x13, 0x02, 0x13, 0x03, 0x13, 0x01, 0x00, 0xff, 0x01, 0x00, 0x00, 0x91, 0x00, 0x00, 0x00, 0x0c, 121 0x00, 0x0a, 0x00, 0x00, 0x07, 0x64, 0x6f, 0x67, 0x66, 0x69, 0x73, 0x68, 0x00, 0x0b, 0x00, 0x04, 122 0x03, 0x00, 0x01, 0x02, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x0a, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x1e, 123 0x00, 0x19, 0x00, 0x18, 0x00, 0x23, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 124 0x00, 0x0d, 0x00, 0x1e, 0x00, 0x1c, 0x04, 0x03, 0x05, 0x03, 0x06, 0x03, 0x08, 0x07, 0x08, 0x08, 125 0x08, 0x09, 0x08, 0x0a, 0x08, 0x0b, 0x08, 0x04, 0x08, 0x05, 0x08, 0x06, 0x04, 0x01, 0x05, 0x01, 126 0x06, 0x01, 0x00, 0x2b, 0x00, 0x07, 0x06, 0x7f, 0x1c, 0x7f, 0x1b, 0x7f, 0x1a, 0x00, 0x2d, 0x00, 127 0x02, 0x01, 0x01, 0x00, 0x33, 0x00, 0x26, 0x00, 0x24, 0x00, 0x1d, 0x00, 0x20, 0x2f, 0x35, 0x0c, 128 0xb6, 0x90, 0x0a, 0xb7, 0xd5, 0xc4, 0x1b, 0x2f, 0x60, 0xaa, 0x56, 0x7b, 0x3f, 0x71, 0xc8, 0x01, 129 0x7e, 0x86, 0xd3, 0xb7, 0x0c, 0x29, 0x1a, 0x9e, 0x5b, 0x38, 0x3f, 0x01, 0x72, 130 }, 131 domain: "dogfish", 132 err: false, 133 }, 134 { 135 input: []byte{ 136 0x16, 0x03, 0x01, 0x01, 0x03, 0x01, 0x00, 0x00, 137 0xff, 0x03, 0x03, 0x3d, 0x89, 0x52, 0x9e, 0xee, 138 0xbe, 0x17, 0x63, 0x75, 0xef, 0x29, 0xbd, 0x14, 139 0x6a, 0x49, 0xe0, 0x2c, 0x37, 0x57, 0x71, 0x62, 140 0x82, 0x44, 0x94, 0x8f, 0x6e, 0x94, 0x08, 0x45, 141 0x7f, 0xdb, 0xc1, 0x00, 0x00, 0x3e, 0xc0, 0x2c, 142 0xc0, 0x30, 0x00, 0x9f, 0xcc, 0xa9, 0xcc, 0xa8, 143 0xcc, 0xaa, 0xc0, 0x2b, 0xc0, 0x2f, 0x00, 0x9e, 144 0xc0, 0x24, 0xc0, 0x28, 0x00, 0x6b, 0xc0, 0x23, 145 0xc0, 0x27, 0x00, 0x67, 0xc0, 0x0a, 0xc0, 0x14, 146 0x00, 0x39, 0xc0, 0x09, 0xc0, 0x13, 0x00, 0x33, 147 0x00, 0x9d, 0x00, 0x9c, 0x13, 0x02, 0x13, 0x03, 148 0x13, 0x01, 0x00, 0x3d, 0x00, 0x3c, 0x00, 0x35, 149 0x00, 0x2f, 0x00, 0xff, 0x01, 0x00, 0x00, 0x98, 150 0x00, 0x00, 0x00, 0x10, 0x00, 0x0e, 0x00, 0x00, 151 0x0b, 0x31, 0x30, 0x2e, 0x34, 0x32, 0x2e, 0x30, 152 0x2e, 0x32, 0x34, 0x33, 0x00, 0x0b, 0x00, 0x04, 153 0x03, 0x00, 0x01, 0x02, 0x00, 0x0a, 0x00, 0x0a, 154 0x00, 0x08, 0x00, 0x1d, 0x00, 0x17, 0x00, 0x19, 155 0x00, 0x18, 0x00, 0x23, 0x00, 0x00, 0x00, 0x0d, 156 0x00, 0x20, 0x00, 0x1e, 0x04, 0x03, 0x05, 0x03, 157 0x06, 0x03, 0x08, 0x04, 0x08, 0x05, 0x08, 0x06, 158 0x04, 0x01, 0x05, 0x01, 0x06, 0x01, 0x02, 0x03, 159 0x02, 0x01, 0x02, 0x02, 0x04, 0x02, 0x05, 0x02, 160 0x06, 0x02, 0x00, 0x16, 0x00, 0x00, 0x00, 0x17, 161 0x00, 0x00, 0x00, 0x2b, 0x00, 0x09, 0x08, 0x7f, 162 0x14, 0x03, 0x03, 0x03, 0x02, 0x03, 0x01, 0x00, 163 0x2d, 0x00, 0x03, 0x02, 0x01, 0x00, 0x00, 0x28, 164 0x00, 0x26, 0x00, 0x24, 0x00, 0x1d, 0x00, 0x20, 165 0x13, 0x7c, 0x6e, 0x97, 0xc4, 0xfd, 0x09, 0x2e, 166 0x70, 0x2f, 0x73, 0x5a, 0x9b, 0x57, 0x4d, 0x5f, 167 0x2b, 0x73, 0x2c, 0xa5, 0x4a, 0x98, 0x40, 0x3d, 168 0x75, 0x6e, 0xb4, 0x76, 0xf9, 0x48, 0x8f, 0x36, 169 }, 170 domain: "10.42.0.243", 171 err: false, 172 }, 173 } 174 175 for _, test := range cases { 176 input := bytes.Clone(test.input) 177 domain, err := SniffTLS(test.input) 178 if test.err { 179 if err == nil { 180 t.Errorf("Exepct error but nil in test %v", test) 181 } 182 } else { 183 if err != nil { 184 t.Errorf("Expect no error but actually %s in test %v", err.Error(), test) 185 } 186 if *domain != test.domain { 187 t.Error("expect domain ", test.domain, " but got ", domain) 188 } 189 } 190 assert.Equal(t, input, test.input) 191 } 192 }