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