You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ml...@apache.org on 2006/10/12 17:30:47 UTC
svn commit: r463279 - in
/incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security:
./ internal/nls/ pkcs8/ provider/crypto/
Author: mloenko
Date: Thu Oct 12 08:30:46 2006
New Revision: 463279
URL: http://svn.apache.org/viewvc?view=rev&rev=463279
Log:
intergated HARMONY-1837
[classlib][security] crypto provider: DSAKeyFactory implementation
some changes were made:
moved a package-access class to a separate file to not break "ant clean"
excluded newly integrated DASKeyFactory from the crypto provider to not cause
test failures. more investigation is needed
Added:
incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/PrivateKeyImpl.java (with props)
incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/pkcs8/PrivateKeyInfo.java (with props)
incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/DSAKeyFactoryImpl.java (with props)
incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/DSAPrivateKeyImpl.java (with props)
incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/DSAPublicKeyImpl.java (with props)
incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/ThreeIntegerSequence.java (with props)
Modified:
incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/PublicKeyImpl.java
incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/internal/nls/messages.properties
incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/CryptoProvider.java
Added: incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/PrivateKeyImpl.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/PrivateKeyImpl.java?view=auto&rev=463279
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/PrivateKeyImpl.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/PrivateKeyImpl.java Thu Oct 12 08:30:46 2006
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package org.apache.harmony.security;
+
+import java.security.PrivateKey;
+
+/**
+ * PrivateKeyImpl
+ */
+public class PrivateKeyImpl implements PrivateKey {
+
+ /*
+ * @serial
+ */
+ private static final long serialVersionUID = 7776497482533790279L;
+
+ private String algorithm;
+
+ private byte[] encoding;
+
+ public PrivateKeyImpl(String algorithm) {
+ this.algorithm = algorithm;
+ }
+
+ public String getAlgorithm() {
+ return algorithm;
+ }
+
+ public String getFormat() {
+ return "PKCS#8"; //$NON-NLS-1$
+ }
+
+ public byte[] getEncoded() {
+
+ byte[] toReturn = new byte[encoding.length];
+ System.arraycopy(encoding, 0, toReturn, 0, encoding.length);
+
+ return toReturn;
+ }
+
+ public void setAlgorithm(String algorithm) {
+ this.algorithm = algorithm;
+ }
+
+ public void setEncoding(byte[] encoding) {
+ this.encoding = new byte[encoding.length];
+ System.arraycopy(encoding, 0, this.encoding, 0, encoding.length);
+ }
+
+}
Propchange: incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/PrivateKeyImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/PublicKeyImpl.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/PublicKeyImpl.java?view=diff&rev=463279&r1=463278&r2=463279
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/PublicKeyImpl.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/PublicKeyImpl.java Thu Oct 12 08:30:46 2006
@@ -15,17 +15,11 @@
* limitations under the License.
*/
-/**
-* @author Alexander Y. Kleymenov
-* @version $Revision$
-*/
package org.apache.harmony.security;
import java.security.PublicKey;
-import java.util.Arrays;
-import org.apache.harmony.crypto.utils.AlgNameMapper;
/**
* PublicKeyImpl
@@ -37,46 +31,42 @@
*/
private static final long serialVersionUID = 7179022516819534075L;
- private final byte[] encoding;
- private final String algorithm;
-
- /**
- * Constructs the PublicKey instance with specified algorithm oid
- * and ASN.1 DER encoded form of SubjectPublicKeyInfo structure
- * which is ASN.1 data format for public keys in X.509 standard.
- * @param oid : String
- * @param encoding : byte[]
- */
- public PublicKeyImpl(String oid, byte[] encoding) {
- this.encoding = new byte[encoding.length];
- System.arraycopy(encoding, 0, this.encoding, 0, encoding.length);
- String alg = AlgNameMapper.map2AlgName(oid);
- algorithm = (alg == null) ? oid : alg;
+
+ private byte[] encoding;
+
+ private String algorithm;
+
+
+ public PublicKeyImpl(String algorithm) {
+ this.algorithm = algorithm;
}
+
public String getAlgorithm() {
return algorithm;
}
+
public String getFormat() {
return "X.509"; //$NON-NLS-1$
}
+
public byte[] getEncoded() {
byte[] result = new byte[encoding.length];
System.arraycopy(encoding, 0, result, 0, encoding.length);
return result;
}
- public boolean equals(Object other) {
- if (other == this) {
- return true;
- }
- if (!(other instanceof PublicKey)) {
- return false;
- }
- PublicKey obj = (PublicKey) other;
- return Arrays.equals(encoding, obj.getEncoded());
+
+ public void setAlgorithm(String algorithm) {
+ this.algorithm = algorithm;
+ }
+
+
+ public void setEncoding(byte[] encoding) {
+ this.encoding = new byte[encoding.length];
+ System.arraycopy(encoding, 0, this.encoding, 0, encoding.length);
}
}
Modified: incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/internal/nls/messages.properties
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/internal/nls/messages.properties?view=diff&rev=463279&r1=463278&r2=463279
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/internal/nls/messages.properties (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/internal/nls/messages.properties Thu Oct 12 08:30:46 2006
@@ -333,3 +333,12 @@
security.9D=ObjectIdentifier string is null
security.9E=Incorrect syntax
security.9F=Implicit tagging can not be used for ASN.1 ANY or CHOICE type
+security.19A=Failed to decode keySpec encoding: {0}
+security.19B=Failed to decode parameters: {0}
+security.19C='keySpec' is neither DSAPrivateKeySpec nor PKCS8EncodedKeySpec
+security.19D='keySpec' is neither DSAPublicKeySpec nor X509EncodedKeySpec
+security.19E=null is passed to the 'keySpec' argument
+security.19F='key' is neither DSAPublicKey nor DSAPrivateKey
+security.1A0=ATTENTION: InvalidKeySpecException in engineGeneratePrivate: {0}
+security.1A1=ATTENTION: InvalidKeySpecException in engineGeneratePublic: {0}
+
Added: incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/pkcs8/PrivateKeyInfo.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/pkcs8/PrivateKeyInfo.java?view=auto&rev=463279
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/pkcs8/PrivateKeyInfo.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/pkcs8/PrivateKeyInfo.java Thu Oct 12 08:30:46 2006
@@ -0,0 +1,154 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package org.apache.harmony.security.pkcs8;
+
+import org.apache.harmony.security.asn1.ASN1Implicit;
+import org.apache.harmony.security.asn1.ASN1Integer;
+import org.apache.harmony.security.asn1.ASN1OctetString;
+import org.apache.harmony.security.asn1.ASN1Sequence;
+import org.apache.harmony.security.asn1.ASN1SetOf;
+import org.apache.harmony.security.asn1.ASN1Type;
+import org.apache.harmony.security.asn1.BerInputStream;
+
+import org.apache.harmony.security.x501.AttributeTypeAndValue;
+
+import org.apache.harmony.security.x509.AlgorithmIdentifier;
+
+import java.util.List;
+
+/**
+ * The class implements the ASN.1 DER encoding and decoding of the PKCS#8
+ * PrivateKeyInfo having the following ASN.1 notation:
+ *
+ * PrivateKeyInfo ::= SEQUENCE {
+ * version Version,
+ * privateKeyAlgorithm PrivateKeyAlgorithmIdentifier,
+ * privateKey PrivateKey,
+ * attributes [0] IMPLICIT Attributes OPTIONAL }
+ *
+ * Version ::= INTEGER
+ *
+ * PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier
+ *
+ * PrivateKey ::= OCTET STRING
+ *
+ * Attributes ::= SET OF Attribute
+ */
+
+public class PrivateKeyInfo {
+
+ private int version;
+
+ private AlgorithmIdentifier privateKeyAlgorithm;
+
+ private byte[] privateKey;
+
+ private List attributes;
+
+ private byte[] encoding;
+
+ public PrivateKeyInfo(int version, AlgorithmIdentifier privateKeyAlgorithm,
+ byte[] privateKey, List attributes) {
+
+ this.version = version;
+ this.privateKeyAlgorithm = privateKeyAlgorithm;
+ this.privateKey = privateKey;
+ this.attributes = attributes;
+ }
+
+ private PrivateKeyInfo(int version,
+ AlgorithmIdentifier privateKeyAlgorithm, byte[] privateKey,
+ List attributes, byte[] encoding) {
+ this(version, privateKeyAlgorithm, privateKey, attributes);
+ this.encoding = encoding;
+ }
+
+ /**
+ * @return Returns version.
+ */
+ public int getVersion() {
+ return version;
+ }
+
+ /**
+ * @return Returns AlgorithmIdentifier.
+ */
+ public AlgorithmIdentifier getAlgorithmIdentifier() {
+ return privateKeyAlgorithm;
+ }
+
+ /**
+ * @return Returns List of attributes.
+ */
+ public List getAttributes() {
+ return attributes;
+ }
+
+ /**
+ * @return Returns the OCTET STRING.
+ */
+ public byte[] getPrivateKey() {
+ return privateKey;
+ }
+
+ /**
+ * Returns ASN.1 encoded form of this PrivateKeyInfo.
+ * @return a byte array containing ASN.1 encode form.
+ */
+ public byte[] getEncoded() {
+ if (encoding == null) {
+ encoding = ASN1.encode(this);
+ }
+ return encoding;
+ }
+
+ public static final ASN1Sequence ASN1 = new ASN1Sequence(new ASN1Type[] {
+
+ ASN1Integer.getInstance(), // version
+ AlgorithmIdentifier.ASN1, // AlgorithmIdentifier
+ ASN1OctetString.getInstance(), // privateKey
+
+ new ASN1Implicit(0, new ASN1SetOf(AttributeTypeAndValue.ASN1)) // attributes
+ }) {
+
+ {
+ setOptional(3); // attributes are OPTIONAL
+ }
+
+ protected Object getDecodedObject(BerInputStream in) {
+
+ Object[] values = (Object[]) in.content;
+
+ return new PrivateKeyInfo(ASN1Integer.toIntValue(values[0]),
+ (AlgorithmIdentifier) values[1], (byte[]) values[2],
+ (List) values[3], in.getEncoded());
+ }
+
+ protected void getValues(Object object, Object[] values) {
+
+ PrivateKeyInfo privateKeyInfo = (PrivateKeyInfo) object;
+
+ values[0] = ASN1Integer.fromIntValue(privateKeyInfo.version);
+ values[1] = privateKeyInfo.privateKeyAlgorithm;
+ values[2] = privateKeyInfo.privateKey;
+ values[3] = privateKeyInfo.attributes;
+ }
+ };
+
+}
Propchange: incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/pkcs8/PrivateKeyInfo.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/CryptoProvider.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/CryptoProvider.java?view=diff&rev=463279&r1=463278&r2=463279
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/CryptoProvider.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/CryptoProvider.java Thu Oct 12 08:30:46 2006
@@ -49,6 +49,10 @@
final String SIGN_ALIAS = "SHA1withDSA"; //$NON-NLS-1$
+
+ final String KEYF_NAME =
+ "org.apache.harmony.security.provider.crypto.DSAKeyFactoryImpl"; //$NON-NLS-1$
+
AccessController.doPrivileged(new java.security.PrivilegedAction() {
public Object run() {
@@ -77,6 +81,11 @@
put("Alg.Alias.Signature.1.2.840.10040.4.3", SIGN_ALIAS); //$NON-NLS-1$
put("Alg.Alias.Signature.1.3.14.3.2.13", SIGN_ALIAS); //$NON-NLS-1$
put("Alg.Alias.Signature.1.3.14.3.2.27", SIGN_ALIAS); //$NON-NLS-1$
+
+// put("KeyFactory.DSA", KEYF_NAME); //$NON-NLS-1$
+// put("KeyFactory.DSA ImplementedIn", "Software"); //$NON-NLS-1$ //$NON-NLS-2$
+// put("Alg.Alias.KeyFactory.1.3.14.3.2.12", "DSA"); //$NON-NLS-1$ //$NON-NLS-2$
+// put("Alg.Alias.KeyFactory.1.2.840.10040.4.1", "DSA"); //$NON-NLS-1$ //$NON-NLS-2$
return null;
}
Added: incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/DSAKeyFactoryImpl.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/DSAKeyFactoryImpl.java?view=auto&rev=463279
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/DSAKeyFactoryImpl.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/DSAKeyFactoryImpl.java Thu Oct 12 08:30:46 2006
@@ -0,0 +1,249 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package org.apache.harmony.security.provider.crypto;
+
+import java.io.IOException;
+
+import java.math.BigInteger;
+
+import java.security.KeyFactorySpi;
+import java.security.Key;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.InvalidKeyException;
+
+import java.security.spec.KeySpec;
+import java.security.spec.DSAParameterSpec;
+import java.security.spec.DSAPrivateKeySpec;
+import java.security.spec.DSAPublicKeySpec;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+
+import java.security.interfaces.DSAParams;
+import java.security.interfaces.DSAPrivateKey;
+import java.security.interfaces.DSAPublicKey;
+
+import org.apache.harmony.security.provider.crypto.DSAPrivateKeyImpl;
+import org.apache.harmony.security.provider.crypto.DSAPublicKeyImpl;
+
+import org.apache.harmony.security.asn1.ASN1Sequence;
+import org.apache.harmony.security.asn1.ASN1Integer;
+import org.apache.harmony.security.asn1.ASN1Type;
+import org.apache.harmony.security.asn1.BerInputStream;
+import org.apache.harmony.security.asn1.ASN1BitString;
+import org.apache.harmony.security.asn1.BitString;
+import org.apache.harmony.security.asn1.ASN1OctetString;
+
+import org.apache.harmony.security.internal.nls.Messages;
+
+import org.apache.harmony.crypto.utils.AlgNameMapper;
+
+public class DSAKeyFactoryImpl extends KeyFactorySpi {
+
+ /**
+ * The method generates a DSAPrivateKey object from the provided key specification.
+ *
+ * @param
+ * keySpec - the specification (key material) for the DSAPrivateKey.
+ *
+ * @return
+ * a DSAPrivateKey object
+ *
+ * @throws InvalidKeySpecException
+ * if "keySpec" is neither DSAPrivateKeySpec nor PKCS8EncodedKeySpec
+ */
+ protected PrivateKey engineGeneratePrivate(KeySpec keySpec)
+ throws InvalidKeySpecException {
+
+ if (keySpec != null) {
+ if (keySpec instanceof DSAPrivateKeySpec) {
+
+ return new DSAPrivateKeyImpl((DSAPrivateKeySpec) keySpec);
+ }
+ if (keySpec instanceof PKCS8EncodedKeySpec) {
+
+ return new DSAPrivateKeyImpl((PKCS8EncodedKeySpec) keySpec);
+ }
+ }
+ throw new InvalidKeySpecException(Messages.getString("security.19C")); //$NON-NLS-1$
+ }
+
+ /**
+ * The method generates a DSAPublicKey object from the provided key specification.
+ *
+ * @param
+ * keySpec - the specification (key material) for the DSAPublicKey.
+ *
+ * @return
+ * a DSAPublicKey object
+ *
+ * @throws InvalidKeySpecException
+ * if "keySpec" is neither DSAPublicKeySpec nor X509EncodedKeySpec
+ */
+ protected PublicKey engineGeneratePublic(KeySpec keySpec)
+ throws InvalidKeySpecException {
+
+ if (keySpec != null) {
+ if (keySpec instanceof DSAPublicKeySpec) {
+
+ return new DSAPublicKeyImpl((DSAPublicKeySpec) keySpec);
+ }
+ if (keySpec instanceof X509EncodedKeySpec) {
+
+ return new DSAPublicKeyImpl((X509EncodedKeySpec) keySpec);
+ }
+ }
+ throw new InvalidKeySpecException(Messages.getString("security.19D")); //$NON-NLS-1$
+ }
+
+ /**
+ * The method returns a specification (key material) of the given key object.
+ * 'keySpec' identifies the specification class
+ * in which the key material should be returned.
+ *
+ * If it is DSAPublicKeySpec.class, the key material should be returned
+ * in an instance of the DSAPublicKeySpec class;
+ * if it is DSAPrivateKeySpec.class, the key material should be returned
+ * in an instance of the DSAPrivateKeySpec class.
+ *
+ * @param
+ * key - either DSAPrivateKey or DSAPublicKey
+ * @param
+ * keySpec - either DSAPublicKeySpec.class or DSAPublicKeySpec.class
+ *
+ * @return
+ * either DSAPublicKeySpec object or DSAPublicKeySpec object
+ *
+ * @throws InvalidKeySpecException
+ * if "keySpec" is not s specification for DSAPublicKey or DSAPrivateKey
+ *
+ */
+ protected <T extends KeySpec> T engineGetKeySpec(Key key, Class<T> keySpec)
+ throws InvalidKeySpecException {
+
+ BigInteger p, q, g, x, y;
+
+ if (key != null) {
+ if (keySpec == null) {
+ throw new NullPointerException(Messages
+ .getString("security.19E")); //$NON-NLS-1$
+ }
+ if (key instanceof DSAPrivateKey) {
+ DSAPrivateKey privateKey = (DSAPrivateKey) key;
+
+ if (keySpec.equals(DSAPrivateKeySpec.class)) {
+
+ x = privateKey.getX();
+
+ DSAParams params = privateKey.getParams();
+
+ p = params.getP();
+ q = params.getQ();
+ g = params.getG();
+
+ return (T) (new DSAPrivateKeySpec(x, p, q, g));
+ }
+
+ if (keySpec.equals(PKCS8EncodedKeySpec.class)) {
+ return (T) (new PKCS8EncodedKeySpec(key.getEncoded()));
+ }
+
+ throw new InvalidKeySpecException(Messages
+ .getString("security.19C")); //$NON-NLS-1$
+ }
+
+ if (key instanceof DSAPublicKey) {
+ DSAPublicKey publicKey = (DSAPublicKey) key;
+
+ if (keySpec.equals(DSAPublicKeySpec.class)) {
+
+ y = publicKey.getY();
+
+ DSAParams params = publicKey.getParams();
+
+ p = params.getP();
+ q = params.getQ();
+ g = params.getG();
+
+ return (T) (new DSAPublicKeySpec(y, p, q, g));
+ }
+
+ if (keySpec.equals(X509EncodedKeySpec.class)) {
+ return (T) (new X509EncodedKeySpec(key.getEncoded()));
+ }
+
+ throw new InvalidKeySpecException(Messages
+ .getString("security.19D")); //$NON-NLS-1$
+ }
+ }
+ throw new InvalidKeySpecException(Messages.getString("security.19F")); //$NON-NLS-1$
+ }
+
+ /**
+ * The method generates a DSAPublicKey object from the provided key.
+ *
+ * @param
+ * key - a DSAPublicKey object or DSAPrivateKey object.
+ *
+ * @return
+ * object of the same type as the "key" argument
+ *
+ * @throws InvalidKeyException
+ * if "key" is neither DSAPublicKey nor DSAPrivateKey
+ */
+ protected Key engineTranslateKey(Key key) throws InvalidKeyException {
+
+ if (key != null) {
+ if (key instanceof DSAPrivateKey) {
+
+ DSAPrivateKey privateKey = (DSAPrivateKey) key;
+ DSAParams params = privateKey.getParams();
+
+ try {
+ return engineGeneratePrivate(new DSAPrivateKeySpec(
+ privateKey.getX(), params.getP(), params.getQ(),
+ params.getG()));
+ } catch (InvalidKeySpecException e) {
+ // Actually this exception shouldn't be thrown
+ throw new InvalidKeyException(Messages.getString(
+ "security.1A0", e)); //$NON-NLS-1$
+ }
+ }
+
+ if (key instanceof DSAPublicKey) {
+
+ DSAPublicKey publicKey = (DSAPublicKey) key;
+ DSAParams params = publicKey.getParams();
+
+ try {
+ return engineGeneratePublic(new DSAPublicKeySpec(publicKey
+ .getY(), params.getP(), params.getQ(), params
+ .getG()));
+ } catch (InvalidKeySpecException e) {
+ // Actually this exception shouldn't be thrown
+ throw new InvalidKeyException(Messages.getString(
+ "security.1A1", e)); //$NON-NLS-1$
+ }
+ }
+ }
+ throw new InvalidKeyException(Messages.getString("security.19F")); //$NON-NLS-1$
+ }
+
+}
Propchange: incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/DSAKeyFactoryImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/DSAPrivateKeyImpl.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/DSAPrivateKeyImpl.java?view=auto&rev=463279
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/DSAPrivateKeyImpl.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/DSAPrivateKeyImpl.java Thu Oct 12 08:30:46 2006
@@ -0,0 +1,157 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+ /*
+ * TODO
+ * 1. The class extends the PrivateKeyImpl class in "org.apache.harmony.security" package.
+ *
+ * 2. See a compatibility with RI comments
+ * in the below "DSAPrivateKeyImpl(PKCS8EncodedKeySpec keySpec)" constructor.
+ */
+
+
+package org.apache.harmony.security.provider.crypto;
+
+import java.io.IOException;
+import java.math.BigInteger;
+import java.security.interfaces.DSAParams;
+import java.security.interfaces.DSAPrivateKey;
+import java.security.spec.DSAParameterSpec;
+import java.security.spec.DSAPrivateKeySpec;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.PKCS8EncodedKeySpec;
+
+import org.apache.harmony.crypto.utils.AlgNameMapper;
+import org.apache.harmony.security.PrivateKeyImpl;
+import org.apache.harmony.security.asn1.ASN1Integer;
+import org.apache.harmony.security.internal.nls.Messages;
+import org.apache.harmony.security.pkcs8.PrivateKeyInfo;
+import org.apache.harmony.security.x509.AlgorithmIdentifier;
+
+/**
+ * The class provides DSAPrivateKey functionality by extending a class implementing PrivateKey
+ * and implementing methods defined in both interfaces, DSAKey and DSAPrivateKey
+ */
+public class DSAPrivateKeyImpl extends PrivateKeyImpl implements DSAPrivateKey {
+
+ /**
+ * @serial
+ */
+ private static final long serialVersionUID = -4716227614104950081L;
+
+ private BigInteger x;
+
+ private DSAParams params;
+
+ /**
+ * Creates object from DSAPrivateKeySpec.
+ *
+ * @param keySpec - a DSAPrivateKeySpec object
+ */
+ public DSAPrivateKeyImpl(DSAPrivateKeySpec keySpec) {
+
+ super("DSA"); //$NON-NLS-1$
+
+ PrivateKeyInfo pki;
+
+ BigInteger g = keySpec.getG();
+ BigInteger p = keySpec.getP();
+ BigInteger q = keySpec.getQ();
+
+ ThreeIntegerSequence threeInts = new ThreeIntegerSequence(p
+ .toByteArray(), q.toByteArray(), g.toByteArray());
+
+ AlgorithmIdentifier ai = new AlgorithmIdentifier(AlgNameMapper
+ .map2OID("DSA"), //$NON-NLS-1$
+ threeInts.getEncoded());
+ x = keySpec.getX();
+
+ pki = new PrivateKeyInfo(0, ai, ASN1Integer.getInstance().encode(
+ x.toByteArray()), null);
+
+ setEncoding(pki.getEncoded());
+
+ params = new DSAParameterSpec(p, q, g);
+ }
+
+ /**
+ * Creates object from PKCS8EncodedKeySpec.
+ *
+ * @param keySpec - a XPKCS8EncodedKeySpec object
+ *
+ * @throws InvalidKeySpecException - if key data cannot be obtain from encoded format
+ */
+ public DSAPrivateKeyImpl(PKCS8EncodedKeySpec keySpec)
+ throws InvalidKeySpecException {
+
+ super("DSA"); //$NON-NLS-1$
+
+ AlgorithmIdentifier ai;
+ ThreeIntegerSequence threeInts = null;
+
+ String alg, algName;
+
+ byte encoding[] = keySpec.getEncoded();
+
+ PrivateKeyInfo privateKeyInfo = null;
+
+ try {
+ privateKeyInfo = (PrivateKeyInfo) PrivateKeyInfo.ASN1
+ .decode(encoding);
+ } catch (IOException e) {
+ throw new InvalidKeySpecException(Messages.getString(
+ "security.19A", e)); //$NON-NLS-1$
+ }
+
+ try {
+ x = new BigInteger((byte[]) ASN1Integer.getInstance().decode(
+ privateKeyInfo.getPrivateKey()));
+ } catch (IOException e) {
+ throw new InvalidKeySpecException(Messages.getString(
+ "security.19B", e)); //$NON-NLS-1$
+ }
+
+ ai = privateKeyInfo.getAlgorithmIdentifier();
+ try {
+ threeInts = (ThreeIntegerSequence) ThreeIntegerSequence.ASN1
+ .decode(ai.getParameters());
+ } catch (IOException e) {
+ throw new InvalidKeySpecException(Messages.getString(
+ "security.19B", e)); //$NON-NLS-1$
+ }
+ params = new DSAParameterSpec(new BigInteger(threeInts.p),
+ new BigInteger(threeInts.q), new BigInteger(threeInts.g));
+
+ setEncoding(encoding);
+
+ /*
+ * the following code implements RI behavior
+ */
+ alg = ai.getAlgorithm();
+ algName = AlgNameMapper.map2AlgName(alg);
+ setAlgorithm(algName == null ? alg : algName);
+ }
+
+ public BigInteger getX() {
+ return x;
+ }
+
+ public DSAParams getParams() {
+ return params;
+ }
+
+}
Propchange: incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/DSAPrivateKeyImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/DSAPublicKeyImpl.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/DSAPublicKeyImpl.java?view=auto&rev=463279
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/DSAPublicKeyImpl.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/DSAPublicKeyImpl.java Thu Oct 12 08:30:46 2006
@@ -0,0 +1,180 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+ /*
+ * TODO
+ * 1. The class extends the PublicKeyImpl class in "org.apache.harmony.security" package.
+ *
+ * 2. The class uses methods in the auxilliary non-public "ThreeIntegerSequence" class
+ * defined along with the "DSAPrivateKeyImpl" class.
+ *
+ * 3. See a compatibility with RI comments
+ * in the below "DSAPublicKeyImpl(X509EncodedKeySpec keySpec)" constructor.
+ */
+
+package org.apache.harmony.security.provider.crypto;
+
+import java.io.IOException;
+
+import java.math.BigInteger;
+
+import java.security.interfaces.DSAPublicKey;
+import java.security.interfaces.DSAParams;
+
+import java.security.spec.DSAPublicKeySpec;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.DSAParameterSpec;
+import java.security.spec.X509EncodedKeySpec;
+
+import org.apache.harmony.security.x509.AlgorithmIdentifier;
+import org.apache.harmony.security.x509.SubjectPublicKeyInfo;
+
+import org.apache.harmony.security.asn1.ASN1Integer;
+//import org.apache.harmony.security.asn1.ASN1Sequence;
+//import org.apache.harmony.security.asn1.ASN1Type;
+//import org.apache.harmony.security.asn1.BerInputStream;
+//import org.apache.harmony.security.asn1.ASN1BitString;
+//import org.apache.harmony.security.asn1.BitString;
+//import org.apache.harmony.security.asn1.ASN1OctetString;
+
+import org.apache.harmony.security.internal.nls.Messages;
+import org.apache.harmony.crypto.utils.AlgNameMapper;
+
+import org.apache.harmony.security.PublicKeyImpl;
+
+/**
+ * The class provides DSAPublicKey functionality by extending a class implementing PublicKey
+ * and implementing methods defined in both interfaces, DSAKey and DSAPublicKey
+ */
+public class DSAPublicKeyImpl extends PublicKeyImpl implements DSAPublicKey {
+
+ /**
+ * @serial
+ */
+ private static final long serialVersionUID = -2279672131310978336L;
+
+ private BigInteger y;
+
+ private DSAParams params;
+
+ /**
+ * Creates object from DSAPublicKeySpec.
+ *
+ * @param keySpec - a DSAPublicKeySpec object
+ */
+ public DSAPublicKeyImpl(DSAPublicKeySpec keySpec) {
+
+ super("DSA"); //$NON-NLS-1$
+
+ SubjectPublicKeyInfo spki;
+
+ BigInteger p = keySpec.getP();
+ BigInteger q = keySpec.getQ();
+ BigInteger g = keySpec.getG();
+
+ ThreeIntegerSequence threeInts = new ThreeIntegerSequence(p
+ .toByteArray(), q.toByteArray(), g.toByteArray());
+
+ AlgorithmIdentifier ai = new AlgorithmIdentifier(AlgNameMapper
+ .map2OID("DSA"), //$NON-NLS-1$
+ threeInts.getEncoded());
+
+ y = keySpec.getY();
+
+ spki = new SubjectPublicKeyInfo(ai, ASN1Integer.getInstance().encode(
+ y.toByteArray()));
+ setEncoding(spki.getEncoded());
+
+ params = (DSAParams) (new DSAParameterSpec(p, q, g));
+ }
+
+ /**
+ * Creates object from X509EncodedKeySpec.
+ *
+ * @param keySpec - a X509EncodedKeySpec object
+ *
+ * @throws InvalidKeySpecException - if key data cannot be obtain from encoded format
+ */
+ public DSAPublicKeyImpl(X509EncodedKeySpec keySpec)
+ throws InvalidKeySpecException {
+
+ super("DSA"); //$NON-NLS-1$
+
+ AlgorithmIdentifier ai;
+ ThreeIntegerSequence threeInts = null;
+
+ SubjectPublicKeyInfo subjectPublicKeyInfo = null;
+
+ byte encoding[] = keySpec.getEncoded();
+
+ String alg, algName;
+
+ try {
+ subjectPublicKeyInfo = (SubjectPublicKeyInfo) SubjectPublicKeyInfo.ASN1
+ .decode(encoding);
+ } catch (IOException e) {
+ throw new InvalidKeySpecException(Messages.getString(
+ "security.19A", e)); //$NON-NLS-1$
+ }
+
+ try {
+ y = new BigInteger((byte[]) ASN1Integer.getInstance().decode(
+ subjectPublicKeyInfo.getSubjectPublicKey()));
+ } catch (IOException e) {
+ throw new InvalidKeySpecException(Messages.getString(
+ "security.19B", e)); //$NON-NLS-1$
+ }
+
+ ai = subjectPublicKeyInfo.getAlgorithmIdentifier();
+
+ try {
+ threeInts = (ThreeIntegerSequence) ThreeIntegerSequence.ASN1
+ .decode(ai.getParameters());
+ } catch (IOException e) {
+ throw new InvalidKeySpecException(Messages.getString(
+ "security.19B", e)); //$NON-NLS-1$
+ }
+ params = (DSAParams) (new DSAParameterSpec(new BigInteger(threeInts.p),
+ new BigInteger(threeInts.q), new BigInteger(threeInts.g)));
+
+ setEncoding(encoding);
+
+ /*
+ * the following code implements RI behavior
+ */
+ alg = ai.getAlgorithm();
+ algName = AlgNameMapper.map2AlgName(alg);
+ setAlgorithm(algName == null ? alg : algName);
+ }
+
+ /**
+ * @return
+ * a value of a public key (y).
+ */
+ public BigInteger getY() {
+ return y;
+ }
+
+ /**
+ * @return
+ * DSA key parameters (p, q, g).
+ */
+ public DSAParams getParams() {
+ return params;
+ }
+
+}
Propchange: incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/DSAPublicKeyImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/ThreeIntegerSequence.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/ThreeIntegerSequence.java?view=auto&rev=463279
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/ThreeIntegerSequence.java (added)
+++ incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/ThreeIntegerSequence.java Thu Oct 12 08:30:46 2006
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package org.apache.harmony.security.provider.crypto;
+
+import org.apache.harmony.security.asn1.ASN1Integer;
+import org.apache.harmony.security.asn1.ASN1Sequence;
+import org.apache.harmony.security.asn1.ASN1Type;
+import org.apache.harmony.security.asn1.BerInputStream;
+
+
+/**
+ * The auxilliary class providing means to process ASN1Sequence of three Integers.
+ * Such sequenies are parts of ASN1 encoded formats for DSA private and public keys.
+ */
+class ThreeIntegerSequence {
+
+ byte[] p, q, g;
+
+ private byte[] encoding;
+
+ ThreeIntegerSequence(byte[] p, byte[] q, byte[] g) {
+
+ this.p = p;
+ this.q = q;
+ this.g = g;
+ encoding = null;
+ }
+
+ public byte[] getEncoded() {
+ if (encoding == null) {
+ encoding = ASN1.encode(this);
+ }
+ return encoding;
+ }
+
+ public static final ASN1Sequence ASN1 = new ASN1Sequence(new ASN1Type[] {
+ ASN1Integer.getInstance(), ASN1Integer.getInstance(),
+ ASN1Integer.getInstance() }) {
+
+ protected Object getDecodedObject(BerInputStream in) {
+
+ Object[] values = (Object[]) in.content;
+
+ return new ThreeIntegerSequence((byte[]) values[0],
+ (byte[]) values[1], (byte[]) values[2]);
+ }
+
+ protected void getValues(Object object, Object[] values) {
+
+ ThreeIntegerSequence mySeq = (ThreeIntegerSequence) object;
+
+ values[0] = mySeq.p;
+ values[1] = mySeq.q;
+ values[2] = mySeq.g;
+ }
+ };
+}
Propchange: incubator/harmony/enhanced/classlib/trunk/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/ThreeIntegerSequence.java
------------------------------------------------------------------------------
svn:eol-style = native