smartcard 0.5.3 → 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGELOG CHANGED
@@ -1,3 +1,5 @@
1
+ v0.5.4. Fixed ReaderStateQuery to work when the status has bits not defined in the PCSC header.
2
+
1
3
  v0.5.3. Fixed buggy protocol number decoding logic.
2
4
 
3
5
  v0.5.2. Added 'thread' require to fix crashes on new Rubygems versions.
data/Manifest CHANGED
@@ -19,11 +19,11 @@ lib/smartcard/iso/pcsc_transport.rb
19
19
  lib/smartcard/iso/transport.rb
20
20
  lib/smartcard/pcsc/card.rb
21
21
  lib/smartcard/pcsc/context.rb
22
+ lib/smartcard/pcsc/exception.rb
22
23
  lib/smartcard/pcsc/ffi_autogen.rb
23
24
  lib/smartcard/pcsc/ffi_functions.rb
24
25
  lib/smartcard/pcsc/ffi_lib.rb
25
26
  lib/smartcard/pcsc/ffi_structs.rb
26
- lib/smartcard/pcsc/pcsc_exception.rb
27
27
  lib/smartcard/pcsc/reader_state_queries.rb
28
28
  tasks/ffi_codegen.rb
29
29
  test/gp/asn1_ber_test.rb
@@ -39,4 +39,5 @@ test/iso/iso_exception_test.rb
39
39
  test/iso/jcop_remote_test.rb
40
40
  test/pcsc/card_test.rb
41
41
  test/pcsc/context_test.rb
42
+ test/pcsc/exception_test.rb
42
43
  test/pcsc/reader_state_queries_test.rb
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'rubygems'
2
2
  require 'echoe'
3
3
 
4
- require 'tasks/ffi_codegen.rb'
4
+ require './tasks/ffi_codegen.rb'
5
5
 
6
6
  Echoe.new('smartcard') do |p|
7
7
  p.project = 'smartcard' # rubyforge project
@@ -23,9 +23,13 @@ Echoe.new('smartcard') do |p|
23
23
  /^(lib|bin|tasks|ext)|^BUILD|^README|^CHANGELOG|^TODO|^LICENSE|^COPYING$/
24
24
  end
25
25
 
26
+ file 'lib/smartcard/pcsc/ffi_autogen.rb' => 'tasks/ffi_codegen.rb' do
27
+ Smartcard::Tasks.generate_ffi_header
28
+ end
29
+
26
30
  unless FFI::Platform.windows?
27
- task :package => :ffi_header
28
- task :test => :ffi_header
31
+ task :package => 'lib/smartcard/pcsc/ffi_autogen.rb'
32
+ task :test => 'lib/smartcard/pcsc/ffi_autogen.rb'
29
33
  end
30
34
 
31
35
  if $0 == __FILE__
@@ -4,11 +4,11 @@ end
4
4
 
5
5
  require 'smartcard/pcsc/card.rb'
6
6
  require 'smartcard/pcsc/context.rb'
7
+ require 'smartcard/pcsc/exception.rb'
7
8
  require 'smartcard/pcsc/ffi_lib.rb'
8
9
  require 'smartcard/pcsc/ffi_autogen.rb'
9
10
  require 'smartcard/pcsc/ffi_structs.rb'
10
11
  require 'smartcard/pcsc/ffi_functions.rb'
11
- require 'smartcard/pcsc/pcsc_exception.rb'
12
12
  require 'smartcard/pcsc/reader_state_queries.rb'
13
13
 
14
14
  require 'smartcard/iso/apdu_error.rb'
@@ -0,0 +1,15 @@
1
+ # Contains information about an exception at the PC/SC layer.
2
+ class Smartcard::PCSC::Exception < RuntimeError
3
+ def initialize(error_status)
4
+ @pcsc_status_code = 2**32 + error_status
5
+ @pcsc_status = Smartcard::PCSC::FFILib::Status.find @pcsc_status_code
6
+
7
+ super "#{@pcsc_status} (0x#{@pcsc_status_code.to_s(16)})"
8
+ end
9
+
10
+ # Symbol for the PC/SC error status that caused this error.
11
+ attr_reader :pcsc_status
12
+
13
+ # The PC/SC error status that caused this error, as a number.
14
+ attr_reader :pcsc_status_code
15
+ end
@@ -7,144 +7,144 @@ module Smartcard::PCSC
7
7
  module FFILib
8
8
  # Constant values extracted from headers.
9
9
  module Consts
10
- SCARD_E_NOT_TRANSACTED = 0x80100016
11
- SCARD_E_FILE_NOT_FOUND = 0x80100024
12
- SCARD_E_WRITE_TOO_MANY = 0x80100028
13
- SCARD_E_NO_READERS_AVAILABLE = 0x8010002E
14
- SCARD_E_NOT_READY = 0x80100010
15
- SCARD_E_READER_UNAVAILABLE = 0x80100017
10
+ SCARD_E_INVALID_VALUE = 0x80100011
11
+ SCARD_E_NO_SERVICE = 0x8010001D
12
+ SCARD_E_UNSUPPORTED_FEATURE = 0x8010001F
13
+ SCARD_E_INVALID_ATR = 0x80100015
14
+ SCARD_E_DUPLICATE_READER = 0x8010001B
15
+ SCARD_W_UNSUPPORTED_CARD = 0x80100065
16
+ SCARD_E_UNKNOWN_CARD = 0x8010000D
17
+ SCARD_E_UNEXPECTED = 0x8010001F
16
18
  SCARD_E_SERVER_TOO_BUSY = 0x80100031
17
- SCARD_W_REMOVED_CARD = 0x80100069
19
+ SCARD_W_UNPOWERED_CARD = 0x80100067
20
+ SCARD_W_CANCELLED_BY_USER = 0x8010006E
21
+ SCARD_E_CANCELLED = 0x80100002
22
+ SCARD_E_INVALID_CHV = 0x8010002A
23
+ SCARD_E_CERTIFICATE_UNAVAILABLE = 0x8010002D
18
24
  SCARD_W_SECURITY_VIOLATION = 0x8010006A
19
25
  SCARD_E_INVALID_PARAMETER = 0x80100004
20
- SCARD_E_NO_MEMORY = 0x80100006
21
- SCARD_E_TIMEOUT = 0x8010000A
22
- SCARD_W_EOF = 0x8010006D
23
- SCARD_E_SHARING_VIOLATION = 0x8010000B
24
26
  SCARD_E_SYSTEM_CANCELLED = 0x80100012
25
- SCARD_E_INVALID_ATR = 0x80100015
26
- SCARD_E_DIR_NOT_FOUND = 0x80100023
27
- SCARD_E_NO_ACCESS = 0x80100027
28
- SCARD_E_INVALID_TARGET = 0x80100005
29
- SCARD_E_DUPLICATE_READER = 0x8010001B
30
- SCARD_E_NO_SERVICE = 0x8010001D
31
- SCARD_E_SERVICE_STOPPED = 0x8010001E
32
- SCARD_E_UNSUPPORTED_FEATURE = 0x8010001F
33
- SCARD_W_CARD_NOT_AUTHENTICATED = 0x8010006F
34
- SCARD_S_SUCCESS = 0x00000000
35
27
  SCARD_E_NO_KEY_CONTAINER = 0x80100030
36
- SCARD_W_CANCELLED_BY_USER = 0x8010006E
37
- SCARD_E_CANT_DISPOSE = 0x8010000E
28
+ SCARD_E_NOT_READY = 0x80100010
29
+ SCARD_E_NOT_TRANSACTED = 0x80100016
30
+ SCARD_E_READER_UNAVAILABLE = 0x80100017
38
31
  SCARD_E_READER_UNSUPPORTED = 0x8010001A
39
32
  SCARD_E_CARD_UNSUPPORTED = 0x8010001C
40
- SCARD_W_CHV_BLOCKED = 0x8010006C
41
- SCARD_E_CANCELLED = 0x80100002
33
+ SCARD_E_INVALID_TARGET = 0x80100005
34
+ SCARD_E_NO_MEMORY = 0x80100006
42
35
  SCARD_E_UNKNOWN_READER = 0x80100009
43
- SCARD_E_PROTO_MISMATCH = 0x8010000F
44
- SCARD_E_UNEXPECTED = 0x8010001F
45
- SCARD_E_CERTIFICATE_UNAVAILABLE = 0x8010002D
46
- SCARD_E_INVALID_HANDLE = 0x80100003
47
- SCARD_E_INSUFFICIENT_BUFFER = 0x80100008
48
36
  SCARD_E_NO_SMARTCARD = 0x8010000C
49
- SCARD_E_INVALID_VALUE = 0x80100011
50
37
  SCARD_E_ICC_INSTALLATION = 0x80100020
38
+ SCARD_E_FILE_NOT_FOUND = 0x80100024
39
+ SCARD_E_NO_SUCH_CERTIFICATE = 0x8010002C
40
+ SCARD_W_WRONG_CHV = 0x8010006B
41
+ SCARD_E_NO_ACCESS = 0x80100027
42
+ SCARD_E_WRITE_TOO_MANY = 0x80100028
43
+ SCARD_W_EOF = 0x8010006D
44
+ SCARD_E_INVALID_HANDLE = 0x80100003
45
+ SCARD_E_CANT_DISPOSE = 0x8010000E
46
+ SCARD_E_SERVICE_STOPPED = 0x8010001E
51
47
  SCARD_E_ICC_CREATEORDER = 0x80100021
52
48
  SCARD_E_NO_FILE = 0x80100026
53
- SCARD_E_BAD_SEEK = 0x80100029
54
- SCARD_E_UNKNOWN_RES_MNG = 0x8010002B
49
+ SCARD_E_NO_READERS_AVAILABLE = 0x8010002E
55
50
  SCARD_E_COMM_DATA_LOST = 0x8010002F
56
- SCARD_W_UNPOWERED_CARD = 0x80100067
57
- SCARD_W_RESET_CARD = 0x80100068
58
- SCARD_E_UNKNOWN_CARD = 0x8010000D
51
+ SCARD_E_TIMEOUT = 0x8010000A
52
+ SCARD_E_SHARING_VIOLATION = 0x8010000B
53
+ SCARD_E_PROTO_MISMATCH = 0x8010000F
59
54
  SCARD_E_PCI_TOO_SMALL = 0x80100019
55
+ SCARD_W_RESET_CARD = 0x80100068
56
+ SCARD_W_REMOVED_CARD = 0x80100069
57
+ SCARD_S_SUCCESS = 0x00000000
58
+ SCARD_E_INSUFFICIENT_BUFFER = 0x80100008
59
+ SCARD_E_DIR_NOT_FOUND = 0x80100023
60
60
  SCARD_E_NO_DIR = 0x80100025
61
- SCARD_E_NO_SUCH_CERTIFICATE = 0x8010002C
62
- SCARD_W_WRONG_CHV = 0x8010006B
63
- SCARD_E_INVALID_CHV = 0x8010002A
64
- SCARD_W_UNSUPPORTED_CARD = 0x80100065
61
+ SCARD_E_BAD_SEEK = 0x80100029
62
+ SCARD_E_UNKNOWN_RES_MNG = 0x8010002B
65
63
  SCARD_W_UNRESPONSIVE_CARD = 0x80100066
64
+ SCARD_W_CHV_BLOCKED = 0x8010006C
65
+ SCARD_W_CARD_NOT_AUTHENTICATED = 0x8010006F
66
66
  SCARD_SCOPE_USER = 0x00000000
67
67
  SCARD_SCOPE_SYSTEM = 0x00000002
68
68
  SCARD_SCOPE_TERMINAL = 0x00000001
69
- SCARD_PROTOCOL_RAW = 0x00000004
69
+ SCARD_PROTOCOL_UNDEFINED = 0x00000000
70
+ SCARD_PROTOCOL_UNSET = 0x00000000
70
71
  SCARD_PROTOCOL_T0 = 0x00000001
71
72
  SCARD_PROTOCOL_T1 = 0x00000002
73
+ SCARD_PROTOCOL_RAW = 0x00000004
72
74
  SCARD_PROTOCOL_ANY = 0x00000003
73
75
  SCARD_PROTOCOL_T15 = 0x00000008
74
- SCARD_PROTOCOL_UNDEFINED = 0x00000000
75
- SCARD_PROTOCOL_UNSET = 0x00000000
76
- SCARD_SHARE_EXCLUSIVE = 0x00000001
77
76
  SCARD_SHARE_SHARED = 0x00000002
78
77
  SCARD_SHARE_DIRECT = 0x00000003
79
- SCARD_LEAVE_CARD = 0x00000000
80
- SCARD_RESET_CARD = 0x00000001
78
+ SCARD_SHARE_EXCLUSIVE = 0x00000001
81
79
  SCARD_EJECT_CARD = 0x00000003
82
80
  SCARD_UNPOWER_CARD = 0x00000002
83
- SCARD_ATTR_USER_AUTH_INPUT_DEVICE = 0x00050142
81
+ SCARD_LEAVE_CARD = 0x00000000
82
+ SCARD_RESET_CARD = 0x00000001
83
+ SCARD_ATTR_SYNC_PROTOCOL_TYPES = 0x00030126
84
+ SCARD_ATTR_CURRENT_CLK = 0x00080202
85
+ SCARD_ATTR_CURRENT_EBC_ENCODING = 0x0008020B
86
+ SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE = 0x00050140
87
+ SCARD_ATTR_CURRENT_F = 0x00080203
88
+ SCARD_ATTR_CURRENT_D = 0x00080204
89
+ SCARD_ATTR_CURRENT_N = 0x00080205
84
90
  SCARD_ATTR_CURRENT_W = 0x00080206
85
- SCARD_ATTR_ICC_TYPE_PER_ATR = 0x00090304
86
- SCARD_ATTR_ESC_CANCEL = 0x0007A003
91
+ SCARD_ATTR_DEVICE_FRIENDLY_NAME = 0x7FFF0003
92
+ SCARD_ATTR_VENDOR_IFD_SERIAL_NO = 0x00010103
93
+ SCARD_ATTR_ESC_RESET = 0x0007A000
94
+ SCARD_ATTR_CHARACTERISTICS = 0x00060150
95
+ SCARD_ATTR_CURRENT_IFSC = 0x00080207
96
+ SCARD_ATTR_CURRENT_IFSD = 0x00080208
87
97
  SCARD_ATTR_MAX_CLK = 0x00030122
88
- SCARD_ATTR_CHANNEL_ID = 0x00020110
98
+ SCARD_ATTR_MAX_DATA_RATE = 0x00030124
89
99
  SCARD_ATTR_CURRENT_PROTOCOL_TYPE = 0x00080201
90
- SCARD_ATTR_CURRENT_N = 0x00080205
91
- SCARD_ATTR_CURRENT_BWT = 0x00080209
92
- SCARD_ATTR_EXTENDED_BWT = 0x0008020C
93
- SCARD_ATTR_ICC_INTERFACE_STATUS = 0x00090301
100
+ SCARD_ATTR_ATR_STRING = 0x00090303
94
101
  SCARD_ATTR_ESC_AUTHREQUEST = 0x0007A005
95
- SCARD_ATTR_SUPRESS_T1_IFS_REQUEST = 0x7FFF0007
102
+ SCARD_ATTR_DEVICE_SYSTEM_NAME_A = 0x7FFF0004
103
+ SCARD_ATTR_DEVICE_SYSTEM_NAME_W = 0x7FFF0006
104
+ SCARD_ATTR_DEFAULT_CLK = 0x00030121
96
105
  SCARD_ATTR_MAX_IFSD = 0x00030125
97
- SCARD_ATTR_CURRENT_D = 0x00080204
98
- SCARD_ATTR_CURRENT_CWT = 0x0008020A
99
- SCARD_ATTR_CURRENT_IO_STATE = 0x00090302
106
+ SCARD_ATTR_VENDOR_NAME = 0x00010100
107
+ SCARD_ATTR_ASYNC_PROTOCOL_TYPES = 0x00030120
108
+ SCARD_ATTR_DEVICE_UNIT = 0x7FFF0001
100
109
  SCARD_ATTR_DEVICE_FRIENDLY_NAME_A = 0x7FFF0003
101
- SCARD_ATTR_SYNC_PROTOCOL_TYPES = 0x00030126
102
- SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE = 0x00050140
103
- SCARD_ATTR_MAXINPUT = 0x0007A007
104
110
  SCARD_ATTR_DEVICE_FRIENDLY_NAME_W = 0x7FFF0005
105
- SCARD_ATTR_VENDOR_IFD_TYPE = 0x00010101
106
- SCARD_ATTR_VENDOR_IFD_VERSION = 0x00010102
107
- SCARD_ATTR_CURRENT_CLK = 0x00080202
108
- SCARD_ATTR_CURRENT_F = 0x00080203
111
+ SCARD_ATTR_SUPRESS_T1_IFS_REQUEST = 0x7FFF0007
112
+ SCARD_ATTR_CURRENT_BWT = 0x00080209
113
+ SCARD_ATTR_CURRENT_CWT = 0x0008020A
109
114
  SCARD_ATTR_ICC_PRESENCE = 0x00090300
110
- SCARD_ATTR_DEVICE_UNIT = 0x7FFF0001
111
- SCARD_ATTR_VENDOR_IFD_SERIAL_NO = 0x00010103
112
- SCARD_ATTR_CHARACTERISTICS = 0x00060150
113
- SCARD_ATTR_CURRENT_EBC_ENCODING = 0x0008020B
115
+ SCARD_ATTR_ESC_CANCEL = 0x0007A003
114
116
  SCARD_ATTR_DEVICE_IN_USE = 0x7FFF0002
117
+ SCARD_ATTR_USER_AUTH_INPUT_DEVICE = 0x00050142
118
+ SCARD_ATTR_CURRENT_IO_STATE = 0x00090302
115
119
  SCARD_ATTR_DEVICE_SYSTEM_NAME = 0x7FFF0004
116
- SCARD_ATTR_VENDOR_NAME = 0x00010100
120
+ SCARD_ATTR_VENDOR_IFD_TYPE = 0x00010101
117
121
  SCARD_ATTR_DEFAULT_DATA_RATE = 0x00030123
118
- SCARD_ATTR_ATR_STRING = 0x00090303
119
- SCARD_ATTR_MAX_DATA_RATE = 0x00030124
120
- SCARD_ATTR_DEVICE_SYSTEM_NAME_A = 0x7FFF0004
121
- SCARD_ATTR_DEVICE_SYSTEM_NAME_W = 0x7FFF0006
122
- SCARD_ATTR_ASYNC_PROTOCOL_TYPES = 0x00030120
123
- SCARD_ATTR_DEFAULT_CLK = 0x00030121
122
+ SCARD_ATTR_ICC_TYPE_PER_ATR = 0x00090304
123
+ SCARD_ATTR_VENDOR_IFD_VERSION = 0x00010102
124
+ SCARD_ATTR_CHANNEL_ID = 0x00020110
124
125
  SCARD_ATTR_POWER_MGMT_SUPPORT = 0x00040131
125
- SCARD_ATTR_CURRENT_IFSC = 0x00080207
126
- SCARD_ATTR_CURRENT_IFSD = 0x00080208
127
- SCARD_ATTR_ESC_RESET = 0x0007A000
128
- SCARD_ATTR_DEVICE_FRIENDLY_NAME = 0x7FFF0003
129
- SCARD_STATE_UNKNOWN = 0x00000004
130
- SCARD_STATE_EXCLUSIVE = 0x00000080
126
+ SCARD_ATTR_EXTENDED_BWT = 0x0008020C
127
+ SCARD_ATTR_ICC_INTERFACE_STATUS = 0x00090301
128
+ SCARD_ATTR_MAXINPUT = 0x0007A007
131
129
  SCARD_STATE_CHANGED = 0x00000002
132
- SCARD_STATE_EMPTY = 0x00000010
133
- SCARD_STATE_UNPOWERED = 0x00000400
134
- SCARD_STATE_INUSE = 0x00000100
135
- SCARD_STATE_UNAWARE = 0x00000000
136
- SCARD_STATE_ATRMATCH = 0x00000040
137
130
  SCARD_STATE_MUTE = 0x00000200
138
131
  SCARD_STATE_IGNORE = 0x00000001
139
132
  SCARD_STATE_UNAVAILABLE = 0x00000008
133
+ SCARD_STATE_EMPTY = 0x00000010
134
+ SCARD_STATE_UNKNOWN = 0x00000004
135
+ SCARD_STATE_ATRMATCH = 0x00000040
140
136
  SCARD_STATE_PRESENT = 0x00000020
137
+ SCARD_STATE_EXCLUSIVE = 0x00000080
138
+ SCARD_STATE_INUSE = 0x00000100
139
+ SCARD_STATE_UNPOWERED = 0x00000400
140
+ SCARD_STATE_UNAWARE = 0x00000000
141
141
  SCARD_PRESENT = 0x00000004
142
- SCARD_SWALLOWED = 0x00000008
142
+ SCARD_AUTOALLOCATE = 0xFFFFFFFF
143
143
  SCARD_ABSENT = 0x00000002
144
- SCARD_SPECIFIC = 0x00000040
144
+ SCARD_SWALLOWED = 0x00000008
145
145
  SCARD_UNKNOWN = 0x00000001
146
- SCARD_AUTOALLOCATE = 0xFFFFFFFF
147
146
  SCARD_POWERED = 0x00000010
147
+ SCARD_SPECIFIC = 0x00000040
148
148
  SCARD_NEGOTIABLE = 0x00000020
149
149
  MAX_ATR_SIZE = 0x00000021
150
150
  INFINITE = 0xFFFFFFFF
@@ -152,62 +152,62 @@ module FFILib
152
152
 
153
153
  # Error codes returned by the PCSC functions.
154
154
  Status = enum [
155
- :not_transacted, Consts::SCARD_E_NOT_TRANSACTED,
156
- :file_not_found, Consts::SCARD_E_FILE_NOT_FOUND,
157
- :write_too_many, Consts::SCARD_E_WRITE_TOO_MANY,
158
- :no_readers_available, Consts::SCARD_E_NO_READERS_AVAILABLE,
159
- :not_ready, Consts::SCARD_E_NOT_READY,
160
- :reader_unavailable, Consts::SCARD_E_READER_UNAVAILABLE,
155
+ :invalid_value, Consts::SCARD_E_INVALID_VALUE,
156
+ :no_service, Consts::SCARD_E_NO_SERVICE,
157
+ :unsupported_feature, Consts::SCARD_E_UNSUPPORTED_FEATURE,
158
+ :invalid_atr, Consts::SCARD_E_INVALID_ATR,
159
+ :duplicate_reader, Consts::SCARD_E_DUPLICATE_READER,
160
+ :unsupported_card, Consts::SCARD_W_UNSUPPORTED_CARD,
161
+ :unknown_card, Consts::SCARD_E_UNKNOWN_CARD,
162
+ :unexpected, Consts::SCARD_E_UNEXPECTED,
161
163
  :server_too_busy, Consts::SCARD_E_SERVER_TOO_BUSY,
162
- :removed_card, Consts::SCARD_W_REMOVED_CARD,
164
+ :unpowered_card, Consts::SCARD_W_UNPOWERED_CARD,
165
+ :cancelled_by_user, Consts::SCARD_W_CANCELLED_BY_USER,
166
+ :cancelled, Consts::SCARD_E_CANCELLED,
167
+ :invalid_chv, Consts::SCARD_E_INVALID_CHV,
168
+ :certificate_unavailable, Consts::SCARD_E_CERTIFICATE_UNAVAILABLE,
163
169
  :security_violation, Consts::SCARD_W_SECURITY_VIOLATION,
164
170
  :invalid_parameter, Consts::SCARD_E_INVALID_PARAMETER,
165
- :no_memory, Consts::SCARD_E_NO_MEMORY,
166
- :timeout, Consts::SCARD_E_TIMEOUT,
167
- :eof, Consts::SCARD_W_EOF,
168
- :sharing_violation, Consts::SCARD_E_SHARING_VIOLATION,
169
171
  :system_cancelled, Consts::SCARD_E_SYSTEM_CANCELLED,
170
- :invalid_atr, Consts::SCARD_E_INVALID_ATR,
171
- :dir_not_found, Consts::SCARD_E_DIR_NOT_FOUND,
172
- :no_access, Consts::SCARD_E_NO_ACCESS,
173
- :invalid_target, Consts::SCARD_E_INVALID_TARGET,
174
- :duplicate_reader, Consts::SCARD_E_DUPLICATE_READER,
175
- :no_service, Consts::SCARD_E_NO_SERVICE,
176
- :service_stopped, Consts::SCARD_E_SERVICE_STOPPED,
177
- :unsupported_feature, Consts::SCARD_E_UNSUPPORTED_FEATURE,
178
- :card_not_authenticated, Consts::SCARD_W_CARD_NOT_AUTHENTICATED,
179
- :success, Consts::SCARD_S_SUCCESS,
180
172
  :no_key_container, Consts::SCARD_E_NO_KEY_CONTAINER,
181
- :cancelled_by_user, Consts::SCARD_W_CANCELLED_BY_USER,
182
- :cant_dispose, Consts::SCARD_E_CANT_DISPOSE,
173
+ :not_ready, Consts::SCARD_E_NOT_READY,
174
+ :not_transacted, Consts::SCARD_E_NOT_TRANSACTED,
175
+ :reader_unavailable, Consts::SCARD_E_READER_UNAVAILABLE,
183
176
  :reader_unsupported, Consts::SCARD_E_READER_UNSUPPORTED,
184
177
  :card_unsupported, Consts::SCARD_E_CARD_UNSUPPORTED,
185
- :chv_blocked, Consts::SCARD_W_CHV_BLOCKED,
186
- :cancelled, Consts::SCARD_E_CANCELLED,
178
+ :invalid_target, Consts::SCARD_E_INVALID_TARGET,
179
+ :no_memory, Consts::SCARD_E_NO_MEMORY,
187
180
  :unknown_reader, Consts::SCARD_E_UNKNOWN_READER,
188
- :proto_mismatch, Consts::SCARD_E_PROTO_MISMATCH,
189
- :unexpected, Consts::SCARD_E_UNEXPECTED,
190
- :certificate_unavailable, Consts::SCARD_E_CERTIFICATE_UNAVAILABLE,
191
- :invalid_handle, Consts::SCARD_E_INVALID_HANDLE,
192
- :insufficient_buffer, Consts::SCARD_E_INSUFFICIENT_BUFFER,
193
181
  :no_smartcard, Consts::SCARD_E_NO_SMARTCARD,
194
- :invalid_value, Consts::SCARD_E_INVALID_VALUE,
195
182
  :icc_installation, Consts::SCARD_E_ICC_INSTALLATION,
183
+ :file_not_found, Consts::SCARD_E_FILE_NOT_FOUND,
184
+ :no_such_certificate, Consts::SCARD_E_NO_SUCH_CERTIFICATE,
185
+ :wrong_chv, Consts::SCARD_W_WRONG_CHV,
186
+ :no_access, Consts::SCARD_E_NO_ACCESS,
187
+ :write_too_many, Consts::SCARD_E_WRITE_TOO_MANY,
188
+ :eof, Consts::SCARD_W_EOF,
189
+ :invalid_handle, Consts::SCARD_E_INVALID_HANDLE,
190
+ :cant_dispose, Consts::SCARD_E_CANT_DISPOSE,
191
+ :service_stopped, Consts::SCARD_E_SERVICE_STOPPED,
196
192
  :icc_createorder, Consts::SCARD_E_ICC_CREATEORDER,
197
193
  :no_file, Consts::SCARD_E_NO_FILE,
198
- :bad_seek, Consts::SCARD_E_BAD_SEEK,
199
- :unknown_res_mng, Consts::SCARD_E_UNKNOWN_RES_MNG,
194
+ :no_readers_available, Consts::SCARD_E_NO_READERS_AVAILABLE,
200
195
  :comm_data_lost, Consts::SCARD_E_COMM_DATA_LOST,
201
- :unpowered_card, Consts::SCARD_W_UNPOWERED_CARD,
202
- :reset_card, Consts::SCARD_W_RESET_CARD,
203
- :unknown_card, Consts::SCARD_E_UNKNOWN_CARD,
196
+ :timeout, Consts::SCARD_E_TIMEOUT,
197
+ :sharing_violation, Consts::SCARD_E_SHARING_VIOLATION,
198
+ :proto_mismatch, Consts::SCARD_E_PROTO_MISMATCH,
204
199
  :pci_too_small, Consts::SCARD_E_PCI_TOO_SMALL,
200
+ :reset_card, Consts::SCARD_W_RESET_CARD,
201
+ :removed_card, Consts::SCARD_W_REMOVED_CARD,
202
+ :success, Consts::SCARD_S_SUCCESS,
203
+ :insufficient_buffer, Consts::SCARD_E_INSUFFICIENT_BUFFER,
204
+ :dir_not_found, Consts::SCARD_E_DIR_NOT_FOUND,
205
205
  :no_dir, Consts::SCARD_E_NO_DIR,
206
- :no_such_certificate, Consts::SCARD_E_NO_SUCH_CERTIFICATE,
207
- :wrong_chv, Consts::SCARD_W_WRONG_CHV,
208
- :invalid_chv, Consts::SCARD_E_INVALID_CHV,
209
- :unsupported_card, Consts::SCARD_W_UNSUPPORTED_CARD,
206
+ :bad_seek, Consts::SCARD_E_BAD_SEEK,
207
+ :unknown_res_mng, Consts::SCARD_E_UNKNOWN_RES_MNG,
210
208
  :unresponsive_card, Consts::SCARD_W_UNRESPONSIVE_CARD,
209
+ :chv_blocked, Consts::SCARD_W_CHV_BLOCKED,
210
+ :card_not_authenticated, Consts::SCARD_W_CARD_NOT_AUTHENTICATED,
211
211
  ]
212
212
 
213
213
  # Values for the context's scope.
@@ -219,105 +219,105 @@ module FFILib
219
219
 
220
220
  # Smart-card communication protocols.
221
221
  Protocol = enum [
222
- :raw, Consts::SCARD_PROTOCOL_RAW,
222
+ :undefined, Consts::SCARD_PROTOCOL_UNDEFINED,
223
+ :unset, Consts::SCARD_PROTOCOL_UNSET,
223
224
  :t0, Consts::SCARD_PROTOCOL_T0,
224
225
  :t1, Consts::SCARD_PROTOCOL_T1,
226
+ :raw, Consts::SCARD_PROTOCOL_RAW,
225
227
  :any, Consts::SCARD_PROTOCOL_ANY,
226
228
  :t15, Consts::SCARD_PROTOCOL_T15,
227
- :undefined, Consts::SCARD_PROTOCOL_UNDEFINED,
228
- :unset, Consts::SCARD_PROTOCOL_UNSET,
229
229
  ]
230
230
 
231
231
  # Smart-card sharing modes.
232
232
  Share = enum [
233
- :exclusive, Consts::SCARD_SHARE_EXCLUSIVE,
234
233
  :shared, Consts::SCARD_SHARE_SHARED,
235
234
  :direct, Consts::SCARD_SHARE_DIRECT,
235
+ :exclusive, Consts::SCARD_SHARE_EXCLUSIVE,
236
236
  ]
237
237
 
238
238
  # Smart-card dispositions.
239
239
  Disposition = enum [
240
- :leave, Consts::SCARD_LEAVE_CARD,
241
- :reset, Consts::SCARD_RESET_CARD,
242
240
  :eject, Consts::SCARD_EJECT_CARD,
243
241
  :unpower, Consts::SCARD_UNPOWER_CARD,
242
+ :leave, Consts::SCARD_LEAVE_CARD,
243
+ :reset, Consts::SCARD_RESET_CARD,
244
244
  ]
245
245
 
246
246
  # Smart-card reader attributes.
247
247
  Attribute = enum [
248
- :user_auth_input_device, Consts::SCARD_ATTR_USER_AUTH_INPUT_DEVICE,
248
+ :sync_protocol_types, Consts::SCARD_ATTR_SYNC_PROTOCOL_TYPES,
249
+ :current_clk, Consts::SCARD_ATTR_CURRENT_CLK,
250
+ :current_ebc_encoding, Consts::SCARD_ATTR_CURRENT_EBC_ENCODING,
251
+ :user_to_card_auth_device, Consts::SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE,
252
+ :current_f, Consts::SCARD_ATTR_CURRENT_F,
253
+ :current_d, Consts::SCARD_ATTR_CURRENT_D,
254
+ :current_n, Consts::SCARD_ATTR_CURRENT_N,
249
255
  :current_w, Consts::SCARD_ATTR_CURRENT_W,
250
- :icc_type_per_atr, Consts::SCARD_ATTR_ICC_TYPE_PER_ATR,
251
- :esc_cancel, Consts::SCARD_ATTR_ESC_CANCEL,
256
+ :device_friendly_name, Consts::SCARD_ATTR_DEVICE_FRIENDLY_NAME,
257
+ :vendor_ifd_serial_no, Consts::SCARD_ATTR_VENDOR_IFD_SERIAL_NO,
258
+ :esc_reset, Consts::SCARD_ATTR_ESC_RESET,
259
+ :characteristics, Consts::SCARD_ATTR_CHARACTERISTICS,
260
+ :current_ifsc, Consts::SCARD_ATTR_CURRENT_IFSC,
261
+ :current_ifsd, Consts::SCARD_ATTR_CURRENT_IFSD,
252
262
  :max_clk, Consts::SCARD_ATTR_MAX_CLK,
253
- :channel_id, Consts::SCARD_ATTR_CHANNEL_ID,
263
+ :max_data_rate, Consts::SCARD_ATTR_MAX_DATA_RATE,
254
264
  :current_protocol_type, Consts::SCARD_ATTR_CURRENT_PROTOCOL_TYPE,
255
- :current_n, Consts::SCARD_ATTR_CURRENT_N,
256
- :current_bwt, Consts::SCARD_ATTR_CURRENT_BWT,
257
- :extended_bwt, Consts::SCARD_ATTR_EXTENDED_BWT,
258
- :icc_interface_status, Consts::SCARD_ATTR_ICC_INTERFACE_STATUS,
265
+ :atr_string, Consts::SCARD_ATTR_ATR_STRING,
259
266
  :esc_authrequest, Consts::SCARD_ATTR_ESC_AUTHREQUEST,
260
- :supress_t1_ifs_request, Consts::SCARD_ATTR_SUPRESS_T1_IFS_REQUEST,
267
+ :device_system_name_a, Consts::SCARD_ATTR_DEVICE_SYSTEM_NAME_A,
268
+ :device_system_name_w, Consts::SCARD_ATTR_DEVICE_SYSTEM_NAME_W,
269
+ :default_clk, Consts::SCARD_ATTR_DEFAULT_CLK,
261
270
  :max_ifsd, Consts::SCARD_ATTR_MAX_IFSD,
262
- :current_d, Consts::SCARD_ATTR_CURRENT_D,
263
- :current_cwt, Consts::SCARD_ATTR_CURRENT_CWT,
264
- :current_io_state, Consts::SCARD_ATTR_CURRENT_IO_STATE,
271
+ :vendor_name, Consts::SCARD_ATTR_VENDOR_NAME,
272
+ :async_protocol_types, Consts::SCARD_ATTR_ASYNC_PROTOCOL_TYPES,
273
+ :device_unit, Consts::SCARD_ATTR_DEVICE_UNIT,
265
274
  :device_friendly_name_a, Consts::SCARD_ATTR_DEVICE_FRIENDLY_NAME_A,
266
- :sync_protocol_types, Consts::SCARD_ATTR_SYNC_PROTOCOL_TYPES,
267
- :user_to_card_auth_device, Consts::SCARD_ATTR_USER_TO_CARD_AUTH_DEVICE,
268
- :maxinput, Consts::SCARD_ATTR_MAXINPUT,
269
275
  :device_friendly_name_w, Consts::SCARD_ATTR_DEVICE_FRIENDLY_NAME_W,
270
- :vendor_ifd_type, Consts::SCARD_ATTR_VENDOR_IFD_TYPE,
271
- :vendor_ifd_version, Consts::SCARD_ATTR_VENDOR_IFD_VERSION,
272
- :current_clk, Consts::SCARD_ATTR_CURRENT_CLK,
273
- :current_f, Consts::SCARD_ATTR_CURRENT_F,
276
+ :supress_t1_ifs_request, Consts::SCARD_ATTR_SUPRESS_T1_IFS_REQUEST,
277
+ :current_bwt, Consts::SCARD_ATTR_CURRENT_BWT,
278
+ :current_cwt, Consts::SCARD_ATTR_CURRENT_CWT,
274
279
  :icc_presence, Consts::SCARD_ATTR_ICC_PRESENCE,
275
- :device_unit, Consts::SCARD_ATTR_DEVICE_UNIT,
276
- :vendor_ifd_serial_no, Consts::SCARD_ATTR_VENDOR_IFD_SERIAL_NO,
277
- :characteristics, Consts::SCARD_ATTR_CHARACTERISTICS,
278
- :current_ebc_encoding, Consts::SCARD_ATTR_CURRENT_EBC_ENCODING,
280
+ :esc_cancel, Consts::SCARD_ATTR_ESC_CANCEL,
279
281
  :device_in_use, Consts::SCARD_ATTR_DEVICE_IN_USE,
282
+ :user_auth_input_device, Consts::SCARD_ATTR_USER_AUTH_INPUT_DEVICE,
283
+ :current_io_state, Consts::SCARD_ATTR_CURRENT_IO_STATE,
280
284
  :device_system_name, Consts::SCARD_ATTR_DEVICE_SYSTEM_NAME,
281
- :vendor_name, Consts::SCARD_ATTR_VENDOR_NAME,
285
+ :vendor_ifd_type, Consts::SCARD_ATTR_VENDOR_IFD_TYPE,
282
286
  :default_data_rate, Consts::SCARD_ATTR_DEFAULT_DATA_RATE,
283
- :atr_string, Consts::SCARD_ATTR_ATR_STRING,
284
- :max_data_rate, Consts::SCARD_ATTR_MAX_DATA_RATE,
285
- :device_system_name_a, Consts::SCARD_ATTR_DEVICE_SYSTEM_NAME_A,
286
- :device_system_name_w, Consts::SCARD_ATTR_DEVICE_SYSTEM_NAME_W,
287
- :async_protocol_types, Consts::SCARD_ATTR_ASYNC_PROTOCOL_TYPES,
288
- :default_clk, Consts::SCARD_ATTR_DEFAULT_CLK,
287
+ :icc_type_per_atr, Consts::SCARD_ATTR_ICC_TYPE_PER_ATR,
288
+ :vendor_ifd_version, Consts::SCARD_ATTR_VENDOR_IFD_VERSION,
289
+ :channel_id, Consts::SCARD_ATTR_CHANNEL_ID,
289
290
  :power_mgmt_support, Consts::SCARD_ATTR_POWER_MGMT_SUPPORT,
290
- :current_ifsc, Consts::SCARD_ATTR_CURRENT_IFSC,
291
- :current_ifsd, Consts::SCARD_ATTR_CURRENT_IFSD,
292
- :esc_reset, Consts::SCARD_ATTR_ESC_RESET,
293
- :device_friendly_name, Consts::SCARD_ATTR_DEVICE_FRIENDLY_NAME,
291
+ :extended_bwt, Consts::SCARD_ATTR_EXTENDED_BWT,
292
+ :icc_interface_status, Consts::SCARD_ATTR_ICC_INTERFACE_STATUS,
293
+ :maxinput, Consts::SCARD_ATTR_MAXINPUT,
294
294
  ]
295
295
 
296
296
  # Smart-card states.
297
297
  CardState = enum [
298
- :unknown, Consts::SCARD_STATE_UNKNOWN,
299
- :exclusive, Consts::SCARD_STATE_EXCLUSIVE,
300
298
  :changed, Consts::SCARD_STATE_CHANGED,
301
- :empty, Consts::SCARD_STATE_EMPTY,
302
- :unpowered, Consts::SCARD_STATE_UNPOWERED,
303
- :inuse, Consts::SCARD_STATE_INUSE,
304
- :unaware, Consts::SCARD_STATE_UNAWARE,
305
- :atrmatch, Consts::SCARD_STATE_ATRMATCH,
306
299
  :mute, Consts::SCARD_STATE_MUTE,
307
300
  :ignore, Consts::SCARD_STATE_IGNORE,
308
301
  :unavailable, Consts::SCARD_STATE_UNAVAILABLE,
302
+ :empty, Consts::SCARD_STATE_EMPTY,
303
+ :unknown, Consts::SCARD_STATE_UNKNOWN,
304
+ :atrmatch, Consts::SCARD_STATE_ATRMATCH,
309
305
  :present, Consts::SCARD_STATE_PRESENT,
306
+ :exclusive, Consts::SCARD_STATE_EXCLUSIVE,
307
+ :inuse, Consts::SCARD_STATE_INUSE,
308
+ :unpowered, Consts::SCARD_STATE_UNPOWERED,
309
+ :unaware, Consts::SCARD_STATE_UNAWARE,
310
310
  ]
311
311
 
312
312
  # Smart-card reader states.
313
313
  State = enum [
314
314
  :present, Consts::SCARD_PRESENT,
315
- :swallowed, Consts::SCARD_SWALLOWED,
315
+ :autoallocate, Consts::SCARD_AUTOALLOCATE,
316
316
  :absent, Consts::SCARD_ABSENT,
317
- :specific, Consts::SCARD_SPECIFIC,
317
+ :swallowed, Consts::SCARD_SWALLOWED,
318
318
  :unknown, Consts::SCARD_UNKNOWN,
319
- :autoallocate, Consts::SCARD_AUTOALLOCATE,
320
319
  :powered, Consts::SCARD_POWERED,
320
+ :specific, Consts::SCARD_SPECIFIC,
321
321
  :negotiable, Consts::SCARD_NEGOTIABLE,
322
322
  ]
323
323
 
@@ -41,7 +41,7 @@ class ReaderStateQueries
41
41
  # This is a convenience method intended to be called after
42
42
  # Smartcard::PCSC::Context#wait_for_status_change.
43
43
  def ack_changes
44
- @queries.each { |query| query.current_state = query.event_state }
44
+ @queries.each { |query| query[:current_state] = query[:event_state] }
45
45
  end
46
46
 
47
47
  # Called by FFI::AutoPointer to release the reader states array.
@@ -148,18 +148,32 @@ class FFILib::ReaderStateQuery
148
148
  def self.pack_state(unpacked_state)
149
149
  if unpacked_state.kind_of? Enumerable
150
150
  state = 0
151
- unpacked_state.each { |bit| state |= FFILib::CardState[bit] }
151
+ unpacked_state.each do |symbol_bit_or_number|
152
+ if FFILib::CardState[symbol_bit_or_number]
153
+ state |= FFILib::CardState[symbol_bit_or_number]
154
+ else
155
+ state |= symbol_bit_or_number
156
+ end
157
+ end
152
158
  return state
153
159
  end
154
160
  FFILib::CardState[unpacked_state]
155
161
  end
156
162
 
157
163
  # Unpacks a numeric card state into a Set of symbols.
164
+ #
165
+ # The returned Set may also have an Integer in it, if any of the bits set in
166
+ # the packed state are not covered by the mapping in FFILib::CardState.
158
167
  def self.unpack_state(packed_state)
159
168
  state = Set.new
160
- FFILib::CardState.to_h.each do |bit, mask|
161
- state << bit if (packed_state & mask) == mask and mask != 0
169
+ FFILib::CardState.to_h.each do |symbol, mask|
170
+ next if mask == 0
171
+ if (packed_state & mask) == mask
172
+ state << symbol
173
+ packed_state ^= mask
174
+ end
162
175
  end
176
+ state << packed_state if packed_state != 0
163
177
  state
164
178
  end
165
179
  end
@@ -1,23 +1,23 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  Gem::Specification.new do |s|
4
- s.name = %q{smartcard}
5
- s.version = "0.5.3"
4
+ s.name = "smartcard"
5
+ s.version = "0.5.4"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Victor Costan"]
9
- s.date = %q{2011-04-21}
10
- s.description = %q{Interface with ISO 7816 smart cards.}
11
- s.email = %q{victor@costan.us}
12
- s.extra_rdoc_files = ["BUILD", "CHANGELOG", "LICENSE", "README", "lib/smartcard.rb", "lib/smartcard/gp/asn1_ber.rb", "lib/smartcard/gp/cap_loader.rb", "lib/smartcard/gp/des.rb", "lib/smartcard/gp/gp_card_mixin.rb", "lib/smartcard/iso/apdu_error.rb", "lib/smartcard/iso/auto_configurator.rb", "lib/smartcard/iso/iso_card_mixin.rb", "lib/smartcard/iso/jcop_remote_protocol.rb", "lib/smartcard/iso/jcop_remote_server.rb", "lib/smartcard/iso/jcop_remote_transport.rb", "lib/smartcard/iso/pcsc_transport.rb", "lib/smartcard/iso/transport.rb", "lib/smartcard/pcsc/card.rb", "lib/smartcard/pcsc/context.rb", "lib/smartcard/pcsc/ffi_autogen.rb", "lib/smartcard/pcsc/ffi_functions.rb", "lib/smartcard/pcsc/ffi_lib.rb", "lib/smartcard/pcsc/ffi_structs.rb", "lib/smartcard/pcsc/pcsc_exception.rb", "lib/smartcard/pcsc/reader_state_queries.rb", "tasks/ffi_codegen.rb"]
13
- s.files = ["BUILD", "CHANGELOG", "LICENSE", "Manifest", "README", "Rakefile", "lib/smartcard.rb", "lib/smartcard/gp/asn1_ber.rb", "lib/smartcard/gp/cap_loader.rb", "lib/smartcard/gp/des.rb", "lib/smartcard/gp/gp_card_mixin.rb", "lib/smartcard/iso/apdu_error.rb", "lib/smartcard/iso/auto_configurator.rb", "lib/smartcard/iso/iso_card_mixin.rb", "lib/smartcard/iso/jcop_remote_protocol.rb", "lib/smartcard/iso/jcop_remote_server.rb", "lib/smartcard/iso/jcop_remote_transport.rb", "lib/smartcard/iso/pcsc_transport.rb", "lib/smartcard/iso/transport.rb", "lib/smartcard/pcsc/card.rb", "lib/smartcard/pcsc/context.rb", "lib/smartcard/pcsc/ffi_autogen.rb", "lib/smartcard/pcsc/ffi_functions.rb", "lib/smartcard/pcsc/ffi_lib.rb", "lib/smartcard/pcsc/ffi_structs.rb", "lib/smartcard/pcsc/pcsc_exception.rb", "lib/smartcard/pcsc/reader_state_queries.rb", "tasks/ffi_codegen.rb", "test/gp/asn1_ber_test.rb", "test/gp/cap_loader_test.rb", "test/gp/des_test.rb", "test/gp/gp_card_mixin_compat_test.rb", "test/gp/gp_card_mixin_test.rb", "test/gp/hello.apdu", "test/gp/hello.cap", "test/iso/auto_configurator_test.rb", "test/iso/iso_card_mixin_test.rb", "test/iso/iso_exception_test.rb", "test/iso/jcop_remote_test.rb", "test/pcsc/card_test.rb", "test/pcsc/context_test.rb", "test/pcsc/reader_state_queries_test.rb", "smartcard.gemspec"]
14
- s.homepage = %q{http://www.costan.us/smartcard}
9
+ s.date = "2012-02-09"
10
+ s.description = "Interface with ISO 7816 smart cards."
11
+ s.email = "victor@costan.us"
12
+ s.extra_rdoc_files = ["BUILD", "CHANGELOG", "LICENSE", "README", "lib/smartcard.rb", "lib/smartcard/gp/asn1_ber.rb", "lib/smartcard/gp/cap_loader.rb", "lib/smartcard/gp/des.rb", "lib/smartcard/gp/gp_card_mixin.rb", "lib/smartcard/iso/apdu_error.rb", "lib/smartcard/iso/auto_configurator.rb", "lib/smartcard/iso/iso_card_mixin.rb", "lib/smartcard/iso/jcop_remote_protocol.rb", "lib/smartcard/iso/jcop_remote_server.rb", "lib/smartcard/iso/jcop_remote_transport.rb", "lib/smartcard/iso/pcsc_transport.rb", "lib/smartcard/iso/transport.rb", "lib/smartcard/pcsc/card.rb", "lib/smartcard/pcsc/context.rb", "lib/smartcard/pcsc/exception.rb", "lib/smartcard/pcsc/ffi_autogen.rb", "lib/smartcard/pcsc/ffi_functions.rb", "lib/smartcard/pcsc/ffi_lib.rb", "lib/smartcard/pcsc/ffi_structs.rb", "lib/smartcard/pcsc/reader_state_queries.rb", "tasks/ffi_codegen.rb"]
13
+ s.files = ["BUILD", "CHANGELOG", "LICENSE", "Manifest", "README", "Rakefile", "lib/smartcard.rb", "lib/smartcard/gp/asn1_ber.rb", "lib/smartcard/gp/cap_loader.rb", "lib/smartcard/gp/des.rb", "lib/smartcard/gp/gp_card_mixin.rb", "lib/smartcard/iso/apdu_error.rb", "lib/smartcard/iso/auto_configurator.rb", "lib/smartcard/iso/iso_card_mixin.rb", "lib/smartcard/iso/jcop_remote_protocol.rb", "lib/smartcard/iso/jcop_remote_server.rb", "lib/smartcard/iso/jcop_remote_transport.rb", "lib/smartcard/iso/pcsc_transport.rb", "lib/smartcard/iso/transport.rb", "lib/smartcard/pcsc/card.rb", "lib/smartcard/pcsc/context.rb", "lib/smartcard/pcsc/exception.rb", "lib/smartcard/pcsc/ffi_autogen.rb", "lib/smartcard/pcsc/ffi_functions.rb", "lib/smartcard/pcsc/ffi_lib.rb", "lib/smartcard/pcsc/ffi_structs.rb", "lib/smartcard/pcsc/reader_state_queries.rb", "tasks/ffi_codegen.rb", "test/gp/asn1_ber_test.rb", "test/gp/cap_loader_test.rb", "test/gp/des_test.rb", "test/gp/gp_card_mixin_compat_test.rb", "test/gp/gp_card_mixin_test.rb", "test/gp/hello.apdu", "test/gp/hello.cap", "test/iso/auto_configurator_test.rb", "test/iso/iso_card_mixin_test.rb", "test/iso/iso_exception_test.rb", "test/iso/jcop_remote_test.rb", "test/pcsc/card_test.rb", "test/pcsc/context_test.rb", "test/pcsc/exception_test.rb", "test/pcsc/reader_state_queries_test.rb", "smartcard.gemspec"]
14
+ s.homepage = "http://www.costan.us/smartcard"
15
15
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Smartcard", "--main", "README"]
16
16
  s.require_paths = ["lib"]
17
- s.rubyforge_project = %q{smartcard}
18
- s.rubygems_version = %q{1.7.2}
19
- s.summary = %q{Interface with ISO 7816 smart cards.}
20
- s.test_files = ["test/gp/asn1_ber_test.rb", "test/gp/cap_loader_test.rb", "test/gp/des_test.rb", "test/gp/gp_card_mixin_compat_test.rb", "test/gp/gp_card_mixin_test.rb", "test/iso/auto_configurator_test.rb", "test/iso/iso_card_mixin_test.rb", "test/iso/iso_exception_test.rb", "test/iso/jcop_remote_test.rb", "test/pcsc/card_test.rb", "test/pcsc/context_test.rb", "test/pcsc/reader_state_queries_test.rb"]
17
+ s.rubyforge_project = "smartcard"
18
+ s.rubygems_version = "1.8.15"
19
+ s.summary = "Interface with ISO 7816 smart cards."
20
+ s.test_files = ["test/gp/asn1_ber_test.rb", "test/gp/cap_loader_test.rb", "test/gp/des_test.rb", "test/gp/gp_card_mixin_compat_test.rb", "test/gp/gp_card_mixin_test.rb", "test/iso/auto_configurator_test.rb", "test/iso/iso_card_mixin_test.rb", "test/iso/iso_exception_test.rb", "test/iso/jcop_remote_test.rb", "test/pcsc/card_test.rb", "test/pcsc/context_test.rb", "test/pcsc/exception_test.rb", "test/pcsc/reader_state_queries_test.rb"]
21
21
 
22
22
  if s.respond_to? :specification_version then
23
23
  s.specification_version = 3
@@ -7,7 +7,6 @@ require 'smartcard'
7
7
 
8
8
  require 'test/unit'
9
9
 
10
- require 'rubygems'
11
10
  require 'flexmock/test_unit'
12
11
 
13
12
 
@@ -0,0 +1,30 @@
1
+ # Author:: Victor Costan
2
+ # Copyright:: Copyright (C) 2008 Massachusetts Institute of Technology
3
+ # License:: MIT
4
+
5
+
6
+ require 'rubygems'
7
+ require 'smartcard'
8
+
9
+ require 'test/unit'
10
+
11
+
12
+ class ExceptionTest < Test::Unit::TestCase
13
+ def test_exception_with_known_status
14
+ status = 0x8010002E
15
+ win32_status = status - 2 ** 32
16
+
17
+ exception = Smartcard::PCSC::Exception.new win32_status
18
+ assert_equal status, exception.pcsc_status_code
19
+ assert_equal :no_readers_available, exception.pcsc_status
20
+ end
21
+
22
+ def test_exception_with_bogus_status
23
+ status = 0x88888888
24
+ win32_status = status - 2 ** 32
25
+
26
+ exception = Smartcard::PCSC::Exception.new win32_status
27
+ assert_equal status, exception.pcsc_status_code
28
+ assert_nil exception.pcsc_status
29
+ end
30
+ end
@@ -51,6 +51,16 @@ class ReaderStatesTest < Test::Unit::TestCase
51
51
  'event_state'
52
52
  end
53
53
 
54
+ def test_high_order_bits_in_states
55
+ packed_state = 0xFFFFFFFF
56
+ unpacked_state = Smartcard::PCSC::FFILib::ReaderStateQuery.
57
+ unpack_state packed_state
58
+ repacked_state = Smartcard::PCSC::FFILib::ReaderStateQuery.
59
+ pack_state unpacked_state
60
+ assert_equal repacked_state, packed_state
61
+ assert_operator unpacked_state, :include?, :atrmatch
62
+ end
63
+
54
64
  def test_reader_names
55
65
  assert_equal 'PC/SC Reader 0', @queries[0].reader_name
56
66
  assert_equal 'CCID Reader 1', @queries[1].reader_name
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smartcard
3
3
  version: !ruby/object:Gem::Version
4
- hash: 13
4
+ hash: 3
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 5
9
- - 3
10
- version: 0.5.3
9
+ - 4
10
+ version: 0.5.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Victor Costan
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-04-21 00:00:00 Z
18
+ date: 2012-02-09 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: ffi
@@ -122,11 +122,11 @@ extra_rdoc_files:
122
122
  - lib/smartcard/iso/transport.rb
123
123
  - lib/smartcard/pcsc/card.rb
124
124
  - lib/smartcard/pcsc/context.rb
125
+ - lib/smartcard/pcsc/exception.rb
125
126
  - lib/smartcard/pcsc/ffi_autogen.rb
126
127
  - lib/smartcard/pcsc/ffi_functions.rb
127
128
  - lib/smartcard/pcsc/ffi_lib.rb
128
129
  - lib/smartcard/pcsc/ffi_structs.rb
129
- - lib/smartcard/pcsc/pcsc_exception.rb
130
130
  - lib/smartcard/pcsc/reader_state_queries.rb
131
131
  - tasks/ffi_codegen.rb
132
132
  files:
@@ -151,11 +151,11 @@ files:
151
151
  - lib/smartcard/iso/transport.rb
152
152
  - lib/smartcard/pcsc/card.rb
153
153
  - lib/smartcard/pcsc/context.rb
154
+ - lib/smartcard/pcsc/exception.rb
154
155
  - lib/smartcard/pcsc/ffi_autogen.rb
155
156
  - lib/smartcard/pcsc/ffi_functions.rb
156
157
  - lib/smartcard/pcsc/ffi_lib.rb
157
158
  - lib/smartcard/pcsc/ffi_structs.rb
158
- - lib/smartcard/pcsc/pcsc_exception.rb
159
159
  - lib/smartcard/pcsc/reader_state_queries.rb
160
160
  - tasks/ffi_codegen.rb
161
161
  - test/gp/asn1_ber_test.rb
@@ -171,6 +171,7 @@ files:
171
171
  - test/iso/jcop_remote_test.rb
172
172
  - test/pcsc/card_test.rb
173
173
  - test/pcsc/context_test.rb
174
+ - test/pcsc/exception_test.rb
174
175
  - test/pcsc/reader_state_queries_test.rb
175
176
  - smartcard.gemspec
176
177
  homepage: http://www.costan.us/smartcard
@@ -208,7 +209,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
208
209
  requirements: []
209
210
 
210
211
  rubyforge_project: smartcard
211
- rubygems_version: 1.7.2
212
+ rubygems_version: 1.8.15
212
213
  signing_key:
213
214
  specification_version: 3
214
215
  summary: Interface with ISO 7816 smart cards.
@@ -224,4 +225,5 @@ test_files:
224
225
  - test/iso/jcop_remote_test.rb
225
226
  - test/pcsc/card_test.rb
226
227
  - test/pcsc/context_test.rb
228
+ - test/pcsc/exception_test.rb
227
229
  - test/pcsc/reader_state_queries_test.rb
@@ -1,10 +0,0 @@
1
- # Contains information about an exception at the PC/SC layer.
2
- class Smartcard::PCSC::Exception < RuntimeError
3
- def initialize(error_status)
4
- @pcsc_status = error_status
5
- super '0x%x' % (2**32 + error_status)
6
- end
7
-
8
- # The PC/SC error status that caused this error.
9
- attr_reader :pcsc_status
10
- end