aboutsummaryrefslogtreecommitdiffstats
path: root/libraries/spongycastle/jce/src/main/java/javax/crypto/EncryptedPrivateKeyInfo.java
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/spongycastle/jce/src/main/java/javax/crypto/EncryptedPrivateKeyInfo.java')
-rw-r--r--libraries/spongycastle/jce/src/main/java/javax/crypto/EncryptedPrivateKeyInfo.java234
1 files changed, 234 insertions, 0 deletions
diff --git a/libraries/spongycastle/jce/src/main/java/javax/crypto/EncryptedPrivateKeyInfo.java b/libraries/spongycastle/jce/src/main/java/javax/crypto/EncryptedPrivateKeyInfo.java
new file mode 100644
index 000000000..19f22ebe6
--- /dev/null
+++ b/libraries/spongycastle/jce/src/main/java/javax/crypto/EncryptedPrivateKeyInfo.java
@@ -0,0 +1,234 @@
+package javax.crypto;
+
+import java.io.*;
+
+import java.security.*;
+import java.security.spec.*;
+
+import org.spongycastle.asn1.ASN1InputStream;
+import org.spongycastle.asn1.DEROutputStream;
+import org.spongycastle.asn1.ASN1Sequence;
+import org.spongycastle.asn1.DERObjectIdentifier;
+import org.spongycastle.asn1.x509.AlgorithmIdentifier;
+
+/**
+ * This class implements the <code>EncryptedPrivateKeyInfo</code> type
+ * as defined in PKCS #8.
+ * <p>Its ASN.1 definition is as follows:
+ *
+ * <pre>
+ * EncryptedPrivateKeyInfo ::= SEQUENCE {
+ * encryptionAlgorithm AlgorithmIdentifier,
+ * encryptedData OCTET STRING }
+ *
+ * AlgorithmIdentifier ::= SEQUENCE {
+ * algorithm OBJECT IDENTIFIER,
+ * parameters ANY DEFINED BY algorithm OPTIONAL }
+ * </pre>
+ */
+public class EncryptedPrivateKeyInfo
+{
+ private org.spongycastle.asn1.pkcs.EncryptedPrivateKeyInfo infoObj;
+ private AlgorithmParameters algP;
+
+ /*
+ * Constructs (i.e., parses) an <code>EncryptedPrivateKeyInfo</code> from
+ * its ASN.1 encoding.
+ *
+ * @param encoded the ASN.1 encoding of this object.
+ * @exception NullPointerException if the <code>encoded</code> is null.
+ * @exception IOException if error occurs when parsing the ASN.1 encoding.
+ */
+ public EncryptedPrivateKeyInfo(
+ byte[] encoded)
+ throws NullPointerException, IOException
+ {
+ if (encoded == null)
+ {
+ throw new NullPointerException("parameters null");
+ }
+
+ ByteArrayInputStream bIn = new ByteArrayInputStream(encoded);
+ ASN1InputStream dIn = new ASN1InputStream(bIn);
+
+ infoObj = org.spongycastle.asn1.pkcs.EncryptedPrivateKeyInfo.getInstance((ASN1Sequence)dIn.readObject());
+
+ try
+ {
+ algP = this.getParameters();
+ }
+ catch (NoSuchAlgorithmException e)
+ {
+ throw new IOException("can't create parameters: " + e.toString());
+ }
+ }
+
+ /*
+ * Constructs an <code>EncryptedPrivateKeyInfo</code> from the
+ * encryption algorithm name and the encrypted data.
+ * <p>Note: the <code>encrypedData</code> is cloned when constructing
+ * this object.
+ * <p>
+ * If encryption algorithm has associated parameters use the constructor
+ * with AlgorithmParameters as the parameter.
+ *
+ * @param algName algorithm name.
+ * @param encryptedData encrypted data.
+ * @exception NullPointerException if <code>algName</code> or <code>encryptedData</code> is null.
+ * @exception IllegalArgumentException if <code>encryptedData</code> is empty, i.e. 0-length.
+ * @exception NoSuchAlgorithmException if the specified algName is not supported.
+ */
+ public EncryptedPrivateKeyInfo(
+ String algName,
+ byte[] encryptedData)
+ throws NullPointerException, IllegalArgumentException, NoSuchAlgorithmException
+ {
+ if (algName == null || encryptedData == null)
+ {
+ throw new NullPointerException("parameters null");
+ }
+
+ org.spongycastle.asn1.x509.AlgorithmIdentifier kAlgId = new AlgorithmIdentifier(new DERObjectIdentifier(algName), null);
+
+ infoObj = new org.spongycastle.asn1.pkcs.EncryptedPrivateKeyInfo(kAlgId, (byte[])encryptedData.clone());
+ algP = this.getParameters();
+ }
+
+ /**
+ * Constructs an <code>EncryptedPrivateKeyInfo</code> from the
+ * encryption algorithm parameters and the encrypted data.
+ * <p>Note: the <code>encrypedData</code> is cloned when constructing
+ * this object.
+ *
+ * @param algParams the algorithm parameters for the encryption
+ * algorithm. <code>algParams.getEncoded()</code> should return
+ * the ASN.1 encoded bytes of the <code>parameters</code> field
+ * of the <code>AlgorithmIdentifer</code> component of the
+ * <code>EncryptedPrivateKeyInfo</code> type.
+ * @param encryptedData encrypted data.
+ * @exception NullPointerException if <code>algParams</code> or <code>encryptedData</code> is null.
+ * @exception IllegalArgumentException if <code>encryptedData</code> is empty, i.e. 0-length.
+ * @exception NoSuchAlgorithmException if the specified algName of the specified <code>algParams</code> parameter is not supported.
+ */
+ public EncryptedPrivateKeyInfo(
+ AlgorithmParameters algParams,
+ byte[] encryptedData)
+ throws NullPointerException, IllegalArgumentException, NoSuchAlgorithmException
+ {
+ if (algParams == null || encryptedData == null)
+ {
+ throw new NullPointerException("parameters null");
+ }
+
+ org.spongycastle.asn1.x509.AlgorithmIdentifier kAlgId = null;
+
+ try
+ {
+ ByteArrayInputStream bIn = new ByteArrayInputStream(algParams.getEncoded());
+ ASN1InputStream dIn = new ASN1InputStream(bIn);
+
+ kAlgId = new AlgorithmIdentifier(
+ new DERObjectIdentifier(algParams.getAlgorithm()), dIn.readObject());
+ }
+ catch (IOException e)
+ {
+ throw new IllegalArgumentException("error in encoding: " + e.toString());
+ }
+
+ infoObj = new org.spongycastle.asn1.pkcs.EncryptedPrivateKeyInfo(kAlgId, (byte[])encryptedData.clone());
+ algP = this.getParameters();
+ }
+
+ /**
+ * Returns the encryption algorithm.
+ *
+ * @returns the algorithm name.
+ */
+ public String getAlgName()
+ {
+ return infoObj.getEncryptionAlgorithm().getObjectId().getId();
+ }
+
+ private AlgorithmParameters getParameters()
+ throws NoSuchAlgorithmException
+ {
+ AlgorithmParameters ap = AlgorithmParameters.getInstance(this.getAlgName());
+ ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+ DEROutputStream dOut = new DEROutputStream(bOut);
+
+ try
+ {
+ dOut.writeObject(infoObj.getEncryptionAlgorithm().getParameters());
+ dOut.close();
+
+ ap.init(bOut.toByteArray());
+ }
+ catch (IOException e)
+ {
+ throw new NoSuchAlgorithmException("unable to parse parameters");
+ }
+
+ return ap;
+ }
+
+ /**
+ * Returns the algorithm parameters used by the encryption algorithm.
+ *
+ * @returns the algorithm parameters.
+ */
+ public AlgorithmParameters getAlgParameters()
+ {
+ return algP;
+ }
+
+ /**
+ * Returns a copy of the encrypted data.
+ *
+ * @returns a copy of the encrypted data.
+ */
+ public byte[] getEncryptedData()
+ {
+ return infoObj.getEncryptedData();
+ }
+
+ /**
+ * Extract the enclosed PKCS8EncodedKeySpec object from the
+ * encrypted data and return it.
+ *
+ * @return the PKCS8EncodedKeySpec object.
+ * @exception InvalidKeySpecException if the given cipher is
+ * inappropriate for the encrypted data or the encrypted
+ * data is corrupted and cannot be decrypted.
+ */
+ public PKCS8EncodedKeySpec getKeySpec(
+ Cipher c)
+ throws InvalidKeySpecException
+ {
+ try
+ {
+ return new PKCS8EncodedKeySpec(c.doFinal(this.getEncryptedData()));
+ }
+ catch (Exception e)
+ {
+ throw new InvalidKeySpecException("can't get keySpec: " + e.toString());
+ }
+ }
+
+ /**
+ * Returns the ASN.1 encoding of this object.
+ *
+ * @returns the ASN.1 encoding.
+ * @throws IOException if error occurs when constructing its ASN.1 encoding.
+ */
+ public byte[] getEncoded()
+ throws IOException
+ {
+ ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+ DEROutputStream dOut = new DEROutputStream(bOut);
+
+ dOut.writeObject(infoObj);
+ dOut.close();
+
+ return bOut.toByteArray();
+ }
+}