1require_relative 'utils'
2
3if defined?(OpenSSL)
4
5class OpenSSL::TestPKeyDH < Test::Unit::TestCase
6
7  NEW_KEYLEN = 256
8
9  def test_new
10    dh = OpenSSL::PKey::DH.new(NEW_KEYLEN)
11    assert_key(dh)
12  end
13
14  def test_new_break
15    assert_nil(OpenSSL::PKey::DH.new(NEW_KEYLEN) { break })
16    assert_raises(RuntimeError) do
17      OpenSSL::PKey::DH.new(NEW_KEYLEN) { raise }
18    end
19  end
20
21  def test_to_der
22    dh = OpenSSL::TestUtils::TEST_KEY_DH1024
23    der = dh.to_der
24    dh2 = OpenSSL::PKey::DH.new(der)
25    assert_equal_params(dh, dh2)
26    assert_no_key(dh2)
27  end
28
29  def test_to_pem
30    dh = OpenSSL::TestUtils::TEST_KEY_DH1024
31    pem = dh.to_pem
32    dh2 = OpenSSL::PKey::DH.new(pem)
33    assert_equal_params(dh, dh2)
34    assert_no_key(dh2)
35  end
36
37  def test_public_key
38    dh = OpenSSL::TestUtils::TEST_KEY_DH1024
39    public_key = dh.public_key
40    assert_no_key(public_key) #implies public_key.public? is false!
41    assert_equal(dh.to_der, public_key.to_der)
42    assert_equal(dh.to_pem, public_key.to_pem)
43  end
44
45  def test_generate_key
46    dh = OpenSSL::TestUtils::TEST_KEY_DH512_PUB.public_key # creates a copy
47    assert_no_key(dh)
48    dh.generate_key!
49    assert_key(dh)
50  end
51
52  def test_key_exchange
53    dh = OpenSSL::TestUtils::TEST_KEY_DH512_PUB
54    dh2 = dh.public_key
55    dh.generate_key!
56    dh2.generate_key!
57    assert_equal(dh.compute_key(dh2.pub_key), dh2.compute_key(dh.pub_key))
58  end
59
60  private
61
62  def assert_equal_params(dh1, dh2)
63    assert_equal(dh1.g, dh2.g)
64    assert_equal(dh1.p, dh2.p)
65  end
66
67  def assert_no_key(dh)
68    assert_equal(false, dh.public?)
69    assert_equal(false, dh.private?)
70    assert_equal(nil, dh.pub_key)
71    assert_equal(nil, dh.priv_key)
72  end
73
74  def assert_key(dh)
75    assert(dh.public?)
76    assert(dh.private?)
77    assert(dh.pub_key)
78    assert(dh.priv_key)
79  end
80end
81
82end
83