diff options
author | Kevin Redon <kevredon@mail.tsaitgaist.info> | 2011-05-03 14:05:56 +0200 |
---|---|---|
committer | Kevin Redon <kevredon@mail.tsaitgaist.info> | 2011-05-03 14:05:56 +0200 |
commit | 722a7f0e00c5ee91e29aa08ee01fcdacc886f9fc (patch) | |
tree | 8511be313b4fcc71636e2e1c645ea408c98fcb61 | |
parent | fa2680b9b1f0be65168b3a04aee7556ec7a1f5d5 (diff) |
connect() improved
-rw-r--r-- | src/lib/common.rb | 2 | ||||
-rw-r--r-- | src/lib/server.rb | 24 | ||||
-rw-r--r-- | src/pcsc_server.rb | 68 | ||||
-rw-r--r-- | src/sim_server.rb | 5 |
4 files changed, 46 insertions, 53 deletions
diff --git a/src/lib/common.rb b/src/lib/common.rb index ff2b8cf..8e036ed 100644 --- a/src/lib/common.rb +++ b/src/lib/common.rb @@ -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 diff --git a/src/lib/server.rb b/src/lib/server.rb index ec80f85..fe2c02d 100644 --- a/src/lib/server.rb +++ b/src/lib/server.rb @@ -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) diff --git a/src/pcsc_server.rb b/src/pcsc_server.rb index a57d3f7..ad9ceb0 100644 --- a/src/pcsc_server.rb +++ b/src/pcsc_server.rb @@ -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) - end - - # connect to card - # TODO : choose which reader to use - def connect # get PCSC context - context = Smartcard::PCSC::Context.new + 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 + 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 + sleep 1 + retry end + # one reader required - if readers.size==0 then + while readers.size==0 do 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 + sleep 1 + readers = @context.readers end + # use the first reader - reader = readers.first - puts "using reader : #{reader}" + @reader = readers.first + puts "using reader : #{@reader}" + + end + + # connect to card + def connect # 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 diff --git a/src/sim_server.rb b/src/sim_server.rb index 58f016a..d08914b 100644 --- a/src/sim_server.rb +++ b/src/sim_server.rb @@ -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 |