Skip to content

Instantly share code, notes, and snippets.

@headius
Created January 15, 2014 01:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save headius/8429206 to your computer and use it in GitHub Desktop.
Save headius/8429206 to your computer and use it in GitHub Desktop.
diff --git a/core/src/main/java/org/jruby/ext/securerandom/SecureRandomLibrary.java b/core/src/main/java/org/jruby/ext/securerandom/SecureRandomLibrary.java
index 0c6ab3f..e6c5ecf 100644
--- a/core/src/main/java/org/jruby/ext/securerandom/SecureRandomLibrary.java
+++ b/core/src/main/java/org/jruby/ext/securerandom/SecureRandomLibrary.java
@@ -6,6 +6,7 @@ import org.jruby.RubyString;
import org.jruby.anno.JRubyMethod;
import org.jruby.runtime.ThreadContext;
import org.jruby.runtime.builtin.IRubyObject;
+import org.jruby.util.ConvertBytes;
import java.security.SecureRandom;
@@ -15,26 +16,38 @@ import java.security.SecureRandom;
public class SecureRandomLibrary {
@JRubyMethod(meta = true)
public static IRubyObject random_bytes(ThreadContext context, IRubyObject self) {
- return nextBytes(context.runtime, 16);
+ return RubyString.newStringNoCopy(context.runtime, nextBytes(context, 16));
}
@JRubyMethod(meta = true)
public static IRubyObject random_bytes(ThreadContext context, IRubyObject self, IRubyObject n) {
- Ruby runtime = context.runtime;
+ return RubyString.newStringNoCopy(context.runtime, nextBytes(context, n));
+ }
+
+ @JRubyMethod(meta = true)
+ public static IRubyObject hex(ThreadContext context, IRubyObject self) {
+ return RubyString.newStringNoCopy(context.runtime, ConvertBytes.twosComplementToHexBytes(nextBytes(context, 16), false));
+ }
+
+ @JRubyMethod(meta = true)
+ public static IRubyObject hex(ThreadContext context, IRubyObject self, IRubyObject n) {
+ return RubyString.newStringNoCopy(context.runtime, ConvertBytes.twosComplementToHexBytes(nextBytes(context, 16), false));
+ }
- if (!(n instanceof RubyFixnum)) throw runtime.newArgumentError("non-integer argument: " + n);
+ private static byte[] nextBytes(ThreadContext context, IRubyObject n) {
+ if (!(n instanceof RubyFixnum)) throw context.runtime.newArgumentError("non-integer argument: " + n);
int size = (int)n.convertToInteger().getLongValue();
- return nextBytes(runtime, size);
+ return nextBytes(context, size);
}
- private static IRubyObject nextBytes(Ruby runtime, int size) {
- if (size < 0) throw runtime.newArgumentError("negative argument: " + size);
+ private static byte[] nextBytes(ThreadContext context, int size) {
+ if (size < 0) throw context.runtime.newArgumentError("negative argument: " + size);
byte[] bytes = new byte[size];
- new SecureRandom().nextBytes(bytes);
+ context.secureRandom.nextBytes(bytes);
- return RubyString.newStringNoCopy(runtime, bytes);
+ return bytes;
}
}
diff --git a/core/src/main/java/org/jruby/runtime/ThreadContext.java b/core/src/main/java/org/jruby/runtime/ThreadContext.java
index 43c44bf..d952957 100644
--- a/core/src/main/java/org/jruby/runtime/ThreadContext.java
+++ b/core/src/main/java/org/jruby/runtime/ThreadContext.java
@@ -36,6 +36,7 @@
package org.jruby.runtime;
import java.lang.ref.WeakReference;
+import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -128,6 +129,8 @@ public final class ThreadContext {
Visibility lastVisibility;
IRubyObject lastExitStatus;
+
+ public final SecureRandom secureRandom = new SecureRandom();
/**
* Constructor for Context.
diff --git a/lib/ruby/shared/securerandom.rb b/lib/ruby/shared/securerandom.rb
index 2e94c3d..ba80cf5 100644
--- a/lib/ruby/shared/securerandom.rb
+++ b/lib/ruby/shared/securerandom.rb
@@ -53,8 +53,6 @@ module SecureRandom
raise
end
- JRuby.reference(self).define_annotated_methods(org.jruby.ext.securerandom.SecureRandomLibrary)
-
# SecureRandom.hex generates a random hex string.
#
# The argument n specifies the length of the random length.
@@ -71,9 +69,12 @@ module SecureRandom
# If secure random number generator is not available,
# NotImplementedError is raised.
def self.hex(n=nil)
- random_bytes(n).unpack("H*")[0]
+ # replaced below by native version
+ raise
end
+ JRuby.reference(self).define_annotated_methods(org.jruby.ext.securerandom.SecureRandomLibrary)
+
# SecureRandom.base64 generates a random base64 string.
#
# The argument n specifies the length of the random length.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment