1 package org.bouncycastle.asn1.x509; 2 3 import java.math.BigInteger; 4 5 import org.bouncycastle.asn1.ASN1EncodableVector; 6 import org.bouncycastle.asn1.ASN1Sequence; 7 import org.bouncycastle.asn1.ASN1TaggedObject; 8 import org.bouncycastle.asn1.DERBoolean; 9 import org.bouncycastle.asn1.ASN1Encodable; 10 import org.bouncycastle.asn1.DERInteger; 11 import org.bouncycastle.asn1.DERObject; 12 import org.bouncycastle.asn1.DERSequence; 13 14 public class BasicConstraints 15 extends ASN1Encodable 16 { 17 // BEGIN android-changed 18 DERBoolean cA = DERBoolean.FALSE; 19 // END android-changed 20 DERInteger pathLenConstraint = null; 21 22 public static BasicConstraints getInstance( 23 ASN1TaggedObject obj, 24 boolean explicit) 25 { 26 return getInstance(ASN1Sequence.getInstance(obj, explicit)); 27 } 28 29 public static BasicConstraints getInstance( 30 Object obj) 31 { 32 if (obj == null || obj instanceof BasicConstraints) 33 { 34 return (BasicConstraints)obj; 35 } 36 else if (obj instanceof ASN1Sequence) 37 { 38 return new BasicConstraints((ASN1Sequence)obj); 39 } 40 41 throw new IllegalArgumentException("unknown object in factory"); 42 } 43 44 public BasicConstraints( 45 ASN1Sequence seq) 46 { 47 if (seq.size() == 0) 48 { 49 this.cA = null; 50 this.pathLenConstraint = null; 51 } 52 else 53 { 54 this.cA = DERBoolean.getInstance(seq.getObjectAt(0)); 55 if (seq.size() > 1) 56 { 57 this.pathLenConstraint = DERInteger.getInstance(seq.getObjectAt(1)); 58 } 59 } 60 } 61 62 /** 63 * @deprecated use one of the other two unambigous constructors. 64 * @param cA 65 * @param pathLenConstraint 66 */ 67 public BasicConstraints( 68 boolean cA, 69 int pathLenConstraint) 70 { 71 if (cA) 72 { 73 // BEGIN android-changed 74 this.cA = DERBoolean.getInstance(cA); 75 // END android-changed 76 this.pathLenConstraint = new DERInteger(pathLenConstraint); 77 } 78 else 79 { 80 this.cA = null; 81 this.pathLenConstraint = null; 82 } 83 } 84 85 public BasicConstraints( 86 boolean cA) 87 { 88 if (cA) 89 { 90 // BEGIN android-changed 91 this.cA = DERBoolean.TRUE; 92 // END android-changed 93 } 94 else 95 { 96 this.cA = null; 97 } 98 this.pathLenConstraint = null; 99 } 100 101 /** 102 * create a cA=true object for the given path length constraint. 103 * 104 * @param pathLenConstraint 105 */ 106 public BasicConstraints( 107 int pathLenConstraint) 108 { 109 // BEGIN android-changed 110 this.cA = DERBoolean.TRUE; 111 // END android-changed 112 this.pathLenConstraint = new DERInteger(pathLenConstraint); 113 } 114 115 public boolean isCA() 116 { 117 return (cA != null) && cA.isTrue(); 118 } 119 120 public BigInteger getPathLenConstraint() 121 { 122 if (pathLenConstraint != null) 123 { 124 return pathLenConstraint.getValue(); 125 } 126 127 return null; 128 } 129 130 /** 131 * Produce an object suitable for an ASN1OutputStream. 132 * <pre> 133 * BasicConstraints := SEQUENCE { 134 * cA BOOLEAN DEFAULT FALSE, 135 * pathLenConstraint INTEGER (0..MAX) OPTIONAL 136 * } 137 * </pre> 138 */ 139 public DERObject toASN1Object() 140 { 141 ASN1EncodableVector v = new ASN1EncodableVector(); 142 143 if (cA != null) 144 { 145 v.add(cA); 146 147 if (pathLenConstraint != null) 148 { 149 v.add(pathLenConstraint); 150 } 151 } 152 153 return new DERSequence(v); 154 } 155 156 public String toString() 157 { 158 if (pathLenConstraint == null) 159 { 160 if (cA == null) 161 { 162 return "BasicConstraints: isCa(false)"; 163 } 164 return "BasicConstraints: isCa(" + this.isCA() + ")"; 165 } 166 return "BasicConstraints: isCa(" + this.isCA() + "), pathLenConstraint = " + pathLenConstraint.getValue(); 167 } 168 } 169