--- /dev/null
+package org.bouncycastle.asn1.x509;
+
+import java.io.*;
+import java.util.Enumeration;
+
+import org.bouncycastle.asn1.*;
+
+public class AlgorithmIdentifier
+ implements DEREncodable
+{
+ private DERObjectIdentifier objectId;
+ private DERObject parameters;
+ private boolean parametersDefined = false;
+
+ public AlgorithmIdentifier(
+ DERObjectIdentifier objectId)
+ {
+ this.objectId = objectId;
+ }
+
+ public AlgorithmIdentifier(
+ DERObjectIdentifier objectId,
+ DERObject parameters)
+ {
+ parametersDefined = true;
+
+ this.objectId = objectId;
+ this.parameters = parameters;
+ }
+
+ public AlgorithmIdentifier(
+ DERConstructedSequence obj)
+ {
+ objectId = (DERObjectIdentifier)obj.getObjectAt(0);
+
+ if (obj.getSize() == 2)
+ {
+ parametersDefined = true;
+ parameters = (DERObject)obj.getObjectAt(1);
+ }
+ else
+ {
+ parameters = null;
+ }
+ }
+
+ public DERObjectIdentifier getObjectId()
+ {
+ return objectId;
+ }
+
+ public DERObject getParameters()
+ {
+ return parameters;
+ }
+
+ /**
+ * <pre>
+ * AlgorithmIdentifier ::= SEQUENCE {
+ * algorithm OBJECT IDENTIFIER,
+ * parameters ANY DEFINED BY algorithm OPTIONAL }
+ * </pre>
+ */
+ public DERObject getDERObject()
+ {
+ DERConstructedSequence seq = new DERConstructedSequence();
+
+ seq.addObject(objectId);
+
+ if (parametersDefined)
+ {
+ seq.addObject(parameters);
+ }
+
+ return seq;
+ }
+
+ public boolean equals(
+ Object o)
+ {
+ if ((o == null) || !(o instanceof AlgorithmIdentifier))
+ {
+ return false;
+ }
+
+ AlgorithmIdentifier other = (AlgorithmIdentifier)o;
+
+ if (!this.getObjectId().equals(other.getObjectId()))
+ {
+ return false;
+ }
+
+ if (this.getParameters() == null && other.getParameters() == null)
+ {
+ return true;
+ }
+
+ if (this.getParameters() == null || other.getParameters() == null)
+ {
+ return false;
+ }
+
+ ByteArrayOutputStream b1Out = new ByteArrayOutputStream();
+ ByteArrayOutputStream b2Out = new ByteArrayOutputStream();
+ DEROutputStream d1Out = new DEROutputStream(b1Out);
+ DEROutputStream d2Out = new DEROutputStream(b2Out);
+
+ try
+ {
+ d1Out.writeObject(this.getParameters());
+ d2Out.writeObject(other.getParameters());
+
+ byte[] b1 = b1Out.toByteArray();
+ byte[] b2 = b2Out.toByteArray();
+
+ if (b1.length != b2.length)
+ {
+ return false;
+ }
+
+ for (int i = 0; i != b1.length; i++)
+ {
+ if (b1[i] != b2[i])
+ {
+ return false;
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ return false;
+ }
+
+ return true;
+ }
+}