Este repositório contém a API Python Dispenser SK-AD3 Dispenser. A API implementa pontos de extremidade de alto nível para a maior parte do que o SK-AD3 é capaz. É importante observar logo de cara que o SK-AD3 realiza dois conjuntos de operações distintos. O primeiro conjunto de operações são os comandos nativos usados para manipular os componentes e sensores mecânicos do dispositivo (movendo uma placa para a caixa de captura, lendo o estado do empilhador, etc.). O segundo conjunto de operações tem a ver com a comunicação com os cartões RFID (esta API atualmente suporta apenas a comunicação com os cartões Desfire EV1). O primeiro conjunto de operações envolve comunicação em série com o dispensador. O segundo conjunto de operações envolve a comunicação com um cartão RFID através de uma conexão serial com o dispensador. Como tal, este projeto expõe duas APIs, uma para operações básicas de SK-AD3 e uma para operações de RFID. No entanto, como a comunicação RFID é proxiada através do dispensador, a API DESFire depende de recursos que fazem parte do código de dispensador básico.
Importar o módulo, criar um objeto dispensador e usá -lo para inicializar o SK AD3 é bastante intuitivo. Todo comando retorna uma resposta que pode ser usada para verificar o estado do dispositivo.
from SK_AD3_Card_Dispenser import SK_AD3
dispenser = SK_AD3 ( 'COM7' )
response = dispenser . init ()
if response . is_successful ():
print ( response . status ())Comandos mecânicos básicos, como mover um cartão para uma determinada posição - como a posição "RF" - podem ser emitidos assim:
response = dispenser . move_card ( 'RF' )Depois que um cartão estiver na posição "RF", você pode ativar o cartão e iniciar a comunicação. Este é um exemplo de como você pode ativar um cartão RFID tipo A e obter seu UID:
response = dispenser . activate_RF_card ( 'type_a' )
if response . is_successful ():
response = dispenser . get_card_uid ()
uid = response . data [ 'uid' ]
# Do something with uidCertas operações de RFID requerem autenticação. O SK AD3 executa autenticação externa no nível do cartão e no nível do aplicativo. Você precisará autenticar de acordo com as configurações no cartão. O objeto de resposta de autenticação manterá convenientemente a chave de sessão gerada, que pode ser usada para comunicação criptografada e comandos RFID sensíveis.
response = dispenser . aes_authenticate ( SUPER_SECRET_AES_MASTER_KEY )
if response . is_successful ():
session_key = response . data [ 'session_key' ]Uma vez autenticado devidamente, os aplicativos podem ser criados no cartão usando predefinições internas:
from SK_AD3_Card_Dispenser . file_objects . application import PermissiveDesfireApplication
my_app = PermissiveDesfireApplication ([ 0xAB , 0xCD , 0xEF ])
dispenser . create_application ( my_app )O mesmo vale para arquivos:
from SK_AD3_Card_Dispenser . file_objects . file import PermissiveStandardDataFile
my_file = PermissiveStandardDataFile ([ 0x00 ])
dispenser . select_application ([ 0xAB , 0xCD , 0xEF ])
dispenser . create_standard_data_file ( my_file ) Ou, se você tiver necessidades específicas, poderá enviar APDUs genéricos para o cartão. O código abaixo é equivalente ao código acima, exceto que send_raw_apdu retornará um pacote de comando bruto na forma de uma lista de números inteiros em vez de um objeto Response :
dispenser . send_raw_apdu ([ 0x90 , 0x5A , 0x00 , 0x00 , 0x03 , 0xAB , 0xCD , 0xEF , 0x00 ])
dispenser . send_raw_apdu ([ 0x90 , 0xCD , 0x00 , 0x00 , 0x07 , 0x00 , 0x00 , 0xEE , 0xEE , 0x10 , 0x00 , 0x00 , 0x00 ])Python 3 (v3.11 recomendado).
Este projeto usa os utilitários da APDU como um submódulo Git. Clone este projeto usando o sinalizador ---recurse-submodules para garantir que os utilitários da APDU estejam incluídos. Os módulos a seguir também precisam ser instalados em seu ambiente:
correr
pip install -r requirements.txt
Para atualizar suas dependências.
A documentação para os cartões DESFire EV1 está sujeita à NDA. Como tal, esse repositório deve sua existência aos indivíduos que fizeram seus esforços reverteram a engenharia esses cartões públicos. As seguintes fontes foram usadas no desenvolvimento deste projeto: