github.com/mholt/caddy-l4@v0.0.0-20241104153248-ec8fae209322/modules/l4openvpn/matcher_test.go (about)

     1  // Copyright 2024 VNXME
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package l4openvpn
    16  
    17  import (
    18  	"bytes"
    19  	"context"
    20  	"errors"
    21  	"fmt"
    22  	"io"
    23  	"net"
    24  	"slices"
    25  	"testing"
    26  
    27  	"github.com/caddyserver/caddy/v2"
    28  	"go.uber.org/zap"
    29  
    30  	"github.com/mholt/caddy-l4/layer4"
    31  )
    32  
    33  func assertNoError(t *testing.T, err error) {
    34  	t.Helper()
    35  	if err != nil && !errors.Is(err, io.EOF) && !errors.Is(err, io.ErrUnexpectedEOF) {
    36  		t.Fatalf("Unexpected error: %s\n", err)
    37  	}
    38  }
    39  
    40  func Test_AuthDigests_CheckAll(t *testing.T) {
    41  	plain := plainPacket1[9:14]
    42  	names := make(map[string]int, len(AuthDigests))
    43  	hashes := make([][]byte, 0, len(AuthDigests))
    44  	var hmac []byte
    45  	for i, ad := range AuthDigests {
    46  		if len(ad.Names) == 0 {
    47  			t.Fatalf("Test %d: there must be at least one name", i)
    48  		}
    49  		for j, name := range ad.Names {
    50  			if len(name) == 0 {
    51  				t.Fatalf("Test %d [%s]: empty name %d", i, ad.Names[0], j)
    52  			}
    53  			if k, existing := names[name]; existing {
    54  				t.Fatalf("Test %d [%s]: name %d [%s] used by %s", i, ad.Names[0], j, name, AuthDigests[k].Names[0])
    55  			}
    56  			names[name] = i
    57  		}
    58  		if ad.Size == 0 {
    59  			t.Fatalf("Test %d [%s]: zero size", i, ad.Names[0])
    60  		}
    61  		if !slices.Contains(AuthDigestSizes, ad.Size) {
    62  			t.Fatalf("Test %d [%s]: size missing in AuthDigestSizes", i, ad.Names[0])
    63  		}
    64  		if ad.Creator == nil && ad.Generator == nil {
    65  			t.Fatalf("Test %d [%s]: missing a creator or a generator", i, ad.Names[0])
    66  		}
    67  		if ad.Generator != nil {
    68  			hmac = ad.Generator(groupKey12.GetClientAuthKey(ad.Size), plain)
    69  		} else {
    70  			hmac = HMACCreateAndGenerate(ad.Creator, groupKey12.GetClientAuthKey(ad.Size), plain)
    71  		}
    72  		if len(hmac) != ad.Size {
    73  			t.Fatalf("Test %d [%s]: HMAC length doesn't match its size", i, ad.Names[0])
    74  		}
    75  		for j, existing := range hashes {
    76  			if bytes.Equal(hmac, existing) {
    77  				t.Fatalf("Test %d [%s]: HMAC bytes same as %s", i, ad.Names[0], AuthDigests[j].Names[0])
    78  			}
    79  		}
    80  		hashes = append(hashes, hmac)
    81  	}
    82  }
    83  
    84  func Test_MessagePlain_FromBytes_Match_ToBytes(t *testing.T) {
    85  	for i, packet := range [][]byte{
    86  		plainPacket1, plainPacket2,
    87  		plainPacket3, plainPacket4,
    88  	} {
    89  		msg := &MessagePlain{}
    90  		if err := msg.FromBytes(packet); err != nil {
    91  			t.Fatalf("Test %d: failed to unpack: %s", i, err)
    92  		}
    93  		if !bytes.Equal(packet, msg.ToBytes()) {
    94  			t.Fatalf("Test %d: failed to pack", i)
    95  		}
    96  		if !msg.Match() {
    97  			t.Fatalf("Test %d: failed to match", i)
    98  		}
    99  	}
   100  }
   101  
   102  func Test_MessageAuth_FromBytes_Match_ToBytes(t *testing.T) {
   103  	for i, packet := range [][]byte{
   104  		// Legacy digests
   105  		authMD5Packet1, authMD5Packet2,
   106  		authSHA1Packet1, authSHA1Packet2,
   107  		authRIPEMD160Packet1, authRIPEMD160Packet2,
   108  		// SHA2 digests
   109  		authSHA224Packet1, authSHA224Packet2,
   110  		authSHA256Packet1, authSHA256Packet2,
   111  		authSHA384Packet1, authSHA384Packet2,
   112  		authSHA512Packet1, authSHA512Packet2,
   113  		authSHA512224Packet1, authSHA512224Packet2,
   114  		authSHA512256Packet1, authSHA512256Packet2,
   115  		// SHA3 digests
   116  		authSHA3224Packet1, authSHA3224Packet2,
   117  		authSHA3256Packet1, authSHA3256Packet2,
   118  		authSHA3384Packet1, authSHA3384Packet2,
   119  		authSHA3512Packet1, authSHA3512Packet2,
   120  		// BLAKE digests
   121  		authBLAKE2s256Packet1, authBLAKE2s256Packet2,
   122  		authBLAKE2b512Packet1, authBLAKE2b512Packet2,
   123  	} {
   124  		msg := &MessageAuth{}
   125  		if err := msg.FromBytes(packet); err != nil {
   126  			t.Fatalf("Test %d: failed to unpack: %s", i, err)
   127  		}
   128  		if !msg.Match(true, false, nil, groupKey12) {
   129  			t.Fatalf("Test %d: failed to match", i)
   130  		}
   131  		if !bytes.Equal(packet, msg.ToBytes()) {
   132  			t.Fatalf("Test %d: failed to pack", i)
   133  		}
   134  	}
   135  }
   136  
   137  func Test_MessageAuth_FromBytes_Match(t *testing.T) {
   138  	for i, packet := range [][]byte{
   139  		// Legacy digests
   140  		authMD5Packet3, authMD5Packet4,
   141  		authSHA1Packet3, authSHA1Packet4,
   142  		// SHA2 digests
   143  		authSHA224Packet3, authSHA224Packet4,
   144  		authSHA256Packet3, authSHA256Packet4,
   145  		authSHA384Packet3, authSHA384Packet4,
   146  		authSHA512Packet3, authSHA512Packet4,
   147  	} {
   148  		msg := &MessageAuth{}
   149  		if err := msg.FromBytes(packet); err != nil {
   150  			t.Fatalf("Test %d: failed to unpack: %s", i, err)
   151  		}
   152  		if !msg.Match(true, true, nil, groupKey12) {
   153  			t.Fatalf("Test %d: failed to match", i)
   154  		}
   155  	}
   156  
   157  }
   158  
   159  func Test_MessageCrypt_FromBytes_Match_ToBytes(t *testing.T) {
   160  	for i, packet := range [][]byte{
   161  		cryptPacket1, cryptPacket2,
   162  	} {
   163  		msg := &MessageCrypt{}
   164  		if err := msg.FromBytes(packet); err != nil {
   165  			t.Fatalf("Test %d: failed to unpack: %s", i, err)
   166  		}
   167  		if !msg.Match(true, false, nil, groupKey12) {
   168  			t.Fatalf("Test %d: failed to match", i)
   169  		}
   170  		if !bytes.Equal(packet, msg.ToBytes()) {
   171  			t.Fatalf("Test %d: failed to pack", i)
   172  		}
   173  	}
   174  }
   175  
   176  func Test_MessageCrypt_FromBytes_Match(t *testing.T) {
   177  	for i, packet := range [][]byte{
   178  		cryptPacket3, cryptPacket4,
   179  	} {
   180  		msg := &MessageCrypt{}
   181  		if err := msg.FromBytes(packet); err != nil {
   182  			t.Fatalf("Test %d: failed to unpack: %s", i, err)
   183  		}
   184  		if !msg.Match(true, true, nil, groupKey12) {
   185  			t.Fatalf("Test %d: failed to match", i)
   186  		}
   187  	}
   188  }
   189  
   190  func Test_MessageCrypt2_FromBytes_Match_ToBytes(t *testing.T) {
   191  	for i, packet := range [][]byte{
   192  		crypt2Packet5, crypt2Packet6,
   193  	} {
   194  		msg := &MessageCrypt2{}
   195  		if err := msg.FromBytes(packet); err != nil {
   196  			t.Fatalf("Test %d: failed to unpack: %s", i, err)
   197  		}
   198  		if !msg.Match(true, false, nil, serverKey56, nil) {
   199  			t.Fatalf("Test %d: failed to match with a server key", i)
   200  		}
   201  		if !msg.Match(true, false, nil, nil, []*WrappedKey{clientKey56}) {
   202  			t.Fatalf("Test %d: failed to match with a client key", i)
   203  		}
   204  		if !bytes.Equal(packet, msg.ToBytes()) {
   205  			fmt.Printf("%x\n%x\n", packet, msg.ToBytes())
   206  			t.Fatalf("Test %d: failed to pack", i)
   207  		}
   208  	}
   209  }
   210  
   211  func Test_MessageCrypt2_FromBytes_Match(t *testing.T) {
   212  	for i, packet := range [][]byte{
   213  		crypt2Packet5, crypt2Packet6,
   214  	} {
   215  		msg := &MessageCrypt2{}
   216  		if err := msg.FromBytes(packet); err != nil {
   217  			t.Fatalf("Test %d: failed to unpack: %s", i, err)
   218  		}
   219  		if !msg.Match(true, false, nil, nil, nil) {
   220  			t.Fatalf("Test %d: failed to match", i)
   221  		}
   222  	}
   223  }
   224  
   225  func Test_MatchOpenVPN_Match(t *testing.T) {
   226  	type test struct {
   227  		matcher     *MatchOpenVPN
   228  		data        []byte
   229  		shouldMatch bool
   230  	}
   231  
   232  	modesNotAuth := []string{"crypt", "crypt2", "plain"}
   233  	modesNotPlain := []string{"auth", "crypt", "crypt2"}
   234  	modesNotCrypt := []string{"auth", "crypt2", "plain"}
   235  	modesNotCrypt2 := []string{"auth", "crypt", "plain"}
   236  
   237  	testsPlain := func() []test {
   238  		m0 := &MatchOpenVPN{}
   239  		m1 := &MatchOpenVPN{Modes: modesNotPlain}
   240  		tests := make([]test, 0, 3*2*2)
   241  		for i, packet := range [][]byte{
   242  			plainPacket1, plainPacket2,
   243  			plainPacket3, plainPacket4,
   244  		} {
   245  			tests = append(tests,
   246  				test{matcher: m0, data: packet[:MessagePlainBytesTotal-i-1], shouldMatch: false},
   247  				test{matcher: m0, data: packet, shouldMatch: true},
   248  				test{matcher: m1, data: packet, shouldMatch: false},
   249  			)
   250  		}
   251  		return tests
   252  	}()
   253  
   254  	testsKnownKeyAuth := func() []test {
   255  		m0 := &MatchOpenVPN{}
   256  		m1 := &MatchOpenVPN{IgnoreTimestamp: true}
   257  		m2 := &MatchOpenVPN{IgnoreTimestamp: true, Modes: modesNotAuth}
   258  		m3 := &MatchOpenVPN{IgnoreTimestamp: true, GroupKey: groupKey12Hex}
   259  		m4 := &MatchOpenVPN{IgnoreTimestamp: true, GroupKey: groupKey12Hex, AuthDigest: "shake128"}
   260  		m5 := &MatchOpenVPN{IgnoreTimestamp: true, GroupKey: groupKey12Hex, GroupKeyDirection: GroupKeyDirectionInverse}
   261  		tests := make([]test, 0, 6*15*2)
   262  		for _, packet := range [][]byte{
   263  			authMD5Packet1, authMD5Packet2,
   264  			authSHA1Packet1, authSHA1Packet2,
   265  			authRIPEMD160Packet1, authRIPEMD160Packet2,
   266  			authSHA224Packet1, authSHA224Packet2,
   267  			authSHA256Packet1, authSHA256Packet2,
   268  			authSHA384Packet1, authSHA384Packet2,
   269  			authSHA512Packet1, authSHA512Packet2,
   270  			authSHA512224Packet1, authSHA512224Packet2,
   271  			authSHA512256Packet1, authSHA512256Packet2,
   272  			authSHA3224Packet1, authSHA3224Packet2,
   273  			authSHA3256Packet1, authSHA3256Packet2,
   274  			authSHA3384Packet1, authSHA3384Packet2,
   275  			authSHA3512Packet1, authSHA3512Packet2,
   276  			authBLAKE2s256Packet1, authBLAKE2s256Packet2,
   277  			authBLAKE2b512Packet1, authBLAKE2b512Packet2,
   278  		} {
   279  			tests = append(tests,
   280  				test{matcher: m0, data: packet, shouldMatch: false},
   281  				test{matcher: m1, data: packet, shouldMatch: true},
   282  				test{matcher: m2, data: packet, shouldMatch: false},
   283  				test{matcher: m3, data: packet, shouldMatch: true},
   284  				test{matcher: m4, data: packet, shouldMatch: false},
   285  				test{matcher: m5, data: packet, shouldMatch: false},
   286  			)
   287  		}
   288  		return tests
   289  	}()
   290  
   291  	testsUnknownKeyAuth := func() []test {
   292  		m0 := &MatchOpenVPN{}
   293  		m1 := &MatchOpenVPN{IgnoreTimestamp: true}
   294  		m2 := &MatchOpenVPN{IgnoreTimestamp: true, Modes: modesNotAuth}
   295  		m3 := &MatchOpenVPN{IgnoreTimestamp: true, GroupKey: groupKey12Hex}
   296  		tests := make([]test, 0, 4*6*2)
   297  		for _, packet := range [][]byte{
   298  			authMD5Packet3, authMD5Packet4,
   299  			authSHA1Packet3, authSHA1Packet4,
   300  			authSHA224Packet3, authSHA224Packet4,
   301  			authSHA256Packet3, authSHA256Packet4,
   302  			authSHA384Packet3, authSHA384Packet4,
   303  			authSHA512Packet3, authSHA512Packet4,
   304  		} {
   305  			tests = append(tests,
   306  				test{matcher: m0, data: packet, shouldMatch: false},
   307  				test{matcher: m1, data: packet, shouldMatch: true},
   308  				test{matcher: m2, data: packet, shouldMatch: false},
   309  				test{matcher: m3, data: packet, shouldMatch: false},
   310  			)
   311  		}
   312  		return tests
   313  	}()
   314  
   315  	testsUnsupportedDigestsAuth := func() []test {
   316  		m0 := &MatchOpenVPN{}
   317  		m1 := &MatchOpenVPN{IgnoreTimestamp: true}
   318  		m2 := &MatchOpenVPN{IgnoreTimestamp: true, Modes: modesNotAuth}
   319  		m3 := &MatchOpenVPN{IgnoreTimestamp: true, GroupKey: groupKey12Hex}
   320  		tests := make([]test, 0, 4*6*2)
   321  		for _, packet := range [][]byte{
   322  			authMD5SHA1Packet1, authMD5SHA1Packet2,
   323  			authSM3Packet1, authSM3Packet2,
   324  			authWhirlpoolPacket1, authWhirlpoolPacket2,
   325  			authMD5SHA1Packet3, authMD5SHA1Packet4,
   326  		} {
   327  			tests = append(tests,
   328  				test{matcher: m0, data: packet, shouldMatch: false},
   329  				test{matcher: m1, data: packet, shouldMatch: true},
   330  				test{matcher: m2, data: packet, shouldMatch: false},
   331  				test{matcher: m3, data: packet, shouldMatch: false},
   332  			)
   333  		}
   334  		return tests
   335  	}()
   336  
   337  	testsKnownKeyCrypt := func() []test {
   338  		m0 := &MatchOpenVPN{}
   339  		m1 := &MatchOpenVPN{IgnoreTimestamp: true}
   340  		m2 := &MatchOpenVPN{IgnoreTimestamp: true, Modes: modesNotCrypt}
   341  		m3 := &MatchOpenVPN{IgnoreTimestamp: true, GroupKey: groupKey12Hex}
   342  		tests := make([]test, 0, 4*1*2)
   343  		for _, packet := range [][]byte{
   344  			cryptPacket1, cryptPacket2,
   345  		} {
   346  			tests = append(tests,
   347  				test{matcher: m0, data: packet, shouldMatch: false},
   348  				test{matcher: m1, data: packet, shouldMatch: true},
   349  				test{matcher: m2, data: packet, shouldMatch: false},
   350  				test{matcher: m3, data: packet, shouldMatch: true},
   351  			)
   352  		}
   353  		return tests
   354  	}()
   355  
   356  	testsUnknownKeyCrypt := func() []test {
   357  		m0 := &MatchOpenVPN{}
   358  		m1 := &MatchOpenVPN{IgnoreTimestamp: true}
   359  		m2 := &MatchOpenVPN{IgnoreTimestamp: true, Modes: modesNotCrypt}
   360  		m3 := &MatchOpenVPN{IgnoreTimestamp: true, GroupKey: groupKey12Hex}
   361  		tests := make([]test, 0, 4*1*2)
   362  		for _, packet := range [][]byte{
   363  			cryptPacket3, cryptPacket4,
   364  		} {
   365  			tests = append(tests,
   366  				test{matcher: m0, data: packet, shouldMatch: false},
   367  				test{matcher: m1, data: packet, shouldMatch: true},
   368  				test{matcher: m2, data: packet, shouldMatch: false},
   369  				test{matcher: m3, data: packet, shouldMatch: false},
   370  			)
   371  		}
   372  		return tests
   373  	}()
   374  
   375  	testsKnownKeyCrypt2 := func() []test {
   376  		m0 := &MatchOpenVPN{}
   377  		m1 := &MatchOpenVPN{IgnoreTimestamp: true}
   378  		m2 := &MatchOpenVPN{IgnoreTimestamp: true, Modes: modesNotCrypt2}
   379  		m3 := &MatchOpenVPN{IgnoreTimestamp: true, ServerKey: serverKey56Base64}
   380  		m4 := &MatchOpenVPN{IgnoreTimestamp: true, ClientKeys: []string{clientKey56Base64}}
   381  		tests := make([]test, 0, 5*1*2)
   382  		for _, packet := range [][]byte{
   383  			crypt2Packet5, crypt2Packet6,
   384  		} {
   385  			tests = append(tests,
   386  				test{matcher: m0, data: packet, shouldMatch: false},
   387  				test{matcher: m1, data: packet, shouldMatch: true},
   388  				test{matcher: m2, data: packet, shouldMatch: false},
   389  				test{matcher: m3, data: packet, shouldMatch: true},
   390  				test{matcher: m4, data: packet, shouldMatch: true},
   391  			)
   392  		}
   393  		return tests
   394  	}()
   395  
   396  	tests := make([]test, 0, len(testsPlain)+len(testsKnownKeyAuth)+len(testsUnknownKeyAuth)+
   397  		len(testsUnsupportedDigestsAuth)+len(testsKnownKeyCrypt)+len(testsUnknownKeyCrypt)+len(testsKnownKeyCrypt2))
   398  	tests = append(tests, testsPlain...)
   399  	tests = append(tests, testsKnownKeyAuth...)
   400  	tests = append(tests, testsUnknownKeyAuth...)
   401  	tests = append(tests, testsUnsupportedDigestsAuth...)
   402  	tests = append(tests, testsKnownKeyCrypt...)
   403  	tests = append(tests, testsUnknownKeyCrypt...)
   404  	tests = append(tests, testsKnownKeyCrypt2...)
   405  
   406  	ctx, cancel := caddy.NewContext(caddy.Context{Context: context.Background()})
   407  	defer cancel()
   408  
   409  	for i, tc := range tests {
   410  		func() {
   411  			err := tc.matcher.Provision(ctx)
   412  			assertNoError(t, err)
   413  
   414  			in, out := net.Pipe()
   415  			defer func() {
   416  				_, _ = io.Copy(io.Discard, out)
   417  				_ = out.Close()
   418  			}()
   419  
   420  			cx := layer4.WrapConnection(out, []byte{}, zap.NewNop())
   421  			go func() {
   422  				_, err := in.Write(tc.data)
   423  				assertNoError(t, err)
   424  				_ = in.Close()
   425  			}()
   426  
   427  			matched, err := tc.matcher.Match(cx)
   428  			assertNoError(t, err)
   429  
   430  			if matched != tc.shouldMatch {
   431  				if tc.shouldMatch {
   432  					t.Fatalf("Test %d: matcher did not match | %+v\n", i, tc.matcher)
   433  				} else {
   434  					t.Fatalf("Test %d: matcher should not match | %+v\n", i, tc.matcher)
   435  				}
   436  			}
   437  		}()
   438  	}
   439  }
   440  
   441  // https://github.com/OpenVPN/openvpn/blob/master/sample/sample-keys/ta.key
   442  var groupKey12Hex = "" +
   443  	"21d94830510107f8753d3b6f3145e01d" +
   444  	"ed37075115afcb0538ecdd8503ee9663" +
   445  	"7218c9ed38d908d594231d7d143c73da" +
   446  	"5055310f89d336da99c8b3dcb18909c7" +
   447  	"9dd44f540670ebc0f120beb7211e9683" +
   448  	"9cb542572c48bfa7ffaa9a22cb8304b7" +
   449  	"869b92f4442918e598745bb78ac8877f" +
   450  	"02b00a7cdef3f2446c130d39a7c45126" +
   451  	"9ef399fd6029cdfc80a7c604041312ab" +
   452  	"0a969bc906bdee6e6d707afdcbe8c7fb" +
   453  	"97beb66049c3d328340775025433ceba" +
   454  	"1e38008a826cf92443d903106199373b" +
   455  	"dadd9c2c735cf481e580db4e81b99f12" +
   456  	"e3f46b6159c687cd1b9e689f7712573c" +
   457  	"0f02735a45573dfb5cd55cf464942389" +
   458  	"2c7e91f439bdd7337a8ceebd302cfbfa"
   459  
   460  var groupKey12 = StaticKeyNewFromHex(groupKey12Hex, false, false)
   461  
   462  /*
   463   *	All the sample packets below are generated with the sample static key above.
   464   */
   465  
   466  var plainPacket1 = []byte{56, 131, 30, 193, 48, 89, 179, 111, 104, 0, 0, 0, 0, 0}
   467  var plainPacket2 = []byte{56, 48, 212, 183, 154, 72, 13, 92, 194, 0, 0, 0, 0, 0}
   468  
   469  var authMD5Packet1 = []byte{56, 108, 88, 142, 73, 58, 114, 77, 35, 45, 192, 5, 145, 148, 66, 118, 118, 229, 204, 60, 174, 162, 74, 50, 78, 0, 0, 0, 1, 102, 234, 243, 9, 0, 0, 0, 0, 0}
   470  var authMD5Packet2 = []byte{56, 31, 34, 72, 211, 219, 0, 85, 46, 200, 142, 75, 104, 53, 70, 109, 234, 137, 253, 29, 138, 148, 218, 83, 141, 0, 0, 0, 1, 102, 234, 243, 39, 0, 0, 0, 0, 0}
   471  var authSHA1Packet1 = []byte{56, 38, 129, 217, 92, 90, 2, 14, 97, 123, 32, 15, 106, 140, 112, 232, 206, 242, 138, 133, 246, 151, 31, 71, 44, 140, 201, 188, 248, 0, 0, 0, 1, 102, 234, 241, 204, 0, 0, 0, 0, 0}
   472  var authSHA1Packet2 = []byte{56, 200, 170, 60, 164, 170, 196, 13, 56, 240, 33, 30, 131, 14, 244, 151, 16, 1, 7, 173, 226, 133, 237, 132, 58, 101, 188, 6, 132, 0, 0, 0, 1, 102, 234, 242, 139, 0, 0, 0, 0, 0}
   473  var authRIPEMD160Packet1 = []byte{56, 30, 52, 26, 73, 175, 7, 96, 168, 184, 22, 237, 90, 206, 228, 15, 190, 115, 56, 133, 2, 91, 146, 56, 141, 94, 239, 86, 106, 0, 0, 0, 1, 102, 235, 48, 209, 0, 0, 0, 0, 0}
   474  var authRIPEMD160Packet2 = []byte{56, 248, 184, 244, 38, 24, 29, 19, 178, 189, 169, 134, 190, 27, 29, 4, 48, 38, 158, 6, 149, 140, 127, 148, 8, 199, 15, 254, 191, 0, 0, 0, 1, 102, 235, 48, 246, 0, 0, 0, 0, 0}
   475  
   476  var authSHA224Packet1 = []byte{56, 120, 162, 216, 21, 223, 131, 234, 134, 80, 127, 130, 174, 30, 102, 244, 238, 216, 176, 213, 66, 172, 6, 45, 221, 153, 93, 227, 228, 70, 180, 76, 82, 233, 176, 242, 229, 0, 0, 0, 1, 102, 234, 243, 221, 0, 0, 0, 0, 0}
   477  var authSHA224Packet2 = []byte{56, 122, 21, 55, 125, 40, 237, 190, 189, 15, 86, 80, 48, 61, 30, 49, 106, 231, 188, 22, 247, 221, 163, 252, 20, 146, 229, 246, 134, 11, 85, 67, 57, 90, 81, 233, 82, 0, 0, 0, 1, 102, 234, 243, 251, 0, 0, 0, 0, 0}
   478  var authSHA256Packet1 = []byte{56, 241, 168, 141, 190, 188, 201, 75, 111, 199, 1, 198, 27, 138, 167, 106, 34, 70, 142, 66, 147, 64, 216, 37, 38, 62, 8, 150, 42, 120, 226, 65, 81, 10, 81, 27, 180, 47, 147, 125, 81, 0, 0, 0, 1, 102, 234, 244, 77, 0, 0, 0, 0, 0}
   479  var authSHA256Packet2 = []byte{56, 198, 120, 101, 184, 178, 101, 227, 112, 52, 242, 119, 31, 128, 235, 50, 107, 58, 233, 34, 122, 77, 17, 220, 196, 226, 154, 108, 211, 182, 10, 155, 196, 199, 66, 72, 174, 72, 44, 220, 36, 0, 0, 0, 1, 102, 235, 45, 106, 0, 0, 0, 0, 0}
   480  var authSHA384Packet1 = []byte{56, 160, 37, 56, 112, 116, 89, 66, 24, 154, 38, 199, 92, 228, 209, 62, 141, 171, 224, 61, 218, 223, 221, 98, 33, 77, 134, 136, 40, 146, 36, 112, 30, 207, 152, 170, 2, 216, 227, 212, 205, 1, 115, 113, 22, 3, 11, 8, 208, 81, 97, 20, 191, 64, 202, 169, 249, 0, 0, 0, 1, 102, 234, 244, 185, 0, 0, 0, 0, 0}
   481  var authSHA384Packet2 = []byte{56, 175, 250, 66, 242, 105, 89, 222, 222, 108, 120, 226, 236, 11, 225, 251, 172, 175, 118, 219, 249, 225, 140, 228, 111, 129, 234, 103, 248, 34, 220, 49, 65, 99, 241, 43, 235, 15, 49, 216, 249, 41, 140, 75, 231, 56, 33, 200, 228, 255, 207, 231, 234, 189, 248, 105, 1, 0, 0, 0, 1, 102, 235, 46, 153, 0, 0, 0, 0, 0}
   482  var authSHA512Packet1 = []byte{56, 161, 94, 244, 194, 238, 125, 66, 225, 158, 56, 169, 182, 153, 161, 60, 52, 18, 97, 185, 50, 29, 118, 249, 132, 174, 102, 134, 41, 219, 138, 47, 121, 94, 151, 157, 117, 100, 50, 28, 187, 17, 127, 71, 193, 79, 142, 107, 174, 210, 123, 68, 207, 70, 40, 98, 73, 118, 125, 217, 193, 236, 245, 181, 36, 237, 68, 214, 150, 103, 239, 47, 69, 0, 0, 0, 1, 102, 234, 245, 25, 0, 0, 0, 0, 0}
   483  var authSHA512Packet2 = []byte{56, 216, 77, 99, 2, 63, 78, 109, 231, 0, 10, 151, 81, 69, 223, 219, 180, 247, 218, 140, 170, 125, 79, 34, 161, 70, 29, 172, 91, 88, 45, 168, 55, 171, 209, 42, 255, 50, 38, 254, 254, 69, 190, 54, 201, 7, 176, 188, 231, 178, 32, 104, 23, 230, 139, 31, 109, 7, 74, 23, 204, 111, 15, 47, 184, 142, 42, 87, 177, 229, 241, 249, 5, 0, 0, 0, 1, 102, 234, 255, 102, 0, 0, 0, 0, 0}
   484  var authSHA512224Packet1 = []byte{56, 120, 93, 159, 15, 39, 241, 197, 215, 124, 49, 249, 190, 40, 30, 103, 24, 237, 160, 8, 161, 166, 93, 197, 148, 86, 250, 10, 149, 235, 99, 28, 241, 101, 144, 232, 87, 0, 0, 0, 1, 102, 235, 51, 45, 0, 0, 0, 0, 0}
   485  var authSHA512224Packet2 = []byte{56, 53, 50, 102, 177, 253, 154, 44, 246, 173, 13, 203, 52, 177, 212, 190, 163, 163, 56, 75, 12, 35, 102, 36, 104, 173, 105, 79, 88, 155, 95, 205, 120, 223, 140, 149, 46, 0, 0, 0, 1, 102, 235, 51, 79, 0, 0, 0, 0, 0}
   486  var authSHA512256Packet1 = []byte{56, 156, 159, 218, 246, 224, 82, 248, 79, 214, 160, 218, 53, 181, 49, 88, 113, 34, 84, 237, 38, 173, 51, 70, 73, 213, 141, 198, 137, 96, 146, 164, 20, 250, 51, 190, 127, 193, 138, 146, 150, 0, 0, 0, 1, 102, 235, 51, 120, 0, 0, 0, 0, 0}
   487  var authSHA512256Packet2 = []byte{56, 186, 196, 224, 32, 227, 61, 79, 121, 104, 237, 52, 167, 134, 171, 65, 80, 24, 151, 202, 16, 228, 171, 154, 174, 102, 41, 163, 190, 181, 203, 116, 114, 212, 38, 182, 6, 85, 139, 204, 151, 0, 0, 0, 1, 102, 235, 51, 146, 0, 0, 0, 0, 0}
   488  
   489  var authSHA3224Packet1 = []byte{56, 75, 11, 103, 27, 91, 109, 41, 244, 55, 38, 214, 34, 145, 221, 10, 39, 122, 95, 31, 247, 145, 61, 200, 0, 50, 20, 138, 13, 157, 64, 45, 229, 228, 103, 188, 122, 0, 0, 0, 1, 102, 235, 49, 75, 0, 0, 0, 0, 0}
   490  var authSHA3224Packet2 = []byte{56, 27, 135, 234, 94, 136, 16, 205, 183, 224, 158, 35, 33, 167, 179, 186, 129, 221, 189, 91, 145, 254, 97, 214, 73, 168, 98, 178, 238, 57, 164, 23, 10, 231, 232, 228, 130, 0, 0, 0, 1, 102, 235, 49, 166, 0, 0, 0, 0, 0}
   491  var authSHA3256Packet1 = []byte{56, 102, 44, 44, 250, 78, 239, 197, 24, 141, 207, 4, 172, 243, 182, 248, 89, 85, 126, 211, 221, 77, 58, 132, 232, 210, 92, 100, 224, 138, 249, 189, 233, 173, 65, 107, 247, 44, 12, 44, 25, 0, 0, 0, 1, 102, 235, 49, 221, 0, 0, 0, 0, 0}
   492  var authSHA3256Packet2 = []byte{56, 111, 169, 160, 21, 96, 100, 39, 245, 239, 232, 248, 180, 118, 223, 2, 151, 181, 0, 11, 135, 228, 62, 200, 44, 74, 41, 61, 165, 219, 6, 140, 9, 232, 100, 126, 61, 31, 78, 112, 114, 0, 0, 0, 1, 102, 235, 49, 255, 0, 0, 0, 0, 0}
   493  var authSHA3384Packet1 = []byte{56, 218, 149, 197, 79, 218, 74, 75, 4, 109, 230, 99, 239, 20, 110, 58, 247, 115, 155, 16, 0, 63, 246, 58, 163, 117, 183, 254, 124, 158, 57, 90, 135, 115, 197, 127, 124, 240, 153, 252, 185, 94, 204, 83, 67, 204, 234, 217, 139, 253, 229, 231, 48, 124, 223, 87, 116, 0, 0, 0, 1, 102, 235, 50, 44, 0, 0, 0, 0, 0}
   494  var authSHA3384Packet2 = []byte{56, 182, 206, 108, 83, 191, 147, 63, 158, 59, 66, 8, 109, 134, 242, 142, 55, 34, 184, 130, 40, 104, 48, 136, 113, 123, 93, 177, 36, 111, 185, 151, 14, 35, 42, 200, 95, 241, 192, 218, 171, 88, 217, 108, 229, 133, 112, 162, 157, 218, 83, 149, 212, 102, 179, 173, 248, 0, 0, 0, 1, 102, 235, 50, 76, 0, 0, 0, 0, 0}
   495  var authSHA3512Packet1 = []byte{56, 56, 51, 121, 50, 97, 82, 27, 97, 63, 0, 247, 55, 225, 68, 192, 42, 21, 209, 75, 160, 240, 219, 32, 232, 98, 25, 109, 168, 157, 235, 66, 58, 236, 39, 211, 113, 42, 63, 83, 156, 141, 128, 86, 58, 252, 72, 252, 160, 4, 49, 100, 226, 2, 23, 206, 245, 74, 243, 19, 37, 96, 95, 45, 66, 114, 214, 204, 242, 76, 169, 149, 188, 0, 0, 0, 1, 102, 235, 50, 116, 0, 0, 0, 0, 0}
   496  var authSHA3512Packet2 = []byte{56, 35, 221, 191, 87, 222, 230, 175, 109, 149, 129, 74, 255, 48, 70, 110, 253, 142, 246, 140, 49, 20, 10, 69, 34, 12, 194, 51, 250, 81, 94, 127, 4, 33, 56, 80, 212, 219, 18, 173, 203, 113, 67, 16, 10, 252, 253, 100, 209, 106, 164, 171, 174, 200, 225, 141, 218, 251, 169, 147, 139, 91, 67, 114, 19, 67, 180, 240, 81, 96, 189, 75, 126, 0, 0, 0, 1, 102, 235, 50, 144, 0, 0, 0, 0, 0}
   497  
   498  var authBLAKE2s256Packet1 = []byte{56, 117, 185, 201, 73, 60, 231, 94, 83, 79, 58, 65, 198, 193, 150, 251, 40, 240, 186, 67, 214, 103, 173, 128, 71, 85, 169, 180, 57, 185, 190, 142, 169, 29, 70, 15, 227, 16, 233, 122, 248, 0, 0, 0, 1, 102, 235, 52, 237, 0, 0, 0, 0, 0}
   499  var authBLAKE2s256Packet2 = []byte{56, 113, 195, 33, 169, 198, 218, 173, 209, 221, 244, 170, 234, 51, 121, 193, 200, 71, 196, 195, 124, 161, 83, 34, 216, 32, 220, 169, 217, 119, 173, 198, 111, 212, 180, 207, 239, 133, 126, 23, 73, 0, 0, 0, 1, 102, 235, 53, 26, 0, 0, 0, 0, 0}
   500  var authBLAKE2b512Packet1 = []byte{56, 85, 88, 174, 47, 95, 41, 94, 246, 10, 210, 140, 132, 252, 217, 139, 220, 49, 214, 53, 127, 38, 150, 43, 148, 226, 184, 99, 168, 70, 117, 193, 144, 71, 193, 51, 66, 175, 1, 199, 90, 168, 165, 252, 200, 183, 163, 149, 209, 150, 81, 156, 180, 62, 40, 71, 169, 157, 115, 55, 227, 142, 235, 232, 186, 16, 163, 153, 165, 225, 206, 65, 218, 0, 0, 0, 1, 102, 235, 53, 76, 0, 0, 0, 0, 0}
   501  var authBLAKE2b512Packet2 = []byte{56, 81, 167, 144, 212, 181, 169, 247, 183, 247, 121, 237, 117, 202, 78, 166, 17, 78, 117, 65, 216, 21, 66, 25, 153, 188, 93, 74, 87, 190, 188, 117, 121, 177, 19, 55, 28, 183, 97, 209, 51, 33, 207, 175, 170, 42, 132, 26, 136, 166, 120, 154, 94, 36, 33, 5, 43, 244, 234, 80, 16, 72, 109, 54, 200, 77, 191, 229, 251, 101, 62, 90, 10, 0, 0, 0, 1, 102, 235, 53, 114, 0, 0, 0, 0, 0}
   502  
   503  var authMD5SHA1Packet1 = []byte{56, 179, 179, 82, 117, 88, 75, 7, 103, 207, 125, 244, 183, 3, 111, 46, 96, 79, 33, 216, 220, 7, 46, 234, 213, 182, 38, 87, 48, 131, 127, 227, 208, 13, 246, 26, 169, 220, 143, 161, 18, 68, 67, 179, 92, 0, 0, 0, 1, 102, 235, 48, 73, 0, 0, 0, 0, 0}
   504  var authMD5SHA1Packet2 = []byte{56, 72, 91, 69, 91, 123, 156, 4, 2, 200, 34, 158, 108, 40, 218, 3, 95, 19, 203, 170, 36, 86, 29, 207, 40, 251, 124, 79, 93, 174, 221, 45, 22, 18, 125, 250, 150, 82, 37, 64, 100, 108, 251, 29, 114, 0, 0, 0, 1, 102, 235, 48, 132, 0, 0, 0, 0, 0}
   505  
   506  var authSM3Packet1 = []byte{56, 61, 163, 194, 51, 225, 14, 218, 181, 76, 125, 35, 206, 68, 24, 66, 176, 84, 237, 88, 38, 121, 213, 67, 33, 172, 83, 167, 103, 89, 82, 122, 7, 166, 156, 79, 26, 67, 191, 210, 226, 0, 0, 0, 1, 102, 235, 50, 211, 0, 0, 0, 0, 0}
   507  var authSM3Packet2 = []byte{56, 216, 20, 196, 148, 131, 37, 73, 181, 55, 166, 108, 86, 143, 5, 25, 20, 21, 149, 77, 221, 237, 110, 232, 237, 23, 40, 231, 192, 225, 197, 160, 172, 49, 130, 178, 78, 12, 143, 130, 229, 0, 0, 0, 1, 102, 235, 50, 243, 0, 0, 0, 0, 0}
   508  
   509  var authWhirlpoolPacket1 = []byte{56, 36, 245, 218, 233, 15, 158, 142, 144, 116, 207, 71, 60, 35, 210, 55, 90, 223, 92, 122, 87, 53, 131, 122, 248, 84, 50, 42, 69, 254, 231, 197, 30, 216, 65, 242, 173, 160, 127, 229, 165, 224, 32, 16, 118, 45, 197, 158, 145, 0, 130, 72, 78, 104, 107, 247, 100, 54, 185, 151, 70, 116, 219, 15, 112, 175, 78, 30, 177, 222, 41, 223, 29, 0, 0, 0, 1, 102, 235, 55, 2, 0, 0, 0, 0, 0}
   510  var authWhirlpoolPacket2 = []byte{56, 31, 112, 117, 225, 131, 182, 114, 117, 242, 139, 201, 7, 108, 19, 165, 164, 120, 243, 26, 152, 195, 228, 36, 162, 249, 105, 116, 114, 121, 232, 215, 253, 153, 249, 243, 54, 55, 83, 70, 28, 19, 87, 233, 54, 164, 69, 52, 96, 28, 107, 220, 236, 226, 35, 224, 155, 100, 78, 59, 174, 220, 107, 120, 56, 100, 160, 122, 182, 96, 94, 83, 71, 0, 0, 0, 1, 102, 235, 55, 144, 0, 0, 0, 0, 0}
   511  
   512  var cryptPacket1 = []byte{56, 76, 98, 159, 244, 184, 134, 148, 158, 0, 0, 0, 1, 102, 237, 91, 50, 14, 141, 87, 40, 125, 165, 204, 227, 61, 5, 91, 201, 99, 44, 253, 7, 202, 200, 84, 124, 48, 80, 144, 250, 52, 248, 173, 26, 201, 173, 67, 166, 16, 189, 73, 203, 12}
   513  var cryptPacket2 = []byte{56, 162, 49, 153, 71, 88, 124, 182, 93, 0, 0, 0, 1, 102, 237, 91, 95, 84, 154, 63, 127, 63, 175, 65, 227, 69, 45, 146, 14, 64, 81, 56, 239, 162, 229, 54, 81, 103, 167, 133, 38, 57, 83, 119, 60, 149, 149, 218, 201, 144, 193, 202, 149, 111}
   514  
   515  /*
   516   *	All the sample packets below are generated with another static key.
   517   */
   518  
   519  var cryptPacket3 = []byte{56, 114, 151, 86, 204, 204, 137, 212, 215, 0, 0, 0, 1, 102, 231, 24, 196, 58, 184, 197, 69, 200, 222, 132, 120, 248, 163, 68, 112, 17, 137, 97, 240, 56, 122, 62, 49, 172, 177, 176, 86, 180, 187, 148, 69, 17, 251, 38, 0, 31, 203, 0, 237, 122}
   520  var cryptPacket4 = []byte{56, 49, 193, 232, 78, 82, 175, 151, 76, 0, 0, 0, 1, 102, 231, 25, 92, 82, 125, 47, 131, 35, 217, 41, 164, 145, 71, 178, 38, 218, 194, 60, 100, 167, 212, 8, 160, 131, 22, 61, 246, 52, 20, 100, 6, 16, 108, 18, 127, 24, 185, 240, 99, 156}
   521  
   522  var authSHA512Packet3 = []byte{56, 9, 137, 51, 217, 234, 95, 85, 78, 254, 110, 108, 95, 38, 212, 11, 224, 47, 57, 16, 51, 199, 136, 76, 111, 191, 16, 107, 75, 219, 113, 162, 191, 67, 46, 146, 184, 246, 177, 52, 53, 53, 127, 191, 5, 184, 24, 166, 146, 223, 234, 222, 239, 9, 92, 227, 241, 225, 196, 46, 230, 138, 3, 5, 85, 186, 65, 251, 189, 11, 16, 28, 102, 0, 0, 0, 1, 102, 231, 16, 138, 0, 0, 0, 0, 0}
   523  var authSHA512Packet4 = []byte{56, 178, 216, 6, 201, 115, 66, 0, 252, 112, 99, 34, 163, 140, 85, 246, 137, 75, 183, 212, 159, 38, 251, 25, 190, 253, 36, 249, 198, 196, 70, 177, 201, 14, 65, 227, 248, 77, 108, 115, 189, 160, 244, 174, 98, 107, 141, 70, 231, 120, 91, 118, 74, 229, 197, 11, 34, 193, 58, 35, 253, 148, 135, 235, 90, 101, 6, 152, 24, 139, 17, 204, 33, 0, 0, 0, 1, 102, 231, 16, 206, 0, 0, 0, 0, 0}
   524  var authSHA384Packet3 = []byte{56, 219, 201, 226, 49, 70, 125, 55, 178, 191, 78, 40, 216, 206, 58, 20, 224, 132, 135, 191, 172, 205, 188, 24, 176, 48, 143, 139, 127, 225, 202, 39, 8, 196, 77, 57, 9, 41, 94, 103, 73, 169, 38, 206, 220, 2, 48, 62, 228, 47, 75, 97, 94, 55, 92, 204, 186, 0, 0, 0, 1, 102, 231, 17, 154, 0, 0, 0, 0, 0}
   525  var authSHA384Packet4 = []byte{56, 16, 226, 49, 167, 146, 222, 219, 13, 3, 106, 151, 111, 210, 227, 142, 102, 16, 216, 234, 94, 111, 244, 11, 94, 253, 12, 186, 117, 92, 196, 92, 65, 107, 141, 17, 229, 249, 197, 17, 103, 41, 223, 153, 181, 117, 29, 117, 56, 22, 175, 162, 64, 31, 77, 122, 72, 0, 0, 0, 1, 102, 231, 17, 193, 0, 0, 0, 0, 0}
   526  var authMD5SHA1Packet3 = []byte{56, 99, 167, 201, 107, 123, 246, 212, 180, 87, 93, 31, 188, 10, 53, 149, 139, 232, 13, 207, 71, 108, 154, 143, 114, 180, 196, 221, 157, 16, 106, 225, 14, 219, 137, 223, 222, 146, 106, 226, 168, 120, 86, 22, 124, 0, 0, 0, 1, 102, 231, 23, 250, 0, 0, 0, 0, 0}
   527  var authMD5SHA1Packet4 = []byte{56, 37, 80, 49, 19, 199, 20, 62, 202, 74, 99, 211, 73, 42, 204, 120, 193, 83, 126, 182, 7, 159, 177, 126, 206, 70, 29, 198, 68, 211, 249, 15, 123, 201, 45, 193, 38, 134, 223, 186, 236, 58, 235, 55, 130, 0, 0, 0, 1, 102, 231, 24, 40, 0, 0, 0, 0, 0}
   528  var authSHA256Packet3 = []byte{56, 102, 151, 183, 239, 253, 36, 110, 23, 150, 73, 73, 166, 35, 204, 199, 240, 149, 243, 16, 8, 55, 68, 108, 31, 11, 74, 186, 254, 65, 15, 81, 5, 222, 184, 12, 106, 72, 2, 114, 154, 0, 0, 0, 1, 102, 231, 17, 9, 0, 0, 0, 0, 0}
   529  var authSHA256Packet4 = []byte{56, 95, 17, 119, 145, 64, 76, 195, 82, 28, 120, 32, 8, 114, 93, 80, 206, 88, 123, 172, 37, 73, 97, 54, 221, 37, 7, 157, 39, 147, 73, 251, 107, 61, 52, 76, 11, 97, 161, 3, 96, 0, 0, 0, 1, 102, 231, 17, 93, 0, 0, 0, 0, 0}
   530  var authSHA224Packet3 = []byte{56, 27, 28, 60, 231, 13, 31, 116, 190, 88, 126, 12, 34, 137, 96, 59, 7, 91, 163, 246, 60, 2, 38, 129, 69, 217, 9, 24, 18, 36, 210, 88, 86, 2, 226, 0, 96, 0, 0, 0, 1, 102, 231, 20, 101, 0, 0, 0, 0, 0}
   531  var authSHA224Packet4 = []byte{56, 248, 223, 183, 225, 174, 116, 5, 214, 134, 211, 177, 21, 142, 215, 9, 8, 164, 55, 40, 10, 206, 40, 254, 173, 235, 176, 126, 12, 67, 35, 221, 219, 209, 30, 244, 178, 0, 0, 0, 1, 102, 231, 20, 137, 0, 0, 0, 0, 0}
   532  var authSHA1Packet3 = []byte{56, 237, 200, 39, 23, 233, 70, 6, 161, 241, 68, 106, 124, 33, 176, 55, 84, 222, 250, 76, 156, 191, 179, 213, 51, 159, 4, 62, 210, 0, 0, 0, 1, 102, 231, 18, 45, 0, 0, 0, 0, 0}
   533  var authSHA1Packet4 = []byte{56, 130, 31, 160, 196, 239, 31, 197, 116, 52, 169, 99, 61, 200, 67, 148, 130, 219, 9, 88, 119, 50, 245, 69, 146, 204, 29, 211, 206, 0, 0, 0, 1, 102, 231, 18, 99, 0, 0, 0, 0, 0}
   534  var authMD5Packet3 = []byte{56, 215, 5, 24, 98, 120, 183, 161, 99, 207, 88, 65, 149, 207, 91, 106, 49, 202, 38, 190, 180, 159, 186, 132, 12, 0, 0, 0, 1, 102, 231, 18, 140, 0, 0, 0, 0, 0}
   535  var authMD5Packet4 = []byte{56, 54, 43, 62, 107, 142, 244, 8, 206, 17, 95, 99, 7, 97, 10, 102, 63, 210, 191, 101, 209, 192, 183, 94, 67, 0, 0, 0, 1, 102, 231, 18, 188, 0, 0, 0, 0, 0}
   536  
   537  var plainPacket3 = []uint8{56, 232, 90, 55, 186, 10, 31, 142, 127, 0, 0, 0, 0, 0}
   538  var plainPacket4 = []uint8{56, 177, 22, 70, 225, 86, 175, 190, 204, 0, 0, 0, 0, 0}
   539  
   540  /*
   541   *	All the sample packets below are generated with a pair of tls-crypt-v2 server key and tls-crypt-v2 client key.
   542   */
   543  
   544  var serverKey56Base64 = "U2hihe8H77pInpRzMEWNZ/NwM1CBSSVSw5HyXT7/+1pspISJzKBiECs+LRvE6QlwgKm606H1wLv0defgJRNU1UG1fi25oMPqjFcYybU+wOgY8eX6OWM0EWI6d2XaL6Neu1E9fMGDAWnzQFsFZhMQH80xv0kzzLm13UjL7lrdQnM="
   545  var clientKey56Base64 = "HZVyTZ3S2YMR9UFUei+kWmNcCaxxT31StqhozQFXVQ41WK203PFtunbuA7HZNPaBLQbyC3aaxwGcEsqW1Jnm/3WptcPWFYhFGhW+H37x2howQyAGj6IIsjZQyS9gwYgGr8bVNTZIywz3hw+KLRCAzkhTqk6ONen1wf5rewu03g2RNq/suLU6V31OTDOxeyb1WkUA25Ych7le6FJzO8YqI5jOosokID3ueT05vCdMIDa6FsHR3BmPjX2OYLquV+wBF7IBykKcxrCvrT2Qf/tBpv7PtUkKx6pCApKiUuPxLALMxqv3ATa7vrCB8qZQWmO4dRY40ORYZ622MiqCDmDFGKQca1bPxdHdpFCr5o8gvYHR9p0Xm2t6KcCvAO+CUAMKA1DsUqIYrrhQIkkZI/dbffBGnxyrb/XlzGnSynv5d8oAl7QSrW292JLtm7VCGE7NePEMvAx9iAXNTwxpdwNNfPmb3ZNWq7H+mGUaYQpcs7xW45zzyUkV9fESFEnlePxeJ3pjqxawcjnOBy1yLk/RKyFOakNJ/Z6r7IFjgI6usooo1i7+Tp6O5MHQasWcpyLWzW5KvjGPIKH0SFl6VJdBMkWWYm1D5KdgqXX8716uNvpY0dVpXgE+KfJPxIRQDGCuS8zyrxAHCvm8MAbiOpi9g35/4vKFj+cvar4EssHrvSX+l0Z7q5kGnMbnvStH7MEzTQXCcMT30vDWBn2W9SEkOh9KIq1z3/46owEr"
   546  
   547  var serverKey56 = StaticKeyNewFromBase64(serverKey56Base64, false, false)
   548  var clientKey56 = WrappedKeyNewFromBase64(clientKey56Base64)
   549  
   550  var crypt2Packet5 = []byte{80, 100, 224, 45, 159, 27, 166, 162, 220, 15, 0, 0, 1, 102, 240, 100, 162, 53, 85, 10, 213, 183, 32, 34, 176, 186, 16, 66, 59, 48, 128, 24, 240, 143, 116, 59, 133, 18, 152, 241, 84, 81, 95, 195, 181, 88, 112, 148, 217, 127, 200, 222, 197, 88, 164, 28, 107, 86, 207, 197, 209, 221, 164, 80, 171, 230, 143, 32, 189, 129, 209, 246, 157, 23, 155, 107, 122, 41, 192, 175, 0, 239, 130, 80, 3, 10, 3, 80, 236, 82, 162, 24, 174, 184, 80, 34, 73, 25, 35, 247, 91, 125, 240, 70, 159, 28, 171, 111, 245, 229, 204, 105, 210, 202, 123, 249, 119, 202, 0, 151, 180, 18, 173, 109, 189, 216, 146, 237, 155, 181, 66, 24, 78, 205, 120, 241, 12, 188, 12, 125, 136, 5, 205, 79, 12, 105, 119, 3, 77, 124, 249, 155, 221, 147, 86, 171, 177, 254, 152, 101, 26, 97, 10, 92, 179, 188, 86, 227, 156, 243, 201, 73, 21, 245, 241, 18, 20, 73, 229, 120, 252, 94, 39, 122, 99, 171, 22, 176, 114, 57, 206, 7, 45, 114, 46, 79, 209, 43, 33, 78, 106, 67, 73, 253, 158, 171, 236, 129, 99, 128, 142, 174, 178, 138, 40, 214, 46, 254, 78, 158, 142, 228, 193, 208, 106, 197, 156, 167, 34, 214, 205, 110, 74, 190, 49, 143, 32, 161, 244, 72, 89, 122, 84, 151, 65, 50, 69, 150, 98, 109, 67, 228, 167, 96, 169, 117, 252, 239, 94, 174, 54, 250, 88, 209, 213, 105, 94, 1, 62, 41, 242, 79, 196, 132, 80, 12, 96, 174, 75, 204, 242, 175, 16, 7, 10, 249, 188, 48, 6, 226, 58, 152, 189, 131, 126, 127, 226, 242, 133, 143, 231, 47, 106, 190, 4, 178, 193, 235, 189, 37, 254, 151, 70, 123, 171, 153, 6, 156, 198, 231, 189, 43, 71, 236, 193, 51, 77, 5, 194, 112, 196, 247, 210, 240, 214, 6, 125, 150, 245, 33, 36, 58, 31, 74, 34, 173, 115, 223, 254, 58, 163, 1, 43}
   551  var crypt2Packet6 = []byte{80, 136, 240, 154, 124, 25, 199, 138, 59, 15, 0, 0, 1, 102, 240, 107, 4, 103, 91, 3, 26, 182, 97, 79, 186, 12, 192, 49, 251, 104, 205, 177, 215, 107, 141, 155, 102, 232, 247, 246, 206, 142, 216, 230, 20, 218, 58, 153, 248, 131, 173, 105, 2, 213, 164, 28, 107, 86, 207, 197, 209, 221, 164, 80, 171, 230, 143, 32, 189, 129, 209, 246, 157, 23, 155, 107, 122, 41, 192, 175, 0, 239, 130, 80, 3, 10, 3, 80, 236, 82, 162, 24, 174, 184, 80, 34, 73, 25, 35, 247, 91, 125, 240, 70, 159, 28, 171, 111, 245, 229, 204, 105, 210, 202, 123, 249, 119, 202, 0, 151, 180, 18, 173, 109, 189, 216, 146, 237, 155, 181, 66, 24, 78, 205, 120, 241, 12, 188, 12, 125, 136, 5, 205, 79, 12, 105, 119, 3, 77, 124, 249, 155, 221, 147, 86, 171, 177, 254, 152, 101, 26, 97, 10, 92, 179, 188, 86, 227, 156, 243, 201, 73, 21, 245, 241, 18, 20, 73, 229, 120, 252, 94, 39, 122, 99, 171, 22, 176, 114, 57, 206, 7, 45, 114, 46, 79, 209, 43, 33, 78, 106, 67, 73, 253, 158, 171, 236, 129, 99, 128, 142, 174, 178, 138, 40, 214, 46, 254, 78, 158, 142, 228, 193, 208, 106, 197, 156, 167, 34, 214, 205, 110, 74, 190, 49, 143, 32, 161, 244, 72, 89, 122, 84, 151, 65, 50, 69, 150, 98, 109, 67, 228, 167, 96, 169, 117, 252, 239, 94, 174, 54, 250, 88, 209, 213, 105, 94, 1, 62, 41, 242, 79, 196, 132, 80, 12, 96, 174, 75, 204, 242, 175, 16, 7, 10, 249, 188, 48, 6, 226, 58, 152, 189, 131, 126, 127, 226, 242, 133, 143, 231, 47, 106, 190, 4, 178, 193, 235, 189, 37, 254, 151, 70, 123, 171, 153, 6, 156, 198, 231, 189, 43, 71, 236, 193, 51, 77, 5, 194, 112, 196, 247, 210, 240, 214, 6, 125, 150, 245, 33, 36, 58, 31, 74, 34, 173, 115, 223, 254, 58, 163, 1, 43}