// 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);
}
}
}