Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix 'OpenSSL::Digest.{digest,hexdigest,base64digest} algorithm, data' #1889

Merged
merged 2 commits into from
Jan 23, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 10 additions & 4 deletions lib/truffle/digest.rb
Original file line number Diff line number Diff line change
Expand Up @@ -136,17 +136,23 @@ def inspect
class Class
include Instance

def self.digest(message)
digest = new
def self.digest(message, *parameters)
digest = new(*parameters)
digest.update message
digest.digest
end

def self.hexdigest(message)
digest = new
def self.hexdigest(*parameters, message)
digest = new(*parameters)
digest.update message
digest.hexdigest
end
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Digest.hexdigest seems defined as Digest.hexencode(Digest::Class.digest(*args)) in MRI:
https://github.com/ruby/ruby/blob/37c2cd3fa47c709570e22ec4dac723ca211f423a/ext/digest/digest.c#L478-L490

And then

def self.digest(name, data)
super(data, name)
end
is what, very confusingly, swaps the arguments.

I'll add a commit to do that.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes this definitely was a brainbender 😅 also had a fun time with how Digest::Class and Digest::Instance are used depending on using the stdlib Digest or the OpenSSL algorithm modules:

OpenSSL::Digest::SHA256.ancestors
=> [OpenSSL::Digest::SHA256, OpenSSL::Digest, Digest::Class, Digest::Instance, Object, Kernel, BasicObject]

Digest::SHA256.ancestors
=> [Digest::SHA256, Digest::Base, Digest::Class, Digest::Instance, Object, Kernel, BasicObject]

Digest::SHA256.ancestors - OpenSSL::Digest::SHA256.ancestors
=> [Digest::SHA256, Digest::Base]


def self.base64digest(*parameters, message)
digest = new(*parameters)
digest.update message
digest.base64digest
end
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just a note: this was already defined at line 29 above:
https://github.com/oracle/truffleruby/pull/1889/files#diff-048c3691437021dc9c9997d1a3aa7792R29

This file is pretty hard to follow due to reopening classes and part of the code from MRI.
Maybe I should try to convince MRI devs to define more of Digest in Ruby :)

end

class Base < Class
Expand Down
1 change: 1 addition & 0 deletions spec/ruby/library/digest/md5/shared/constants.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@ module MD5Constants
Digest = "\2473\267qw\276\364\343\345\320\304\350\313\314\217n"
BlankHexdigest = "d41d8cd98f00b204e9800998ecf8427e"
Hexdigest = "a733b77177bef4e3e5d0c4e8cbcc8f6e"
Base64digest = "pzO3cXe+9OPl0MToy8yPbg=="

end
3 changes: 2 additions & 1 deletion spec/ruby/library/digest/sha1/shared/constants.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ module SHA1Constants
BlankDigest = "\3329\243\356^kK\r2U\277\357\225`\030\220\257\330\a\t"
Digest = "X!\255b\323\035\352\314a|q\344+\376\317\361V9\324\343"
BlankHexdigest = "da39a3ee5e6b4b0d3255bfef95601890afd80709"
Hexdigest = "e907d2ba21c6c74bc0efd76e44d11fb9bbb7a75e"
Hexdigest = "5821ad62d31deacc617c71e42bfecff15639d4e3"
Base64digest = "WCGtYtMd6sxhfHHkK/7P8VY51OM="

end
1 change: 1 addition & 0 deletions spec/ruby/library/digest/sha256/shared/constants.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,6 @@ module SHA256Constants
Digest = "\230b\265\344_\337\357\337\242\004\314\311A\211jb\350\373\254\370\365M\230B\002\372\020j\as\270\376"
BlankHexdigest = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
Hexdigest = "9862b5e45fdfefdfa204ccc941896a62e8fbacf8f54d984202fa106a0773b8fe"
Base64digest = "mGK15F/f79+iBMzJQYlqYuj7rPj1TZhCAvoQagdzuP4="

end
1 change: 1 addition & 0 deletions spec/ruby/library/digest/sha384/shared/constants.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,6 @@ module SHA384Constants
Digest = "B&\266:\314\216z\361!TD\001{`\355\323\320MW%\270\272\0034n\034\026g\a\217\"\333s\202\275\002Y*\217]\207u\f\034\244\231\266f"
BlankHexdigest = "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b"
Hexdigest = "4226b63acc8e7af1215444017b60edd3d04d5725b8ba03346e1c1667078f22db7382bd02592a8f5d87750c1ca499b666"
Base64digest = "Qia2OsyOevEhVEQBe2Dt09BNVyW4ugM0bhwWZwePIttzgr0CWSqPXYd1DBykmbZm"

end
1 change: 1 addition & 0 deletions spec/ruby/library/digest/sha512/shared/constants.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,6 @@ module SHA512Constants
Digest = "\241\231\232\365\002z\241\331\242\310=\367F\272\004\326\331g\315n\251Q\222\250\374E\257\254=\325\225\003SM\350\244\234\220\233=\031\230A;\000\203\233\340\323t\333\271\222w\266\307\2678\344\255j\003\216\300"
BlankHexdigest = "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e"
Hexdigest = "a1999af5027aa1d9a2c83df746ba04d6d967cd6ea95192a8fc45afac3dd59503534de8a49c909b3d1998413b00839be0d374dbb99277b6c7b738e4ad6a038ec0"
Base64digest = "oZma9QJ6odmiyD33RroE1tlnzW6pUZKo/EWvrD3VlQNTTeiknJCbPRmYQTsAg5vg03TbuZJ3tse3OOStagOOwA=="

end
63 changes: 63 additions & 0 deletions spec/ruby/library/openssl/digest_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
require_relative '../../spec_helper'
require_relative '../../library/digest/sha1/shared/constants'
require_relative '../../library/digest/sha256/shared/constants'
require_relative '../../library/digest/sha384/shared/constants'
require_relative '../../library/digest/sha512/shared/constants'
require 'openssl'

describe "OpenSSL::Digest" do

describe ".digest" do
it "returns a SHA1 digest" do
OpenSSL::Digest.digest('sha1', SHA1Constants::Contents).should == SHA1Constants::Digest
end

it "returns a SHA256 digest" do
OpenSSL::Digest.digest('sha256', SHA256Constants::Contents).should == SHA256Constants::Digest
end

it "returns a SHA384 digest" do
OpenSSL::Digest.digest('sha384', SHA384Constants::Contents).should == SHA384Constants::Digest
end

it "returns a SHA512 digest" do
OpenSSL::Digest.digest('sha512', SHA512Constants::Contents).should == SHA512Constants::Digest
end
end

describe ".hexdigest" do
it "returns a SHA1 hexdigest" do
OpenSSL::Digest.hexdigest('sha1', SHA1Constants::Contents).should == SHA1Constants::Hexdigest
end

it "returns a SHA256 hexdigest" do
OpenSSL::Digest.hexdigest('sha256', SHA256Constants::Contents).should == SHA256Constants::Hexdigest
end

it "returns a SHA384 hexdigest" do
OpenSSL::Digest.hexdigest('sha384', SHA384Constants::Contents).should == SHA384Constants::Hexdigest
end

it "returns a SHA512 hexdigest" do
OpenSSL::Digest.hexdigest('sha512', SHA512Constants::Contents).should == SHA512Constants::Hexdigest
end
end

describe ".base64digest" do
it "returns a SHA1 base64digest" do
OpenSSL::Digest.base64digest('sha1', SHA1Constants::Contents).should == SHA1Constants::Base64digest
end

it "returns a SHA256 base64digest" do
OpenSSL::Digest.base64digest('sha256', SHA256Constants::Contents).should == SHA256Constants::Base64digest
end

it "returns a SHA384 base64digest" do
OpenSSL::Digest.base64digest('sha384', SHA384Constants::Contents).should == SHA384Constants::Base64digest
end

it "returns a SHA512 base64digest" do
OpenSSL::Digest.base64digest('sha512', SHA512Constants::Contents).should == SHA512Constants::Base64digest
end
end
end