int id_init(int handle, const id_desc_t *desc, mifare_tag_t *tag, const void *id, int32_t counter) { int i, block = desc->sector * 4; /* Generate per card key */ uint8_t aes_key[32]; memcpy(aes_key, desc->aes_key, 32); for (i = 0; i < 32; i++) aes_key[i] ^= tag->serial[i & 3]; /* Prepare buffer */ uint8_t buf[16]; memcpy(buf, desc->magic, 4); memcpy(&buf[4], id, 12); /* Encrypt buffer */ aes256_context aes; aes256_init(&aes, aes_key); aes256_encrypt_ecb(&aes, buf); aes256_done(&aes); if (mifare_select(handle, tag)) return ID_ERROR_SELECT; if (mifare_login(handle, desc->sector, desc->key_type, desc->key)) return ID_ERROR_LOGIN; if (mifare_write_block(handle, block + 1, buf)) return ID_ERROR_WRITE_BLOCK; if (mifare_write_value(handle, block + 2, 0)) return ID_ERROR_WRITE_VALUE; return ID_OK; }
int id_read(int handle, const id_desc_t *desc, mifare_tag_t *tag, void *id, int32_t *counter) { int i, block = desc->sector * 4; /* Generate per card key */ uint8_t aes_key[32]; memcpy(aes_key, desc->aes_key, 32); for (i = 0; i < 32; i++) aes_key[i] ^= tag->serial[i & 3]; uint8_t buf[16]; if (mifare_select(handle, tag)) return ID_ERROR_SELECT; if (mifare_login(handle, desc->sector, desc->key_type, desc->key)) return ID_ERROR_LOGIN; if (mifare_read_block(handle, block + 1, buf)) return ID_ERROR_READ_BLOCK; /* Decrypt block */ aes256_context ctx; aes256_init(&ctx, aes_key); aes256_decrypt_ecb(&ctx, buf); aes256_done(&ctx); if (memcmp(buf, desc->magic, 4) != 0) return ID_ERROR_INVALID_MAGIC; if (mifare_dec_value(handle, block + 2, 1)) return ID_ERROR_DEC_VALUE; if (mifare_read_value(handle, block + 2, counter)) return ID_ERROR_READ_VALUE; memcpy(id, &buf[4], 12); return ID_OK; }
int main(int argc, char * argv[]) { int fd = 0; unsigned char response_buffer[255]; int count_recieved; unsigned char delay = 100; verbose = 0; unsigned short cardtype; char *devicename = "/dev/ttyUSB0"; char server_send_buffer[1024] = ""; char server_recv_buffer[1024] = ""; logfd = stdout; int argi; for (argi = 1; argi < argc; argi++) { if (strcmp("-v", argv[argi]) == 0 ) { verbose = 1; } else if (argv[argi][0] != '-') { devicename = argv[argi]; } } fd = open(devicename, O_RDWR | O_NOCTTY ); int set_bits = 4; ioctl(fd, TIOCMSET, &set_bits); initport(fd); fprintf(logfd, "started ...\n"); beep(fd, 10); set_led(fd, LED_GREEN); unsigned char version[16]; count_recieved = send_recieve(fd, CMD_READ_FW_VERSION, 0, 0, version); fprintf(logfd, "version: %.*s\n", count_recieved, version); unsigned char serial[16]; char matrix_serial[64]; unsigned char prev_serial[16] = ""; unsigned char prev_serial_len = 0; unsigned char prev_cardtype = 0; unsigned char prev_card[256]; unsigned long prev_timestamp = 0; unsigned char card_status = 0, usb_status = 0; char slen, rlen; unsigned char ibuffer[1024], obuffer[1024], *in = ibuffer, *out; while (1) { count_recieved = mifare_select(fd, &cardtype, serial); if( access("/dev/sdb1", R_OK) == 0){ if( usb_status == 0 ){ beep(fd, 5); beep(fd, 5); beep(fd, 5); usb_status = 1; } } else usb_status = 0; if (count_recieved > 0 && card_status == 0) { if ( ( memcmp(prev_serial, serial, count_recieved ) != 0 ) || (prev_serial_len != count_recieved) || (prev_cardtype != cardtype) ) { serial_to_matrix_iii(cardtype, serial, count_recieved, matrix_serial); // wait 5 seconds if it's the same card serial if( strcmp( prev_card, matrix_serial ) == 0 && timestamp_sec() - prev_timestamp < 5 ) { usleep( 1000 * 100 ); continue; } set_led(fd, LED_RED); strcpy(prev_card, matrix_serial); prev_timestamp = timestamp_sec(); fprintf(logfd, "\nserial:%s\n",matrix_serial); if( access("/dev/sdb1", R_OK) == 0 ){ system("mount /dev/sdb1 /media/usb"); system("ls /media/usb"); if( access("/media/usb/.griver_token", R_OK) == 0){ // auth on usb // move .grive on card printf(" STORE TOKEN TO CARD \n "); } else { // save .grive on ram drive // ln on usb printf(" SYNC USING CARD DATA \n "); } system("umount /media/usb"); } memset(ibuffer, 0xFA, 32); memset(ibuffer, 0x3B, 16); int err = write_sector(fd, 4, 0x60, 0, ibuffer); fprintf(logfd, "write code [%d]\n", err); int size = dump(fd, 0x60, 0 , obuffer); out = obuffer; fprintf(logfd, "size is %d\n", size); while(out-obuffer < size){ fprintf(logfd, "%02X ", *out); if((out-obuffer) % 16 == 15 ) fprintf(logfd, "\n"); *out++; } fprintf(logfd,"\n"); card_status = 1; } else { //~ printf("select error\n"); prev_cardtype = 0; } } else { if( card_status == 1 ) { card_status = 0; beep(fd, 5); usleep( 1000 * 500 ); } } set_led(fd, LED_GREEN); } }