tem_ruby 0.10.0 → 0.10.1

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.
@@ -0,0 +1,115 @@
1
+ require 'openssl'
2
+
3
+
4
+ # :nodoc: namespace
5
+ module Tem::Builders
6
+
7
+ # Builder class and namespace for the cryptography builder.
8
+ class Crypto < Abi
9
+ # Creates a builder targeting a module / class.
10
+ #
11
+ # The given parameter should be a class or module
12
+ def self.define_crypto(class_or_module) # :yields: crypto
13
+ yield new(class_or_module)
14
+ end
15
+
16
+ # Defines the methods for handling an asymmetric (public/private) key.
17
+ #
18
+ # ssl_class should be a class in OpenSSL::PKey. privkey_abi_type and
19
+ # pubkey_abi_type should be ABI types similar to those produced by
20
+ # packed_variable_length_numbers.
21
+ #
22
+ # The following methods are defined for a type named 'name':
23
+ # * read_private_name(array, offset) -> key
24
+ # * to_private_name(key) -> array
25
+ # * private_name_class -> Class
26
+ # * read_public_name(array, offset) -> key
27
+ # * to_public_name(key) -> array
28
+ # * public_name_class -> Class
29
+ def asymmetric_key(name, ssl_class, privkey_abi_type, pubkey_abi_type,
30
+ hooks = {})
31
+ object_wrapper "private_#{name}", ssl_class, [privkey_abi_type, nil],
32
+ :read => hooks[:read_private] || hooks[:read],
33
+ :to => hooks[:to_private] || hooks[:to],
34
+ :new => hooks[:new_private] || hooks[:new] ||
35
+ lambda { |k| ssl_class.new }
36
+ object_wrapper "public_#{name}", ssl_class, [pubkey_abi_type, nil],
37
+ :read => hooks[:read_public] || hooks[:read],
38
+ :to => hooks[:to_public] || hooks[:to],
39
+ :new => hooks[:new_private] || hooks[:new] ||
40
+ lambda { |k| ssl_class.new }
41
+ end
42
+
43
+ # Defines the methods for a symmetric key.
44
+ #
45
+ # cipher_class should be a class in OpenSSL::Cipher. key_abi_type should be
46
+ # an ABI type similar to that produced by fixed_string.
47
+ #
48
+ # The following methods are defined for a type named 'name':
49
+ # * read_name(array, offset) -> object
50
+ # * to_name(object) -> array
51
+ # * name_class -> Class
52
+ def symmetric_key(name, cipher_class, cipher_name, key_abi_type, hooks = {})
53
+ object_wrapper name, cipher_class, [key_abi_type, :key],
54
+ :new => lambda { |klass|
55
+ k = klass.new cipher_name
56
+
57
+ unless k.respond_to? :key
58
+ # Some ciphers don't give back the key that they receive.
59
+ # We need to synthesize that.
60
+ class << k
61
+ def key=(new_key)
62
+ super
63
+ @_key = new_key
64
+ end
65
+ def key
66
+ @_key
67
+ end
68
+ end
69
+ end
70
+ }
71
+ end
72
+
73
+ # Defines the methods for a cryptographic hash function.
74
+ #
75
+ # digest_class should be an object similar to the classes in the Digest
76
+ # name-space. Specifically, it should implement the digest method.
77
+ #
78
+ # The following methods are defined for a type named 'name':
79
+ # * name(array | String) -> array
80
+ # * name_length -> number
81
+ # * name_digest_class -> Class
82
+ def crypto_hash(name, digest_class)
83
+ digest_length = digest_class.digest('').length
84
+
85
+ defines = Proc.new do
86
+ define_method :"#{name}" do |data|
87
+ data = data.pack 'C*' unless data.kind_of? String
88
+ digest_class.digest(data).unpack 'C*'
89
+ end
90
+ define_method(:"#{name}_digest_class") { digest_class }
91
+ define_method(:"#{name}_length") { digest_length }
92
+ end
93
+
94
+ @target.class_eval &defines
95
+ (class << @target; self; end).module_eval &defines
96
+ end
97
+ end # class Crypto
98
+
99
+
100
+ # Implementation code for the Crypto methods.
101
+ module Crypto::Impl
102
+ def self.key_from_array(array, offset, ssl_class, abi_type)
103
+ key = ssl_class.new
104
+ numbers = self.send :"read_#{abi_type}", array, offset
105
+ numbers.each { |k, v| key.send :"#{k}=", v }
106
+ end
107
+
108
+ def self.key_to_array(key, abi_type)
109
+ components = self.send :"#{abi_type}_components"
110
+ numbers = Hash[*(components.map { |c| [c, key.send(c.to_sym) ]}.flatten)]
111
+ self.send :"to_#{abi_type}", numbers
112
+ end
113
+ end
114
+
115
+ end # namespace Tem::Builders
@@ -0,0 +1,67 @@
1
+ require 'openssl'
2
+ require 'digest/sha1'
3
+
4
+
5
+ module Tem::Abi
6
+ Tem::Builders::Abi.define_abi self do |abi|
7
+ abi.fixed_length_number :tem_byte, 1, :signed => true, :big_endian => true
8
+ abi.fixed_length_number :tem_ubyte, 1, :signed => false, :big_endian => true
9
+ abi.fixed_length_number :tem_short, 2, :signed => true, :big_endian => true
10
+ abi.fixed_length_number :tem_ushort, 2, :signed => false,
11
+ :big_endian => true
12
+ abi.fixed_length_number :tem_ps_addr, 20, :signed => false,
13
+ :big_endian => true
14
+ abi.fixed_length_number :tem_ps_value, 20, :signed => false,
15
+ :big_endian => true
16
+
17
+ abi.packed_variable_length_numbers :tem_privrsa_numbers, :tem_ushort,
18
+ [:p, :q, :dmp1, :dmq1, :iqmp], :signed => false, :big_endian => true
19
+ abi.packed_variable_length_numbers :tem_pubrsa_numbers, :tem_ushort,
20
+ [:e, :n], :signed => false, :big_endian => true
21
+ abi.fixed_length_string :tem_aes_key_string, 16
22
+ end
23
+
24
+ Tem::Builders::Crypto.define_crypto self do |crypto|
25
+ crypto.crypto_hash :tem_hash, Digest::SHA1
26
+
27
+ crypto.asymmetric_key :tem_rsa, Tem::Keys::Asymmetric, :tem_privrsa_numbers,
28
+ :tem_pubrsa_numbers, :new => lambda { |key| OpenSSL::PKey::RSA.new },
29
+ :to => lambda { |k| k.ssl_key },
30
+ :read_public => lambda { |key| Tem::Keys::Asymmetric.new key },
31
+ :read_private => lambda { |key|
32
+ # a bit of math to rebuild the public key
33
+ key.n = key.p * key.q
34
+ p1, q1 = key.p - 1, key.q - 1
35
+ p1q1 = p1 * q1
36
+ # HACK(costan): I haven't figured out how to restore d from dmp1 and
37
+ # dmq1, so I'm betting on the fact that e must be a small prime.
38
+ emp1 = key.dmp1.mod_inverse p1
39
+ emq1 = key.dmq1.mod_inverse q1
40
+ key.e = (emp1 < emq1) ? emp1 : emq1
41
+ key.d = key.e.mod_inverse p1q1
42
+ Tem::Keys::Asymmetric.new key
43
+ }
44
+
45
+ crypto.symmetric_key :tem_aes_key, Tem::Keys::Symmetric, nil,
46
+ :tem_aes_key_string,
47
+ :new => lambda { |k| OpenSSL::Cipher::AES.new 'ECB' },
48
+ :read => lambda { |k| Tem::Keys::Symmetric.new k },
49
+ :to => lambda { |k| k.ssl_key }
50
+
51
+ crypto.conditional_wrapper :tem_key, 1,
52
+ [{:tag => [0x99], :type => :tem_key,
53
+ :class => Tem::Keys::Symmetric },
54
+ {:tag => [0xAA], :type => :public_tem_rsa,
55
+ :class => Tem::Keys::Asymmetric,
56
+ :predicate => lambda { |k| k.ssl_key.kind_of?(OpenSSL::PKey::RSA) &&
57
+ k.is_public? } },
58
+ {:tag => [0x55], :type => :private_tem_rsa,
59
+ :class => Tem::Keys::Asymmetric,
60
+ :predicate => lambda { |k| k.ssl_key.kind_of?(OpenSSL::PKey::RSA) } }]
61
+ end
62
+
63
+ # For convenience, include the Abi methods in Tem::Session's namespace.
64
+ def self.included(klass)
65
+ klass.extend Tem::Abi
66
+ end
67
+ end # module Tem::Abi
data/lib/tem/ecert.rb CHANGED
@@ -18,7 +18,7 @@ module Tem::ECert
18
18
 
19
19
  # retrieves the TEM's Public Endorsement Key
20
20
  def pubek
21
- new_key_from_ssl endorsement_cert.public_key, true
21
+ Tem::Key.new_from_ssl_key endorsement_cert.public_key
22
22
  end
23
23
 
24
24
  # emits a TEM
@@ -0,0 +1,116 @@
1
+ # :nodoc: namespace
2
+ module Tem::Keys
3
+
4
+ # Wraps a TEM asymmetric key, e.g. an RSA key.
5
+ class Asymmetric < Tem::Key
6
+ def self.new_from_array(array)
7
+ self.new(OpenSSL::PKey::RSA.new(array[0]), *array[1..-1])
8
+ end
9
+
10
+ def self.new_from_yaml_str(yaml_str)
11
+ array = YAML.load yaml_str
12
+ new_from_array array
13
+ end
14
+
15
+ def to_array
16
+ [@ssl_key.to_pem, @padding_type]
17
+ end
18
+
19
+ def to_yaml_str
20
+ self.to_array.to_yaml.to_s
21
+ end
22
+
23
+ # Generate a pair of asymmetric keys.
24
+ def self.generate_pair
25
+ ssl_key = OpenSSL::PKey::RSA.generate(2048, 65537)
26
+ new_pair_from_ssl_key ssl_key
27
+ end
28
+
29
+ # Creates a pair of asymmetric keys wrapping an OpenSSL private key.
30
+ def self.new_pair_from_ssl_key(ssl_key)
31
+ { :public => Tem::Keys::Asymmetric.new(ssl_key.public_key),
32
+ :private => Tem::Keys::Asymmetric.new(ssl_key) }
33
+ end
34
+
35
+ def initialize(ssl_key, padding_type = :pkcs1)
36
+ super ssl_key
37
+ @is_public = !ssl_key.d
38
+ @padding_type = padding_type
39
+
40
+ case padding_type
41
+ when :oaep
42
+ @padding_id = OpenSSL::PKey::RSA::PKCS1_OAEP_PADDING
43
+ @padding_bytes = 42
44
+ when :pkcs1
45
+ @padding_id = OpenSSL::PKey::RSA::PKCS1_PADDING
46
+ @padding_bytes = 11
47
+ else
48
+ raise "Unknown padding type #{padding_type}\n"
49
+ end
50
+
51
+ @size = 0
52
+ n = @is_public ? @ssl_key.n : (@ssl_key.p * @ssl_key.q)
53
+ while n != 0 do
54
+ @size += 1
55
+ n >>= 8
56
+ end
57
+ end
58
+ public_class_method :new
59
+
60
+ def is_public?
61
+ @is_public
62
+ end
63
+
64
+ def encrypt(data)
65
+ encrypt_or_decrypt data, @size - @padding_bytes,
66
+ @is_public ? :public_encrypt : :private_encrypt
67
+ end
68
+
69
+ def decrypt(data)
70
+ encrypt_or_decrypt data, @size,
71
+ @is_public ? :public_decrypt : :private_decrypt
72
+ end
73
+
74
+ def sign(data)
75
+ data = data.pack 'C*' if data.respond_to? :pack
76
+ # PKCS1-padding is forced in by openssl... sigh!
77
+ out_data = @ssl_key.sign OpenSSL::Digest::SHA1.new, data
78
+ data.respond_to?(:pack) ? out_data : out_data.unpack('C*')
79
+ end
80
+
81
+ def verify(data, signature)
82
+ data = data.pack 'C*' if data.respond_to? :pack
83
+ signature = signature.pack 'C*' if signature.respond_to? :pack
84
+ # PKCS1-padding is forced in by openssl... sigh!
85
+ @ssl_key.verify OpenSSL::Digest::SHA1.new, signature, data
86
+ end
87
+
88
+ def encrypt_or_decrypt(data, in_size, op)
89
+ chug_data(data, in_size) { |block| @ssl_key.send op, block, @padding_id }
90
+ end
91
+ private :encrypt_or_decrypt
92
+
93
+ def chug_data(data, in_size, &chug_block)
94
+ output = data.class.new
95
+ i = 0
96
+ while i < data.length do
97
+ block_size = (data.length - i < in_size) ? data.length - i : in_size
98
+ if data.kind_of? String
99
+ block = data[i...(i+block_size)]
100
+ else
101
+ block = data[i...(i+block_size)].pack('C*')
102
+ end
103
+ o_block = yield block
104
+ if data.kind_of? String
105
+ output += o_block
106
+ else
107
+ output += o_block.unpack('C*')
108
+ end
109
+ i += block_size
110
+ end
111
+ return output
112
+ end
113
+ private :chug_data
114
+ end
115
+
116
+ end # namespace Tem::Keys
@@ -0,0 +1,48 @@
1
+ # Base class for the TEM keys.
2
+ #
3
+ # This class consists of stubs describing the interface implemented by
4
+ # subclasses.
5
+ class Tem::Key
6
+ # The OpenSSL key wrapped by this TEM key.
7
+ attr_reader :ssl_key
8
+
9
+ # Creates a new key based on an OpenSSL key.
10
+ def initialize(ssl_key)
11
+ @ssl_key = ssl_key
12
+ end
13
+ # This class should not be instantiated directly.
14
+ private_class_method :new
15
+
16
+ # Serializes this key to the TEM ABI format.
17
+ def to_tem_key
18
+ Tem::Abi.to_tem_key self
19
+ end
20
+
21
+ # Encrypts a block of data into a TEM-friendly format.
22
+ def encrypt(data)
23
+ raise "TEM Key class #{self.class.name} didn't implement encrypt"
24
+ end
25
+
26
+ def decrypt(data)
27
+ raise "TEM Key class #{self.class.name} didn't implement decrypt"
28
+ end
29
+
30
+ def sign(data)
31
+ raise "TEM Key class #{self.class.name} didn't implement sign"
32
+ end
33
+
34
+ def verify(data)
35
+ raise "TEM Key class #{self.class.name} didn't implement verify"
36
+ end
37
+
38
+ # Creates a new TEM key wrapper from a SSL key
39
+ def self.new_from_ssl_key(ssl_key)
40
+ if ssl_key.kind_of? OpenSSL::PKey::PKey
41
+ Tem::Keys::Asymmetric.new ssl_key
42
+ elsif ssl_key.kind_of? OpenSSL::Cipher::Cipher
43
+ Tem::Keys::Symmetric.new ssl_key
44
+ else
45
+ raise "Can't handle keys of class #{ssl_key.class}"
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,47 @@
1
+ # :nodoc: namespace
2
+ module Tem::Keys
3
+
4
+ # Wraps a TEM symmetric key, e.g. an AES key.
5
+ class Symmetric < Tem::Key
6
+ @@cipher_mode = 'ECB'
7
+
8
+ # Generates a new symmetric key.
9
+ def self.generate
10
+ cipher = OpenSSL::Cipher::AES128.new @@cipher_mode
11
+ key = cipher.random_key
12
+ self.new key
13
+ end
14
+
15
+ # Creates a new symmetric key based on an OpenSSL Cipher instance, augmented
16
+ # with a key accessor.
17
+ def initialize(ssl_key)
18
+ super ssl_key
19
+ @key = ssl_key.key
20
+ @cipher_class = ssl_key.class
21
+ end
22
+ public_class_method :new
23
+
24
+ def encrypt_or_decrypt(data, do_encrypt)
25
+ cipher = @cipher_class.new @@cipher_mode
26
+ do_encrypt ? cipher.encrypt : cipher.decrypt
27
+ cipher.key = @key
28
+ cipher.iv = "\0" * 16
29
+
30
+ end
31
+
32
+ def encrypt(data)
33
+ cipher.encrypt_or_decrypt data, true
34
+ end
35
+
36
+ def decrypt(data)
37
+ cipher.encrypt_or_decrypt data, false
38
+ end
39
+
40
+ def sign(data)
41
+ end
42
+
43
+ def verify(data)
44
+ end
45
+ end
46
+
47
+ end # namespace Tem::Keys
@@ -56,7 +56,7 @@ class Tem::SecAssembler
56
56
  if @body[i].kind_of? Hash
57
57
  raise "label #{@body[i][:label]} undefined" if (!@body[i][:label].nil? and @labels[@body[i][:label]].nil?)
58
58
  addr = @body[i][:label].nil? ? @body[i][:address] : @labels[@body[i][:label]]
59
- q = @body[i][:relative] ? (@tem_klass.send "to_tem_#{@body[i][:type]}_reladdr".to_sym, addr - i - @body[i][:relative]) :
59
+ q = @body[i][:relative] ? (@tem_klass.send "signed_to_tem_#{@body[i][:type]}".to_sym, addr - i - @body[i][:relative]) :
60
60
  (@tem_klass.send "to_tem_#{@body[i][:type]}".to_sym, addr)
61
61
  @body[i, q.length] = *q
62
62
  end
@@ -88,4 +88,3 @@ class Tem::SecAssembler
88
88
  @extra_bytes = extra_bytes
89
89
  end
90
90
  end
91
-
data/lib/tem/secpack.rb CHANGED
@@ -27,7 +27,7 @@ class Tem::SecPack
27
27
 
28
28
  def initialize(args)
29
29
  @tem_klass = args[:tem_class]
30
- @@serialized_members.map { |m| self.instance_variable_set('@' + m.to_s, args[m]) }
30
+ @@serialized_members.map { |m| self.instance_variable_set "@#{m}", args[m] }
31
31
  @bound ||= false
32
32
  end
33
33
 
@@ -37,8 +37,9 @@ class Tem::SecPack
37
37
 
38
38
  def tem_header
39
39
  # TODO: use 0x0100 (no tracing) depending on options
40
- hh = [0x0101, @signed_bytes, @encrypted_bytes, @extra_bytes, @sp, @ep].map { |n| @tem_klass.to_tem_ushort n }.flatten
41
- hh += Array.new((@tem_klass.hash_for_tem [0]).length - hh.length, 0)
40
+ hh = [0x0101, @signed_bytes || 0, @encrypted_bytes || 0, @extra_bytes, @sp,
41
+ @ep].map { |n| @tem_klass.to_tem_ushort n }.flatten
42
+ hh += Array.new((@tem_klass.tem_hash [0]).length - hh.length, 0)
42
43
  return hh
43
44
  end
44
45
 
@@ -49,7 +50,7 @@ class Tem::SecPack
49
50
  @signed_bytes = encrypt_from
50
51
  @encrypted_bytes = plaintext_from - encrypt_from
51
52
 
52
- secpack_sig = @tem_klass.hash_for_tem [tem_header, @body[0...plaintext_from]].flatten
53
+ secpack_sig = @tem_klass.tem_hash [tem_header, @body[0...plaintext_from]].flatten
53
54
  crypt = public_key.encrypt [@body[encrypt_from...plaintext_from], secpack_sig].flatten
54
55
  @body = [@body[0...encrypt_from], crypt, @body[plaintext_from..-1]].flatten
55
56
 
data/lib/tem/tem.rb CHANGED
@@ -1,13 +1,13 @@
1
1
  class Tem::Session
2
2
  include Tem::Abi
3
- include Tem::Buffers
3
+ include Tem::Apdus::Buffers
4
+ include Tem::Apdus::Keys
5
+ include Tem::Apdus::Lifecycle
6
+ include Tem::Apdus::Tag
7
+
4
8
  include Tem::CA
5
- include Tem::CryptoAbi
6
9
  include Tem::ECert
7
- include Tem::Keys
8
- include Tem::Lifecycle
9
10
  include Tem::SeClosures
10
- include Tem::Tag
11
11
  include Tem::Toolkit
12
12
 
13
13
  CAPPLET_AID = [0x19, 0x83, 0x12, 0x29, 0x10, 0xBA, 0xBE]
data/lib/tem/toolkit.rb CHANGED
@@ -34,7 +34,8 @@ module Tem::Toolkit
34
34
 
35
35
  kp_buffer = execute gen_sec
36
36
  keys_offset = authz.nil? ? 20 : 0
37
- k1id, k2id = read_tem_ushort(kp_buffer, keys_offset), read_tem_ushort(kp_buffer, keys_offset + 2)
37
+ k1id = read_tem_ushort kp_buffer, keys_offset
38
+ k2id = read_tem_ushort kp_buffer, keys_offset + 2
38
39
  if type == :asymmetric
39
40
  return_val = { :pubk_id => k1id, :privk_id => k2id }
40
41
  else
data/lib/tem_ruby.rb CHANGED
@@ -18,20 +18,28 @@ require 'tem/transport/jcop_remote_transport.rb'
18
18
  require 'tem/transport/jcop_remote_server.rb'
19
19
  require 'tem/transport/auto_configurator.rb'
20
20
 
21
- require 'tem/abi.rb'
21
+ require 'tem/keys/key.rb'
22
+ require 'tem/keys/asymmetric.rb'
23
+ require 'tem/keys/symmetric.rb'
24
+
25
+ require 'tem/builders/abi.rb'
26
+ require 'tem/builders/crypto.rb'
27
+
28
+ require 'tem/definitions/abi.rb'
29
+
22
30
  require 'tem/auto_conf.rb'
23
- require 'tem/buffers.rb'
31
+ require 'tem/apdus/buffers.rb'
32
+ require 'tem/apdus/keys.rb'
33
+ require 'tem/apdus/lifecycle.rb'
34
+ require 'tem/apdus/tag.rb'
35
+
24
36
  require 'tem/ca.rb'
25
- require 'tem/crypto_abi.rb'
26
37
  require 'tem/ecert.rb'
27
38
  require 'tem/hive.rb'
28
- require 'tem/keys.rb'
29
- require 'tem/lifecycle.rb'
30
39
  require 'tem/sec_assembler.rb'
31
40
  require 'tem/sec_opcodes.rb'
32
41
  require 'tem/sec_exec_error.rb'
33
42
  require 'tem/seclosures.rb'
34
43
  require 'tem/secpack.rb'
35
- require 'tem/tag.rb'
36
44
  require 'tem/toolkit.rb'
37
45
  require 'tem/tem.rb'
data/tem_ruby.gemspec CHANGED
@@ -2,38 +2,34 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{tem_ruby}
5
- s.version = "0.10.0"
5
+ s.version = "0.10.1"
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{2009-04-08}
9
+ s.date = %q{2009-05-26}
10
10
  s.description = %q{TEM (Trusted Execution Module) driver, written in and for ruby.}
11
11
  s.email = %q{victor@costan.us}
12
12
  s.executables = ["tem_bench", "tem_ca", "tem_irb", "tem_proxy", "tem_stat"]
13
- s.extra_rdoc_files = ["bin/tem_bench", "bin/tem_ca", "bin/tem_irb", "bin/tem_proxy", "bin/tem_stat", "CHANGELOG", "lib/tem/_cert.rb", "lib/tem/abi.rb", "lib/tem/auto_conf.rb", "lib/tem/buffers.rb", "lib/tem/ca.rb", "lib/tem/crypto_abi.rb", "lib/tem/ecert.rb", "lib/tem/hive.rb", "lib/tem/keys.rb", "lib/tem/lifecycle.rb", "lib/tem/sec_assembler.rb", "lib/tem/sec_exec_error.rb", "lib/tem/sec_opcodes.rb", "lib/tem/seclosures.rb", "lib/tem/secpack.rb", "lib/tem/tag.rb", "lib/tem/tem.rb", "lib/tem/toolkit.rb", "lib/tem/transport/auto_configurator.rb", "lib/tem/transport/java_card_mixin.rb", "lib/tem/transport/jcop_remote_protocol.rb", "lib/tem/transport/jcop_remote_server.rb", "lib/tem/transport/jcop_remote_transport.rb", "lib/tem/transport/pcsc_transport.rb", "lib/tem/transport/transport.rb", "lib/tem_ruby.rb", "LICENSE", "README"]
14
- s.files = ["bin/tem_bench", "bin/tem_ca", "bin/tem_irb", "bin/tem_proxy", "bin/tem_stat", "CHANGELOG", "dev_ca/ca_cert.cer", "dev_ca/ca_cert.pem", "dev_ca/ca_key.pem", "dev_ca/config.yml", "lib/tem/_cert.rb", "lib/tem/abi.rb", "lib/tem/auto_conf.rb", "lib/tem/buffers.rb", "lib/tem/ca.rb", "lib/tem/crypto_abi.rb", "lib/tem/ecert.rb", "lib/tem/hive.rb", "lib/tem/keys.rb", "lib/tem/lifecycle.rb", "lib/tem/sec_assembler.rb", "lib/tem/sec_exec_error.rb", "lib/tem/sec_opcodes.rb", "lib/tem/seclosures.rb", "lib/tem/secpack.rb", "lib/tem/tag.rb", "lib/tem/tem.rb", "lib/tem/toolkit.rb", "lib/tem/transport/auto_configurator.rb", "lib/tem/transport/java_card_mixin.rb", "lib/tem/transport/jcop_remote_protocol.rb", "lib/tem/transport/jcop_remote_server.rb", "lib/tem/transport/jcop_remote_transport.rb", "lib/tem/transport/pcsc_transport.rb", "lib/tem/transport/transport.rb", "lib/tem_ruby.rb", "LICENSE", "Manifest", "Rakefile", "README", "test/_test_cert.rb", "test/tem_test_case.rb", "test/test_driver.rb", "test/test_exceptions.rb", "test/test_tem.rb", "test/transport/test_auto_configurator.rb", "test/transport/test_java_card_mixin.rb", "test/transport/test_jcop_remote.rb", "timings/blank_bound_secpack.rb", "timings/blank_sec.rb", "timings/devchip_decrypt.rb", "timings/post_buffer.rb", "timings/simple_apdu.rb", "timings/timings.rb", "timings/vm_perf.rb", "timings/vm_perf_bound.rb", "tem_ruby.gemspec"]
15
- s.has_rdoc = true
13
+ s.extra_rdoc_files = ["bin/tem_bench", "bin/tem_ca", "bin/tem_irb", "bin/tem_proxy", "bin/tem_stat", "CHANGELOG", "lib/tem/_cert.rb", "lib/tem/apdus/buffers.rb", "lib/tem/apdus/keys.rb", "lib/tem/apdus/lifecycle.rb", "lib/tem/apdus/tag.rb", "lib/tem/auto_conf.rb", "lib/tem/builders/abi.rb", "lib/tem/builders/crypto.rb", "lib/tem/ca.rb", "lib/tem/definitions/abi.rb", "lib/tem/ecert.rb", "lib/tem/hive.rb", "lib/tem/keys/asymmetric.rb", "lib/tem/keys/key.rb", "lib/tem/keys/symmetric.rb", "lib/tem/sec_assembler.rb", "lib/tem/sec_exec_error.rb", "lib/tem/sec_opcodes.rb", "lib/tem/seclosures.rb", "lib/tem/secpack.rb", "lib/tem/tem.rb", "lib/tem/toolkit.rb", "lib/tem/transport/auto_configurator.rb", "lib/tem/transport/java_card_mixin.rb", "lib/tem/transport/jcop_remote_protocol.rb", "lib/tem/transport/jcop_remote_server.rb", "lib/tem/transport/jcop_remote_transport.rb", "lib/tem/transport/pcsc_transport.rb", "lib/tem/transport/transport.rb", "lib/tem_ruby.rb", "LICENSE", "README"]
14
+ s.files = ["bin/tem_bench", "bin/tem_ca", "bin/tem_irb", "bin/tem_proxy", "bin/tem_stat", "CHANGELOG", "dev_ca/ca_cert.cer", "dev_ca/ca_cert.pem", "dev_ca/ca_key.pem", "dev_ca/config.yml", "lib/tem/_cert.rb", "lib/tem/apdus/buffers.rb", "lib/tem/apdus/keys.rb", "lib/tem/apdus/lifecycle.rb", "lib/tem/apdus/tag.rb", "lib/tem/auto_conf.rb", "lib/tem/builders/abi.rb", "lib/tem/builders/crypto.rb", "lib/tem/ca.rb", "lib/tem/definitions/abi.rb", "lib/tem/ecert.rb", "lib/tem/hive.rb", "lib/tem/keys/asymmetric.rb", "lib/tem/keys/key.rb", "lib/tem/keys/symmetric.rb", "lib/tem/sec_assembler.rb", "lib/tem/sec_exec_error.rb", "lib/tem/sec_opcodes.rb", "lib/tem/seclosures.rb", "lib/tem/secpack.rb", "lib/tem/tem.rb", "lib/tem/toolkit.rb", "lib/tem/transport/auto_configurator.rb", "lib/tem/transport/java_card_mixin.rb", "lib/tem/transport/jcop_remote_protocol.rb", "lib/tem/transport/jcop_remote_server.rb", "lib/tem/transport/jcop_remote_transport.rb", "lib/tem/transport/pcsc_transport.rb", "lib/tem/transport/transport.rb", "lib/tem_ruby.rb", "LICENSE", "Manifest", "Rakefile", "README", "test/_test_cert.rb", "test/builders/test_abi_builder.rb", "test/tem_test_case.rb", "test/test_driver.rb", "test/test_exceptions.rb", "test/test_tem.rb", "test/transport/test_auto_configurator.rb", "test/transport/test_java_card_mixin.rb", "test/transport/test_jcop_remote.rb", "timings/blank_bound_secpack.rb", "timings/blank_sec.rb", "timings/devchip_decrypt.rb", "timings/post_buffer.rb", "timings/simple_apdu.rb", "timings/timings.rb", "timings/vm_perf.rb", "timings/vm_perf_bound.rb", "tem_ruby.gemspec"]
16
15
  s.homepage = %q{http://tem.rubyforge.org}
17
16
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Tem_ruby", "--main", "README"]
18
17
  s.require_paths = ["lib"]
19
18
  s.rubyforge_project = %q{tem}
20
- s.rubygems_version = %q{1.3.1}
19
+ s.rubygems_version = %q{1.3.3}
21
20
  s.summary = %q{TEM (Trusted Execution Module) driver, written in and for ruby.}
22
- s.test_files = ["test/test_driver.rb", "test/test_exceptions.rb", "test/test_tem.rb", "test/transport/test_auto_configurator.rb", "test/transport/test_java_card_mixin.rb", "test/transport/test_jcop_remote.rb"]
21
+ s.test_files = ["test/builders/test_abi_builder.rb", "test/test_driver.rb", "test/test_exceptions.rb", "test/test_tem.rb", "test/transport/test_auto_configurator.rb", "test/transport/test_java_card_mixin.rb", "test/transport/test_jcop_remote.rb"]
23
22
 
24
23
  if s.respond_to? :specification_version then
25
24
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
26
- s.specification_version = 2
25
+ s.specification_version = 3
27
26
 
28
27
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
29
28
  s.add_runtime_dependency(%q<smartcard>, [">= 0.3.0"])
30
- s.add_development_dependency(%q<echoe>, [">= 0"])
31
29
  else
32
30
  s.add_dependency(%q<smartcard>, [">= 0.3.0"])
33
- s.add_dependency(%q<echoe>, [">= 0"])
34
31
  end
35
32
  else
36
33
  s.add_dependency(%q<smartcard>, [">= 0.3.0"])
37
- s.add_dependency(%q<echoe>, [">= 0"])
38
34
  end
39
35
  end