require 'test/unit' require 'openid/dh' require 'testutil' module OpenID class DiffieHellmanExposed < OpenID::DiffieHellman def DiffieHellmanExposed.strxor_for_testing(a, b) return DiffieHellmanExposed.strxor(a, b) end end class DiffieHellmanTestCase < Test::Unit::TestCase include OpenID::TestDataMixin NUL = "\x00" def test_strxor_success [#input 1 input 2 expected [NUL, NUL, NUL ], ["\x01", NUL, "\x01" ], ["a", "a", NUL ], ["a", NUL, "a" ], ["abc", NUL * 3, "abc" ], ["x" * 10, NUL * 10, "x" * 10], ["\x01", "\x02", "\x03" ], ["\xf0", "\x0f", "\xff" ], ["\xff", "\x0f", "\xf0" ], ].each do |input1, input2, expected| actual = DiffieHellmanExposed.strxor_for_testing(input1, input2) assert_equal(expected, actual) end end def test_strxor_failure [ ['', 'a' ], ['foo', 'ba' ], [NUL * 3, NUL * 4], [255, 127 ].map{|h| (0..h).map{|i|i.chr}.join('')}, ].each do |aa, bb| assert_raises(ArgumentError) { DiffieHellmanExposed.strxor(aa, bb) } end end def test_simple_exchange dh1 = DiffieHellman.from_defaults() dh2 = DiffieHellman.from_defaults() secret1 = dh1.get_shared_secret(dh2.public) secret2 = dh2.get_shared_secret(dh1.public) assert_equal(secret1, secret2) end def test_xor_secret dh1 = DiffieHellman.from_defaults() dh2 = DiffieHellman.from_defaults() secret = "Shhhhhh! don't tell!" encrypted = dh1.xor_secret((CryptUtil.method :sha1), dh2.public, secret) decrypted = dh2.xor_secret((CryptUtil.method :sha1), dh1.public, encrypted) assert_equal(secret, decrypted) end def test_dh dh = DiffieHellman.from_defaults() class << dh def set_private_test(priv) set_private(priv) end end read_data_file('dh.txt', true).each do |line| priv, pub = line.split(' ').map {|x| x.to_i} dh.set_private_test(priv) assert_equal(dh.public, pub) end end def test_using_defaults dh = DiffieHellman.from_defaults() assert(dh.using_default_values?) dh = DiffieHellman.new(3, 2750161) assert(!dh.using_default_values?) end end end