github.com/bgentry/go@v0.0.0-20150121062915-6cf5a733d54d/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/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, ok := new(big.Int).SetString(base10, 10)
   124  	if !ok {
   125  		panic("bad number: " + base10)
   126  	}
   127  	return i
   128  }
   129  
   130  func BenchmarkRSA2048Decrypt(b *testing.B) {
   131  	b.StopTimer()
   132  	priv := &PrivateKey{
   133  		PublicKey: PublicKey{
   134  			N: fromBase10("14314132931241006650998084889274020608918049032671858325988396851334124245188214251956198731333464217832226406088020736932173064754214329009979944037640912127943488972644697423190955557435910767690712778463524983667852819010259499695177313115447116110358524558307947613422897787329221478860907963827160223559690523660574329011927531289655711860504630573766609239332569210831325633840174683944553667352219670930408593321661375473885147973879086994006440025257225431977751512374815915392249179976902953721486040787792801849818254465486633791826766873076617116727073077821584676715609985777563958286637185868165868520557"),
   135  			E: 3,
   136  		},
   137  		D: fromBase10("9542755287494004433998723259516013739278699355114572217325597900889416163458809501304132487555642811888150937392013824621448709836142886006653296025093941418628992648429798282127303704957273845127141852309016655778568546006839666463451542076964744073572349705538631742281931858219480985907271975884773482372966847639853897890615456605598071088189838676728836833012254065983259638538107719766738032720239892094196108713378822882383694456030043492571063441943847195939549773271694647657549658603365629458610273821292232646334717612674519997533901052790334279661754176490593041941863932308687197618671528035670452762731"),
   138  		Primes: []*big.Int{
   139  			fromBase10("130903255182996722426771613606077755295583329135067340152947172868415809027537376306193179624298874215608270802054347609836776473930072411958753044562214537013874103802006369634761074377213995983876788718033850153719421695468704276694983032644416930879093914927146648402139231293035971427838068945045019075433"),
   140  			fromBase10("109348945610485453577574767652527472924289229538286649661240938988020367005475727988253438647560958573506159449538793540472829815903949343191091817779240101054552748665267574271163617694640513549693841337820602726596756351006149518830932261246698766355347898158548465400674856021497190430791824869615170301029"),
   141  		},
   142  	}
   143  	priv.Precompute()
   144  
   145  	c := fromBase10("8472002792838218989464636159316973636630013835787202418124758118372358261975764365740026024610403138425986214991379012696600761514742817632790916315594342398720903716529235119816755589383377471752116975374952783629225022962092351886861518911824745188989071172097120352727368980275252089141512321893536744324822590480751098257559766328893767334861211872318961900897793874075248286439689249972315699410830094164386544311554704755110361048571142336148077772023880664786019636334369759624917224888206329520528064315309519262325023881707530002540634660750469137117568199824615333883758410040459705787022909848740188613313")
   146  
   147  	b.StartTimer()
   148  
   149  	for i := 0; i < b.N; i++ {
   150  		decrypt(nil, priv, c)
   151  	}
   152  }
   153  
   154  func Benchmark3PrimeRSA2048Decrypt(b *testing.B) {
   155  	b.StopTimer()
   156  	priv := &PrivateKey{
   157  		PublicKey: PublicKey{
   158  			N: fromBase10("16346378922382193400538269749936049106320265317511766357599732575277382844051791096569333808598921852351577762718529818072849191122419410612033592401403764925096136759934497687765453905884149505175426053037420486697072448609022753683683718057795566811401938833367954642951433473337066311978821180526439641496973296037000052546108507805269279414789035461158073156772151892452251106173507240488993608650881929629163465099476849643165682709047462010581308719577053905787496296934240246311806555924593059995202856826239801816771116902778517096212527979497399966526283516447337775509777558018145573127308919204297111496233"),
   159  			E: 3,
   160  		},
   161  		D: fromBase10("10897585948254795600358846499957366070880176878341177571733155050184921896034527397712889205732614568234385175145686545381899460748279607074689061600935843283397424506622998458510302603922766336783617368686090042765718290914099334449154829375179958369993407724946186243249568928237086215759259909861748642124071874879861299389874230489928271621259294894142840428407196932444474088857746123104978617098858619445675532587787023228852383149557470077802718705420275739737958953794088728369933811184572620857678792001136676902250566845618813972833750098806496641114644760255910789397593428910198080271317419213080834885003"),
   162  		Primes: []*big.Int{
   163  			fromBase10("1025363189502892836833747188838978207017355117492483312747347695538428729137306368764177201532277413433182799108299960196606011786562992097313508180436744488171474690412562218914213688661311117337381958560443"),
   164  			fromBase10("3467903426626310123395340254094941045497208049900750380025518552334536945536837294961497712862519984786362199788654739924501424784631315081391467293694361474867825728031147665777546570788493758372218019373"),
   165  			fromBase10("4597024781409332673052708605078359346966325141767460991205742124888960305710298765592730135879076084498363772408626791576005136245060321874472727132746643162385746062759369754202494417496879741537284589047"),
   166  		},
   167  	}
   168  	priv.Precompute()
   169  
   170  	c := fromBase10("8472002792838218989464636159316973636630013835787202418124758118372358261975764365740026024610403138425986214991379012696600761514742817632790916315594342398720903716529235119816755589383377471752116975374952783629225022962092351886861518911824745188989071172097120352727368980275252089141512321893536744324822590480751098257559766328893767334861211872318961900897793874075248286439689249972315699410830094164386544311554704755110361048571142336148077772023880664786019636334369759624917224888206329520528064315309519262325023881707530002540634660750469137117568199824615333883758410040459705787022909848740188613313")
   171  
   172  	b.StartTimer()
   173  
   174  	for i := 0; i < b.N; i++ {
   175  		decrypt(nil, priv, c)
   176  	}
   177  }
   178  
   179  type testEncryptOAEPMessage struct {
   180  	in   []byte
   181  	seed []byte
   182  	out  []byte
   183  }
   184  
   185  type testEncryptOAEPStruct struct {
   186  	modulus string
   187  	e       int
   188  	d       string
   189  	msgs    []testEncryptOAEPMessage
   190  }
   191  
   192  func TestEncryptOAEP(t *testing.T) {
   193  	sha1 := sha1.New()
   194  	n := new(big.Int)
   195  	for i, test := range testEncryptOAEPData {
   196  		n.SetString(test.modulus, 16)
   197  		public := PublicKey{n, test.e}
   198  
   199  		for j, message := range test.msgs {
   200  			randomSource := bytes.NewReader(message.seed)
   201  			out, err := EncryptOAEP(sha1, randomSource, &public, message.in, nil)
   202  			if err != nil {
   203  				t.Errorf("#%d,%d error: %s", i, j, err)
   204  			}
   205  			if !bytes.Equal(out, message.out) {
   206  				t.Errorf("#%d,%d bad result: %x (want %x)", i, j, out, message.out)
   207  			}
   208  		}
   209  	}
   210  }
   211  
   212  func TestDecryptOAEP(t *testing.T) {
   213  	random := rand.Reader
   214  
   215  	sha1 := sha1.New()
   216  	n := new(big.Int)
   217  	d := new(big.Int)
   218  	for i, test := range testEncryptOAEPData {
   219  		n.SetString(test.modulus, 16)
   220  		d.SetString(test.d, 16)
   221  		private := new(PrivateKey)
   222  		private.PublicKey = PublicKey{n, test.e}
   223  		private.D = d
   224  
   225  		for j, message := range test.msgs {
   226  			out, err := DecryptOAEP(sha1, nil, private, message.out, nil)
   227  			if err != nil {
   228  				t.Errorf("#%d,%d error: %s", i, j, err)
   229  			} else if !bytes.Equal(out, message.in) {
   230  				t.Errorf("#%d,%d bad result: %#v (want %#v)", i, j, out, message.in)
   231  			}
   232  
   233  			// Decrypt with blinding.
   234  			out, err = DecryptOAEP(sha1, random, private, message.out, nil)
   235  			if err != nil {
   236  				t.Errorf("#%d,%d (blind) error: %s", i, j, err)
   237  			} else if !bytes.Equal(out, message.in) {
   238  				t.Errorf("#%d,%d (blind) bad result: %#v (want %#v)", i, j, out, message.in)
   239  			}
   240  		}
   241  		if testing.Short() {
   242  			break
   243  		}
   244  	}
   245  }
   246  
   247  // testEncryptOAEPData contains a subset of the vectors from RSA's "Test vectors for RSA-OAEP".
   248  var testEncryptOAEPData = []testEncryptOAEPStruct{
   249  	// Key 1
   250  	{"a8b3b284af8eb50b387034a860f146c4919f318763cd6c5598c8ae4811a1e0abc4c7e0b082d693a5e7fced675cf4668512772c0cbc64a742c6c630f533c8cc72f62ae833c40bf25842e984bb78bdbf97c0107d55bdb662f5c4e0fab9845cb5148ef7392dd3aaff93ae1e6b667bb3d4247616d4f5ba10d4cfd226de88d39f16fb",
   251  		65537,
   252  		"53339cfdb79fc8466a655c7316aca85c55fd8f6dd898fdaf119517ef4f52e8fd8e258df93fee180fa0e4ab29693cd83b152a553d4ac4d1812b8b9fa5af0e7f55fe7304df41570926f3311f15c4d65a732c483116ee3d3d2d0af3549ad9bf7cbfb78ad884f84d5beb04724dc7369b31def37d0cf539e9cfcdd3de653729ead5d1",
   253  		[]testEncryptOAEPMessage{
   254  			// Example 1.1
   255  			{
   256  				[]byte{0x66, 0x28, 0x19, 0x4e, 0x12, 0x07, 0x3d, 0xb0,
   257  					0x3b, 0xa9, 0x4c, 0xda, 0x9e, 0xf9, 0x53, 0x23, 0x97,
   258  					0xd5, 0x0d, 0xba, 0x79, 0xb9, 0x87, 0x00, 0x4a, 0xfe,
   259  					0xfe, 0x34,
   260  				},
   261  				[]byte{0x18, 0xb7, 0x76, 0xea, 0x21, 0x06, 0x9d, 0x69,
   262  					0x77, 0x6a, 0x33, 0xe9, 0x6b, 0xad, 0x48, 0xe1, 0xdd,
   263  					0xa0, 0xa5, 0xef,
   264  				},
   265  				[]byte{0x35, 0x4f, 0xe6, 0x7b, 0x4a, 0x12, 0x6d, 0x5d,
   266  					0x35, 0xfe, 0x36, 0xc7, 0x77, 0x79, 0x1a, 0x3f, 0x7b,
   267  					0xa1, 0x3d, 0xef, 0x48, 0x4e, 0x2d, 0x39, 0x08, 0xaf,
   268  					0xf7, 0x22, 0xfa, 0xd4, 0x68, 0xfb, 0x21, 0x69, 0x6d,
   269  					0xe9, 0x5d, 0x0b, 0xe9, 0x11, 0xc2, 0xd3, 0x17, 0x4f,
   270  					0x8a, 0xfc, 0xc2, 0x01, 0x03, 0x5f, 0x7b, 0x6d, 0x8e,
   271  					0x69, 0x40, 0x2d, 0xe5, 0x45, 0x16, 0x18, 0xc2, 0x1a,
   272  					0x53, 0x5f, 0xa9, 0xd7, 0xbf, 0xc5, 0xb8, 0xdd, 0x9f,
   273  					0xc2, 0x43, 0xf8, 0xcf, 0x92, 0x7d, 0xb3, 0x13, 0x22,
   274  					0xd6, 0xe8, 0x81, 0xea, 0xa9, 0x1a, 0x99, 0x61, 0x70,
   275  					0xe6, 0x57, 0xa0, 0x5a, 0x26, 0x64, 0x26, 0xd9, 0x8c,
   276  					0x88, 0x00, 0x3f, 0x84, 0x77, 0xc1, 0x22, 0x70, 0x94,
   277  					0xa0, 0xd9, 0xfa, 0x1e, 0x8c, 0x40, 0x24, 0x30, 0x9c,
   278  					0xe1, 0xec, 0xcc, 0xb5, 0x21, 0x00, 0x35, 0xd4, 0x7a,
   279  					0xc7, 0x2e, 0x8a,
   280  				},
   281  			},
   282  			// Example 1.2
   283  			{
   284  				[]byte{0x75, 0x0c, 0x40, 0x47, 0xf5, 0x47, 0xe8, 0xe4,
   285  					0x14, 0x11, 0x85, 0x65, 0x23, 0x29, 0x8a, 0xc9, 0xba,
   286  					0xe2, 0x45, 0xef, 0xaf, 0x13, 0x97, 0xfb, 0xe5, 0x6f,
   287  					0x9d, 0xd5,
   288  				},
   289  				[]byte{0x0c, 0xc7, 0x42, 0xce, 0x4a, 0x9b, 0x7f, 0x32,
   290  					0xf9, 0x51, 0xbc, 0xb2, 0x51, 0xef, 0xd9, 0x25, 0xfe,
   291  					0x4f, 0xe3, 0x5f,
   292  				},
   293  				[]byte{0x64, 0x0d, 0xb1, 0xac, 0xc5, 0x8e, 0x05, 0x68,
   294  					0xfe, 0x54, 0x07, 0xe5, 0xf9, 0xb7, 0x01, 0xdf, 0xf8,
   295  					0xc3, 0xc9, 0x1e, 0x71, 0x6c, 0x53, 0x6f, 0xc7, 0xfc,
   296  					0xec, 0x6c, 0xb5, 0xb7, 0x1c, 0x11, 0x65, 0x98, 0x8d,
   297  					0x4a, 0x27, 0x9e, 0x15, 0x77, 0xd7, 0x30, 0xfc, 0x7a,
   298  					0x29, 0x93, 0x2e, 0x3f, 0x00, 0xc8, 0x15, 0x15, 0x23,
   299  					0x6d, 0x8d, 0x8e, 0x31, 0x01, 0x7a, 0x7a, 0x09, 0xdf,
   300  					0x43, 0x52, 0xd9, 0x04, 0xcd, 0xeb, 0x79, 0xaa, 0x58,
   301  					0x3a, 0xdc, 0xc3, 0x1e, 0xa6, 0x98, 0xa4, 0xc0, 0x52,
   302  					0x83, 0xda, 0xba, 0x90, 0x89, 0xbe, 0x54, 0x91, 0xf6,
   303  					0x7c, 0x1a, 0x4e, 0xe4, 0x8d, 0xc7, 0x4b, 0xbb, 0xe6,
   304  					0x64, 0x3a, 0xef, 0x84, 0x66, 0x79, 0xb4, 0xcb, 0x39,
   305  					0x5a, 0x35, 0x2d, 0x5e, 0xd1, 0x15, 0x91, 0x2d, 0xf6,
   306  					0x96, 0xff, 0xe0, 0x70, 0x29, 0x32, 0x94, 0x6d, 0x71,
   307  					0x49, 0x2b, 0x44,
   308  				},
   309  			},
   310  			// Example 1.3
   311  			{
   312  				[]byte{0xd9, 0x4a, 0xe0, 0x83, 0x2e, 0x64, 0x45, 0xce,
   313  					0x42, 0x33, 0x1c, 0xb0, 0x6d, 0x53, 0x1a, 0x82, 0xb1,
   314  					0xdb, 0x4b, 0xaa, 0xd3, 0x0f, 0x74, 0x6d, 0xc9, 0x16,
   315  					0xdf, 0x24, 0xd4, 0xe3, 0xc2, 0x45, 0x1f, 0xff, 0x59,
   316  					0xa6, 0x42, 0x3e, 0xb0, 0xe1, 0xd0, 0x2d, 0x4f, 0xe6,
   317  					0x46, 0xcf, 0x69, 0x9d, 0xfd, 0x81, 0x8c, 0x6e, 0x97,
   318  					0xb0, 0x51,
   319  				},
   320  				[]byte{0x25, 0x14, 0xdf, 0x46, 0x95, 0x75, 0x5a, 0x67,
   321  					0xb2, 0x88, 0xea, 0xf4, 0x90, 0x5c, 0x36, 0xee, 0xc6,
   322  					0x6f, 0xd2, 0xfd,
   323  				},
   324  				[]byte{0x42, 0x37, 0x36, 0xed, 0x03, 0x5f, 0x60, 0x26,
   325  					0xaf, 0x27, 0x6c, 0x35, 0xc0, 0xb3, 0x74, 0x1b, 0x36,
   326  					0x5e, 0x5f, 0x76, 0xca, 0x09, 0x1b, 0x4e, 0x8c, 0x29,
   327  					0xe2, 0xf0, 0xbe, 0xfe, 0xe6, 0x03, 0x59, 0x5a, 0xa8,
   328  					0x32, 0x2d, 0x60, 0x2d, 0x2e, 0x62, 0x5e, 0x95, 0xeb,
   329  					0x81, 0xb2, 0xf1, 0xc9, 0x72, 0x4e, 0x82, 0x2e, 0xca,
   330  					0x76, 0xdb, 0x86, 0x18, 0xcf, 0x09, 0xc5, 0x34, 0x35,
   331  					0x03, 0xa4, 0x36, 0x08, 0x35, 0xb5, 0x90, 0x3b, 0xc6,
   332  					0x37, 0xe3, 0x87, 0x9f, 0xb0, 0x5e, 0x0e, 0xf3, 0x26,
   333  					0x85, 0xd5, 0xae, 0xc5, 0x06, 0x7c, 0xd7, 0xcc, 0x96,
   334  					0xfe, 0x4b, 0x26, 0x70, 0xb6, 0xea, 0xc3, 0x06, 0x6b,
   335  					0x1f, 0xcf, 0x56, 0x86, 0xb6, 0x85, 0x89, 0xaa, 0xfb,
   336  					0x7d, 0x62, 0x9b, 0x02, 0xd8, 0xf8, 0x62, 0x5c, 0xa3,
   337  					0x83, 0x36, 0x24, 0xd4, 0x80, 0x0f, 0xb0, 0x81, 0xb1,
   338  					0xcf, 0x94, 0xeb,
   339  				},
   340  			},
   341  		},
   342  	},
   343  	// Key 10
   344  	{"ae45ed5601cec6b8cc05f803935c674ddbe0d75c4c09fd7951fc6b0caec313a8df39970c518bffba5ed68f3f0d7f22a4029d413f1ae07e4ebe9e4177ce23e7f5404b569e4ee1bdcf3c1fb03ef113802d4f855eb9b5134b5a7c8085adcae6fa2fa1417ec3763be171b0c62b760ede23c12ad92b980884c641f5a8fac26bdad4a03381a22fe1b754885094c82506d4019a535a286afeb271bb9ba592de18dcf600c2aeeae56e02f7cf79fc14cf3bdc7cd84febbbf950ca90304b2219a7aa063aefa2c3c1980e560cd64afe779585b6107657b957857efde6010988ab7de417fc88d8f384c4e6e72c3f943e0c31c0c4a5cc36f879d8a3ac9d7d59860eaada6b83bb",
   345  		65537,
   346  		"056b04216fe5f354ac77250a4b6b0c8525a85c59b0bd80c56450a22d5f438e596a333aa875e291dd43f48cb88b9d5fc0d499f9fcd1c397f9afc070cd9e398c8d19e61db7c7410a6b2675dfbf5d345b804d201add502d5ce2dfcb091ce9997bbebe57306f383e4d588103f036f7e85d1934d152a323e4a8db451d6f4a5b1b0f102cc150e02feee2b88dea4ad4c1baccb24d84072d14e1d24a6771f7408ee30564fb86d4393a34bcf0b788501d193303f13a2284b001f0f649eaf79328d4ac5c430ab4414920a9460ed1b7bc40ec653e876d09abc509ae45b525190116a0c26101848298509c1c3bf3a483e7274054e15e97075036e989f60932807b5257751e79",
   347  		[]testEncryptOAEPMessage{
   348  			// Example 10.1
   349  			{
   350  				[]byte{0x8b, 0xba, 0x6b, 0xf8, 0x2a, 0x6c, 0x0f, 0x86,
   351  					0xd5, 0xf1, 0x75, 0x6e, 0x97, 0x95, 0x68, 0x70, 0xb0,
   352  					0x89, 0x53, 0xb0, 0x6b, 0x4e, 0xb2, 0x05, 0xbc, 0x16,
   353  					0x94, 0xee,
   354  				},
   355  				[]byte{0x47, 0xe1, 0xab, 0x71, 0x19, 0xfe, 0xe5, 0x6c,
   356  					0x95, 0xee, 0x5e, 0xaa, 0xd8, 0x6f, 0x40, 0xd0, 0xaa,
   357  					0x63, 0xbd, 0x33,
   358  				},
   359  				[]byte{0x53, 0xea, 0x5d, 0xc0, 0x8c, 0xd2, 0x60, 0xfb,
   360  					0x3b, 0x85, 0x85, 0x67, 0x28, 0x7f, 0xa9, 0x15, 0x52,
   361  					0xc3, 0x0b, 0x2f, 0xeb, 0xfb, 0xa2, 0x13, 0xf0, 0xae,
   362  					0x87, 0x70, 0x2d, 0x06, 0x8d, 0x19, 0xba, 0xb0, 0x7f,
   363  					0xe5, 0x74, 0x52, 0x3d, 0xfb, 0x42, 0x13, 0x9d, 0x68,
   364  					0xc3, 0xc5, 0xaf, 0xee, 0xe0, 0xbf, 0xe4, 0xcb, 0x79,
   365  					0x69, 0xcb, 0xf3, 0x82, 0xb8, 0x04, 0xd6, 0xe6, 0x13,
   366  					0x96, 0x14, 0x4e, 0x2d, 0x0e, 0x60, 0x74, 0x1f, 0x89,
   367  					0x93, 0xc3, 0x01, 0x4b, 0x58, 0xb9, 0xb1, 0x95, 0x7a,
   368  					0x8b, 0xab, 0xcd, 0x23, 0xaf, 0x85, 0x4f, 0x4c, 0x35,
   369  					0x6f, 0xb1, 0x66, 0x2a, 0xa7, 0x2b, 0xfc, 0xc7, 0xe5,
   370  					0x86, 0x55, 0x9d, 0xc4, 0x28, 0x0d, 0x16, 0x0c, 0x12,
   371  					0x67, 0x85, 0xa7, 0x23, 0xeb, 0xee, 0xbe, 0xff, 0x71,
   372  					0xf1, 0x15, 0x94, 0x44, 0x0a, 0xae, 0xf8, 0x7d, 0x10,
   373  					0x79, 0x3a, 0x87, 0x74, 0xa2, 0x39, 0xd4, 0xa0, 0x4c,
   374  					0x87, 0xfe, 0x14, 0x67, 0xb9, 0xda, 0xf8, 0x52, 0x08,
   375  					0xec, 0x6c, 0x72, 0x55, 0x79, 0x4a, 0x96, 0xcc, 0x29,
   376  					0x14, 0x2f, 0x9a, 0x8b, 0xd4, 0x18, 0xe3, 0xc1, 0xfd,
   377  					0x67, 0x34, 0x4b, 0x0c, 0xd0, 0x82, 0x9d, 0xf3, 0xb2,
   378  					0xbe, 0xc6, 0x02, 0x53, 0x19, 0x62, 0x93, 0xc6, 0xb3,
   379  					0x4d, 0x3f, 0x75, 0xd3, 0x2f, 0x21, 0x3d, 0xd4, 0x5c,
   380  					0x62, 0x73, 0xd5, 0x05, 0xad, 0xf4, 0xcc, 0xed, 0x10,
   381  					0x57, 0xcb, 0x75, 0x8f, 0xc2, 0x6a, 0xee, 0xfa, 0x44,
   382  					0x12, 0x55, 0xed, 0x4e, 0x64, 0xc1, 0x99, 0xee, 0x07,
   383  					0x5e, 0x7f, 0x16, 0x64, 0x61, 0x82, 0xfd, 0xb4, 0x64,
   384  					0x73, 0x9b, 0x68, 0xab, 0x5d, 0xaf, 0xf0, 0xe6, 0x3e,
   385  					0x95, 0x52, 0x01, 0x68, 0x24, 0xf0, 0x54, 0xbf, 0x4d,
   386  					0x3c, 0x8c, 0x90, 0xa9, 0x7b, 0xb6, 0xb6, 0x55, 0x32,
   387  					0x84, 0xeb, 0x42, 0x9f, 0xcc,
   388  				},
   389  			},
   390  		},
   391  	},
   392  }