hello all,

the attached patch --already committed on behalf of Matthew Wringe-- 
adds an implementation of the ISO-10126-2 padding scheme.

a new Mauve test to exercise block sizes from 2 to 256 was also added as 
gnu.testlet.gnu.javax.crypto.pad.TestOfISO10126.

2006-06-09  Raif S. Naffah  <[EMAIL PROTECTED]>

        On behalf of Matthew Wringe <[EMAIL PROTECTED]>
        * gnu/java/security/Registry.java (ISO10126_PAD): New constant.
        * gnu/javax/crypto/pad/ISO10126.java: New class.
        * gnu/javax/crypto/pad/PadFactory.java (names): New field.
        (getInstance): Added support for ISO-10126 scheme.
        (getNames): Likewise.
        Cache result for speed.


cheers;
rsn
Index: Registry.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/security/Registry.java,v
retrieving revision 1.5
diff -u -r1.5 Registry.java
--- Registry.java	22 Mar 2006 22:49:24 -0000	1.5
+++ Registry.java	9 Jun 2006 11:39:02 -0000
@@ -177,6 +177,9 @@
   /** TLSv1 padding scheme. */
   String TLS1_PAD = "tls1";
 
+  /** ISO 10126-2 padding scheme. */
+  String ISO10126_PAD = "iso10126";
+
   // Pseudo-random number generators..........................................
 
   /** (Apparently) RC4 keystream PRNG. */
Index: PadFactory.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/javax/crypto/pad/PadFactory.java,v
retrieving revision 1.2
diff -u -r1.2 PadFactory.java
--- PadFactory.java	22 Mar 2006 22:49:24 -0000	1.2
+++ PadFactory.java	9 Jun 2006 11:40:19 -0000
@@ -49,12 +49,8 @@
  */
 public class PadFactory implements Registry
 {
-
-  // Constants and variables
-  // -------------------------------------------------------------------------
-
-  // Constructor(s)
-  // -------------------------------------------------------------------------
+  /** Collection of padding algorithm names --cached for speed. */
+  private static Set names;
 
   /** Trivial constructor to enforce Singleton pattern. */
   private PadFactory()
@@ -104,6 +100,10 @@
       {
         result = new TLS1();
       }
+    else if (pad.equals(ISO10126_PAD))
+      {
+        result = new ISO10126();
+      }
 
     if (result != null && !result.selfTest())
       {
@@ -114,24 +114,25 @@
   }
 
   /**
-   * <p>Returns a [EMAIL PROTECTED] java.util.Set} of names of padding algorithms
-   * supported by this <i>Factory</i>.</p>
+   * Returns a [EMAIL PROTECTED] java.util.Set} of names of padding algorithms
+   * supported by this <i>Factory</i>.
    *
    * @return a [EMAIL PROTECTED] Set} of padding algorithm names (Strings).
    */
   public static final Set getNames()
   {
-    HashSet hs = new HashSet();
-    hs.add(PKCS5_PAD);
-    hs.add(PKCS7_PAD);
-    hs.add(TBC_PAD);
-    hs.add(EME_PKCS1_V1_5_PAD);
-    hs.add(SSL3_PAD);
-    hs.add(TLS1_PAD);
-
-    return Collections.unmodifiableSet(hs);
+    if (names == null)
+      {
+        HashSet hs = new HashSet();
+        hs.add(PKCS5_PAD);
+        hs.add(PKCS7_PAD);
+        hs.add(TBC_PAD);
+        hs.add(EME_PKCS1_V1_5_PAD);
+        hs.add(SSL3_PAD);
+        hs.add(TLS1_PAD);
+        hs.add(ISO10126_PAD);
+        names = Collections.unmodifiableSet(hs);
+      }
+    return names;
   }
-
-  // Instance methods
-  // -------------------------------------------------------------------------
 }
Index: ISO10126.java
===================================================================
RCS file: ISO10126.java
diff -N ISO10126.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ISO10126.java	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,109 @@
+/* ISO10126.java -- An implementation of the ISO 10126-2 padding scheme
+   Copyright (C) 2006  Free Software Foundation, Inc.
+
+This file is a part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or (at
+your option) any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+USA
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version.  */
+
+
+package gnu.javax.crypto.pad;
+
+import gnu.java.security.Registry;
+import gnu.java.security.util.PRNG;
+
+/**
+ * The implementation of the ISO 10126-2 padding algorithm.
+ * <p>
+ * The last byte of the padding block is the number of padding bytes, all other
+ * padding bytes are random.
+ * <p>
+ * References:
+ * <ol>
+ *    <li><a href="http://www.w3.org/TR/xmlenc-core/";>XML Encryption Syntax and
+ *    Processing</a> Section "5.2 Block Encryption Algorithms"; "Padding".</li>
+ * </ol>
+ */
+public final class ISO10126
+    extends BasePad
+{
+  /** Used to generate random numbers for padding bytes. */
+  private PRNG prng;
+
+  ISO10126()
+  {
+    super(Registry.ISO10126_PAD);
+    prng = PRNG.getInstance();
+  }
+
+  public void setup()
+  {
+    // Nothing to do here
+  }
+
+  public byte[] pad(byte[] in, int offset, int length)
+  {
+    int padLength = blockSize - (length % blockSize);
+    final byte[] pad = new byte[padLength];
+
+    // generate random numbers for the padding bytes except for the last byte
+    prng.nextBytes(pad, 0, padLength - 1);
+    // the last byte contains the number of padding bytes
+    pad[padLength - 1] = (byte) padLength;
+
+    return pad;
+  }
+
+  public int unpad(byte[] in, int offset, int length)
+      throws WrongPaddingException
+  {
+    // the last byte contains the number of padding bytes
+    int padLength = in[offset + length - 1] & 0xFF;
+    if (padLength > length)
+      throw new WrongPaddingException();
+
+    return padLength;
+  }
+
+  /**
+   * The default self-test in the super-class would take too long to finish
+   * with this type of padder --due to the large amount of random data needed.
+   * We override the default test and replace it with a simple one for a 16-byte
+   * block-size (default AES block-size). The Mauve test TestOfISO10126 will
+   * exercise all block-sizes that the default self-test uses for the other
+   * padders.
+   */
+  public boolean selfTest()
+  {
+    return test1BlockSize(16, new byte[1024]);
+  }
+}

Reply via email to