Esempio n. 1
0
        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);
        }
Esempio n. 2
0
 /// <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);
 }
Esempio n. 3
0
 /// <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;
 }
Esempio n. 4
0
        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));
        }
Esempio n. 6
0
        /// <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));
            }
        }
Esempio n. 7
0
        /// <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));
        }
Esempio n. 9
0
 public void TestPinBlockMapping(string text, PinBlockFormat expected)
 {
     Assert.AreEqual(expected, text.GetPinBlockFormat());
     Assert.AreEqual(text, expected.GetPinBlockFormat());
 }
Esempio n. 10
0
        /// <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));
            }
        }
Esempio n. 11
0
        /// <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);
        }
Esempio n. 12
0
        /// <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));
        }