@@ -3,6 +3,7 @@ package openssl_test
3
3
import (
4
4
"crypto/dsa"
5
5
"encoding/asn1"
6
+ "fmt"
6
7
"math/big"
7
8
"testing"
8
9
@@ -15,16 +16,28 @@ type dsaSignature struct {
15
16
}
16
17
17
18
func TestDSAGenerateParameters (t * testing.T ) {
18
- testGenerateDSAParameters (t , 1024 , 160 )
19
- testGenerateDSAParameters (t , 2048 , 224 )
20
- testGenerateDSAParameters (t , 2048 , 256 )
21
- testGenerateDSAParameters (t , 3072 , 256 )
19
+ var tests = []struct {
20
+ L , N int
21
+ }{
22
+ {1024 , 160 },
23
+ {2048 , 224 },
24
+ {2048 , 256 },
25
+ {3072 , 256 },
26
+ }
27
+ for _ , test := range tests {
28
+ t .Run (fmt .Sprintf ("%d-%d" , test .L , test .N ), func (t * testing.T ) {
29
+ if openssl .FIPS () {
30
+ t .Skip ("generating DSA parameters with L = 2048 is not supported in FIPS mode" )
31
+ }
32
+ testGenerateDSAParameters (t , test .L , test .N )
33
+ })
34
+ }
22
35
}
23
36
24
37
func testGenerateDSAParameters (t * testing.T , L , N int ) {
25
38
params , err := openssl .GenerateDSAParameters (L , N )
26
39
if err != nil {
27
- t .Errorf ("%d-%d: error generating parameters: %s" , L , N , err )
40
+ t .Errorf ("error generating parameters: %s" , err )
28
41
return
29
42
}
30
43
@@ -33,23 +46,23 @@ func testGenerateDSAParameters(t *testing.T, L, N int) {
33
46
G := bbig .Dec (params .G )
34
47
35
48
if P .BitLen () != L {
36
- t .Errorf ("%d-%d: params.BitLen got:%d want:%d" , L , N , P .BitLen (), L )
49
+ t .Errorf ("params.BitLen got:%d want:%d" , P .BitLen (), L )
37
50
}
38
51
39
52
if Q .BitLen () != N {
40
- t .Errorf ("%d-%d: q.BitLen got:%d want:%d" , L , N , Q .BitLen (), L )
53
+ t .Errorf ("q.BitLen got:%d want:%d" , Q .BitLen (), L )
41
54
}
42
55
43
56
one := new (big.Int )
44
57
one .SetInt64 (1 )
45
58
pm1 := new (big.Int ).Sub (P , one )
46
59
quo , rem := new (big.Int ).DivMod (pm1 , Q , new (big.Int ))
47
60
if rem .Sign () != 0 {
48
- t .Errorf ( "%d-%d: p-1 mod q != 0", L , N )
61
+ t .Error ( " p-1 mod q != 0" )
49
62
}
50
63
x := new (big.Int ).Exp (G , quo , P )
51
64
if x .Cmp (one ) == 0 {
52
- t .Errorf ( "%d-%d: invalid generator", L , N )
65
+ t .Error ( " invalid generator" )
53
66
}
54
67
55
68
priv , err := openssl .GenerateKeyDSA (params )
@@ -58,23 +71,23 @@ func testGenerateDSAParameters(t *testing.T, L, N int) {
58
71
return
59
72
}
60
73
61
- testDSASignAndVerify (t , L , priv )
74
+ testDSASignAndVerify (t , priv )
62
75
}
63
76
64
- func testDSASignAndVerify (t * testing.T , i int , priv * openssl.PrivateKeyDSA ) {
77
+ func testDSASignAndVerify (t * testing.T , priv * openssl.PrivateKeyDSA ) {
65
78
hashed := []byte ("testing" )
66
79
sig , err := openssl .SignDSA (priv , hashed [:])
67
80
if err != nil {
68
- t .Errorf ("%d: error signing: %s" , i , err )
81
+ t .Errorf ("error signing: %s" , err )
69
82
return
70
83
}
71
84
pub , err := openssl .NewPublicKeyDSA (priv .DSAParameters , priv .Y )
72
85
if err != nil {
73
- t .Errorf ("%d: error getting public key: %s" , i , err )
86
+ t .Errorf ("error getting public key: %s" , err )
74
87
return
75
88
}
76
89
if ! openssl .VerifyDSA (pub , hashed [:], sig ) {
77
- t .Errorf ( "%d: error verifying", i )
90
+ t .Error ( " error verifying" )
78
91
return
79
92
}
80
93
@@ -96,11 +109,11 @@ func testDSASignAndVerify(t *testing.T, i int, priv *openssl.PrivateKeyDSA) {
96
109
return
97
110
}
98
111
if ! dsa .Verify (& priv1 .PublicKey , hashed [:], esig .R , esig .S ) {
99
- t .Errorf ( "%d: compat: crypto/dsa can't verify OpenSSL signature", i )
112
+ t .Error ( " compat: crypto/dsa can't verify OpenSSL signature" )
100
113
}
101
114
r1 , s1 , err := dsa .Sign (openssl .RandReader , & priv1 , hashed [:])
102
115
if err != nil {
103
- t .Errorf ("%d: error signing: %s" , i , err )
116
+ t .Errorf ("error signing: %s" , err )
104
117
return
105
118
}
106
119
sig , err = asn1 .Marshal (dsaSignature {r1 , s1 })
@@ -109,12 +122,15 @@ func testDSASignAndVerify(t *testing.T, i int, priv *openssl.PrivateKeyDSA) {
109
122
return
110
123
}
111
124
if ! openssl .VerifyDSA (pub , hashed [:], sig ) {
112
- t .Errorf ( "%d: compat: OpenSSL can't verify crypto/dsa signature", i )
125
+ t .Error ( " compat: OpenSSL can't verify crypto/dsa signature" )
113
126
return
114
127
}
115
128
}
116
129
117
130
func TestDSASignAndVerify (t * testing.T ) {
131
+ if openssl .FIPS () {
132
+ t .Skip ("DSA signing with L = 2048 is not supported in FIPS mode" )
133
+ }
118
134
params := openssl.DSAParameters {
119
135
P : bbig .Enc (fromHex ("A9B5B793FB4785793D246BAE77E8FF63CA52F442DA763C440259919FE1BC1D6065A9350637A04F75A2F039401D49F08E066C4D275A5A65DA5684BC563C14289D7AB8A67163BFBF79D85972619AD2CFF55AB0EE77A9002B0EF96293BDD0F42685EBB2C66C327079F6C98000FBCB79AACDE1BC6F9D5C7B1A97E3D9D54ED7951FEF" )),
120
136
Q : bbig .Enc (fromHex ("E1D3391245933D68A0714ED34BBCB7A1F422B9C1" )),
@@ -127,7 +143,7 @@ func TestDSASignAndVerify(t *testing.T) {
127
143
t .Fatalf ("error generating key: %s" , err )
128
144
}
129
145
130
- testDSASignAndVerify (t , 0 , priv )
146
+ testDSASignAndVerify (t , priv )
131
147
}
132
148
133
149
func TestDSANewPrivateKeyWithDegenerateKeys (t * testing.T ) {
0 commit comments