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: 7c664151bc1a
Choose a base ref
...
head repository: jruby/jruby
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 3cccc1fb125c
Choose a head ref
  • 3 commits
  • 7 files changed
  • 1 contributor

Commits on May 18, 2015

  1. Copy the full SHA
    9e94c8f View commit details
  2. Copy the full SHA
    96fcca6 View commit details
  3. Copy the full SHA
    3cccc1f View commit details
27 changes: 14 additions & 13 deletions core/src/main/java/org/jruby/ext/digest/BubbleBabble.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.jruby.ext.digest;

import org.jruby.util.ByteList;

/**
* Ported from OpenSSH (https://github.com/openssh/openssh-portable/blob/957fbceb0f3166e41b76fdb54075ab3b9cc84cba/sshkey.c#L942-L987)
*
@@ -32,42 +34,41 @@

public class BubbleBabble {

public static String bubblebabble(byte[] digestRaw) {
public static ByteList bubblebabble(byte[] message, int begin, int length) {
char[] vowels = new char[]{'a', 'e', 'i', 'o', 'u', 'y'};
char[] consonants = new char[]{'b', 'c', 'd', 'f', 'g', 'h', 'k', 'l', 'm',
'n', 'p', 'r', 's', 't', 'v', 'z', 'x'};

int seed = 1;

StringBuffer retval = new StringBuffer();
int rawLen = digestRaw.length;
ByteList retval = new ByteList();

int rounds = (rawLen / 2) + 1;
int rounds = (length / 2) + 1;
retval.append('x');
for (int i = 0; i < rounds; i++) {
int idx0, idx1, idx2, idx3, idx4;

if ((i + 1 < rounds) || (rawLen % 2 != 0)) {
idx0 = (((((int) (digestRaw[2 * i])) >> 6) & 3) + seed) % 6;
idx1 = (((int) (digestRaw[2 * i])) >> 2) & 15;
idx2 = ((((int) (digestRaw[2 * i])) & 3) + (seed / 6)) % 6;
if ((i + 1 < rounds) || (length % 2 != 0)) {
idx0 = (((((int) (message[begin + 2 * i])) >> 6) & 3) + seed) % 6;
idx1 = (((int) (message[begin + 2 * i])) >> 2) & 15;
idx2 = ((((int) (message[begin + 2 * i])) & 3) + (seed / 6)) % 6;
retval.append(vowels[idx0]);
retval.append(consonants[idx1]);
retval.append(vowels[idx2]);
if ((i + 1) < rounds) {
idx3 = (((int) (digestRaw[(2 * i) + 1])) >> 4) & 15;
idx4 = (((int) (digestRaw[(2 * i) + 1]))) & 15;
idx3 = (((int) (message[begin + (2 * i) + 1])) >> 4) & 15;
idx4 = (((int) (message[begin + (2 * i) + 1]))) & 15;
retval.append(consonants[idx3]);
retval.append('-');
retval.append(consonants[idx4]);
seed = ((seed * 5) +
((((int) (digestRaw[2 * i])) * 7) +
((int) (digestRaw[(2 * i) + 1])))) % 36;
((((int) (message[begin + 2 * i])) * 7) +
((int) (message[begin + (2 * i) + 1])))) % 36;
}
}
}
retval.append('x');

return retval.toString();
return retval;
}
}
8 changes: 5 additions & 3 deletions core/src/main/java/org/jruby/ext/digest/RubyDigest.java
Original file line number Diff line number Diff line change
@@ -157,7 +157,8 @@ public static IRubyObject s_hexencode(IRubyObject recv, IRubyObject arg) {

@JRubyMethod(name = "bubblebabble", required = 1, meta = true)
public static IRubyObject bubblebabble(IRubyObject recv, IRubyObject arg) {
return RubyString.newString(recv.getRuntime(), BubbleBabble.bubblebabble(arg.convertToString().getBytes()));
final ByteList bytes = arg.convertToString().getByteList();
return RubyString.newString(recv.getRuntime(), BubbleBabble.bubblebabble(bytes.unsafeBytes(), bytes.begin(), bytes.length()));
}

private static class Metadata {
@@ -336,7 +337,7 @@ public static IRubyObject hexdigest_bang(ThreadContext context, IRubyObject self
@JRubyMethod(name = "bubblebabble", required = 1, optional = 1, meta = true)
public static IRubyObject bubblebabble(ThreadContext context, IRubyObject recv, IRubyObject[] args, Block unusedBlock) {
byte[] digest = recv.callMethod(context, "digest", args, Block.NULL_BLOCK).convertToString().getBytes();
return RubyString.newString(recv.getRuntime(), BubbleBabble.bubblebabble(digest));
return RubyString.newString(recv.getRuntime(), BubbleBabble.bubblebabble(digest, 0, digest.length));
}

@JRubyMethod()
@@ -480,7 +481,8 @@ public IRubyObject reset() {

@JRubyMethod()
public IRubyObject bubblebabble(ThreadContext context) {
return RubyString.newString(context.runtime, BubbleBabble.bubblebabble(algo.digest()));
final byte[] digest = algo.digest();
return RubyString.newString(context.runtime, BubbleBabble.bubblebabble(digest, 0, digest.length));
}

private void setAlgorithm(Metadata metadata) throws NoSuchAlgorithmException {
57 changes: 24 additions & 33 deletions lib/ruby/truffle/truffle/digest.rb
Original file line number Diff line number Diff line change
@@ -10,7 +10,25 @@ module Digest

NO_MESSAGE = Object.new

class Base
class Algorithm

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

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

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

def update(message)
Truffle::Digest.update @digest, message
@@ -68,30 +86,7 @@ def inspect

end

module BaseFunctions

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

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

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

end

class MD5 < Base
extend BaseFunctions
class MD5 < Algorithm

def initialize
@digest = Truffle::Digest.md5
@@ -103,8 +98,7 @@ def block_length

end

class SHA1 < Base
extend BaseFunctions
class SHA1 < Algorithm

def initialize
@digest = Truffle::Digest.sha1
@@ -116,8 +110,7 @@ def block_length

end

class SHA256 < Base
extend BaseFunctions
class SHA256 < Algorithm

def initialize
@digest = Truffle::Digest.sha256
@@ -129,8 +122,7 @@ def block_length

end

class SHA384 < Base
extend BaseFunctions
class SHA384 < Algorithm

def initialize
@digest = Truffle::Digest.sha384
@@ -142,8 +134,7 @@ def block_length

end

class SHA512 < Base
extend BaseFunctions
class SHA512 < Algorithm

def initialize
@digest = Truffle::Digest.sha512
22 changes: 10 additions & 12 deletions lib/ruby/truffle/truffle/digest/bubblebabble.rb
Original file line number Diff line number Diff line change
@@ -10,26 +10,24 @@

module Digest

def bubblebabble(message)
Truffle::Digest.bubblebabble(message)
def self.bubblebabble(message)
raise TypeError if message.nil?
raise TypeError if message.is_a? Fixnum
Truffle::Digest.bubblebabble(message.to_str)
end

class Base
class Algorithm

def bubblebabble(message=NO_MESSAGE)
Digest.bubblebabble(digest(message))
end

end

module BaseFunctions

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

def bubblebabble(message=NO_MESSAGE)
Digest.bubblebabble(digest(message))
end

end

end
5 changes: 4 additions & 1 deletion spec/jruby.2.2.mspec
Original file line number Diff line number Diff line change
@@ -73,7 +73,10 @@ class MSpecScript
'^' + SPEC_DIR + '/library/syslog',

# masked out because of load-time errors that can't be tagged
'^' + SPEC_DIR + '/library/net/http'
'^' + SPEC_DIR + '/library/net/http',

# Module not available
'^' + SPEC_DIR + '/library/digest/bubblebabble'
]

# Command Line specs
1 change: 1 addition & 0 deletions spec/truffle/tags/library/digest/bubblebabble_tags.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
fails:Digest.bubblebabble returns a String in the The Bubble Babble Binary Data Encoding format
Original file line number Diff line number Diff line change
@@ -234,7 +234,8 @@ public BubbleBabbleNode(RubyContext context, SourceSection sourceSection) {
@CompilerDirectives.TruffleBoundary
@Specialization
public RubyString bubblebabble(RubyString message) {
return getContext().makeString(BubbleBabble.bubblebabble(message.getByteList().bytes()));
final ByteList byteList = message.getByteList();
return getContext().makeString(BubbleBabble.bubblebabble(byteList.unsafeBytes(), byteList.begin(), byteList.length()));
}

}