public string CalPinBlock(string pan, string pin, PinBlockFormat format) { string pinBlock = string.Empty; if (string.IsNullOrEmpty(pin)) { return(pinBlock); } if (pin.Length < 4 || pin.Length > 12) { return(pinBlock); } if (format == PinBlockFormat.ISO0) { pinBlock = CalPinBlockInFormatISO0(pan, pin); } else if (format == PinBlockFormat.VISA3) { pinBlock = CalPinBlockInFormatVISA3(pin); } return(pinBlock); }
/// <summary> /// Creates a new instance of this class form encrypted data. /// </summary> /// <param name="encryptedPinBlock">Encrypted PIN block.</param> /// <param name="accountOrPadding">Account or padding string.</param> /// <param name="format">PIN block format.</param> /// <param name="clearKey">Clear encryption key.</param> public PinBlock(string encryptedPinBlock, string accountOrPadding, PinBlockFormat format, HexKey clearKey) { AccountOrPadding = accountOrPadding; Format = format; ClearPinBlock = clearKey.Decrypt(encryptedPinBlock); Pin = ClearPinBlock.GetPin(accountOrPadding, format); }
/// <summary> /// Creates a new instance of this class from clear data. /// </summary> /// <param name="pin">PIN.</param> /// <param name="accountOrPadding">Account or padding string.</param> /// <param name="format">PIN block format.</param> public PinBlock(string pin, string accountOrPadding, PinBlockFormat format) { ClearPinBlock = pin.GetPinBlock(accountOrPadding, format); Pin = pin; AccountOrPadding = accountOrPadding; Format = format; }
public string CalPin(string pan, string pinBlock, PinBlockFormat format) { string pin = string.Empty; if (string.IsNullOrEmpty(pinBlock)) { return(pin); } if (pinBlock.Length != 16) { return(pin); } if (format == PinBlockFormat.ISO0) { pin = CalPinInFormatISO0(pan, pinBlock); } else if (format == PinBlockFormat.VISA3) { pin = CalPinInFormatVISA3(pinBlock); } return(pin); }
public void TranslateEncryptedPinBlock(string pinBlock, string accountOrPadding, PinBlockFormat sourceFormat, PinBlockFormat targetFormat, string sourceClearKey, string targetClearKey, string expected) { var pb = new PinBlock(pinBlock, accountOrPadding, sourceFormat, new HexKey(sourceClearKey)); var key = new HexKey(targetClearKey); Assert.AreEqual(expected, pb.Translate(key, targetFormat)); }
/// <summary> /// Creates a clear PIN block for a PIN. /// </summary> /// <param name="pin">PIN to create PIN block for.</param> /// <param name="accountOrPadding">Account or padding string, depending /// on the PIN block format.</param> /// <param name="format">PIN block format to use.</param> /// <returns>Clear PIN block.</returns> public static string GetPinBlock(this string pin, string accountOrPadding, PinBlockFormat format) { switch (format) { case PinBlockFormat.AnsiX98: if (accountOrPadding.Length < 12) { throw new InvalidOperationException("Account length must be equal or greater than 12 to use ANSIX9.8"); } var s1 = (pin.Length.ToString().PadLeft(2, '0') + pin).PadRight(16, 'F'); var s2 = accountOrPadding.PadLeft(16, '0'); return(s1.XorHex(s2)); case PinBlockFormat.Diebold: return(pin.PadRight(16, 'F')); case PinBlockFormat.Docutel: if (pin.Length > 6) { throw new InvalidOperationException("PIN length must be less or equal to 6 to use Docutel"); } var s3 = pin.Length.ToString() + pin.PadLeft(6, '0'); return(s3 + accountOrPadding.Substring(0, 16 - s3.Length)); case PinBlockFormat.Iso94564_1: var s4 = ("0" + pin.Length.ToString() + pin).PadLeft(16, 'F'); var s5 = "0000" + accountOrPadding.Substring(0, 12); return(s4.XorHex(s5)); case PinBlockFormat.Plus: throw new NotSupportedException("Unsupported PIN block format PLUS"); default: throw new NotSupportedException(string.Format("Unsupported PIN block format {0}", format)); } }
/// <summary> /// Returns a PIN block format code corresponding /// to a PIN block format. /// </summary> /// <param name="format">PIN block format.</param> /// <returns>PIN block format code.</returns> public static string GetPinBlockFormat(this PinBlockFormat format) { switch (format) { case PinBlockFormat.AnsiX98: return("01"); case PinBlockFormat.Docutel: return("02"); case PinBlockFormat.Diebold: return("03"); case PinBlockFormat.Plus: return("04"); case PinBlockFormat.Iso94564_1: return("05"); default: throw new InvalidCastException(string.Format("PIN block format {0} not valid or unsupported", format)); } }
public void TranslateClearPinBlock(string pin, string accountOrPadding, PinBlockFormat sourceFormat, PinBlockFormat targetFormat, string expected) { var pb = new PinBlock(pin, accountOrPadding, sourceFormat); Assert.AreEqual(expected, pb.Translate(targetFormat)); }
public void TestPinBlockMapping(string text, PinBlockFormat expected) { Assert.AreEqual(expected, text.GetPinBlockFormat()); Assert.AreEqual(text, expected.GetPinBlockFormat()); }
/// <summary> /// Gets the PIN from a clear PIN block. /// </summary> /// <param name="clearPinBlock">Clear PIN block.</param> /// <param name="accountOrPadding">Account or padding string.</param> /// <param name="format">PIN block format.</param> /// <returns>PIN of the PIN block.</returns> public static string GetPin(this string clearPinBlock, string accountOrPadding, PinBlockFormat format) { switch (format) { case PinBlockFormat.AnsiX98: var s1 = accountOrPadding.PadLeft(16, '0').XorHex(clearPinBlock); return(s1.Substring(2, Convert.ToInt32(s1.Substring(0, 2)))); case PinBlockFormat.Diebold: return(clearPinBlock.Replace("F", "")); case PinBlockFormat.Docutel: return(clearPinBlock.Substring(1, Convert.ToInt32(clearPinBlock.Substring(0, 1)))); case PinBlockFormat.Iso94564_1: var s2 = "0000" + accountOrPadding.PadLeft(16, 'F').XorHex(clearPinBlock); var pl = Convert.ToInt32(s2.Substring(11, 1)); return(s2.Substring(12, pl)); case PinBlockFormat.Plus: throw new NotSupportedException("Unsupported PIN block format PLUS"); default: throw new NotSupportedException(string.Format("Unsupported PIN block format {0}", format)); } }
/// <summary> /// Translte the PIN block under a different /// PIN block format. /// </summary> /// <param name="format">New PIN block format.</param> /// <returns>Translated PIN block.</returns> public string Translate(PinBlockFormat format) { var newBlock = new PinBlock(Pin, AccountOrPadding, format); return(newBlock.ClearPinBlock); }
/// <summary> /// Translate and encrypt PIN block. /// </summary> /// <param name="key">Clear encryption key.</param> /// <param name="format">New PIN block format.</param> /// <returns>Translated and encrypted PIN block.</returns> public string Translate(HexKey key, PinBlockFormat format) { var newBlock = new PinBlock(Pin, AccountOrPadding, format); return(key.Encrypt(newBlock.ClearPinBlock)); }