10
0
Fork 0

connect() improved

This commit is contained in:
Kevin Redon 2011-05-03 14:05:56 +02:00
parent fa2680b9b1
commit 722a7f0e00
4 changed files with 53 additions and 60 deletions

View File

@ -237,7 +237,7 @@ class SAP
end
# client : ask for the ATR from SAP server (must be connected)
# server : get ATR from SIM card (or SAP result code)
# server : get ATR from SIM card, nil if not available
# return : ATR
def atr
raise NotImplementedError

View File

@ -92,8 +92,18 @@ class Server < SAP
send(response)
set_state :idle
log("server","connection established",3)
# connect is responsible to send the status
connect()
# try to connect until connected
until connect() do
# ["StatusChange",["Card not accessible"]]
status = create_message("STATUS_IND",[[0x08,[0x02]]])
send(status)
sleep 1
end
# card ready
# ["StatusChange",["Card reset"]]
status = create_message("STATUS_IND",[[0x08,[0x01]]])
send(status)
log("server","card ready",3)
end
when "DISCONNECT_REQ"
raise "msg #{message[:name]} in wrong state #{@state}" unless @state!=:not_connected and @state!=:connection_under_nogiciation
@ -104,20 +114,18 @@ class Server < SAP
when "TRANSFER_ATR_REQ"
raise "msg #{message[:name]} in wrong state #{@state}" unless @state==:idle
set_state :processing_atr_request
# atr should return ATR byte array, or error result code
# atr should return ATR byte array, nil if not available
atr_result = atr
payload = []
if atr_result.kind_of?(Array) then
if atr_result then
log("ATR","#{hex(atr_result)}",1)
# ["ResultCode",["OK, request processed correctly"]]
payload << [0x02,[0x00]]
# ["ATR",atr]
payload << [0x06,atr_result]
elsif atr_result.kind_of?(Integer) then
# ["ResultCode",[code from atr]]
payload << [0x02,[atr_result]]
else
raise "unexpected answer #{atr_result.class} from atr"
# ["ResultCode",["Error, data not available"]]
payload << [0x02,[0x06]]
end
# send response
response = create_message("TRANSFER_ATR_RESP",payload)

View File

@ -31,67 +31,55 @@ sudo gem install smartcard (http://www.rubygems.org/gems/smartcard)
class PCSCServer < Server
# provide the io to listen to
# TODO : choose which reader to use
def initialize(io)
super(io)
# get PCSC context
begin
@context = Smartcard::PCSC::Context.new
rescue Smartcard::PCSC::Exception => e
puts "PCSC not available. please start PCSC"
sleep 1
retry
end
# get all readers
begin
readers = @context.readers
rescue Smartcard::PCSC::Exception => e
puts "no reader available. please connect a card reader"
sleep 1
retry
end
# one reader required
while readers.size==0 do
puts "no reader available. connect a reader"
sleep 1
readers = @context.readers
end
# use the first reader
@reader = readers.first
puts "using reader : #{@reader}"
end
# connect to card
# TODO : choose which reader to use
def connect
# get PCSC context
context = Smartcard::PCSC::Context.new
# get all readers
begin
readers = context.readers
rescue Smartcard::PCSC::Exception => e
puts "no reader available. please connect a card reader"
begin
readers = context.readers
rescue Smartcard::PCSC::Exception => e
sleep 1
retry
end
end
# one reader required
if readers.size==0 then
puts "no reader available. connect a reader"
# info client ["StatusChange",["Card not accessible"]]
status = create_message("STATUS_IND",[[0x08,[0x02]]])
send(status)
while readers.size==0 do
context = Smartcard::PCSC::Context.new
readers = context.readers
sleep 1
end
end
# use the first reader
reader = readers.first
puts "using reader : #{reader}"
# connect to the card
begin
@card = Smartcard::PCSC::Card.new(context,reader,:exclusive,:t0)
@card = Smartcard::PCSC::Card.new(@context,@reader,:exclusive,:t0)
rescue Smartcard::PCSC::Exception => e
# wait for a card
puts "no card available. insert card"
# info client ["StatusChange",["Card not accessible"]]
status = create_message("STATUS_IND",[[0x08,[0x02]]])
send(status)
begin
@card = Smartcard::PCSC::Card.new(context,reader,:exclusive,:t0)
rescue Smartcard::PCSC::Exception => e
sleep 1
retry
end
sleep 1
retry
end
# card ready
# ["StatusChange",["Card reset"]]
status = create_message("STATUS_IND",[[0x08,[0x01]]])
send(status)
puts "connected to card"
log("server","SIM ready (reset)",3)
return true
end
# get ATR

View File

@ -55,10 +55,7 @@ class SIMServer < Server
@response = node.find_first("./header").content.hex2arr
# card ready
# ["StatusChange",["Card reset"]]
status = create_message("STATUS_IND",[[0x08,[0x01]]])
send(status)
log("server","connection established. SIM loaded",3)
return true
end
# get ATR