aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Redon <kevredon@mail.tsaitgaist.info>2011-05-03 14:05:56 +0200
committerKevin Redon <kevredon@mail.tsaitgaist.info>2011-05-03 14:05:56 +0200
commit722a7f0e00c5ee91e29aa08ee01fcdacc886f9fc (patch)
tree8511be313b4fcc71636e2e1c645ea408c98fcb61
parentfa2680b9b1f0be65168b3a04aee7556ec7a1f5d5 (diff)
connect() improved
-rw-r--r--src/lib/common.rb2
-rw-r--r--src/lib/server.rb24
-rw-r--r--src/pcsc_server.rb68
-rw-r--r--src/sim_server.rb5
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