Skip to content

Commit 65f2a3a

Browse files
authored
simplify GenerateKeyDSA (#232)
1 parent dd4074a commit 65f2a3a

File tree

2 files changed

+23
-22
lines changed

2 files changed

+23
-22
lines changed

dsa.go

+14-15
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ func (k *PublicKeyDSA) withKey(f func(C.GO_EVP_PKEY_PTR) C.int) C.int {
6060
return f(k._pkey)
6161
}
6262

63-
// GenerateDSAParameters generates a set of DSA parameters.
64-
func GenerateDSAParameters(l, n int) (DSAParameters, error) {
63+
// GenerateParametersDSA generates a set of DSA parameters.
64+
func GenerateParametersDSA(l, n int) (DSAParameters, error) {
6565
// The DSA parameters are generated by creating a new DSA key and
6666
// extracting the domain parameters from it.
6767

@@ -147,35 +147,34 @@ func NewPublicKeyDSA(params DSAParameters, y BigInt) (*PublicKeyDSA, error) {
147147
}
148148

149149
// GenerateKeyDSA generates a new private DSA key using the given parameters.
150-
func GenerateKeyDSA(params DSAParameters) (*PrivateKeyDSA, error) {
150+
func GenerateKeyDSA(params DSAParameters) (x, y BigInt, err error) {
151151
pkey, err := newDSA(params, nil, nil)
152152
if err != nil {
153-
return nil, err
153+
return nil, nil, err
154154
}
155-
var x, y C.GO_BIGNUM_PTR
155+
defer C.go_openssl_EVP_PKEY_free(pkey)
156+
var bx, by C.GO_BIGNUM_PTR
156157
switch vMajor {
157158
case 1:
158159
dsa := getDSA(pkey)
159160
if vMinor == 0 {
160-
C.go_openssl_DSA_get0_key_backport(dsa, &y, &x)
161+
C.go_openssl_DSA_get0_key_backport(dsa, &by, &bx)
161162
} else {
162-
C.go_openssl_DSA_get0_key(dsa, &y, &x)
163+
C.go_openssl_DSA_get0_key(dsa, &by, &bx)
163164
}
164165
case 3:
165166
defer func() {
166-
C.go_openssl_BN_clear_free(x)
167-
C.go_openssl_BN_free(y)
167+
C.go_openssl_BN_clear_free(bx)
168+
C.go_openssl_BN_free(by)
168169
}()
169-
if C.go_openssl_EVP_PKEY_get_bn_param(pkey, _OSSL_PKEY_PARAM_PUB_KEY, &y) != 1 ||
170-
C.go_openssl_EVP_PKEY_get_bn_param(pkey, _OSSL_PKEY_PARAM_PRIV_KEY, &x) != 1 {
171-
return nil, newOpenSSLError("EVP_PKEY_get_bn_param")
170+
if C.go_openssl_EVP_PKEY_get_bn_param(pkey, _OSSL_PKEY_PARAM_PUB_KEY, &by) != 1 ||
171+
C.go_openssl_EVP_PKEY_get_bn_param(pkey, _OSSL_PKEY_PARAM_PRIV_KEY, &bx) != 1 {
172+
return nil, nil, newOpenSSLError("EVP_PKEY_get_bn_param")
172173
}
173174
default:
174175
panic(errUnsupportedVersion())
175176
}
176-
k := &PrivateKeyDSA{params, bnToBig(x), bnToBig(y), pkey}
177-
runtime.SetFinalizer(k, (*PrivateKeyDSA).finalize)
178-
return k, nil
177+
return bnToBig(bx), bnToBig(by), nil
179178
}
180179

181180
// SignDSA signs a hash (which should be the result of hashing a larger message).

dsa_test.go

+9-7
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ func TestDSAGenerateParameters(t *testing.T) {
3333
if openssl.FIPS() {
3434
t.Skip("generating DSA parameters with L = 2048 is not supported in FIPS mode")
3535
}
36-
testGenerateDSAParameters(t, test.L, test.N)
36+
testGenerateParametersDSA(t, test.L, test.N)
3737
})
3838
}
3939
}
4040

41-
func testGenerateDSAParameters(t *testing.T, L, N int) {
42-
params, err := openssl.GenerateDSAParameters(L, N)
41+
func testGenerateParametersDSA(t *testing.T, L, N int) {
42+
params, err := openssl.GenerateParametersDSA(L, N)
4343
if err != nil {
4444
t.Errorf("error generating parameters: %s", err)
4545
return
@@ -64,17 +64,19 @@ func testGenerateDSAParameters(t *testing.T, L, N int) {
6464
if rem.Sign() != 0 {
6565
t.Error("p-1 mod q != 0")
6666
}
67-
x := new(big.Int).Exp(G, quo, P)
68-
if x.Cmp(one) == 0 {
67+
if x := new(big.Int).Exp(G, quo, P); x.Cmp(one) == 0 {
6968
t.Error("invalid generator")
7069
}
7170

72-
priv, err := openssl.GenerateKeyDSA(params)
71+
x, y, err := openssl.GenerateKeyDSA(params)
7372
if err != nil {
7473
t.Errorf("error generating key: %s", err)
7574
return
7675
}
77-
76+
priv, err := openssl.NewPrivateKeyDSA(params, x, y)
77+
if err != nil {
78+
t.Errorf("error creating key: %s", err)
79+
}
7880
testDSASignAndVerify(t, priv)
7981
}
8082

0 commit comments

Comments
 (0)