package org.bouncycastle.openssl;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.ASN1TaggedObject;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.asn1.DERTaggedObject;
import org.bouncycastle.asn1.DERUTF8String;
public class CertificateTrustBlock
{
private ASN1Sequence uses;
private ASN1Sequence prohibitions;
private String alias;
public CertificateTrustBlock(Set<ASN1ObjectIdentifier> uses)
{
this(null, uses, null);
}
public CertificateTrustBlock(String alias, Set<ASN1ObjectIdentifier> uses)
{
this(alias, uses, null);
}
public CertificateTrustBlock(String alias, Set<ASN1ObjectIdentifier> uses, Set<ASN1ObjectIdentifier> prohibitions)
{
this.alias = alias;
this.uses = toSequence(uses);
this.prohibitions = toSequence(prohibitions);
}
CertificateTrustBlock(byte[] encoded)
{
ASN1Sequence seq = ASN1Sequence.getInstance(encoded);
for (Enumeration en = seq.getObjects(); en.hasMoreElements();)
{
ASN1Encodable obj = (ASN1Encodable)en.nextElement();
if (obj instanceof ASN1Sequence)
{
this.uses = ASN1Sequence.getInstance(obj);
}
else if (obj instanceof ASN1TaggedObject)
{
this.prohibitions = ASN1Sequence.getInstance((ASN1TaggedObject)obj, false);
}
else if (obj instanceof DERUTF8String)
{
this.alias = DERUTF8String.getInstance(obj).getString();
}
}
}
public String getAlias()
{
return alias;
}
public Set<ASN1ObjectIdentifier> getUses()
{
return toSet(uses);
}
public Set<ASN1ObjectIdentifier> getProhibitions()
{
return toSet(prohibitions);
}
private Set<ASN1ObjectIdentifier> toSet(ASN1Sequence seq)
{
if (seq != null)
{
Set<ASN1ObjectIdentifier> oids = new HashSet<ASN1ObjectIdentifier>(seq.size());
for (Enumeration en = seq.getObjects(); en.hasMoreElements(); )
{
oids.add(ASN1ObjectIdentifier.getInstance(en.nextElement()));
}
return oids;
}
return Collections.EMPTY_SET;
}
private ASN1Sequence toSequence(Set<ASN1ObjectIdentifier> oids)
{
if (oids == null || oids.isEmpty())
{
return null;
}
ASN1EncodableVector v = new ASN1EncodableVector();
for (Iterator it = oids.iterator(); it.hasNext();)
{
v.add((ASN1Encodable)it.next());
}
return new DERSequence(v);
}
ASN1Sequence toASN1Sequence()
{
ASN1EncodableVector v = new ASN1EncodableVector();
if (uses != null)
{
v.add(uses);
}
if (prohibitions != null)
{
v.add(new DERTaggedObject(false, 0, prohibitions));
}
if (alias != null)
{
v.add(new DERUTF8String(alias));
}
return new DERSequence(v);
}
}