@@ -6,11 +6,14 @@ package openssl_test
6
6
import (
7
7
"bytes"
8
8
"crypto"
9
+ "crypto/rsa"
9
10
"encoding/hex"
10
- "github.com/golang-fips/openssl-fips/openssl"
11
- "github.com/golang-fips/openssl-fips/openssl/bbig"
12
11
"math/big"
12
+ "strconv"
13
13
"testing"
14
+
15
+ "github.com/golang-fips/openssl-fips/openssl"
16
+ "github.com/golang-fips/openssl-fips/openssl/bbig"
14
17
)
15
18
16
19
func fromBase16 (base16 string ) openssl.BigInt {
@@ -167,3 +170,218 @@ func TestKeyGeneration(t *testing.T) {
167
170
}
168
171
}
169
172
}
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