binenc-java 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/Gemfile +13 -0
- data/Gemfile.lock +78 -0
- data/README.md +35 -0
- data/Rakefile +10 -0
- data/binenc-java.gemspec +45 -0
- data/jars/bcmail-jdk15on-165.jar +0 -0
- data/jars/bcpg-jdk15on-165.jar +0 -0
- data/jars/bcpkix-jdk15on-165.jar +0 -0
- data/jars/bcprov-ext-jdk15on-165.jar +0 -0
- data/jars/bcprov-jdk15on-165.jar +0 -0
- data/jars/bctls-jdk15on-165.jar +0 -0
- data/lib/binenc/asn1_engine/asn1_engine.rb +33 -0
- data/lib/binenc/asn1_engine/asn1_object.rb +78 -0
- data/lib/binenc/asn1_engine/object/binary.rb +25 -0
- data/lib/binenc/asn1_engine/object/datetime.rb +35 -0
- data/lib/binenc/asn1_engine/object/integer.rb +20 -0
- data/lib/binenc/asn1_engine/object/oid.rb +16 -0
- data/lib/binenc/asn1_engine/object/sequence.rb +154 -0
- data/lib/binenc/asn1_engine/object/string.rb +25 -0
- data/lib/binenc/data_conversion.rb +73 -0
- data/lib/binenc/factory/bin_struct_factory.rb +14 -0
- data/lib/binenc/factory/sbl_factory/sbl_dsl.rb +169 -0
- data/lib/binenc/factory/sbl_factory/sbl_factory.rb +103 -0
- data/lib/binenc/java/version.rb +7 -0
- data/lib/binenc/java.rb +27 -0
- data/lib/binenc/provider.rb +41 -0
- data/sig/binenc/java.rbs +6 -0
- metadata +126 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a3ff5a49611f9e67b97f742acd87debdc32b2694c9790a2ebeb4bc4f9f3f9166
|
4
|
+
data.tar.gz: ce244062aeb2762574838c619c3feb8aaa6331dd20a962be0819e203dc31be50
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7c0d5f3ee644f9b16aa193866c74a2ca5b6088e2f9e5d52e88ba648b0cd270181d074eec2d14d2cc42dc59e2fa68f311aa31d3a7d7cd2e11f6d50919343419f0
|
7
|
+
data.tar.gz: cd24cbe77105ecbb70ca8c089b443c97ab73a2bb0ad674dc0b911dff0cf602aa9205d01570425e36e3a623756589b8d4df180d30f3745ca050c62fd7a978a1a8
|
data/.rspec
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
binenc-java (0.1.0)
|
5
|
+
binenc
|
6
|
+
teLogger
|
7
|
+
toolrack
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: https://rubygems.org/
|
11
|
+
specs:
|
12
|
+
base58 (0.2.3)
|
13
|
+
binenc (0.1.0)
|
14
|
+
teLogger
|
15
|
+
toolrack
|
16
|
+
devops_assist (0.2.0)
|
17
|
+
git_cli
|
18
|
+
git_cli_prompt
|
19
|
+
gvcs
|
20
|
+
teLogger
|
21
|
+
toolrack
|
22
|
+
tty-prompt
|
23
|
+
diff-lcs (1.5.0)
|
24
|
+
git_cli (0.9.0)
|
25
|
+
gvcs
|
26
|
+
ptools (~> 1.4.0)
|
27
|
+
tlogger
|
28
|
+
toolrack
|
29
|
+
git_cli_prompt (0.2.2)
|
30
|
+
tlogger
|
31
|
+
toolrack
|
32
|
+
tty-prompt
|
33
|
+
gvcs (0.1.0)
|
34
|
+
pastel (0.8.0)
|
35
|
+
tty-color (~> 0.5)
|
36
|
+
ptools (1.4.2)
|
37
|
+
rake (13.0.6)
|
38
|
+
rspec (3.11.0)
|
39
|
+
rspec-core (~> 3.11.0)
|
40
|
+
rspec-expectations (~> 3.11.0)
|
41
|
+
rspec-mocks (~> 3.11.0)
|
42
|
+
rspec-core (3.11.0)
|
43
|
+
rspec-support (~> 3.11.0)
|
44
|
+
rspec-expectations (3.11.0)
|
45
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
46
|
+
rspec-support (~> 3.11.0)
|
47
|
+
rspec-mocks (3.11.1)
|
48
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
49
|
+
rspec-support (~> 3.11.0)
|
50
|
+
rspec-support (3.11.0)
|
51
|
+
teLogger (0.1.0)
|
52
|
+
tlogger (0.26.3)
|
53
|
+
toolrack (0.18.6)
|
54
|
+
base58
|
55
|
+
tlogger
|
56
|
+
tty-color (0.6.0)
|
57
|
+
tty-cursor (0.7.1)
|
58
|
+
tty-prompt (0.23.1)
|
59
|
+
pastel (~> 0.8)
|
60
|
+
tty-reader (~> 0.8)
|
61
|
+
tty-reader (0.9.0)
|
62
|
+
tty-cursor (~> 0.7)
|
63
|
+
tty-screen (~> 0.8)
|
64
|
+
wisper (~> 2.0)
|
65
|
+
tty-screen (0.8.1)
|
66
|
+
wisper (2.0.1)
|
67
|
+
|
68
|
+
PLATFORMS
|
69
|
+
universal-java-11
|
70
|
+
|
71
|
+
DEPENDENCIES
|
72
|
+
binenc-java!
|
73
|
+
devops_assist
|
74
|
+
rake (~> 13.0)
|
75
|
+
rspec (~> 3.0)
|
76
|
+
|
77
|
+
BUNDLED WITH
|
78
|
+
2.3.6
|
data/README.md
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# Binenc::Java
|
2
|
+
|
3
|
+
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/binenc/java`. To experiment with that code, run `bin/console` for an interactive prompt.
|
4
|
+
|
5
|
+
TODO: Delete this and the text above, and describe your gem
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'binenc-java'
|
13
|
+
```
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle install
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install binenc-java
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
TODO: Write usage instructions here
|
26
|
+
|
27
|
+
## Development
|
28
|
+
|
29
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
30
|
+
|
31
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
32
|
+
|
33
|
+
## Contributing
|
34
|
+
|
35
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/binenc-java.
|
data/Rakefile
ADDED
data/binenc-java.gemspec
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "lib/binenc/java/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "binenc-java"
|
7
|
+
spec.version = Binenc::Java::VERSION
|
8
|
+
spec.authors = ["Ian"]
|
9
|
+
spec.email = ["cameronian0@protonmail.com"]
|
10
|
+
|
11
|
+
spec.summary = ""
|
12
|
+
spec.description = ""
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.required_ruby_version = ">= 2.6.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(?:(?:bin|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 'binenc'
|
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, check out our
|
44
|
+
# guide at: https://bundler.io/guides/creating_gem.html
|
45
|
+
end
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,33 @@
|
|
1
|
+
|
2
|
+
require_relative 'asn1_object'
|
3
|
+
|
4
|
+
module Binenc
|
5
|
+
module Java
|
6
|
+
class ASN1Engine
|
7
|
+
|
8
|
+
def object(type, *args)
|
9
|
+
case type
|
10
|
+
when :bin, :binary
|
11
|
+
ASN1Binary.new(*args)
|
12
|
+
when :str, :string
|
13
|
+
ASN1String.new(*args)
|
14
|
+
when :int, :integer, :number, :num
|
15
|
+
ASN1Integer.new(*args)
|
16
|
+
when :seq, :sequence
|
17
|
+
ASN1Sequence.new(*args)
|
18
|
+
when :date, :datetime, :time
|
19
|
+
ASN1DateTime.new(*args)
|
20
|
+
when :oid
|
21
|
+
ASN1OID.new(*args)
|
22
|
+
else
|
23
|
+
raise BinencEngineException, "Unknown ASN1 object '#{type}'"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def from_bin(bin)
|
28
|
+
ASN1Object.decode(bin)
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
|
2
|
+
require 'binenc'
|
3
|
+
|
4
|
+
require_relative '../data_conversion'
|
5
|
+
|
6
|
+
module Binenc
|
7
|
+
module Java
|
8
|
+
module ASN1Object
|
9
|
+
include Binenc::BinaryObject
|
10
|
+
include TR::CondUtils
|
11
|
+
include DataConversion
|
12
|
+
|
13
|
+
attr_accessor :value
|
14
|
+
|
15
|
+
def initialize(*args, &block)
|
16
|
+
@value = args.first
|
17
|
+
end
|
18
|
+
|
19
|
+
def is_equal?(val)
|
20
|
+
@value == val
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.decode(bin)
|
24
|
+
if not_empty?(bin)
|
25
|
+
|
26
|
+
begin
|
27
|
+
ais = ::Java::OrgBouncycastleAsn1::ASN1InputStream.new(to_java_bytes(bin))
|
28
|
+
obj = ais.readObject
|
29
|
+
|
30
|
+
case obj
|
31
|
+
when ::Java::OrgBouncycastleAsn1::DERBitString
|
32
|
+
ASN1Binary.new(obj.bytes)
|
33
|
+
when ::Java::OrgBouncycastleAsn1::DERUTF8String
|
34
|
+
ASN1String.new(obj.to_s)
|
35
|
+
when ::Java::OrgBouncycastleAsn1::ASN1Integer
|
36
|
+
ASN1Integer.new(obj.value)
|
37
|
+
when ::Java::OrgBouncycastleAsn1::DERSequence, ::Java::OrgBouncycastleAsn1::DLSequence
|
38
|
+
ASN1Sequence.new(obj.to_a)
|
39
|
+
when ::Java::OrgBouncycastleAsn1::ASN1GeneralizedTime
|
40
|
+
ASN1DateTime.new(obj.date)
|
41
|
+
when ::Java::OrgBouncycastleAsn1::ASN1ObjectIdentifier
|
42
|
+
ASN1OID.new(obj.id)
|
43
|
+
else
|
44
|
+
raise BinencEngineException, "Unhandled ASN1 object '#{obj.class}'"
|
45
|
+
end
|
46
|
+
rescue ::Java::JavaIo::IOException => ex
|
47
|
+
raise BinencDecodingError, ex
|
48
|
+
end
|
49
|
+
|
50
|
+
else
|
51
|
+
raise BinencEngineException, "Cannot decode empty binary #{bin}"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
def self.logger
|
57
|
+
if @logger.nil?
|
58
|
+
@logger = TeLogger::Tlogger.new
|
59
|
+
@logger.tag = :java_asn1Obj
|
60
|
+
end
|
61
|
+
@logger
|
62
|
+
end
|
63
|
+
|
64
|
+
def logger
|
65
|
+
self.class.logger
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
Dir.glob(File.join(File.dirname(__FILE__),"object","*.rb")) do |f|
|
75
|
+
require_relative f
|
76
|
+
end
|
77
|
+
|
78
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Binenc
|
4
|
+
module Java
|
5
|
+
|
6
|
+
class ASN1Binary
|
7
|
+
include ASN1Object
|
8
|
+
|
9
|
+
def encoded(binary = true)
|
10
|
+
obj = org.bouncycastle.asn1.DERBitString.new(to_java_bytes(@value))
|
11
|
+
|
12
|
+
if binary
|
13
|
+
obj.encoded
|
14
|
+
else
|
15
|
+
obj
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def is_equal?(val)
|
20
|
+
@value == to_java_bytes(val)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Binenc
|
4
|
+
module Java
|
5
|
+
|
6
|
+
class ASN1DateTime
|
7
|
+
include ASN1Object
|
8
|
+
|
9
|
+
def encoded(binary = true)
|
10
|
+
raise BinencEngineException, "Given value is not a Time object. #{@value.class}" if not (@value.is_a?(Time) or @value.is_a?(java.util.Date))
|
11
|
+
obj = org.bouncycastle.asn1.DERGeneralizedTime.new(@value)
|
12
|
+
if binary
|
13
|
+
obj.encoded
|
14
|
+
else
|
15
|
+
obj
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def is_equal?(val)
|
20
|
+
|
21
|
+
case val
|
22
|
+
when Integer
|
23
|
+
@value.time.to_i == val
|
24
|
+
when Time
|
25
|
+
@value.time.to_i == val.to_i*1000
|
26
|
+
else
|
27
|
+
@value == val
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,154 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Binenc
|
4
|
+
module Java
|
5
|
+
|
6
|
+
class ASN1Sequence
|
7
|
+
include ASN1Object
|
8
|
+
|
9
|
+
def initialize(*args, &block)
|
10
|
+
super
|
11
|
+
@value = to_value(@value)
|
12
|
+
end
|
13
|
+
|
14
|
+
def encoded(binary = true)
|
15
|
+
@value = [@value] if not @value.is_a?(Array)
|
16
|
+
value = to_encoded(@value)
|
17
|
+
obj = org.bouncycastle.asn1.DERSequence.new(value)
|
18
|
+
|
19
|
+
if binary
|
20
|
+
obj.encoded
|
21
|
+
else
|
22
|
+
obj
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def is_equal?(val)
|
27
|
+
|
28
|
+
if @value.length == val.length
|
29
|
+
res = true
|
30
|
+
@value.each do |e|
|
31
|
+
if not val.include?(e)
|
32
|
+
res = false
|
33
|
+
break
|
34
|
+
end
|
35
|
+
end
|
36
|
+
res
|
37
|
+
else
|
38
|
+
false
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
def is_binary_string?(str)
|
44
|
+
not str.ascii_only?
|
45
|
+
end
|
46
|
+
|
47
|
+
def to_encoded(val)
|
48
|
+
|
49
|
+
if not val.nil?
|
50
|
+
val = [val] if not val.is_a?(Array)
|
51
|
+
|
52
|
+
v = val.map do |e|
|
53
|
+
|
54
|
+
case e
|
55
|
+
when Integer
|
56
|
+
ASN1Integer.new(e).encoded(false)
|
57
|
+
when String
|
58
|
+
if is_binary_string?(e)
|
59
|
+
ASN1Binary.new(e).encoded(false)
|
60
|
+
else
|
61
|
+
ASN1String.new(e).encoded(false)
|
62
|
+
end
|
63
|
+
when ::Java::byte[]
|
64
|
+
ASN1Binary.new(e).encoded(false)
|
65
|
+
when Array
|
66
|
+
ASN1Sequence.new(e).encoded(false)
|
67
|
+
when Time, java.util.Date
|
68
|
+
ASN1DateTime.new(e).encoded(false)
|
69
|
+
|
70
|
+
when ::Java::OrgBouncycastleAsn1::DERBitString
|
71
|
+
ASN1Binary.new(e.bytes).encoded(false)
|
72
|
+
when ::Java::OrgBouncycastleAsn1::DERUTF8String
|
73
|
+
ASN1String.new(e.to_s).encoded(false)
|
74
|
+
when ::Java::OrgBouncycastleAsn1::ASN1Integer
|
75
|
+
ASN1Integer.new(e.value).encoded(false)
|
76
|
+
when ::Java::OrgBouncycastleAsn1::DERSequence, ::Java::OrgBouncycastleAsn1::DLSequence
|
77
|
+
ASN1Sequence.new(e.to_a).encoded(false)
|
78
|
+
when ::Java::OrgBouncycastleAsn1::ASN1GeneralizedTime
|
79
|
+
ASN1DateTime.new(e.date).encoded(false)
|
80
|
+
when ::Java::OrgBouncycastleAsn1::ASN1ObjectIdentifier
|
81
|
+
ASN1OID.new(e.id).encoded(false)
|
82
|
+
else
|
83
|
+
logger.debug "Oopss #{e} / #{e.class}"
|
84
|
+
nil
|
85
|
+
end
|
86
|
+
|
87
|
+
end # map
|
88
|
+
|
89
|
+
v.delete_if { |e| e.nil? }
|
90
|
+
|
91
|
+
vec = org.bouncycastle.asn1.ASN1EncodableVector.new
|
92
|
+
v.each do |ve|
|
93
|
+
vec.add(ve)
|
94
|
+
end
|
95
|
+
vec
|
96
|
+
|
97
|
+
else
|
98
|
+
org.bouncycastle.asn1.ASN1EncodableVector.new
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
def to_value(arr)
|
105
|
+
|
106
|
+
if not arr.nil?
|
107
|
+
arr = [arr] if not arr.is_a?(Array)
|
108
|
+
|
109
|
+
arr.map do |e|
|
110
|
+
case e
|
111
|
+
when ::Java::byte[]
|
112
|
+
ASN1Object.decode(e).value
|
113
|
+
when ::Java::OrgBouncycastleAsn1::ASN1Object
|
114
|
+
case e
|
115
|
+
when ::Java::OrgBouncycastleAsn1::DERBitString
|
116
|
+
String.from_java_bytes(e.bytes)
|
117
|
+
when ::Java::OrgBouncycastleAsn1::DERUTF8String
|
118
|
+
e.to_s
|
119
|
+
when ::Java::OrgBouncycastleAsn1::ASN1Integer
|
120
|
+
e.value
|
121
|
+
when ::Java::OrgBouncycastleAsn1::DERSequence, ::Java::OrgBouncycastleAsn1::DLSequence
|
122
|
+
to_value(e.to_a)
|
123
|
+
when ::Java::OrgBouncycastleAsn1::ASN1GeneralizedTime
|
124
|
+
d = e.date
|
125
|
+
Time.at(d.time/1000)
|
126
|
+
when ::Java::OrgBouncycastleAsn1::ASN1ObjectIdentifier
|
127
|
+
e.id
|
128
|
+
else
|
129
|
+
raise BinencEngineException, "Unhandled ASN1 object '#{obj.class}'"
|
130
|
+
end
|
131
|
+
else
|
132
|
+
e
|
133
|
+
end
|
134
|
+
|
135
|
+
end # map
|
136
|
+
|
137
|
+
else
|
138
|
+
[]
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
142
|
+
|
143
|
+
def logger
|
144
|
+
if @logger.nil?
|
145
|
+
@logger = TeLogger::Tlogger.new
|
146
|
+
@logger.tag = :asn1_seq
|
147
|
+
end
|
148
|
+
@logger
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
152
|
+
|
153
|
+
end
|
154
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Binenc
|
4
|
+
module Java
|
5
|
+
|
6
|
+
class ASN1String
|
7
|
+
include ASN1Object
|
8
|
+
|
9
|
+
def encoded(binary = true)
|
10
|
+
obj = org.bouncycastle.asn1.DERUTF8String.new(@value.to_s)
|
11
|
+
if binary
|
12
|
+
obj.encoded
|
13
|
+
else
|
14
|
+
obj
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def is_equal?(val)
|
19
|
+
@value.bytes == val.bytes
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
|
2
|
+
module Binenc
|
3
|
+
module Java
|
4
|
+
module DataConversion
|
5
|
+
|
6
|
+
def to_hex(bin)
|
7
|
+
String.from_java_bytes(org.bouncycastle.util.encoders.Hex.encode(bin))
|
8
|
+
end
|
9
|
+
# end to_hex
|
10
|
+
|
11
|
+
def from_hex(str)
|
12
|
+
org.bouncycastle.util.encoders.Hex.decode(str)
|
13
|
+
end
|
14
|
+
# end from_hex
|
15
|
+
|
16
|
+
def to_b64(bin)
|
17
|
+
String.from_java_bytes(java.util.Base64.encoder.encode(bin))
|
18
|
+
end
|
19
|
+
# end to_b64
|
20
|
+
#
|
21
|
+
|
22
|
+
def to_b64_mime(bin)
|
23
|
+
String.from_java_bytes(java.util.Base64.mime_encoder.encode(bin))
|
24
|
+
end
|
25
|
+
|
26
|
+
def from_b64(str)
|
27
|
+
java.util.Base64.decoder.decode(str)
|
28
|
+
end
|
29
|
+
# end from_b64
|
30
|
+
|
31
|
+
def to_str(bin)
|
32
|
+
if bin.is_a?(::Java::byte[])
|
33
|
+
String.from_java_bytes(bin)
|
34
|
+
else
|
35
|
+
bin
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def to_bin(str)
|
40
|
+
if str.nil?
|
41
|
+
::Java::byte[0].new
|
42
|
+
else
|
43
|
+
str.to_java.getBytes
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def to_java_bytes(val, encoding = nil)
|
48
|
+
case val
|
49
|
+
when String
|
50
|
+
val.to_java_bytes
|
51
|
+
when java.lang.String
|
52
|
+
if not_empty?(encoding)
|
53
|
+
val.getBytes(encoding)
|
54
|
+
else
|
55
|
+
val.getBytes
|
56
|
+
end
|
57
|
+
else
|
58
|
+
val
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
#
|
63
|
+
# Add the methods to class level
|
64
|
+
#
|
65
|
+
def self.included(klass)
|
66
|
+
klass.class_eval <<-END
|
67
|
+
extend Binenc::Java::DataConversion
|
68
|
+
END
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,169 @@
|
|
1
|
+
|
2
|
+
require_relative '../../asn1_engine/asn1_engine'
|
3
|
+
|
4
|
+
module Binenc
|
5
|
+
module Java
|
6
|
+
|
7
|
+
# Simple Binary Layout Domain Specific Language (DSL)
|
8
|
+
module SBLDSL
|
9
|
+
include TR::CondUtils
|
10
|
+
|
11
|
+
def bin(*args)
|
12
|
+
name = args.first
|
13
|
+
val = args[1]
|
14
|
+
|
15
|
+
raise BinencEngineException, "Name '#{name}' already defined" if keyRegister.keys.include?(name)
|
16
|
+
|
17
|
+
# register name with field type
|
18
|
+
keyRegister[name] = :bin
|
19
|
+
# create instance method dynamically with given name
|
20
|
+
create_instance_method(name, val)
|
21
|
+
# keep the name in sequence as in the layout
|
22
|
+
structure << name
|
23
|
+
end
|
24
|
+
|
25
|
+
def int(*args)
|
26
|
+
name = args.first
|
27
|
+
val = args[1]
|
28
|
+
|
29
|
+
raise BinencEngineException, "Name '#{name}' already defined" if keyRegister.keys.include?(name)
|
30
|
+
|
31
|
+
# register name with field type
|
32
|
+
keyRegister[name] = :int
|
33
|
+
# create instance method dynamically with given name
|
34
|
+
create_instance_method(name, val)
|
35
|
+
# keep the name in sequence as in the layout
|
36
|
+
structure << name
|
37
|
+
end
|
38
|
+
|
39
|
+
def oid(*args)
|
40
|
+
name = args.first
|
41
|
+
val = args[1]
|
42
|
+
|
43
|
+
raise BinencEngineException, "Name '#{name}' already defined" if keyRegister.keys.include?(name)
|
44
|
+
|
45
|
+
# register name with field type
|
46
|
+
keyRegister[name] = :bin
|
47
|
+
# create instance method dynamically with given name
|
48
|
+
create_instance_method(name, val)
|
49
|
+
# keep the name in sequence as in the layout
|
50
|
+
structure << name
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
def str(*args)
|
55
|
+
name = args.first
|
56
|
+
val = args[1]
|
57
|
+
|
58
|
+
raise BinencEngineException, "Name '#{name}' already defined" if keyRegister.keys.include?(name)
|
59
|
+
|
60
|
+
# register name with field type
|
61
|
+
keyRegister[name] = :str
|
62
|
+
# create instance method dynamically with given name
|
63
|
+
create_instance_method(name, val)
|
64
|
+
# keep the name in sequence as in the layout
|
65
|
+
structure << name
|
66
|
+
end
|
67
|
+
|
68
|
+
def date(*args)
|
69
|
+
name = args.first
|
70
|
+
val = args[1]
|
71
|
+
|
72
|
+
raise BinencEngineException, "Name '#{name}' already defined" if keyRegister.keys.include?(name)
|
73
|
+
|
74
|
+
# register name with field type
|
75
|
+
keyRegister[name] = :time
|
76
|
+
# create instance method dynamically with given name
|
77
|
+
create_instance_method(name, val)
|
78
|
+
# keep the name in sequence as in the layout
|
79
|
+
structure << name
|
80
|
+
end
|
81
|
+
alias_method :time, :date
|
82
|
+
|
83
|
+
def seq(*args)
|
84
|
+
name = args.first
|
85
|
+
val = args[1]
|
86
|
+
|
87
|
+
raise BinencEngineException, "Name '#{name}' already defined" if keyRegister.keys.include?(name)
|
88
|
+
|
89
|
+
# register name with field type
|
90
|
+
keyRegister[name] = :seq
|
91
|
+
# create instance method dynamically with given name
|
92
|
+
create_instance_method(name, val)
|
93
|
+
# keep the name in sequence as in the layout
|
94
|
+
structure << name
|
95
|
+
end
|
96
|
+
|
97
|
+
private
|
98
|
+
def keyRegister
|
99
|
+
if @keyReg.nil?
|
100
|
+
@keyReg = { }
|
101
|
+
end
|
102
|
+
@keyReg
|
103
|
+
end
|
104
|
+
|
105
|
+
def structure
|
106
|
+
if @struct.nil?
|
107
|
+
@struct = []
|
108
|
+
end
|
109
|
+
@struct
|
110
|
+
end
|
111
|
+
|
112
|
+
def create_instance_method(name, value = nil)
|
113
|
+
|
114
|
+
raise BinencEngineException, "Name #{name} is not defined" if not keyRegister.keys.include?(name)
|
115
|
+
|
116
|
+
instance_eval <<-END
|
117
|
+
|
118
|
+
def #{name}=(val)
|
119
|
+
#{name}_inst.value = val
|
120
|
+
end
|
121
|
+
def #{name}
|
122
|
+
#{name}_inst.value
|
123
|
+
end
|
124
|
+
|
125
|
+
|
126
|
+
def #{to_instance_method_name(name)}
|
127
|
+
if @#{to_instance_method_name(name)}.nil?
|
128
|
+
@#{to_instance_method_name(name)} = #{type_to_asn1_object(keyRegister[name])}
|
129
|
+
end
|
130
|
+
|
131
|
+
@#{to_instance_method_name(name)}
|
132
|
+
end
|
133
|
+
|
134
|
+
END
|
135
|
+
|
136
|
+
if not_empty?(value)
|
137
|
+
self.send("#{name}=", value)
|
138
|
+
end
|
139
|
+
|
140
|
+
end
|
141
|
+
|
142
|
+
def to_instance_method_name(name)
|
143
|
+
"#{name}_inst"
|
144
|
+
end
|
145
|
+
|
146
|
+
def type_to_asn1_object(type)
|
147
|
+
case type
|
148
|
+
when :bin
|
149
|
+
"ASN1Binary.new"
|
150
|
+
when :oid
|
151
|
+
"ASN1OID.new"
|
152
|
+
when :int
|
153
|
+
"ASN1Integer.new"
|
154
|
+
when :str
|
155
|
+
"ASN1String.new"
|
156
|
+
when :seq
|
157
|
+
"ASN1Sequence.new"
|
158
|
+
when :time
|
159
|
+
"ASN1DateTime.new"
|
160
|
+
else
|
161
|
+
raise BinencEngineException, "Unknown type to ASN1 object #{type}"
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
|
166
|
+
end
|
167
|
+
|
168
|
+
end
|
169
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
|
2
|
+
require_relative 'sbl_dsl'
|
3
|
+
|
4
|
+
module Binenc
|
5
|
+
module Java
|
6
|
+
|
7
|
+
# simple binary layout factory
|
8
|
+
class SBLFactory
|
9
|
+
include SBLDSL
|
10
|
+
include DataConversion
|
11
|
+
|
12
|
+
def define(&block)
|
13
|
+
instance_eval(&block)
|
14
|
+
self
|
15
|
+
end
|
16
|
+
|
17
|
+
def encoded
|
18
|
+
res = []
|
19
|
+
structure.each do |st|
|
20
|
+
res << self.send("#{to_instance_method_name(st)}").encoded(false)
|
21
|
+
end
|
22
|
+
|
23
|
+
ASN1Sequence.new(res).encoded
|
24
|
+
end
|
25
|
+
|
26
|
+
def from_bin(bin)
|
27
|
+
|
28
|
+
seq = ASN1Object.decode(bin).value
|
29
|
+
|
30
|
+
if seq.length > structure.length
|
31
|
+
logger.warn "Given binary has more field (#{seq.length}) than the defined specification (#{structure.length}). Different version of structure?"
|
32
|
+
elsif structure.length > seq.length
|
33
|
+
logger.warn "Defined specification has more field (#{structure.length}) than given binary (#{seq.length}). Different version of structure?"
|
34
|
+
end
|
35
|
+
|
36
|
+
structure.each_index do |i|
|
37
|
+
name = structure[i]
|
38
|
+
val = seq[i]
|
39
|
+
create_instance_method(name, val)
|
40
|
+
end
|
41
|
+
|
42
|
+
self
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
def value_from_bin_struct(bin, *fieldNo)
|
47
|
+
|
48
|
+
seq = ASN1Object.decode(bin).value
|
49
|
+
|
50
|
+
ret = []
|
51
|
+
fieldNo.each do |fn|
|
52
|
+
raise BinencEngineException, "Given field no '#{fn}' to extract is larger than found fields (#{seq.length})" if fn > seq.length
|
53
|
+
|
54
|
+
v = seq[fn]
|
55
|
+
if v.is_a?(::Java::OrgBouncycastleAsn1::ASN1Object)
|
56
|
+
case v
|
57
|
+
when ::Java::OrgBouncycastleAsn1::DERBitString
|
58
|
+
#vv = String.from_java_bytes(v.bytes)
|
59
|
+
vv = to_java_bytes(v.bytes)
|
60
|
+
when ::Java::OrgBouncycastleAsn1::DERUTF8String
|
61
|
+
vv = v.to_s
|
62
|
+
when ::Java::OrgBouncycastleAsn1::ASN1Integer
|
63
|
+
vv = v.value
|
64
|
+
#when ::Java::OrgBouncycastleAsn1::DERSequence, ::Java::OrgBouncycastleAsn1::DLSequence
|
65
|
+
# to_value(v.to_a)
|
66
|
+
when ::Java::OrgBouncycastleAsn1::ASN1GeneralizedTime
|
67
|
+
d = v.date
|
68
|
+
vv = Time.at(d.time/1000)
|
69
|
+
when ::Java::OrgBouncycastleAsn1::ASN1ObjectIdentifier
|
70
|
+
vv = v.id
|
71
|
+
else
|
72
|
+
raise BinencEngineException, "Unhandled ASN1 object '#{obj.class}'"
|
73
|
+
end
|
74
|
+
|
75
|
+
#begin
|
76
|
+
# vv = ASN1Object.decode(v).value
|
77
|
+
#rescue OpenSSL::ASN1::ASN1Error
|
78
|
+
# vv = v
|
79
|
+
#end
|
80
|
+
else
|
81
|
+
vv = v
|
82
|
+
end
|
83
|
+
|
84
|
+
ret << vv
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
ret
|
89
|
+
end
|
90
|
+
|
91
|
+
private
|
92
|
+
def logger
|
93
|
+
if @logger.nil?
|
94
|
+
@logger = TeLogger::Tlogger.new
|
95
|
+
@logger.tag = :sbl_fact
|
96
|
+
end
|
97
|
+
@logger
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
end
|
data/lib/binenc/java.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'teLogger'
|
4
|
+
require 'toolrack'
|
5
|
+
|
6
|
+
Dir.glob(File.join(File.dirname(__FILE__),"..","..","jars","*.jar")).each do |f|
|
7
|
+
require f
|
8
|
+
#puts "Loaded #{f}"
|
9
|
+
end
|
10
|
+
|
11
|
+
require_relative "java/version"
|
12
|
+
|
13
|
+
require_relative 'provider'
|
14
|
+
|
15
|
+
module Binenc
|
16
|
+
module Java
|
17
|
+
class Error < StandardError; end
|
18
|
+
# Your code goes here...
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
# register the provider
|
24
|
+
require 'binenc'
|
25
|
+
Binenc::Provider.instance.register(Binenc::Java::Provider)
|
26
|
+
|
27
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
|
2
|
+
require_relative 'asn1_engine/asn1_engine'
|
3
|
+
|
4
|
+
require_relative 'asn1_engine/asn1_object'
|
5
|
+
|
6
|
+
require_relative 'factory/bin_struct_factory'
|
7
|
+
|
8
|
+
module Binenc
|
9
|
+
module Java
|
10
|
+
class Provider
|
11
|
+
include TR::CondUtils
|
12
|
+
|
13
|
+
def self.provider_name
|
14
|
+
"Java"
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.engine_instance(*args, &block)
|
18
|
+
eng = args.first
|
19
|
+
|
20
|
+
|
21
|
+
if is_empty?(eng)
|
22
|
+
ASN1Engine.new(*args[1..-1], &block)
|
23
|
+
else
|
24
|
+
|
25
|
+
case eng.to_s.downcase.to_sym
|
26
|
+
when :asn1, :asn1_eng
|
27
|
+
ASN1Engine.new(*args[1..-1], &block)
|
28
|
+
when :bin_struct, :binstruct
|
29
|
+
BinStructFactory.instance(*args, &block)
|
30
|
+
else
|
31
|
+
raise BinencEngineException, "Engine #{eng} is not supported"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
|
data/sig/binenc/java.rbs
ADDED
metadata
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: binenc-java
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ian
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2022-08-11 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
15
|
+
requirements:
|
16
|
+
- - ">="
|
17
|
+
- !ruby/object:Gem::Version
|
18
|
+
version: '0'
|
19
|
+
name: teLogger
|
20
|
+
prerelease: false
|
21
|
+
type: :runtime
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
name: toolrack
|
34
|
+
prerelease: false
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
name: binenc
|
48
|
+
prerelease: false
|
49
|
+
type: :runtime
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
name: devops_assist
|
62
|
+
prerelease: false
|
63
|
+
type: :development
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: ''
|
70
|
+
email:
|
71
|
+
- cameronian0@protonmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- ".rspec"
|
77
|
+
- Gemfile
|
78
|
+
- Gemfile.lock
|
79
|
+
- README.md
|
80
|
+
- Rakefile
|
81
|
+
- binenc-java.gemspec
|
82
|
+
- jars/bcmail-jdk15on-165.jar
|
83
|
+
- jars/bcpg-jdk15on-165.jar
|
84
|
+
- jars/bcpkix-jdk15on-165.jar
|
85
|
+
- jars/bcprov-ext-jdk15on-165.jar
|
86
|
+
- jars/bcprov-jdk15on-165.jar
|
87
|
+
- jars/bctls-jdk15on-165.jar
|
88
|
+
- lib/binenc/asn1_engine/asn1_engine.rb
|
89
|
+
- lib/binenc/asn1_engine/asn1_object.rb
|
90
|
+
- lib/binenc/asn1_engine/object/binary.rb
|
91
|
+
- lib/binenc/asn1_engine/object/datetime.rb
|
92
|
+
- lib/binenc/asn1_engine/object/integer.rb
|
93
|
+
- lib/binenc/asn1_engine/object/oid.rb
|
94
|
+
- lib/binenc/asn1_engine/object/sequence.rb
|
95
|
+
- lib/binenc/asn1_engine/object/string.rb
|
96
|
+
- lib/binenc/data_conversion.rb
|
97
|
+
- lib/binenc/factory/bin_struct_factory.rb
|
98
|
+
- lib/binenc/factory/sbl_factory/sbl_dsl.rb
|
99
|
+
- lib/binenc/factory/sbl_factory/sbl_factory.rb
|
100
|
+
- lib/binenc/java.rb
|
101
|
+
- lib/binenc/java/version.rb
|
102
|
+
- lib/binenc/provider.rb
|
103
|
+
- sig/binenc/java.rbs
|
104
|
+
homepage: ''
|
105
|
+
licenses: []
|
106
|
+
metadata: {}
|
107
|
+
post_install_message:
|
108
|
+
rdoc_options: []
|
109
|
+
require_paths:
|
110
|
+
- lib
|
111
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: 2.6.0
|
116
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
117
|
+
requirements:
|
118
|
+
- - ">="
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '0'
|
121
|
+
requirements: []
|
122
|
+
rubygems_version: 3.2.29
|
123
|
+
signing_key:
|
124
|
+
specification_version: 4
|
125
|
+
summary: ''
|
126
|
+
test_files: []
|