116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giropackage org.bouncycastle.asn1.x509;
216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.math.BigInteger;
416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.util.Enumeration;
516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1EncodableVector;
716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1Integer;
816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1Object;
916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1OctetString;
1016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1Primitive;
1116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1Sequence;
1216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.ASN1TaggedObject;
1316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.DEROctetString;
1416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.DERSequence;
1516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.asn1.DERTaggedObject;
1616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.crypto.Digest;
17c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro// BEGIN android-changed
18c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giroimport org.bouncycastle.crypto.digests.AndroidDigestFactory;
19c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro// END android-changed
2016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
2116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro/**
2216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * The AuthorityKeyIdentifier object.
2316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * <pre>
2416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * id-ce-authorityKeyIdentifier OBJECT IDENTIFIER ::=  { id-ce 35 }
2516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro *
2616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro *   AuthorityKeyIdentifier ::= SEQUENCE {
2716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro *      keyIdentifier             [0] IMPLICIT KeyIdentifier           OPTIONAL,
2816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro *      authorityCertIssuer       [1] IMPLICIT GeneralNames            OPTIONAL,
2916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro *      authorityCertSerialNumber [2] IMPLICIT CertificateSerialNumber OPTIONAL  }
3016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro *
3116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro *   KeyIdentifier ::= OCTET STRING
3216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * </pre>
3316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro *
3416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro */
3516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giropublic class AuthorityKeyIdentifier
3616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    extends ASN1Object
3716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro{
3816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    ASN1OctetString keyidentifier=null;
3916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    GeneralNames certissuer=null;
4016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    ASN1Integer certserno=null;
4116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
4216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static AuthorityKeyIdentifier getInstance(
4316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        ASN1TaggedObject obj,
4416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        boolean          explicit)
4516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
4616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return getInstance(ASN1Sequence.getInstance(obj, explicit));
4716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
4816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
4916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static AuthorityKeyIdentifier getInstance(
5016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Object  obj)
5116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
5216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (obj instanceof AuthorityKeyIdentifier)
5316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
5416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return (AuthorityKeyIdentifier)obj;
5516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
5616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (obj != null)
5716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
5816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return new AuthorityKeyIdentifier(ASN1Sequence.getInstance(obj));
5916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
6016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
6116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return null;
6216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
6316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
6416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public static AuthorityKeyIdentifier fromExtensions(Extensions extensions)
6516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
6616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro         return AuthorityKeyIdentifier.getInstance(extensions.getExtensionParsedValue(Extension.authorityKeyIdentifier));
6716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
6816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
6916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    protected AuthorityKeyIdentifier(
7016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        ASN1Sequence   seq)
7116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
7216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        Enumeration     e = seq.getObjects();
7316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
7416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        while (e.hasMoreElements())
7516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
7616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            ASN1TaggedObject o = DERTaggedObject.getInstance(e.nextElement());
7716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
7816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            switch (o.getTagNo())
7916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            {
8016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            case 0:
8116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                this.keyidentifier = ASN1OctetString.getInstance(o, false);
8216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                break;
8316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            case 1:
8416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                this.certissuer = GeneralNames.getInstance(o, false);
8516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                break;
8616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            case 2:
8716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                this.certserno = ASN1Integer.getInstance(o, false);
8816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                break;
8916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            default:
9016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro                throw new IllegalArgumentException("illegal tag");
9116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            }
9216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
9316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
9416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
9516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
9616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     *
9716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * Calulates the keyidentifier using a SHA1 hash over the BIT STRING
9816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * from SubjectPublicKeyInfo as defined in RFC2459.
9916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     *
10016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * Example of making a AuthorityKeyIdentifier:
10116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * <pre>
10216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     *   SubjectPublicKeyInfo apki = new SubjectPublicKeyInfo((ASN1Sequence)new ASN1InputStream(
10316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     *       publicKey.getEncoded()).readObject());
10416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     *   AuthorityKeyIdentifier aki = new AuthorityKeyIdentifier(apki);
10516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * </pre>
10653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro     * @deprecated create the extension using org.bouncycastle.cert.X509ExtensionUtils
10716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     **/
10816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public AuthorityKeyIdentifier(
10916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        SubjectPublicKeyInfo    spki)
11016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
111c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        // BEGIN android-changed
112c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        Digest  digest = AndroidDigestFactory.getSHA1();
113c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        // END android-changed
11416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        byte[]  resBuf = new byte[digest.getDigestSize()];
11516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
11616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        byte[] bytes = spki.getPublicKeyData().getBytes();
11716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        digest.update(bytes, 0, bytes.length);
11816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        digest.doFinal(resBuf, 0);
11916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this.keyidentifier = new DEROctetString(resBuf);
12016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
12116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
12216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
12316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * create an AuthorityKeyIdentifier with the GeneralNames tag and
12416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * the serial number provided as well.
12553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro     * @deprecated create the extension using org.bouncycastle.cert.X509ExtensionUtils
12616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
12716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public AuthorityKeyIdentifier(
12816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        SubjectPublicKeyInfo    spki,
12916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        GeneralNames            name,
13016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        BigInteger              serialNumber)
13116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
132c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        // BEGIN android-changed
133c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        Digest  digest = AndroidDigestFactory.getSHA1();
134c1040cb5656c3299f1c2d0fe0bd7c44b10466aafSergio Giro        // END android-changed
13516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        byte[]  resBuf = new byte[digest.getDigestSize()];
13616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
13716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        byte[] bytes = spki.getPublicKeyData().getBytes();
13816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        digest.update(bytes, 0, bytes.length);
13916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        digest.doFinal(resBuf, 0);
14016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
14116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this.keyidentifier = new DEROctetString(resBuf);
14216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this.certissuer = GeneralNames.getInstance(name.toASN1Primitive());
14316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this.certserno = new ASN1Integer(serialNumber);
14416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
14516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
14616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
14716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * create an AuthorityKeyIdentifier with the GeneralNames tag and
14816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * the serial number provided.
14916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
15016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public AuthorityKeyIdentifier(
15116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        GeneralNames            name,
15216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        BigInteger              serialNumber)
15316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
15453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        this((byte[])null, name, serialNumber);
15516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
15616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
15716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
15816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro      * create an AuthorityKeyIdentifier with a precomputed key identifier
15916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro      */
16016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     public AuthorityKeyIdentifier(
16116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro         byte[]                  keyIdentifier)
16216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     {
16353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro         this(keyIdentifier, null, null);
16416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     }
16516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
16616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
16716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * create an AuthorityKeyIdentifier with a precomputed key identifier
16816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * and the GeneralNames tag and the serial number provided as well.
16916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
17016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public AuthorityKeyIdentifier(
17116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        byte[]                  keyIdentifier,
17216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        GeneralNames            name,
17316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        BigInteger              serialNumber)
17416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
17553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        this.keyidentifier = (keyIdentifier != null) ? new DEROctetString(keyIdentifier) : null;
17653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        this.certissuer = name;
17753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro        this.certserno = (serialNumber != null) ? new ASN1Integer(serialNumber) : null;
17816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
17916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
18016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public byte[] getKeyIdentifier()
18116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
18216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (keyidentifier != null)
18316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
18416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return keyidentifier.getOctets();
18516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
18616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
18716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return null;
18816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
18916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
19016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public GeneralNames getAuthorityCertIssuer()
19116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
19216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return certissuer;
19316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
19416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
19516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public BigInteger getAuthorityCertSerialNumber()
19616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
19716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (certserno != null)
19816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
19916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return certserno.getValue();
20016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
20116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
20216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return null;
20316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
20416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
20516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
20616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     * Produce an object suitable for an ASN1OutputStream.
20716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
20816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public ASN1Primitive toASN1Primitive()
20916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
21016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        ASN1EncodableVector  v = new ASN1EncodableVector();
21116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
21216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (keyidentifier != null)
21316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
21416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            v.add(new DERTaggedObject(false, 0, keyidentifier));
21516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
21616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
21716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (certissuer != null)
21816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
21916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            v.add(new DERTaggedObject(false, 1, certissuer));
22016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
22116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
22216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        if (certserno != null)
22316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
22416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            v.add(new DERTaggedObject(false, 2, certserno));
22516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
22616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
22716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
22816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return new DERSequence(v);
22916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
23016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
23116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public String toString()
23216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
23316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return ("AuthorityKeyIdentifier: KeyID(" + this.keyidentifier.getOctets() + ")");
23416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
23516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro}
236