You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
228 lines
5.9 KiB
228 lines
5.9 KiB
#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR) |
|
#pragma warning disable |
|
using System; |
|
using System.Text; |
|
|
|
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.X509 |
|
{ |
|
/** |
|
* Implementation of the RoleSyntax object as specified by the RFC3281. |
|
* |
|
* <pre> |
|
* RoleSyntax ::= SEQUENCE { |
|
* roleAuthority [0] GeneralNames OPTIONAL, |
|
* roleName [1] GeneralName |
|
* } |
|
* </pre> |
|
*/ |
|
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 <code> |
|
* RoleSyntax</code>. It must be an instance of <code>RoleSyntax |
|
* </code> or <code>Asn1Sequence</code>. |
|
* @return the instance of <code>RoleSyntax</code> built from the |
|
* supplied object. |
|
* @throws java.lang.ArgumentException if the object passed |
|
* to the factory is not an instance of <code>RoleSyntax</code> or |
|
* <code>Asn1Sequence</code>. |
|
*/ |
|
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 |
|
* <code>new RoleSyntax(null, roleName)</code>. |
|
* @param roleName the role name of this RoleSyntax. |
|
*/ |
|
public RoleSyntax( |
|
GeneralName roleName) |
|
: this(null, roleName) |
|
{ |
|
} |
|
|
|
/** |
|
* Utility constructor. Takes a <code>string</code> argument representing |
|
* the role name, builds a <code>GeneralName</code> to hold the role name |
|
* and calls the constructor that takes a <code>GeneralName</code>. |
|
* @param roleName |
|
*/ |
|
public RoleSyntax( |
|
string roleName) |
|
: this(new GeneralName(GeneralName.UniformResourceIdentifier, |
|
(roleName == null)? "": roleName)) |
|
{ |
|
} |
|
|
|
/** |
|
* Constructor that builds an instance of <code>RoleSyntax</code> by |
|
* extracting the encoded elements from the <code>Asn1Sequence</code> |
|
* object supplied. |
|
* @param seq an instance of <code>Asn1Sequence</code> that holds |
|
* the encoded elements used to build this <code>RoleSyntax</code>. |
|
*/ |
|
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 <code>GeneralNames</code> 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 <code>GeneralName</code> holding the |
|
* role name of this RoleSyntax. |
|
*/ |
|
public GeneralName RoleName |
|
{ |
|
get { return this.roleName; } |
|
} |
|
|
|
/** |
|
* Gets the role name as a <code>java.lang.string</code> object. |
|
* @return the role name of this RoleSyntax represented as a |
|
* <code>string</code> object. |
|
*/ |
|
public string GetRoleNameAsString() |
|
{ |
|
return ((IAsn1String) this.roleName.Name).GetString(); |
|
} |
|
|
|
/** |
|
* Gets the role authority as a <code>string[]</code> object. |
|
* @return the role authority of this RoleSyntax represented as a |
|
* <code>string[]</code> 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 <code>ToAsn1Object</code> as |
|
* required by the superclass <code>ASN1Encodable</code>. |
|
* |
|
* <pre> |
|
* RoleSyntax ::= SEQUENCE { |
|
* roleAuthority [0] GeneralNames OPTIONAL, |
|
* roleName [1] GeneralName |
|
* } |
|
* </pre> |
|
*/ |
|
public override Asn1Object ToAsn1Object() |
|
{ |
|
Asn1EncodableVector v = new Asn1EncodableVector(); |
|
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(); |
|
} |
|
} |
|
} |
|
#pragma warning restore |
|
#endif
|
|
|