smartcard 0.2.0-mswin32 → 0.2.1-mswin32
Sign up to get free protection for your applications and to get access to all the features.
- 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
|