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
5package rsa
6
7import (
8	"bytes"
9	"crypto"
10	"crypto/rand"
11	"crypto/sha1"
12	"crypto/sha256"
13	"math/big"
14	"testing"
15)
16
17func 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
32func 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
45func 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
58func 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
76func 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
94func 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
124func 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
132var test2048Key *PrivateKey
133
134func 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
149func 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
161func 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
171func 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
196type testEncryptOAEPMessage struct {
197	in   []byte
198	seed []byte
199	out  []byte
200}
201
202type testEncryptOAEPStruct struct {
203	modulus string
204	e       int64
205	d       string
206	msgs    []testEncryptOAEPMessage
207}
208
209func 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
229func 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".
265var 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}
410