smartcard 0.2.3 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +11 -7
- data/Manifest +23 -20
- data/ext/smartcard_pcsc/extconf.rb +14 -1
- data/ext/smartcard_pcsc/pcsc.h +6 -1
- data/ext/smartcard_pcsc/pcsc_card.c +10 -10
- data/ext/smartcard_pcsc/pcsc_context.c +8 -8
- data/ext/smartcard_pcsc/pcsc_exception.c +39 -0
- data/ext/smartcard_pcsc/pcsc_io_request.c +1 -1
- data/ext/smartcard_pcsc/pcsc_main.c +1 -0
- data/ext/smartcard_pcsc/pcsc_multi_strings.c +0 -12
- data/lib/smartcard/pcsc_exception.rb +5 -0
- data/smartcard.gemspec +10 -9
- data/test/test_containers.rb +53 -0
- data/test/test_smoke.rb +22 -0
- data/tests/ts_pcsc_ext.rb +1 -71
- metadata +36 -9
- data/test/test_all.rb +0 -0
data/CHANGELOG
CHANGED
@@ -1,25 +1,29 @@
|
|
1
|
-
v0.
|
1
|
+
v0.3.1. Fixed documentation for the new PcscException class.
|
2
2
|
|
3
|
-
v0.
|
3
|
+
v0.3.0. Added PcscException class used to wrap PC/SC exceptions.
|
4
|
+
|
5
|
+
v0.2.3. Fixed minor bug in error string for PCSC::Card.transmit
|
6
|
+
|
7
|
+
v0.2.2. Fixed APDU exchange bugs on Windows
|
4
8
|
Restructured PCSC::IoRequest to allow PCI_ consts
|
5
9
|
Added PCI_ consts
|
6
10
|
Changed test suite to reflect proper way to do transmits
|
7
11
|
|
8
|
-
v0.2.1 Added OSX Tiger support
|
12
|
+
v0.2.1. Added OSX Tiger support
|
9
13
|
Many workarounds for Tiger's buggy/incomplete PC/SC.
|
10
14
|
Small bugfixes for PC/SC status constants.
|
11
15
|
|
12
|
-
v0.2.0 Added automatic builds
|
16
|
+
v0.2.0. Added automatic builds
|
13
17
|
Rakefile for auto builds using echoe
|
14
18
|
extconf.rb: hack to fix Windows makefiles
|
15
19
|
|
16
|
-
v0.1.2 Added Windows compatibility
|
20
|
+
v0.1.2. Added Windows compatibility
|
17
21
|
*.c: restructured code so VC2005 likes it
|
18
22
|
(variable declarations before function body)
|
19
23
|
docs: license, readme, and what the gem is
|
20
24
|
|
21
|
-
v0.1.1 Added support for Ubuntu 7.10
|
25
|
+
v0.1.1. Added support for Ubuntu 7.10
|
22
26
|
ext/smartcard_pcsc/extconf.rb: better header
|
23
27
|
detection
|
24
28
|
|
25
|
-
v0.1.0 Initial release for OSX Leopard
|
29
|
+
v0.1.0. Initial release for OSX Leopard
|
data/Manifest
CHANGED
@@ -1,20 +1,23 @@
|
|
1
|
-
BUILD
|
2
|
-
CHANGELOG
|
3
|
-
ext/smartcard_pcsc/extconf.rb
|
4
|
-
ext/smartcard_pcsc/pcsc.h
|
5
|
-
ext/smartcard_pcsc/pcsc_card.c
|
6
|
-
ext/smartcard_pcsc/pcsc_constants.c
|
7
|
-
ext/smartcard_pcsc/pcsc_context.c
|
8
|
-
ext/smartcard_pcsc/
|
9
|
-
ext/smartcard_pcsc/
|
10
|
-
ext/smartcard_pcsc/
|
11
|
-
ext/smartcard_pcsc/
|
12
|
-
ext/smartcard_pcsc/
|
13
|
-
ext/smartcard_pcsc/
|
14
|
-
ext/smartcard_pcsc/
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
1
|
+
BUILD
|
2
|
+
CHANGELOG
|
3
|
+
ext/smartcard_pcsc/extconf.rb
|
4
|
+
ext/smartcard_pcsc/pcsc.h
|
5
|
+
ext/smartcard_pcsc/pcsc_card.c
|
6
|
+
ext/smartcard_pcsc/pcsc_constants.c
|
7
|
+
ext/smartcard_pcsc/pcsc_context.c
|
8
|
+
ext/smartcard_pcsc/pcsc_exception.c
|
9
|
+
ext/smartcard_pcsc/pcsc_io_request.c
|
10
|
+
ext/smartcard_pcsc/pcsc_main.c
|
11
|
+
ext/smartcard_pcsc/pcsc_multi_strings.c
|
12
|
+
ext/smartcard_pcsc/pcsc_namespace.c
|
13
|
+
ext/smartcard_pcsc/pcsc_reader_states.c
|
14
|
+
ext/smartcard_pcsc/pcsc_surrogate_reader.h
|
15
|
+
ext/smartcard_pcsc/pcsc_surrogate_wintypes.h
|
16
|
+
lib/smartcard/pcsc_exception.rb
|
17
|
+
lib/smartcard.rb
|
18
|
+
LICENSE
|
19
|
+
Manifest
|
20
|
+
README
|
21
|
+
test/test_containers.rb
|
22
|
+
test/test_smoke.rb
|
23
|
+
tests/ts_pcsc_ext.rb
|
@@ -12,9 +12,11 @@ if RUBY_PLATFORM =~ /darwin/
|
|
12
12
|
pcsc_defines.push 'RB_SMARTCARD_OSX_TIGER_HACK'
|
13
13
|
end
|
14
14
|
elsif RUBY_PLATFORM =~ /win/
|
15
|
+
|
15
16
|
have_library('winscard')
|
17
|
+
pcsc_defines << 'PCSC_SURROGATE_SCARD_IS_VALID_CONTEXT' unless have_library('winscard', 'SCardIsValidContext')
|
16
18
|
else
|
17
|
-
#
|
19
|
+
# pcsclite is retarded and uses stuff like '#include <wintypes.h>'
|
18
20
|
$CFLAGS += ' -I /usr/include/PCSC -I /usr/local/include/PCSC'
|
19
21
|
have_library('pcsclite')
|
20
22
|
end
|
@@ -37,6 +39,17 @@ end
|
|
37
39
|
create_makefile('smartcard/pcsc')
|
38
40
|
|
39
41
|
def win32_hack(mf_name)
|
42
|
+
# get the version of MSVC
|
43
|
+
Kernel.system `cl 2> msvc_version.txt`
|
44
|
+
msvc_logo = File.open('msvc_version.txt') { |f| f.read }
|
45
|
+
print msvc_logo
|
46
|
+
File.delete 'msvc_version.txt'
|
47
|
+
if msvc_logo =~ /Optimizing Compiler Version (\d+)/
|
48
|
+
msvc_ver = $1.to_i
|
49
|
+
# for MSVC 6.0, no manifest BS is needed -- straight-up compilation is good
|
50
|
+
return if msvc_ver == 12
|
51
|
+
end
|
52
|
+
|
40
53
|
# evil, evil, evil -- hack the makefile to embed the manifest in the extension dll
|
41
54
|
make_contents = File.open(mf_name, 'r') { |f| f.read }
|
42
55
|
make_rules = make_contents.split(/(\n|\r)(\n|\r)+/)
|
data/ext/smartcard_pcsc/pcsc.h
CHANGED
@@ -19,7 +19,7 @@ int _PCSC_ReaderStates_lowlevel_get(VALUE rbReaderStates, SCARD_READERSTATE **re
|
|
19
19
|
extern VALUE cPcscIoRequest;
|
20
20
|
void Init_PCSC_IoRequest();
|
21
21
|
int _PCSC_IoRequest_lowlevel_get(VALUE rbIoRequest, SCARD_IO_REQUEST **io_request);
|
22
|
-
VALUE _PCSC_IoRequest_lowlevel_new(SCARD_IO_REQUEST *io_request);
|
22
|
+
VALUE _PCSC_IoRequest_lowlevel_new(const SCARD_IO_REQUEST *io_request);
|
23
23
|
|
24
24
|
/* Class Smartcard::PCSC::Context */
|
25
25
|
extern VALUE cPcscContext;
|
@@ -31,6 +31,11 @@ extern VALUE cPcscCard;
|
|
31
31
|
void Init_PCSC_Card();
|
32
32
|
int _PCSC_Card_lowlevel_get(VALUE rbCard, SCARDHANDLE *card_handle);
|
33
33
|
|
34
|
+
/* Class Smartcard::PCSC::Exception */
|
35
|
+
extern VALUE ePcscException;
|
36
|
+
void Init_PCSC_Exception();
|
37
|
+
void _PCSC_Exception_raise(DWORD pcsc_error, char *pcsc_function);
|
38
|
+
|
34
39
|
/* Constants in Smartcard::PCSC */
|
35
40
|
void Init_PCSC_Consts();
|
36
41
|
|
@@ -65,7 +65,7 @@ static VALUE PCSC_Card_initialize(VALUE self, VALUE rbContext, VALUE rbReaderNam
|
|
65
65
|
|
66
66
|
card->pcsc_error = SCardConnect(context, RSTRING(rbFinalReaderName)->ptr, share_mode, preferred_protocols, &card->card_handle, &active_protocol);
|
67
67
|
if(card->pcsc_error != SCARD_S_SUCCESS)
|
68
|
-
|
68
|
+
_PCSC_Exception_raise(card->pcsc_error, "SCardConnect");
|
69
69
|
else
|
70
70
|
card->released = 0;
|
71
71
|
return self;
|
@@ -95,7 +95,7 @@ static VALUE PCSC_Card_reconnect(VALUE self, VALUE rbShareMode, VALUE rbPreferre
|
|
95
95
|
|
96
96
|
card->pcsc_error = SCardReconnect(card->card_handle, share_mode, preferred_protocols, initialization, &active_protocol);
|
97
97
|
if(card->pcsc_error != SCARD_S_SUCCESS)
|
98
|
-
|
98
|
+
_PCSC_Exception_raise(card->pcsc_error, "SCardReconnect");
|
99
99
|
|
100
100
|
return self;
|
101
101
|
}
|
@@ -121,7 +121,7 @@ static VALUE PCSC_Card_disconnect(VALUE self, VALUE rbDisposition) {
|
|
121
121
|
card->pcsc_error = SCardDisconnect(card->card_handle, disposition);
|
122
122
|
card->released = 1;
|
123
123
|
if(card->pcsc_error != SCARD_S_SUCCESS)
|
124
|
-
|
124
|
+
_PCSC_Exception_raise(card->pcsc_error, "SCardDisconnect");
|
125
125
|
}
|
126
126
|
return self;
|
127
127
|
}
|
@@ -141,7 +141,7 @@ static VALUE PCSC_Card_begin_transaction(VALUE self) {
|
|
141
141
|
|
142
142
|
card->pcsc_error = SCardBeginTransaction(card->card_handle);
|
143
143
|
if(card->pcsc_error != SCARD_S_SUCCESS)
|
144
|
-
|
144
|
+
_PCSC_Exception_raise(card->pcsc_error, "SCardBeginTransaction");
|
145
145
|
return self;
|
146
146
|
}
|
147
147
|
|
@@ -164,7 +164,7 @@ static VALUE PCSC_Card_end_transaction(VALUE self, VALUE rbDisposition) {
|
|
164
164
|
disposition = NUM2UINT(rbDisposition);
|
165
165
|
card->pcsc_error = SCardEndTransaction(card->card_handle, disposition);
|
166
166
|
if(card->pcsc_error != SCARD_S_SUCCESS)
|
167
|
-
|
167
|
+
_PCSC_Exception_raise(card->pcsc_error, "SCardEndTransaction");
|
168
168
|
return self;
|
169
169
|
}
|
170
170
|
|
@@ -209,7 +209,7 @@ static VALUE PCSC_Card_get_attribute(VALUE self, VALUE rbAttributeId) {
|
|
209
209
|
}
|
210
210
|
}
|
211
211
|
if(card->pcsc_error != SCARD_S_SUCCESS)
|
212
|
-
|
212
|
+
_PCSC_Exception_raise(card->pcsc_error, "SCardGetAttrib");
|
213
213
|
#endif
|
214
214
|
return Qnil;
|
215
215
|
}
|
@@ -248,7 +248,7 @@ static VALUE PCSC_Card_set_attribute(VALUE self, VALUE rbAttributeId, VALUE rbAt
|
|
248
248
|
#else
|
249
249
|
card->pcsc_error = SCardSetAttrib(card->card_handle, attribute_id, (LPSTR)RSTRING(rbFinalAttributeValue)->ptr, RSTRING(rbFinalAttributeValue)->len);
|
250
250
|
if(card->pcsc_error != SCARD_S_SUCCESS)
|
251
|
-
|
251
|
+
_PCSC_Exception_raise(card->pcsc_error, "SCardSetAttrib");
|
252
252
|
#endif
|
253
253
|
return self;
|
254
254
|
}
|
@@ -306,7 +306,7 @@ static VALUE PCSC_Card_transmit(VALUE self, VALUE rbSendData, VALUE rbSendIoRequ
|
|
306
306
|
recv_io_request, (LPSTR)recv_buffer, &recv_length);
|
307
307
|
if(card->pcsc_error != SCARD_S_SUCCESS) {
|
308
308
|
xfree(recv_buffer);
|
309
|
-
|
309
|
+
_PCSC_Exception_raise(card->pcsc_error, "SCardTransmit");
|
310
310
|
return Qnil;
|
311
311
|
}
|
312
312
|
|
@@ -366,7 +366,7 @@ static VALUE PCSC_Card_control(VALUE self, VALUE rbControlCode, VALUE rbSendData
|
|
366
366
|
#endif
|
367
367
|
if(card->pcsc_error != SCARD_S_SUCCESS) {
|
368
368
|
xfree(recv_buffer);
|
369
|
-
|
369
|
+
_PCSC_Exception_raise(card->pcsc_error, "SCardControl");
|
370
370
|
return Qnil;
|
371
371
|
}
|
372
372
|
|
@@ -412,7 +412,7 @@ static VALUE PCSC_Card_status(VALUE self) {
|
|
412
412
|
card->pcsc_error = SCardStatus(card->card_handle, reader_names_buffer, &reader_names_length, &state, &protocol, (LPSTR)atr_buffer, &atr_length);
|
413
413
|
if(card->pcsc_error != SCARD_S_SUCCESS) {
|
414
414
|
xfree(reader_names_buffer); xfree(atr_buffer);
|
415
|
-
|
415
|
+
_PCSC_Exception_raise(card->pcsc_error, "SCardStatus");
|
416
416
|
return Qnil;
|
417
417
|
}
|
418
418
|
|
@@ -45,7 +45,7 @@ static VALUE PCSC_Context_initialize(VALUE self, VALUE scope) {
|
|
45
45
|
|
46
46
|
context->pcsc_error = SCardEstablishContext(NUM2INT(scope), NULL, NULL, &context->pcsc_context);
|
47
47
|
if(context->pcsc_error != SCARD_S_SUCCESS)
|
48
|
-
|
48
|
+
_PCSC_Exception_raise(context->pcsc_error, "SCardEstablishContext");
|
49
49
|
else
|
50
50
|
context->released = 0;
|
51
51
|
return self;
|
@@ -69,7 +69,7 @@ static VALUE PCSC_Context_release(VALUE self) {
|
|
69
69
|
context->pcsc_error = SCardReleaseContext(context->pcsc_context);
|
70
70
|
context->released = 1;
|
71
71
|
if(context->pcsc_error != SCARD_S_SUCCESS)
|
72
|
-
|
72
|
+
_PCSC_Exception_raise(context->pcsc_error, "SCardReleaseContext");
|
73
73
|
}
|
74
74
|
return self;
|
75
75
|
}
|
@@ -89,7 +89,7 @@ static VALUE PCSC_Context_is_valid(VALUE self) {
|
|
89
89
|
Data_Get_Struct(self, struct SCardContextEx, context);
|
90
90
|
if(context == NULL) return self;
|
91
91
|
|
92
|
-
#if defined(RB_SMARTCARD_OSX_TIGER_HACK)
|
92
|
+
#if defined(RB_SMARTCARD_OSX_TIGER_HACK) || defined(PCSC_SURROGATE_SCARD_IS_VALID_CONTEXT)
|
93
93
|
return Qtrue;
|
94
94
|
#else
|
95
95
|
context->pcsc_error = SCardIsValidContext(context->pcsc_context);
|
@@ -130,7 +130,7 @@ static VALUE PCSC_Context_list_reader_groups(VALUE self) {
|
|
130
130
|
}
|
131
131
|
}
|
132
132
|
if(context->pcsc_error != SCARD_S_SUCCESS)
|
133
|
-
|
133
|
+
_PCSC_Exception_raise(context->pcsc_error, "SCardListReaderGroups");
|
134
134
|
return Qnil;
|
135
135
|
}
|
136
136
|
|
@@ -176,8 +176,8 @@ static VALUE PCSC_Context_list_readers(VALUE self, VALUE rbGroups) {
|
|
176
176
|
}
|
177
177
|
if(groups != NULL) xfree(groups);
|
178
178
|
if(context->pcsc_error != SCARD_S_SUCCESS)
|
179
|
-
|
180
|
-
return Qnil;
|
179
|
+
_PCSC_Exception_raise(context->pcsc_error, "SCardListReaders");
|
180
|
+
return Qnil;
|
181
181
|
}
|
182
182
|
|
183
183
|
/* :Document-method: cancel
|
@@ -195,7 +195,7 @@ static VALUE PCSC_Context_cancel(VALUE self) {
|
|
195
195
|
|
196
196
|
context->pcsc_error = SCardCancel(context->pcsc_context);
|
197
197
|
if(context->pcsc_error != SCARD_S_SUCCESS)
|
198
|
-
|
198
|
+
_PCSC_Exception_raise(context->pcsc_error, "SCardCancel");
|
199
199
|
return self;
|
200
200
|
}
|
201
201
|
|
@@ -232,7 +232,7 @@ static VALUE PCSC_Context_get_status_change(VALUE self, VALUE rbReaderStates, VA
|
|
232
232
|
else {
|
233
233
|
context->pcsc_error = SCardGetStatusChange(context->pcsc_context, timeout, reader_states, reader_states_count);
|
234
234
|
if(context->pcsc_error != SCARD_S_SUCCESS)
|
235
|
-
|
235
|
+
_PCSC_Exception_raise(context->pcsc_error, "SCardGetStatusChange");
|
236
236
|
}
|
237
237
|
return self;
|
238
238
|
}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
#include "pcsc.h"
|
2
|
+
|
3
|
+
VALUE ePcscException;
|
4
|
+
|
5
|
+
#if defined(WIN32)
|
6
|
+
static char scard_error_buffer[128];
|
7
|
+
|
8
|
+
/* Produces a string for an error code yielded by the SCard* PC/SC functions. Returns a static global buffer. */
|
9
|
+
static char *pcsc_stringify_error(DWORD scard_error) {
|
10
|
+
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
|
11
|
+
NULL, scard_error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
12
|
+
scard_error_buffer, sizeof(scard_error_buffer), NULL );
|
13
|
+
return scard_error_buffer;
|
14
|
+
}
|
15
|
+
#endif
|
16
|
+
|
17
|
+
|
18
|
+
#ifdef MAKE_RDOC_HAPPY
|
19
|
+
mSmartcard = rb_define_module("Smartcard");
|
20
|
+
mPcsc = rb_define_module_under(mSmartcard, "PCSC");
|
21
|
+
#endif
|
22
|
+
|
23
|
+
/* :Document-class: Smartcard::PCSC::Exception
|
24
|
+
* Contains information about an exception at the PC/SC layer.
|
25
|
+
*/
|
26
|
+
void Init_PCSC_Exception() {
|
27
|
+
ePcscException = rb_define_class_under(mPcsc, "PcscException", rb_eRuntimeError);
|
28
|
+
}
|
29
|
+
|
30
|
+
/* Raises a PC/SC error. */
|
31
|
+
void _PCSC_Exception_raise(DWORD pcsc_error, char *pcsc_function) {
|
32
|
+
char buf[BUFSIZ];
|
33
|
+
VALUE exception;
|
34
|
+
|
35
|
+
sprintf(buf, "%s: %s", pcsc_function, pcsc_stringify_error(pcsc_error));
|
36
|
+
exception = rb_exc_new2(ePcscException, buf);
|
37
|
+
rb_iv_set(exception, "@errno", INT2NUM(pcsc_error));
|
38
|
+
rb_exc_raise(exception);
|
39
|
+
}
|
@@ -119,7 +119,7 @@ int _PCSC_IoRequest_lowlevel_get(VALUE rbIoRequest, SCARD_IO_REQUEST **io_reques
|
|
119
119
|
}
|
120
120
|
|
121
121
|
/* Creates a Smartcard::PCSC::IoRequest instance wrapping a given SCARD_IO_REQUEST. */
|
122
|
-
VALUE _PCSC_IoRequest_lowlevel_new(SCARD_IO_REQUEST *io_request) {
|
122
|
+
VALUE _PCSC_IoRequest_lowlevel_new(const SCARD_IO_REQUEST *io_request) {
|
123
123
|
struct SCardIoRequestEx *request;
|
124
124
|
|
125
125
|
VALUE rbIoRequest = Data_Make_Struct(cPcscIoRequest, struct SCardIoRequestEx, NULL, PCSC_IoRequest_free, request);
|
@@ -68,15 +68,3 @@ int PCSC_Internal_ruby_strings_to_multistring(VALUE rbStrings, char **strings) {
|
|
68
68
|
|
69
69
|
return 0;
|
70
70
|
}
|
71
|
-
|
72
|
-
#if defined(WIN32)
|
73
|
-
char scard_error_buffer[128];
|
74
|
-
|
75
|
-
/* Produces a string for an error code yielded by the SCard* PC/SC functions. Returns a static global buffer. */
|
76
|
-
char *pcsc_stringify_error(DWORD scard_error) {
|
77
|
-
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
|
78
|
-
NULL, scard_error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
79
|
-
scard_error_buffer, sizeof(scard_error_buffer), NULL );
|
80
|
-
return scard_error_buffer;
|
81
|
-
}
|
82
|
-
#endif
|
data/smartcard.gemspec
CHANGED
@@ -1,27 +1,29 @@
|
|
1
1
|
|
2
|
-
# Gem::Specification for Smartcard-0.
|
2
|
+
# Gem::Specification for Smartcard-0.3.1
|
3
3
|
# Originally generated by Echoe
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = %q{smartcard}
|
7
|
-
s.version = "0.
|
7
|
+
s.version = "0.3.1"
|
8
8
|
|
9
9
|
s.specification_version = 2 if s.respond_to? :specification_version=
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.authors = ["Victor Costan"]
|
13
|
-
s.date = %q{2008-01
|
13
|
+
s.date = %q{2008-05-01}
|
14
14
|
s.description = %q{Interface with ISO 7816 smart cards.}
|
15
15
|
s.email = %q{victor@costan.us}
|
16
16
|
s.extensions = ["ext/smartcard_pcsc/extconf.rb"]
|
17
|
-
s.
|
17
|
+
s.extra_rdoc_files = ["BUILD", "CHANGELOG", "ext/smartcard_pcsc/extconf.rb", "ext/smartcard_pcsc/pcsc.h", "ext/smartcard_pcsc/pcsc_card.c", "ext/smartcard_pcsc/pcsc_constants.c", "ext/smartcard_pcsc/pcsc_context.c", "ext/smartcard_pcsc/pcsc_exception.c", "ext/smartcard_pcsc/pcsc_io_request.c", "ext/smartcard_pcsc/pcsc_main.c", "ext/smartcard_pcsc/pcsc_multi_strings.c", "ext/smartcard_pcsc/pcsc_namespace.c", "ext/smartcard_pcsc/pcsc_reader_states.c", "ext/smartcard_pcsc/pcsc_surrogate_reader.h", "ext/smartcard_pcsc/pcsc_surrogate_wintypes.h", "lib/smartcard/pcsc_exception.rb", "lib/smartcard.rb", "LICENSE", "README"]
|
18
|
+
s.files = ["BUILD", "CHANGELOG", "ext/smartcard_pcsc/extconf.rb", "ext/smartcard_pcsc/pcsc.h", "ext/smartcard_pcsc/pcsc_card.c", "ext/smartcard_pcsc/pcsc_constants.c", "ext/smartcard_pcsc/pcsc_context.c", "ext/smartcard_pcsc/pcsc_exception.c", "ext/smartcard_pcsc/pcsc_io_request.c", "ext/smartcard_pcsc/pcsc_main.c", "ext/smartcard_pcsc/pcsc_multi_strings.c", "ext/smartcard_pcsc/pcsc_namespace.c", "ext/smartcard_pcsc/pcsc_reader_states.c", "ext/smartcard_pcsc/pcsc_surrogate_reader.h", "ext/smartcard_pcsc/pcsc_surrogate_wintypes.h", "lib/smartcard/pcsc_exception.rb", "lib/smartcard.rb", "LICENSE", "Manifest", "README", "test/test_containers.rb", "test/test_smoke.rb", "tests/ts_pcsc_ext.rb", "smartcard.gemspec"]
|
18
19
|
s.has_rdoc = true
|
19
20
|
s.homepage = %q{http://www.costan.us/smartcard}
|
21
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Smartcard", "--main", "README"]
|
20
22
|
s.require_paths = ["lib", "ext"]
|
21
23
|
s.rubyforge_project = %q{smartcard}
|
22
|
-
s.rubygems_version = %q{1.
|
24
|
+
s.rubygems_version = %q{1.1.1}
|
23
25
|
s.summary = %q{Interface with ISO 7816 smart cards.}
|
24
|
-
s.test_files = ["test/
|
26
|
+
s.test_files = ["test/test_containers.rb", "test/test_smoke.rb"]
|
25
27
|
end
|
26
28
|
|
27
29
|
|
@@ -44,10 +46,9 @@ end
|
|
44
46
|
# p.rdoc_pattern = /^(lib|bin|tasks|ext)|^BUILD|^README|^CHANGELOG|^TODO|^LICENSE|^COPYING$/
|
45
47
|
#
|
46
48
|
# p.eval = proc do |p|
|
47
|
-
#
|
48
|
-
# when /mswin/
|
49
|
+
# if Platform.windows?
|
49
50
|
# p.files += ['lib/smartcard/pcsc.so']
|
50
|
-
# p.platform = Gem::Platform::
|
51
|
+
# p.platform = Gem::Platform::CURRENT
|
51
52
|
#
|
52
53
|
# # take out the extension info from the gemspec
|
53
54
|
# task :postcompile_hacks => [:compile] do
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'smartcard'
|
3
|
+
|
4
|
+
class ContainersTest < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
|
7
|
+
end
|
8
|
+
|
9
|
+
def teardown
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
# tests the SmartCard::PCSC::ReaderStates container
|
14
|
+
def test_reader_states
|
15
|
+
reader_states = Smartcard::PCSC::ReaderStates.new(2)
|
16
|
+
reader_states.set_current_state_of!(1, Smartcard::PCSC::STATE_ATRMATCH)
|
17
|
+
reader_states.set_current_state_of!(0, Smartcard::PCSC::STATE_CHANGED)
|
18
|
+
reader_states.set_event_state_of!(0, Smartcard::PCSC::STATE_IGNORE)
|
19
|
+
reader_states.set_event_state_of!(1, Smartcard::PCSC::STATE_PRESENT)
|
20
|
+
reader_states.set_atr_of!(1, "Ruby\0rocks!")
|
21
|
+
reader_states.set_atr_of!(0, "grreat success")
|
22
|
+
reader_states.set_reader_name_of!(0, "PC/SC Reader 0")
|
23
|
+
reader_states.set_reader_name_of!(1, "CCID Reader 1")
|
24
|
+
|
25
|
+
assert_equal Smartcard::PCSC::STATE_ATRMATCH, reader_states.current_state_of(1), 'ReaderStates.set_current_state_of! / current_state_of mismatch'
|
26
|
+
assert_equal Smartcard::PCSC::STATE_CHANGED, reader_states.current_state_of(0), 'ReaderStates.set_current_state_of! / current_state_of mismatch'
|
27
|
+
|
28
|
+
assert_equal Smartcard::PCSC::STATE_IGNORE, reader_states.event_state_of(0), 'ReaderStates.set_event_state_of! / event_state_of mismatch'
|
29
|
+
assert_equal Smartcard::PCSC::STATE_PRESENT, reader_states.event_state_of(1), 'ReaderStates.set_event_state_of! / event_state_of mismatch'
|
30
|
+
|
31
|
+
assert_equal "Ruby\0rocks!", reader_states.atr_of(1), 'ReaderStates.set_atr_of! / atr_of mismatch'
|
32
|
+
assert_equal "grreat success", reader_states.atr_of(0), 'ReaderStates.set_atr_of! / atr_of mismatch'
|
33
|
+
|
34
|
+
assert_equal "PC/SC Reader 0", reader_states.reader_name_of(0)
|
35
|
+
assert_equal "CCID Reader 1", reader_states.reader_name_of(1)
|
36
|
+
|
37
|
+
[[5, IndexError], [2, IndexError], [nil, TypeError]].each do |bad_index_test|
|
38
|
+
assert_raise bad_index_test[1] do
|
39
|
+
reader_states.current_state_of(bad_index_test[0])
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# tests the SmartCard::PCSC::IoRequest container
|
45
|
+
def test_io_request
|
46
|
+
io_request = Smartcard::PCSC::IoRequest.new
|
47
|
+
[Smartcard::PCSC::PROTOCOL_T0, Smartcard::PCSC::PROTOCOL_T1, Smartcard::PCSC::PROTOCOL_RAW].each do |t_protocol|
|
48
|
+
io_request.protocol = t_protocol
|
49
|
+
r_protocol = io_request.protocol
|
50
|
+
assert_equal r_protocol, t_protocol, 'IoRequest.protocol= / protocol mismatch'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/test/test_smoke.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'smartcard'
|
3
|
+
|
4
|
+
class SmokeTest < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
end
|
7
|
+
|
8
|
+
def teardown
|
9
|
+
end
|
10
|
+
|
11
|
+
# smoke-test to ensure that the extension loads and can call into the PC/SC library
|
12
|
+
def test_smoke
|
13
|
+
context = Smartcard::PCSC::Context.new(Smartcard::PCSC::SCOPE_SYSTEM)
|
14
|
+
|
15
|
+
reader_groups = context.list_reader_groups
|
16
|
+
readers1 = context.list_readers reader_groups
|
17
|
+
readers2 = context.list_readers reader_groups.first
|
18
|
+
readers3 = context.list_readers nil
|
19
|
+
|
20
|
+
context.release
|
21
|
+
end
|
22
|
+
end
|
data/tests/ts_pcsc_ext.rb
CHANGED
@@ -1,77 +1,7 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
gem 'smartcard', '>= 0.2.1'
|
3
1
|
require 'smartcard'
|
4
2
|
require 'pp'
|
5
3
|
|
6
|
-
|
7
|
-
reader_states = Smartcard::PCSC::ReaderStates.new(2)
|
8
|
-
reader_states.set_current_state_of!(1, Smartcard::PCSC::STATE_ATRMATCH)
|
9
|
-
reader_states.set_current_state_of!(0, Smartcard::PCSC::STATE_CHANGED)
|
10
|
-
reader_states.set_event_state_of!(0, Smartcard::PCSC::STATE_IGNORE)
|
11
|
-
reader_states.set_event_state_of!(1, Smartcard::PCSC::STATE_PRESENT)
|
12
|
-
reader_states.set_atr_of!(1, "Ruby\0rocks!")
|
13
|
-
reader_states.set_atr_of!(0, "grreat success")
|
14
|
-
reader_states.set_reader_name_of!(0, "PC/SC Reader 0")
|
15
|
-
reader_states.set_reader_name_of!(1, "CCID Reader 1")
|
16
|
-
|
17
|
-
test_state1, test_state0 = reader_states.current_state_of(1), reader_states.current_state_of(0)
|
18
|
-
if (test_state1 != Smartcard::PCSC::STATE_ATRMATCH) or (test_state0 != Smartcard::PCSC::STATE_CHANGED)
|
19
|
-
puts "FAILED: ReaderStates.set_current_state_of! / current_state_of returned #{test_state1},#{test_state0} instead of #{Smartcard::PCSC::STATE_ATRMATCH},#{Smartcard::PCSC::STATE_CHANGED}\n"
|
20
|
-
return false
|
21
|
-
end
|
22
|
-
test_state0, test_state1 = reader_states.event_state_of(0), reader_states.event_state_of(1)
|
23
|
-
if (test_state0 != Smartcard::PCSC::STATE_IGNORE) or (test_state1 != Smartcard::PCSC::STATE_PRESENT)
|
24
|
-
puts "FAILED: ReaderStates.set_event_state_of! / event_state_of returned #{test_state0},#{test_state1} instead of #{Smartcard::PCSC::STATE_IGNORE},#{Smartcard::PCSC::STATE_PRESENT}\n"
|
25
|
-
return false
|
26
|
-
end
|
27
|
-
test_atr1, test_atr0 = reader_states.atr_of(1), reader_states.atr_of(0)
|
28
|
-
if (test_atr1 != "Ruby\0rocks!") or (test_atr0 != "grreat success")
|
29
|
-
puts "FAILED: ReaderStates.set_atr_of! / atr_of returned '#{test_atr1}','#{test_atr0}' instead of 'Ruby\\0rocks!','grreat success'\n"
|
30
|
-
return false
|
31
|
-
end
|
32
|
-
test_reader0, test_reader1 = reader_states.reader_name_of(0), reader_states.reader_name_of(1)
|
33
|
-
if (test_reader0 != "PC/SC Reader 0") or (test_reader1 != "CCID Reader 1")
|
34
|
-
puts "FAILED: ReaderStates.set_reader_name_of! / reader_name_of returned '#{test_reader0}','#{test_reader1}' instead of 'PC/SC Reader 0','CCID Reader 1'\n"
|
35
|
-
return false
|
36
|
-
end
|
37
|
-
|
38
|
-
[5, 2, nil].each do |bad_index|
|
39
|
-
exception_thrown = false
|
40
|
-
begin
|
41
|
-
reader_states.current_state_of(bad_index)
|
42
|
-
rescue IndexError => e
|
43
|
-
puts "(expected) exception thrown: #{e}\n"
|
44
|
-
exception_thrown = e
|
45
|
-
rescue TypeError => e
|
46
|
-
puts "(expected) exception thrown: #{e}\n"
|
47
|
-
exception_thrown = e
|
48
|
-
end
|
49
|
-
unless exception_thrown
|
50
|
-
puts "FAILED: ReaderStates.current_state_of responded for bad index #{bad_index}\n"
|
51
|
-
return false
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
return true
|
56
|
-
end
|
57
|
-
|
58
|
-
def test_io_request
|
59
|
-
io_request = Smartcard::PCSC::IoRequest.new
|
60
|
-
[Smartcard::PCSC::PROTOCOL_T0, Smartcard::PCSC::PROTOCOL_T1, Smartcard::PCSC::PROTOCOL_RAW].each do |t_protocol|
|
61
|
-
io_request.protocol = t_protocol
|
62
|
-
r_protocol = io_request.protocol
|
63
|
-
if r_protocol != t_protocol
|
64
|
-
puts "FAILED: IoRequest.protocol= / protocol failed for protocol #{t_protocol} (got #{r_protocol} instead)\n"
|
65
|
-
return false
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
test_reader_states
|
71
|
-
test_io_request
|
72
|
-
|
73
|
-
|
74
|
-
context = Smartcard::PCSC::Context.new(Smartcard::PCSC::SCOPE_SYSTEM);
|
4
|
+
context = Smartcard::PCSC::Context.new(Smartcard::PCSC::SCOPE_SYSTEM)
|
75
5
|
|
76
6
|
reader_groups = context.list_reader_groups
|
77
7
|
pp reader_groups
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smartcard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Victor Costan
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-01
|
12
|
+
date: 2008-05-01 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -19,8 +19,26 @@ executables: []
|
|
19
19
|
|
20
20
|
extensions:
|
21
21
|
- ext/smartcard_pcsc/extconf.rb
|
22
|
-
extra_rdoc_files:
|
23
|
-
|
22
|
+
extra_rdoc_files:
|
23
|
+
- BUILD
|
24
|
+
- CHANGELOG
|
25
|
+
- ext/smartcard_pcsc/extconf.rb
|
26
|
+
- ext/smartcard_pcsc/pcsc.h
|
27
|
+
- ext/smartcard_pcsc/pcsc_card.c
|
28
|
+
- ext/smartcard_pcsc/pcsc_constants.c
|
29
|
+
- ext/smartcard_pcsc/pcsc_context.c
|
30
|
+
- ext/smartcard_pcsc/pcsc_exception.c
|
31
|
+
- ext/smartcard_pcsc/pcsc_io_request.c
|
32
|
+
- ext/smartcard_pcsc/pcsc_main.c
|
33
|
+
- ext/smartcard_pcsc/pcsc_multi_strings.c
|
34
|
+
- ext/smartcard_pcsc/pcsc_namespace.c
|
35
|
+
- ext/smartcard_pcsc/pcsc_reader_states.c
|
36
|
+
- ext/smartcard_pcsc/pcsc_surrogate_reader.h
|
37
|
+
- ext/smartcard_pcsc/pcsc_surrogate_wintypes.h
|
38
|
+
- lib/smartcard/pcsc_exception.rb
|
39
|
+
- lib/smartcard.rb
|
40
|
+
- LICENSE
|
41
|
+
- README
|
24
42
|
files:
|
25
43
|
- BUILD
|
26
44
|
- CHANGELOG
|
@@ -29,6 +47,7 @@ files:
|
|
29
47
|
- ext/smartcard_pcsc/pcsc_card.c
|
30
48
|
- ext/smartcard_pcsc/pcsc_constants.c
|
31
49
|
- ext/smartcard_pcsc/pcsc_context.c
|
50
|
+
- ext/smartcard_pcsc/pcsc_exception.c
|
32
51
|
- ext/smartcard_pcsc/pcsc_io_request.c
|
33
52
|
- ext/smartcard_pcsc/pcsc_main.c
|
34
53
|
- ext/smartcard_pcsc/pcsc_multi_strings.c
|
@@ -36,18 +55,25 @@ files:
|
|
36
55
|
- ext/smartcard_pcsc/pcsc_reader_states.c
|
37
56
|
- ext/smartcard_pcsc/pcsc_surrogate_reader.h
|
38
57
|
- ext/smartcard_pcsc/pcsc_surrogate_wintypes.h
|
58
|
+
- lib/smartcard/pcsc_exception.rb
|
39
59
|
- lib/smartcard.rb
|
40
60
|
- LICENSE
|
41
61
|
- Manifest
|
42
62
|
- README
|
43
|
-
- test/
|
63
|
+
- test/test_containers.rb
|
64
|
+
- test/test_smoke.rb
|
44
65
|
- tests/ts_pcsc_ext.rb
|
45
66
|
- smartcard.gemspec
|
46
67
|
has_rdoc: true
|
47
68
|
homepage: http://www.costan.us/smartcard
|
48
69
|
post_install_message:
|
49
|
-
rdoc_options:
|
50
|
-
|
70
|
+
rdoc_options:
|
71
|
+
- --line-numbers
|
72
|
+
- --inline-source
|
73
|
+
- --title
|
74
|
+
- Smartcard
|
75
|
+
- --main
|
76
|
+
- README
|
51
77
|
require_paths:
|
52
78
|
- lib
|
53
79
|
- ext
|
@@ -66,9 +92,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
66
92
|
requirements: []
|
67
93
|
|
68
94
|
rubyforge_project: smartcard
|
69
|
-
rubygems_version: 1.
|
95
|
+
rubygems_version: 1.1.1
|
70
96
|
signing_key:
|
71
97
|
specification_version: 2
|
72
98
|
summary: Interface with ISO 7816 smart cards.
|
73
99
|
test_files:
|
74
|
-
- test/
|
100
|
+
- test/test_containers.rb
|
101
|
+
- test/test_smoke.rb
|
data/test/test_all.rb
DELETED
File without changes
|