ccrypto-ruby 0.1.0

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.
Files changed (39) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/Gemfile +12 -0
  4. data/Gemfile.lock +64 -0
  5. data/README.md +149 -0
  6. data/Rakefile +10 -0
  7. data/bin/console +15 -0
  8. data/bin/setup +8 -0
  9. data/ccrypto-ruby.gemspec +45 -0
  10. data/lib/ccrypto/provider.rb +175 -0
  11. data/lib/ccrypto/ruby/data_conversion.rb +68 -0
  12. data/lib/ccrypto/ruby/engines/asn1_engine.rb +110 -0
  13. data/lib/ccrypto/ruby/engines/asn1_object.rb +19 -0
  14. data/lib/ccrypto/ruby/engines/cipher_engine.rb +170 -0
  15. data/lib/ccrypto/ruby/engines/compression_engine.rb +61 -0
  16. data/lib/ccrypto/ruby/engines/data_conversion_engine.rb +9 -0
  17. data/lib/ccrypto/ruby/engines/decompression_engine.rb +70 -0
  18. data/lib/ccrypto/ruby/engines/digest_engine.rb +127 -0
  19. data/lib/ccrypto/ruby/engines/ecc_engine.rb +218 -0
  20. data/lib/ccrypto/ruby/engines/hkdf_engine.rb +54 -0
  21. data/lib/ccrypto/ruby/engines/hmac_engine.rb +53 -0
  22. data/lib/ccrypto/ruby/engines/pbkdf2_engine.rb +69 -0
  23. data/lib/ccrypto/ruby/engines/pkcs7_engine.rb +179 -0
  24. data/lib/ccrypto/ruby/engines/rsa_engine.rb +300 -0
  25. data/lib/ccrypto/ruby/engines/scrypt_engine.rb +34 -0
  26. data/lib/ccrypto/ruby/engines/secret_key_engine.rb +18 -0
  27. data/lib/ccrypto/ruby/engines/secret_sharing_engine.rb +331 -0
  28. data/lib/ccrypto/ruby/engines/secure_random_engine.rb +34 -0
  29. data/lib/ccrypto/ruby/engines/x509_engine.rb +213 -0
  30. data/lib/ccrypto/ruby/ext/secret_key.rb +24 -0
  31. data/lib/ccrypto/ruby/ext/x509_cert.rb +24 -0
  32. data/lib/ccrypto/ruby/keybundle_store/pem_store.rb +73 -0
  33. data/lib/ccrypto/ruby/keybundle_store/pkcs12.rb +111 -0
  34. data/lib/ccrypto/ruby/utils/comparator.rb +15 -0
  35. data/lib/ccrypto/ruby/utils/memory_buffer.rb +63 -0
  36. data/lib/ccrypto/ruby/utils/native_helper.rb +17 -0
  37. data/lib/ccrypto/ruby/version.rb +7 -0
  38. data/lib/ccrypto/ruby.rb +25 -0
  39. metadata +136 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 19d85394d769795021b692546a1b3373f207245170fdb3643fe0cae3f61de767
4
+ data.tar.gz: 8801b56e4104f29d75c149b4cde284e9a472f84457a71adf362fa2d8cefe3549
5
+ SHA512:
6
+ metadata.gz: 4c638760828f593ae2821d2c7d2043c0edd7e3774a1e1ef65c5d8f9b050deb451e4a73548d89549568ddc41c160d3de1256e0bb4ff22ca8d6989999c50d986e2
7
+ data.tar.gz: 91ac3b9c37c7f4fc39ba7eb1e727017e30eec7a2f809b74390a22634f35c5f4f813fe0d072a0099ae4073721586abbde9e01fac6fbf54965c077c6722aa97af8
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Specify your gem's dependencies in ccrypto-ruby.gemspec
6
+ gemspec
7
+
8
+ gem "rake", "~> 13.0"
9
+
10
+ gem "rspec", "~> 3.0"
11
+
12
+ #gem "ccrypto", git: "ccrypto", branch: 'main'
data/Gemfile.lock ADDED
@@ -0,0 +1,64 @@
1
+ GIT
2
+ remote: ccrypto
3
+ revision: 0d1c446d77fb781857f5ac087de9326bc3dafca9
4
+ branch: main
5
+ specs:
6
+ ccrypto (0.1.0)
7
+ activesupport
8
+ teLogger
9
+ toolrack
10
+
11
+ PATH
12
+ remote: .
13
+ specs:
14
+ ccrypto-ruby (0.1.0)
15
+ teLogger
16
+ toolrack
17
+
18
+ GEM
19
+ remote: https://rubygems.org/
20
+ specs:
21
+ activesupport (7.0.3.1)
22
+ concurrent-ruby (~> 1.0, >= 1.0.2)
23
+ i18n (>= 1.6, < 2)
24
+ minitest (>= 5.1)
25
+ tzinfo (~> 2.0)
26
+ base58 (0.2.3)
27
+ concurrent-ruby (1.1.10)
28
+ diff-lcs (1.5.0)
29
+ i18n (1.12.0)
30
+ concurrent-ruby (~> 1.0)
31
+ minitest (5.16.2)
32
+ rake (13.0.6)
33
+ rspec (3.11.0)
34
+ rspec-core (~> 3.11.0)
35
+ rspec-expectations (~> 3.11.0)
36
+ rspec-mocks (~> 3.11.0)
37
+ rspec-core (3.11.0)
38
+ rspec-support (~> 3.11.0)
39
+ rspec-expectations (3.11.0)
40
+ diff-lcs (>= 1.2.0, < 2.0)
41
+ rspec-support (~> 3.11.0)
42
+ rspec-mocks (3.11.1)
43
+ diff-lcs (>= 1.2.0, < 2.0)
44
+ rspec-support (~> 3.11.0)
45
+ rspec-support (3.11.0)
46
+ teLogger (0.1.0)
47
+ tlogger (0.26.3)
48
+ toolrack (0.18.5)
49
+ base58
50
+ tlogger
51
+ tzinfo (2.0.5)
52
+ concurrent-ruby (~> 1.0)
53
+
54
+ PLATFORMS
55
+ x86_64-linux
56
+
57
+ DEPENDENCIES
58
+ ccrypto!
59
+ ccrypto-ruby!
60
+ rake (~> 13.0)
61
+ rspec (~> 3.0)
62
+
63
+ BUNDLED WITH
64
+ 2.2.28
data/README.md ADDED
@@ -0,0 +1,149 @@
1
+ # Ccrypto::Ruby
2
+
3
+ This project is the Ruby implementation for the [Ccrypto](https://github.com/cameronian/ccrypto) Common Crypto API.
4
+
5
+ This collection of API is meant to normalize the differences between runtimes.
6
+
7
+ Another notable implementation is [Java](https://github.com/cameronian/ccrypto-java).
8
+
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ ```ruby
15
+ gem 'ccrypto'
16
+ gem 'ccrypto-ruby'
17
+ ```
18
+
19
+ Note that gem 'ccrypto' need to precede 'ccrypto-ruby'
20
+
21
+ And then execute:
22
+
23
+ $ bundle install
24
+
25
+ Or install it yourself as:
26
+
27
+ $ gem install ccrypto
28
+ $ gem install ccrypto-ruby
29
+
30
+ ## Usage
31
+
32
+ All operations is driven by the config object in [Ccrypto](https://github.com/cameronian/ccrypto).
33
+
34
+ The following are some common operations that can easily be initiated via the respective config object.
35
+
36
+ The value of [Ccrypto](https://github.com/cameronian/ccrypto) is the following codes should have same result when run with Java runtime using [ccrypto-java](https://github.com/cameronian/ccrypto-java) gem.
37
+
38
+
39
+ ### Generate Secret Key
40
+
41
+ ```ruby
42
+ # Ccrypto::KeyConfig is the object for secret key generation
43
+ keyConfig = Ccrypto::KeyConfig.new
44
+ keyConfig.algo = :aes
45
+ keyConfig.keysize = 256
46
+
47
+ # instantiate the key generator by giving the class of Ccrypto::KeyConfig
48
+ # There are two ways to instantiate: with class and with instance.
49
+ # There are some engine which provides class methods which can be call when passing in the class.
50
+ # Engine that provides instance method requires to pass in the instance to instantiate.
51
+
52
+ keyGen = Ccrypto::AlgoFactory.engine(Ccrypto::KeyConfig)
53
+ key = keyGen.generate(keyConfig)
54
+ # key is now the AES key in 256 bits
55
+
56
+ ```
57
+
58
+ ### Encrypt & Decrypt with Secret Key
59
+
60
+ ```ruby
61
+
62
+ # generate key
63
+ keyConfig = Ccrypto::KeyConfig.new
64
+ keyConfig.algo = :aes
65
+ keyConfig.keysize = 256
66
+
67
+ keyGen = Ccrypto::AlgoFactory.engine(Ccrypto::KeyConfig)
68
+ key = keyGen.generate(keyConfig)
69
+
70
+ cipherConfig = Ccrypto::DirectCipherConfig.new({ algo: :aes, keysize: 256, mode: :gcm, padding: :pkcs5, key: key })
71
+
72
+ cipherConfig.cipherOps = :encrypt
73
+
74
+ # library shall generate missing component such as IV if required
75
+ # and store it back into the passed in config object
76
+ cipher = Ccrypto::AlgoFactory.engine(cipherConfig)
77
+
78
+ output = []
79
+ output << cipher.update(data)
80
+ output << cipher.update(data)
81
+
82
+ output << cipher.final
83
+
84
+ res = output.join
85
+
86
+ # Encryption done!
87
+ # res now is the encrypted data
88
+
89
+ ```
90
+
91
+
92
+ ### Decrypt with Secret Key
93
+
94
+ ```ruby
95
+
96
+ decConfig = Ccrypto::DirectCipherConfig.new({ algo: :aes, keysize: 256, mode: :gcm, padding: :pkcs5, key: key, iv: cipherConfig.iv })
97
+
98
+ # GCM mode has this additional tag
99
+ decConfig.auth_tag = cipherConfig.auth_tag
100
+
101
+ deCipher = Ccrypto::AlgoFactory.engine(decConfig)
102
+
103
+ dres = []
104
+ dres << deCipher.update(res)
105
+ dres << deCipher.final
106
+
107
+ # decryption done!
108
+ # dres is the decrypted output
109
+
110
+ ```
111
+
112
+
113
+ ### Digest / Hashing
114
+
115
+ ```ruby
116
+
117
+ digest = Ccrypto::AlgoFactory.engine(Ccrypto::DigestConfig)
118
+
119
+ digest.digest_update("data to be digested")
120
+ res = digest.digest_final
121
+
122
+ # res is the digest output in String
123
+
124
+ hres = digest.digest_final(:hex)
125
+ # hres is the digest output converted to hex
126
+
127
+ b64res = digest.digest_final(:b64)
128
+ # b64res is the digest output converted to Base64
129
+
130
+ ```
131
+
132
+
133
+ ### ECC key generation
134
+
135
+ ```ruby
136
+ # set the required curve name
137
+ eccConfig = CCrypto::ECCConfig.new("secp256k1")
138
+ ecc = Ccrypto::AlgoFactory.engine(Ccrypto::ECCConfig)
139
+ eccKey = ecc.generate_keypair
140
+
141
+ # eccKey shall be a ECC keypair
142
+
143
+ ```
144
+
145
+
146
+ Refers to spec inside spec/ccrypto/xxx\_spec.rb
147
+
148
+
149
+
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
+
6
+ require 'devops_assist'
7
+
8
+ RSpec::Core::RakeTask.new(:spec)
9
+
10
+ task default: :spec
data/bin/console ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "bundler/setup"
5
+ require "ccrypto/ruby"
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ require "irb"
15
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/ccrypto/ruby/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "ccrypto-ruby"
7
+ spec.version = Ccrypto::Ruby::VERSION
8
+ spec.authors = ["Ian"]
9
+ spec.email = ["cameronian0@protonmail.com"]
10
+
11
+ spec.summary = "Ccrypto API provider for Ruby runtime"
12
+ spec.description = "Refers Ccrypto library for further info. This is the Ruby implementation of the core cryptographic API"
13
+ spec.homepage = "https://github.com/cameronian/ccrypto-ruby"
14
+ spec.required_ruby_version = ">= 2.4.0"
15
+
16
+ #spec.metadata["allowed_push_host"] = "TODO: Set to your gem server 'https://example.com'"
17
+
18
+ #spec.metadata["homepage_uri"] = spec.homepage
19
+ #spec.metadata["source_code_uri"] = "TODO: Put your gem's public repo URL here."
20
+ #spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
21
+
22
+ # Specify which files should be added to the gem when it is released.
23
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
24
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
25
+ `git ls-files -z`.split("\x0").reject do |f|
26
+ (f == __FILE__) || f.match(%r{\A(?:(?:test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
27
+ end
28
+ end
29
+ spec.bindir = "exe"
30
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
31
+ spec.require_paths = ["lib"]
32
+
33
+ spec.add_dependency 'teLogger'
34
+ spec.add_dependency 'toolrack'
35
+
36
+ spec.add_dependency 'ccrypto'
37
+
38
+ spec.add_development_dependency 'devops_assist'
39
+
40
+ # Uncomment to register a new dependency of your gem
41
+ # spec.add_dependency "example-gem", "~> 1.0"
42
+
43
+ # For more information and examples about making a new gem, checkout our
44
+ # guide at: https://bundler.io/guides/creating_gem.html
45
+ end
@@ -0,0 +1,175 @@
1
+
2
+ require_relative 'ruby/engines/ecc_engine'
3
+ require_relative 'ruby/engines/digest_engine'
4
+ require_relative 'ruby/engines/x509_engine'
5
+
6
+ require_relative 'ruby/engines/scrypt_engine'
7
+ require_relative 'ruby/engines/hkdf_engine'
8
+ require_relative 'ruby/engines/pbkdf2_engine'
9
+
10
+ require_relative 'ruby/engines/secure_random_engine'
11
+ require_relative 'ruby/engines/cipher_engine'
12
+
13
+ require_relative 'ruby/utils/comparator'
14
+ require_relative 'ruby/utils/memory_buffer'
15
+ require_relative 'ruby/utils/native_helper'
16
+
17
+ require_relative 'ruby/engines/asn1_engine'
18
+ require_relative 'ruby/engines/compression_engine'
19
+ require_relative 'ruby/engines/decompression_engine'
20
+
21
+ require_relative 'ruby/engines/secret_key_engine'
22
+ require_relative 'ruby/engines/hmac_engine'
23
+
24
+ require_relative 'ruby/engines/data_conversion_engine'
25
+
26
+ require_relative 'ruby/engines/secret_sharing_engine'
27
+
28
+ require_relative 'ruby/engines/pkcs7_engine'
29
+
30
+ require_relative 'ruby/engines/rsa_engine'
31
+
32
+ module Ccrypto
33
+ module Ruby
34
+ class Provider
35
+
36
+ def self.provider_name
37
+ "ruby"
38
+ end
39
+
40
+ def self.algo_instance(*args, &block)
41
+ config = args.first
42
+
43
+ if config.is_a?(Class) or config.is_a?(Module)
44
+ if config == Ccrypto::ECCConfig
45
+ ECCEngine
46
+ elsif config == Ccrypto::RSAConfig
47
+ RSAEngine
48
+ elsif config == Ccrypto::ECCKeyBundle
49
+ ECCKeyBundle
50
+ elsif config == Ccrypto::RSAKeyBundle
51
+ RSAKeyBundle
52
+ elsif config == Ccrypto::DigestConfig
53
+ DigestEngine
54
+ elsif config == Ccrypto::SecureRandomConfig
55
+ SecureRandomEngine
56
+ elsif config == Ccrypto::CipherConfig
57
+ CipherEngine
58
+ elsif config == Ccrypto::ECCPublicKey
59
+ Ccrypto::Ruby::ECCPublicKey
60
+ elsif config == Ccrypto::KeyConfig
61
+ Ccrypto::Ruby::SecretKeyEngine
62
+ elsif config == Ccrypto::SecretSharingConfig
63
+ SecretSharingEngine
64
+ else
65
+ raise CcryptoProviderException, "Config class '#{config}' is not supported for provider '#{self.provider_name}'"
66
+ end
67
+ else
68
+ case config
69
+ when Ccrypto::ECCConfig
70
+ ECCEngine.new(*args, &block)
71
+ when Ccrypto::RSAConfig
72
+ RSAEngine.new(*args, &block)
73
+ when Ccrypto::DigestConfig
74
+ DigestEngine.instance(*args, &block)
75
+ when Ccrypto::X509::CertProfile
76
+ X509Engine.new(*args,&block)
77
+ when Ccrypto::ScryptConfig
78
+ ScryptEngine.new(*args,&block)
79
+ when Ccrypto::HKDFConfig
80
+ HKDFEngine.new(*args, &block)
81
+ when Ccrypto::PBKDF2Config
82
+ PBKDF2Engine.new(*args, &block)
83
+ when Ccrypto::CipherConfig
84
+ CipherEngine.new(*args, &block)
85
+ when Ccrypto::HMACConfig
86
+ HMACEngine.new(*args, &block)
87
+ when Ccrypto::SecretSharingConfig
88
+ SecretSharingEngine.new(*args,&block)
89
+ when Ccrypto::PKCS7Config
90
+ PKCS7Engine.new(*args, &block)
91
+ else
92
+ raise CcryptoProviderException, "Config instance '#{config}' is not supported for provider '#{self.provider_name}'"
93
+ end
94
+ end
95
+
96
+ #case config
97
+ #when Ccrypto::ECCConfig.class
98
+ # puts "ecc config class"
99
+ # ECCEngine
100
+ #when Ccrypto::ECCConfig
101
+ # puts "ecc config"
102
+ # ECCEngine.new(*args, &block)
103
+ #when Ccrypto::DigestConfig.class
104
+ # puts "digest config class"
105
+ # DigestEngine
106
+ #when Ccrypto::DigestConfig
107
+ # puts "digest config"
108
+ # DigestEngine.instance(*args,&block)
109
+ #else
110
+ # raise CcryptoProviderException, "Config '#{config}' is not supported for provider '#{self.provider_name}'"
111
+ #end
112
+
113
+ #case algo
114
+ #when :ecc
115
+ # ECCEngine
116
+ #when :x509
117
+ # if args.length > 1
118
+ # X509Engine.new(*args[1..-1])
119
+ # else
120
+ # X509Engine
121
+ # end
122
+ #when :scrypt
123
+ # ScryptEngine.new
124
+ #when :secure_random
125
+ # SecureRandomEngine
126
+ #else
127
+ # if DigestEngine.is_supported?(algo)
128
+ # DigestEngine.instance(algo)
129
+ # elsif CipherEngine.is_supported_cipher?(algo.to_s)
130
+ # if args.length > 1 or args[0].is_a?(String)
131
+ # CipherEngine.new(*args)
132
+ # else
133
+ # CipherEngine
134
+ # end
135
+ # else
136
+ # raise CcryptoProviderException, "Algo '#{algo}' is not supported for provider '#{self.provider_name}'"
137
+ # end
138
+ #end
139
+
140
+ end
141
+
142
+ def self.asn1_engine(*args, &block)
143
+ ASN1Engine
144
+ end
145
+
146
+ def self.util_instance(*args, &block)
147
+ type = args.first
148
+ case type
149
+ when :comparator, :compare
150
+ ComparatorUtil
151
+ when :data_conversion, :converter, :data_converter
152
+ DataConversionEngine
153
+
154
+ when :memory_buffer, :membuf, :buffer, :mem
155
+ MemoryBuffer
156
+
157
+ when :compression, :compressor
158
+ Compression.new(*(args[1..-1]), &block)
159
+
160
+ when :decompression
161
+ Decompression.new(*(args[1..-1]), &block)
162
+
163
+ when :native_helper
164
+ NativeHelper
165
+
166
+ else
167
+ raise CcryptoProviderException, "Util type #{type} is not supported by provider #{self.provider_name}"
168
+ end
169
+ end
170
+
171
+ end
172
+ end
173
+ end
174
+
175
+
@@ -0,0 +1,68 @@
1
+ require 'base64'
2
+
3
+ module Ccrypto
4
+ module Ruby
5
+ module DataConversion
6
+
7
+ def to_hex(bin, opts = { })
8
+ if not bin.nil?
9
+ bin.each_byte.map { |b| b.to_s(16).rjust(2,'0') }.join
10
+ else
11
+ bin
12
+ end
13
+ end
14
+
15
+ def from_hex(str, opts = { })
16
+ if not str.nil?
17
+ str.scan(/../).map { |x| x.hex.chr }.join
18
+ else
19
+ str
20
+ end
21
+ end
22
+
23
+ def to_b64(bin, opts = { })
24
+ if not bin.nil?
25
+ if not (opts[:strict].nil? and opts[:strict] == true)
26
+ Base64.encode64(bin)
27
+ else
28
+ Base64.strict_encode64(bin)
29
+ end
30
+ else
31
+ bin
32
+ end
33
+ end
34
+
35
+ def from_b64(str, opts = { })
36
+ if not str.nil?
37
+ if not (opts[:strict].nil? and opts[:strict] == true)
38
+ Base64.decode64(str)
39
+ else
40
+ Base64.strict_decode64(str)
41
+ end
42
+ else
43
+ str
44
+ end
45
+ end
46
+
47
+ def to_int_array(str, opts = { })
48
+ if not str.nil?
49
+ str.each_char.map { |c| c.ord }
50
+ else
51
+ str
52
+ end
53
+ end
54
+
55
+ #
56
+ # Add the methods to class level
57
+ #
58
+ def self.included(klass)
59
+ klass.class_eval <<-END
60
+ extend Ccrypto::Ruby::DataConversion
61
+ END
62
+ end
63
+
64
+ end
65
+ # end module Converter
66
+ #
67
+ end
68
+ end
@@ -0,0 +1,110 @@
1
+
2
+ require_relative 'asn1_object'
3
+
4
+ module Ccrypto
5
+ module Ruby
6
+
7
+ class ASN1Engine
8
+ include TR::CondUtils
9
+
10
+ def self.build(*args, &block)
11
+ type = args.first
12
+ val = args[1]
13
+ case type
14
+ when :oid
15
+ ASN1Object.new(type, OpenSSL::ASN1::ObjectId.new(val))
16
+ when :seq
17
+ ASN1Object.new(type, OpenSSL::ASN1::Sequence.new(val))
18
+ when :str, :utf8_str
19
+ ASN1Object.new(type, OpenSSL::ASN1::UTF8String.new(val))
20
+ when :octet_str
21
+ ASN1Object.new(type, OpenSSL::ASN1::OctetString.new(val))
22
+ when :int
23
+ ASN1Object.new(type, OpenSSL::ASN1::Integer.new(val))
24
+ when :bin
25
+ ASN1Object.new(type, OpenSSL::ASN1::BitString.new(val))
26
+ when :date, :time, :generalize_time
27
+ ASN1Object.new(type, OpenSSL::ASN1::GeneralizedTime.new(val))
28
+ else
29
+ raise ASN1EngineException, "Unknown ASN1 object type '#{type.class}'"
30
+ end
31
+ end
32
+
33
+ def self.to_value(*args, &block)
34
+ val = args.first
35
+ expectedType = args[1]
36
+ v = OpenSSL::ASN1.decode(val).value
37
+ if not_empty?(expectedType)
38
+ case expectedType
39
+ when :int
40
+ if v.is_a?(OpenSSL::BN)
41
+ v.to_i
42
+ else
43
+ v
44
+ end
45
+ else
46
+ v
47
+ end
48
+ else
49
+ if v.is_a?(OpenSSL::BN)
50
+ v.to_i
51
+ else
52
+ v
53
+ end
54
+ end
55
+ end
56
+
57
+ def self.asn1_length(*args, &block)
58
+
59
+ val = args.first
60
+ if not_empty?(val)
61
+
62
+ v = val
63
+ if v.is_a?(ASN1Object)
64
+ v = v.native_asn1
65
+ end
66
+
67
+ totalLen = 0
68
+ begin
69
+ OpenSSL::ASN1.traverse(v) do |depth,offset,headerLen,length,constructed,tagClass,tag|
70
+ totalLen = headerLen+length
71
+ break
72
+ end
73
+ rescue StandardError => ex
74
+ rescue OpenSSL::ASN1::ASN1Error => ex
75
+ raise ASN1EngineException, ex
76
+ end
77
+
78
+ totalLen
79
+
80
+ else
81
+ 0
82
+ end
83
+
84
+
85
+ end
86
+
87
+ def self.openssl_to_asn1object(oasn1)
88
+ case oasn1
89
+ when OpenSSL::ASN1::ObjectId
90
+ type = :oid
91
+ when OpenSSL::ASN1::Sequence
92
+ type = :seq
93
+ when OpenSSL::ASN1::UTF8String
94
+ type = :str
95
+ when OpenSSL::ASN1::OctetString
96
+ type = :octet_str
97
+ when OpenSSL::ASN1::Integer
98
+ type = :int
99
+ when OpenSSL::ASN1::BitString
100
+ type = :bin
101
+ when OpenSSL::ASN1::GeneralizedTime
102
+ type = :time
103
+ end
104
+
105
+ ASN1Object.new(:oid, oasn1)
106
+ end
107
+
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,19 @@
1
+
2
+
3
+ module Ccrypto
4
+ module Ruby
5
+ class ASN1Object < Ccrypto::ASN1Object
6
+
7
+ def to_bin
8
+ case @asn1
9
+ when OpenSSL::ASN1::Sequence
10
+ seq = OpenSSL::ASN1::Sequence.new(@asn1.map { |e| e.to_der })
11
+ seq.to_der
12
+ else
13
+ @asn1.to_der
14
+ end
15
+ end
16
+
17
+ end
18
+ end
19
+ end