aboutsummaryrefslogtreecommitdiff
path: root/libjava/classpath/gnu/java/security/sig
diff options
context:
space:
mode:
authorAndrew Haley <aph@redhat.com>2016-09-30 16:24:48 +0000
committerAndrew Haley <aph@gcc.gnu.org>2016-09-30 16:24:48 +0000
commit07b78716af6a9d7c9fd1e94d9baf94a52c873947 (patch)
tree3f22b3241c513ad168c8353805614ae1249410f4 /libjava/classpath/gnu/java/security/sig
parenteae993948bae8b788c53772bcb9217c063716f93 (diff)
downloadgcc-07b78716af6a9d7c9fd1e94d9baf94a52c873947.zip
gcc-07b78716af6a9d7c9fd1e94d9baf94a52c873947.tar.gz
gcc-07b78716af6a9d7c9fd1e94d9baf94a52c873947.tar.bz2
Makefile.def: Remove libjava.
2016-09-30 Andrew Haley <aph@redhat.com> * Makefile.def: Remove libjava. * Makefile.tpl: Likewise. * Makefile.in: Regenerate. * configure.ac: Likewise. * configure: Likewise. * gcc/java: Remove. * libjava: Likewise. From-SVN: r240662
Diffstat (limited to 'libjava/classpath/gnu/java/security/sig')
-rw-r--r--libjava/classpath/gnu/java/security/sig/BaseSignature.java219
-rw-r--r--libjava/classpath/gnu/java/security/sig/ISignature.java160
-rw-r--r--libjava/classpath/gnu/java/security/sig/ISignatureCodec.java59
-rw-r--r--libjava/classpath/gnu/java/security/sig/SignatureCodecFactory.java226
-rw-r--r--libjava/classpath/gnu/java/security/sig/SignatureFactory.java101
-rw-r--r--libjava/classpath/gnu/java/security/sig/dss/DSSSignature.java275
-rw-r--r--libjava/classpath/gnu/java/security/sig/dss/DSSSignatureRawCodec.java164
-rw-r--r--libjava/classpath/gnu/java/security/sig/dss/DSSSignatureX509Codec.java193
-rw-r--r--libjava/classpath/gnu/java/security/sig/rsa/EME_PKCS1_V1_5.java274
-rw-r--r--libjava/classpath/gnu/java/security/sig/rsa/EMSA_PKCS1_V1_5.java243
-rw-r--r--libjava/classpath/gnu/java/security/sig/rsa/EMSA_PSS.java372
-rw-r--r--libjava/classpath/gnu/java/security/sig/rsa/RSA.java324
-rw-r--r--libjava/classpath/gnu/java/security/sig/rsa/RSAPKCS1V1_5Signature.java224
-rw-r--r--libjava/classpath/gnu/java/security/sig/rsa/RSAPKCS1V1_5SignatureRawCodec.java153
-rw-r--r--libjava/classpath/gnu/java/security/sig/rsa/RSAPKCS1V1_5SignatureX509Codec.java128
-rw-r--r--libjava/classpath/gnu/java/security/sig/rsa/RSAPSSSignature.java256
-rw-r--r--libjava/classpath/gnu/java/security/sig/rsa/RSAPSSSignatureRawCodec.java134
-rw-r--r--libjava/classpath/gnu/java/security/sig/rsa/RSASignatureFactory.java176
18 files changed, 0 insertions, 3681 deletions
diff --git a/libjava/classpath/gnu/java/security/sig/BaseSignature.java b/libjava/classpath/gnu/java/security/sig/BaseSignature.java
deleted file mode 100644
index ef4d87f..0000000
--- a/libjava/classpath/gnu/java/security/sig/BaseSignature.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/* BaseSignature.java --
- Copyright (C) 2001, 2002, 2003, 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.java.security.sig;
-
-import gnu.java.security.hash.IMessageDigest;
-import gnu.java.security.prng.IRandom;
-import gnu.java.security.prng.LimitReachedException;
-import gnu.java.security.util.PRNG;
-
-import java.security.PrivateKey;
-import java.security.PublicKey;
-import java.util.Map;
-import java.util.Random;
-
-/**
- * A base abstract class to facilitate implementations of concrete Signatures.
- */
-public abstract class BaseSignature
- implements ISignature
-{
- /** The canonical name of this signature scheme. */
- protected String schemeName;
-
- /** The underlying message digest instance for this signature scheme. */
- protected IMessageDigest md;
-
- /** The public key to use when verifying signatures. */
- protected PublicKey publicKey;
-
- /** The private key to use when generating signatures (signing). */
- protected PrivateKey privateKey;
-
- /** The optional {@link Random} instance to use. */
- private Random rnd;
-
- /** The optional {@link IRandom} instance to use. */
- private IRandom irnd;
-
- /** Our default source of randomness. */
- private PRNG prng = null;
-
- /**
- * Trivial constructor.
- *
- * @param schemeName the name of this signature scheme.
- * @param md the underlying instance of the message digest algorithm.
- * @throws IllegalArgumentException if the designated hash instance is
- * <code>null</code>.
- */
- protected BaseSignature(String schemeName, IMessageDigest md)
- {
- super();
-
- this.schemeName = schemeName;
- if (md == null)
- throw new IllegalArgumentException("Message digest MUST NOT be null");
-
- this.md = md;
- }
-
- public String name()
- {
- return schemeName + "-" + md.name();
- }
-
- public void setupVerify(Map attributes) throws IllegalArgumentException
- {
- setup(attributes);
- // do we have a public key?
- PublicKey key = (PublicKey) attributes.get(VERIFIER_KEY);
- if (key != null)
- setupForVerification(key);
- }
-
- public void setupSign(Map attributes) throws IllegalArgumentException
- {
- setup(attributes);
- // do we have a private key?
- PrivateKey key = (PrivateKey) attributes.get(SIGNER_KEY);
- if (key != null)
- setupForSigning(key);
- }
-
- public void update(byte b)
- {
- if (md == null)
- throw new IllegalStateException();
-
- md.update(b);
- }
-
- public void update(byte[] b, int off, int len)
- {
- if (md == null)
- throw new IllegalStateException();
-
- md.update(b, off, len);
- }
-
- public Object sign()
- {
- if (md == null || privateKey == null)
- throw new IllegalStateException();
-
- return generateSignature();
- }
-
- public boolean verify(Object sig)
- {
- if (md == null || publicKey == null)
- throw new IllegalStateException();
-
- return verifySignature(sig);
- }
-
- public abstract Object clone();
-
- protected abstract void setupForVerification(PublicKey key)
- throws IllegalArgumentException;
-
- protected abstract void setupForSigning(PrivateKey key)
- throws IllegalArgumentException;
-
- protected abstract Object generateSignature() throws IllegalStateException;
-
- protected abstract boolean verifySignature(Object signature)
- throws IllegalStateException;
-
- /** Initialises the internal fields of this instance. */
- protected void init()
- {
- md.reset();
- rnd = null;
- irnd = null;
- publicKey = null;
- privateKey = null;
- }
-
- /**
- * Fills the designated byte array with random data.
- *
- * @param buffer the byte array to fill with random data.
- */
- protected void nextRandomBytes(byte[] buffer)
- {
- if (rnd != null)
- rnd.nextBytes(buffer);
- else if (irnd != null)
- try
- {
- irnd.nextBytes(buffer, 0, buffer.length);
- }
- catch (IllegalStateException x)
- {
- throw new RuntimeException("nextRandomBytes(): " + x);
- }
- catch (LimitReachedException x)
- {
- throw new RuntimeException("nextRandomBytes(): " + x);
- }
- else
- getDefaultPRNG().nextBytes(buffer);
- }
-
- private void setup(Map attributes)
- {
- init();
- // do we have a Random or SecureRandom, or should we use our own?
- Object obj = attributes.get(SOURCE_OF_RANDOMNESS);
- if (obj instanceof Random)
- rnd = (Random) obj;
- else if (obj instanceof IRandom)
- irnd = (IRandom) obj;
- }
-
- private PRNG getDefaultPRNG()
- {
- if (prng == null)
- prng = PRNG.getInstance();
-
- return prng;
- }
-}
diff --git a/libjava/classpath/gnu/java/security/sig/ISignature.java b/libjava/classpath/gnu/java/security/sig/ISignature.java
deleted file mode 100644
index be98f9a..0000000
--- a/libjava/classpath/gnu/java/security/sig/ISignature.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/* ISignature.java --
- Copyright (C) 2001, 2002, 2003, 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.java.security.sig;
-
-import java.util.Map;
-
-/**
- * The visible methods of every signature-with-appendix scheme.
- * <p>
- * The Handbook of Applied Cryptography (HAC), by A. Menezes &amp; al. states:
- * "Digital signature schemes which require the message as input to the
- * verification algorithm are called <i>digital signature schemes with appendix</i>.
- * ... They rely on cryptographic hash functions rather than customised
- * redundancy functions, and are less prone to existential forgery attacks."
- * <p>
- * References:
- * <ol>
- * <li><a href="http://www.cacr.math.uwaterloo.ca/hac/">Handbook of Applied
- * Cryptography</a>, Alfred J. Menezes, Paul C. van Oorschot and Scott A.
- * Vanstone. Section 11.2.2 Digital signature schemes with appendix.</li>
- * </ol>
- */
-public interface ISignature
- extends Cloneable
-{
- /** Property name of the verifier's public key. */
- public static final String VERIFIER_KEY = "gnu.crypto.sig.public.key";
-
- /** Property name of the signer's private key. */
- public static final String SIGNER_KEY = "gnu.crypto.sig.private.key";
-
- /**
- * Property name of an optional {@link java.security.SecureRandom},
- * {@link java.util.Random}, or {@link gnu.java.security.prng.IRandom}
- * instance to use. The default is to use a classloader singleton from
- * {@link gnu.java.security.util.PRNG}.
- */
- public static final String SOURCE_OF_RANDOMNESS = "gnu.crypto.sig.prng";
-
- /**
- * Returns the canonical name of this signature scheme.
- *
- * @return the canonical name of this instance.
- */
- String name();
-
- /**
- * Initialises this instance for signature verification.
- *
- * @param attributes the attributes to use for setting up this instance.
- * @throws IllegalArgumentException if the designated public key is not
- * appropriate for this signature scheme.
- * @see #SOURCE_OF_RANDOMNESS
- * @see #VERIFIER_KEY
- */
- void setupVerify(Map attributes) throws IllegalArgumentException;
-
- /**
- * Initialises this instance for signature generation.
- *
- * @param attributes the attributes to use for setting up this instance.
- * @throws IllegalArgumentException if the designated private key is not
- * appropriate for this signature scheme.
- * @see #SOURCE_OF_RANDOMNESS
- * @see #SIGNER_KEY
- */
- void setupSign(Map attributes) throws IllegalArgumentException;
-
- /**
- * Digests one byte of a message for signing or verification purposes.
- *
- * @param b the message byte to digest.
- * @throws IllegalStateException if this instance was not setup for signature
- * generation/verification.
- */
- void update(byte b) throws IllegalStateException;
-
- /**
- * Digests a sequence of bytes from a message for signing or verification
- * purposes.
- *
- * @param buffer the byte sequence to consider.
- * @param offset the byte poisition in <code>buffer</code> of the first byte
- * to consider.
- * @param length the number of bytes in <code>buffer</code> starting from
- * the byte at index <code>offset</code> to digest.
- * @throws IllegalStateException if this instance was not setup for signature
- * generation/verification.
- */
- void update(byte[] buffer, int offset, int length)
- throws IllegalStateException;
-
- /**
- * Terminates a signature generation phase by digesting and processing the
- * context of the underlying message digest algorithm instance.
- *
- * @return a {@link Object} representing the native output of the signature
- * scheme implementation.
- * @throws IllegalStateException if this instance was not setup for signature
- * generation.
- */
- Object sign() throws IllegalStateException;
-
- /**
- * Terminates a signature verification phase by digesting and processing the
- * context of the underlying message digest algorithm instance.
- *
- * @param signature a native signature object previously generated by an
- * invocation of the <code>sign()</code> method.
- * @return <code>true</code> iff the outpout of the verification phase
- * confirms that the designated signature object has been generated
- * using the corresponding public key of the recepient.
- * @throws IllegalStateException if this instance was not setup for signature
- * verification.
- */
- boolean verify(Object signature) throws IllegalStateException;
-
- /**
- * Returns a clone copy of this instance.
- *
- * @return a clone copy of this instance.
- */
- Object clone();
-}
diff --git a/libjava/classpath/gnu/java/security/sig/ISignatureCodec.java b/libjava/classpath/gnu/java/security/sig/ISignatureCodec.java
deleted file mode 100644
index f8b1473..0000000
--- a/libjava/classpath/gnu/java/security/sig/ISignatureCodec.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/* ISignatureCodec.java --
- Copyright (C) 2001, 2002, 2003, 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.java.security.sig;
-
-import gnu.java.security.Registry;
-
-/**
- * The visible methods of an object that knows how to encode and decode
- * cryptographic signatures. Codecs are useful for (a) externalising signature
- * output data for storage and on-the-wire transmission, as well as (b) re-
- * creating their internal Java representation from external sources.
- */
-public interface ISignatureCodec
-{
- /** Constant identifying the <i>Raw</i> encoding format. */
- int RAW_FORMAT = Registry.RAW_ENCODING_ID;
-
- int getFormatID();
-
- byte[] encodeSignature(Object signature);
-
- Object decodeSignature(byte[] input);
-}
diff --git a/libjava/classpath/gnu/java/security/sig/SignatureCodecFactory.java b/libjava/classpath/gnu/java/security/sig/SignatureCodecFactory.java
deleted file mode 100644
index 0026ad1..0000000
--- a/libjava/classpath/gnu/java/security/sig/SignatureCodecFactory.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/* SignatureCodecFactory.java -- Factory to instantiate Signature codecs
- Copyright (C) 2006 Free Software Foundation, Inc.
-
-This file is 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, 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; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 51 Franklin Street, 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.java.security.sig;
-
-import gnu.java.security.Registry;
-import gnu.java.security.hash.HashFactory;
-import gnu.java.security.sig.dss.DSSSignatureRawCodec;
-import gnu.java.security.sig.dss.DSSSignatureX509Codec;
-import gnu.java.security.sig.rsa.RSAPKCS1V1_5SignatureRawCodec;
-import gnu.java.security.sig.rsa.RSAPKCS1V1_5SignatureX509Codec;
-import gnu.java.security.sig.rsa.RSAPSSSignatureRawCodec;
-import gnu.java.security.util.FormatUtil;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * A <i>Factory</i> class to instantiate Signature codecs.
- */
-public class SignatureCodecFactory
-{
- private static Set names;
-
- /** Trivial constructor to enforce Singleton pattern. */
- private SignatureCodecFactory()
- {
- super();
- }
-
- /**
- * Returns the appropriate codec given a composed signature algorithm and an
- * encoding format. A composed name is formed by the concatenation of the
- * canonical signature algorithm name, the forward slash character
- * <code>/</code> and the canonical name of the encoding format.
- * <p>
- * When the encoding format name is missing, the Raw encoding format is
- * assumed. When this is the case the trailing forward slash is discarded from
- * the name.
- *
- * @param name the case-insensitive, possibly composed, signature codec name.
- * @return an instance of the signaturecodec, or <code>null</code> if none
- * found.
- */
- public static ISignatureCodec getInstance(String name)
- {
- if (name == null)
- return null;
-
- name = name.trim();
- if (name.length() == 0)
- return null;
-
- if (name.startsWith("/"))
- return null;
-
- if (name.endsWith("/"))
- return getInstance(name.substring(0, name.length() - 1),
- Registry.RAW_ENCODING_ID);
-
- int i = name.indexOf("/");
- if (i == - 1)
- return getInstance(name, Registry.RAW_ENCODING_ID);
-
- String sigName = name.substring(0, i);
- String formatName = name.substring(i + 1);
- return getInstance(sigName, formatName);
- }
-
- /**
- * Returns an instance of a signature codec given the canonical name of the
- * signature algorithm, and that of the encoding format.
- *
- * @param name the case-insensitive signature algorithm name.
- * @param format the name of the format to use when encodigng/decoding
- * signatures generated by the named algorithm.
- * @return an instance of the signature codec, or <code>null</code> if none
- * found.
- */
- public static ISignatureCodec getInstance(String name, String format)
- {
- int formatID = FormatUtil.getFormatID(format);
- if (formatID == 0)
- return null;
-
- return getInstance(name, formatID);
- }
-
- /**
- * Returns an instance of a signature codec given the canonical name of the
- * signature algorithm, and the identifier of the format to use when
- * encoding/decoding signatures generated by that algorithm.
- *
- * @param name the case-insensitive signature algorithm name.
- * @param formatID the identifier of the format to use when encoding /
- * decoding signatures generated by the designated algorithm.
- * @return an instance of the signature codec, or <code>null</code> if none
- * found.
- */
- public static ISignatureCodec getInstance(String name, int formatID)
- {
- if (name == null)
- return null;
-
- name = name.trim();
- switch (formatID)
- {
- case Registry.RAW_ENCODING_ID:
- return getRawCodec(name);
- case Registry.X509_ENCODING_ID:
- return getX509Codec(name);
- }
-
- return null;
- }
-
- /**
- * Returns a {@link Set} of supported signature codec names.
- *
- * @return a {@link Set} of the names of supported signature codec (Strings).
- */
- public static synchronized final Set getNames()
- {
- if (names == null)
- {
- HashSet hs = new HashSet();
- hs.add(Registry.DSS_SIG + "/" + Registry.RAW_ENCODING_SHORT_NAME);
- hs.add(Registry.DSS_SIG + "/" + Registry.X509_ENCODING_SORT_NAME);
- Set hashNames = HashFactory.getNames();
- for (Iterator it = hashNames.iterator(); it.hasNext();)
- {
- String mdName = (String) it.next();
- String name = Registry.RSA_PKCS1_V1_5_SIG + "-" + mdName;
- hs.add(name + "/" + Registry.RAW_ENCODING_SHORT_NAME);
- hs.add(name + "/" + Registry.X509_ENCODING_SORT_NAME);
- name = Registry.RSA_PSS_SIG + "-" + mdName;
- hs.add(name + "/" + Registry.RAW_ENCODING_SHORT_NAME);
- }
-
- names = Collections.unmodifiableSet(hs);
- }
-
- return names;
- }
-
- /**
- * @param name the trimmed name of a signature algorithm.
- * @return a Raw format codec for the designated signature algorithm, or
- * <code>null</code> if none exists.
- */
- private static ISignatureCodec getRawCodec(String name)
- {
- ISignatureCodec result = null;
- if (name.equalsIgnoreCase(Registry.DSA_SIG)
- || name.equalsIgnoreCase(Registry.DSS_SIG))
- result = new DSSSignatureRawCodec();
- else
- {
- name = name.toLowerCase();
- if (name.startsWith(Registry.RSA_PKCS1_V1_5_SIG))
- result = new RSAPKCS1V1_5SignatureRawCodec();
- else if (name.startsWith(Registry.RSA_PSS_SIG))
- result = new RSAPSSSignatureRawCodec();
- }
-
- return result;
- }
-
- /**
- * @param name the trimmed name of a signature algorithm.
- * @return a X.509 format codec for the designated signature algorithm, or
- * <code>null</code> if none exists.
- */
- private static ISignatureCodec getX509Codec(String name)
- {
- ISignatureCodec result = null;
- if (name.equalsIgnoreCase(Registry.DSA_SIG)
- || name.equalsIgnoreCase(Registry.DSS_SIG))
- result = new DSSSignatureX509Codec();
- else
- {
- name = name.toLowerCase();
- if (name.startsWith(Registry.RSA_PKCS1_V1_5_SIG))
- result = new RSAPKCS1V1_5SignatureX509Codec();
- }
-
- return result;
- }
-}
diff --git a/libjava/classpath/gnu/java/security/sig/SignatureFactory.java b/libjava/classpath/gnu/java/security/sig/SignatureFactory.java
deleted file mode 100644
index 6cdaf65..0000000
--- a/libjava/classpath/gnu/java/security/sig/SignatureFactory.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/* SignatureFactory.java --
- Copyright (C) 2001, 2002, 2003, 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.java.security.sig;
-
-import gnu.java.security.Registry;
-import gnu.java.security.sig.dss.DSSSignature;
-import gnu.java.security.sig.rsa.RSASignatureFactory;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * A Factory to instantiate signature-with-appendix handlers.
- */
-public class SignatureFactory
-{
- private static Set names;
-
- /** Trivial constructor to enforce Singleton pattern. */
- private SignatureFactory()
- {
- super();
- }
-
- /**
- * Returns an instance of a signature-with-appendix scheme given its name.
- *
- * @param ssa the case-insensitive signature-with-appendix scheme name.
- * @return an instance of the scheme, or <code>null</code> if none found.
- */
- public static final ISignature getInstance(String ssa)
- {
- if (ssa == null)
- return null;
-
- ssa = ssa.trim();
- ssa = ssa.toLowerCase();
- ISignature result = null;
- if (ssa.equalsIgnoreCase(Registry.DSA_SIG) || ssa.equals(Registry.DSS_SIG))
- result = new DSSSignature();
- else if (ssa.startsWith(Registry.RSA_SIG_PREFIX))
- result = RSASignatureFactory.getInstance(ssa);
-
- return result;
- }
-
- /**
- * Returns a {@link Set} of signature-with-appendix scheme names supported by
- * this <i>Factory</i>.
- *
- * @return a {@link Set} of signature-with-appendix scheme names (Strings).
- */
- public static synchronized final Set getNames()
- {
- if (names == null)
- {
- HashSet hs = new HashSet();
- hs.add(Registry.DSS_SIG);
- hs.addAll(RSASignatureFactory.getNames());
- names = Collections.unmodifiableSet(hs);
- }
- return names;
- }
-}
diff --git a/libjava/classpath/gnu/java/security/sig/dss/DSSSignature.java b/libjava/classpath/gnu/java/security/sig/dss/DSSSignature.java
deleted file mode 100644
index 024521b..0000000
--- a/libjava/classpath/gnu/java/security/sig/dss/DSSSignature.java
+++ /dev/null
@@ -1,275 +0,0 @@
-/* DSSSignature.java --
- Copyright (C) 2001, 2002, 2003, 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.java.security.sig.dss;
-
-import gnu.java.security.Registry;
-import gnu.java.security.hash.IMessageDigest;
-import gnu.java.security.hash.Sha160;
-import gnu.java.security.prng.IRandom;
-import gnu.java.security.sig.BaseSignature;
-import gnu.java.security.sig.ISignature;
-
-import java.math.BigInteger;
-import java.security.PrivateKey;
-import java.security.PublicKey;
-import java.security.interfaces.DSAPrivateKey;
-import java.security.interfaces.DSAPublicKey;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Random;
-
-/**
- * The DSS (Digital Signature Standard) algorithm makes use of the following
- * parameters:
- * <ol>
- * <li>p: A prime modulus, where
- * <code>2<sup>L-1</sup> &lt; p &lt; 2<sup>L</sup> </code> for <code>512 &lt;= L
- * &lt;= 1024</code> and <code>L</code> a multiple of <code>64</code>.</li>
- * <li>q: A prime divisor of <code>p - 1</code>, where <code>2<sup>159</sup>
- * &lt; q &lt; 2<sup>160</sup></code>.</li>
- * <li>g: Where <code>g = h<sup>(p-1)</sup>/q mod p</code>, where
- * <code>h</code> is any integer with <code>1 &lt; h &lt; p - 1</code> such
- * that <code>h<sup> (p-1)</sup>/q mod p > 1</code> (<code>g</code> has order
- * <code>q mod p</code>).</li>
- * <li>x: A randomly or pseudorandomly generated integer with <code>0 &lt; x
- * &lt; q</code>.</li>
- * <li>y: <code>y = g<sup>x</sup> mod p</code>.</li>
- * <li>k: A randomly or pseudorandomly generated integer with <code>0 &lt; k
- * &lt; q</code>.</li>
- * </ol>
- * <p>
- * The integers <code>p</code>, <code>q</code>, and <code>g</code> can be
- * public and can be common to a group of users. A user's private and public
- * keys are <code>x</code> and <code>y</code>, respectively. They are
- * normally fixed for a period of time. Parameters <code>x</code> and
- * <code>k</code> are used for signature generation only, and must be kept
- * secret. Parameter <code>k</code> must be regenerated for each signature.
- * <p>
- * The signature of a message <code>M</code> is the pair of numbers
- * <code>r</code> and <code>s</code> computed according to the equations below:
- * <ul>
- * <li><code>r = (g<sup>k</sup> mod p) mod q</code> and</li>
- * <li><code>s = (k<sup>-1</sup>(SHA(M) + xr)) mod q</code>.</li>
- * </ul>
- * <p>
- * In the above, <code>k<sup>-1</sup></code> is the multiplicative inverse of
- * <code>k</code>, <code>mod q</code>; i.e., <code>(k<sup>-1</sup> k) mod q =
- * 1</code> and <code>0 &lt; k-1 &lt; q</code>. The value of <code>SHA(M)</code>
- * is a 160-bit string output by the Secure Hash Algorithm specified in FIPS
- * 180. For use in computing <code>s</code>, this string must be converted to
- * an integer.
- * <p>
- * As an option, one may wish to check if <code>r == 0</code> or <code>s == 0
- * </code>.
- * If either <code>r == 0</code> or <code>s == 0</code>, a new value of
- * <code>k</code> should be generated and the signature should be recalculated
- * (it is extremely unlikely that <code>r == 0</code> or <code>s == 0</code> if
- * signatures are generated properly).
- * <p>
- * The signature is transmitted along with the message to the verifier.
- * <p>
- * References:
- * <ol>
- * <li><a href="http://www.itl.nist.gov/fipspubs/fip186.htm">Digital Signature
- * Standard (DSS)</a>, Federal Information Processing Standards Publication
- * 186. National Institute of Standards and Technology.</li>
- * </ol>
- */
-public class DSSSignature
- extends BaseSignature
-{
- /** Trivial 0-arguments constructor. */
- public DSSSignature()
- {
- super(Registry.DSS_SIG, new Sha160());
- }
-
- /** Private constructor for cloning purposes. */
- private DSSSignature(DSSSignature that)
- {
- this();
-
- this.publicKey = that.publicKey;
- this.privateKey = that.privateKey;
- this.md = (IMessageDigest) that.md.clone();
- }
-
- public static final BigInteger[] sign(final DSAPrivateKey k, final byte[] h)
- {
- final DSSSignature sig = new DSSSignature();
- final Map attributes = new HashMap();
- attributes.put(ISignature.SIGNER_KEY, k);
- sig.setupSign(attributes);
- return sig.computeRS(h);
- }
-
- public static final BigInteger[] sign(final DSAPrivateKey k, final byte[] h,
- Random rnd)
- {
- final DSSSignature sig = new DSSSignature();
- final Map attributes = new HashMap();
- attributes.put(ISignature.SIGNER_KEY, k);
- if (rnd != null)
- attributes.put(ISignature.SOURCE_OF_RANDOMNESS, rnd);
-
- sig.setupSign(attributes);
- return sig.computeRS(h);
- }
-
- public static final BigInteger[] sign(final DSAPrivateKey k, final byte[] h,
- IRandom irnd)
- {
- final DSSSignature sig = new DSSSignature();
- final Map attributes = new HashMap();
- attributes.put(ISignature.SIGNER_KEY, k);
- if (irnd != null)
- attributes.put(ISignature.SOURCE_OF_RANDOMNESS, irnd);
-
- sig.setupSign(attributes);
- return sig.computeRS(h);
- }
-
- public static final boolean verify(final DSAPublicKey k, final byte[] h,
- final BigInteger[] rs)
- {
- final DSSSignature sig = new DSSSignature();
- final Map attributes = new HashMap();
- attributes.put(ISignature.VERIFIER_KEY, k);
- sig.setupVerify(attributes);
- return sig.checkRS(rs, h);
- }
-
- public Object clone()
- {
- return new DSSSignature(this);
- }
-
- protected void setupForVerification(PublicKey k)
- throws IllegalArgumentException
- {
- if (! (k instanceof DSAPublicKey))
- throw new IllegalArgumentException();
-
- this.publicKey = k;
- }
-
- protected void setupForSigning(PrivateKey k) throws IllegalArgumentException
- {
- if (! (k instanceof DSAPrivateKey))
- throw new IllegalArgumentException();
-
- this.privateKey = k;
- }
-
- protected Object generateSignature() throws IllegalStateException
- {
- final BigInteger[] rs = computeRS(md.digest());
- return encodeSignature(rs[0], rs[1]);
- }
-
- protected boolean verifySignature(Object sig) throws IllegalStateException
- {
- final BigInteger[] rs = decodeSignature(sig);
- return checkRS(rs, md.digest());
- }
-
- /**
- * Returns the output of a signature generation phase.
- *
- * @return an object encapsulating the DSS signature pair <code>r</code> and
- * <code>s</code>.
- */
- private Object encodeSignature(BigInteger r, BigInteger s)
- {
- return new BigInteger[] { r, s };
- }
-
- /**
- * Returns the output of a previously generated signature object as a pair of
- * {@link java.math.BigInteger}.
- *
- * @return the DSS signature pair <code>r</code> and <code>s</code>.
- */
- private BigInteger[] decodeSignature(Object signature)
- {
- return (BigInteger[]) signature;
- }
-
- private BigInteger[] computeRS(final byte[] digestBytes)
- {
- final BigInteger p = ((DSAPrivateKey) privateKey).getParams().getP();
- final BigInteger q = ((DSAPrivateKey) privateKey).getParams().getQ();
- final BigInteger g = ((DSAPrivateKey) privateKey).getParams().getG();
- final BigInteger x = ((DSAPrivateKey) privateKey).getX();
- final BigInteger m = new BigInteger(1, digestBytes);
- BigInteger k, r, s;
- final byte[] kb = new byte[20]; // we'll use 159 bits only
- while (true)
- {
- this.nextRandomBytes(kb);
- k = new BigInteger(1, kb);
- k.clearBit(159);
- r = g.modPow(k, p).mod(q);
- if (r.equals(BigInteger.ZERO))
- continue;
-
- s = m.add(x.multiply(r)).multiply(k.modInverse(q)).mod(q);
- if (s.equals(BigInteger.ZERO))
- continue;
-
- break;
- }
- return new BigInteger[] { r, s };
- }
-
- private boolean checkRS(final BigInteger[] rs, final byte[] digestBytes)
- {
- final BigInteger r = rs[0];
- final BigInteger s = rs[1];
- final BigInteger g = ((DSAPublicKey) publicKey).getParams().getG();
- final BigInteger p = ((DSAPublicKey) publicKey).getParams().getP();
- final BigInteger q = ((DSAPublicKey) publicKey).getParams().getQ();
- final BigInteger y = ((DSAPublicKey) publicKey).getY();
- final BigInteger w = s.modInverse(q);
- final BigInteger u1 = w.multiply(new BigInteger(1, digestBytes)).mod(q);
- final BigInteger u2 = r.multiply(w).mod(q);
- final BigInteger v = g.modPow(u1, p).multiply(y.modPow(u2, p)).mod(p).mod(q);
- return v.equals(r);
- }
-}
diff --git a/libjava/classpath/gnu/java/security/sig/dss/DSSSignatureRawCodec.java b/libjava/classpath/gnu/java/security/sig/dss/DSSSignatureRawCodec.java
deleted file mode 100644
index 169f84b..0000000
--- a/libjava/classpath/gnu/java/security/sig/dss/DSSSignatureRawCodec.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/* DSSSignatureRawCodec.java --
- Copyright (C) 2001, 2002, 2003, 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.java.security.sig.dss;
-
-import gnu.java.security.Registry;
-import gnu.java.security.sig.ISignatureCodec;
-
-import java.io.ByteArrayOutputStream;
-import java.math.BigInteger;
-
-/**
- * An object that implements the {@link ISignatureCodec} operations for the
- * <i>Raw</i> format to use with DSS signatures.
- */
-public class DSSSignatureRawCodec
- implements ISignatureCodec
-{
- public int getFormatID()
- {
- return RAW_FORMAT;
- }
-
- /**
- * Returns the encoded form of the designated DSS (Digital Signature Standard)
- * signature object according to the <i>Raw</i> format supported by this
- * library.
- * <p>
- * The <i>Raw</i> format for a DSA signature, in this implementation, is a
- * byte sequence consisting of the following:
- * <ol>
- * <li>4-byte magic consisting of the value of the literal
- * {@link Registry#MAGIC_RAW_DSS_SIGNATURE},</li>
- * <li>1-byte version consisting of the constant: 0x01,</li>
- * <li>4-byte count of following bytes representing the DSS parameter
- * <code>r</code> in internet order,</li>
- * <li>n-bytes representation of a {@link BigInteger} obtained by invoking
- * the <code>toByteArray()</code> method on the DSS parameter <code>r</code>,
- * </li>
- * <li>4-byte count of following bytes representing the DSS parameter
- * <code>s</code>,</li>
- * <li>n-bytes representation of a {@link BigInteger} obtained by invoking
- * the <code>toByteArray()</code> method on the DSS parameter <code>s</code>.
- * </li>
- * </ol>
- *
- * @param signature the signature to encode, consisting of the two DSS
- * parameters <code>r</code> and <code>s</code> as a
- * {@link BigInteger} array.
- * @return the <i>Raw</i> format encoding of the designated signature.
- * @exception IllegalArgumentException if the designated signature is not a
- * DSS (Digital Signature Standard) one.
- */
- public byte[] encodeSignature(Object signature)
- {
- BigInteger r, s;
- try
- {
- BigInteger[] sig = (BigInteger[]) signature;
- r = sig[0];
- s = sig[1];
- }
- catch (Exception x)
- {
- throw new IllegalArgumentException("signature");
- }
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- // magic
- baos.write(Registry.MAGIC_RAW_DSS_SIGNATURE[0]);
- baos.write(Registry.MAGIC_RAW_DSS_SIGNATURE[1]);
- baos.write(Registry.MAGIC_RAW_DSS_SIGNATURE[2]);
- baos.write(Registry.MAGIC_RAW_DSS_SIGNATURE[3]);
- // version
- baos.write(0x01);
- // r
- byte[] buffer = r.toByteArray();
- int length = buffer.length;
- baos.write( length >>> 24);
- baos.write((length >>> 16) & 0xFF);
- baos.write((length >>> 8) & 0xFF);
- baos.write(length & 0xFF);
- baos.write(buffer, 0, length);
- // s
- buffer = s.toByteArray();
- length = buffer.length;
- baos.write( length >>> 24);
- baos.write((length >>> 16) & 0xFF);
- baos.write((length >>> 8) & 0xFF);
- baos.write(length & 0xFF);
- baos.write(buffer, 0, length);
- return baos.toByteArray();
- }
-
- public Object decodeSignature(byte[] k)
- {
- // magic
- if (k[0] != Registry.MAGIC_RAW_DSS_SIGNATURE[0]
- || k[1] != Registry.MAGIC_RAW_DSS_SIGNATURE[1]
- || k[2] != Registry.MAGIC_RAW_DSS_SIGNATURE[2]
- || k[3] != Registry.MAGIC_RAW_DSS_SIGNATURE[3])
- throw new IllegalArgumentException("magic");
- // version
- if (k[4] != 0x01)
- throw new IllegalArgumentException("version");
-
- int i = 5;
- int l;
- byte[] buffer;
- // r
- l = k[i++] << 24
- | (k[i++] & 0xFF) << 16
- | (k[i++] & 0xFF) << 8
- | (k[i++] & 0xFF);
- buffer = new byte[l];
- System.arraycopy(k, i, buffer, 0, l);
- i += l;
- BigInteger r = new BigInteger(1, buffer);
- // s
- l = k[i++] << 24
- | (k[i++] & 0xFF) << 16
- | (k[i++] & 0xFF) << 8
- | (k[i++] & 0xFF);
- buffer = new byte[l];
- System.arraycopy(k, i, buffer, 0, l);
- i += l;
- BigInteger s = new BigInteger(1, buffer);
- return new BigInteger[] { r, s };
- }
-}
diff --git a/libjava/classpath/gnu/java/security/sig/dss/DSSSignatureX509Codec.java b/libjava/classpath/gnu/java/security/sig/dss/DSSSignatureX509Codec.java
deleted file mode 100644
index d0a0188..0000000
--- a/libjava/classpath/gnu/java/security/sig/dss/DSSSignatureX509Codec.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/* DSSSignatureX509Codec.java -- X.509 encoder/decoder for DSS signatures
- Copyright (C) 2006 Free Software Foundation, Inc.
-
-This file is 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, 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; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 51 Franklin Street, 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.java.security.sig.dss;
-
-import gnu.java.security.Registry;
-import gnu.java.security.der.DER;
-import gnu.java.security.der.DERReader;
-import gnu.java.security.der.DERValue;
-import gnu.java.security.der.DERWriter;
-import gnu.java.security.sig.ISignatureCodec;
-import gnu.java.security.util.DerUtil;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.math.BigInteger;
-import java.security.InvalidParameterException;
-import java.util.ArrayList;
-
-/**
- * An implementation of an {@link ISignatureCodec} that knows to encode and
- * decode DSS signatures into the raw bytes which would constitute a DER-encoded
- * form of the ASN.1 structure defined in RFC-2459, and RFC-2313 as described in
- * the next paragraphs.
- * <p>
- * Digital signatures when transmitted in an X.509 certificates are encoded
- * in DER (Distinguished Encoding Rules) as a BIT STRING; i.e.
- *
- * <pre>
- * Certificate ::= SEQUENCE {
- * tbsCertificate TBSCertificate,
- * signatureAlgorithm AlgorithmIdentifier,
- * signature BIT STRING
- * }
- * </pre>
- * <p>
- * The output of the encoder, and the input of the decoder, of this codec are
- * then the <i>raw</i> bytes of such a BIT STRING; i.e. not the DER-encoded
- * form itself.
- * <p>
- * RFC-2459 states that, for the Digital Signature Standard (DSS), which
- * generates two MPIs, commonly called <code>r</code> and <code>s</code>, as the
- * result of digitally signing a message, these two numbers will be transferred
- * as the following ASN.1 structure:
- *
- * <pre>
- * Dss-Sig-Value ::= SEQUENCE {
- * r INTEGER,
- * s INTEGER
- * }
- * </pre>
- * <p>
- * Client code that needs to build a DER BIT STRING <b>MUST</b> construct such
- * an ASN.1 value. The following is an example of how to do this:
- * <p>
- * <pre>
- * ...
- * import gnu.java.security.der.BitString;
- * import gnu.java.security.der.DER;
- * import gnu.java.security.der.DERValue;
- * ...
- * DERValue bitString = new DERValue(DER.BIT_STRING, new BitString(sigBytes));
- * ...
- * </pre>
- */
-public class DSSSignatureX509Codec
- implements ISignatureCodec
-{
- // implicit 0-arguments constructor
-
- public int getFormatID()
- {
- return Registry.X509_ENCODING_ID;
- }
-
- /**
- * Encodes a DSS Signature output as the <i>signature</i> raw bytes which can
- * be used to construct an ASN.1 DER-encoded BIT STRING as defined in the
- * documentation of this class.
- *
- * @param signature the output of the DSS signature algorithm; i.e. the value
- * returned by the invocation of
- * {@link gnu.java.security.sig.ISignature#sign()} method. In the
- * case of a DSS signature this is an array of two MPIs called
- * <code>r</code> and <code>s</code>.
- * @return the raw bytes of a DSS signature which could be then used as the
- * contents of a BIT STRING as per rfc-2459.
- * @throws InvalidParameterException if an exception occurs during the
- * marshalling process.
- */
- public byte[] encodeSignature(Object signature)
- {
- BigInteger[] rs = (BigInteger[]) signature;
-
- DERValue derR = new DERValue(DER.INTEGER, rs[0]);
- DERValue derS = new DERValue(DER.INTEGER, rs[1]);
-
- ArrayList dssSigValue = new ArrayList(2);
- dssSigValue.add(derR);
- dssSigValue.add(derS);
- DERValue derDssSigValue = new DERValue(DER.CONSTRUCTED | DER.SEQUENCE,
- dssSigValue);
- byte[] result;
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- try
- {
- DERWriter.write(baos, derDssSigValue);
- result = baos.toByteArray();
- }
- catch (IOException x)
- {
- InvalidParameterException y = new InvalidParameterException();
- y.initCause(x);
- throw y;
- }
-
- return result;
- }
-
- /**
- * Decodes a <i>signature</i> as defined in the documentation of this class.
- *
- * @param input the byte array to unmarshall into a valid DSS signature
- * instance; i.e. an array of two MPIs. MUST NOT be null.
- * @return an array of two MPIs, <code>r</code> and <code>s</code> in this
- * order, decoded from the designated <code>input</code>.
- * @throw InvalidParameterException if an exception occurs during the
- * unmarshalling process.
- */
- public Object decodeSignature(byte[] input)
- {
- if (input == null)
- throw new InvalidParameterException("Input bytes MUST NOT be null");
-
- BigInteger r, s;
- DERReader der = new DERReader(input);
- try
- {
- DERValue derDssSigValue = der.read();
- DerUtil.checkIsConstructed(derDssSigValue, "Wrong Dss-Sig-Value field");
-
- DERValue val = der.read();
- DerUtil.checkIsBigInteger(val, "Wrong R field");
- r = (BigInteger) val.getValue();
- val = der.read();
- DerUtil.checkIsBigInteger(val, "Wrong S field");
- s = (BigInteger) val.getValue();
- }
- catch (IOException x)
- {
- InvalidParameterException y = new InvalidParameterException();
- y.initCause(x);
- throw y;
- }
-
- return new BigInteger[] { r, s };
- }
-}
diff --git a/libjava/classpath/gnu/java/security/sig/rsa/EME_PKCS1_V1_5.java b/libjava/classpath/gnu/java/security/sig/rsa/EME_PKCS1_V1_5.java
deleted file mode 100644
index 329ca8e..0000000
--- a/libjava/classpath/gnu/java/security/sig/rsa/EME_PKCS1_V1_5.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/* EME_PKCS1_V1_5.java --
- Copyright (C) 2003, 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.java.security.sig.rsa;
-
-import gnu.java.security.prng.IRandom;
-import gnu.java.security.prng.LimitReachedException;
-import gnu.java.security.util.PRNG;
-
-import java.io.ByteArrayOutputStream;
-import java.security.interfaces.RSAKey;
-import java.util.Random;
-
-/**
- * An implementation of the EME-PKCS1-V1.5 encoding and decoding methods.
- * <p>
- * EME-PKCS1-V1.5 is parameterised by the entity <code>k</code> which is the
- * byte count of an RSA public shared modulus.
- * <p>
- * References:
- * <ol>
- * <li><a href="http://www.ietf.org/rfc/rfc3447.txt">Public-Key Cryptography
- * Standards (PKCS) #1:</a><br>
- * RSA Cryptography Specifications Version 2.1.<br>
- * Jakob Jonsson and Burt Kaliski.</li>
- * </ol>
- */
-public class EME_PKCS1_V1_5
-{
- private int k;
-
- private ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
- /** Our default source of randomness. */
- private PRNG prng = PRNG.getInstance();
-
- private EME_PKCS1_V1_5(final int k)
- {
- super();
-
- this.k = k;
- }
-
- public static final EME_PKCS1_V1_5 getInstance(final int k)
- {
- if (k < 0)
- throw new IllegalArgumentException("k must be a positive integer");
-
- return new EME_PKCS1_V1_5(k);
- }
-
- public static final EME_PKCS1_V1_5 getInstance(final RSAKey key)
- {
- final int modBits = key.getModulus().bitLength();
- final int k = (modBits + 7) / 8;
- return EME_PKCS1_V1_5.getInstance(k);
- }
-
- /**
- * Generates an octet string <code>PS</code> of length <code>k - mLen -
- * 3</code> consisting of pseudo-randomly generated nonzero octets. The length
- * of <code>PS</code> will be at least eight octets.
- * <p>
- * The method then concatenates <code>PS</code>, the message <code>M</code>,
- * and other padding to form an encoded message <code>EM</code> of length
- * <code>k</code> octets as:
- * <pre>
- * EM = 0x00 || 0x02 || PS || 0x00 || M.
- * </pre>
- * <p>
- * This method uses a default PRNG to obtain the padding bytes.
- *
- * @param M the message to encode.
- * @return the encoded message <code>EM</code>.
- */
- public byte[] encode(final byte[] M)
- {
- // a. Generate an octet string PS of length k - mLen - 3 consisting
- // of pseudo-randomly generated nonzero octets. The length of PS
- // will be at least eight octets.
- final byte[] PS = new byte[k - M.length - 3];
- // FIXME. This should be configurable, somehow.
- prng.nextBytes(PS);
- int i = 0;
- for (; i < PS.length; i++)
- {
- if (PS[i] == 0)
- PS[i] = 1;
- }
- // b. Concatenate PS, the message M, and other padding to form an
- // encoded message EM of length k octets as
- //
- // EM = 0x00 || 0x02 || PS || 0x00 || M.
- return assembleEM(PS, M);
- }
-
- /**
- * Similar to {@link #encode(byte[])} method, except that the source of
- * randomness to use for obtaining the padding bytes (an instance of
- * {@link IRandom}) is given as a parameter.
- *
- * @param M the message to encode.
- * @param irnd the {@link IRandom} instance to use as a source of randomness.
- * @return the encoded message <code>EM</code>.
- */
- public byte[] encode(final byte[] M, final IRandom irnd)
- {
- final byte[] PS = new byte[k - M.length - 3];
- try
- {
- irnd.nextBytes(PS, 0, PS.length);
- int i = 0;
- outer: while (true)
- {
- for (; i < PS.length; i++)
- {
- if (PS[i] == 0x00)
- {
- System.arraycopy(PS, i + 1, PS, i, PS.length - i - 1);
- irnd.nextBytes(PS, PS.length - 1, 1);
- continue outer;
- }
- }
- break;
- }
- }
- catch (IllegalStateException x)
- {
- throw new RuntimeException("encode(): " + String.valueOf(x));
- }
- catch (LimitReachedException x)
- {
- throw new RuntimeException("encode(): " + String.valueOf(x));
- }
- return assembleEM(PS, M);
- }
-
- /**
- * Similar to the {@link #encode(byte[], IRandom)} method, except that the
- * source of randmoness is an instance of {@link Random}.
- *
- * @param M the message to encode.
- * @param rnd the {@link Random} instance to use as a source of randomness.
- * @return the encoded message <code>EM</code>.
- */
- public byte[] encode(final byte[] M, final Random rnd)
- {
- final byte[] PS = new byte[k - M.length - 3];
- rnd.nextBytes(PS);
- int i = 0;
- outer: while (true)
- {
- for (; i < PS.length; i++)
- {
- if (PS[i] == 0x00)
- {
- System.arraycopy(PS, i + 1, PS, i, PS.length - i - 1);
- PS[PS.length - 1] = (byte) rnd.nextInt();
- continue outer;
- }
- }
- break;
- }
- return assembleEM(PS, M);
- }
-
- /**
- * Separate the encoded message <code>EM</code> into an octet string
- * <code>PS</code> consisting of nonzero octets and a message <code>M</code>
- * as:
- * <pre>
- * EM = 0x00 || 0x02 || PS || 0x00 || M.
- * </pre>
- * <p>
- * If the first octet of <code>EM</code> does not have hexadecimal value
- * <code>0x00</code>, if the second octet of <code>EM</code> does not
- * have hexadecimal value <code>0x02</code>, if there is no octet with
- * hexadecimal value <code>0x00</code> to separate <code>PS</code> from
- * <code>M</code>, or if the length of <code>PS</code> is less than
- * <code>8</code> octets, output "decryption error" and stop.
- *
- * @param EM the designated encoded message.
- * @return the decoded message <code>M</code> framed in the designated
- * <code>EM</code> value.
- * @throws IllegalArgumentException if the length of the designated entity
- * <code>EM</code> is different than <code>k</code> (the length
- * in bytes of the public shared modulus), or if any of the
- * conditions described above is detected.
- */
- public byte[] decode(final byte[] EM)
- {
- // Separate the encoded message EM into an
- // octet string PS consisting of nonzero octets and a message M as
- //
- // EM = 0x00 || 0x02 || PS || 0x00 || M.
- //
- // If the first octet of EM does not have hexadecimal value 0x00, if
- // the second octet of EM does not have hexadecimal value 0x02, if
- // there is no octet with hexadecimal value 0x00 to separate PS from
- // M, or if the length of PS is less than 8 octets, output
- // "decryption error" and stop. (See the note below.)
- final int emLen = EM.length;
- if (emLen != k)
- throw new IllegalArgumentException("decryption error");
- if (EM[0] != 0x00)
- throw new IllegalArgumentException("decryption error");
- if (EM[1] != 0x02)
- throw new IllegalArgumentException("decryption error");
- int i = 2;
- for (; i < emLen; i++)
- {
- if (EM[i] == 0x00)
- break;
- }
- if (i >= emLen || i < 11)
- throw new IllegalArgumentException("decryption error");
- i++;
- final byte[] result = new byte[emLen - i];
- System.arraycopy(EM, i, result, 0, result.length);
- return result;
- }
-
- private byte[] assembleEM(final byte[] PS, final byte[] M)
- {
- // b. Concatenate PS, the message M, and other padding to form an
- // encoded message EM of length k octets as
- //
- // EM = 0x00 || 0x02 || PS || 0x00 || M.
- baos.reset();
- baos.write(0x00);
- baos.write(0x02);
- baos.write(PS, 0, PS.length);
- baos.write(0x00);
- baos.write(M, 0, M.length);
- final byte[] result = baos.toByteArray();
- baos.reset();
- return result;
- }
-}
diff --git a/libjava/classpath/gnu/java/security/sig/rsa/EMSA_PKCS1_V1_5.java b/libjava/classpath/gnu/java/security/sig/rsa/EMSA_PKCS1_V1_5.java
deleted file mode 100644
index 3cddab4..0000000
--- a/libjava/classpath/gnu/java/security/sig/rsa/EMSA_PKCS1_V1_5.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/* EMSA_PKCS1_V1_5.java --
- Copyright (C) 2003, 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.java.security.sig.rsa;
-
-import gnu.java.security.Registry;
-import gnu.java.security.hash.HashFactory;
-import gnu.java.security.hash.IMessageDigest;
-
-import java.io.ByteArrayOutputStream;
-
-/**
- * An implementation of the EMSA-PKCS1-V1.5 encoding scheme.
- * <p>
- * EMSA-PKCS1-V1.5 is parameterised by the choice of hash function Hash and
- * hLen which denotes the length in octets of the hash function output.
- * <p>
- * References:
- * <ol>
- * <li><a href="http://www.ietf.org/rfc/rfc3447.txt">Public-Key Cryptography
- * Standards (PKCS) #1:</a><br>
- * RSA Cryptography Specifications Version 2.1.<br>
- * Jakob Jonsson and Burt Kaliski.</li>
- * </ol>
- */
-public class EMSA_PKCS1_V1_5
- implements Cloneable
-{
- /* Notes.
- 1. For the six hash functions mentioned in Appendix B.1, the DER encoding
- T of the DigestInfo value is equal to the following:
-
- MD2: (0x)30 20 30 0c 06 08 2a 86 48 86 f7 0d 02 02 05 00 04 10 || H
- MD5: (0x)30 20 30 0c 06 08 2a 86 48 86 f7 0d 02 05 05 00 04 10 || H
- SHA-1: (0x)30 21 30 09 06 05 2b 0e 03 02 1a 05 00 04 14 || H
- SHA-256: (0x)30 31 30 0d 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20 || H
- SHA-384: (0x)30 41 30 0d 06 09 60 86 48 01 65 03 04 02 02 05 00 04 30 || H
- SHA-512: (0x)30 51 30 0d 06 09 60 86 48 01 65 03 04 02 03 05 00 04 40 || H
- */
- private static final byte[] MD2_PREFIX = {
- (byte) 0x30, (byte) 0x20, (byte) 0x30, (byte) 0x0c, (byte) 0x06,
- (byte) 0x08, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86,
- (byte) 0xf7, (byte) 0x0d, (byte) 0x02, (byte) 0x02, (byte) 0x05,
- (byte) 0x00, (byte) 0x04, (byte) 0x10
- };
-
- private static final byte[] MD5_PREFIX = {
- (byte) 0x30, (byte) 0x20, (byte) 0x30, (byte) 0x0c, (byte) 0x06,
- (byte) 0x08, (byte) 0x2a, (byte) 0x86, (byte) 0x48, (byte) 0x86,
- (byte) 0xf7, (byte) 0x0d, (byte) 0x02, (byte) 0x05, (byte) 0x05,
- (byte) 0x00, (byte) 0x04, (byte) 0x10
- };
-
- private static final byte[] SHA160_PREFIX = {
- (byte) 0x30, (byte) 0x21, (byte) 0x30, (byte) 0x09, (byte) 0x06,
- (byte) 0x05, (byte) 0x2b, (byte) 0x0e, (byte) 0x03, (byte) 0x02,
- (byte) 0x1a, (byte) 0x05, (byte) 0x00, (byte) 0x04, (byte) 0x14
- };
-
- private static final byte[] SHA256_PREFIX = {
- (byte) 0x30, (byte) 0x31, (byte) 0x30, (byte) 0x0d, (byte) 0x06,
- (byte) 0x09, (byte) 0x60, (byte) 0x86, (byte) 0x48, (byte) 0x01,
- (byte) 0x65, (byte) 0x03, (byte) 0x04, (byte) 0x02, (byte) 0x01,
- (byte) 0x05, (byte) 0x00, (byte) 0x04, (byte) 0x20
- };
-
- private static final byte[] SHA384_PREFIX = {
- (byte) 0x30, (byte) 0x41, (byte) 0x30, (byte) 0x0d, (byte) 0x06,
- (byte) 0x09, (byte) 0x60, (byte) 0x86, (byte) 0x48, (byte) 0x01,
- (byte) 0x65, (byte) 0x03, (byte) 0x04, (byte) 0x02, (byte) 0x02,
- (byte) 0x05, (byte) 0x00, (byte) 0x04, (byte) 0x30
- };
-
- private static final byte[] SHA512_PREFIX = {
- (byte) 0x30, (byte) 0x51, (byte) 0x30, (byte) 0x0d, (byte) 0x06,
- (byte) 0x09, (byte) 0x60, (byte) 0x86, (byte) 0x48, (byte) 0x01,
- (byte) 0x65, (byte) 0x03, (byte) 0x04, (byte) 0x02, (byte) 0x03,
- (byte) 0x05, (byte) 0x00, (byte) 0x04, (byte) 0x40
- };
-
- /** The underlying hash function to use with this instance. */
- private IMessageDigest hash;
-
- /** The output size of the hash function in octets. */
- private int hLen; // TODO: field not used!!! investigate
-
- /** The DER part of DigestInfo not containing the hash value itself. */
- private byte[] prefix;
-
- /**
- * Trivial private constructor to enforce use through Factory method.
- *
- * @param hash the message digest instance to use with this scheme instance.
- */
- private EMSA_PKCS1_V1_5(final IMessageDigest hash)
- {
- super();
-
- this.hash = hash;
- hLen = hash.hashSize();
- final String name = hash.name();
- if (name.equals(Registry.MD2_HASH))
- prefix = MD2_PREFIX;
- else if (name.equals(Registry.MD5_HASH))
- prefix = MD5_PREFIX;
- else if (name.equals(Registry.SHA160_HASH))
- prefix = SHA160_PREFIX;
- else if (name.equals(Registry.SHA256_HASH))
- prefix = SHA256_PREFIX;
- else if (name.equals(Registry.SHA384_HASH))
- prefix = SHA384_PREFIX;
- else if (name.equals(Registry.SHA512_HASH))
- prefix = SHA512_PREFIX;
- else
- throw new UnsupportedOperationException(); // should not happen
- }
-
- /**
- * Returns an instance of this object given a designated name of a hash
- * function.
- *
- * @param mdName the canonical name of a hash function.
- * @return an instance of this object configured for use with the designated
- * options.
- * @throws UnsupportedOperationException if the hash function is not
- * implemented or does not have an ID listed in RFC-3447.
- */
- public static final EMSA_PKCS1_V1_5 getInstance(final String mdName)
- {
- final IMessageDigest hash = HashFactory.getInstance(mdName);
- final String name = hash.name();
- if (! (name.equals(Registry.MD2_HASH)
- || name.equals(Registry.MD5_HASH)
- || name.equals(Registry.SHA160_HASH)
- || name.equals(Registry.SHA256_HASH)
- || name.equals(Registry.SHA384_HASH)
- || name.equals(Registry.SHA512_HASH)))
- throw new UnsupportedOperationException("hash with no OID: " + name);
-
- return new EMSA_PKCS1_V1_5(hash);
- }
-
- public Object clone()
- {
- return getInstance(hash.name());
- }
-
- /**
- * Frames the hash of a message, along with an ID of the hash function in
- * a DER sequence according to the specifications of EMSA-PKCS1-V1.5 as
- * described in RFC-3447 (see class documentation).
- *
- * @param mHash the byte sequence resulting from applying the message digest
- * algorithm Hash to the message <i>M</i>.
- * @param emLen intended length in octets of the encoded message, at least
- * <code>tLen + 11</code>, where <code>tLen</code> is the octet length of the
- * DER encoding <code>T</code> of a certain value computed during the
- * encoding operation.
- * @return encoded message, an octet string of length <code>emLen</code>.
- * @throws IllegalArgumentException if the message is too long, or if the
- * intended encoded message length is too short.
- */
- public byte[] encode(final byte[] mHash, final int emLen)
- {
- // 1. Apply the hash function to the message M to produce a hash value
- // H: H = Hash(M).
- // If the hash function outputs "message too long," output "message
- // too long" and stop.
- // 2. Encode the algorithm ID for the hash function and the hash value
- // into an ASN.1 value of type DigestInfo (see Appendix A.2.4) with
- // the Distinguished Encoding Rules (DER), where the type DigestInfo
- // has the syntax
- // DigestInfo ::= SEQUENCE {
- // digestAlgorithm AlgorithmIdentifier,
- // digest OCTET STRING
- // }
- // The first field identifies the hash function and the second contains
- // the hash value. Let T be the DER encoding of the DigestInfo value
- // (see the notes below) and let tLen be the length in octets of T.
- final ByteArrayOutputStream baos = new ByteArrayOutputStream();
- baos.write(prefix, 0, prefix.length);
- baos.write(mHash, 0, mHash.length);
- final byte[] T = baos.toByteArray();
- final int tLen = T.length;
- // 3. If emLen < tLen + 11, output "intended encoded message length too
- // short" and stop.
- if (emLen < tLen + 11)
- throw new IllegalArgumentException("emLen too short");
- // 4. Generate an octet string PS consisting of emLen - tLen - 3 octets
- // with hexadecimal value 0xff. The length of PS will be at least 8
- // octets.
- final byte[] PS = new byte[emLen - tLen - 3];
- for (int i = 0; i < PS.length; i++)
- PS[i] = (byte) 0xFF;
- // 5. Concatenate PS, the DER encoding T, and other padding to form the
- // encoded message EM as: EM = 0x00 || 0x01 || PS || 0x00 || T.
- baos.reset();
- baos.write(0x00);
- baos.write(0x01);
- baos.write(PS, 0, PS.length);
- baos.write(0x00);
- baos.write(T, 0, tLen);
- final byte[] result = baos.toByteArray();
- baos.reset();
- // 6. Output EM.
- return result;
- }
-}
diff --git a/libjava/classpath/gnu/java/security/sig/rsa/EMSA_PSS.java b/libjava/classpath/gnu/java/security/sig/rsa/EMSA_PSS.java
deleted file mode 100644
index 7a8e591..0000000
--- a/libjava/classpath/gnu/java/security/sig/rsa/EMSA_PSS.java
+++ /dev/null
@@ -1,372 +0,0 @@
-/* EMSA_PSS.java --
- Copyright (C) 2001, 2002, 2003, 2006, 2010 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.java.security.sig.rsa;
-
-import gnu.java.security.Configuration;
-import gnu.java.security.hash.HashFactory;
-import gnu.java.security.hash.IMessageDigest;
-import gnu.java.security.util.Util;
-
-import java.util.Arrays;
-import java.util.logging.Logger;
-
-/**
- * An implementation of the EMSA-PSS encoding/decoding scheme.
- * <p>
- * EMSA-PSS coincides with EMSA4 in IEEE P1363a D5 except that EMSA-PSS acts on
- * octet strings and not on bit strings. In particular, the bit lengths of the
- * hash and the salt must be multiples of 8 in EMSA-PSS. Moreover, EMSA4 outputs
- * an integer of a desired bit length rather than an octet string.
- * <p>
- * EMSA-PSS is parameterized by the choice of hash function Hash and mask
- * generation function MGF. In this submission, MGF is based on a Hash
- * definition that coincides with the corresponding definitions in IEEE Std
- * 1363-2000, PKCS #1 v2.0, and the draft ANSI X9.44. In PKCS #1 v2.0 and the
- * draft ANSI X9.44, the recommended hash function is SHA-1, while IEEE Std
- * 1363-2000 recommends SHA-1 and RIPEMD-160.
- * <p>
- * References:
- * <ol>
- * <li><a
- * href="http://www.cosic.esat.kuleuven.ac.be/nessie/workshop/submissions/rsa-pss.zip">
- * RSA-PSS Signature Scheme with Appendix, part B.</a><br>
- * Primitive specification and supporting documentation.<br>
- * Jakob Jonsson and Burt Kaliski.</li>
- * </ol>
- */
-public class EMSA_PSS
- implements Cloneable
-{
- private static final Logger log = Configuration.DEBUG ?
- Logger.getLogger(EMSA_PSS.class.getName()) : null;
-
- /** The underlying hash function to use with this instance. */
- private IMessageDigest hash;
-
- /** The output size of the hash function in octets. */
- private int hLen;
-
- /**
- * Trivial private constructor to enforce use through Factory method.
- *
- * @param hash the message digest instance to use with this scheme instance.
- */
- private EMSA_PSS(IMessageDigest hash)
- {
- super();
-
- this.hash = hash;
- hLen = hash.hashSize();
- }
-
- /**
- * Returns an instance of this object given a designated name of a hash
- * function.
- *
- * @param mdName the canonical name of a hash function.
- * @return an instance of this object configured for use with the designated
- * options.
- */
- public static EMSA_PSS getInstance(String mdName)
- {
- IMessageDigest hash = HashFactory.getInstance(mdName);
- return new EMSA_PSS(hash);
- }
-
- public Object clone()
- {
- return getInstance(hash.name());
- }
-
- /**
- * The encoding operation EMSA-PSS-Encode computes the hash of a message
- * <code>M</code> using a hash function and maps the result to an encoded
- * message <code>EM</code> of a specified length using a mask generation
- * function.
- *
- * @param mHash the byte sequence resulting from applying the message digest
- * algorithm Hash to the message <i>M</i>.
- * @param emBits the maximal bit length of the integer OS2IP(EM), at least
- * <code>8.hLen + 8.sLen + 9</code>.
- * @param salt the salt to use when encoding the output.
- * @return the encoded message <code>EM</code>, an octet string of length
- * <code>emLen = CEILING(emBits / 8)</code>.
- * @exception IllegalArgumentException if an exception occurs.
- */
- public byte[] encode(byte[] mHash, int emBits, byte[] salt)
- {
- int sLen = salt.length;
- // 1. If the length of M is greater than the input limitation for the hash
- // function (2**61 - 1 octets for SHA-1) then output "message too long"
- // and stop.
- // 2. Let mHash = Hash(M), an octet string of length hLen.
- if (hLen != mHash.length)
- throw new IllegalArgumentException("wrong hash");
- // 3. If emBits < 8.hLen + 8.sLen + 9, output 'encoding error' and stop.
- if (emBits < (8 * hLen + 8 * sLen + 9))
- throw new IllegalArgumentException("encoding error");
- int emLen = (emBits + 7) / 8;
- // 4. Generate a random octet string salt of length sLen; if sLen = 0,
- // then salt is the empty string.
- // ...passed as argument to accomodate JCE
- // 5. Let M0 = 00 00 00 00 00 00 00 00 || mHash || salt;
- // M0 is an octet string of length 8 + hLen + sLen with eight initial zero
- // octets.
- // 6. Let H = Hash(M0), an octet string of length hLen.
- byte[] H;
- int i;
- synchronized (hash)
- {
- for (i = 0; i < 8; i++)
- hash.update((byte) 0x00);
-
- hash.update(mHash, 0, hLen);
- hash.update(salt, 0, sLen);
- H = hash.digest();
- }
- // 7. Generate an octet string PS consisting of emLen - sLen - hLen - 2
- // zero octets. The length of PS may be 0.
- // 8. Let DB = PS || 01 || salt.
- byte[] DB = new byte[emLen - sLen - hLen - 2 + 1 + sLen];
- DB[emLen - sLen - hLen - 2] = 0x01;
- System.arraycopy(salt, 0, DB, emLen - sLen - hLen - 1, sLen);
- // 9. Let dbMask = MGF(H, emLen - hLen - 1).
- byte[] dbMask = MGF(H, emLen - hLen - 1);
- if (Configuration.DEBUG)
- {
- log.fine("dbMask (encode): " + Util.toString(dbMask));
- log.fine("DB (encode): " + Util.toString(DB));
- }
- // 10. Let maskedDB = DB XOR dbMask.
- for (i = 0; i < DB.length; i++)
- DB[i] = (byte)(DB[i] ^ dbMask[i]);
- // 11. Set the leftmost 8emLen - emBits bits of the leftmost octet in
- // maskedDB to zero.
- DB[0] &= (0xFF >>> (8 * emLen - emBits));
- // 12. Let EM = maskedDB || H || bc, where bc is the single octet with
- // hexadecimal value 0xBC.
- byte[] result = new byte[emLen];
- System.arraycopy(DB, 0, result, 0, emLen - hLen - 1);
- System.arraycopy(H, 0, result, emLen - hLen - 1, hLen);
- result[emLen - 1] = (byte) 0xBC;
- // 13. Output EM.
- return result;
- }
-
- /**
- * The decoding operation EMSA-PSS-Decode recovers the message hash from an
- * encoded message <code>EM</code> and compares it to the hash of
- * <code>M</code>.
- *
- * @param mHash the byte sequence resulting from applying the message digest
- * algorithm Hash to the message <i>M</i>.
- * @param EM the <i>encoded message</i>, an octet string of length
- * <code>emLen = CEILING(emBits/8).
- * @param emBits the maximal bit length of the integer OS2IP(EM), at least
- * <code>8.hLen + 8.sLen + 9</code>.
- * @param sLen the length, in octets, of the expected salt.
- * @return <code>true</code> if the result of the verification was
- * <i>consistent</i> with the expected reseult; and <code>false</code> if the
- * result was <i>inconsistent</i>.
- * @exception IllegalArgumentException if an exception occurs.
- */
- public boolean decode(byte[] mHash, byte[] EM, int emBits, int sLen)
- {
- if (Configuration.DEBUG)
- {
- log.fine("mHash: " + Util.toString(mHash));
- log.fine("EM: " + Util.toString(EM));
- log.fine("emBits: " + String.valueOf(emBits));
- log.fine("sLen: " + String.valueOf(sLen));
- }
- if (sLen < 0)
- throw new IllegalArgumentException("sLen");
- // 1. If the length of M is greater than the input limitation for the hash
- // function (2**61 ? 1 octets for SHA-1) then output 'inconsistent' and
- // stop.
- // 2. Let mHash = Hash(M), an octet string of length hLen.
- if (hLen != mHash.length)
- {
- if (Configuration.DEBUG)
- log.fine("hLen != mHash.length; hLen: " + String.valueOf(hLen));
- throw new IllegalArgumentException("wrong hash");
- }
- // 3. If emBits < 8.hLen + 8.sLen + 9, output 'decoding error' and stop.
- if (emBits < (8 * hLen + 8 * sLen + 9))
- {
- if (Configuration.DEBUG)
- log.fine("emBits < (8hLen + 8sLen + 9); sLen: "
- + String.valueOf(sLen));
- throw new IllegalArgumentException("decoding error");
- }
- int emLen = (emBits + 7) / 8;
- // 4. If the rightmost octet of EM does not have hexadecimal value bc,
- // output 'inconsistent' and stop.
- if ((EM[EM.length - 1] & 0xFF) != 0xBC)
- {
- if (Configuration.DEBUG)
- log.fine("EM does not end with 0xBC");
- return false;
- }
- // 5. Let maskedDB be the leftmost emLen ? hLen ? 1 octets of EM, and let
- // H be the next hLen octets.
- // 6. If the leftmost 8.emLen ? emBits bits of the leftmost octet in
- // maskedDB are not all equal to zero, output 'inconsistent' and stop.
- if ((EM[0] & (0xFF << (8 - (8 * emLen - emBits)))) != 0)
- {
- if (Configuration.DEBUG)
- log.fine("Leftmost 8emLen - emBits bits of EM are not 0s");
- return false;
- }
- byte[] DB = new byte[emLen - hLen - 1];
- byte[] H = new byte[hLen];
- System.arraycopy(EM, 0, DB, 0, emLen - hLen - 1);
- System.arraycopy(EM, emLen - hLen - 1, H, 0, hLen);
- // 7. Let dbMask = MGF(H, emLen ? hLen ? 1).
- byte[] dbMask = MGF(H, emLen - hLen - 1);
- // 8. Let DB = maskedDB XOR dbMask.
- int i;
- for (i = 0; i < DB.length; i++)
- DB[i] = (byte)(DB[i] ^ dbMask[i]);
- // 9. Set the leftmost 8.emLen ? emBits bits of DB to zero.
- DB[0] &= (0xFF >>> (8 * emLen - emBits));
- if (Configuration.DEBUG)
- {
- log.fine("dbMask (decode): " + Util.toString(dbMask));
- log.fine("DB (decode): " + Util.toString(DB));
- }
- // 10. If the emLen -hLen -sLen -2 leftmost octets of DB are not zero or
- // if the octet at position emLen -hLen -sLen -1 is not equal to 0x01,
- // output 'inconsistent' and stop.
- // IMPORTANT (rsn): this is an error in the specs, the index of the 0x01
- // byte should be emLen -hLen -sLen -2 and not -1! authors have been advised
- for (i = 0; i < (emLen - hLen - sLen - 2); i++)
- {
- if (DB[i] != 0)
- {
- if (Configuration.DEBUG)
- log.fine("DB[" + String.valueOf(i) + "] != 0x00");
- return false;
- }
- }
- if (DB[i] != 0x01)
- { // i == emLen -hLen -sLen -2
- if (Configuration.DEBUG)
- log.fine("DB's byte at position (emLen -hLen -sLen -2); i.e. "
- + String.valueOf(i) + " is not 0x01");
- return false;
- }
- // 11. Let salt be the last sLen octets of DB.
- byte[] salt = new byte[sLen];
- System.arraycopy(DB, DB.length - sLen, salt, 0, sLen);
- // 12. Let M0 = 00 00 00 00 00 00 00 00 || mHash || salt;
- // M0 is an octet string of length 8 + hLen + sLen with eight initial
- // zero octets.
- // 13. Let H0 = Hash(M0), an octet string of length hLen.
- byte[] H0;
- synchronized (hash)
- {
- for (i = 0; i < 8; i++)
- hash.update((byte) 0x00);
-
- hash.update(mHash, 0, hLen);
- hash.update(salt, 0, sLen);
- H0 = hash.digest();
- }
- // 14. If H = H0, output 'consistent.' Otherwise, output 'inconsistent.'
- return Arrays.equals(H, H0);
- }
-
- /**
- * A mask generation function takes an octet string of variable length and a
- * desired output length as input, and outputs an octet string of the desired
- * length. There may be restrictions on the length of the input and output
- * octet strings, but such bounds are generally very large. Mask generation
- * functions are deterministic; the octet string output is completely
- * determined by the input octet string. The output of a mask generation
- * function should be pseudorandom, that is, it should be infeasible to
- * predict, given one part of the output but not the input, another part of
- * the output. The provable security of RSA-PSS relies on the random nature of
- * the output of the mask generation function, which in turn relies on the
- * random nature of the underlying hash function.
- *
- * @param Z a seed.
- * @param l the desired output length in octets.
- * @return the mask.
- * @exception IllegalArgumentException if the desired output length is too
- * long.
- */
- private byte[] MGF(byte[] Z, int l)
- {
- // 1. If l > (2**32).hLen, output 'mask too long' and stop.
- if (l < 1 || (l & 0xFFFFFFFFL) > ((hLen & 0xFFFFFFFFL) << 32L))
- throw new IllegalArgumentException("mask too long");
- // 2. Let T be the empty octet string.
- byte[] result = new byte[l];
- // 3. For i = 0 to CEILING(l/hLen) ? 1, do
- int limit = ((l + hLen - 1) / hLen) - 1;
- IMessageDigest hashZ = null;
- hashZ = (IMessageDigest) hash.clone();
- hashZ.digest();
- hashZ.update(Z, 0, Z.length);
- IMessageDigest hashZC = null;
- byte[] t;
- int sofar = 0;
- int length;
- for (int i = 0; i < limit; i++)
- {
- // 3.1 Convert i to an octet string C of length 4 with the primitive
- // I2OSP: C = I2OSP(i, 4).
- // 3.2 Concatenate the hash of the seed Z and C to the octet string T:
- // T = T || Hash(Z || C)
- hashZC = (IMessageDigest) hashZ.clone();
- hashZC.update((byte)(i >>> 24));
- hashZC.update((byte)(i >>> 16));
- hashZC.update((byte)(i >>> 8));
- hashZC.update((byte) i);
- t = hashZC.digest();
- length = l - sofar;
- length = (length > hLen ? hLen : length);
- System.arraycopy(t, 0, result, sofar, length);
- sofar += length;
- }
- // 4. Output the leading l octets of T as the octet string mask.
- return result;
- }
-}
diff --git a/libjava/classpath/gnu/java/security/sig/rsa/RSA.java b/libjava/classpath/gnu/java/security/sig/rsa/RSA.java
deleted file mode 100644
index 343b2cf..0000000
--- a/libjava/classpath/gnu/java/security/sig/rsa/RSA.java
+++ /dev/null
@@ -1,324 +0,0 @@
-/* RSA.java --
- Copyright (C) 2001, 2002, 2003, 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.java.security.sig.rsa;
-
-import gnu.java.security.Properties;
-import gnu.java.security.util.PRNG;
-
-import java.math.BigInteger;
-import java.security.PrivateKey;
-import java.security.PublicKey;
-import java.security.interfaces.RSAPrivateCrtKey;
-import java.security.interfaces.RSAPrivateKey;
-import java.security.interfaces.RSAPublicKey;
-
-/**
- * Utility methods related to the RSA algorithm.
- * <p>
- * References:
- * <ol>
- * <li><a
- * href="http://www.cosic.esat.kuleuven.ac.be/nessie/workshop/submissions/rsa-pss.zip">
- * RSA-PSS Signature Scheme with Appendix, part B.</a><br>
- * Primitive specification and supporting documentation.<br>
- * Jakob Jonsson and Burt Kaliski.</li>
- * <li><a href="http://www.ietf.org/rfc/rfc3447.txt">Public-Key Cryptography
- * Standards (PKCS) #1:</a><br>
- * RSA Cryptography Specifications Version 2.1.<br>
- * Jakob Jonsson and Burt Kaliski.</li>
- * <li><a href="http://crypto.stanford.edu/~dabo/abstracts/ssl-timing.html">
- * Remote timing attacks are practical</a><br>
- * D. Boneh and D. Brumley.</li>
- * </ol>
- */
-public class RSA
-{
- private static final BigInteger ZERO = BigInteger.ZERO;
-
- private static final BigInteger ONE = BigInteger.ONE;
-
- /** Our default source of randomness. */
- private static final PRNG prng = PRNG.getInstance();
-
- /** Trivial private constructor to enforce Singleton pattern. */
- private RSA()
- {
- super();
- }
-
- /**
- * An implementation of the <b>RSASP</b> method: Assuming that the designated
- * RSA private key is a valid one, this method computes a <i>signature
- * representative</i> for a designated <i>message representative</i> signed
- * by the holder of the designated RSA private key.
- *
- * @param K the RSA private key.
- * @param m the <i>message representative</i>: an integer between
- * <code>0</code> and <code>n - 1</code>, where <code>n</code>
- * is the RSA <i>modulus</i>.
- * @return the <i>signature representative</i>, an integer between
- * <code>0</code> and <code>n - 1</code>, where <code>n</code>
- * is the RSA <i>modulus</i>.
- * @throws ClassCastException if <code>K</code> is not an RSA one.
- * @throws IllegalArgumentException if <code>m</code> (the <i>message
- * representative</i>) is out of range.
- */
- public static final BigInteger sign(final PrivateKey K, final BigInteger m)
- {
- try
- {
- return RSADP((RSAPrivateKey) K, m);
- }
- catch (IllegalArgumentException x)
- {
- throw new IllegalArgumentException("message representative out of range");
- }
- }
-
- /**
- * An implementation of the <b>RSAVP</b> method: Assuming that the designated
- * RSA public key is a valid one, this method computes a <i>message
- * representative</i> for the designated <i>signature representative</i>
- * generated by an RSA private key, for a message intended for the holder of
- * the designated RSA public key.
- *
- * @param K the RSA public key.
- * @param s the <i>signature representative</i>, an integer between
- * <code>0</code> and <code>n - 1</code>, where <code>n</code>
- * is the RSA <i>modulus</i>.
- * @return a <i>message representative</i>: an integer between <code>0</code>
- * and <code>n - 1</code>, where <code>n</code> is the RSA
- * <i>modulus</i>.
- * @throws ClassCastException if <code>K</code> is not an RSA one.
- * @throws IllegalArgumentException if <code>s</code> (the <i>signature
- * representative</i>) is out of range.
- */
- public static final BigInteger verify(final PublicKey K, final BigInteger s)
- {
- try
- {
- return RSAEP((RSAPublicKey) K, s);
- }
- catch (IllegalArgumentException x)
- {
- throw new IllegalArgumentException("signature representative out of range");
- }
- }
-
- /**
- * An implementation of the <code>RSAEP</code> algorithm.
- *
- * @param K the recipient's RSA public key.
- * @param m the message representative as an MPI.
- * @return the resulting MPI --an MPI between <code>0</code> and
- * <code>n - 1</code> (<code>n</code> being the public shared
- * modulus)-- that will eventually be padded with an appropriate
- * framing/padding scheme.
- * @throws ClassCastException if <code>K</code> is not an RSA one.
- * @throws IllegalArgumentException if <code>m</code>, the message
- * representative is not between <code>0</code> and
- * <code>n - 1</code> (<code>n</code> being the public shared
- * modulus).
- */
- public static final BigInteger encrypt(final PublicKey K, final BigInteger m)
- {
- try
- {
- return RSAEP((RSAPublicKey) K, m);
- }
- catch (IllegalArgumentException x)
- {
- throw new IllegalArgumentException("message representative out of range");
- }
- }
-
- /**
- * An implementation of the <code>RSADP</code> algorithm.
- *
- * @param K the recipient's RSA private key.
- * @param c the ciphertext representative as an MPI.
- * @return the message representative, an MPI between <code>0</code> and
- * <code>n - 1</code> (<code>n</code> being the shared public
- * modulus).
- * @throws ClassCastException if <code>K</code> is not an RSA one.
- * @throws IllegalArgumentException if <code>c</code>, the ciphertext
- * representative is not between <code>0</code> and
- * <code>n - 1</code> (<code>n</code> being the shared public
- * modulus).
- */
- public static final BigInteger decrypt(final PrivateKey K, final BigInteger c)
- {
- try
- {
- return RSADP((RSAPrivateKey) K, c);
- }
- catch (IllegalArgumentException x)
- {
- throw new IllegalArgumentException("ciphertext representative out of range");
- }
- }
-
- /**
- * Converts a <i>multi-precision integer</i> (MPI) <code>s</code> into an
- * octet sequence of length <code>k</code>.
- *
- * @param s the multi-precision integer to convert.
- * @param k the length of the output.
- * @return the result of the transform.
- * @exception IllegalArgumentException if the length in octets of meaningful
- * bytes of <code>s</code> is greater than <code>k</code>.
- */
- public static final byte[] I2OSP(final BigInteger s, final int k)
- {
- byte[] result = s.toByteArray();
- if (result.length < k)
- {
- final byte[] newResult = new byte[k];
- System.arraycopy(result, 0, newResult, k - result.length, result.length);
- result = newResult;
- }
- else if (result.length > k)
- { // leftmost extra bytes should all be 0
- final int limit = result.length - k;
- for (int i = 0; i < limit; i++)
- {
- if (result[i] != 0x00)
- throw new IllegalArgumentException("integer too large");
- }
- final byte[] newResult = new byte[k];
- System.arraycopy(result, limit, newResult, 0, k);
- result = newResult;
- }
- return result;
- }
-
- private static final BigInteger RSAEP(final RSAPublicKey K, final BigInteger m)
- {
- // 1. If the representative m is not between 0 and n - 1, output
- // "representative out of range" and stop.
- final BigInteger n = K.getModulus();
- if (m.compareTo(ZERO) < 0 || m.compareTo(n.subtract(ONE)) > 0)
- throw new IllegalArgumentException();
- // 2. Let c = m^e mod n.
- final BigInteger e = K.getPublicExponent();
- final BigInteger result = m.modPow(e, n);
- // 3. Output c.
- return result;
- }
-
- private static final BigInteger RSADP(final RSAPrivateKey K, BigInteger c)
- {
- // 1. If the representative c is not between 0 and n - 1, output
- // "representative out of range" and stop.
- final BigInteger n = K.getModulus();
- if (c.compareTo(ZERO) < 0 || c.compareTo(n.subtract(ONE)) > 0)
- throw new IllegalArgumentException();
- // 2. The representative m is computed as follows.
- BigInteger result;
- if (! (K instanceof RSAPrivateCrtKey))
- {
- // a. If the first form (n, d) of K is used, let m = c^d mod n.
- final BigInteger d = K.getPrivateExponent();
- result = c.modPow(d, n);
- }
- else
- {
- // from [3] p.13 --see class docs:
- // The RSA blinding operation calculates x = (r^e) * g mod n before
- // decryption, where r is random, e is the RSA encryption exponent, and
- // g is the ciphertext to be decrypted. x is then decrypted as normal,
- // followed by division by r, i.e. (x^e) / r mod n. Since r is random,
- // x is random and timing the decryption should not reveal information
- // about the key. Note that r should be a new random number for every
- // decryption.
- final boolean rsaBlinding = Properties.doRSABlinding();
- BigInteger r = null;
- BigInteger e = null;
- if (rsaBlinding)
- { // pre-decryption
- r = newR(n);
- e = ((RSAPrivateCrtKey) K).getPublicExponent();
- final BigInteger x = r.modPow(e, n).multiply(c).mod(n);
- c = x;
- }
- // b. If the second form (p, q, dP, dQ, qInv) and (r_i, d_i, t_i)
- // of K is used, proceed as follows:
- final BigInteger p = ((RSAPrivateCrtKey) K).getPrimeP();
- final BigInteger q = ((RSAPrivateCrtKey) K).getPrimeQ();
- final BigInteger dP = ((RSAPrivateCrtKey) K).getPrimeExponentP();
- final BigInteger dQ = ((RSAPrivateCrtKey) K).getPrimeExponentQ();
- final BigInteger qInv = ((RSAPrivateCrtKey) K).getCrtCoefficient();
- // i. Let m_1 = c^dP mod p and m_2 = c^dQ mod q.
- final BigInteger m_1 = c.modPow(dP, p);
- final BigInteger m_2 = c.modPow(dQ, q);
- // ii. If u > 2, let m_i = c^(d_i) mod r_i, i = 3, ..., u.
- // iii. Let h = (m_1 - m_2) * qInv mod p.
- final BigInteger h = m_1.subtract(m_2).multiply(qInv).mod(p);
- // iv. Let m = m_2 + q * h.
- result = m_2.add(q.multiply(h));
- if (rsaBlinding) // post-decryption
- result = result.multiply(r.modInverse(n)).mod(n);
- }
- // 3. Output m
- return result;
- }
-
- /**
- * Returns a random MPI with a random bit-length of the form <code>8b</code>,
- * where <code>b</code> is in the range <code>[32..64]</code>.
- *
- * @return a random MPI whose length in bytes is between 32 and 64 inclusive.
- */
- private static final BigInteger newR(final BigInteger N)
- {
- final int upper = (N.bitLength() + 7) / 8;
- final int lower = upper / 2;
- final byte[] bl = new byte[1];
- int b;
- do
- {
- prng.nextBytes(bl);
- b = bl[0] & 0xFF;
- }
- while (b < lower || b > upper);
- final byte[] buffer = new byte[b]; // 256-bit MPI
- prng.nextBytes(buffer);
- return new BigInteger(1, buffer);
- }
-}
diff --git a/libjava/classpath/gnu/java/security/sig/rsa/RSAPKCS1V1_5Signature.java b/libjava/classpath/gnu/java/security/sig/rsa/RSAPKCS1V1_5Signature.java
deleted file mode 100644
index 1420331..0000000
--- a/libjava/classpath/gnu/java/security/sig/rsa/RSAPKCS1V1_5Signature.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/* RSAPKCS1V1_5Signature.java --
- Copyright (C) 2001, 2002, 2003, 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.java.security.sig.rsa;
-
-import gnu.java.security.Registry;
-import gnu.java.security.hash.HashFactory;
-import gnu.java.security.hash.IMessageDigest;
-import gnu.java.security.sig.BaseSignature;
-
-import java.math.BigInteger;
-import java.security.PrivateKey;
-import java.security.PublicKey;
-import java.security.interfaces.RSAPrivateKey;
-import java.security.interfaces.RSAPublicKey;
-import java.util.Arrays;
-
-/**
- * The RSA-PKCS1-V1.5 signature scheme is a digital signature scheme with
- * appendix (SSA) combining the RSA algorithm with the EMSA-PKCS1-v1_5 encoding
- * method.
- * <p>
- * References:
- * <ol>
- * <li><a
- * href="http://www.cosic.esat.kuleuven.ac.be/nessie/workshop/submissions/rsa-pss.zip">
- * RSA-PSS Signature Scheme with Appendix, part B.</a><br>
- * Primitive specification and supporting documentation.<br>
- * Jakob Jonsson and Burt Kaliski.</li>
- * <li><a href="http://www.ietf.org/rfc/rfc3447.txt">Public-Key Cryptography
- * Standards (PKCS) #1:</a><br>
- * RSA Cryptography Specifications Version 2.1.<br>
- * Jakob Jonsson and Burt Kaliski.</li>
- * </ol>
- */
-public class RSAPKCS1V1_5Signature
- extends BaseSignature
-{
- /** The underlying EMSA-PKCS1-v1.5 instance for this object. */
- private EMSA_PKCS1_V1_5 pkcs1;
-
- /**
- * Default 0-arguments constructor. Uses SHA-1 as the default hash.
- */
- public RSAPKCS1V1_5Signature()
- {
- this(Registry.SHA160_HASH);
- }
-
- /**
- * Constructs an instance of this object using the designated message digest
- * algorithm as its underlying hash function.
- *
- * @param mdName the canonical name of the underlying hash function.
- */
- public RSAPKCS1V1_5Signature(final String mdName)
- {
- this(HashFactory.getInstance(mdName));
- }
-
- public RSAPKCS1V1_5Signature(IMessageDigest md)
- {
- super(Registry.RSA_PKCS1_V1_5_SIG, md);
-
- pkcs1 = EMSA_PKCS1_V1_5.getInstance(md.name());
- }
-
- /** Private constructor for cloning purposes. */
- private RSAPKCS1V1_5Signature(final RSAPKCS1V1_5Signature that)
- {
- this(that.md.name());
-
- this.publicKey = that.publicKey;
- this.privateKey = that.privateKey;
- this.md = (IMessageDigest) that.md.clone();
- this.pkcs1 = (EMSA_PKCS1_V1_5) that.pkcs1.clone();
- }
-
- public Object clone()
- {
- return new RSAPKCS1V1_5Signature(this);
- }
-
- protected void setupForVerification(final PublicKey k)
- throws IllegalArgumentException
- {
- if (! (k instanceof RSAPublicKey))
- throw new IllegalArgumentException();
-
- publicKey = k;
- }
-
- protected void setupForSigning(final PrivateKey k)
- throws IllegalArgumentException
- {
- if (! (k instanceof RSAPrivateKey))
- throw new IllegalArgumentException();
-
- privateKey = k;
- }
-
- protected Object generateSignature() throws IllegalStateException
- {
- // 1. EMSA-PKCS1-v1_5 encoding: Apply the EMSA-PKCS1-v1_5 encoding
- // operation (Section 9.2) to the message M to produce an encoded
- // message EM of length k octets:
- //
- // EM = EMSA-PKCS1-V1_5-ENCODE (M, k).
- //
- // If the encoding operation outputs "message too long," output
- // "message too long" and stop. If the encoding operation outputs
- // "intended encoded message length too short," output "RSA modulus
- // too short" and stop.
- final int modBits = ((RSAPrivateKey) privateKey).getModulus().bitLength();
- final int k = (modBits + 7) / 8;
- final byte[] EM = pkcs1.encode(md.digest(), k);
- // 2. RSA signature:
- // a. Convert the encoded message EM to an integer message epresentative
- // m (see Section 4.2): m = OS2IP (EM).
- final BigInteger m = new BigInteger(1, EM);
- // b. Apply the RSASP1 signature primitive (Section 5.2.1) to the RSA
- // private key K and the message representative m to produce an
- // integer signature representative s: s = RSASP1 (K, m).
- final BigInteger s = RSA.sign(privateKey, m);
- // c. Convert the signature representative s to a signature S of length
- // k octets (see Section 4.1): S = I2OSP (s, k).
- // 3. Output the signature S.
- return RSA.I2OSP(s, k);
- }
-
- protected boolean verifySignature(final Object sig)
- throws IllegalStateException
- {
- if (publicKey == null)
- throw new IllegalStateException();
- final byte[] S = (byte[]) sig;
- // 1. Length checking: If the length of the signature S is not k octets,
- // output "invalid signature" and stop.
- final int modBits = ((RSAPublicKey) publicKey).getModulus().bitLength();
- final int k = (modBits + 7) / 8;
- if (S.length != k)
- return false;
- // 2. RSA verification:
- // a. Convert the signature S to an integer signature representative
- // s (see Section 4.2): s = OS2IP (S).
- final BigInteger s = new BigInteger(1, S);
- // b. Apply the RSAVP1 verification primitive (Section 5.2.2) to the
- // RSA public key (n, e) and the signature representative s to
- // produce an integer message representative m:
- // m = RSAVP1 ((n, e), s).
- // If RSAVP1 outputs "signature representative out of range,"
- // output "invalid signature" and stop.
- final BigInteger m;
- try
- {
- m = RSA.verify(publicKey, s);
- }
- catch (IllegalArgumentException x)
- {
- return false;
- }
- // c. Convert the message representative m to an encoded message EM
- // of length k octets (see Section 4.1): EM = I2OSP (m, k).
- // If I2OSP outputs "integer too large," output "invalid signature"
- // and stop.
- final byte[] EM;
- try
- {
- EM = RSA.I2OSP(m, k);
- }
- catch (IllegalArgumentException x)
- {
- return false;
- }
- // 3. EMSA-PKCS1-v1_5 encoding: Apply the EMSA-PKCS1-v1_5 encoding
- // operation (Section 9.2) to the message M to produce a second
- // encoded message EM' of length k octets:
- // EM' = EMSA-PKCS1-V1_5-ENCODE (M, k).
- // If the encoding operation outputs "message too long," output
- // "message too long" and stop. If the encoding operation outputs
- // "intended encoded message length too short," output "RSA modulus
- // too short" and stop.
- final byte[] EMp = pkcs1.encode(md.digest(), k);
- // 4. Compare the encoded message EM and the second encoded message EM'.
- // If they are the same, output "valid signature"; otherwise, output
- // "invalid signature."
- return Arrays.equals(EM, EMp);
- }
-}
diff --git a/libjava/classpath/gnu/java/security/sig/rsa/RSAPKCS1V1_5SignatureRawCodec.java b/libjava/classpath/gnu/java/security/sig/rsa/RSAPKCS1V1_5SignatureRawCodec.java
deleted file mode 100644
index 548dc3d..0000000
--- a/libjava/classpath/gnu/java/security/sig/rsa/RSAPKCS1V1_5SignatureRawCodec.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/* RSAPKCS1V1_5SignatureRawCodec.java -- Raw RSA PKCS1 v1.5 signature codeec
- Copyright (C) 2006 Free Software Foundation, Inc.
-
-This file is 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, 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; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 51 Franklin Street, 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.java.security.sig.rsa;
-
-import java.io.ByteArrayOutputStream;
-
-import gnu.java.security.Registry;
-import gnu.java.security.sig.ISignatureCodec;
-
-/**
- * An object that implements the {@link ISignatureCodec} operations for the
- * <i>Raw</i> format to use with RSA-PKCS#1 v1.5 signatures.
- */
-public class RSAPKCS1V1_5SignatureRawCodec
- implements ISignatureCodec
-{
- public int getFormatID()
- {
- return RAW_FORMAT;
- }
-
- /**
- * Returns the encoded form of the designated RSA-PKCS#1 (v1.5) signature
- * object according to the <i>Raw</i> format supported by this library.
- * <p>
- * The <i>Raw</i> format for such a signature, in this implementation, is a
- * byte sequence consisting of the following:
- * <p>
- * <ol>
- * <li>4-byte magic consisting of the value of the literal
- * {@link Registry#MAGIC_RAW_RSA_PKCS1V1_5_SIGNATURE},
- * <li>
- * <li>1-byte version consisting of the constant: 0x01,</li>
- * <li>4-byte count of following bytes representing the RSA-PKCS#1 (v1.5)
- * signature bytes in internet order,</li>
- * <li>the RSA-PKCS#1 (v1.5) signature bytes in internet order.</li>
- * </ol>
- *
- * @param signature the signature to encode, consisting of the output of the
- * <code>sign()</code> method of a {@link RSAPKCS1V1_5Signature}
- * instance --a byte array.
- * @return the <i>Raw</i> format encoding of the designated signature.
- * @exception IllegalArgumentException if the designated signature is not an
- * RSA-PKCS#1 (v1.5) one.
- */
- public byte[] encodeSignature(Object signature)
- {
- byte[] buffer;
- try
- {
- buffer = (byte[]) signature;
- }
- catch (Exception x)
- {
- throw new IllegalArgumentException("Signature/codec mismatch");
- }
-
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
- // magic
- baos.write(Registry.MAGIC_RAW_RSA_PKCS1V1_5_SIGNATURE[0]);
- baos.write(Registry.MAGIC_RAW_RSA_PKCS1V1_5_SIGNATURE[1]);
- baos.write(Registry.MAGIC_RAW_RSA_PKCS1V1_5_SIGNATURE[2]);
- baos.write(Registry.MAGIC_RAW_RSA_PKCS1V1_5_SIGNATURE[3]);
-
- // version
- baos.write(0x01);
-
- // signature bytes
- int length = buffer.length;
- baos.write( length >>> 24);
- baos.write((length >>> 16) & 0xFF);
- baos.write((length >>> 8) & 0xFF);
- baos.write( length & 0xFF);
- baos.write(buffer, 0, length);
-
- return baos.toByteArray();
- }
-
- /**
- * Returns the decoded object from a designated input assumed to have been
- * generated by the {@link #encodeSignature(Object)} method.
- *
- * @param input the input bytes of a previously Raw-encoded RSA PKCS1 (v1.5)
- * signature.
- * @return the signature object.
- * @throws IllegalArgumentException if the designated input does not start
- * with the right <i>magic</i> characters, or if the <i>version</i>
- * is not supported.
- */
- public Object decodeSignature(byte[] input)
- {
- // magic
- if (input[0] != Registry.MAGIC_RAW_RSA_PKCS1V1_5_SIGNATURE[0]
- || input[1] != Registry.MAGIC_RAW_RSA_PKCS1V1_5_SIGNATURE[1]
- || input[2] != Registry.MAGIC_RAW_RSA_PKCS1V1_5_SIGNATURE[2]
- || input[3] != Registry.MAGIC_RAW_RSA_PKCS1V1_5_SIGNATURE[3])
- throw new IllegalArgumentException("Signature/codec mismatch");
-
- // version
- if (input[4] != 0x01)
- throw new IllegalArgumentException("Wrong or unsupported format version");
-
- int i = 5;
- int l;
-
- // signature bytes
- l = input[i++] << 24
- | (input[i++] & 0xFF) << 16
- | (input[i++] & 0xFF) << 8
- | (input[i++] & 0xFF);
- byte[] result = new byte[l];
- System.arraycopy(input, i, result, 0, l);
-
- return result;
- }
-}
diff --git a/libjava/classpath/gnu/java/security/sig/rsa/RSAPKCS1V1_5SignatureX509Codec.java b/libjava/classpath/gnu/java/security/sig/rsa/RSAPKCS1V1_5SignatureX509Codec.java
deleted file mode 100644
index ee8586f..0000000
--- a/libjava/classpath/gnu/java/security/sig/rsa/RSAPKCS1V1_5SignatureX509Codec.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/* RSAPSSSignatureX509Codec.java -- X.509 encoder/decoder for RSA signatures
- Copyright (C) 2006 Free Software Foundation, Inc.
-
-This file is 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, 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; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 51 Franklin Street, 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.java.security.sig.rsa;
-
-import gnu.java.security.Registry;
-import gnu.java.security.sig.ISignatureCodec;
-
-import java.security.InvalidParameterException;
-
-/**
- * An implementation of an {@link ISignatureCodec} that knows to encode and
- * decode RSA PKCS1 (v1.5) signatures into the raw bytes which would constitute
- * a DER-encoded form of the ASN.1 structure defined in RFC-2459, and RFC-2313
- * as described in the next paragraphs.
- * <p>
- * Digital signatures when transmitted in an X.509 certificates are encoded
- * in DER (Distinguished Encoding Rules) as a BIT STRING; i.e.
- *
- * <pre>
- * Certificate ::= SEQUENCE {
- * tbsCertificate TBSCertificate,
- * signatureAlgorithm AlgorithmIdentifier,
- * signature BIT STRING
- * }
- * </pre>
- * <p>
- * The output of the encoder, and the input of the decoder, of this codec are
- * then the <i>raw</i> bytes of such a BIT STRING; i.e. not the DER-encoded
- * form itself.
- * <p>
- * Our implementation of the RSA PKCS1 signature algorithm outputs a byte array
- * as the result of generating a digital signature, in accordance with RFC-2313.
- * As a consequence, the encoder and decoder of this codec, simply pass through
- * such a byte array.
- * <p>
- * Client code that needs to build a DER BIT STRING <b>MUST</b> construct such
- * an ASN.1 value. The following is an example of how to do this:
- * <p>
- * <pre>
- * ...
- * import gnu.java.security.der.BitString;
- * import gnu.java.security.der.DER;
- * import gnu.java.security.der.DERValue;
- * ...
- * DERValue bitString = new DERValue(DER.BIT_STRING, new BitString(sigBytes));
- * ...
- * </pre>
- */
-public class RSAPKCS1V1_5SignatureX509Codec
- implements ISignatureCodec
-{
- // default 0-arguments constructor
-
- public int getFormatID()
- {
- return Registry.X509_ENCODING_ID;
- }
-
- /**
- * Encodes an RSA Signature output as a <i>signature</i> BIT STRING as
- * defined in the documentation of this class.
- *
- * @param signature the output of the RSA PKCS1 (v1.5) signature algorithm;
- * i.e. the value returned by the invocation of
- * {@link gnu.java.security.sig.ISignature#sign()} method. In the
- * case of the RSA PKCS1 (v1.5) signature this is an array of bytes.
- * @return the raw bytes of an RSA signature which could be then used as the
- * contents of a BIT STRING as per rfc-2459.
- */
- public byte[] encodeSignature(Object signature)
- {
- byte[] result = (byte[]) signature;
- return result;
- }
-
- /**
- * Decodes a <i>signature</i> as defined in the documentation of this class.
- *
- * @param input the byte array to unmarshall into a valid RSA PKCS1 (v1.5)
- * signature instance; i.e. a byte array. MUST NOT be null.
- * @return an array of raw bytes decoded from the designated input. In the
- * case of RSA PKCS1 (v1.5) this is the same as the input.
- * @throw InvalidParameterException if the <code>input</code> array is null.
- */
- public Object decodeSignature(byte[] input)
- {
- if (input == null)
- throw new InvalidParameterException("Input bytes MUST NOT be null");
-
- return input;
- }
-}
diff --git a/libjava/classpath/gnu/java/security/sig/rsa/RSAPSSSignature.java b/libjava/classpath/gnu/java/security/sig/rsa/RSAPSSSignature.java
deleted file mode 100644
index 7b042f7..0000000
--- a/libjava/classpath/gnu/java/security/sig/rsa/RSAPSSSignature.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/* RSAPSSSignature.java --
- Copyright (C) 2001, 2002, 2003, 2006, 2010 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.java.security.sig.rsa;
-
-import gnu.java.security.Configuration;
-import gnu.java.security.Registry;
-import gnu.java.security.hash.HashFactory;
-import gnu.java.security.hash.IMessageDigest;
-import gnu.java.security.sig.BaseSignature;
-import gnu.java.security.util.Util;
-
-import java.math.BigInteger;
-import java.security.PrivateKey;
-import java.security.PublicKey;
-import java.security.interfaces.RSAPrivateKey;
-import java.security.interfaces.RSAPublicKey;
-import java.util.logging.Logger;
-
-/**
- * The RSA-PSS signature scheme is a public-key encryption scheme combining the
- * RSA algorithm with the Probabilistic Signature Scheme (PSS) encoding method.
- * <p>
- * The inventors of RSA are Ronald L. Rivest, Adi Shamir, and Leonard Adleman,
- * while the inventors of the PSS encoding method are Mihir Bellare and Phillip
- * Rogaway. During efforts to adopt RSA-PSS into the P1363a standards effort,
- * certain adaptations to the original version of RSA-PSS were made by Mihir
- * Bellare and Phillip Rogaway and also by Burt Kaliski (the editor of IEEE
- * P1363a) to facilitate implementation and integration into existing protocols.
- * <p>
- * References:
- * <ol>
- * <li><a
- * href="http://www.cosic.esat.kuleuven.ac.be/nessie/workshop/submissions/rsa-pss.zip">
- * RSA-PSS Signature Scheme with Appendix, part B.</a><br>
- * Primitive specification and supporting documentation.<br>
- * Jakob Jonsson and Burt Kaliski.</li>
- * </ol>
- */
-public class RSAPSSSignature
- extends BaseSignature
-{
- private static final Logger log = Configuration.DEBUG ?
- Logger.getLogger(RSAPSSSignature.class.getName()) : null;
-
- /** The underlying EMSA-PSS instance for this object. */
- private EMSA_PSS pss;
-
- /** The desired length in octets of the EMSA-PSS salt. */
- private int sLen;
-
- /**
- * Default 0-arguments constructor. Uses SHA-1 as the default hash and a
- * 0-octet <i>salt</i>.
- */
- public RSAPSSSignature()
- {
- this(Registry.SHA160_HASH, 0);
- }
-
- /**
- * Constructs an instance of this object using the designated message digest
- * algorithm as its underlying hash function, and having 0-octet <i>salt</i>.
- *
- * @param mdName the canonical name of the underlying hash function.
- */
- public RSAPSSSignature(String mdName)
- {
- this(mdName, 0);
- }
-
- /**
- * Constructs an instance of this object using the designated message digest
- * algorithm as its underlying hash function.
- *
- * @param mdName the canonical name of the underlying hash function.
- * @param sLen the desired length in octets of the salt to use for encoding /
- * decoding signatures.
- */
- public RSAPSSSignature(String mdName, int sLen)
- {
- this(HashFactory.getInstance(mdName), sLen);
- }
-
- public RSAPSSSignature(IMessageDigest md, int sLen)
- {
- super(Registry.RSA_PSS_SIG, md);
-
- pss = EMSA_PSS.getInstance(md.name());
- this.sLen = sLen;
- }
-
- /** Private constructor for cloning purposes. */
- private RSAPSSSignature(RSAPSSSignature that)
- {
- this(that.md.name(), that.sLen);
-
- this.publicKey = that.publicKey;
- this.privateKey = that.privateKey;
- this.md = (IMessageDigest) that.md.clone();
- this.pss = (EMSA_PSS) that.pss.clone();
- }
-
- public Object clone()
- {
- return new RSAPSSSignature(this);
- }
-
- protected void setupForVerification(PublicKey k)
- throws IllegalArgumentException
- {
- if (! (k instanceof RSAPublicKey))
- throw new IllegalArgumentException();
-
- publicKey = (RSAPublicKey) k;
- }
-
- protected void setupForSigning(PrivateKey k) throws IllegalArgumentException
- {
- if (! (k instanceof RSAPrivateKey))
- throw new IllegalArgumentException();
-
- privateKey = (RSAPrivateKey) k;
- }
-
- protected Object generateSignature() throws IllegalStateException
- {
- // 1. Apply the EMSA-PSS encoding operation to the message M to produce an
- // encoded message EM of length CEILING((modBits ? 1)/8) octets such
- // that the bit length of the integer OS2IP(EM) is at most modBits ? 1:
- // EM = EMSA-PSS-Encode(M,modBits ? 1).
- // Note that the octet length of EM will be one less than k if
- // modBits ? 1 is divisible by 8. If the encoding operation outputs
- // 'message too long' or 'encoding error,' then output 'message too
- // long' or 'encoding error' and stop.
- int modBits = ((RSAPrivateKey) privateKey).getModulus().bitLength();
- byte[] salt = new byte[sLen];
- this.nextRandomBytes(salt);
- byte[] EM = pss.encode(md.digest(), modBits - 1, salt);
- if (Configuration.DEBUG)
- log.fine("EM (sign): " + Util.toString(EM));
- // 2. Convert the encoded message EM to an integer message representative
- // m (see Section 1.2.2): m = OS2IP(EM).
- BigInteger m = new BigInteger(1, EM);
- // 3. Apply the RSASP signature primitive to the public key K and the
- // message representative m to produce an integer signature
- // representative s: s = RSASP(K,m).
- BigInteger s = RSA.sign(privateKey, m);
- // 4. Convert the signature representative s to a signature S of length k
- // octets (see Section 1.2.1): S = I2OSP(s, k).
- // 5. Output the signature S.
- int k = (modBits + 7) / 8;
- // return encodeSignature(s, k);
- return RSA.I2OSP(s, k);
- }
-
- protected boolean verifySignature(Object sig) throws IllegalStateException
- {
- if (publicKey == null)
- throw new IllegalStateException();
- // byte[] S = decodeSignature(sig);
- byte[] S = (byte[]) sig;
- // 1. If the length of the signature S is not k octets, output 'signature
- // invalid' and stop.
- int modBits = ((RSAPublicKey) publicKey).getModulus().bitLength();
- int k = (modBits + 7) / 8;
- if (S.length != k)
- return false;
- // 2. Convert the signature S to an integer signature representative s:
- // s = OS2IP(S).
- BigInteger s = new BigInteger(1, S);
- // 3. Apply the RSAVP verification primitive to the public key (n, e) and
- // the signature representative s to produce an integer message
- // representative m: m = RSAVP((n, e), s).
- // If RSAVP outputs 'signature representative out of range,' then
- // output 'signature invalid' and stop.
- BigInteger m = null;
- try
- {
- m = RSA.verify(publicKey, s);
- }
- catch (IllegalArgumentException x)
- {
- return false;
- }
- // 4. Convert the message representative m to an encoded message EM of
- // length emLen = CEILING((modBits - 1)/8) octets, where modBits is
- // equal to the bit length of the modulus: EM = I2OSP(m, emLen).
- // Note that emLen will be one less than k if modBits - 1 is divisible
- // by 8. If I2OSP outputs 'integer too large,' then output 'signature
- // invalid' and stop.
- int emBits = modBits - 1;
- int emLen = (emBits + 7) / 8;
- byte[] EM = m.toByteArray();
- if (Configuration.DEBUG)
- log.fine("EM (verify): " + Util.toString(EM));
- if (EM.length > emLen)
- return false;
- else if (EM.length < emLen)
- {
- byte[] newEM = new byte[emLen];
- System.arraycopy(EM, 0, newEM, emLen - EM.length, EM.length);
- EM = newEM;
- }
- // 5. Apply the EMSA-PSS decoding operation to the message M and the
- // encoded message EM: Result = EMSA-PSS-Decode(M, EM, emBits). If
- // Result = 'consistent,' output 'signature verified.' Otherwise,
- // output 'signature invalid.'
- byte[] mHash = md.digest();
- boolean result = false;
- try
- {
- result = pss.decode(mHash, EM, emBits, sLen);
- }
- catch (IllegalArgumentException x)
- {
- result = false;
- }
- return result;
- }
-}
diff --git a/libjava/classpath/gnu/java/security/sig/rsa/RSAPSSSignatureRawCodec.java b/libjava/classpath/gnu/java/security/sig/rsa/RSAPSSSignatureRawCodec.java
deleted file mode 100644
index b147ea3..0000000
--- a/libjava/classpath/gnu/java/security/sig/rsa/RSAPSSSignatureRawCodec.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/* RSAPSSSignatureRawCodec.java --
- Copyright (C) 2001, 2002, 2003, 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.java.security.sig.rsa;
-
-import gnu.java.security.Registry;
-import gnu.java.security.sig.ISignatureCodec;
-
-import java.io.ByteArrayOutputStream;
-
-/**
- * An object that implements the {@link ISignatureCodec} operations for the
- * <i>Raw</i> format to use with RSA-PSS signatures.
- */
-public class RSAPSSSignatureRawCodec
- implements ISignatureCodec
-{
- // implicit 0-arguments constructor
-
- public int getFormatID()
- {
- return RAW_FORMAT;
- }
-
- /**
- * Returns the encoded form of the designated RSA-PSS signature object
- * according to the <i>Raw</i> format supported by this library.
- * <p>
- * The <i>Raw</i> format for an RSA-PSS signature, in this implementation, is
- * a byte sequence consisting of the following:
- * <ol>
- * <li>4-byte magic consisting of the value of the literal
- * {@link Registry#MAGIC_RAW_RSA_PSS_SIGNATURE},
- * <li>
- * <li>1-byte version consisting of the constant: 0x01,</li>
- * <li>4-byte count of following bytes representing the RSA-PSS signature
- * bytes in internet order,</li>
- * <li>the RSA-PSS signature bytes in internet order.</li>
- * </ol>
- *
- * @param signature the signature to encode, consisting of the output of the
- * <code>sign()</code> method of a {@link RSAPSSSignature} instance
- * --a byte array.
- * @return the <i>Raw</i> format encoding of the designated signature.
- * @exception IllegalArgumentException if the designated signature is not an
- * RSA-PSS one.
- */
- public byte[] encodeSignature(Object signature)
- {
- byte[] buffer;
- try
- {
- buffer = (byte[]) signature;
- }
- catch (Exception x)
- {
- throw new IllegalArgumentException("signature");
- }
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- // magic
- baos.write(Registry.MAGIC_RAW_RSA_PSS_SIGNATURE[0]);
- baos.write(Registry.MAGIC_RAW_RSA_PSS_SIGNATURE[1]);
- baos.write(Registry.MAGIC_RAW_RSA_PSS_SIGNATURE[2]);
- baos.write(Registry.MAGIC_RAW_RSA_PSS_SIGNATURE[3]);
- // version
- baos.write(0x01);
- // signature bytes
- int length = buffer.length;
- baos.write( length >>> 24);
- baos.write((length >>> 16) & 0xFF);
- baos.write((length >>> 8) & 0xFF);
- baos.write(length & 0xFF);
- baos.write(buffer, 0, length);
- return baos.toByteArray();
- }
-
- public Object decodeSignature(byte[] k)
- {
- // magic
- if (k[0] != Registry.MAGIC_RAW_RSA_PSS_SIGNATURE[0]
- || k[1] != Registry.MAGIC_RAW_RSA_PSS_SIGNATURE[1]
- || k[2] != Registry.MAGIC_RAW_RSA_PSS_SIGNATURE[2]
- || k[3] != Registry.MAGIC_RAW_RSA_PSS_SIGNATURE[3])
- throw new IllegalArgumentException("magic");
- // version
- if (k[4] != 0x01)
- throw new IllegalArgumentException("version");
- int i = 5;
- int l;
- // signature bytes
- l = k[i++] << 24
- | (k[i++] & 0xFF) << 16
- | (k[i++] & 0xFF) << 8
- | (k[i++] & 0xFF);
- byte[] result = new byte[l];
- System.arraycopy(k, i, result, 0, l);
- return result;
- }
-}
diff --git a/libjava/classpath/gnu/java/security/sig/rsa/RSASignatureFactory.java b/libjava/classpath/gnu/java/security/sig/rsa/RSASignatureFactory.java
deleted file mode 100644
index ba5121b..0000000
--- a/libjava/classpath/gnu/java/security/sig/rsa/RSASignatureFactory.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/* RSASignatureFactory.java -- A Factory class to instantiate RSA Signatures
- Copyright (C) 2006 Free Software Foundation, Inc.
-
-This file is 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, 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; see the file COPYING. If not, write to the
-Free Software Foundation, Inc., 51 Franklin Street, 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.java.security.sig.rsa;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import gnu.java.security.Registry;
-import gnu.java.security.hash.HashFactory;
-import gnu.java.security.hash.IMessageDigest;
-import gnu.java.security.sig.ISignature;
-
-/**
- * A Factory class to instantiate RSA Signature classes.
- */
-public class RSASignatureFactory
-{
- private static Set names;
-
- /**
- * Private constructor to enforce usage through Factory (class) methods.
- */
- private RSASignatureFactory()
- {
- super();
- }
-
- /**
- * Returns a new instance of an RSA Signature given its name. The name of an
- * RSA Signature always starts with <code>rsa-</code>, followed by either
- * <code>pss</code> or <code>pkcs1_v1.5</code>. An optional message digest
- * name, to be used with the RSA signature may be specified by appending the
- * hyphen chanaracter <code>-</code> followed by the canonical message digest
- * algorithm name. When no message digest algorithm name is given, SHA-160 is
- * used.
- *
- * @param name the composite RSA signature name.
- * @return a new instance of an RSA Signature algorithm implementation.
- * Returns <code>null</code> if the given name does not correspond to any
- * supported RSA Signature encoding and message digest combination.
- */
- public static final ISignature getInstance(String name)
- {
- if (name == null)
- return null;
-
- name = name.trim();
- if (name.length() == 0)
- return null;
-
- name = name.toLowerCase();
- if (! name.startsWith(Registry.RSA_SIG_PREFIX))
- return null;
-
- name = name.substring(Registry.RSA_SIG_PREFIX.length()).trim();
- if (name.startsWith(Registry.RSA_PSS_ENCODING))
- return getPSSSignature(name);
- else if (name.startsWith(Registry.RSA_PKCS1_V1_5_ENCODING))
- return getPKCS1Signature(name);
- else
- return null;
- }
-
- /**
- * Returns a {@link Set} of names of <i>RSA</i> signatures supported by this
- * <i>Factory</i>.
- *
- * @return a {@link Set} of RSA Signature algorithm names (Strings).
- */
- public static synchronized final Set getNames()
- {
- if (names == null)
- {
- Set hashNames = HashFactory.getNames();
- HashSet hs = new HashSet();
- for (Iterator it = hashNames.iterator(); it.hasNext();)
- {
- String mdName = (String) it.next();
- hs.add(Registry.RSA_PSS_SIG + "-" + mdName);
- }
-
- hs.add(Registry.RSA_PKCS1_V1_5_SIG + "-" + Registry.MD2_HASH);
- hs.add(Registry.RSA_PKCS1_V1_5_SIG + "-" + Registry.MD5_HASH);
- hs.add(Registry.RSA_PKCS1_V1_5_SIG + "-" + Registry.SHA160_HASH);
- hs.add(Registry.RSA_PKCS1_V1_5_SIG + "-" + Registry.SHA256_HASH);
- hs.add(Registry.RSA_PKCS1_V1_5_SIG + "-" + Registry.SHA384_HASH);
- hs.add(Registry.RSA_PKCS1_V1_5_SIG + "-" + Registry.SHA512_HASH);
-
- names = Collections.unmodifiableSet(hs);
- }
-
- return names;
- }
-
- private static final ISignature getPSSSignature(String name)
- {
- name = name.substring(Registry.RSA_PSS_ENCODING.length()).trim();
- // remove the hyphen if found at the beginning
- if (name.startsWith("-"))
- name = name.substring(1).trim();
-
- IMessageDigest md;
- if (name.length() == 0)
- md = HashFactory.getInstance(Registry.SHA160_HASH);
- else
- {
- // check if there is such a hash
- md = HashFactory.getInstance(name);
- if (md == null)
- return null;
- }
-
- ISignature result = new RSAPSSSignature(md, 0);
- return result;
- }
-
- private static final ISignature getPKCS1Signature(String name)
- {
- name = name.substring(Registry.RSA_PKCS1_V1_5_ENCODING.length()).trim();
- // remove the hyphen if found at the beginning
- if (name.startsWith("-"))
- name = name.substring(1).trim();
-
- IMessageDigest md;
- if (name.length() == 0)
- md = HashFactory.getInstance(Registry.SHA160_HASH);
- else
- {
- // check if there is such a hash
- md = HashFactory.getInstance(name);
- if (md == null)
- return null;
- }
-
- ISignature result = new RSAPKCS1V1_5Signature(md);
- return result;
- }
-}