smartcard 0.2.0-mswin32 → 0.2.1-mswin32
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 +4 -0
- data/README +22 -15
- data/ext/smartcard_pcsc/extconf.rb +6 -2
- data/ext/smartcard_pcsc/pcsc_card.c +20 -3
- data/ext/smartcard_pcsc/pcsc_constants.c +10 -8
- data/ext/smartcard_pcsc/pcsc_context.c +5 -1
- data/lib/smartcard/pcsc.so +0 -0
- data/smartcard.gemspec +5 -3
- data/tests/ts_pcsc_ext.rb +5 -1
- metadata +2 -2
data/CHANGELOG
CHANGED
data/README
CHANGED
@@ -1,22 +1,29 @@
|
|
1
|
-
|
1
|
+
+smartcard+ aims to become the standard support library for smart-card development on ruby.
|
2
|
+
Right now, the project offers a PC/SC binding that is working on ruby 1.8, under
|
3
|
+
Linux, OSX, and Windows. Future plans include a high level abstraction for the PC/SC binding
|
4
|
+
(plus any other bindings people need), and an interface for Java cards.
|
2
5
|
|
3
|
-
|
4
|
-
At the moment, 'smartcard' offers a PC/SC binding that is working on ruby 1.8, under
|
5
|
-
linux, osx, and windows. Future plans include a high level abstraction for the PC/SC binding
|
6
|
-
(and any other bindings people need), and an interface for Java cards.
|
6
|
+
= Installation
|
7
7
|
|
8
|
-
|
8
|
+
gem install smartcard
|
9
|
+
Windows:: Select the <tt>win32</tt> gem.
|
10
|
+
OSX:: Install the Developer Tools to get +gcc+. Requires Tiger or Leopard.
|
11
|
+
UNIX:: You need a PC/SC provider. See the {BUILD file}[link://files/BUILD.html] for details. The file also contains package lists for popular distributions.
|
9
12
|
|
10
|
-
|
11
|
-
with it. For the legalese version, please see the 'LICENSE' file.
|
13
|
+
= Documentation
|
12
14
|
|
13
|
-
|
15
|
+
The documentation you see was generated with RDoc. If you install the +smartcard+ gem, you should be
|
16
|
+
able to use ri to see the documentation. If you're using the SVN version, you can <tt>rake doc</tt> to build
|
17
|
+
the HTML documentation yourself.
|
14
18
|
|
15
|
-
|
16
|
-
able to use ri to see the documentation. If you're using the SVN version, you can use rdoc to
|
17
|
-
build the HTML and RI documentation yourself.
|
19
|
+
= License
|
18
20
|
|
19
|
-
|
21
|
+
+smartcard+ is released under the MIT license. This means you're free to do whatever you want
|
22
|
+
with it. However, it'd be nice to let the developers know if you plan to include this in a
|
23
|
+
distribution (bragging rights are always good). The {LICENSE file}[link://files/LICENSE.html]
|
24
|
+
has the license in legalese.
|
20
25
|
|
21
|
-
|
22
|
-
|
26
|
+
= Acknowledgements
|
27
|
+
|
28
|
+
+smartcard+ is developed by Victor Costan while working as a Research Assistant for MIT.
|
29
|
+
The work is sponsored by a grant from Quanta Computer Inc (www.quanta.com.tw)
|
@@ -3,8 +3,14 @@ require 'mkmf'
|
|
3
3
|
$CFLAGS ||= ''
|
4
4
|
$LDFLAGS ||= ''
|
5
5
|
|
6
|
+
pcsc_defines = []
|
7
|
+
|
6
8
|
if RUBY_PLATFORM =~ /darwin/
|
7
9
|
$LDFLAGS += ' -framework PCSC'
|
10
|
+
darwin_version = `uname -r`
|
11
|
+
if darwin_version =~ /^8./
|
12
|
+
pcsc_defines.push 'RB_SMARTCARD_OSX_TIGER_HACK'
|
13
|
+
end
|
8
14
|
elsif RUBY_PLATFORM =~ /win/
|
9
15
|
have_library('winscard')
|
10
16
|
else
|
@@ -23,8 +29,6 @@ pcsc_headers = []
|
|
23
29
|
end
|
24
30
|
end
|
25
31
|
|
26
|
-
pcsc_defines = []
|
27
|
-
|
28
32
|
File.open('pcsc_autogen.h', 'w') do |f|
|
29
33
|
pcsc_defines.each { |d| f.write "\#define #{d}\n" }
|
30
34
|
pcsc_headers.each { |h| f.write "\#include #{h}\n" }
|
@@ -192,6 +192,10 @@ static VALUE PCSC_Card_get_attribute(VALUE self, VALUE rbAttributeId) {
|
|
192
192
|
|
193
193
|
attribute_id = NUM2UINT(rbAttributeId);
|
194
194
|
attribute_length;
|
195
|
+
#if defined(RB_SMARTCARD_OSX_TIGER_HACK)
|
196
|
+
card->pcsc_error = SCARD_F_INTERNAL_ERROR;
|
197
|
+
rb_raise(rb_eRuntimeError, "SCardSetAttrib: not implemented in OSX Tiger");
|
198
|
+
#else
|
195
199
|
card->pcsc_error = SCardGetAttrib(card->card_handle, attribute_id, NULL, &attribute_length);
|
196
200
|
if(card->pcsc_error == SCARD_S_SUCCESS) {
|
197
201
|
attribute_buffer = ALLOC_N(char, attribute_length);
|
@@ -206,6 +210,7 @@ static VALUE PCSC_Card_get_attribute(VALUE self, VALUE rbAttributeId) {
|
|
206
210
|
}
|
207
211
|
if(card->pcsc_error != SCARD_S_SUCCESS)
|
208
212
|
rb_raise(rb_eRuntimeError, "SCardGetAttrib: %s", pcsc_stringify_error(card->pcsc_error));
|
213
|
+
#endif
|
209
214
|
return Qnil;
|
210
215
|
}
|
211
216
|
|
@@ -236,10 +241,15 @@ static VALUE PCSC_Card_set_attribute(VALUE self, VALUE rbAttributeId, VALUE rbAt
|
|
236
241
|
rb_raise(rb_eArgError, "second argument (attribute buffer) does not convert to a String");
|
237
242
|
return self;
|
238
243
|
}
|
239
|
-
|
240
|
-
|
244
|
+
|
245
|
+
#if defined(RB_SMARTCARD_OSX_TIGER_HACK)
|
246
|
+
card->pcsc_error = SCARD_F_INTERNAL_ERROR;
|
247
|
+
rb_raise(rb_eRuntimeError, "SCardSetAttrib: not implemented in OSX Tiger");
|
248
|
+
#else
|
249
|
+
card->pcsc_error = SCardSetAttrib(card->card_handle, attribute_id, (LPSTR)RSTRING(rbFinalAttributeValue)->ptr, RSTRING(rbFinalAttributeValue)->len);
|
241
250
|
if(card->pcsc_error != SCARD_S_SUCCESS)
|
242
251
|
rb_raise(rb_eRuntimeError, "SCardSetAttrib: %s", pcsc_stringify_error(card->pcsc_error));
|
252
|
+
#endif
|
243
253
|
return self;
|
244
254
|
}
|
245
255
|
|
@@ -343,10 +353,17 @@ static VALUE PCSC_Card_control(VALUE self, VALUE rbControlCode, VALUE rbSendData
|
|
343
353
|
recv_length = NUM2UINT(rbMaxRecvBytes);
|
344
354
|
recv_buffer = ALLOC_N(char, recv_length);
|
345
355
|
if(recv_buffer == NULL) return Qnil;
|
346
|
-
|
356
|
+
|
357
|
+
#if defined(RB_SMARTCARD_OSX_TIGER_HACK)
|
358
|
+
/* TODO: this will compile and run, but it won't do anything useful */
|
359
|
+
card->pcsc_error = SCardControl(card->card_handle,
|
360
|
+
(LPSTR)RSTRING(rbFinalSendData)->ptr, RSTRING(rbFinalSendData)->len,
|
361
|
+
recv_buffer, &recv_length);
|
362
|
+
#else
|
347
363
|
card->pcsc_error = SCardControl(card->card_handle, control_code,
|
348
364
|
(LPSTR)RSTRING(rbFinalSendData)->ptr, RSTRING(rbFinalSendData)->len,
|
349
365
|
recv_buffer, recv_length, &recv_length);
|
366
|
+
#endif
|
350
367
|
if(card->pcsc_error != SCARD_S_SUCCESS) {
|
351
368
|
xfree(recv_buffer);
|
352
369
|
rb_raise(rb_eRuntimeError, "SCardControl: %s", pcsc_stringify_error(card->pcsc_error));
|
@@ -50,21 +50,21 @@ void Init_PCSC_Consts() {
|
|
50
50
|
/* SCARD_F_COMM_ERROR : An internal communications error has been detected. */
|
51
51
|
rb_define_const(mPcsc, "SCARD_F_COMM_ERROR", INT2NUM(SCARD_F_COMM_ERROR));
|
52
52
|
/* SCARD_F_UNKNOWN_ERROR : An internal error has been detected, but the source is unknown. */
|
53
|
-
rb_define_const(mPcsc, "SCARD_F_UNKNOWN_ERROR", INT2NUM(
|
53
|
+
rb_define_const(mPcsc, "SCARD_F_UNKNOWN_ERROR", INT2NUM(SCARD_F_UNKNOWN_ERROR));
|
54
54
|
/* SCARD_E_INVALID_ATR : An ATR obtained from the registry is not a valid ATR string. */
|
55
|
-
rb_define_const(mPcsc, "SCARD_E_INVALID_ATR", INT2NUM(
|
55
|
+
rb_define_const(mPcsc, "SCARD_E_INVALID_ATR", INT2NUM(SCARD_E_INVALID_ATR));
|
56
56
|
/* SCARD_E_NOT_TRANSACTED : An attempt was made to end a non-existent transaction. */
|
57
|
-
rb_define_const(mPcsc, "SCARD_E_NOT_TRANSACTED", INT2NUM(
|
57
|
+
rb_define_const(mPcsc, "SCARD_E_NOT_TRANSACTED", INT2NUM(SCARD_E_NOT_TRANSACTED));
|
58
58
|
/* SCARD_E_READER_UNAVAILABLE : The specified reader is not currently available for use. */
|
59
|
-
rb_define_const(mPcsc, "SCARD_E_READER_UNAVAILABLE", INT2NUM(
|
59
|
+
rb_define_const(mPcsc, "SCARD_E_READER_UNAVAILABLE", INT2NUM(SCARD_E_READER_UNAVAILABLE));
|
60
60
|
/* SCARD_W_UNSUPPORTED_CARD : The reader cannot communicate with the card, due to ATR string configuration conflicts. */
|
61
|
-
rb_define_const(mPcsc, "SCARD_W_UNSUPPORTED_CARD", INT2NUM(
|
61
|
+
rb_define_const(mPcsc, "SCARD_W_UNSUPPORTED_CARD", INT2NUM(SCARD_W_UNSUPPORTED_CARD));
|
62
62
|
/* SCARD_W_UNRESPONSIVE_CARD : The smart card is not responding to a reset. */
|
63
|
-
rb_define_const(mPcsc, "SCARD_W_UNRESPONSIVE_CARD", INT2NUM(
|
63
|
+
rb_define_const(mPcsc, "SCARD_W_UNRESPONSIVE_CARD", INT2NUM(SCARD_W_UNRESPONSIVE_CARD));
|
64
64
|
/* SCARD_W_UNPOWERED_CARD : Power has been removed from the smart card, so that further communication is not possible. */
|
65
|
-
rb_define_const(mPcsc, "SCARD_W_UNPOWERED_CARD", INT2NUM(
|
65
|
+
rb_define_const(mPcsc, "SCARD_W_UNPOWERED_CARD", INT2NUM(SCARD_W_UNPOWERED_CARD));
|
66
66
|
/* SCARD_W_RESET_CARD : The smart card has been reset, so any shared state information is invalid. */
|
67
|
-
rb_define_const(mPcsc, "SCARD_W_RESET_CARD", INT2NUM(
|
67
|
+
rb_define_const(mPcsc, "SCARD_W_RESET_CARD", INT2NUM(SCARD_W_RESET_CARD));
|
68
68
|
/* SCARD_W_REMOVED_CARD : The smart card has been removed, so further communication is not possible. */
|
69
69
|
rb_define_const(mPcsc, "SCARD_W_REMOVED_CARD", INT2NUM(SCARD_W_REMOVED_CARD));
|
70
70
|
/* SCARD_E_PCI_TOO_SMALL : The PCI Receive buffer was too small. */
|
@@ -113,8 +113,10 @@ void Init_PCSC_Consts() {
|
|
113
113
|
rb_define_const(mPcsc, "STATE_INUSE", INT2NUM(SCARD_STATE_INUSE));
|
114
114
|
/* SCARD_STATE_MUTE : Unresponsive card. */
|
115
115
|
rb_define_const(mPcsc, "STATE_MUTE", INT2NUM(SCARD_STATE_MUTE));
|
116
|
+
#if defined(SCARD_STATE_UNPOWERED)
|
116
117
|
/* SCARD_STATE_UNPOWERED : Unpowered card. */
|
117
118
|
rb_define_const(mPcsc, "STATE_UNPOWERED", INT2NUM(SCARD_STATE_UNPOWERED));
|
119
|
+
#endif /* SCARD_STATE_UNPOWERED */
|
118
120
|
|
119
121
|
/* INFINITE : Infinite timeout. */
|
120
122
|
rb_define_const(mPcsc, "INFINITE_TIMEOUT", INT2NUM(INFINITE));
|
@@ -89,8 +89,12 @@ 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
|
-
|
92
|
+
#if defined(RB_SMARTCARD_OSX_TIGER_HACK)
|
93
|
+
return Qtrue;
|
94
|
+
#else
|
95
|
+
context->pcsc_error = SCardIsValidContext(context->pcsc_context);
|
93
96
|
return (context->pcsc_error == SCARD_S_SUCCESS) ? Qtrue : Qfalse;
|
97
|
+
#endif
|
94
98
|
}
|
95
99
|
|
96
100
|
/* :Document-method: list_reader_groups
|
data/lib/smartcard/pcsc.so
CHANGED
Binary file
|
data/smartcard.gemspec
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
|
2
|
-
# Gem::Specification for Smartcard-0.2.
|
2
|
+
# Gem::Specification for Smartcard-0.2.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.2.
|
8
|
-
s.date = %q{2007-11-
|
7
|
+
s.version = "0.2.1"
|
8
|
+
s.date = %q{2007-11-19}
|
9
9
|
s.summary = %q{Interface with ISO 7816 smart cards.}
|
10
10
|
s.require_paths = ["lib", "ext"]
|
11
11
|
s.email = %q{victor@costan.us}
|
@@ -24,6 +24,7 @@ end
|
|
24
24
|
#
|
25
25
|
# # Needs the 'echoe' gem
|
26
26
|
# require 'echoe'
|
27
|
+
# require 'pp'
|
27
28
|
#
|
28
29
|
# Echoe.new('smartcard') do |p|
|
29
30
|
# p.project = 'smartcard' # rubyforge project
|
@@ -35,6 +36,7 @@ end
|
|
35
36
|
#
|
36
37
|
# p.need_tar_gz = false
|
37
38
|
# p.clean_pattern += ['ext/**/*.manifest', 'ext/**/*_autogen.h']
|
39
|
+
# p.rdoc_pattern = /^(lib|bin|tasks|ext)|^BUILD|^README|^CHANGELOG|^TODO|^LICENSE|^COPYING$/
|
38
40
|
#
|
39
41
|
# p.eval = proc do |p|
|
40
42
|
# case RUBY_PLATFORM
|
data/tests/ts_pcsc_ext.rb
CHANGED
@@ -99,7 +99,11 @@ card0 = Smartcard::PCSC::Card.new(context, reader0, Smartcard::PCSC::SHARE_SHARE
|
|
99
99
|
card0.begin_transaction
|
100
100
|
card0.end_transaction Smartcard::PCSC::DISPOSITION_LEAVE
|
101
101
|
|
102
|
+
begin
|
102
103
|
card0.reconnect Smartcard::PCSC::SHARE_EXCLUSIVE, Smartcard::PCSC::PROTOCOL_ANY, Smartcard::PCSC::INITIALIZATION_RESET
|
104
|
+
rescue RuntimeException => e
|
105
|
+
puts "Card.reconnect threw exception #{e}\n"
|
106
|
+
end
|
103
107
|
|
104
108
|
card_status = card0.status
|
105
109
|
pp card_status
|
@@ -132,4 +136,4 @@ end
|
|
132
136
|
|
133
137
|
puts "Disconnecting and cleaning up\n"
|
134
138
|
card0.disconnect Smartcard::PCSC::DISPOSITION_LEAVE
|
135
|
-
context.release
|
139
|
+
context.release
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
|
|
3
3
|
specification_version: 1
|
4
4
|
name: smartcard
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.2.
|
7
|
-
date: 2007-11-
|
6
|
+
version: 0.2.1
|
7
|
+
date: 2007-11-19 00:00:00 -05:00
|
8
8
|
summary: Interface with ISO 7816 smart cards.
|
9
9
|
require_paths:
|
10
10
|
- lib
|