connect() improved
This commit is contained in:
parent
fa2680b9b1
commit
722a7f0e00
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue