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