- Dbprintf("integer value: %d offset: %d addr_sz: %d", byte, offset, addr_sz);
- LED_B_ON();
- perform_setup_phase_rwd(SESSION_IV);
- //legic_prng_forward(2);
-
- int r = legic_write_byte(byte, offset, addr_sz);
-
- if((r != 0) || BUTTON_PRESS()) {
- Dbprintf("operation aborted @ 0x%03.3x (%1d)", byte_index, r);
- switch_off_tag_rwd();
- LED_B_OFF();
- LED_C_OFF();
- return;
+ return 0;
+}
+int legic_select_card(legic_card_select_t *p_card){
+ return legic_select_card_iv(p_card, 0x01);
+}
+
+//-----------------------------------------------------------------------------
+// Work with emulator memory
+//
+// Note: we call FpgaDownloadAndGo(FPGA_BITSTREAM_HF) here although FPGA is not
+// involved in dealing with emulator memory. But if it is called later, it might
+// destroy the Emulator Memory.
+//-----------------------------------------------------------------------------
+// arg0 = offset
+// arg1 = num of bytes
+void LegicEMemSet(uint32_t arg0, uint32_t arg1, uint8_t *data) {
+ FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
+ legic_emlset_mem(data, arg0, arg1);
+}
+// arg0 = offset
+// arg1 = num of bytes
+void LegicEMemGet(uint32_t arg0, uint32_t arg1) {
+ FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
+ uint8_t buf[USB_CMD_DATA_SIZE] = {0x00};
+ legic_emlget_mem(buf, arg0, arg1);
+ LED_B_ON();
+ cmd_send(CMD_ACK, arg0, arg1, 0, buf, USB_CMD_DATA_SIZE);
+ LED_B_OFF();
+}
+void legic_emlset_mem(uint8_t *data, int offset, int numofbytes) {
+ cardmem = BigBuf_get_EM_addr();
+ memcpy(cardmem + offset, data, numofbytes);
+}
+void legic_emlget_mem(uint8_t *data, int offset, int numofbytes) {
+ cardmem = BigBuf_get_EM_addr();
+ memcpy(data, cardmem + offset, numofbytes);
+}
+
+void LegicRfInfo(void){
+
+ int r;
+
+ uint8_t buf[sizeof(legic_card_select_t)] = {0x00};
+ legic_card_select_t *card = (legic_card_select_t*) buf;
+
+ LegicCommonInit();
+
+ if ( legic_select_card(card) ) {
+ cmd_send(CMD_ACK,0,0,0,0,0);
+ goto OUT;
+ }
+
+ // read UID bytes
+ for ( uint8_t i = 0; i < sizeof(card->uid); ++i) {
+ r = legic_read_byte(i, card->cmdsize);
+ if ( r == -1 ) {
+ cmd_send(CMD_ACK,0,0,0,0,0);
+ goto OUT;
+ }
+ card->uid[i] = r & 0xFF;
+ }
+
+ // MCC byte.
+ r = legic_read_byte(4, card->cmdsize);
+ uint32_t calc_mcc = CRC8Legic(card->uid, 4);;
+ if ( r != calc_mcc) {
+ cmd_send(CMD_ACK,0,0,0,0,0);
+ goto OUT;