summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaif S. Naffah <raif@swiftdsl.com.au>2006-06-09 11:49:53 +0000
committerRaif S. Naffah <raif@swiftdsl.com.au>2006-06-09 11:49:53 +0000
commitcd6642bb405aeebdc0ec9ec65b79acd6b76734d8 (patch)
treef9b454b1583020694290f099c1687ad66c39fab7
parentf5d4ac340b2b4677c83d3a717bd063f5ddeba54d (diff)
downloadclasspath-cd6642bb405aeebdc0ec9ec65b79acd6b76734d8.tar.gz
2006-06-09 Raif S. Naffah <raif@swiftdsl.com.au>
On behalf of Matthew Wringe <mwringe@redhat.com> * 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.
-rw-r--r--ChangeLog10
-rw-r--r--gnu/java/security/Registry.java3
-rw-r--r--gnu/javax/crypto/pad/ISO10126.java109
-rw-r--r--gnu/javax/crypto/pad/PadFactory.java41
4 files changed, 143 insertions, 20 deletions
diff --git a/ChangeLog b/ChangeLog
index 5642359da..8daf2dccf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
2006-06-09 Raif S. Naffah <raif@swiftdsl.com.au>
+ On behalf of Matthew Wringe <mwringe@redhat.com>
+ * 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.
+
+2006-06-09 Raif S. Naffah <raif@swiftdsl.com.au>
+
* gnu/javax/crypto/pad/BasePad.java (selfTest): Re-factored to allow more
flexible self-test by sub-classes.
(test1BlockSize): New method.
diff --git a/gnu/java/security/Registry.java b/gnu/java/security/Registry.java
index 0cb925135..9d8ceac8d 100644
--- a/gnu/java/security/Registry.java
+++ b/gnu/java/security/Registry.java
@@ -177,6 +177,9 @@ public interface Registry
/** TLSv1 padding scheme. */
String TLS1_PAD = "tls1";
+ /** ISO 10126-2 padding scheme. */
+ String ISO10126_PAD = "iso10126";
+
// Pseudo-random number generators..........................................
/** (Apparently) RC4 keystream PRNG. */
diff --git a/gnu/javax/crypto/pad/ISO10126.java b/gnu/javax/crypto/pad/ISO10126.java
new file mode 100644
index 000000000..8e8c59254
--- /dev/null
+++ b/gnu/javax/crypto/pad/ISO10126.java
@@ -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]);
+ }
+}
diff --git a/gnu/javax/crypto/pad/PadFactory.java b/gnu/javax/crypto/pad/PadFactory.java
index 913d69dcb..76ae934b6 100644
--- a/gnu/javax/crypto/pad/PadFactory.java
+++ b/gnu/javax/crypto/pad/PadFactory.java
@@ -49,12 +49,8 @@ import java.util.Set;
*/
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 @@ public class PadFactory implements Registry
{
result = new TLS1();
}
+ else if (pad.equals(ISO10126_PAD))
+ {
+ result = new ISO10126();
+ }
if (result != null && !result.selfTest())
{
@@ -114,24 +114,25 @@ public class PadFactory implements Registry
}
/**
- * <p>Returns a {@link java.util.Set} of names of padding algorithms
- * supported by this <i>Factory</i>.</p>
+ * Returns a {@link java.util.Set} of names of padding algorithms
+ * supported by this <i>Factory</i>.
*
* @return a {@link 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
- // -------------------------------------------------------------------------
}