commit-classpath
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[commit-cp] classpath ChangeLog-ssl-nio gnu/javax/net/ssl/p... [ssl]


From: Casey Marshall
Subject: [commit-cp] classpath ChangeLog-ssl-nio gnu/javax/net/ssl/p... [ssl]
Date: Tue, 06 Jun 2006 01:01:21 +0000

CVSROOT:        /cvsroot/classpath
Module name:    classpath
Branch:         ssl
Changes by:     Casey Marshall <rsdio>  06/06/06 01:01:21

Modified files:
        .              : ChangeLog-ssl-nio 
        gnu/javax/net/ssl/provider: Extension.java 
        jessie-tests   : run-tests.sh 
Added files:
        gnu/javax/net/ssl/provider: ExtensionList.java 
        jessie-tests   : testExtensionsList.java 

Log message:
        2006-06-05  Casey Marshall  <address@hidden>
        
                * gnu/javax/net/ssl/provider/Extension.java: add Javadoc.
                (length): return the length of the extension value.
                (setLength, setType, setValue, setValue): new methods.
                * gnu/javax/net/ssl/provider/ExtensionList.java: new file.
                * jessie-tests/run-tests.sh: add testExtensionList.
                * jessie-tests/testExtensionList.java: new file.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/classpath/ChangeLog-ssl-nio?cvsroot=classpath&only_with_tag=ssl&r1=1.1.2.3&r2=1.1.2.4
http://cvs.savannah.gnu.org/viewcvs/classpath/gnu/javax/net/ssl/provider/Extension.java?cvsroot=classpath&only_with_tag=ssl&r1=1.1.4.1.2.1&r2=1.1.4.1.2.2
http://cvs.savannah.gnu.org/viewcvs/classpath/gnu/javax/net/ssl/provider/ExtensionList.java?cvsroot=classpath&only_with_tag=ssl&rev=1.1.2.1
http://cvs.savannah.gnu.org/viewcvs/classpath/jessie-tests/run-tests.sh?cvsroot=classpath&only_with_tag=ssl&r1=1.1.4.2&r2=1.1.4.3
http://cvs.savannah.gnu.org/viewcvs/classpath/jessie-tests/testExtensionsList.java?cvsroot=classpath&only_with_tag=ssl&rev=1.1.2.1

Patches:
Index: ChangeLog-ssl-nio
===================================================================
RCS file: /cvsroot/classpath/classpath/Attic/ChangeLog-ssl-nio,v
retrieving revision 1.1.2.3
retrieving revision 1.1.2.4
diff -u -b -r1.1.2.3 -r1.1.2.4
--- ChangeLog-ssl-nio   6 Jun 2006 00:47:28 -0000       1.1.2.3
+++ ChangeLog-ssl-nio   6 Jun 2006 01:01:19 -0000       1.1.2.4
@@ -1,5 +1,14 @@
 2006-06-05  Casey Marshall <address@hidden>
 
+       * gnu/javax/net/ssl/provider/Extension.java: add Javadoc.
+       (length): return the length of the extension value.
+       (setLength, setType, setValue, setValue): new methods.
+       * gnu/javax/net/ssl/provider/ExtensionList.java: new file.
+       * jessie-tests/run-tests.sh: add testExtensionList.
+       * jessie-tests/testExtensionList.java: new file.
+
+2006-06-05  Casey Marshall  <address@hidden>
+
        * gnu/javax/net/ssl/provider/CipherSuiteList.java: implement
        Iterable<CipherSuite>.
        (iterator): new method.
@@ -20,4 +29,3 @@
        * gnu/javax/net/ssl/provider/ServerHelloDone.java: made public.
        * jessie-tests/run-tests.sh: add `testServerHelloDone.'
        * jessie-tests/testServerHelloDone.java: new test.
-

Index: gnu/javax/net/ssl/provider/Extension.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/gnu/javax/net/ssl/provider/Extension.java,v
retrieving revision 1.1.4.1.2.1
retrieving revision 1.1.4.1.2.2
diff -u -b -r1.1.4.1.2.1 -r1.1.4.1.2.2
--- gnu/javax/net/ssl/provider/Extension.java   3 Jun 2006 07:49:53 -0000       
1.1.4.1.2.1
+++ gnu/javax/net/ssl/provider/Extension.java   6 Jun 2006 01:01:19 -0000       
1.1.4.1.2.2
@@ -43,6 +43,17 @@
 
 import java.nio.ByteBuffer;
 
+/**
+ * An SSL hello extension.
+ * 
+ * <pre>
+ * struct {
+ *   ExtensionType extension_type;
+ *   opaque extension_data<0..2^16-1>;
+ * } Extension;</pre>
+ * 
+ * @author address@hidden
+ */
 public final class Extension implements Constructed
 {
 
@@ -64,7 +75,7 @@
 
   public int length ()
   {
-    return (buffer.getShort (2) & 0xFFFF) + 4;
+    return (buffer.getShort (2) & 0xFFFF);
   }
 
   public Type type()
@@ -80,6 +91,30 @@
     return value;
   }
 
+  public void setLength (final int newLength)
+  {
+    if (newLength < 0 || newLength > 65535)
+      throw new IllegalArgumentException ("length is out of bounds");
+    buffer.putShort (2, (short) newLength);
+  }
+  
+  public void setType (final Type type)
+  {
+    buffer.putShort(0, (short) type.getValue());
+  }
+
+  public void setValue (byte[] value)
+  {
+    setValue (value, 0, value.length);
+  }
+  
+  public void setValue (final byte[] value, final int offset, final int length)
+  {
+    if (length != length ())
+      throw new IllegalArgumentException ("length is different than claimed 
length");
+    ((ByteBuffer) buffer.duplicate().position(4)).put(value, offset, length);
+  }
+  
   public String toString()
   {
     return toString(null);

Index: jessie-tests/run-tests.sh
===================================================================
RCS file: /cvsroot/classpath/classpath/jessie-tests/Attic/run-tests.sh,v
retrieving revision 1.1.4.2
retrieving revision 1.1.4.3
diff -u -b -r1.1.4.2 -r1.1.4.3
--- jessie-tests/run-tests.sh   3 Jun 2006 19:52:52 -0000       1.1.4.2
+++ jessie-tests/run-tests.sh   6 Jun 2006 01:01:20 -0000       1.1.4.3
@@ -7,7 +7,7 @@
 
 tests="testAlert testCertificate testCertificateRequest \
        testCipherSuiteList testClientHello testCompressionMethodList \
-       testHelloRequest testRecord testServerDHParams \
+       testExtensionList testHelloRequest testRecord testServerDHParams \
        testServerHello testServerHelloDone testServerKeyExchange \
        testServerRSAParams testSignature"
 

Index: gnu/javax/net/ssl/provider/ExtensionList.java
===================================================================
RCS file: gnu/javax/net/ssl/provider/ExtensionList.java
diff -N gnu/javax/net/ssl/provider/ExtensionList.java
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ gnu/javax/net/ssl/provider/ExtensionList.java       6 Jun 2006 01:01:19 
-0000       1.1.2.1
@@ -0,0 +1,270 @@
+package gnu.javax.net.ssl.provider;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.nio.ByteBuffer;
+import java.util.ConcurrentModificationException;
+import java.util.Iterator;
+import java.util.ListIterator;
+import java.util.NoSuchElementException;
+
+/**
+ * A list of extensions, that may appear in either the address@hidden 
ClientHello} or
+ * address@hidden ServerHello}. The form of the extensions list is:
+ * 
+ * <tt>   Extension extensions_list&lt;1..2^16-1&gt;</tt>
+ * 
+ * @author csm
+ */
+public class ExtensionList implements Iterable<Extension>
+{
+  private final ByteBuffer buffer;
+  private int modCount;
+
+  public ExtensionList (ByteBuffer buffer)
+  {
+    this.buffer = buffer;
+    modCount = 0;
+  }
+
+  public Extension get (final int index)
+  {
+    int length = length ();
+    int i;
+    int n = 0;
+    for (i = 2; i < length && n < index; )
+      {
+        int l = buffer.getShort (i+2) & 0xFFFF;
+        i += l + 4;
+        n++;
+      }
+    if (n < index)
+      throw new IndexOutOfBoundsException ("no elemenet at " + index);
+    int el = buffer.getShort (i+2) & 0xFFFF;
+    return new Extension (((ByteBuffer) 
buffer.duplicate().position(i).limit(i+el+4)).slice());
+  }
+  
+  /**
+   * Returns the number of extensions this list contains.
+   * 
+   * @return The number of extensions.
+   */
+  public int size ()
+  {
+    int length = length ();
+    if (length == 0)
+      return 0;
+    int n = 0;
+    for (int i = 2; i < length; )
+      {
+        int len = buffer.getShort (i+2) & 0xFFFF;
+        i += len + 4;
+        n++;
+      }
+    return n;
+  }
+
+  /**
+   * Returns the length of this extension list, in bytes.
+   * 
+   * @return The length of this extension list, in bytes.
+   */
+  public int length ()
+  {
+    return buffer.getShort (0) & 0xFFFF;
+  }
+  
+  /**
+   * Sets the extension at index <i>i</i> to <i>e</i>. Note that setting an
+   * element at an index <b>may</b> invalidate any other elements that come
+   * after element at index <i>i</i>. In other words, no attempt is made to
+   * move existing elements in this list, and since extensions are variable
+   * length, you can <em>not</em> guarantee that extensions later in the list
+   * will still be valid.
+   * 
+   * <p>Thus, elements of this list <b>must</b> be set in order of increasing
+   * index.
+   * 
+   * @param index The index to set the extension at.
+   * @param e The extension.
+   * @throws java.nio.BufferOverflowException If setting the extension 
overflows
+   *  the buffer.
+   * @throws IllegalArgumentException If it isn't possible to find the given 
index
+   *  in the current list (say, if no element index - 1 is set), or if setting
+   *  the extension will overflow the current list length (given by 
address@hidden
+   *  #length()}).
+   */
+  public void set (final int index, Extension e)
+  {
+    int length = length();
+    int n = 0;
+    int i;
+    for (i = 2; i < length && n < index; )
+      {
+        int len = buffer.getShort(i+2) & 0xFFFF;
+        i += len + 4;
+        n++;
+      }
+    if (n < index)
+      throw new IllegalArgumentException("nothing set at index " + (index-1)
+                                         + " or insufficient space");
+    if (i + e.length() + 2 > length)
+      throw new IllegalArgumentException("adding this element will exceed the "
+                                         + "list length");
+    buffer.putShort(i, (short) e.type().getValue());
+    buffer.putShort(i+2, (short) e.length());
+    ((ByteBuffer) buffer.duplicate().position(i+4)).put (e.value());
+    modCount++;
+  }
+  
+  /**
+   * Reserve space for an extension at index <i>i</i> in the list. In other
+   * words, this does the job of address@hidden #set(int, Extension)}, but 
does not
+   * copy the extension value to the underlying buffer.
+   * 
+   * @param index The index of the extension to reserve space for.
+   * @param t The type of the extension.
+   * @param eLength The number of bytes to reserve for this extension. The 
total
+   *  number of bytes used by this method is this length, plus four.
+   */
+  public void set (final int index, Extension.Type t, final int eLength)
+  {
+    int length = length ();
+    int n = 0;
+    int i;
+    for (i = 2; i < length && n < index; )
+      {
+        int len = buffer.getShort (i+2) & 0xFFFF;
+        i += len + 4;
+        n++;
+      }
+    if (n < index)
+      throw new IllegalArgumentException ("nothing set at index " + (index-1)
+                                          + " or insufficient space");
+    if (i + eLength + 2 > length)
+      throw new IllegalArgumentException ("adding this element will exceed the 
"
+                                          + "list length");
+    buffer.putShort(i, (short) t.getValue());
+    buffer.putShort(i+2, (short) eLength);
+    modCount++;
+  }
+  
+  /**
+   * Set the total length of this list, in bytes.
+   * 
+   * @param newLength The new list length.
+   */
+  public void setLength (final int newLength)
+  {
+    if (newLength < 0 || newLength > 65535)
+      throw new IllegalArgumentException ("invalid length");
+    buffer.putShort (0, (short) newLength);
+    modCount++;
+  }
+  
+  public Iterator<Extension> iterator()
+  {
+    return new ExtensionsIterator ();
+  }
+
+  public String toString ()
+  {
+    return toString (null);
+  }
+  
+  public String toString (final String prefix)
+  {
+    StringWriter str = new StringWriter ();
+    PrintWriter out = new PrintWriter (str);
+    if (prefix != null) out.print (prefix);
+    out.println ("ExtensionList {");
+    if (prefix != null) out.print (prefix);
+    out.print ("  length = ");
+    out.print (length ());
+    out.println (";");
+    String subprefix = "  ";
+    if (prefix != null)
+      subprefix = prefix + subprefix;
+    for (Extension e : this)
+      out.println (e.toString(subprefix));
+    if (prefix != null) out.print (prefix);
+    out.println ("};");
+    return str.toString();
+  }
+
+  /**
+   * List iterator interface to an extensions list.
+   * 
+   * @author address@hidden
+   */
+  public final class ExtensionsIterator implements ListIterator<Extension>
+  {
+    private final int modCount;
+    private int index;
+    private final int size;
+    
+    public ExtensionsIterator ()
+    {
+      this.modCount = ExtensionList.this.modCount;
+      index = 0;
+      size = size ();
+    }
+
+    public boolean hasNext()
+    {
+      return index < size;
+    }
+
+    public boolean hasPrevious()
+    {
+      return index > 0;
+    }
+
+    public Extension next() throws NoSuchElementException
+    {
+      if (modCount != ExtensionList.this.modCount)
+        throw new ConcurrentModificationException ();
+      if (!hasNext ())
+        throw new NoSuchElementException ();
+      return get (index++);
+    }
+
+    public Extension previous() throws NoSuchElementException
+    {
+      if (modCount != ExtensionList.this.modCount)
+        throw new ConcurrentModificationException ();
+      if (!hasPrevious ())
+        throw new NoSuchElementException ();
+      return get (--index);
+    }
+
+    public int nextIndex()
+    {
+      if (hasNext ())
+        return index + 1;
+      return index;
+    }
+
+    public int previousIndex()
+    {
+      if (hasPrevious ())
+        return index - 1;
+      return -1;
+    }
+
+    public void add(Extension e)
+    {
+      throw new UnsupportedOperationException ("cannot add items to this 
iterator");
+    }
+
+    public void remove()
+    {
+      throw new UnsupportedOperationException ("cannot remove items from this 
iterator");
+    }
+
+    public void set(Extension e)
+    {
+      ExtensionList.this.set (index, e);
+    }
+  }
+}

Index: jessie-tests/testExtensionsList.java
===================================================================
RCS file: jessie-tests/testExtensionsList.java
diff -N jessie-tests/testExtensionsList.java
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ jessie-tests/testExtensionsList.java        6 Jun 2006 01:01:20 -0000       
1.1.2.1
@@ -0,0 +1,64 @@
+import gnu.javax.net.ssl.provider.Extension;
+import gnu.javax.net.ssl.provider.ExtensionList;
+import gnu.javax.net.ssl.provider.Extension.Type;
+
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+
+class testExtensionList
+{
+  public static void main (String[] argv)
+  {
+    try
+      {
+        check ();
+      }
+    catch (Exception x)
+      {
+        System.out.println ("FAIL: caught exception " + x);
+        x.printStackTrace (System.err);
+      }
+  }
+  
+  static void check () throws Exception
+  {
+    ByteBuffer buf = ByteBuffer.allocate(4096);
+    ExtensionList list = new ExtensionList(buf);
+    
+    list.setLength (12);
+    // Max fragment length of 2^9-1
+    list.set (0, Extension.Type.MAX_FRAGMENT_LENGTH, 1); // 2 + 2 + 1
+    list.get (0).setValue (new byte[] { 1 });
+    // Zero-length server name.
+    list.set (1, Extension.Type.SERVER_NAME, 3); // 2 + 2 + 3
+    list.get(1).setValue(new byte[3]);
+    // This is a valid extension list now.
+    
+    if (list.length () == 12)
+      System.out.println ("PASS: length");
+    else
+      System.out.println ("FAIL: length");
+    
+    Extension e = list.get (0);
+    if (e.type() == Extension.Type.MAX_FRAGMENT_LENGTH)
+      System.out.println ("PASS: get(0).type()");
+    else
+      System.out.println ("FAIL: get(0).type()");
+    if (Arrays.equals (e.value(), new byte[] { 1 }))
+      System.out.println ("PASS: get(0).value()");
+    else
+      System.out.println ("FAIL: get(0).value()");
+    
+    e = list.get(1);
+    if (e.type () == Extension.Type.SERVER_NAME)
+      System.out.println ("PASS: get(1).type()");
+    else
+      System.out.println ("FAIL: get(1).type()");
+    if (Arrays.equals(e.value(), new byte[3]))
+      System.out.println ("PASS: get(1).value()");
+    else
+      System.out.println ("FAIL: get(1).value()");
+    
+    System.err.println (list);
+  }
+}
\ No newline at end of file




reply via email to

[Prev in Thread] Current Thread [Next in Thread]