Home | History | Annotate | Download | only in rsa
      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 }
    393