restrict change key algo

This commit is contained in:
merlokk 2021-07-19 18:32:10 +03:00
commit 449f4edcb0
3 changed files with 12 additions and 4 deletions

View file

@ -4998,7 +4998,7 @@ static int CmdHF14ADesChangeKey(const char *Cmd) {
} }
DesfireSetCommMode(&dctx, DCMEncryptedPlain); DesfireSetCommMode(&dctx, DCMEncryptedPlain);
res = DesfireChangeKey(&dctx, newkeynum, newkeytype, newkeyver, newkey, oldkeytype, oldkey, true); res = DesfireChangeKey(&dctx, (appid == 0x000000), newkeynum, newkeytype, newkeyver, newkey, oldkeytype, oldkey, true);
if (res == PM3_SUCCESS) { if (res == PM3_SUCCESS) {
PrintAndLogEx(SUCCESS, "Change key " _GREEN_("ok") " "); PrintAndLogEx(SUCCESS, "Change key " _GREEN_("ok") " ");
} else { } else {

View file

@ -1090,14 +1090,22 @@ void PrintKeySettings(uint8_t keysettings, uint8_t numkeys, bool applevel, bool
PrintKeySettingsPICC(keysettings, numkeys, print2ndbyte); PrintKeySettingsPICC(keysettings, numkeys, print2ndbyte);
} }
int DesfireChangeKey(DesfireContext *dctx, uint8_t newkeynum, DesfireCryptoAlgorythm newkeytype, uint32_t newkeyver, uint8_t *newkey, DesfireCryptoAlgorythm oldkeytype, uint8_t *oldkey, bool verbose) { int DesfireChangeKey(DesfireContext *dctx, bool change_master_key, uint8_t newkeynum, DesfireCryptoAlgorythm newkeytype, uint32_t newkeyver, uint8_t *newkey, DesfireCryptoAlgorythm oldkeytype, uint8_t *oldkey, bool verbose) {
uint8_t okeybuf[DESFIRE_MAX_KEY_SIZE] = {0}; uint8_t okeybuf[DESFIRE_MAX_KEY_SIZE] = {0};
uint8_t nkeybuf[DESFIRE_MAX_KEY_SIZE] = {0}; uint8_t nkeybuf[DESFIRE_MAX_KEY_SIZE] = {0};
uint8_t pckcdata[DESFIRE_MAX_KEY_SIZE + 10] = {0}; uint8_t pckcdata[DESFIRE_MAX_KEY_SIZE + 10] = {0};
uint8_t *cdata = &pckcdata[2]; uint8_t *cdata = &pckcdata[2];
uint8_t keynodata = newkeynum & 0x3f; uint8_t keynodata = newkeynum & 0x3f;
keynodata |= (DesfireKeyAlgoToType(newkeytype) & 0x03) << 6;
/*
* Because new crypto methods can be setup only at application creation,
* changing the card master key to one of them require a key_no tweak.
*/
if (change_master_key) {
keynodata |= (DesfireKeyAlgoToType(newkeytype) & 0x03) << 6;
}
pckcdata[0] = MFDES_CHANGE_KEY; // TODO pckcdata[0] = MFDES_CHANGE_KEY; // TODO
pckcdata[1] = keynodata; pckcdata[1] = keynodata;

View file

@ -56,6 +56,6 @@ void PrintKeySettings(uint8_t keysettings, uint8_t numkeys, bool applevel, bool
uint8_t DesfireKeyAlgoToType(DesfireCryptoAlgorythm keyType); uint8_t DesfireKeyAlgoToType(DesfireCryptoAlgorythm keyType);
int DesfireChangeKeyCmd(DesfireContext *dctx, uint8_t *data, size_t datalen, uint8_t *resp, size_t *resplen); int DesfireChangeKeyCmd(DesfireContext *dctx, uint8_t *data, size_t datalen, uint8_t *resp, size_t *resplen);
int DesfireChangeKey(DesfireContext *dctx, uint8_t newkeynum, DesfireCryptoAlgorythm newkeytype, uint32_t newkeyver, uint8_t *newkey, DesfireCryptoAlgorythm oldkeytype, uint8_t *oldkey, bool verbose); int DesfireChangeKey(DesfireContext *dctx, bool change_master_key, uint8_t newkeynum, DesfireCryptoAlgorythm newkeytype, uint32_t newkeyver, uint8_t *newkey, DesfireCryptoAlgorythm oldkeytype, uint8_t *oldkey, bool verbose);
#endif // __DESFIRECORE_H #endif // __DESFIRECORE_H