static uint8_t calcSumNibbleAddOnes( uint8_t* bytes, uint8_t len, uint32_t mask){
return ~calcSumNibbleAdd(bytes, len, mask);
}
+static uint8_t calcSumNibbleXor( uint8_t* bytes, uint8_t len, uint32_t mask) {
+ uint8_t sum = 0;
+ for (uint8_t i = 0; i < len; i++) {
+ sum ^= NIBBLE_LOW(bytes[i]);
+ sum ^= NIBBLE_HIGH(bytes[i]);
+ }
+ sum &= mask;
+ return sum;
+}
+static uint8_t calcSumByteXor( uint8_t* bytes, uint8_t len, uint32_t mask) {
+ uint8_t sum = 0;
+ for (uint8_t i = 0; i < len; i++)
+ sum ^= bytes[i];
+ sum &= mask;
+ return sum;
+}
static uint8_t calcSumByteAdd( uint8_t* bytes, uint8_t len, uint32_t mask) {
uint8_t sum = 0;
return ~calcSumByteAdd(bytes, len, mask);
}
+
+
static uint8_t calcSumByteSub( uint8_t* bytes, uint8_t len, uint32_t mask) {
uint8_t sum = 0;
for (uint8_t i = 0; i < len; i++)
PrintAndLog("Byte Subtract | 0x%X", calcSumByteSubOnes(data, len, mask));
PrintAndLog("Nibble Subtract | 0x%X", calcSumNibbleSubOnes(data, len, mask));
+ PrintAndLog("\nXOR");
+ PrintAndLog("Byte Xor | 0x%X", calcSumByteXor(data, len, mask));
+ PrintAndLog("Nibble Xor | 0x%X", calcSumNibbleXor(data, len, mask));
+
return 0;
}
}
int CmdAnalyseHid(const char *Cmd){
+ uint8_t key[8] = {0};
+ uint8_t key_std_format[8] = {0};
+ uint8_t key_iclass_format[8] = {0};
uint8_t data[16] = {0};
bool isReverse = FALSE;
int len = 0;
param_gethex_ex(Cmd, 1, data, &len);
if ( len%2 ) return usage_analyse_hid();
- len >>= 1;
-
- if ( isReverse )
+ len >>= 1;
+
+ memcpy(key, data, 8);
+
+ if ( isReverse ) {
generate_rev(data, len);
- else
+ permutekey_rev(key, key_std_format);
+ printf(" holiman iclass key | %s \n", sprint_hex(key_std_format, 8));
+ }
+ else {
generate(data, len);
+ permutekey(key, key_iclass_format);
+ printf(" holiman std key | %s \n", sprint_hex(key_iclass_format, 8));
+ }
return 0;
}