github.com/insolar/x-crypto@v0.0.0-20191031140942-75fab8a325f6/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  	"github.com/insolar/x-crypto"
    10  	"github.com/insolar/x-crypto/rand"
    11  	"github.com/insolar/x-crypto/sha1"
    12  	"github.com/insolar/x-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  }