# coding: ASCII-8BIT require 'test/unit' require "openid/cryptutil" require "pathname" class CryptUtilTestCase < Test::Unit::TestCase BIG = 2 ** 256 def test_rand # If this is not true, the rest of our test won't work assert(BIG.is_a?(Bignum)) # It's possible that these will be small enough for fixnums, but # extraorindarily unlikely. a = OpenID::CryptUtil.rand(BIG) b = OpenID::CryptUtil.rand(BIG) assert(a.is_a?(Bignum)) assert(b.is_a?(Bignum)) assert_not_equal(a, b) end def test_rand_doesnt_depend_on_srand Kernel.srand(1) a = OpenID::CryptUtil.rand(BIG) Kernel.srand(1) b = OpenID::CryptUtil.rand(BIG) assert_not_equal(a, b) end def test_random_binary_convert (0..500).each do n = (0..10).inject(0) {|sum, element| sum + OpenID::CryptUtil.rand(BIG) } s = OpenID::CryptUtil.num_to_binary n assert(s.is_a?(String)) n_converted_back = OpenID::CryptUtil.binary_to_num(s) assert_equal(n, n_converted_back) end end def test_enumerated_binary_convert { "\x00" => 0, "\x01" => 1, "\x7F" => 127, "\x00\xFF" => 255, "\x00\x80" => 128, "\x00\x81" => 129, "\x00\x80\x00" => 32768, "OpenID is cool" => 1611215304203901150134421257416556, }.each do |str, num| num_prime = OpenID::CryptUtil.binary_to_num(str) str_prime = OpenID::CryptUtil.num_to_binary(num) assert_equal(num, num_prime) assert_equal(str, str_prime) end end def with_n2b64 test_dir = Pathname.new(__FILE__).dirname filename = test_dir.join('data', 'n2b64') File.open(filename) do |file| file.each_line do |line| base64, base10 = line.chomp.split yield base64, base10.to_i end end end def test_base64_to_num with_n2b64 do |base64, num| assert_equal(num, OpenID::CryptUtil.base64_to_num(base64)) end end def test_base64_to_num_invalid assert_raises(ArgumentError) { OpenID::CryptUtil.base64_to_num('!@#$') } end def test_num_to_base64 with_n2b64 do |base64, num| assert_equal(base64, OpenID::CryptUtil.num_to_base64(num)) end end def test_randomstring s1 = OpenID::CryptUtil.random_string(42) assert_equal(42, s1.length) s2 = OpenID::CryptUtil.random_string(42) assert_equal(42, s2.length) assert_not_equal(s1, s2) end def test_randomstring_population s1 = OpenID::CryptUtil.random_string(42, "XO") assert_match(/[XO]{42}/, s1) end def test_sha1 assert_equal("\x11\xf6\xad\x8e\xc5*)\x84\xab\xaa\xfd|;Qe\x03x\\ r", OpenID::CryptUtil.sha1('x')) end def test_hmac_sha1 assert_equal("\x8bo\xf7O\xa7\x18*\x90\xac ah\x16\xf7\xb8\x81JB\x9f|", OpenID::CryptUtil.hmac_sha1('x', 'x')) end def test_sha256 assert_equal("-q\x16B\xb7&\xb0D\x01b|\xa9\xfb\xac2\xf5\xc8S\x0f\xb1\x90<\xc4\xdb\x02%\x87\x17\x92\x1aH\x81", OpenID::CryptUtil.sha256('x')) end def test_hmac_sha256 assert_equal("\x94{\xd2w\xb2\xd3\\\xfc\x07\xfb\xc7\xe3b\xf2iuXz1\xf8:}\xffx\x8f\xda\xc1\xfaC\xc4\xb2\x87", OpenID::CryptUtil.hmac_sha256('x', 'x')) end end