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