+/* Detect Tag Prng, \r
+* function performs a partial AUTH, where it tries to authenticate against block0, key A, but only collects tag nonce.\r
+* the tag nonce is check to see if it has a predictable PRNG.\r
+* @returns \r
+* TRUE if tag uses WEAK prng (ie Darkside attack possible)\r
+* FALSE is tag uses HARDEND prng (ie hardnested attack possible, with known key)\r
+*/\r
+bool detect_classic_prng(){\r
+\r
+ UsbCommand resp, respA; \r
+ uint8_t cmd[] = {MIFARE_AUTH_KEYA, 0x00};\r
+ uint32_t flags = ISO14A_CONNECT | ISO14A_RAW | ISO14A_APPEND_CRC;\r
+ \r
+ UsbCommand cAuth = {CMD_READER_ISO_14443a, {flags, sizeof(cmd), 0}};\r
+ memcpy(cAuth.d.asBytes, cmd, sizeof(cmd));\r
+\r
+ clearCommandBuffer();\r
+ SendCommand(&cAuth);\r
+ WaitForResponse(CMD_ACK, &resp);\r
+ WaitForResponse(CMD_ACK, &respA);\r
+ \r
+ // if select tag failed.\r
+ if ( resp.arg[0] == 0 ) {\r
+ printf("Error: selecting tag failed, can't detect prng\n");\r
+ return false;\r
+ }\r
+\r
+ uint32_t nonce = bytes_to_num(respA.d.asBytes, respA.arg[0]);\r
+ return validate_prng_nonce(nonce);\r
+}\r