mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-02-24 16:14:59 +08:00
fix key path for cmac subkeys
This commit is contained in:
parent
02194f3e43
commit
7aad008762
3 changed files with 24 additions and 14 deletions
|
@ -151,6 +151,17 @@ size_t DesfireSearchCRCPos(uint8_t *data, size_t datalen, uint8_t respcode, uint
|
||||||
return crcposfound;
|
return crcposfound;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t *DesfireGetKey(DesfireContext *ctx, DesfireCryptoOpKeyType key_type) {
|
||||||
|
if (key_type == DCOSessionKeyMac) {
|
||||||
|
return ctx->sessionKeyMAC;
|
||||||
|
} else if (key_type == DCOSessionKeyEnc) {
|
||||||
|
return ctx->sessionKeyEnc;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ctx->key;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void DesfireCryptoEncDecSingleBlock(uint8_t *key, DesfireCryptoAlgorythm keyType, uint8_t *data, uint8_t *dstdata, uint8_t *ivect, bool dir_to_send, bool encode) {
|
static void DesfireCryptoEncDecSingleBlock(uint8_t *key, DesfireCryptoAlgorythm keyType, uint8_t *data, uint8_t *dstdata, uint8_t *ivect, bool dir_to_send, bool encode) {
|
||||||
size_t block_size = desfire_get_key_block_length(keyType);
|
size_t block_size = desfire_get_key_block_length(keyType);
|
||||||
uint8_t sdata[MAX_CRYPTO_BLOCK_SIZE] = {0};
|
uint8_t sdata[MAX_CRYPTO_BLOCK_SIZE] = {0};
|
||||||
|
@ -232,15 +243,14 @@ void DesfireCryptoEncDecEx(DesfireContext *ctx, DesfireCryptoOpKeyType key_type,
|
||||||
else
|
else
|
||||||
memcpy(xiv, iv, block_size);
|
memcpy(xiv, iv, block_size);
|
||||||
|
|
||||||
|
uint8_t *key = DesfireGetKey(ctx, key_type);
|
||||||
|
if (key == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
size_t offset = 0;
|
size_t offset = 0;
|
||||||
while (offset < srcdatalen) {
|
while (offset < srcdatalen) {
|
||||||
if (key_type == DCOSessionKeyMac) {
|
DesfireCryptoEncDecSingleBlock(key, ctx->keyType, srcdata + offset, data + offset, xiv, dir_to_send, encode);
|
||||||
DesfireCryptoEncDecSingleBlock(ctx->sessionKeyMAC, ctx->keyType, srcdata + offset, data + offset, xiv, dir_to_send, encode);
|
|
||||||
} else if (key_type == DCOSessionKeyEnc) {
|
|
||||||
DesfireCryptoEncDecSingleBlock(ctx->sessionKeyEnc, ctx->keyType, srcdata + offset, data + offset, xiv, dir_to_send, encode);
|
|
||||||
} else {
|
|
||||||
DesfireCryptoEncDecSingleBlock(ctx->key, ctx->keyType, srcdata + offset, data + offset, xiv, dir_to_send, encode);
|
|
||||||
}
|
|
||||||
offset += block_size;
|
offset += block_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -262,7 +272,7 @@ void DesfireCryptoEncDec(DesfireContext *ctx, DesfireCryptoOpKeyType key_type, u
|
||||||
DesfireCryptoEncDecEx(ctx, key_type, srcdata, srcdatalen, dstdata, dir_to_send, xencode, NULL);
|
DesfireCryptoEncDecEx(ctx, key_type, srcdata, srcdatalen, dstdata, dir_to_send, xencode, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DesfireCMACGenerateSubkeys(DesfireContext *ctx, uint8_t *sk1, uint8_t *sk2) {
|
void DesfireCMACGenerateSubkeys(DesfireContext *ctx, DesfireCryptoOpKeyType key_type, uint8_t *sk1, uint8_t *sk2) {
|
||||||
int kbs = desfire_get_key_block_length(ctx->keyType);
|
int kbs = desfire_get_key_block_length(ctx->keyType);
|
||||||
const uint8_t R = (kbs == 8) ? 0x1B : 0x87;
|
const uint8_t R = (kbs == 8) ? 0x1B : 0x87;
|
||||||
|
|
||||||
|
@ -272,7 +282,7 @@ void DesfireCMACGenerateSubkeys(DesfireContext *ctx, uint8_t *sk1, uint8_t *sk2)
|
||||||
uint8_t ivect[kbs];
|
uint8_t ivect[kbs];
|
||||||
memset(ivect, 0, kbs);
|
memset(ivect, 0, kbs);
|
||||||
|
|
||||||
DesfireCryptoEncDecEx(ctx, DCOSessionKeyMac, l, kbs, l, true, true, ivect);
|
DesfireCryptoEncDecEx(ctx, key_type, l, kbs, l, true, true, ivect);
|
||||||
|
|
||||||
bool txor = false;
|
bool txor = false;
|
||||||
|
|
||||||
|
@ -303,7 +313,7 @@ void DesfireCryptoCMAC(DesfireContext *ctx, uint8_t *data, size_t len, uint8_t *
|
||||||
|
|
||||||
uint8_t sk1[DESFIRE_MAX_CRYPTO_BLOCK_SIZE] = {0};
|
uint8_t sk1[DESFIRE_MAX_CRYPTO_BLOCK_SIZE] = {0};
|
||||||
uint8_t sk2[DESFIRE_MAX_CRYPTO_BLOCK_SIZE] = {0};
|
uint8_t sk2[DESFIRE_MAX_CRYPTO_BLOCK_SIZE] = {0};
|
||||||
DesfireCMACGenerateSubkeys(ctx, sk1, sk2);
|
DesfireCMACGenerateSubkeys(ctx, DCOSessionKeyMac, sk1, sk2);
|
||||||
|
|
||||||
memcpy(buffer, data, len);
|
memcpy(buffer, data, len);
|
||||||
|
|
||||||
|
@ -337,7 +347,7 @@ void MifareKdfAn10922(DesfireContext *ctx, const uint8_t *data, size_t len) {
|
||||||
|
|
||||||
uint8_t sk1[DESFIRE_MAX_CRYPTO_BLOCK_SIZE] = {0};
|
uint8_t sk1[DESFIRE_MAX_CRYPTO_BLOCK_SIZE] = {0};
|
||||||
uint8_t sk2[DESFIRE_MAX_CRYPTO_BLOCK_SIZE] = {0};
|
uint8_t sk2[DESFIRE_MAX_CRYPTO_BLOCK_SIZE] = {0};
|
||||||
DesfireCMACGenerateSubkeys(ctx, sk1, sk2);
|
DesfireCMACGenerateSubkeys(ctx, DCOMainKey, sk1, sk2);
|
||||||
|
|
||||||
// reserv atleast 32bytes.
|
// reserv atleast 32bytes.
|
||||||
uint8_t buffer[DESFIRE_MAX_CRYPTO_BLOCK_SIZE * 2] = {0};
|
uint8_t buffer[DESFIRE_MAX_CRYPTO_BLOCK_SIZE * 2] = {0};
|
||||||
|
|
|
@ -108,9 +108,10 @@ size_t DesfireGetMACLength(DesfireContext *ctx);
|
||||||
|
|
||||||
size_t DesfireSearchCRCPos(uint8_t *data, size_t datalen, uint8_t respcode, uint8_t crclen);
|
size_t DesfireSearchCRCPos(uint8_t *data, size_t datalen, uint8_t respcode, uint8_t crclen);
|
||||||
|
|
||||||
|
uint8_t *DesfireGetKey(DesfireContext *ctx, DesfireCryptoOpKeyType key_type);
|
||||||
void DesfireCryptoEncDec(DesfireContext *ctx, DesfireCryptoOpKeyType key_type, uint8_t *srcdata, size_t srcdatalen, uint8_t *dstdata, bool encode);
|
void DesfireCryptoEncDec(DesfireContext *ctx, DesfireCryptoOpKeyType key_type, uint8_t *srcdata, size_t srcdatalen, uint8_t *dstdata, bool encode);
|
||||||
void DesfireCryptoEncDecEx(DesfireContext *ctx, DesfireCryptoOpKeyType key_type, uint8_t *srcdata, size_t srcdatalen, uint8_t *dstdata, bool dir_to_send, bool encode, uint8_t *iv);
|
void DesfireCryptoEncDecEx(DesfireContext *ctx, DesfireCryptoOpKeyType key_type, uint8_t *srcdata, size_t srcdatalen, uint8_t *dstdata, bool dir_to_send, bool encode, uint8_t *iv);
|
||||||
void DesfireCMACGenerateSubkeys(DesfireContext *ctx, uint8_t *sk1, uint8_t *sk2);
|
void DesfireCMACGenerateSubkeys(DesfireContext *ctx, DesfireCryptoOpKeyType key_type, uint8_t *sk1, uint8_t *sk2);
|
||||||
void DesfireCryptoCMAC(DesfireContext *ctx, uint8_t *srcdata, size_t srcdatalen, uint8_t *cmac);
|
void DesfireCryptoCMAC(DesfireContext *ctx, uint8_t *srcdata, size_t srcdatalen, uint8_t *cmac);
|
||||||
void MifareKdfAn10922(DesfireContext *ctx, const uint8_t *data, size_t len);
|
void MifareKdfAn10922(DesfireContext *ctx, const uint8_t *data, size_t len);
|
||||||
|
|
||||||
|
|
|
@ -87,9 +87,8 @@ static bool TestCMACSubkeys(void) {
|
||||||
uint8_t sk2[DESFIRE_MAX_CRYPTO_BLOCK_SIZE] = {0};
|
uint8_t sk2[DESFIRE_MAX_CRYPTO_BLOCK_SIZE] = {0};
|
||||||
DesfireContext dctx;
|
DesfireContext dctx;
|
||||||
DesfireSetKey(&dctx, 0, T_AES, key);
|
DesfireSetKey(&dctx, 0, T_AES, key);
|
||||||
memcpy(dctx.sessionKeyMAC, key, sizeof(key));
|
|
||||||
|
|
||||||
DesfireCMACGenerateSubkeys(&dctx, sk1, sk2);
|
DesfireCMACGenerateSubkeys(&dctx, DCOMainKey, sk1, sk2);
|
||||||
|
|
||||||
uint8_t sk1test[] = {0xFB, 0xC9, 0xF7, 0x5C, 0x94, 0x13, 0xC0, 0x41, 0xDF, 0xEE, 0x45, 0x2D, 0x3F, 0x07, 0x06, 0xD1};
|
uint8_t sk1test[] = {0xFB, 0xC9, 0xF7, 0x5C, 0x94, 0x13, 0xC0, 0x41, 0xDF, 0xEE, 0x45, 0x2D, 0x3F, 0x07, 0x06, 0xD1};
|
||||||
uint8_t sk2test[] = {0xF7, 0x93, 0xEE, 0xB9, 0x28, 0x27, 0x80, 0x83, 0xBF, 0xDC, 0x8A, 0x5A, 0x7E, 0x0E, 0x0D, 0x25};
|
uint8_t sk2test[] = {0xF7, 0x93, 0xEE, 0xB9, 0x28, 0x27, 0x80, 0x83, 0xBF, 0xDC, 0x8A, 0x5A, 0x7E, 0x0E, 0x0D, 0x25};
|
||||||
|
|
Loading…
Reference in a new issue