Skip to content

Commit ac2a11f

Browse files
committed
Port RSA test from wip/combined-codebase-staging
Signed-off-by: Daiki Ueno <[email protected]>
1 parent f0d4c10 commit ac2a11f

File tree

1 file changed

+220
-2
lines changed

1 file changed

+220
-2
lines changed

openssl/rsa_test.go

Lines changed: 220 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@ package openssl_test
66
import (
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

1619
func 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

Comments
 (0)