コード例 #1
0
        public void X919MacTest()
        {
            var          hk   = new HexKey("838652DF68A246046DAB6104583B201A");
            const string data = "30303030303030303131313131313131";
            var          iv   = "0000000000000000";

            // Binary data MACing.
            var hexStr = ("00000000").GetBytes().GetHexString();

            Assert.AreEqual("3F431586CA33D99C", IsoX919Mac.MacHexData(hexStr, hk, iv, IsoX919BlockType.OnlyBlock));

            // Binary un-padded data MACing.
            hexStr = ("000000001").GetBytes().GetHexString();
            Assert.AreEqual("2FE7118F2074398E", IsoX919Mac.MacHexData(hexStr, hk, iv, IsoX919BlockType.OnlyBlock));

            // Successive hex data MACing.
            iv = IsoX919Mac.MacHexData(data, hk, iv, IsoX919BlockType.FirstBlock);
            Assert.AreEqual("A9D4D96683B51333", iv);
            iv = IsoX919Mac.MacHexData(data, hk, iv, IsoX919BlockType.NextBlock);
            Assert.AreEqual("DA46CEC9E61AF065", iv);
            iv = IsoX919Mac.MacHexData(data, hk, iv, IsoX919BlockType.NextBlock);
            Assert.AreEqual("56A27E35442BD07D", iv);
            iv = IsoX919Mac.MacHexData(data, hk, iv, IsoX919BlockType.NextBlock);
            Assert.AreEqual("B12874BED7137303", iv);
            iv = IsoX919Mac.MacHexData(data, hk, iv, IsoX919BlockType.FinalBlock);
            Assert.AreEqual("0D99127F7734AA58", iv);
        }
        /// <summary>
        /// Process request.
        /// </summary>
        /// <returns>Response message.</returns>
        public override StreamResponse ConstructResponse()
        {
            var mr = new StreamResponse();

            var cryptKey = new HexKey(_key);

            if ((cryptKey.Length == KeyLength.SingleLength && _keyLength != KeySingle) ||
                (cryptKey.Length == KeyLength.DoubleLength && _keyLength != KeyDouble))
            {
                mr.Append(ErrorCodes.ER_04_INVALID_KEY_TYPE_CODE);
                return(mr);
            }

            var len = Convert.ToInt32(_msgLength, 16);

            if (_messageType == InputHex)
            {
                len = len * 2;
            }

            if (_strMsg.Length < len)
            {
                mr.Append(ErrorCodes.ER_80_DATA_LENGTH_ERROR);
                return(mr);
            }

            var rawData = _messageType == InputHex
                              ? _strMsg.Substring(0, len)
                              : _strMsg.Substring(0, len).GetBytes().GetHexString();

            var clearKey = _keyType == KeyTak
                               ? new HexKeyThales(new KeyTypeCode(0, LmkPair.Pair16_17), false, _key)
                               : new HexKeyThales(new KeyTypeCode(0, LmkPair.Pair26_27), false, _key);

            var block = IsoX919BlockType.FinalBlock;

            switch (_blockNumber)
            {
            case MacSingleBlock:
                block = IsoX919BlockType.OnlyBlock;
                _iv   = Zeroes;
                break;

            case MacFirstBlock:
                block = IsoX919BlockType.FirstBlock;
                _iv   = Zeroes;
                break;

            case MacMiddleBlock:
                block = IsoX919BlockType.NextBlock;
                break;
            }

            var mac = IsoX919Mac.MacHexData(rawData, clearKey.ClearHexKey, _iv, block);

            Log.InfoFormat("Key (clear): {0}", clearKey.ClearKey);
            Log.InfoFormat("IV: {0}", _iv);
            Log.InfoFormat("Resulting MAC: {0}", mac);

            mr.Append(ErrorCodes.ER_00_NO_ERROR);
            mr.Append(mac);

            return(mr);
        }