github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/src/pkg/crypto/rsa/rsa_test.go (about)

     1  // Copyright 2009 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package rsa
     6  
     7  import (
     8  	"bytes"
     9  	"crypto/rand"
    10  	"crypto/sha1"
    11  	"math/big"
    12  	"testing"
    13  )
    14  
    15  func TestKeyGeneration(t *testing.T) {
    16  	size := 1024
    17  	if testing.Short() {
    18  		size = 128
    19  	}
    20  	priv, err := GenerateKey(rand.Reader, size)
    21  	if err != nil {
    22  		t.Errorf("failed to generate key")
    23  	}
    24  	if bits := priv.N.BitLen(); bits != size {
    25  		t.Errorf("key too short (%d vs %d)", bits, size)
    26  	}
    27  	testKeyBasics(t, priv)
    28  }
    29  
    30  func Test3PrimeKeyGeneration(t *testing.T) {
    31  	size := 768
    32  	if testing.Short() {
    33  		size = 256
    34  	}
    35  
    36  	priv, err := GenerateMultiPrimeKey(rand.Reader, 3, size)
    37  	if err != nil {
    38  		t.Errorf("failed to generate key")
    39  	}
    40  	testKeyBasics(t, priv)
    41  }
    42  
    43  func Test4PrimeKeyGeneration(t *testing.T) {
    44  	size := 768
    45  	if testing.Short() {
    46  		size = 256
    47  	}
    48  
    49  	priv, err := GenerateMultiPrimeKey(rand.Reader, 4, size)
    50  	if err != nil {
    51  		t.Errorf("failed to generate key")
    52  	}
    53  	testKeyBasics(t, priv)
    54  }
    55  
    56  func TestNPrimeKeyGeneration(t *testing.T) {
    57  	primeSize := 64
    58  	maxN := 24
    59  	if testing.Short() {
    60  		primeSize = 16
    61  		maxN = 16
    62  	}
    63  	// Test that generation of N-prime keys works for N > 4.
    64  	for n := 5; n < maxN; n++ {
    65  		priv, err := GenerateMultiPrimeKey(rand.Reader, n, 64+n*primeSize)
    66  		if err == nil {
    67  			testKeyBasics(t, priv)
    68  		} else {
    69  			t.Errorf("failed to generate %d-prime key", n)
    70  		}
    71  	}
    72  }
    73  
    74  func TestGnuTLSKey(t *testing.T) {
    75  	// This is a key generated by `certtool --generate-privkey --bits 128`.
    76  	// It's such that de ≢ 1 mod φ(n), but is congruent mod the order of
    77  	// the group.
    78  	priv := &PrivateKey{
    79  		PublicKey: PublicKey{
    80  			N: fromBase10("290684273230919398108010081414538931343"),
    81  			E: 65537,
    82  		},
    83  		D: fromBase10("31877380284581499213530787347443987241"),
    84  		Primes: []*big.Int{
    85  			fromBase10("16775196964030542637"),
    86  			fromBase10("17328218193455850539"),
    87  		},
    88  	}
    89  	testKeyBasics(t, priv)
    90  }
    91  
    92  func testKeyBasics(t *testing.T, priv *PrivateKey) {
    93  	if err := priv.Validate(); err != nil {
    94  		t.Errorf("Validate() failed: %s", err)
    95  	}
    96  	if priv.D.Cmp(priv.N) > 0 {
    97  		t.Errorf("private exponent too large")
    98  	}
    99  
   100  	pub := &priv.PublicKey
   101  	m := big.NewInt(42)
   102  	c := encrypt(new(big.Int), pub, m)
   103  
   104  	m2, err := decrypt(nil, priv, c)
   105  	if err != nil {
   106  		t.Errorf("error while decrypting: %s", err)
   107  		return
   108  	}
   109  	if m.Cmp(m2) != 0 {
   110  		t.Errorf("got:%v, want:%v (%+v)", m2, m, priv)
   111  	}
   112  
   113  	m3, err := decrypt(rand.Reader, priv, c)
   114  	if err != nil {
   115  		t.Errorf("error while decrypting (blind): %s", err)
   116  	}
   117  	if m.Cmp(m3) != 0 {
   118  		t.Errorf("(blind) got:%v, want:%v (%#v)", m3, m, priv)
   119  	}
   120  }
   121  
   122  func fromBase10(base10 string) *big.Int {
   123  	i := new(big.Int)
   124  	i.SetString(base10, 10)
   125  	return i
   126  }
   127  
   128  func BenchmarkRSA2048Decrypt(b *testing.B) {
   129  	b.StopTimer()
   130  	priv := &PrivateKey{
   131  		PublicKey: PublicKey{
   132  			N: fromBase10("14314132931241006650998084889274020608918049032671858325988396851334124245188214251956198731333464217832226406088020736932173064754214329009979944037640912127943488972644697423190955557435910767690712778463524983667852819010259499695177313115447116110358524558307947613422897787329221478860907963827160223559690523660574329011927531289655711860504630573766609239332569210831325633840174683944553667352219670930408593321661375473885147973879086994006440025257225431977751512374815915392249179976902953721486040787792801849818254465486633791826766873076617116727073077821584676715609985777563958286637185868165868520557"),
   133  			E: 3,
   134  		},
   135  		D: fromBase10("9542755287494004433998723259516013739278699355114572217325597900889416163458809501304132487555642811888150937392013824621448709836142886006653296025093941418628992648429798282127303704957273845127141852309016655778568546006839666463451542076964744073572349705538631742281931858219480985907271975884773482372966847639853897890615456605598071088189838676728836833012254065983259638538107719766738032720239892094196108713378822882383694456030043492571063441943847195939549773271694647657549658603365629458610273821292232646334717612674519997533901052790334279661754176490593041941863932308687197618671528035670452762731"),
   136  		Primes: []*big.Int{
   137  			fromBase10("130903255182996722426771613606077755295583329135067340152947172868415809027537376306193179624298874215608270802054347609836776473930072411958753044562214537013874103802006369634761074377213995983876788718033850153719421695468704276694983032644416930879093914927146648402139231293035971427838068945045019075433"),
   138  			fromBase10("109348945610485453577574767652527472924289229538286649661240938988020367005475727988253438647560958573506159449538793540472829815903949343191091817779240101054552748665267574271163617694640513549693841337820602726596756351006149518830932261246698766355347898158548465400674856021497190430791824869615170301029"),
   139  		},
   140  	}
   141  	priv.Precompute()
   142  
   143  	c := fromBase10("8472002792838218989464636159316973636630013835787202418124758118372358261975764365740026024610403138425986214991379012696600761514742817632790916315594342398720903716529235119816755589383377471752116975374952783629225022962092351886861518911824745188989071172097120352727368980275252089141512321893536744324822590480751098257559766328893767334861211872318961900897793874075248286439689249972315699410830094164386544311554704755110361048571142336148077772023880664786019636334369759624917224888206329520528064315309519262325023881707530002540634660750469137117568199824615333883758410040459705787022909848740188613313")
   144  
   145  	b.StartTimer()
   146  
   147  	for i := 0; i < b.N; i++ {
   148  		decrypt(nil, priv, c)
   149  	}
   150  }
   151  
   152  func Benchmark3PrimeRSA2048Decrypt(b *testing.B) {
   153  	b.StopTimer()
   154  	priv := &PrivateKey{
   155  		PublicKey: PublicKey{
   156  			N: fromBase10("16346378922382193400538269749936049106320265317511766357599732575277382844051791096569333808598921852351577762718529818072849191122419410612033592401403764925096136759934497687765453905884149505175426053037420486697072448609022753683683718057795566811401938833367954642951433473337066311978821180526439641496973296037000052546108507805269279414789035461158073156772151892452251106173507240488993608650881929629163465099476849643165682709047462010581308719577053905787496296934240246311806555924593059995202856826239801816771116902778517096212527979497399966526283516447337775509777558018145573127308919204297111496233"),
   157  			E: 3,
   158  		},
   159  		D: fromBase10("10897585948254795600358846499957366070880176878341177571733155050184921896034527397712889205732614568234385175145686545381899460748279607074689061600935843283397424506622998458510302603922766336783617368686090042765718290914099334449154829375179958369993407724946186243249568928237086215759259909861748642124071874879861299389874230489928271621259294894142840428407196932444474088857746123104978617098858619445675532587787023228852383149557470077802718705420275739737958953794088728369933811184572620857678792001136676902250566845618813972833750098806496641114644760255910789397593428910198080271317419213080834885003"),
   160  		Primes: []*big.Int{
   161  			fromBase10("1025363189502892836833747188838978207017355117492483312747347695538428729137306368764177201532277413433182799108299960196606011786562992097313508180436744488171474690412562218914213688661311117337381958560443"),
   162  			fromBase10("3467903426626310123395340254094941045497208049900750380025518552334536945536837294961497712862519984786362199788654739924501424784631315081391467293694361474867825728031147665777546570788493758372218019373"),
   163  			fromBase10("4597024781409332673052708605078359346966325141767460991205742124888960305710298765592730135879076084498363772408626791576005136245060321874472727132746643162385746062759369754202494417496879741537284589047"),
   164  		},
   165  	}
   166  	priv.Precompute()
   167  
   168  	c := fromBase10("8472002792838218989464636159316973636630013835787202418124758118372358261975764365740026024610403138425986214991379012696600761514742817632790916315594342398720903716529235119816755589383377471752116975374952783629225022962092351886861518911824745188989071172097120352727368980275252089141512321893536744324822590480751098257559766328893767334861211872318961900897793874075248286439689249972315699410830094164386544311554704755110361048571142336148077772023880664786019636334369759624917224888206329520528064315309519262325023881707530002540634660750469137117568199824615333883758410040459705787022909848740188613313")
   169  
   170  	b.StartTimer()
   171  
   172  	for i := 0; i < b.N; i++ {
   173  		decrypt(nil, priv, c)
   174  	}
   175  }
   176  
   177  type testEncryptOAEPMessage struct {
   178  	in   []byte
   179  	seed []byte
   180  	out  []byte
   181  }
   182  
   183  type testEncryptOAEPStruct struct {
   184  	modulus string
   185  	e       int
   186  	d       string
   187  	msgs    []testEncryptOAEPMessage
   188  }
   189  
   190  func TestEncryptOAEP(t *testing.T) {
   191  	sha1 := sha1.New()
   192  	n := new(big.Int)
   193  	for i, test := range testEncryptOAEPData {
   194  		n.SetString(test.modulus, 16)
   195  		public := PublicKey{n, test.e}
   196  
   197  		for j, message := range test.msgs {
   198  			randomSource := bytes.NewBuffer(message.seed)
   199  			out, err := EncryptOAEP(sha1, randomSource, &public, message.in, nil)
   200  			if err != nil {
   201  				t.Errorf("#%d,%d error: %s", i, j, err)
   202  			}
   203  			if !bytes.Equal(out, message.out) {
   204  				t.Errorf("#%d,%d bad result: %x (want %x)", i, j, out, message.out)
   205  			}
   206  		}
   207  	}
   208  }
   209  
   210  func TestDecryptOAEP(t *testing.T) {
   211  	random := rand.Reader
   212  
   213  	sha1 := sha1.New()
   214  	n := new(big.Int)
   215  	d := new(big.Int)
   216  	for i, test := range testEncryptOAEPData {
   217  		n.SetString(test.modulus, 16)
   218  		d.SetString(test.d, 16)
   219  		private := new(PrivateKey)
   220  		private.PublicKey = PublicKey{n, test.e}
   221  		private.D = d
   222  
   223  		for j, message := range test.msgs {
   224  			out, err := DecryptOAEP(sha1, nil, private, message.out, nil)
   225  			if err != nil {
   226  				t.Errorf("#%d,%d error: %s", i, j, err)
   227  			} else if !bytes.Equal(out, message.in) {
   228  				t.Errorf("#%d,%d bad result: %#v (want %#v)", i, j, out, message.in)
   229  			}
   230  
   231  			// Decrypt with blinding.
   232  			out, err = DecryptOAEP(sha1, random, private, message.out, nil)
   233  			if err != nil {
   234  				t.Errorf("#%d,%d (blind) error: %s", i, j, err)
   235  			} else if !bytes.Equal(out, message.in) {
   236  				t.Errorf("#%d,%d (blind) bad result: %#v (want %#v)", i, j, out, message.in)
   237  			}
   238  		}
   239  		if testing.Short() {
   240  			break
   241  		}
   242  	}
   243  }
   244  
   245  // testEncryptOAEPData contains a subset of the vectors from RSA's "Test vectors for RSA-OAEP".
   246  var testEncryptOAEPData = []testEncryptOAEPStruct{
   247  	// Key 1
   248  	{"a8b3b284af8eb50b387034a860f146c4919f318763cd6c5598c8ae4811a1e0abc4c7e0b082d693a5e7fced675cf4668512772c0cbc64a742c6c630f533c8cc72f62ae833c40bf25842e984bb78bdbf97c0107d55bdb662f5c4e0fab9845cb5148ef7392dd3aaff93ae1e6b667bb3d4247616d4f5ba10d4cfd226de88d39f16fb",
   249  		65537,
   250  		"53339cfdb79fc8466a655c7316aca85c55fd8f6dd898fdaf119517ef4f52e8fd8e258df93fee180fa0e4ab29693cd83b152a553d4ac4d1812b8b9fa5af0e7f55fe7304df41570926f3311f15c4d65a732c483116ee3d3d2d0af3549ad9bf7cbfb78ad884f84d5beb04724dc7369b31def37d0cf539e9cfcdd3de653729ead5d1",
   251  		[]testEncryptOAEPMessage{
   252  			// Example 1.1
   253  			{
   254  				[]byte{0x66, 0x28, 0x19, 0x4e, 0x12, 0x07, 0x3d, 0xb0,
   255  					0x3b, 0xa9, 0x4c, 0xda, 0x9e, 0xf9, 0x53, 0x23, 0x97,
   256  					0xd5, 0x0d, 0xba, 0x79, 0xb9, 0x87, 0x00, 0x4a, 0xfe,
   257  					0xfe, 0x34,
   258  				},
   259  				[]byte{0x18, 0xb7, 0x76, 0xea, 0x21, 0x06, 0x9d, 0x69,
   260  					0x77, 0x6a, 0x33, 0xe9, 0x6b, 0xad, 0x48, 0xe1, 0xdd,
   261  					0xa0, 0xa5, 0xef,
   262  				},
   263  				[]byte{0x35, 0x4f, 0xe6, 0x7b, 0x4a, 0x12, 0x6d, 0x5d,
   264  					0x35, 0xfe, 0x36, 0xc7, 0x77, 0x79, 0x1a, 0x3f, 0x7b,
   265  					0xa1, 0x3d, 0xef, 0x48, 0x4e, 0x2d, 0x39, 0x08, 0xaf,
   266  					0xf7, 0x22, 0xfa, 0xd4, 0x68, 0xfb, 0x21, 0x69, 0x6d,
   267  					0xe9, 0x5d, 0x0b, 0xe9, 0x11, 0xc2, 0xd3, 0x17, 0x4f,
   268  					0x8a, 0xfc, 0xc2, 0x01, 0x03, 0x5f, 0x7b, 0x6d, 0x8e,
   269  					0x69, 0x40, 0x2d, 0xe5, 0x45, 0x16, 0x18, 0xc2, 0x1a,
   270  					0x53, 0x5f, 0xa9, 0xd7, 0xbf, 0xc5, 0xb8, 0xdd, 0x9f,
   271  					0xc2, 0x43, 0xf8, 0xcf, 0x92, 0x7d, 0xb3, 0x13, 0x22,
   272  					0xd6, 0xe8, 0x81, 0xea, 0xa9, 0x1a, 0x99, 0x61, 0x70,
   273  					0xe6, 0x57, 0xa0, 0x5a, 0x26, 0x64, 0x26, 0xd9, 0x8c,
   274  					0x88, 0x00, 0x3f, 0x84, 0x77, 0xc1, 0x22, 0x70, 0x94,
   275  					0xa0, 0xd9, 0xfa, 0x1e, 0x8c, 0x40, 0x24, 0x30, 0x9c,
   276  					0xe1, 0xec, 0xcc, 0xb5, 0x21, 0x00, 0x35, 0xd4, 0x7a,
   277  					0xc7, 0x2e, 0x8a,
   278  				},
   279  			},
   280  			// Example 1.2
   281  			{
   282  				[]byte{0x75, 0x0c, 0x40, 0x47, 0xf5, 0x47, 0xe8, 0xe4,
   283  					0x14, 0x11, 0x85, 0x65, 0x23, 0x29, 0x8a, 0xc9, 0xba,
   284  					0xe2, 0x45, 0xef, 0xaf, 0x13, 0x97, 0xfb, 0xe5, 0x6f,
   285  					0x9d, 0xd5,
   286  				},
   287  				[]byte{0x0c, 0xc7, 0x42, 0xce, 0x4a, 0x9b, 0x7f, 0x32,
   288  					0xf9, 0x51, 0xbc, 0xb2, 0x51, 0xef, 0xd9, 0x25, 0xfe,
   289  					0x4f, 0xe3, 0x5f,
   290  				},
   291  				[]byte{0x64, 0x0d, 0xb1, 0xac, 0xc5, 0x8e, 0x05, 0x68,
   292  					0xfe, 0x54, 0x07, 0xe5, 0xf9, 0xb7, 0x01, 0xdf, 0xf8,
   293  					0xc3, 0xc9, 0x1e, 0x71, 0x6c, 0x53, 0x6f, 0xc7, 0xfc,
   294  					0xec, 0x6c, 0xb5, 0xb7, 0x1c, 0x11, 0x65, 0x98, 0x8d,
   295  					0x4a, 0x27, 0x9e, 0x15, 0x77, 0xd7, 0x30, 0xfc, 0x7a,
   296  					0x29, 0x93, 0x2e, 0x3f, 0x00, 0xc8, 0x15, 0x15, 0x23,
   297  					0x6d, 0x8d, 0x8e, 0x31, 0x01, 0x7a, 0x7a, 0x09, 0xdf,
   298  					0x43, 0x52, 0xd9, 0x04, 0xcd, 0xeb, 0x79, 0xaa, 0x58,
   299  					0x3a, 0xdc, 0xc3, 0x1e, 0xa6, 0x98, 0xa4, 0xc0, 0x52,
   300  					0x83, 0xda, 0xba, 0x90, 0x89, 0xbe, 0x54, 0x91, 0xf6,
   301  					0x7c, 0x1a, 0x4e, 0xe4, 0x8d, 0xc7, 0x4b, 0xbb, 0xe6,
   302  					0x64, 0x3a, 0xef, 0x84, 0x66, 0x79, 0xb4, 0xcb, 0x39,
   303  					0x5a, 0x35, 0x2d, 0x5e, 0xd1, 0x15, 0x91, 0x2d, 0xf6,
   304  					0x96, 0xff, 0xe0, 0x70, 0x29, 0x32, 0x94, 0x6d, 0x71,
   305  					0x49, 0x2b, 0x44,
   306  				},
   307  			},
   308  			// Example 1.3
   309  			{
   310  				[]byte{0xd9, 0x4a, 0xe0, 0x83, 0x2e, 0x64, 0x45, 0xce,
   311  					0x42, 0x33, 0x1c, 0xb0, 0x6d, 0x53, 0x1a, 0x82, 0xb1,
   312  					0xdb, 0x4b, 0xaa, 0xd3, 0x0f, 0x74, 0x6d, 0xc9, 0x16,
   313  					0xdf, 0x24, 0xd4, 0xe3, 0xc2, 0x45, 0x1f, 0xff, 0x59,
   314  					0xa6, 0x42, 0x3e, 0xb0, 0xe1, 0xd0, 0x2d, 0x4f, 0xe6,
   315  					0x46, 0xcf, 0x69, 0x9d, 0xfd, 0x81, 0x8c, 0x6e, 0x97,
   316  					0xb0, 0x51,
   317  				},
   318  				[]byte{0x25, 0x14, 0xdf, 0x46, 0x95, 0x75, 0x5a, 0x67,
   319  					0xb2, 0x88, 0xea, 0xf4, 0x90, 0x5c, 0x36, 0xee, 0xc6,
   320  					0x6f, 0xd2, 0xfd,
   321  				},
   322  				[]byte{0x42, 0x37, 0x36, 0xed, 0x03, 0x5f, 0x60, 0x26,
   323  					0xaf, 0x27, 0x6c, 0x35, 0xc0, 0xb3, 0x74, 0x1b, 0x36,
   324  					0x5e, 0x5f, 0x76, 0xca, 0x09, 0x1b, 0x4e, 0x8c, 0x29,
   325  					0xe2, 0xf0, 0xbe, 0xfe, 0xe6, 0x03, 0x59, 0x5a, 0xa8,
   326  					0x32, 0x2d, 0x60, 0x2d, 0x2e, 0x62, 0x5e, 0x95, 0xeb,
   327  					0x81, 0xb2, 0xf1, 0xc9, 0x72, 0x4e, 0x82, 0x2e, 0xca,
   328  					0x76, 0xdb, 0x86, 0x18, 0xcf, 0x09, 0xc5, 0x34, 0x35,
   329  					0x03, 0xa4, 0x36, 0x08, 0x35, 0xb5, 0x90, 0x3b, 0xc6,
   330  					0x37, 0xe3, 0x87, 0x9f, 0xb0, 0x5e, 0x0e, 0xf3, 0x26,
   331  					0x85, 0xd5, 0xae, 0xc5, 0x06, 0x7c, 0xd7, 0xcc, 0x96,
   332  					0xfe, 0x4b, 0x26, 0x70, 0xb6, 0xea, 0xc3, 0x06, 0x6b,
   333  					0x1f, 0xcf, 0x56, 0x86, 0xb6, 0x85, 0x89, 0xaa, 0xfb,
   334  					0x7d, 0x62, 0x9b, 0x02, 0xd8, 0xf8, 0x62, 0x5c, 0xa3,
   335  					0x83, 0x36, 0x24, 0xd4, 0x80, 0x0f, 0xb0, 0x81, 0xb1,
   336  					0xcf, 0x94, 0xeb,
   337  				},
   338  			},
   339  		},
   340  	},
   341  	// Key 10
   342  	{"ae45ed5601cec6b8cc05f803935c674ddbe0d75c4c09fd7951fc6b0caec313a8df39970c518bffba5ed68f3f0d7f22a4029d413f1ae07e4ebe9e4177ce23e7f5404b569e4ee1bdcf3c1fb03ef113802d4f855eb9b5134b5a7c8085adcae6fa2fa1417ec3763be171b0c62b760ede23c12ad92b980884c641f5a8fac26bdad4a03381a22fe1b754885094c82506d4019a535a286afeb271bb9ba592de18dcf600c2aeeae56e02f7cf79fc14cf3bdc7cd84febbbf950ca90304b2219a7aa063aefa2c3c1980e560cd64afe779585b6107657b957857efde6010988ab7de417fc88d8f384c4e6e72c3f943e0c31c0c4a5cc36f879d8a3ac9d7d59860eaada6b83bb",
   343  		65537,
   344  		"056b04216fe5f354ac77250a4b6b0c8525a85c59b0bd80c56450a22d5f438e596a333aa875e291dd43f48cb88b9d5fc0d499f9fcd1c397f9afc070cd9e398c8d19e61db7c7410a6b2675dfbf5d345b804d201add502d5ce2dfcb091ce9997bbebe57306f383e4d588103f036f7e85d1934d152a323e4a8db451d6f4a5b1b0f102cc150e02feee2b88dea4ad4c1baccb24d84072d14e1d24a6771f7408ee30564fb86d4393a34bcf0b788501d193303f13a2284b001f0f649eaf79328d4ac5c430ab4414920a9460ed1b7bc40ec653e876d09abc509ae45b525190116a0c26101848298509c1c3bf3a483e7274054e15e97075036e989f60932807b5257751e79",
   345  		[]testEncryptOAEPMessage{
   346  			// Example 10.1
   347  			{
   348  				[]byte{0x8b, 0xba, 0x6b, 0xf8, 0x2a, 0x6c, 0x0f, 0x86,
   349  					0xd5, 0xf1, 0x75, 0x6e, 0x97, 0x95, 0x68, 0x70, 0xb0,
   350  					0x89, 0x53, 0xb0, 0x6b, 0x4e, 0xb2, 0x05, 0xbc, 0x16,
   351  					0x94, 0xee,
   352  				},
   353  				[]byte{0x47, 0xe1, 0xab, 0x71, 0x19, 0xfe, 0xe5, 0x6c,
   354  					0x95, 0xee, 0x5e, 0xaa, 0xd8, 0x6f, 0x40, 0xd0, 0xaa,
   355  					0x63, 0xbd, 0x33,
   356  				},
   357  				[]byte{0x53, 0xea, 0x5d, 0xc0, 0x8c, 0xd2, 0x60, 0xfb,
   358  					0x3b, 0x85, 0x85, 0x67, 0x28, 0x7f, 0xa9, 0x15, 0x52,
   359  					0xc3, 0x0b, 0x2f, 0xeb, 0xfb, 0xa2, 0x13, 0xf0, 0xae,
   360  					0x87, 0x70, 0x2d, 0x06, 0x8d, 0x19, 0xba, 0xb0, 0x7f,
   361  					0xe5, 0x74, 0x52, 0x3d, 0xfb, 0x42, 0x13, 0x9d, 0x68,
   362  					0xc3, 0xc5, 0xaf, 0xee, 0xe0, 0xbf, 0xe4, 0xcb, 0x79,
   363  					0x69, 0xcb, 0xf3, 0x82, 0xb8, 0x04, 0xd6, 0xe6, 0x13,
   364  					0x96, 0x14, 0x4e, 0x2d, 0x0e, 0x60, 0x74, 0x1f, 0x89,
   365  					0x93, 0xc3, 0x01, 0x4b, 0x58, 0xb9, 0xb1, 0x95, 0x7a,
   366  					0x8b, 0xab, 0xcd, 0x23, 0xaf, 0x85, 0x4f, 0x4c, 0x35,
   367  					0x6f, 0xb1, 0x66, 0x2a, 0xa7, 0x2b, 0xfc, 0xc7, 0xe5,
   368  					0x86, 0x55, 0x9d, 0xc4, 0x28, 0x0d, 0x16, 0x0c, 0x12,
   369  					0x67, 0x85, 0xa7, 0x23, 0xeb, 0xee, 0xbe, 0xff, 0x71,
   370  					0xf1, 0x15, 0x94, 0x44, 0x0a, 0xae, 0xf8, 0x7d, 0x10,
   371  					0x79, 0x3a, 0x87, 0x74, 0xa2, 0x39, 0xd4, 0xa0, 0x4c,
   372  					0x87, 0xfe, 0x14, 0x67, 0xb9, 0xda, 0xf8, 0x52, 0x08,
   373  					0xec, 0x6c, 0x72, 0x55, 0x79, 0x4a, 0x96, 0xcc, 0x29,
   374  					0x14, 0x2f, 0x9a, 0x8b, 0xd4, 0x18, 0xe3, 0xc1, 0xfd,
   375  					0x67, 0x34, 0x4b, 0x0c, 0xd0, 0x82, 0x9d, 0xf3, 0xb2,
   376  					0xbe, 0xc6, 0x02, 0x53, 0x19, 0x62, 0x93, 0xc6, 0xb3,
   377  					0x4d, 0x3f, 0x75, 0xd3, 0x2f, 0x21, 0x3d, 0xd4, 0x5c,
   378  					0x62, 0x73, 0xd5, 0x05, 0xad, 0xf4, 0xcc, 0xed, 0x10,
   379  					0x57, 0xcb, 0x75, 0x8f, 0xc2, 0x6a, 0xee, 0xfa, 0x44,
   380  					0x12, 0x55, 0xed, 0x4e, 0x64, 0xc1, 0x99, 0xee, 0x07,
   381  					0x5e, 0x7f, 0x16, 0x64, 0x61, 0x82, 0xfd, 0xb4, 0x64,
   382  					0x73, 0x9b, 0x68, 0xab, 0x5d, 0xaf, 0xf0, 0xe6, 0x3e,
   383  					0x95, 0x52, 0x01, 0x68, 0x24, 0xf0, 0x54, 0xbf, 0x4d,
   384  					0x3c, 0x8c, 0x90, 0xa9, 0x7b, 0xb6, 0xb6, 0x55, 0x32,
   385  					0x84, 0xeb, 0x42, 0x9f, 0xcc,
   386  				},
   387  			},
   388  		},
   389  	},
   390  }