// dnlib: See LICENSE.txt for more info using System; namespace dnlib.DotNet { /// /// Public key / public key token base class /// public abstract class PublicKeyBase { /// /// The key data /// protected readonly byte[] data; /// /// Returns true if is null or empty /// public bool IsNullOrEmpty => data is null || data.Length == 0; /// /// Returns true if is null /// public bool IsNull => Data is null; /// /// Gets/sets key data /// public virtual byte[] Data => data; /// /// Gets the /// public abstract PublicKeyToken Token { get; } /// /// Constructor /// /// Key data protected PublicKeyBase(byte[] data) => this.data = data; /// /// Constructor /// /// Key data as a hex string or the string "null" /// to set key data to null protected PublicKeyBase(string hexString) => data = Parse(hexString); static byte[] Parse(string hexString) { if (hexString is null || hexString == "null") return null; return Utils.ParseBytes(hexString); } /// /// Checks whether a public key or token is null or empty /// /// Public key or token instance public static bool IsNullOrEmpty2(PublicKeyBase a) => a is null || a.IsNullOrEmpty; /// /// Returns a /// /// A or a instance public static PublicKeyToken ToPublicKeyToken(PublicKeyBase pkb) { if (pkb is PublicKeyToken pkt) return pkt; if (pkb is PublicKey pk) return pk.Token; return null; } /// /// Compares two s as s /// /// First /// Second /// < 0 if a < b, 0 if a == b, > 0 if a > b public static int TokenCompareTo(PublicKeyBase a, PublicKeyBase b) { if (a == b) return 0; return TokenCompareTo(ToPublicKeyToken(a), ToPublicKeyToken(b)); } /// /// Checks whether two public key tokens are equal /// /// First /// Second /// true if same, false otherwise public static bool TokenEquals(PublicKeyBase a, PublicKeyBase b) => TokenCompareTo(a, b) == 0; static readonly byte[] EmptyByteArray = Array2.Empty(); /// /// Compares two s /// /// First /// Second /// < 0 if a < b, 0 if a == b, > 0 if a > b public static int TokenCompareTo(PublicKeyToken a, PublicKeyToken b) { if (a == b) return 0; return TokenCompareTo(a?.Data, b?.Data); } static int TokenCompareTo(byte[] a, byte[] b) => Utils.CompareTo(a ?? EmptyByteArray, b ?? EmptyByteArray); /// /// Checks whether two public key tokens are equal /// /// First /// Second /// true if same, false otherwise public static bool TokenEquals(PublicKeyToken a, PublicKeyToken b) => TokenCompareTo(a, b) == 0; /// /// Gets the public key token hash code /// /// Public key or token /// The hash code public static int GetHashCodeToken(PublicKeyBase a) => GetHashCode(ToPublicKeyToken(a)); /// /// Gets the public key token hash code /// /// Public key token /// The hash code public static int GetHashCode(PublicKeyToken a) { if (a is null) return 0; return Utils.GetHashCode(a.Data); } /// /// Creates a /// /// Public key data or null /// A new instance or null if /// was null public static PublicKey CreatePublicKey(byte[] data) { if (data is null) return null; return new PublicKey(data); } /// /// Creates a /// /// Public key token data or null /// A new instance or null if /// was null public static PublicKeyToken CreatePublicKeyToken(byte[] data) { if (data is null) return null; return new PublicKeyToken(data); } /// /// Gets the raw public key / public key token byte array /// /// The instance or null /// Raw public key / public key token data or null public static byte[] GetRawData(PublicKeyBase pkb) { if (pkb is null) return null; return pkb.Data; } /// public override string ToString() { var d = Data; if (d is null || d.Length == 0) return "null"; return Utils.ToHex(d, false); } } }