+\r
+       // encrypt    out, in, length, key, iv\r
+       //tdes_2key_enc(rnd_ab, rnd_ab, sizeof(rnd_ab), key, enc_random_b);\r
+       mbedtls_des3_set2key_enc(&ctx, key);\r
+       mbedtls_des3_crypt_cbc(&ctx     // des3_context\r
+               , MBEDTLS_DES_ENCRYPT       // int mode\r
+               , sizeof(rnd_ab)    // length\r
+               , enc_random_b      // iv[8]\r
+               , rnd_ab            // input\r
+               , rnd_ab            // output\r
+               );\r
+\r
+       //len = mifare_sendcmd_short_mfucauth(NULL, 1, 0xAF, rnd_ab, resp, respPar, NULL);\r
+       len = mifare_sendcmd(MIFARE_ULC_AUTH_2, rnd_ab, sizeof(rnd_ab), resp, respPar, NULL);\r
+       if (len != 11) {\r
+               if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("Cmd Error: %02x", resp[0]);\r
+               return 0;\r
+       }\r
+\r
+       uint8_t enc_resp[8] = { 0,0,0,0,0,0,0,0 };\r
+       uint8_t resp_random_a[8] = { 0,0,0,0,0,0,0,0 };\r
+       memcpy(enc_resp, resp+1, 8);\r
+\r
+       // decrypt    out, in, length, key, iv\r
+       // tdes_2key_dec(resp_random_a, enc_resp, 8, key, enc_random_b);\r
+       mbedtls_des3_set2key_dec(&ctx, key);\r
+       mbedtls_des3_crypt_cbc(&ctx     // des3_context\r
+               , MBEDTLS_DES_DECRYPT       // int mode\r
+               , 8                 // length\r
+               , enc_random_b      // iv[8]\r
+               , enc_resp          // input\r
+               , resp_random_a     // output\r
+               );\r
+       if ( memcmp(resp_random_a, random_a, 8) != 0 ) {\r
+               if (MF_DBGLEVEL >= MF_DBG_ERROR) Dbprintf("failed authentication");\r
+               return 0;\r
+       }\r
+\r
+       if (MF_DBGLEVEL >= MF_DBG_EXTENDED) {\r
+               Dbprintf("e_AB: %02x %02x %02x %02x %02x %02x %02x %02x",\r
+                               rnd_ab[0],rnd_ab[1],rnd_ab[2],rnd_ab[3],\r
+                               rnd_ab[4],rnd_ab[5],rnd_ab[6],rnd_ab[7]);\r
+\r
+               Dbprintf("e_AB: %02x %02x %02x %02x %02x %02x %02x %02x",\r
+                               rnd_ab[8],rnd_ab[9],rnd_ab[10],rnd_ab[11],\r
+                               rnd_ab[12],rnd_ab[13],rnd_ab[14],rnd_ab[15]);\r
+\r
+               Dbprintf("a: %02x %02x %02x %02x %02x %02x %02x %02x",\r
+                               random_a[0],random_a[1],random_a[2],random_a[3],\r
+                               random_a[4],random_a[5],random_a[6],random_a[7]);\r
+\r
+               Dbprintf("b: %02x %02x %02x %02x %02x %02x %02x %02x",\r
+                               resp_random_a[0],resp_random_a[1],resp_random_a[2],resp_random_a[3],\r
+                               resp_random_a[4],resp_random_a[5],resp_random_a[6],resp_random_a[7]);\r
+       }\r
+       return 1;\r