using System; using Org.BouncyCastle.Math; namespace Org.BouncyCastle.Asn1.IsisMtt.X509 { /** * Monetary limit for transactions. The QcEuMonetaryLimit QC statement MUST be * used in new certificates in place of the extension/attribute MonetaryLimit * since January 1, 2004. For the sake of backward compatibility with * certificates already in use, components SHOULD support MonetaryLimit (as well * as QcEuLimitValue). *
* Indicates a monetary limit within which the certificate holder is authorized * to act. (This value DOES NOT express a limit on the liability of the * certification authority). * ** MonetaryLimitSyntax ::= SEQUENCE * { * currency PrintableString (SIZE(3)), * amount INTEGER, * exponent INTEGER * } ** * currency must be the ISO code. * * value = amount�10*exponent */ public class MonetaryLimit : Asn1Encodable { public static MonetaryLimit GetInstance(object obj) { if (obj == null) return null; if (obj is MonetaryLimit monetaryLimit) return monetaryLimit; return new MonetaryLimit(Asn1Sequence.GetInstance(obj)); } public static MonetaryLimit GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit) => new MonetaryLimit(Asn1Sequence.GetInstance(taggedObject, declaredExplicit)); public static MonetaryLimit GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit) => new MonetaryLimit(Asn1Sequence.GetTagged(taggedObject, declaredExplicit)); private readonly DerPrintableString m_currency; private readonly DerInteger m_amount; private readonly DerInteger m_exponent; private MonetaryLimit(Asn1Sequence seq) { int count = seq.Count; if (count != 3) throw new ArgumentException("Bad sequence size: " + count, nameof(seq)); m_currency = DerPrintableString.GetInstance(seq[0]); m_amount = DerInteger.GetInstance(seq[1]); m_exponent = DerInteger.GetInstance(seq[2]); } /** * Constructor from a given details. * * * value = amount�10^exponent * * @param currency The currency. Must be the ISO code. * @param amount The amount * @param exponent The exponent */ public MonetaryLimit(string currency, int amount, int exponent) { m_currency = new DerPrintableString(currency, true); m_amount = new DerInteger(amount); m_exponent = new DerInteger(exponent); } public virtual string Currency => m_currency.GetString(); public virtual BigInteger Amount => m_amount.Value; public virtual BigInteger Exponent => m_exponent.Value; /** * Produce an object suitable for an Asn1OutputStream. * * Returns: * *
* MonetaryLimitSyntax ::= SEQUENCE * { * currency PrintableString (SIZE(3)), * amount INTEGER, * exponent INTEGER * } ** * @return an Asn1Object */ public override Asn1Object ToAsn1Object() => new DerSequence(m_currency, m_amount, m_exponent); } }