Added: Change Other Key

This commit is contained in:
TheJoKlLa 2020-10-09 10:48:07 +02:00
parent 307bd60925
commit b52a976098
4 changed files with 134 additions and 44 deletions

View File

@ -70,7 +70,7 @@ namespace NFC.Mifare_DESFire
/// <param name="data">Data</param> /// <param name="data">Data</param>
public string ConvertToHexString(byte[] data) public string ConvertToHexString(byte[] data)
{ {
return BitConverter.ToString(data).Replace("-", " "); return BitConverter.ToString(data).Replace("-", "").ToLower();
} }
/// <summary> /// <summary>
@ -679,6 +679,12 @@ namespace NFC.Mifare_DESFire
_Log.Debug("End AuthenticateISO_DES"); _Log.Debug("End AuthenticateISO_DES");
} }
/// <summary>
/// Change Same AES key as Authenticated
/// </summary>
/// <param name="key_id"></param>
/// <param name="new_key"></param>
/// <param name="key_version"></param>
public void ChangeKey_AES(byte key_id, byte[] new_key, byte key_version) public void ChangeKey_AES(byte key_id, byte[] new_key, byte key_version)
{ {
_Log.Debug("Start ChangeKey_AES"); _Log.Debug("Start ChangeKey_AES");
@ -708,6 +714,9 @@ namespace NFC.Mifare_DESFire
byte[] cryptogram_enc = aes.Encrypt(cryptogram_block, _SessionKey, _IV); byte[] cryptogram_enc = aes.Encrypt(cryptogram_block, _SessionKey, _IV);
_Log.DebugFormat("cryptogram_enc: {0}", ConvertToHexString(cryptogram_enc)); _Log.DebugFormat("cryptogram_enc: {0}", ConvertToHexString(cryptogram_enc));
_IV = ExtractLastBlock(cryptogram_enc, 16);
_Log.DebugFormat("_IV: {0}", ConvertToHexString(_IV));
byte[] data = Concatenate(new byte[] { key_id }, cryptogram_enc); byte[] data = Concatenate(new byte[] { key_id }, cryptogram_enc);
_Log.DebugFormat("data: {0}", ConvertToHexString(data)); _Log.DebugFormat("data: {0}", ConvertToHexString(data));
@ -726,6 +735,68 @@ namespace NFC.Mifare_DESFire
_Log.Debug("End ChangeKey_AES"); _Log.Debug("End ChangeKey_AES");
} }
/// <summary>
/// Change other AES key as Authenticated
/// </summary>
/// <param name="key_id"></param>
/// <param name="new_key"></param>
/// <param name="key_version"></param>
public void ChangeOtherKey_AES(byte key_id, byte[] new_key, byte[] old_key, byte key_version)
{
_Log.Debug("Start ChangeOtherKey_AES");
byte[] header = new byte[]
{
0xC4, key_id
};
_Log.DebugFormat("header: {0}", ConvertToHexString(header));
byte[] key_xor = XOR(new_key, old_key);
// AES Key Version is Append to Key
byte[] key_and_version = Concatenate(key_xor, new byte[] { key_version });
byte[] command = Concatenate(header, key_and_version);
_Log.DebugFormat("command: {0}", ConvertToHexString(command));
CRC32 crc32 = new CRC32();
byte[] crc_cmd = crc32.Calculate(command);
_Log.DebugFormat("crc_cmd: {0}", ConvertToHexString(crc_cmd));
byte[] crc_key = crc32.Calculate(new_key);
_Log.DebugFormat("crc_key: {0}", ConvertToHexString(crc_key));
byte[] cryptogram = Concatenate(key_and_version, crc_cmd);
cryptogram = Concatenate(cryptogram, crc_key);
_Log.DebugFormat("cryptogram: {0}", ConvertToHexString(cryptogram));
byte[] cryptogram_block = ExpandToBlockSize(cryptogram, 16);
_Log.DebugFormat("cryptogram_block: {0}", ConvertToHexString(cryptogram_block));
AES aes = new AES();
byte[] cryptogram_enc = aes.Encrypt(cryptogram_block, _SessionKey, _IV);
_Log.DebugFormat("cryptogram_enc: {0}", ConvertToHexString(cryptogram_enc));
_IV = ExtractLastBlock(cryptogram_enc, 16);
_Log.DebugFormat("_IV: {0}", ConvertToHexString(_IV));
byte[] data = Concatenate(new byte[] { key_id }, cryptogram_enc);
_Log.DebugFormat("data: {0}", ConvertToHexString(data));
APDUCommand cmd_ChangeKey = new APDUCommand(IsoCase.Case4Short)
{
CLA = 0x90,
INS = 0xC4,
Data = data
};
_Log.DebugFormat("APDU_CMD(cmd_ChangeKey): {0}", ConvertToHexString(cmd_ChangeKey.ToArray()));
APDUResponse response = _Card.Transmit(cmd_ChangeKey);
_Log.DebugFormat("APDU_RES(cmd_ChangeKey): {0}", ConvertToHexString(response.ToArray()));
CheckAPDUResponse(response);
_Log.Debug("End ChangeOtherKey_AES");
}
#endregion #endregion
#region Configuration Generator #region Configuration Generator

26
NFC_Test/AES_Test.cs Normal file
View File

@ -0,0 +1,26 @@
using NFC.Crypto;
using NFC.Mifare_DESFire;
using NUnit.Framework;
namespace NFC_Test
{
[TestFixture]
public class AES_Test
{
[Test]
public void Encrypt()
{
MIFARE_DESFire_V2 desfire = new MIFARE_DESFire_V2(null);
byte[] data = desfire.ConvertFromHexString("8db1f942f2d7cc82f6fa1486a30f8c12104a3b07e8eb77a7ac00000000000000");
byte[] key = desfire.ConvertFromHexString("e7aff3361c3e85347993c3219a87d24b");
byte[] iv = desfire.ConvertFromHexString("00000000000000000000000000000000");
AES aes = new AES();
byte[] data_enc = aes.Encrypt(data, key, iv);
byte[] data_enc_expected = desfire.ConvertFromHexString("3c79d74a4969ba7123e5d8f6df24493112d221fd131a4617d0eda5d92ccc1b46");
Assert.AreEqual(data_enc_expected, data_enc);
}
}
}

View File

@ -629,6 +629,33 @@ namespace NFC_Test
desfire.ChangeKey_AES(0x00, new_key, 0x10); desfire.ChangeKey_AES(0x00, new_key, 0x10);
} }
[Test]
public void ChangeOtherKey_AES()
{
ICard card = Substitute.For<ICard>();
MIFARE_DESFire_V2 desfire = new MIFARE_DESFire_V2(card);
APDUResponse response = new APDUResponse()
{
SW1 = 0x91,
SW2 = 0x00
};
byte[] new_key = desfire.ConvertFromHexString("8db1f942f2d7cc82f6fa1486a30f8c12");
byte[] old_key = desfire.ConvertFromHexString("00000000000000000000000000000000");
byte[] sessionkey = desfire.ConvertFromHexString("e7aff3361c3e85347993c3219a87d24b");
byte[] iv = desfire.ConvertFromHexString("00000000000000000000000000000000");
desfire._SessionKey = sessionkey;
desfire._IV = iv;
card.Transmit(null).ReturnsForAnyArgs(response);
desfire.ChangeOtherKey_AES(0x01, new_key, old_key, 0x10);
}
#endregion #endregion
} }
} }

View File

@ -1,15 +1,8 @@
using NUnit.Framework; using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Text;
using NFC; using NFC;
using NFC.Readers.PCSC; using NFC.Readers.PCSC;
using System.Threading;
using NFC.Mifare_DESFire; using NFC.Mifare_DESFire;
using NFC.Mifare_DESFire.Enums; using NFC.Mifare_DESFire.Enums;
using NFC.ISO7816_4;
using PCSC.Iso7816;
using log4net.Config;
namespace NFC_Test namespace NFC_Test
{ {
@ -32,6 +25,7 @@ namespace NFC_Test
MIFARE_DESFire_V2 desfire = new MIFARE_DESFire_V2(card); MIFARE_DESFire_V2 desfire = new MIFARE_DESFire_V2(card);
desfire.SelectApplication(0x000000);
desfire.AuthenticateISO_DES(0x00, desfire.GenerateEmptyKey(16)); desfire.AuthenticateISO_DES(0x00, desfire.GenerateEmptyKey(16));
desfire.Format(); desfire.Format();
@ -44,44 +38,16 @@ namespace NFC_Test
desfire.SelectApplication(0xC0FFEE); desfire.SelectApplication(0xC0FFEE);
desfire.AuthenticateISO_AES(0x00, desfire.GenerateEmptyKey(16)); desfire.AuthenticateISO_AES(0x00, desfire.GenerateEmptyKey(16));
byte[] new_key = desfire.ConvertFromHexString("45eeb8338ae8f49a032e85bb11143530"); byte[] key_master = desfire.ConvertFromHexString("45eeb8338ae8f49a032e85bb11143530");
byte[] key_1 = desfire.ConvertFromHexString("8db1f942f2d7cc82f6fa1486a30f8c12");
byte[] key_2 = desfire.ConvertFromHexString("77611d170c449df6f294c48581ab315d");
desfire.ChangeKey_AES(0x00, key_master, 0x10);
desfire.ChangeKey_AES(0x00, new_key, 0x10); desfire.AuthenticateISO_AES(0x00, key_master);
desfire.ChangeOtherKey_AES(0x01, key_1, desfire.GenerateEmptyKey(16), 0x10);
transmit_successfully = true; desfire.AuthenticateISO_AES(0x00, key_master);
desfire.ChangeOtherKey_AES(0x02, key_2, desfire.GenerateEmptyKey(16), 0x10);
card.Disconnect();
};
reader.CardDiscovered += handler;
reader.Start();
Assert.AreEqual(true, transmit_successfully);
reader.Stop();
reader.CardDiscovered -= handler;
}
[Test]
public void ChangeKey()
{
IHardware hardware = new Hardware();
IReader reader = hardware.OpenReader(_ReaderID);
bool transmit_successfully = false;
ReaderEventHandler handler = (sender, card) =>
{
card.Connect();
MIFARE_DESFire_V2 desfire = new MIFARE_DESFire_V2(card);
desfire.SelectApplication(0xC0FFEE);
desfire.AuthenticateISO_AES(0x00, desfire.GenerateEmptyKey(16));
byte[] new_key = desfire.ConvertFromHexString("45eeb8338ae8f49a032e85bb11143530");
desfire.ChangeKey_AES(0x00, new_key, 0x10);
transmit_successfully = true; transmit_successfully = true;