Difference between revisions of "RFID"
Jump to navigation
Jump to search
m (→ACR122U) |
m (→ACR122U PICC) |
||
Line 108: | Line 108: | ||
print ''.join([chr(i) for i in response]) |
print ''.join([chr(i) for i in response]) |
||
</source> |
</source> |
||
+ | This requires also to allow libccid to use the Escape command, you've to set bit 0 of ifdDriverOptions in /etc/libccid_Info.plist to 1: |
||
+ | <key>ifdDriverOptions</key> |
||
+ | <string>0x0001</string> |
||
+ | <!-- Possible values for ifdDriverOptions |
||
+ | 1: DRIVER_OPTION_CCID_EXCHANGE_AUTHORIZED |
||
+ | the CCID Exchange command is allowed. You can use it through |
||
+ | SCardControl(hCard, IOCTL_SMARTCARD_VENDOR_IFD_EXCHANGE, ...) |
||
===Pegoda=== |
===Pegoda=== |
Revision as of 00:03, 16 March 2009
RFID readers
pcscd
Is the Linux daemon to access readers compatible with the PC/SC standard.
To dump the readers list supported by libccid of your pcscd install:
cat /etc/libccid_Info.plist|gawk '
/ifdVendorID/{
mode=1
}
/ifdProductID/{
mode=2
}
/ifdFriendlyName/{
mode=3
}
{
inarray=0
}
/<array>/{
i=0
}
/<array>/,/<\/array>/{
inarray=1
}
/string/&&inarray{
match($0,/<string>(.*)<\/string>/,a);
t[mode i]=a[1];
i++
}
END{
for (j=0;j<i;j++)
print t[1 j]":"t[2 j], t[3 j]
}'
Parallax
http://www.makezine.com/06/theorypractice/ => See MAKE n6
OpenPCD
ACR122U
Intro
based on PN532
- docs
- ISO/IEC18092 (NFC) compliant
- NFC Tags Access Speed = 212 kbps
- Support FeliCa card
- Support ISO 14443 Type A & B cards
- MIFARE® cards (Classics, DESFire)
- SAM Socket (optional)
- To get the Firmware version string in command line: (actual string here is "ACR122U203" as the last 2 bytes are not SW1/SW2 but part of the string)
$ opensc-tool -s FF00480000 Sending: FF 00 48 00 00. Received (SW1=0x30, SW2=0x33): 41 43 52 31 32 32 55 32 ACR122U2
You can also use scriptor:
$ echo ff00480000|scriptor No reader given: using ACS ACR122U PICC Interface 00 00 Using T=1 protocol Reading commands from STDIN > ff 00 48 00 00 < 41 43 52 31 32 32 55 32 30 33 : Error not defined by ISO 7816
If you get the following error:
Can't allocate Chipcard::PCSC::Card object: No smartcard inserted.
that's because you've a model without SAM support. Place a tag on the reader and try again, it should work.
So that's where a lot of confusion comes into play: the two models behave very differently! see below
ACR122U-SAM
- With SAM slot
- Windows drivers & API docs
Usage:
- When there is a SAM inserted, ATR shown is the ATR of the SAM
- When there is no SAM inserted, ATR shown is a pseudo-ATR = 3B 00
- So for PCSC there is always a "card inserted"
- APDUs are sent to SAM
- To send APDUs to a contactless card, you must wrap them into pseudo-APDUs (FF 00 00 00 ...)
- To send special APDUs to the reader (to get fw or to control LEDs), just send them
Some more infos here about the Tikitag
ACR122U PICC
- Without SAM slot
- Windows drivers & API docs
Usage:
- When there is a contactless card, ATR shown is the ATR of the card
- When there is no contactless card, no ATR
- So for PCSC there is a "card inserted" if there is a contactless card
- APDUs are sent directly to the contactless card, which makes this reader fully transparent in this mode
- To send APDUs to a contactless card, you can also wrap them into pseudo-APDUs (FF 00 00 00 ...)
- To send special APDUs to the reader (to get fw or to control LEDs)
- If there is a contactless card, just send the APDUs
- If there is no contactless card, the CCID Escape command must be used (*)
(*) Here is one small example how to use the Escape command:
#!/usr/bin/python
from smartcard.scard import *
hresult, hcontext = SCardEstablishContext( SCARD_SCOPE_USER )
hresult, hcard, dwActiveProtocol = SCardConnect(
hcontext, 'ACS ACR122U PICC Interface 00 00', SCARD_SHARE_DIRECT, SCARD_PROTOCOL_T0 )
IOCTL_SMARTCARD_VENDOR_IFD_EXCHANGE = SCARD_CTL_CODE(1)
CMD = [0xFF, 0x00, 0x48, 0x00, 0x00]
hresult, response = SCardControl( hcard, IOCTL_SMARTCARD_VENDOR_IFD_EXCHANGE, CMD )
if hresult!=SCARD_S_SUCCESS:
raise error, 'Failed to control: ' + SCardGetErrorMessage(hresult)
print ''.join([chr(i) for i in response])
This requires also to allow libccid to use the Escape command, you've to set bit 0 of ifdDriverOptions in /etc/libccid_Info.plist to 1:
<key>ifdDriverOptions</key> <string>0x0001</string>