diff --git a/client/src/mifare/lrpcrypto.c b/client/src/mifare/lrpcrypto.c index e274b660b..9b1d0e0df 100644 --- a/client/src/mifare/lrpcrypto.c +++ b/client/src/mifare/lrpcrypto.c @@ -265,3 +265,13 @@ void LRPCMAC(LRPContext *ctx, uint8_t *data, size_t datalen, uint8_t *cmac) { LRPEvalLRP(ctx, y, CRYPTO_AES128_KEY_SIZE * 2, true, cmac); } + +void LRPCMAC8(LRPContext *ctx, uint8_t *data, size_t datalen, uint8_t *cmac) { + uint8_t cmac_tmp[16] = {0}; + memset(cmac, 0x00, 8); + + LRPCMAC(ctx, data, datalen, cmac_tmp); + + for (int i = 0; i < 8; i++) + cmac[i] = cmac_tmp[i * 2 + 1]; +} diff --git a/client/src/mifare/lrpcrypto.h b/client/src/mifare/lrpcrypto.h index cf1653865..d3834b6c6 100644 --- a/client/src/mifare/lrpcrypto.h +++ b/client/src/mifare/lrpcrypto.h @@ -56,5 +56,6 @@ void LRPEncode(LRPContext *ctx, uint8_t *data, size_t datalen, uint8_t *resp, si void LRPDecode(LRPContext *ctx, uint8_t *data, size_t datalen, uint8_t *resp, size_t *resplen); void LRPGenSubkeys(uint8_t *key, uint8_t *sk1, uint8_t *sk2); void LRPCMAC(LRPContext *ctx, uint8_t *data, size_t datalen, uint8_t *cmac); +void LRPCMAC8(LRPContext *ctx, uint8_t *data, size_t datalen, uint8_t *cmac); #endif // __LRPCRYPTO_H