+ res = CLIParamHexToBuf(arg_get_str(5), header, sizeof(header), &headerlen);
+ makeAPDU = headerlen > 0;
+ if (res || (makeAPDU && headerlen != 4)) {
+ PrintAndLogEx(ERR, "header length must be exactly 4 bytes");
+ CLIParserFree();
+ return 1;
+ }
+ extendedAPDU = arg_get_lit(6);
+ le = arg_get_int_def(7, 0);
+
+ if (makeAPDU) {
+ uint8_t apdudata[USB_CMD_DATA_SIZE] = {0};
+ int apdudatalen = 0;
+
+ CLIGetHexBLessWithReturn(8, apdudata, &apdudatalen, 1 + 2);
+
+ APDUStruct apdu;
+ apdu.cla = header[0];
+ apdu.ins = header[1];
+ apdu.p1 = header[2];
+ apdu.p2 = header[3];
+
+ apdu.lc = apdudatalen;
+ apdu.data = apdudata;
+
+ apdu.extended_apdu = extendedAPDU;
+ apdu.le = le;
+
+ if (APDUEncode(&apdu, data, &datalen)) {
+ PrintAndLogEx(ERR, "can't make apdu with provided parameters.");
+ CLIParserFree();
+ return 2;
+ }
+ } else {
+ if (extendedAPDU) {
+ PrintAndLogEx(ERR, "`-e` without `-m`.");
+ CLIParserFree();
+ return 3;
+ }
+ if (le > 0) {
+ PrintAndLogEx(ERR, "`-l` without `-m`.");
+ CLIParserFree();
+ return 3;
+ }
+
+ // len = data + PCB(1b) + CRC(2b)
+ CLIGetHexBLessWithReturn(8, data, &datalen, 1 + 2);
+ }