001package org.apache.commons.ssl.org.bouncycastle.asn1.x509; 002 003import java.util.Enumeration; 004 005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector; 006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object; 007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive; 008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence; 009import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject; 010import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence; 011import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject; 012 013public class NameConstraints 014 extends ASN1Object 015{ 016 private GeneralSubtree[] permitted, excluded; 017 018 public static NameConstraints getInstance(Object obj) 019 { 020 if (obj instanceof NameConstraints) 021 { 022 return (NameConstraints)obj; 023 } 024 if (obj != null) 025 { 026 return new NameConstraints(ASN1Sequence.getInstance(obj)); 027 } 028 029 return null; 030 } 031 032 private NameConstraints(ASN1Sequence seq) 033 { 034 Enumeration e = seq.getObjects(); 035 while (e.hasMoreElements()) 036 { 037 ASN1TaggedObject o = ASN1TaggedObject.getInstance(e.nextElement()); 038 switch (o.getTagNo()) 039 { 040 case 0: 041 permitted = createArray(ASN1Sequence.getInstance(o, false)); 042 break; 043 case 1: 044 excluded = createArray(ASN1Sequence.getInstance(o, false)); 045 break; 046 } 047 } 048 } 049 050 /** 051 * Constructor from a given details. 052 * 053 * <p> 054 * permitted and excluded are arrays of GeneralSubtree objects. 055 * 056 * @param permitted 057 * Permitted subtrees 058 * @param excluded 059 * Excludes subtrees 060 */ 061 public NameConstraints( 062 GeneralSubtree[] permitted, 063 GeneralSubtree[] excluded) 064 { 065 if (permitted != null) 066 { 067 this.permitted = permitted; 068 } 069 070 if (excluded != null) 071 { 072 this.excluded = excluded; 073 } 074 } 075 076 private GeneralSubtree[] createArray(ASN1Sequence subtree) 077 { 078 GeneralSubtree[] ar = new GeneralSubtree[subtree.size()]; 079 080 for (int i = 0; i != ar.length; i++) 081 { 082 ar[i] = GeneralSubtree.getInstance(subtree.getObjectAt(i)); 083 } 084 085 return ar; 086 } 087 088 public GeneralSubtree[] getPermittedSubtrees() 089 { 090 return permitted; 091 } 092 093 public GeneralSubtree[] getExcludedSubtrees() 094 { 095 return excluded; 096 } 097 098 /* 099 * NameConstraints ::= SEQUENCE { permittedSubtrees [0] GeneralSubtrees 100 * OPTIONAL, excludedSubtrees [1] GeneralSubtrees OPTIONAL } 101 */ 102 public ASN1Primitive toASN1Primitive() 103 { 104 ASN1EncodableVector v = new ASN1EncodableVector(); 105 106 if (permitted != null) 107 { 108 v.add(new DERTaggedObject(false, 0, new DERSequence(permitted))); 109 } 110 111 if (excluded != null) 112 { 113 v.add(new DERTaggedObject(false, 1, new DERSequence(excluded))); 114 } 115 116 return new DERSequence(v); 117 } 118}