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