001package org.apache.commons.ssl.org.bouncycastle.asn1.x509; 002 003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector; 004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object; 005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive; 006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence; 007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject; 008import org.apache.commons.ssl.org.bouncycastle.asn1.DERBitString; 009import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence; 010import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject; 011 012/** 013 * The DistributionPoint object. 014 * <pre> 015 * DistributionPoint ::= SEQUENCE { 016 * distributionPoint [0] DistributionPointName OPTIONAL, 017 * reasons [1] ReasonFlags OPTIONAL, 018 * cRLIssuer [2] GeneralNames OPTIONAL 019 * } 020 * </pre> 021 */ 022public class DistributionPoint 023 extends ASN1Object 024{ 025 DistributionPointName distributionPoint; 026 ReasonFlags reasons; 027 GeneralNames cRLIssuer; 028 029 public static DistributionPoint getInstance( 030 ASN1TaggedObject obj, 031 boolean explicit) 032 { 033 return getInstance(ASN1Sequence.getInstance(obj, explicit)); 034 } 035 036 public static DistributionPoint getInstance( 037 Object obj) 038 { 039 if(obj == null || obj instanceof DistributionPoint) 040 { 041 return (DistributionPoint)obj; 042 } 043 044 if(obj instanceof ASN1Sequence) 045 { 046 return new DistributionPoint((ASN1Sequence)obj); 047 } 048 049 throw new IllegalArgumentException("Invalid DistributionPoint: " + obj.getClass().getName()); 050 } 051 052 public DistributionPoint( 053 ASN1Sequence seq) 054 { 055 for (int i = 0; i != seq.size(); i++) 056 { 057 ASN1TaggedObject t = ASN1TaggedObject.getInstance(seq.getObjectAt(i)); 058 switch (t.getTagNo()) 059 { 060 case 0: 061 distributionPoint = DistributionPointName.getInstance(t, true); 062 break; 063 case 1: 064 reasons = new ReasonFlags(DERBitString.getInstance(t, false)); 065 break; 066 case 2: 067 cRLIssuer = GeneralNames.getInstance(t, false); 068 } 069 } 070 } 071 072 public DistributionPoint( 073 DistributionPointName distributionPoint, 074 ReasonFlags reasons, 075 GeneralNames cRLIssuer) 076 { 077 this.distributionPoint = distributionPoint; 078 this.reasons = reasons; 079 this.cRLIssuer = cRLIssuer; 080 } 081 082 public DistributionPointName getDistributionPoint() 083 { 084 return distributionPoint; 085 } 086 087 public ReasonFlags getReasons() 088 { 089 return reasons; 090 } 091 092 public GeneralNames getCRLIssuer() 093 { 094 return cRLIssuer; 095 } 096 097 public ASN1Primitive toASN1Primitive() 098 { 099 ASN1EncodableVector v = new ASN1EncodableVector(); 100 101 if (distributionPoint != null) 102 { 103 // 104 // as this is a CHOICE it must be explicitly tagged 105 // 106 v.add(new DERTaggedObject(0, distributionPoint)); 107 } 108 109 if (reasons != null) 110 { 111 v.add(new DERTaggedObject(false, 1, reasons)); 112 } 113 114 if (cRLIssuer != null) 115 { 116 v.add(new DERTaggedObject(false, 2, cRLIssuer)); 117 } 118 119 return new DERSequence(v); 120 } 121 122 public String toString() 123 { 124 String sep = System.getProperty("line.separator"); 125 StringBuffer buf = new StringBuffer(); 126 buf.append("DistributionPoint: ["); 127 buf.append(sep); 128 if (distributionPoint != null) 129 { 130 appendObject(buf, sep, "distributionPoint", distributionPoint.toString()); 131 } 132 if (reasons != null) 133 { 134 appendObject(buf, sep, "reasons", reasons.toString()); 135 } 136 if (cRLIssuer != null) 137 { 138 appendObject(buf, sep, "cRLIssuer", cRLIssuer.toString()); 139 } 140 buf.append("]"); 141 buf.append(sep); 142 return buf.toString(); 143 } 144 145 private void appendObject(StringBuffer buf, String sep, String name, String value) 146 { 147 String indent = " "; 148 149 buf.append(indent); 150 buf.append(name); 151 buf.append(":"); 152 buf.append(sep); 153 buf.append(indent); 154 buf.append(indent); 155 buf.append(value); 156 buf.append(sep); 157 } 158}