@@ -6,11 +6,14 @@ package openssl_test
66import (
77 "bytes"
88 "crypto"
9+ "crypto/rsa"
910 "encoding/hex"
10- "github.com/golang-fips/openssl-fips/openssl"
11- "github.com/golang-fips/openssl-fips/openssl/bbig"
1211 "math/big"
12+ "strconv"
1313 "testing"
14+
15+ "github.com/golang-fips/openssl-fips/openssl"
16+ "github.com/golang-fips/openssl-fips/openssl/bbig"
1417)
1518
1619func fromBase16 (base16 string ) openssl.BigInt {
@@ -167,3 +170,218 @@ func TestKeyGeneration(t *testing.T) {
167170 }
168171 }
169172}
173+
174+ func TestRSAKeyGeneration (t * testing.T ) {
175+ for _ , size := range []int {2048 , 3072 } {
176+ t .Run (strconv .Itoa (size ), func (t * testing.T ) {
177+ t .Parallel ()
178+ priv , pub := newRSAKey (t , size )
179+ msg := []byte ("hi!" )
180+ enc , err := openssl .EncryptRSAPKCS1 (pub , msg )
181+ if err != nil {
182+ t .Fatalf ("EncryptPKCS1v15: %v" , err )
183+ }
184+ dec , err := openssl .DecryptRSAPKCS1 (priv , enc )
185+ if err != nil {
186+ t .Fatalf ("DecryptPKCS1v15: %v" , err )
187+ }
188+ if ! bytes .Equal (dec , msg ) {
189+ t .Fatalf ("got:%x want:%x" , dec , msg )
190+ }
191+ })
192+ }
193+ }
194+
195+ func TestEncryptDecryptOAEP (t * testing.T ) {
196+ sha256 := openssl .NewSHA256 ()
197+ msg := []byte ("hi!" )
198+ label := []byte ("ho!" )
199+ priv , pub := newRSAKey (t , 2048 )
200+ enc , err := openssl .EncryptRSAOAEP (sha256 , pub , msg , label )
201+ if err != nil {
202+ t .Fatal (err )
203+ }
204+ dec , err := openssl .DecryptRSAOAEP (sha256 , priv , enc , label )
205+ if err != nil {
206+ t .Fatal (err )
207+ }
208+ if ! bytes .Equal (dec , msg ) {
209+ t .Errorf ("got:%x want:%x" , dec , msg )
210+ }
211+ }
212+
213+ func TestEncryptDecryptOAEP_WrongLabel (t * testing.T ) {
214+ sha256 := openssl .NewSHA256 ()
215+ msg := []byte ("hi!" )
216+ priv , pub := newRSAKey (t , 2048 )
217+ enc , err := openssl .EncryptRSAOAEP (sha256 , pub , msg , []byte ("ho!" ))
218+ if err != nil {
219+ t .Fatal (err )
220+ }
221+ dec , err := openssl .DecryptRSAOAEP (sha256 , priv , enc , []byte ("wrong!" ))
222+ if err == nil {
223+ t .Errorf ("error expected" )
224+ }
225+ if dec != nil {
226+ t .Errorf ("got:%x want: nil" , dec )
227+ }
228+ }
229+
230+ func TestEncryptDecryptNoPadding (t * testing.T ) {
231+ msg := make ([]byte , 2048 / 8 )
232+ priv , pub := newRSAKey (t , 2048 )
233+ enc , err := openssl .EncryptRSANoPadding (pub , msg )
234+ if err != nil {
235+ t .Fatal (err )
236+ }
237+ dec , err := openssl .DecryptRSANoPadding (priv , enc )
238+ if err != nil {
239+ t .Fatal (err )
240+ }
241+ if ! bytes .Equal (dec , msg ) {
242+ t .Errorf ("got:%x want:%x" , dec , msg )
243+ }
244+ }
245+
246+ func TestSignVerifyPKCS1v15 (t * testing.T ) {
247+ sha256 := openssl .NewSHA256 ()
248+ priv , pub := newRSAKey (t , 2048 )
249+ msg := []byte ("hi!" )
250+ sha256 .Write (msg )
251+ hashed := sha256 .Sum (nil )
252+ signed , err := openssl .SignRSAPKCS1v15 (priv , crypto .SHA256 , hashed , true )
253+ if err != nil {
254+ t .Fatal (err )
255+ }
256+ signed2 , err := openssl .SignRSAPKCS1v15 (priv , crypto .SHA256 , msg , false )
257+ if err != nil {
258+ t .Fatal (err )
259+ }
260+ if ! bytes .Equal (signed , signed2 ) {
261+ t .Fatalf ("got:%x want:%x" , signed , signed2 )
262+ }
263+ err = openssl .VerifyRSAPKCS1v15 (pub , crypto .SHA256 , hashed , signed , true )
264+ if err != nil {
265+ t .Fatal (err )
266+ }
267+ err = openssl .VerifyRSAPKCS1v15 (pub , crypto .SHA256 , msg , signed2 , false )
268+ if err != nil {
269+ t .Fatal (err )
270+ }
271+ }
272+
273+ func TestSignVerifyPKCS1v15_Unhashed (t * testing.T ) {
274+ msg := []byte ("hi!" )
275+ priv , pub := newRSAKey (t , 2048 )
276+ signed , err := openssl .SignRSAPKCS1v15 (priv , 0 , msg , false )
277+ if err != nil {
278+ t .Fatal (err )
279+ }
280+ err = openssl .VerifyRSAPKCS1v15 (pub , 0 , msg , signed , false )
281+ if err != nil {
282+ t .Fatal (err )
283+ }
284+ }
285+
286+ func TestSignVerifyPKCS1v15_Invalid (t * testing.T ) {
287+ sha256 := openssl .NewSHA256 ()
288+ msg := []byte ("hi!" )
289+ priv , pub := newRSAKey (t , 2048 )
290+ sha256 .Write (msg )
291+ hashed := sha256 .Sum (nil )
292+ signed , err := openssl .SignRSAPKCS1v15 (priv , crypto .SHA256 , hashed , true )
293+ if err != nil {
294+ t .Fatal (err )
295+ }
296+ err = openssl .VerifyRSAPKCS1v15 (pub , crypto .SHA256 , msg , signed , true )
297+ if err == nil {
298+ t .Fatal ("error expected" )
299+ }
300+ }
301+
302+ func TestSignVerifyRSAPSS (t * testing.T ) {
303+ // Test cases taken from
304+ // https://github.com/golang/go/blob/54182ff54a687272dd7632c3a963e036ce03cb7c/src/crypto/rsa/pss_test.go#L200.
305+ const keyBits = 2048
306+ var saltLengthCombinations = []struct {
307+ signSaltLength , verifySaltLength int
308+ good bool
309+ }{
310+ {rsa .PSSSaltLengthAuto , rsa .PSSSaltLengthAuto , true },
311+ {rsa .PSSSaltLengthEqualsHash , rsa .PSSSaltLengthAuto , true },
312+ {rsa .PSSSaltLengthEqualsHash , rsa .PSSSaltLengthEqualsHash , true },
313+ {rsa .PSSSaltLengthEqualsHash , 8 , false },
314+ {rsa .PSSSaltLengthAuto , rsa .PSSSaltLengthEqualsHash , false },
315+ {8 , 8 , true },
316+ {rsa .PSSSaltLengthAuto , keyBits / 8 - 2 - 32 , true }, // simulate Go PSSSaltLengthAuto algorithm (32 = sha256 size)
317+ {rsa .PSSSaltLengthAuto , 20 , false },
318+ {rsa .PSSSaltLengthAuto , - 2 , false },
319+ }
320+ sha256 := openssl .NewSHA256 ()
321+ priv , pub := newRSAKey (t , keyBits )
322+ sha256 .Write ([]byte ("testing" ))
323+ hashed := sha256 .Sum (nil )
324+ for i , test := range saltLengthCombinations {
325+ signed , err := openssl .SignRSAPSS (priv , crypto .SHA256 , hashed , test .signSaltLength )
326+ if err != nil {
327+ t .Errorf ("#%d: error while signing: %s" , i , err )
328+ continue
329+ }
330+ err = openssl .VerifyRSAPSS (pub , crypto .SHA256 , hashed , signed , test .verifySaltLength )
331+ if (err == nil ) != test .good {
332+ t .Errorf ("#%d: bad result, wanted: %t, got: %s" , i , test .good , err )
333+ }
334+ }
335+ }
336+
337+ func newRSAKey (t * testing.T , size int ) (* openssl.PrivateKeyRSA , * openssl.PublicKeyRSA ) {
338+ t .Helper ()
339+ N , E , D , P , Q , Dp , Dq , Qinv , err := openssl .GenerateKeyRSA (size )
340+ if err != nil {
341+ t .Fatalf ("GenerateKeyRSA(%d): %v" , size , err )
342+ }
343+ priv , err := openssl .NewPrivateKeyRSA (N , E , D , P , Q , Dp , Dq , Qinv )
344+ if err != nil {
345+ t .Fatalf ("NewPrivateKeyRSA(%d): %v" , size , err )
346+ }
347+ pub , err := openssl .NewPublicKeyRSA (N , E )
348+ if err != nil {
349+ t .Fatalf ("NewPublicKeyRSA(%d): %v" , size , err )
350+ }
351+ return priv , pub
352+ }
353+
354+ func fromBase36 (base36 string ) * big.Int {
355+ i , ok := new (big.Int ).SetString (base36 , 36 )
356+ if ! ok {
357+ panic ("bad number: " + base36 )
358+ }
359+ return i
360+ }
361+
362+ func BenchmarkEncryptRSAPKCS1 (b * testing.B ) {
363+ b .StopTimer ()
364+ // Public key length should be at least of 2048 bits, else OpenSSL will report an error when running in FIPS mode.
365+ n := fromBase36 ("14314132931241006650998084889274020608918049032671858325988396851334124245188214251956198731333464217832226406088020736932173064754214329009979944037640912127943488972644697423190955557435910767690712778463524983667852819010259499695177313115447116110358524558307947613422897787329221478860907963827160223559690523660574329011927531289655711860504630573766609239332569210831325633840174683944553667352219670930408593321661375473885147973879086994006440025257225431977751512374815915392249179976902953721486040787792801849818254465486633791826766873076617116727073077821584676715609985777563958286637185868165868520557" )
366+ test2048PubKey , err := openssl .NewPublicKeyRSA (bbig .Enc (n ), bbig .Enc (big .NewInt (3 )))
367+ if err != nil {
368+ b .Fatal (err )
369+ }
370+ b .StartTimer ()
371+ b .ReportAllocs ()
372+ for i := 0 ; i < b .N ; i ++ {
373+ if _ , err := openssl .EncryptRSAPKCS1 (test2048PubKey , []byte ("testing" )); err != nil {
374+ b .Fatal (err )
375+ }
376+ }
377+ }
378+
379+ func BenchmarkGenerateKeyRSA (b * testing.B ) {
380+ b .ReportAllocs ()
381+ for i := 0 ; i < b .N ; i ++ {
382+ _ , _ , _ , _ , _ , _ , _ , _ , err := openssl .GenerateKeyRSA (2048 )
383+ if err != nil {
384+ b .Fatal (err )
385+ }
386+ }
387+ }
0 commit comments