github.com/gocuntian/go@v0.0.0-20160610041250-fee02d270bf8/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 }