You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2011/09/09 13:19:33 UTC

svn commit: r1167100 - in /commons/sandbox/runtime/trunk/src/main: java/org/apache/commons/runtime/ssl/Random.java native/modules/openssl/rand.c test/org/apache/commons/runtime/TestOpenSSL.java

Author: mturk
Date: Fri Sep  9 11:19:32 2011
New Revision: 1167100

URL: http://svn.apache.org/viewvc?rev=1167100&view=rev
Log:
Allow both standard and direct byte buffers to be used

Modified:
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/Random.java
    commons/sandbox/runtime/trunk/src/main/native/modules/openssl/rand.c
    commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestOpenSSL.java

Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/Random.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/Random.java?rev=1167100&r1=1167099&r2=1167100&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/Random.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/ssl/Random.java Fri Sep  9 11:19:32 2011
@@ -49,8 +49,8 @@ public final class Random
     private static native String        getdef0();
     private static native void          setdef0(String path);
 
-    private static native int           bytes0(byte[] b, int off, int len);
-    private static native int           bytes1(ByteBuffer b, int off, int len);
+    private static native boolean       bytes0(byte[] b, int off, int len);
+    private static native boolean       bytes1(ByteBuffer b, int off, int len);
     private static native boolean       seteng0(long ep);
     
     public static boolean seed(String path)
@@ -96,7 +96,7 @@ public final class Random
             throw new IndexOutOfBoundsException();
         synchronized(buf) {
             if (siz > 0) {
-                int n = siz > len ? len : pos;
+                int n = siz > len ? len : siz;
                 System.arraycopy(buf, pos, bytes, off, n);
                 off += n;
                 len -= n;
@@ -122,14 +122,32 @@ public final class Random
         synchronized(buf) {
             if (siz > 0) {
                 int s = buffer.remaining();
-                int n = siz > s ? s : pos;
+                int n = siz > s ? s : siz;
                 buffer.put(buf, pos, n);
                 pos += n;
                 siz -= n;
             }
         }
-        if (buffer.remaining() > 0)
-            bytes1(buffer, buffer.position(), buffer.remaining());
+        if (buffer.isDirect()) {
+            int nr = buffer.remaining();
+            if (nr > 0) {
+                int bp = buffer.position();
+                if (bytes1(buffer, bp, nr))
+                    buffer.position(bp + nr);
+            }
+        }
+        else {
+            int s;
+            while ((s = buffer.remaining()) > 0) {
+                bytes0(buf, 0, buf.length);
+                siz = buf.length;
+                pos = 0;
+                int n = siz > s ? s : siz;
+                buffer.put(buf, pos, n);
+                pos += n;
+                siz -= n;        
+            }
+        }
     }
 
     public byte nextByte()

Modified: commons/sandbox/runtime/trunk/src/main/native/modules/openssl/rand.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/modules/openssl/rand.c?rev=1167100&r1=1167099&r2=1167100&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/modules/openssl/rand.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/modules/openssl/rand.c Fri Sep  9 11:19:32 2011
@@ -157,11 +157,12 @@ ACR_SSL_EXPORT(void, Random, setdef0)(JN
 ACR_SSL_EXPORT(jint, Random, bytes0)(JNI_STDARGS, jbyteArray ba,
                                      jint off, jint len)
 {
-    jint rv = -1;
+    jboolean rv = JNI_FALSE;
     unsigned char *sb = (*env)->GetPrimitiveArrayCritical(env, ba, 0);
 
     if (sb != 0) {
-        rv = RAND_bytes(sb + off, len);
+        if (RAND_bytes(sb + off, len) > 0)
+            rv = JNI_TRUE;
         (*env)->ReleasePrimitiveArrayCritical(env, ba, sb, 0);
     }
     return rv;
@@ -170,13 +171,12 @@ ACR_SSL_EXPORT(jint, Random, bytes0)(JNI
 ACR_SSL_EXPORT(jint, Random, bytes1)(JNI_STDARGS, jobject bb,
                                      jint off, jint len)
 {
-    jint rv = -1;
     unsigned char *sb = (*env)->GetDirectBufferAddress(env, bb);
 
-    if (sb != 0) {
-        rv = RAND_bytes(sb + off, len);
-    }
-    return rv;
+    if (sb != 0 && RAND_bytes(sb + off, len) > 0)
+        return JNI_TRUE;
+    else
+        return JNI_FALSE;
 }
 
 ACR_SSL_EXPORT(jboolean, Random, seteng0)(JNI_STDARGS, jlong ep)

Modified: commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestOpenSSL.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestOpenSSL.java?rev=1167100&r1=1167099&r2=1167100&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestOpenSSL.java (original)
+++ commons/sandbox/runtime/trunk/src/main/test/org/apache/commons/runtime/TestOpenSSL.java Fri Sep  9 11:19:32 2011
@@ -20,6 +20,7 @@ import org.testng.annotations.*;
 import org.testng.Assert;
 import java.io.IOException;
 import java.io.File;
+import java.nio.ByteBuffer;
 import org.apache.commons.runtime.Native;
 
 public class TestOpenSSL extends Assert
@@ -75,5 +76,32 @@ public class TestOpenSSL extends Assert
         }
     }
 
+    @Test(groups = { "openssl" })
+    public void randomBytes()
+        throws Exception
+    {
+        byte[] b = new byte[1024];
+        Random r = new Random();
+        r.nextBytes(b);
+        r.nextByte();
+        r.nextBytes(b);
+        ByteBuffer bb = ByteBuffer.allocateDirect(1024);
+        r.nextBytes(bb);
+    }
+
+    @Test(groups = { "openssl" })
+    public void randomBuffer()
+        throws Exception
+    {
+        Random r = new Random();
+        r.nextByte();
+        ByteBuffer db = ByteBuffer.allocateDirect(1964);
+        r.nextBytes(db);
+        assertEquals(db.remaining(), 0);
+        ByteBuffer bb = ByteBuffer.allocate(2303);
+        r.nextBytes(bb);
+        assertEquals(bb.remaining(), 0);
+    }
 
+    
 }