mirror of
https://gitlab.com/fabinfra/fabaccess/borepin.git
synced 2025-06-11 11:03:23 +02:00
Added: Change Other Key
This commit is contained in:
@ -70,7 +70,7 @@ namespace NFC.Mifare_DESFire
|
||||
/// <param name="data">Data</param>
|
||||
public string ConvertToHexString(byte[] data)
|
||||
{
|
||||
return BitConverter.ToString(data).Replace("-", " ");
|
||||
return BitConverter.ToString(data).Replace("-", "").ToLower();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -679,6 +679,12 @@ namespace NFC.Mifare_DESFire
|
||||
_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)
|
||||
{
|
||||
_Log.Debug("Start ChangeKey_AES");
|
||||
@ -708,6 +714,9 @@ namespace NFC.Mifare_DESFire
|
||||
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));
|
||||
|
||||
@ -726,6 +735,68 @@ namespace NFC.Mifare_DESFire
|
||||
|
||||
_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
|
||||
|
||||
#region Configuration Generator
|
||||
|
Reference in New Issue
Block a user