1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
require "spec"
require "../spec_helper"
require "../../../src/openssl"
describe OpenSSL::Digest do
[
{"SHA1", "dcf4a1e3542b1a40a4ac2a3f7c92ffdb2d19812f"},
{"SHA256", "df81eea14671ce970fb1052e9f5dd6dbda652ed37423ed3624120ec1534784a7"},
{"SHA512", "082907b85fe25c33bba4765185b52993a493cfd24454edf4b977ccd9301a890659c52592456cbd8aeb5215055d9dd4a7d50a4db9961715fb764fb6c393a83192"},
].each do |algorithm, expected|
it "should be able to calculate #{algorithm}" do
digest = OpenSSL::Digest.new(algorithm)
digest << "fooø"
digest.hexfinal.should eq(expected)
digest.reset
digest << "fooø"
digest.final.hexstring.should eq(expected)
end
end
it "can't call #final more than once" do
digest = OpenSSL::Digest.new("SHA1")
digest.final
expect_raises(Digest::FinalizedError) do
digest.final
end
end
it "raises a UnsupportedError if digest is unsupported" do
expect_raises OpenSSL::Digest::UnsupportedError do
OpenSSL::Digest.new("unsupported")
end
end
it "returns the digest size" do
OpenSSL::Digest.new("SHA1").digest_size.should eq 20
OpenSSL::Digest.new("SHA256").digest_size.should eq 32
end
it "returns the block size" do
OpenSSL::Digest.new("SHA1").block_size.should eq 64
OpenSSL::Digest.new("SHA256").block_size.should eq 64
end
it "correctly reads from IO" do
r, w = IO.pipe
digest = OpenSSL::Digest.new("SHA256")
w << "foo"
w.close
digest << r
r.close
digest.hexfinal.should eq("2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae")
end
describe ".dup" do
it "preserves type" do
OpenSSL::Digest.new("MD5").dup.class.should eq(OpenSSL::Digest)
end
it "preserves value" do
digest1 = OpenSSL::Digest.new("MD5")
digest1.update("a")
digest2 = digest1.dup
digest1.final.should eq(digest2.final)
end
it "leads to not sharing state" do
digest1 = OpenSSL::Digest.new("MD5")
digest1.update("a")
digest2 = digest1.dup
digest1.update("b")
digest1.final.should_not eq(digest2.final)
end
it "leads to deterministic updates" do
digest1 = OpenSSL::Digest.new("MD5")
digest1.update("a")
digest2 = digest1.dup
digest1.update("b")
digest2.update("b")
digest1.final.should eq(digest2.final)
end
end
it "digest with file content" do
path = datapath("test_file.txt")
OpenSSL::Digest.new("MD5").file(path).final.hexstring.should eq("a4f13879534d2b93a9a65a4b2d0dde9d")
end
end
|