180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giropackage org.bouncycastle.asn1.x509;
280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro
380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giroimport java.math.BigInteger;
480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro
580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giroimport org.bouncycastle.asn1.ASN1EncodableVector;
680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giroimport org.bouncycastle.asn1.ASN1Integer;
780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giroimport org.bouncycastle.asn1.ASN1Object;
880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giroimport org.bouncycastle.asn1.ASN1Primitive;
980261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giroimport org.bouncycastle.asn1.ASN1Sequence;
1080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giroimport org.bouncycastle.asn1.ASN1TaggedObject;
1180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giroimport org.bouncycastle.asn1.DERSequence;
1280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giroimport org.bouncycastle.asn1.DERTaggedObject;
1380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro
1480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro/**
1580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro * PKIX RFC 5280
1680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro * <pre>
1780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro * id-ce-policyConstraints OBJECT IDENTIFIER ::=  { id-ce 36 }
1880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro *
1980261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro * PolicyConstraints ::= SEQUENCE {
2080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro *      requireExplicitPolicy           [0] SkipCerts OPTIONAL,
2180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro *      inhibitPolicyMapping            [1] SkipCerts OPTIONAL }
2280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro *
2380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro * SkipCerts ::= INTEGER (0..MAX)
2480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro * </pre>
2580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro */
2680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giropublic class PolicyConstraints
2780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    extends ASN1Object
2880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro{
2980261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    private BigInteger requireExplicitPolicyMapping;
3080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    private BigInteger inhibitPolicyMapping;
3180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro
3280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    public PolicyConstraints(BigInteger requireExplicitPolicyMapping, BigInteger inhibitPolicyMapping)
3380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    {
3480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        this.requireExplicitPolicyMapping = requireExplicitPolicyMapping;
3580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        this.inhibitPolicyMapping = inhibitPolicyMapping;
3680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    }
3780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro
3880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    private PolicyConstraints(ASN1Sequence seq)
3980261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    {
4080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        for (int i = 0; i != seq.size(); i++)
4180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        {
4280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            ASN1TaggedObject to = ASN1TaggedObject.getInstance(seq.getObjectAt(i));
4380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro
4480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            if (to.getTagNo() == 0)
4580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            {
4680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro                requireExplicitPolicyMapping = ASN1Integer.getInstance(to, false).getValue();
4780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            }
4880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            else if (to.getTagNo() == 1)
4980261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            {
5080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro                inhibitPolicyMapping = ASN1Integer.getInstance(to, false).getValue();
5180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            }
5280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            else
5380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            {
5480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro                throw new IllegalArgumentException("Unknown tag encountered.");
5580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            }
5680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        }
5780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    }
5880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro
5980261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    public static PolicyConstraints getInstance(
6080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        Object  obj)
6180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    {
6280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        if (obj instanceof PolicyConstraints)
6380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        {
6480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            return (PolicyConstraints)obj;
6580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        }
6680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro
6780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        if (obj != null)
6880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        {
6980261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro            return new PolicyConstraints(ASN1Sequence.getInstance(obj));
7080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        }
7180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro
7280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        return null;
7380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    }
7480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro
7580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    public static PolicyConstraints fromExtensions(Extensions extensions)
7680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    {
7780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        return PolicyConstraints.getInstance(extensions.getExtensionParsedValue(Extension.policyConstraints));
7880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    }
7980261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro
8080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    public BigInteger getRequireExplicitPolicyMapping()
8180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    {
8280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        return requireExplicitPolicyMapping;
8380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    }
8480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro
8580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    public BigInteger getInhibitPolicyMapping()
8680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    {
8780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        return inhibitPolicyMapping;
8880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    }
8980261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro
9080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    public ASN1Primitive toASN1Primitive()
9180261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    {
9280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        ASN1EncodableVector v = new ASN1EncodableVector();
9380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro
9480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        if (requireExplicitPolicyMapping != null)
9580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        {
96823ad5bac1616941ae772fe6b69560b49c89d7b3Adam Vartanian            v.add(new DERTaggedObject(false,0, new ASN1Integer(requireExplicitPolicyMapping)));
9780261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        }
9880261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro
9980261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        if (inhibitPolicyMapping != null)
10080261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        {
101823ad5bac1616941ae772fe6b69560b49c89d7b3Adam Vartanian            v.add(new DERTaggedObject(false, 1, new ASN1Integer(inhibitPolicyMapping)));
10280261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        }
10380261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro
10480261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro        return new DERSequence(v);
10580261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro    }
10680261dd2d1824bb3862e90e77a5412d56ad88b1fSergio Giro}
107