@@ -249,34 +249,60 @@ func newDSA3(params DSAParameters, X, Y BigInt) (C.GO_EVP_PKEY_PTR, error) {
249
249
return nil , newOpenSSLError ("OSSL_PARAM_BLD_new" )
250
250
}
251
251
defer C .go_openssl_OSSL_PARAM_BLD_free (bld )
252
- selection := C .int (C .GO_EVP_PKEY_PUBLIC_KEY )
253
- pub := bigToBN (Y )
254
- defer C .go_openssl_BN_free (pub )
255
- if C .go_openssl_OSSL_PARAM_BLD_push_BN (bld , paramPubKey , pub ) != 1 {
252
+ p , q , g := bigToBN (params .P ), bigToBN (params .Q ), bigToBN (params .G )
253
+ defer func () {
254
+ C .go_openssl_BN_free (p )
255
+ C .go_openssl_BN_free (q )
256
+ C .go_openssl_BN_free (g )
257
+ }()
258
+ if C .go_openssl_OSSL_PARAM_BLD_push_BN (bld , paramP , p ) != 1 ||
259
+ C .go_openssl_OSSL_PARAM_BLD_push_BN (bld , paramQ , q ) != 1 ||
260
+ C .go_openssl_OSSL_PARAM_BLD_push_BN (bld , paramG , g ) != 1 {
256
261
return nil , newOpenSSLError ("OSSL_PARAM_BLD_push_BN" )
257
262
}
263
+ selection := C .int (C .GO_EVP_PKEY_KEYPAIR )
264
+ if Y != nil {
265
+ pub := bigToBN (Y )
266
+ defer C .go_openssl_BN_free (pub )
267
+ if C .go_openssl_OSSL_PARAM_BLD_push_BN (bld , paramPubKey , pub ) != 1 {
268
+ return nil , newOpenSSLError ("OSSL_PARAM_BLD_push_BN" )
269
+ }
270
+ selection = C .int (C .GO_EVP_PKEY_PUBLIC_KEY )
271
+ }
258
272
if X != nil {
259
273
priv := bigToBN (X )
260
274
defer C .go_openssl_BN_clear_free (priv )
261
275
if C .go_openssl_OSSL_PARAM_BLD_push_BN (bld , paramPrivKey , priv ) != 1 {
262
276
return nil , newOpenSSLError ("OSSL_PARAM_BLD_push_BN" )
263
277
}
264
- selection = C .GO_EVP_PKEY_KEYPAIR
265
278
}
266
279
bldparams := C .go_openssl_OSSL_PARAM_BLD_to_param (bld )
267
280
if bldparams == nil {
268
281
return nil , newOpenSSLError ("OSSL_PARAM_BLD_to_param" )
269
282
}
270
283
defer C .go_openssl_OSSL_PARAM_free (bldparams )
271
- pkey , err := newEvpFromParams (C .GO_EVP_PKEY_EC , selection , bldparams )
284
+ pkey , err := newEvpFromParams (C .GO_EVP_PKEY_DSA , selection , bldparams )
272
285
if err != nil {
273
286
return nil , err
274
287
}
275
288
if Y != nil {
276
289
return pkey , nil
277
290
}
278
- // Generate the key.
279
- return nil , nil
291
+ // pkey doesn't contain the public/private components. We use it
292
+ // as domain parameters placeholder to generate the final key.
293
+ defer C .go_openssl_EVP_PKEY_free (pkey )
294
+ ctx := C .go_openssl_EVP_PKEY_CTX_new_from_pkey (nil , pkey , nil )
295
+ if ctx == nil {
296
+ return nil , newOpenSSLError ("EVP_PKEY_CTX_new_from_pkey" )
297
+ }
298
+ if C .go_openssl_EVP_PKEY_keygen_init (ctx ) != 1 {
299
+ return nil , newOpenSSLError ("EVP_PKEY_keygen_init" )
300
+ }
301
+ var gkey C.GO_EVP_PKEY_PTR
302
+ if C .go_openssl_EVP_PKEY_keygen (ctx , & gkey ) != 1 {
303
+ return nil , newOpenSSLError ("EVP_PKEY_keygen" )
304
+ }
305
+ return gkey , nil
280
306
}
281
307
282
308
// getDSA returns the DSA from pkey.
0 commit comments