EL-SAM-R01-D8 Merupakan sebuah NFC reader/writer yang dilengkapi dengan slot SAM card, dimana SAM card dapat digunakan sebagai akses ke beberapa kartu komersil seperti e-money ataupun akses tertentu.

Persiapan

Sebelum masuk ke bagian code, siapkan dulu beberapa hal berikut :

  • Python versi 3.
  • Library pyscard.
  • Pycharm IDE.
  • EL-SAM-R01-D8.
  • NFC Tag Mifare Classic 1K 14443

Python versi 3 dapat langsung didownload di https://www.python.org/downloads/

Untuk library pySerial bisa langsung dicari di python interpreter pada pycharm atau langsung di cmd dengan mengetikan

pip install pyscard

Pycharm Ide dapat di instal di link berikut https://www.jetbrains.com/pycharm/

EL-SAM-R01-D8 dapat dibeli di : https://www.tokopedia.com/electron/el-sam-r01-d8-usb-nfc-reader-4-sam-card-slot-psam-payment-13-56mhzrfid

1. Penjelasan Awal

Update firmware dan instalasi driver dapat dilihat pada artikel https://www.electron.id/article/Setting-EL-SAM-R01-D8-Contoh-Demo-App.html

EL-SAM-R01-D8 diakses menggunakan python dengan library pyscard yang merupakan framework untuk membuat aplikasi smart card dalam Python yang dibuat berdasarkan PCSC API Python Wrapper Module dengan menggunakan PCSC-lite sehingga tidak sulit lagi untuk mengakses smart card.

Untuk berbagai metode akses smart card dengan library pyscard dapat dilihat pada : https://pyscard.sourceforge.io/user-guide.html

2. Penjelasan program

Sebelum mencoba menggunakan Program, disarankan untuk memahami bagaimana akses memori dalam Mifare Classic 1K 14443, dasar dari akses memori dapat dilihat pada artikel akses memori Mifare Classic menggunakan PN-532. https://www.electron.id/article/PN-532-Memory.html

Pada bagian kode sudah dimasukan berbagai prosedur sederhana yang diperlukan untuk mulai melakukan pembacaan memori pada kartu.

Bagian awal adalah menghubungkan program dengan reader dan menyiapkan password otentikasi dengan cara berikut.

from smartcard.System import readers
from smartcard.util import toHexString
 
 
#Starting connection
device = readers()
connection = device[0].createConnection()
connection.connect()
print('device connected')
 
authA = '00 00 00 00 00 00'
authB = 'FF FF FF FF FF FF'

Variabel device berfungsi untuk menampung reader yang terhubung dengan komputer pada fungsi readers(), jadi ketika ada lebih dari 1 reader maka data akan menjadi seperti ini. device[0] = reader A device[1] = reader B

Sehingga jika ingin terhubung dengan reader B cukup ganti pada variabel connection menjadi.

connection = device[1].createConnection()
connection.connect()

Setelah itu pada variabel authA dan authB digunakan untuk keperluan otentikasi memory untuk jenis fungsi dan prosedur yang telah disiapkan dapat dilihat di bawah ini.

def init()
def setTempAuth(storeNumb,keyNumb)
def sendCmd(cmd)
def mifareAuth(blockNumber,keyType)
def readBlock(blockNumber,length,keyType)

def init()

Berfungsi sebagai inisiasi, ketika device pertama kali terhubung def init akan mengirimkan perintah SAM Card contactless dan melakukan reset card sehingga siap untuk melakukan read kartu Mifare Classic tanpa menggunakan SAM.

def setTempAuth(storeNumb, keyNumb)

Berfungsi untuk memasukan kode otentikasi ke volatile memory reader sehingga jika ingin memasukan nilai authA dan authB bisa dengan cara berikut.

setTempAuth(0,authA) # Memasukan key pada authA ke volatile memory 0
setTempAuth(1,authB) # Memasukan key pada authB ke volatile memory 1

def mifareAuth(blockNumber,keyType)

Berfungsi khusus berfungsi untuk melakukan otentikasi dengan cara berikut.

 # Melakukan otentikasi pada blok 3 (sector 0) dengan menggunakan kode otentikasi pada memory volatile 1 keyB
mifareAuth(3,1)

def readBlock(blockNumber,length,keyType)

Berfungsi untuk membaca blok dan secara otomatis melakukan otentikasi dengan cara berikut.

 # Melakukan read pada blok 3 sepanjang 16 byte serta melakukan otentikasi pada blok 3 (sector 0) dengan menggunakan kode otentikasi pada memory volatile 1 keyB
readBlock(3,16,1)

Sehingga dengan contoh kasus ketika alat baru pertama kali terhubung dengan komputer, kode-nya dalah sebagai berikut.

from smartcard.System import readers
from smartcard.util import toHexString
 
 
#Starting connection
device = readers()
connection = device[0].createConnection()
connection.connect()
print('device connected')
 
authA = '00 00 00 00 00 00'
authB = 'FF FF FF FF FF FF'
 
 
def init(): #Initiate so device can start read TAG
    start1 = 'ff 71 13 06 00'  # set SAM communication to contactless
    start1 = bytearray.fromhex(start1)
    start2 = 'ff 71 10 00 00'  # reset SAM communication
    start2 = bytearray.fromhex(start2)
    sendCmd(start1)
    sendCmd(start2)
 
def setTempAuth(storeNumb,keyNumb): # Load & Set Authentication Key to Reader
    authKey = 'FF 82 00'
    authKey = bytes.fromhex(authKey)
    authKey = authKey + bytes([storeNumb])
    authKey = authKey + bytes([6])
    authKey = authKey + bytes.fromhex(keyNumb)
    sendCmd(authKey)
 
def sendCmd(cmd): #Send Command to Reader
    # cmd = bytearray.fromhex(cmd)
    cmd = list(cmd)
    print("Data dikirim ==>  " + toHexString(cmd))
    data, sw1, sw2 = connection.transmit(cmd)
    print ("response : %x %x" % (sw1, sw2))
    if len(data) > 0:
        print('response data : ' + toHexString(data))
    return sw1
 
#Authentication to TAG keyTypeA = 0 || keyTypeB = 1
def mifareAuth(blockNumber,keyType):
    auth = 'ff 86 00 00 05 01 00'
    auth = bytearray.fromhex(auth)
    auth = auth + bytes([blockNumber])
    if keyType == 0 :
        auth = auth + bytes([0x60])
        auth = auth + bytes([0])
    elif keyType == 1:
        auth = auth + bytes([0x61])
        auth = auth + bytes([1])
    else:
        return 'Auth Not Valid'
    # print(auth)
    return sendCmd(auth)
 
def readBlock(blockNumber,length,keyType):
    validity = mifareAuth(blockNumber,keyType)
 
    if  validity == 144:
        readCmd = 'ff b0 00'
        readCmd = bytearray.fromhex(readCmd)
        readCmd += bytes([blockNumber])
        readCmd += bytes([length])
        sendCmd(readCmd)
 
init()
setTempAuth(0,authA)
setTempAuth(1,authB)
readBlock(3,16,1)

Video