Class: Smartcard::Iso::PcscTransport
- Inherits:
-
Object
- Object
- Smartcard::Iso::PcscTransport
show all
- Includes:
- IsoCardMixin
- Defined in:
- lib/smartcard/iso/pcsc_transport.rb
Overview
Implements the transport layer for a smartcard connected to a PC/SC reader.
Constant Summary
collapse
- PCSC =
Smartcard::PCSC
Instance Method Summary
collapse
deserialize_response, #iso_apdu, #iso_apdu!, serialize_apdu
Constructor Details
Returns a new instance of PcscTransport.
18
19
20
21
22
23
|
# File 'lib/smartcard/iso/pcsc_transport.rb', line 18
def initialize(options)
@options = options
@context = nil
@card = nil
@atr = nil
end
|
Instance Method Details
#card_atr ⇒ Object
31
32
33
|
# File 'lib/smartcard/iso/pcsc_transport.rb', line 31
def card_atr
@atr
end
|
#connect ⇒ Object
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
# File 'lib/smartcard/iso/pcsc_transport.rb', line 35
def connect
@context = PCSC::Context.new if @context.nil?
if @options[:reader_name]
@reader_name = @options[:reader_name]
else
readers = @context.readers
@reader_name = readers[@options[:reader_index] || 0]
end
queries = PCSC::ReaderStateQueries.new 1
queries[0].reader_name = @reader_name
queries[0].current_state = :unknown
@context.wait_for_status_change queries, 100
queries.ack_changes
unless queries[0].current_state.include? :present
puts "Please insert smart-card card in reader #{@reader_name}\n"
until queries[0].current_state.include? :presentt do
@context.wait_for_status_change queries
queries.ack_changes
end
puts "Card detected\n"
end
@card = @context.card @reader_name, :shared
@atr = @card.info[:atr]
end
|
#disconnect ⇒ Object
68
69
70
71
72
73
74
75
76
77
78
|
# File 'lib/smartcard/iso/pcsc_transport.rb', line 68
def disconnect
unless @card.nil?
@card.disconnect
@card = nil
@atr = nil
end
unless @context.nil?
@context.release
@context = nil
end
end
|
#exchange_apdu(apdu) ⇒ Object
25
26
27
28
29
|
# File 'lib/smartcard/iso/pcsc_transport.rb', line 25
def exchange_apdu(apdu)
xmit_apdu_string = apdu.pack('C*')
result_string = @card.transmit xmit_apdu_string
return result_string.unpack('C*')
end
|
#to_s ⇒ Object
80
81
82
83
|
# File 'lib/smartcard/iso/pcsc_transport.rb', line 80
def to_s
"#<PC/SC Terminal: disconnected>" if @card.nil?
"#<PC/SC Terminal: #{@reader_name}>"
end
|