using System; using System.Text; namespace Org.BouncyCastle.Asn1.X509 { /** * Implementation of the RoleSyntax object as specified by the RFC3281. * *
* RoleSyntax ::= SEQUENCE { * roleAuthority [0] GeneralNames OPTIONAL, * roleName [1] GeneralName * } **/ public class RoleSyntax : Asn1Encodable { private readonly GeneralNames roleAuthority; private readonly GeneralName roleName; /** * RoleSyntax factory method. * @param obj the object used to construct an instance of
* RoleSyntax
. It must be an instance of RoleSyntax
*
or Asn1Sequence
.
* @return the instance of RoleSyntax
built from the
* supplied object.
* @throws java.lang.ArgumentException if the object passed
* to the factory is not an instance of RoleSyntax
or
* Asn1Sequence
.
*/
public static RoleSyntax GetInstance(
object obj)
{
if (obj is RoleSyntax)
return (RoleSyntax)obj;
if (obj != null)
return new RoleSyntax(Asn1Sequence.GetInstance(obj));
return null;
}
/**
* Constructor.
* @param roleAuthority the role authority of this RoleSyntax.
* @param roleName the role name of this RoleSyntax.
*/
public RoleSyntax(
GeneralNames roleAuthority,
GeneralName roleName)
{
if (roleName == null
|| roleName.TagNo != GeneralName.UniformResourceIdentifier
|| ((IAsn1String) roleName.Name).GetString().Equals(""))
{
throw new ArgumentException("the role name MUST be non empty and MUST " +
"use the URI option of GeneralName");
}
this.roleAuthority = roleAuthority;
this.roleName = roleName;
}
/**
* Constructor. Invoking this constructor is the same as invoking
* new RoleSyntax(null, roleName)
.
* @param roleName the role name of this RoleSyntax.
*/
public RoleSyntax(
GeneralName roleName)
: this(null, roleName)
{
}
/**
* Utility constructor. Takes a string
argument representing
* the role name, builds a GeneralName
to hold the role name
* and calls the constructor that takes a GeneralName
.
* @param roleName
*/
public RoleSyntax(
string roleName)
: this(new GeneralName(GeneralName.UniformResourceIdentifier,
(roleName == null)? "": roleName))
{
}
/**
* Constructor that builds an instance of RoleSyntax
by
* extracting the encoded elements from the Asn1Sequence
* object supplied.
* @param seq an instance of Asn1Sequence
that holds
* the encoded elements used to build this RoleSyntax
.
*/
private RoleSyntax(
Asn1Sequence seq)
{
if (seq.Count < 1 || seq.Count > 2)
{
throw new ArgumentException("Bad sequence size: " + seq.Count);
}
for (int i = 0; i != seq.Count; i++)
{
Asn1TaggedObject taggedObject = Asn1TaggedObject.GetInstance(seq[i]);
switch (taggedObject.TagNo)
{
case 0:
roleAuthority = GeneralNames.GetInstance(taggedObject, false);
break;
case 1:
roleName = GeneralName.GetInstance(taggedObject, true);
break;
default:
throw new ArgumentException("Unknown tag in RoleSyntax");
}
}
}
/**
* Gets the role authority of this RoleSyntax.
* @return an instance of GeneralNames
holding the
* role authority of this RoleSyntax.
*/
public GeneralNames RoleAuthority
{
get { return this.roleAuthority; }
}
/**
* Gets the role name of this RoleSyntax.
* @return an instance of GeneralName
holding the
* role name of this RoleSyntax.
*/
public GeneralName RoleName
{
get { return this.roleName; }
}
/**
* Gets the role name as a java.lang.string
object.
* @return the role name of this RoleSyntax represented as a
* string
object.
*/
public string GetRoleNameAsString()
{
return ((IAsn1String) this.roleName.Name).GetString();
}
/**
* Gets the role authority as a string[]
object.
* @return the role authority of this RoleSyntax represented as a
* string[]
array.
*/
public string[] GetRoleAuthorityAsString()
{
if (roleAuthority == null)
{
return new string[0];
}
GeneralName[] names = roleAuthority.GetNames();
string[] namesString = new string[names.Length];
for(int i = 0; i < names.Length; i++)
{
Asn1Encodable asn1Value = names[i].Name;
if (asn1Value is IAsn1String)
{
namesString[i] = ((IAsn1String) asn1Value).GetString();
}
else
{
namesString[i] = asn1Value.ToString();
}
}
return namesString;
}
/**
* Implementation of the method ToAsn1Object
as
* required by the superclass ASN1Encodable
.
*
* * RoleSyntax ::= SEQUENCE { * roleAuthority [0] GeneralNames OPTIONAL, * roleName [1] GeneralName * } **/ public override Asn1Object ToAsn1Object() { Asn1EncodableVector v = new Asn1EncodableVector(2); v.AddOptionalTagged(false, 0, roleAuthority); v.Add(new DerTaggedObject(true, 1, roleName)); return new DerSequence(v); } public override string ToString() { StringBuilder buff = new StringBuilder("Name: " + this.GetRoleNameAsString() + " - Auth: "); if (this.roleAuthority == null || roleAuthority.GetNames().Length == 0) { buff.Append("N/A"); } else { string[] names = this.GetRoleAuthorityAsString(); buff.Append('[').Append(names[0]); for(int i = 1; i < names.Length; i++) { buff.Append(", ").Append(names[i]); } buff.Append(']'); } return buff.ToString(); } } }