Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: jruby/jruby
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 0c52ae95c00d
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 4800d8fc765f
Choose a head ref
  • 2 commits
  • 6 files changed
  • 1 contributor

Commits on May 18, 2015

  1. Copy the full SHA
    ba84d86 View commit details
  2. Copy the full SHA
    4800d8f View commit details
70 changes: 66 additions & 4 deletions lib/ruby/truffle/truffle/digest.rb
Original file line number Diff line number Diff line change
@@ -68,26 +68,32 @@ def inspect

end

class MD5 < Base
module BaseFunctions

def self.file(file)
def file(file)
digest = new
digest.update File.read(file)
digest
end

def self.digest(message)
def digest(message)
digest = new
digest.update message
digest.digest
end

def self.hexdigest(message)
def hexdigest(message)
digest = new
digest.update message
digest.hexdigest
end

end

class MD5 < Base

extend BaseFunctions

def initialize
@digest = Truffle::Digest.md5
end
@@ -98,4 +104,60 @@ def block_length

end

class SHA1 < Base

extend BaseFunctions

def initialize
@digest = Truffle::Digest.sha1
end

def block_length
64
end

end

class SHA256 < Base

extend BaseFunctions

def initialize
@digest = Truffle::Digest.sha256
end

def block_length
64
end

end

class SHA384 < Base

extend BaseFunctions

def initialize
@digest = Truffle::Digest.sha384
end

def block_length
128
end

end

class SHA512 < Base

extend BaseFunctions

def initialize
@digest = Truffle::Digest.sha512
end

def block_length
128
end

end

end
1 change: 1 addition & 0 deletions lib/ruby/truffle/truffle/digest/rmd160.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
require 'digest'
1 change: 1 addition & 0 deletions lib/ruby/truffle/truffle/digest/sha1.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
require 'digest'
1 change: 1 addition & 0 deletions lib/ruby/truffle/truffle/digest/sha2.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
require 'digest'
5 changes: 5 additions & 0 deletions spec/truffle/tags/library/digest/hexencode_tags.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
fails:Digest.hexencode returns '' when passed an empty String
fails:Digest.hexencode returns the hex-encoded value of a non-empty String
fails:Digest.hexencode calls #to_str on an object and returns the hex-encoded value of the result
fails:Digest.hexencode raises a TypeError when passed nil
fails:Digest.hexencode raises a TypeError when passed a Fixnum
78 changes: 76 additions & 2 deletions truffle/src/main/java/org/jruby/truffle/nodes/ext/DigestNodes.java
Original file line number Diff line number Diff line change
@@ -39,14 +39,28 @@ public abstract class DigestNodes {
}

private enum Algorithm {
MD5
MD5("MD5"),
SHA1("SHA1"),
SHA256("SHA-256"),
SHA384("SHA-384"),
SHA512("SHA-512");

private final String name;

Algorithm(String name) {
this.name = name;
}

public String getName() {
return name;
}
}

private static RubyBasicObject createDigest(RubyContext context, Algorithm algorithm) {
final MessageDigest digest;

try {
digest = MessageDigest.getInstance(algorithm.name());
digest = MessageDigest.getInstance(algorithm.getName());
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
@@ -74,6 +88,66 @@ public RubyBasicObject md5() {

}

@CoreMethod(names = "sha1", isModuleFunction = true)
public abstract static class SHA1Node extends CoreMethodArrayArgumentsNode {

public SHA1Node(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

@CompilerDirectives.TruffleBoundary
@Specialization
public RubyBasicObject sha1() {
return createDigest(getContext(), Algorithm.SHA1);
}

}

@CoreMethod(names = "sha256", isModuleFunction = true)
public abstract static class SHA256Node extends CoreMethodArrayArgumentsNode {

public SHA256Node(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

@CompilerDirectives.TruffleBoundary
@Specialization
public RubyBasicObject sha256() {
return createDigest(getContext(), Algorithm.SHA256);
}

}

@CoreMethod(names = "sha384", isModuleFunction = true)
public abstract static class SHA384Node extends CoreMethodArrayArgumentsNode {

public SHA384Node(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

@CompilerDirectives.TruffleBoundary
@Specialization
public RubyBasicObject sha384() {
return createDigest(getContext(), Algorithm.SHA384);
}

}

@CoreMethod(names = "sha512", isModuleFunction = true)
public abstract static class SHA512Node extends CoreMethodArrayArgumentsNode {

public SHA512Node(RubyContext context, SourceSection sourceSection) {
super(context, sourceSection);
}

@CompilerDirectives.TruffleBoundary
@Specialization
public RubyBasicObject sha512() {
return createDigest(getContext(), Algorithm.SHA512);
}

}

@CoreMethod(names = "update", isModuleFunction = true, required = 2)
public abstract static class UpdateNode extends CoreMethodArrayArgumentsNode {