Skip to content

Commit 9247cf8

Browse files
authored
Merge pull request #539 from rhenium/ky/pkey-dsa-generate-fix-q
pkey/dsa: let PKey::DSA.generate choose appropriate q size
2 parents 317bd5c + 0105975 commit 9247cf8

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

lib/openssl/pkey.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,8 +167,16 @@ class << self
167167
# +size+::
168168
# The desired key size in bits.
169169
def generate(size, &blk)
170+
# FIPS 186-4 specifies four (L,N) pairs: (1024,160), (2048,224),
171+
# (2048,256), and (3072,256).
172+
#
173+
# q size is derived here with compatibility with
174+
# DSA_generator_parameters_ex() which previous versions of ruby/openssl
175+
# used to call.
176+
qsize = size >= 2048 ? 256 : 160
170177
dsaparams = OpenSSL::PKey.generate_parameters("DSA", {
171178
"dsa_paramgen_bits" => size,
179+
"dsa_paramgen_q_bits" => qsize,
172180
}, &blk)
173181
OpenSSL::PKey.generate_key(dsaparams)
174182
end

test/openssl/test_pkey_dsa.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,25 @@ def test_new_break
2828
end
2929
end
3030

31+
def test_generate
32+
# DSA.generate used to call DSA_generate_parameters_ex(), which adjusts the
33+
# size of q according to the size of p
34+
key1024 = OpenSSL::PKey::DSA.generate(1024)
35+
assert_predicate key1024, :private?
36+
assert_equal 1024, key1024.p.num_bits
37+
assert_equal 160, key1024.q.num_bits
38+
39+
key2048 = OpenSSL::PKey::DSA.generate(2048)
40+
assert_equal 2048, key2048.p.num_bits
41+
assert_equal 256, key2048.q.num_bits
42+
43+
if ENV["OSSL_TEST_ALL"] == "1" # slow
44+
key3072 = OpenSSL::PKey::DSA.generate(3072)
45+
assert_equal 3072, key3072.p.num_bits
46+
assert_equal 256, key3072.q.num_bits
47+
end
48+
end
49+
3150
def test_sign_verify
3251
dsa512 = Fixtures.pkey("dsa512")
3352
data = "Sign me!"

0 commit comments

Comments
 (0)