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"
     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