BasicConstraints.java revision e6bf3e8dfa2804891a82075cb469b736321b4827
1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)package org.bouncycastle.asn1.x509; 2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)import java.math.BigInteger; 4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)import org.bouncycastle.asn1.ASN1EncodableVector; 6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)import org.bouncycastle.asn1.ASN1Integer; 7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)import org.bouncycastle.asn1.ASN1Object; 8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)import org.bouncycastle.asn1.ASN1Primitive; 9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)import org.bouncycastle.asn1.ASN1Sequence; 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdochimport org.bouncycastle.asn1.ASN1TaggedObject; 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdochimport org.bouncycastle.asn1.DERBoolean; 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdochimport org.bouncycastle.asn1.DERSequence; 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)public class BasicConstraints 15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) extends ASN1Object 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch{ 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // BEGIN android-changed 18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DERBoolean cA = DERBoolean.FALSE; 19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // END android-changed 20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASN1Integer pathLenConstraint = null; 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public static BasicConstraints getInstance( 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASN1TaggedObject obj, 24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) boolean explicit) 25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { 26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return getInstance(ASN1Sequence.getInstance(obj, explicit)); 27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public static BasicConstraints getInstance( 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Object obj) 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (obj instanceof BasicConstraints) 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return (BasicConstraints)obj; 35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (obj instanceof X509Extension) 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return getInstance(X509Extension.convertValueToObject((X509Extension)obj)); 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (obj != null) 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return new BasicConstraints(ASN1Sequence.getInstance(obj)); 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return null; 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private BasicConstraints( 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASN1Sequence seq) 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (seq.size() == 0) 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) this.cA = null; 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch this.pathLenConstraint = null; 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch else 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (seq.getObjectAt(0) instanceof DERBoolean) 59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { 60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) this.cA = DERBoolean.getInstance(seq.getObjectAt(0)); 61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) else 63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) this.cA = null; 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch this.pathLenConstraint = ASN1Integer.getInstance(seq.getObjectAt(0)); 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (seq.size() > 1) 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (this.cA != null) 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch this.pathLenConstraint = ASN1Integer.getInstance(seq.getObjectAt(1)); 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch else 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) throw new IllegalArgumentException("wrong sequence in constructor"); 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public BasicConstraints( 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) boolean cA) 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (cA) 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // BEGIN android-changed 876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) this.cA = DERBoolean.TRUE; 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // END android-changed 89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) else 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) { 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch this.cA = null; 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch this.pathLenConstraint = null; 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /** 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * create a cA=true object for the given path length constraint. 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * @param pathLenConstraint 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch */ 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public BasicConstraints( 1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int pathLenConstraint) 1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // BEGIN android-changed 106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) this.cA = DERBoolean.TRUE; 107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // END android-changed 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch this.pathLenConstraint = new ASN1Integer(pathLenConstraint); 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public boolean isCA() 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return (cA != null) && cA.isTrue(); 1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public BigInteger getPathLenConstraint() 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (pathLenConstraint != null) 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return pathLenConstraint.getValue(); 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return null; 1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) /** 1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * Produce an object suitable for an ASN1OutputStream. 1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * <pre> 1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * BasicConstraints := SEQUENCE { 1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * cA BOOLEAN DEFAULT FALSE, 1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * pathLenConstraint INTEGER (0..MAX) OPTIONAL 1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * } 1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * </pre> 1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) */ 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public ASN1Primitive toASN1Primitive() 1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { 1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASN1EncodableVector v = new ASN1EncodableVector(); 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (cA != null) 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { 1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) v.add(cA); 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (pathLenConstraint != null) // yes some people actually do this when cA is false... 1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) v.add(pathLenConstraint); 1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return new DERSequence(v); 1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public String toString() 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (pathLenConstraint == null) 1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { 1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (cA == null) 1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { 1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return "BasicConstraints: isCa(false)"; 1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return "BasicConstraints: isCa(" + this.isCA() + ")"; 1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return "BasicConstraints: isCa(" + this.isCA() + "), pathLenConstraint = " + pathLenConstraint.getValue(); 1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)