using System; using System.Collections; using Org.BouncyCastle.Utilities; namespace Org.BouncyCastle.Asn1.X509 { /// Generator for X.509 extensions public class X509ExtensionsGenerator { private IDictionary extensions = Platform.CreateHashtable(); private IList extOrdering = Platform.CreateArrayList(); /// Reset the generator public void Reset() { extensions = Platform.CreateHashtable(); extOrdering = Platform.CreateArrayList(); } /// /// Add an extension with the given oid and the passed in value to be included /// in the OCTET STRING associated with the extension. /// /// OID for the extension. /// True if critical, false otherwise. /// The ASN.1 object to be included in the extension. public void AddExtension( DerObjectIdentifier oid, bool critical, Asn1Encodable extValue) { byte[] encoded; try { encoded = extValue.GetDerEncoded(); } catch (Exception e) { throw new ArgumentException("error encoding value: " + e); } this.AddExtension(oid, critical, encoded); } /// /// Add an extension with the given oid and the passed in byte array to be wrapped /// in the OCTET STRING associated with the extension. /// /// OID for the extension. /// True if critical, false otherwise. /// The byte array to be wrapped. public void AddExtension( DerObjectIdentifier oid, bool critical, byte[] extValue) { if (extensions.Contains(oid)) { throw new ArgumentException("extension " + oid + " already added"); } extOrdering.Add(oid); extensions.Add(oid, new X509Extension(critical, new DerOctetString(extValue))); } /// Return true if there are no extension present in this generator. /// True if empty, false otherwise public bool IsEmpty { get { return extOrdering.Count < 1; } } /// Generate an X509Extensions object based on the current state of the generator. /// An X509Extensions object public X509Extensions Generate() { return new X509Extensions(extOrdering, extensions); } } }