001    /**
002     *
003     *  Licensed to the Apache Software Foundation (ASF) under one or more
004     *  contributor license agreements.  See the NOTICE file distributed with
005     *  this work for additional information regarding copyright ownership.
006     *  The ASF licenses this file to You under the Apache License, Version 2.0
007     *  (the "License"); you may not use this file except in compliance with
008     *  the License.  You may obtain a copy of the License at
009     *
010     *     http://www.apache.org/licenses/LICENSE-2.0
011     *
012     *  Unless required by applicable law or agreed to in writing, software
013     *  distributed under the License is distributed on an "AS IS" BASIS,
014     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015     *  See the License for the specific language governing permissions and
016     *  limitations under the License.
017     */
018    
019    package org.apache.geronimo.util.asn1.x509;
020    
021    import org.apache.geronimo.util.asn1.ASN1Encodable;
022    import org.apache.geronimo.util.asn1.ASN1EncodableVector;
023    import org.apache.geronimo.util.asn1.ASN1Sequence;
024    import org.apache.geronimo.util.asn1.ASN1TaggedObject;
025    import org.apache.geronimo.util.asn1.DERObject;
026    import org.apache.geronimo.util.asn1.DERSequence;
027    import org.apache.geronimo.util.asn1.DERTaggedObject;
028    
029    /**
030     * The Holder object.
031     * <pre>
032     *  Holder ::= SEQUENCE {
033     *        baseCertificateID   [0] IssuerSerial OPTIONAL,
034     *                 -- the issuer and serial number of
035     *                 -- the holder's Public Key Certificate
036     *        entityName          [1] GeneralNames OPTIONAL,
037     *                 -- the name of the claimant or role
038     *        objectDigestInfo    [2] ObjectDigestInfo OPTIONAL
039     *                 -- used to directly authenticate the holder,
040     *                 -- for example, an executable
041     *  }
042     * </pre>
043     */
044    public class Holder
045        extends ASN1Encodable
046    {
047        IssuerSerial        baseCertificateID;
048        GeneralNames        entityName;
049        ObjectDigestInfo    objectDigestInfo;
050    
051        public static Holder getInstance(
052                Object  obj)
053        {
054            if (obj instanceof Holder)
055            {
056                return (Holder)obj;
057            }
058            else if (obj instanceof ASN1Sequence)
059            {
060                return new Holder((ASN1Sequence)obj);
061            }
062    
063            throw new IllegalArgumentException("unknown object in factory");
064        }
065    
066        public Holder(
067            ASN1Sequence    seq)
068        {
069            for (int i = 0; i != seq.size(); i++)
070            {
071                ASN1TaggedObject    tObj = (ASN1TaggedObject)seq.getObjectAt(i);
072    
073                switch (tObj.getTagNo())
074                {
075                case 0:
076                    baseCertificateID = IssuerSerial.getInstance(tObj, false);
077                    break;
078                case 1:
079                    entityName = GeneralNames.getInstance(tObj, false);
080                    break;
081                case 2:
082                    objectDigestInfo = ObjectDigestInfo.getInstance(tObj, false);
083                    break;
084                default:
085                    throw new IllegalArgumentException("unknown tag in Holder");
086                }
087            }
088        }
089    
090        public Holder(
091            IssuerSerial    baseCertificateID)
092        {
093            this.baseCertificateID = baseCertificateID;
094        }
095    
096        public Holder(
097            GeneralNames    entityName)
098        {
099            this.entityName = entityName;
100        }
101    
102        public IssuerSerial getBaseCertificateID()
103        {
104            return baseCertificateID;
105        }
106    
107        public GeneralNames getEntityName()
108        {
109            return entityName;
110        }
111    
112        public ObjectDigestInfo getObjectDigestInfo()
113        {
114            return objectDigestInfo;
115        }
116    
117        public DERObject toASN1Object()
118        {
119            ASN1EncodableVector  v = new ASN1EncodableVector();
120    
121            if (baseCertificateID != null)
122            {
123                v.add(new DERTaggedObject(false, 0, baseCertificateID));
124            }
125    
126            if (entityName != null)
127            {
128                v.add(new DERTaggedObject(false, 1, entityName));
129            }
130    
131            if (objectDigestInfo != null)
132            {
133                v.add(new DERTaggedObject(false, 2, objectDigestInfo));
134            }
135    
136            return new DERSequence(v);
137        }
138    }