class Mifare::Classic
Constants
- CMD_AUTH_KEY_A
- CMD_AUTH_KEY_B
- CMD_DECREMENT
- CMD_INCREMENT
- CMD_READ
- CMD_RESTORE
- CMD_TRANSFER
- CMD_WRITE
Public Instance Methods
auth(block_addr, key = {})
click to toggle source
# File lib/mifare/classic.rb, line 12 def auth(block_addr, key = {}) if key[:a].nil? && key[:b].nil? raise UnexpectedDataError, 'Missing key data' end if key[:a] cmd = CMD_AUTH_KEY_A key = key[:a] else cmd = CMD_AUTH_KEY_B key = key[:b] end key = [key].pack('H*').bytes if key.size != 6 raise UnexpectedDataError, "Expect 6 bytes auth key, got: #{key.size} byte" end @pcd.mifare_crypto1_authenticate(cmd, block_addr, key, @uid) end
deauth()
click to toggle source
# File lib/mifare/classic.rb, line 33 def deauth @pcd.mifare_crypto1_deauthenticate end
decrement(block_addr, delta)
click to toggle source
Decrement: Decrements the contents of a block and stores the result in the internal Transfer Buffer
# File lib/mifare/classic.rb, line 102 def decrement(block_addr, delta) two_step(CMD_DECREMENT, block_addr, delta) end
increment(block_addr, delta)
click to toggle source
Increment: Increments the contents of a block and stores the result in the internal Transfer Buffer
# File lib/mifare/classic.rb, line 97 def increment(block_addr, delta) two_step(CMD_INCREMENT, block_addr, delta) end
read(block_addr)
click to toggle source
# File lib/mifare/classic.rb, line 37 def read(block_addr) buffer = [CMD_READ, block_addr] @pcd.picc_transceive(buffer) end
read_value(block_addr)
click to toggle source
# File lib/mifare/classic.rb, line 57 def read_value(block_addr) received_data = read(block_addr) received_data[0..3].to_sint end
restore(block_addr)
click to toggle source
Restore: Moves the contents of a block into the internal Transfer Buffer
# File lib/mifare/classic.rb, line 107 def restore(block_addr) two_step(CMD_RESTORE, block_addr, 0) end
transfer(block_addr)
click to toggle source
Transfer: Writes the contents of the internal Transfer Buffer to a value block
# File lib/mifare/classic.rb, line 112 def transfer(block_addr) buffer = [CMD_TRANSFER, block_addr] @pcd.picc_transceive(buffer) end
write(block_addr, send_data)
click to toggle source
# File lib/mifare/classic.rb, line 43 def write(block_addr, send_data) if send_data.size != 16 raise UnexpectedDataError, "Expect 16 bytes data, got: #{send_data.size} byte" end buffer = [CMD_WRITE, block_addr] # Ask PICC if we can write to block_addr @pcd.picc_transceive(buffer) # Then start transfer our data @pcd.picc_transceive(send_data) end
write_value(block_addr, value)
click to toggle source
# File lib/mifare/classic.rb, line 63 def write_value(block_addr, value) # Value block format # # byte 0..3: 32 bit value in little endian # byte 4..7: copy of byte 0..3, with inverted bits (aka. XOR 255) # byte 8..11: copy of byte 0..3 # byte 12: index of backup block (can be any value) # byte 13: copy of byte 12 with inverted bits (aka. XOR 255) # byte 14: copy of byte 12 # byte 15: copy of byte 13 value = [].append_sint(value, 4) buffer = [] buffer[0] = value[0] buffer[1] = value[1] buffer[2] = value[2] buffer[3] = value[3] buffer[4] = ~buffer[0] buffer[5] = ~buffer[1] buffer[6] = ~buffer[2] buffer[7] = ~buffer[3] buffer[8] = buffer[0] buffer[9] = buffer[1] buffer[10] = buffer[2] buffer[11] = buffer[3] buffer[12] = block_addr buffer[13] = ~block_addr buffer[14] = buffer[12] buffer[15] = buffer[13] write(block_addr, buffer) end
Private Instance Methods
two_step(command, block_addr, value)
click to toggle source
Helper for increment, decrement, and restore command
# File lib/mifare/classic.rb, line 121 def two_step(command, block_addr, value) buffer = [command, block_addr] send_data = [].append_uint(value, 4) # Ask PICC if we can write to block_addr @pcd.picc_transceive(buffer) # Then start transfer our data @pcd.picc_transceive(send_data, true) # Accept timeout end