Home | History | Annotate | Download | only in x509
      1 package org.bouncycastle.asn1.x509;
      2 
      3 import org.bouncycastle.asn1.ASN1Boolean;
      4 import org.bouncycastle.asn1.ASN1EncodableVector;
      5 import org.bouncycastle.asn1.ASN1Object;
      6 import org.bouncycastle.asn1.ASN1Primitive;
      7 import org.bouncycastle.asn1.ASN1Sequence;
      8 import org.bouncycastle.asn1.ASN1TaggedObject;
      9 import org.bouncycastle.asn1.DERSequence;
     10 import org.bouncycastle.asn1.DERTaggedObject;
     11 import org.bouncycastle.util.Strings;
     12 
     13 /**
     14  * <pre>
     15  * IssuingDistributionPoint ::= SEQUENCE {
     16  *   distributionPoint          [0] DistributionPointName OPTIONAL,
     17  *   onlyContainsUserCerts      [1] BOOLEAN DEFAULT FALSE,
     18  *   onlyContainsCACerts        [2] BOOLEAN DEFAULT FALSE,
     19  *   onlySomeReasons            [3] ReasonFlags OPTIONAL,
     20  *   indirectCRL                [4] BOOLEAN DEFAULT FALSE,
     21  *   onlyContainsAttributeCerts [5] BOOLEAN DEFAULT FALSE }
     22  * </pre>
     23  */
     24 public class IssuingDistributionPoint
     25     extends ASN1Object
     26 {
     27     private DistributionPointName distributionPoint;
     28 
     29     private boolean onlyContainsUserCerts;
     30 
     31     private boolean onlyContainsCACerts;
     32 
     33     private ReasonFlags onlySomeReasons;
     34 
     35     private boolean indirectCRL;
     36 
     37     private boolean onlyContainsAttributeCerts;
     38 
     39     private ASN1Sequence seq;
     40 
     41     public static IssuingDistributionPoint getInstance(
     42         ASN1TaggedObject obj,
     43         boolean explicit)
     44     {
     45         return getInstance(ASN1Sequence.getInstance(obj, explicit));
     46     }
     47 
     48     public static IssuingDistributionPoint getInstance(
     49         Object obj)
     50     {
     51         if (obj instanceof IssuingDistributionPoint)
     52         {
     53             return (IssuingDistributionPoint)obj;
     54         }
     55         else if (obj != null)
     56         {
     57             return new IssuingDistributionPoint(ASN1Sequence.getInstance(obj));
     58         }
     59 
     60         return null;
     61     }
     62 
     63     /**
     64      * Constructor from given details.
     65      *
     66      * @param distributionPoint
     67      *            May contain an URI as pointer to most current CRL.
     68      * @param onlyContainsUserCerts Covers revocation information for end certificates.
     69      * @param onlyContainsCACerts Covers revocation information for CA certificates.
     70      *
     71      * @param onlySomeReasons
     72      *            Which revocation reasons does this point cover.
     73      * @param indirectCRL
     74      *            If <code>true</code> then the CRL contains revocation
     75      *            information about certificates ssued by other CAs.
     76      * @param onlyContainsAttributeCerts Covers revocation information for attribute certificates.
     77      */
     78     public IssuingDistributionPoint(
     79         DistributionPointName distributionPoint,
     80         boolean onlyContainsUserCerts,
     81         boolean onlyContainsCACerts,
     82         ReasonFlags onlySomeReasons,
     83         boolean indirectCRL,
     84         boolean onlyContainsAttributeCerts)
     85     {
     86         this.distributionPoint = distributionPoint;
     87         this.indirectCRL = indirectCRL;
     88         this.onlyContainsAttributeCerts = onlyContainsAttributeCerts;
     89         this.onlyContainsCACerts = onlyContainsCACerts;
     90         this.onlyContainsUserCerts = onlyContainsUserCerts;
     91         this.onlySomeReasons = onlySomeReasons;
     92 
     93         ASN1EncodableVector vec = new ASN1EncodableVector();
     94         if (distributionPoint != null)
     95         {                                    // CHOICE item so explicitly tagged
     96             vec.add(new DERTaggedObject(true, 0, distributionPoint));
     97         }
     98         if (onlyContainsUserCerts)
     99         {
    100             vec.add(new DERTaggedObject(false, 1, ASN1Boolean.getInstance(true)));
    101         }
    102         if (onlyContainsCACerts)
    103         {
    104             vec.add(new DERTaggedObject(false, 2, ASN1Boolean.getInstance(true)));
    105         }
    106         if (onlySomeReasons != null)
    107         {
    108             vec.add(new DERTaggedObject(false, 3, onlySomeReasons));
    109         }
    110         if (indirectCRL)
    111         {
    112             vec.add(new DERTaggedObject(false, 4, ASN1Boolean.getInstance(true)));
    113         }
    114         if (onlyContainsAttributeCerts)
    115         {
    116             vec.add(new DERTaggedObject(false, 5, ASN1Boolean.getInstance(true)));
    117         }
    118 
    119         seq = new DERSequence(vec);
    120     }
    121 
    122     /**
    123      * Shorthand Constructor from given details.
    124      *
    125      * @param distributionPoint
    126      *            May contain an URI as pointer to most current CRL.
    127      * @param indirectCRL
    128      *            If <code>true</code> then the CRL contains revocation
    129      *            information about certificates ssued by other CAs.
    130      * @param onlyContainsAttributeCerts Covers revocation information for attribute certificates.
    131      */
    132     public IssuingDistributionPoint(
    133         DistributionPointName distributionPoint,
    134         boolean indirectCRL,
    135         boolean onlyContainsAttributeCerts)
    136     {
    137         this(distributionPoint, false, false, null, indirectCRL, onlyContainsAttributeCerts);
    138     }
    139 
    140     /**
    141      * Constructor from ASN1Sequence
    142      */
    143     private IssuingDistributionPoint(
    144         ASN1Sequence seq)
    145     {
    146         this.seq = seq;
    147 
    148         for (int i = 0; i != seq.size(); i++)
    149         {
    150             ASN1TaggedObject o = ASN1TaggedObject.getInstance(seq.getObjectAt(i));
    151 
    152             switch (o.getTagNo())
    153             {
    154             case 0:
    155                                                     // CHOICE so explicit
    156                 distributionPoint = DistributionPointName.getInstance(o, true);
    157                 break;
    158             case 1:
    159                 onlyContainsUserCerts = ASN1Boolean.getInstance(o, false).isTrue();
    160                 break;
    161             case 2:
    162                 onlyContainsCACerts = ASN1Boolean.getInstance(o, false).isTrue();
    163                 break;
    164             case 3:
    165                 onlySomeReasons = new ReasonFlags(ReasonFlags.getInstance(o, false));
    166                 break;
    167             case 4:
    168                 indirectCRL = ASN1Boolean.getInstance(o, false).isTrue();
    169                 break;
    170             case 5:
    171                 onlyContainsAttributeCerts = ASN1Boolean.getInstance(o, false).isTrue();
    172                 break;
    173             default:
    174                 throw new IllegalArgumentException(
    175                         "unknown tag in IssuingDistributionPoint");
    176             }
    177         }
    178     }
    179 
    180     public boolean onlyContainsUserCerts()
    181     {
    182         return onlyContainsUserCerts;
    183     }
    184 
    185     public boolean onlyContainsCACerts()
    186     {
    187         return onlyContainsCACerts;
    188     }
    189 
    190     public boolean isIndirectCRL()
    191     {
    192         return indirectCRL;
    193     }
    194 
    195     public boolean onlyContainsAttributeCerts()
    196     {
    197         return onlyContainsAttributeCerts;
    198     }
    199 
    200     /**
    201      * @return Returns the distributionPoint.
    202      */
    203     public DistributionPointName getDistributionPoint()
    204     {
    205         return distributionPoint;
    206     }
    207 
    208     /**
    209      * @return Returns the onlySomeReasons.
    210      */
    211     public ReasonFlags getOnlySomeReasons()
    212     {
    213         return onlySomeReasons;
    214     }
    215 
    216     public ASN1Primitive toASN1Primitive()
    217     {
    218         return seq;
    219     }
    220 
    221     public String toString()
    222     {
    223         String       sep = Strings.lineSeparator();
    224         StringBuffer buf = new StringBuffer();
    225 
    226         buf.append("IssuingDistributionPoint: [");
    227         buf.append(sep);
    228         if (distributionPoint != null)
    229         {
    230             appendObject(buf, sep, "distributionPoint", distributionPoint.toString());
    231         }
    232         if (onlyContainsUserCerts)
    233         {
    234             appendObject(buf, sep, "onlyContainsUserCerts", booleanToString(onlyContainsUserCerts));
    235         }
    236         if (onlyContainsCACerts)
    237         {
    238             appendObject(buf, sep, "onlyContainsCACerts", booleanToString(onlyContainsCACerts));
    239         }
    240         if (onlySomeReasons != null)
    241         {
    242             appendObject(buf, sep, "onlySomeReasons", onlySomeReasons.toString());
    243         }
    244         if (onlyContainsAttributeCerts)
    245         {
    246             appendObject(buf, sep, "onlyContainsAttributeCerts", booleanToString(onlyContainsAttributeCerts));
    247         }
    248         if (indirectCRL)
    249         {
    250             appendObject(buf, sep, "indirectCRL", booleanToString(indirectCRL));
    251         }
    252         buf.append("]");
    253         buf.append(sep);
    254         return buf.toString();
    255     }
    256 
    257     private void appendObject(StringBuffer buf, String sep, String name, String value)
    258     {
    259         String       indent = "    ";
    260 
    261         buf.append(indent);
    262         buf.append(name);
    263         buf.append(":");
    264         buf.append(sep);
    265         buf.append(indent);
    266         buf.append(indent);
    267         buf.append(value);
    268         buf.append(sep);
    269     }
    270 
    271     private String booleanToString(boolean value)
    272     {
    273         return value ? "true" : "false";
    274     }
    275 }
    276