From dd74ec95230d0e222cf6a5b76157b4e9bbecf43d Mon Sep 17 00:00:00 2001 From: merlokk <807634+merlokk@users.noreply.github.com> Date: Sat, 31 Jul 2021 00:05:39 +0300 Subject: [PATCH] ev1 gen session keys --- client/src/mifare/desfirecrypto.c | 29 +++++++++++++++++++++++++++++ client/src/mifare/desfirecrypto.h | 1 + 2 files changed, 30 insertions(+) diff --git a/client/src/mifare/desfirecrypto.c b/client/src/mifare/desfirecrypto.c index 73913c449..a8ddcdf46 100644 --- a/client/src/mifare/desfirecrypto.c +++ b/client/src/mifare/desfirecrypto.c @@ -389,6 +389,35 @@ uint8_t DesfireCommModeToFileCommMode(DesfireCommunicationMode comm_mode) { return fmode; } +void DesfireGenSessionKeyEV1(const uint8_t rnda[], const uint8_t rndb[], DesfireCryptoAlgorythm keytype, uint8_t *key) { + switch (keytype) { + case T_DES: + memcpy(key, rnda, 4); + memcpy(key + 4, rndb, 4); + break; + case T_3DES: + memcpy(key, rnda, 4); + memcpy(key + 4, rndb, 4); + memcpy(key + 8, rnda + 4, 4); + memcpy(key + 12, rndb + 4, 4); + break; + case T_3K3DES: + memcpy(key, rnda, 4); + memcpy(key + 4, rndb, 4); + memcpy(key + 8, rnda + 6, 4); + memcpy(key + 12, rndb + 6, 4); + memcpy(key + 16, rnda + 12, 4); + memcpy(key + 20, rndb + 12, 4); + break; + case T_AES: + memcpy(key, rnda, 4); + memcpy(key + 4, rndb, 4); + memcpy(key + 8, rnda + 12, 4); + memcpy(key + 12, rndb + 12, 4); + break; + } +} + // https://www.nxp.com/docs/en/application-note/AN12343.pdf // page 35 void DesfireGenSessionKeyEV2(uint8_t *key, uint8_t *rndA, uint8_t *rndB, bool enckey, uint8_t *sessionkey) { diff --git a/client/src/mifare/desfirecrypto.h b/client/src/mifare/desfirecrypto.h index 2ba28bc46..49e18edfa 100644 --- a/client/src/mifare/desfirecrypto.h +++ b/client/src/mifare/desfirecrypto.h @@ -108,6 +108,7 @@ uint8_t DesfireDESKeyGetVersion(uint8_t *key); DesfireCommunicationMode DesfireFileCommModeToCommMode(uint8_t file_comm_mode); uint8_t DesfireCommModeToFileCommMode(DesfireCommunicationMode comm_mode); +void DesfireGenSessionKeyEV1(const uint8_t rnda[], const uint8_t rndb[], DesfireCryptoAlgorythm keytype, uint8_t *key); void DesfireGenSessionKeyEV2(uint8_t *key, uint8_t *rndA, uint8_t *rndB, bool enckey, uint8_t *sessionkey); void DesfireEV2FillIV(DesfireContext *ctx, bool ivforcommand, uint8_t *iv);