ccrypto-java 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 (47) hide show
  1. checksums.yaml +7 -0
  2. data/.java-version +1 -0
  3. data/.rspec +3 -0
  4. data/Gemfile +13 -0
  5. data/Gemfile.lock +94 -0
  6. data/README.md +150 -0
  7. data/Rakefile +10 -0
  8. data/bin/console +15 -0
  9. data/bin/setup +8 -0
  10. data/ccrypto-java.gemspec +44 -0
  11. data/jars/bcmail-jdk15on-165.jar +0 -0
  12. data/jars/bcpg-jdk15on-165.jar +0 -0
  13. data/jars/bcpkix-jdk15on-165.jar +0 -0
  14. data/jars/bcprov-ext-jdk15on-165.jar +0 -0
  15. data/jars/bcprov-jdk15on-165.jar +0 -0
  16. data/jars/bctls-jdk15on-165.jar +0 -0
  17. data/jars/shamir-0.6.1-p.jar +0 -0
  18. data/lib/ccrypto/java/data_conversion.rb +80 -0
  19. data/lib/ccrypto/java/engines/asn1_engine.rb +161 -0
  20. data/lib/ccrypto/java/engines/asn1_object.rb +12 -0
  21. data/lib/ccrypto/java/engines/cipher_engine.rb +255 -0
  22. data/lib/ccrypto/java/engines/compression_engine.rb +92 -0
  23. data/lib/ccrypto/java/engines/data_conversion_engine.rb +9 -0
  24. data/lib/ccrypto/java/engines/decompression_engine.rb +48 -0
  25. data/lib/ccrypto/java/engines/digest_engine.rb +208 -0
  26. data/lib/ccrypto/java/engines/ecc_engine.rb +263 -0
  27. data/lib/ccrypto/java/engines/hkdf_engine.rb +72 -0
  28. data/lib/ccrypto/java/engines/hmac_engine.rb +75 -0
  29. data/lib/ccrypto/java/engines/pbkdf2_engine.rb +87 -0
  30. data/lib/ccrypto/java/engines/pkcs7_engine.rb +558 -0
  31. data/lib/ccrypto/java/engines/rsa_engine.rb +572 -0
  32. data/lib/ccrypto/java/engines/scrypt_engine.rb +35 -0
  33. data/lib/ccrypto/java/engines/secret_key_engine.rb +44 -0
  34. data/lib/ccrypto/java/engines/secret_sharing_engine.rb +59 -0
  35. data/lib/ccrypto/java/engines/secure_random_engine.rb +76 -0
  36. data/lib/ccrypto/java/engines/x509_engine.rb +311 -0
  37. data/lib/ccrypto/java/ext/secret_key.rb +75 -0
  38. data/lib/ccrypto/java/ext/x509_cert.rb +48 -0
  39. data/lib/ccrypto/java/jce_provider.rb +52 -0
  40. data/lib/ccrypto/java/keybundle_store/pkcs12.rb +125 -0
  41. data/lib/ccrypto/java/utils/comparator.rb +20 -0
  42. data/lib/ccrypto/java/utils/memory_buffer.rb +77 -0
  43. data/lib/ccrypto/java/utils/native_helper.rb +19 -0
  44. data/lib/ccrypto/java/version.rb +7 -0
  45. data/lib/ccrypto/java.rb +30 -0
  46. data/lib/ccrypto/provider.rb +132 -0
  47. metadata +144 -0
@@ -0,0 +1,255 @@
1
+
2
+ require_relative '../data_conversion'
3
+
4
+ module Ccrypto
5
+ module Java
6
+ class CipherEngine
7
+ include TR::CondUtils
8
+ include DataConversion
9
+
10
+ include TeLogger::TeLogHelper
11
+
12
+ teLogger_tag :j_cipher
13
+
14
+ def self.supported_ciphers
15
+ res = java.security.Security.getAlgorithms("Cipher").to_a.delete_if { |e| e.include?(".") }.sort
16
+ end
17
+
18
+ def self.is_supported_cipher?(c)
19
+ case c
20
+ when String, java.lang.String
21
+ javax.crypto.Cipher.getInstance(c)
22
+ when Hash
23
+ spec = to_spec(c)
24
+ javax.crypto.Cipher.getInstance(spec)
25
+ else
26
+ raise CipherEngineException, "Unsupported input #{c} to check supported cipher"
27
+ end
28
+ end
29
+
30
+ def self.to_spec(hash)
31
+ res = []
32
+ res << hash[:algo].to_s
33
+ res << hash[:mode].to_s
34
+ res << hash[:padding].to_s
35
+ res.join("/")
36
+ end
37
+
38
+ def supported_ciphers
39
+ self.class.supported_ciphers
40
+ end
41
+
42
+ def initialize(*args, &block)
43
+
44
+ @spec = args.first
45
+
46
+ case @spec
47
+ when String, java.lang.String, Hash
48
+ @spec = Ccrypto::DirectCipherConfig.new(@spec)
49
+ when Ccrypto::CipherConfig
50
+ else
51
+ raise Ccrypto::CipherEngineException, "Unsupported config type #{@spec.class}"
52
+ end
53
+
54
+
55
+ if block
56
+ @cipherJceProvider = block.call(:cipher_jceProvider)
57
+ @keygenJceProvider = block.call(:keygen_jceProvider)
58
+ end
59
+
60
+ cSpec = to_cipher_spec(@spec)
61
+ if @cipherJceProvider.nil?
62
+ begin
63
+ teLogger.debug "Cipher instance #{cSpec} with null provider"
64
+ @cipher = javax.crypto.Cipher.getInstance(cSpec)
65
+ rescue Exception => ex
66
+ teLogger.debug "Error #{ex.message} for spec '#{cSpec}' using null provider. Retest with BC provider"
67
+ @cipher = javax.crypto.Cipher.getInstance(cSpec, Ccrypto::Java::JCEProvider::BCProv.name)
68
+ end
69
+ else
70
+ teLogger.debug "Cipher instance #{cSpec} with provider '#{@cipherJceProvider.is_a?(String) ? @cipherJceProvider : @cipherJceProvider.name}'"
71
+ @cipher = javax.crypto.Cipher.getInstance(cSpec, @cipherJceProvider)
72
+ end
73
+
74
+
75
+ if @spec.has_key?
76
+ teLogger.debug "Using given cipher key"
77
+
78
+ else
79
+
80
+ teLogger.debug "Generating cipher key"
81
+ if @keygenJceProvider.nil?
82
+ kg = javax.crypto.KeyGenerator.getInstance(to_algo(@spec.algo))
83
+ else
84
+ kg = javax.crypto.KeyGenerator.getInstance(to_algo(@spec.algo), @keygenJceProvider)
85
+ end
86
+
87
+ kg.init(@spec.keysize.to_i)
88
+ @spec.key = kg.generateKey
89
+
90
+ end
91
+
92
+ if @spec.iv.is_a?(String)
93
+ @spec.iv = to_java_bytes(@spec.iv)
94
+ end
95
+
96
+ if @spec.is_mode?(:gcm) or @spec.is_algo?(:chacha20)
97
+ if is_empty?(@spec.iv)
98
+ teLogger.debug "Generating 12 bytes of IV"
99
+ @spec.iv = Ccrypto::Java::SecureRandomEngine.random_bytes(12)
100
+ else
101
+ teLogger.debug "Using given IV"
102
+ end
103
+
104
+ if @spec.is_mode?(:gcm)
105
+ ivParam = javax.crypto.spec.GCMParameterSpec.new(@spec.iv.length*8, @spec.iv) # 16 bytes
106
+ else
107
+ ivParam = javax.crypto.spec.IvParameterSpec.new(@spec.iv) # 16 bytes
108
+ end
109
+
110
+ elsif @spec.is_algo?(:blowfish)
111
+ if is_empty?(@spec.iv)
112
+ teLogger.debug "Generating 8 bytes of IV"
113
+ @spec.iv = Ccrypto::Java::SecureRandomEngine.random_bytes(8)
114
+ else
115
+ teLogger.debug "Using given IV"
116
+ end
117
+ ivParam = javax.crypto.spec.IvParameterSpec.new(@spec.iv)
118
+
119
+ elsif @spec.is_mode?(:cbc) or @spec.is_mode?(:ctr) or @spec.is_mode?(:cfb) or @spec.is_mode?(:ofb)
120
+ if is_empty?(@spec.iv)
121
+ teLogger.debug "Generating 16 bytes of IV"
122
+ @spec.iv = Ccrypto::Java::SecureRandomEngine.random_bytes(16)
123
+ else
124
+ teLogger.debug "Using given IV"
125
+ end
126
+ ivParam = javax.crypto.spec.IvParameterSpec.new(@spec.iv)
127
+
128
+ end
129
+
130
+ #teLogger.debug "IV : #{@spec.iv}"
131
+
132
+ case @spec.key
133
+ when Ccrypto::SecretKey
134
+ skey = @spec.key.key
135
+ when ::Java::byte[]
136
+ skey = javax.crypto.spec.SecretKeySpec.new(@spec.key, @spec.algo.to_s)
137
+ when String
138
+ skey = javax.crypto.spec.SecretKeySpec.new(to_java_bytes(@spec.key), @spec.algo.to_s)
139
+ when javax.crypto.spec.SecretKeySpec
140
+ skey = @spec.key
141
+ else
142
+ raise CipherEngineException, "Unknown key type '#{@spec.key}'"
143
+ end
144
+
145
+ #teLogger.debug "SKey : #{skey.encoded}"
146
+
147
+ case @spec.cipherOps
148
+ when :encrypt, :enc
149
+ if ivParam.nil?
150
+ teLogger.debug "Encryption mode"
151
+ @cipher.init(javax.crypto.Cipher::ENCRYPT_MODE, skey)
152
+ else
153
+ teLogger.debug "Encryption mode with IV"
154
+ @cipher.init(javax.crypto.Cipher::ENCRYPT_MODE, skey, ivParam)
155
+ end
156
+
157
+ when :decrypt, :dec
158
+ if ivParam.nil?
159
+ teLogger.debug "Decryption mode"
160
+ @cipher.init(javax.crypto.Cipher::DECRYPT_MODE, skey)
161
+ else
162
+ teLogger.debug "Decryption mode with IV"
163
+ @cipher.init(javax.crypto.Cipher::DECRYPT_MODE, skey, ivParam)
164
+ end
165
+
166
+ else
167
+ raise Ccrypto::CipherEngineException, "Cipher operation must be given"
168
+ end
169
+
170
+ if @spec.is_mode?(:gcm) and not_empty?(@spec.auth_data)
171
+ teLogger.debug "Adding additional authenticated data for GCM mode"
172
+ @cipher.updateAAD(to_java_bytes(@spec.auth_data))
173
+ end
174
+
175
+ end
176
+
177
+ def update(val)
178
+ teLogger.debug "Passing #{val.length} bytes to cipher"
179
+ res = @cipher.update(to_java_bytes(val))
180
+ if res.nil?
181
+ teLogger.debug "Cipher update returns nothing"
182
+ else
183
+ teLogger.debug "Cipher update output length #{res.length}"
184
+ end
185
+ res
186
+ end
187
+
188
+ def final(val = nil, &block)
189
+ baos = java.io.ByteArrayOutputStream.new
190
+ if not_empty?(val)
191
+ res = update(val)
192
+ baos.write(res) if not_empty?(res)
193
+ end
194
+
195
+ begin
196
+ res = @cipher.doFinal
197
+
198
+ teLogger.debug "Final output length : #{res.length}"
199
+
200
+ if @spec.is_mode?(:gcm) and @spec.is_encrypt_cipher_mode?
201
+ # extract auth_tag
202
+ @spec.auth_tag = res[-16..-1]
203
+ @spec.auth_tag = String.from_java_bytes(@spec.auth_tag) if not_empty?(@spec.auth_tag)
204
+ end
205
+
206
+ baos.write(res) if not_empty?(res)
207
+ baos.toByteArray
208
+
209
+ rescue Exception => ex
210
+ raise Ccrypto::CipherEngineException, ex
211
+ end
212
+ end
213
+
214
+ def reset
215
+ #@cipher.reset
216
+ end
217
+
218
+ private
219
+ def to_algo(algo)
220
+ algo.to_s.gsub("_","-")
221
+ end
222
+
223
+ def to_cipher_spec(spec)
224
+ res = []
225
+
226
+ res << spec.algo.to_s.gsub("_","-")
227
+
228
+ res << spec.mode if not_empty?(spec.mode)
229
+
230
+ if spec.algo.to_s.downcase == "aria" and spec.mode.to_s.downcase == "gcm"
231
+ # for some reasons only aria gcm trigger this error
232
+ res << "NoPadding"
233
+ elsif spec.mode.to_s.downcase != "poly1305"
234
+ case spec.padding
235
+ when :pkcs5
236
+ res << "PKCS5Padding"
237
+ when :pkcs7
238
+ res << "PKCS7Padding"
239
+ when :nopadding
240
+ res << "NOPadding"
241
+ end
242
+ end
243
+
244
+ if spec.is_algo?(:chacha20)
245
+ res.join("-")
246
+ elsif spec.is_algo?(:blowfish)
247
+ res[0]
248
+ else
249
+ res.join("/")
250
+ end
251
+ end
252
+
253
+ end
254
+ end
255
+ end
@@ -0,0 +1,92 @@
1
+
2
+ require_relative '../data_conversion'
3
+
4
+ module Ccrypto
5
+ module Java
6
+ class Compression
7
+ include DataConversion
8
+ include TR::CondUtils
9
+
10
+ include TeLogger::TeLogHelper
11
+
12
+ teLogger_tag :j_compression
13
+
14
+ def initialize(*args, &block)
15
+
16
+ @config = args.first
17
+ raise CompressionError, "Compress Config is expected. Given #{@config}" if not @config.is_a?(Ccrypto::CompressionConfig)
18
+
19
+ #if block
20
+
21
+ # outPath = block.call(:out_path)
22
+ # if is_empty?(outPath)
23
+ # outFile = block.call(:out_file)
24
+ # raise CompressionError, "OutputStream required" if not outFile.is_a?(java.io.OutputStream)
25
+ # @out = outFile
26
+ # else
27
+ # @out = java.io.RandomAccessFile.new(java.io.File.new(outPath), "w")
28
+ # end
29
+
30
+ # @intBufSize = block.call(:int_buf_size) || 102400
31
+
32
+ #else
33
+ # @intBufSize = 102400
34
+
35
+ #end
36
+
37
+ #@in = java.io.RandomAccessFile.new(java.nio.file.Files.createTempFile(nil,".zl").toFile, "rw")
38
+ #@inPtr = 0
39
+
40
+ case @config.level
41
+ when :best_compression
42
+ teLogger.debug "Compression with best compression"
43
+ @eng = java.util.zip.Deflater.new(java.util.zip.Deflater::BEST_COMPRESSION)
44
+ when :best_speed
45
+ teLogger.debug "Compression with best speed"
46
+ @eng = java.util.zip.Deflater.new(java.util.zip.Deflater::BEST_SPEED)
47
+ when :no_compression
48
+ teLogger.debug "No compression"
49
+ @eng = java.util.zip.Deflater.new(java.util.zip.Deflater::NO_COMPRESSION)
50
+ else
51
+ teLogger.debug "Default compression"
52
+ @eng = java.util.zip.Deflater.new(java.util.zip.Deflater::DEFAULT_COMPRESSION)
53
+ end
54
+
55
+ teLogger.debug "Default strategy"
56
+ @eng.setStrategy(java.util.zip.Deflater::DEFAULT_STRATEGY)
57
+
58
+ @os = java.io.ByteArrayOutputStream.new
59
+
60
+ end
61
+
62
+ # returns compressed output length
63
+ def update(val)
64
+ if val.length > 0
65
+ teLogger.debug "Given #{val.length} bytes for compression"
66
+ #teLogger.debug "Write ready-to-compress data : #{val.length}"
67
+ #@in.write(to_java_bytes(val))
68
+
69
+ @eng.setInput(to_java_bytes(val))
70
+
71
+ @eng.finish
72
+
73
+ baos = java.io.ByteArrayOutputStream.new
74
+ buf = ::Java::byte[102400].new
75
+ while not @eng.finished
76
+ done = @eng.deflate(buf)
77
+ @os.write(buf,0,done)
78
+ end
79
+
80
+ @os.toByteArray
81
+ else
82
+ ::Java::byte[0].new
83
+ end
84
+ end
85
+
86
+ def final
87
+
88
+ end
89
+
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,9 @@
1
+
2
+
3
+ module Ccrypto
4
+ module Java
5
+ class DataConversionEngine
6
+ extend DataConversion
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,48 @@
1
+
2
+ require_relative '../data_conversion'
3
+
4
+ module Ccrypto
5
+ module Java
6
+ class Decompression
7
+ include DataConversion
8
+ include TR::CondUtils
9
+
10
+ include TeLogger::TeLogHelper
11
+ teLogger_tag :j_decompression
12
+
13
+ def initialize(*args,&block)
14
+
15
+ @eng = java.util.zip.Inflater.new
16
+
17
+ @os = java.io.ByteArrayOutputStream.new
18
+
19
+ end
20
+
21
+ def update(val)
22
+ teLogger.debug "Given #{val.length} bytes for decompression"
23
+ if val.length > 0
24
+
25
+ @eng.setInput(to_java_bytes(val))
26
+
27
+ baos = java.io.ByteArrayOutputStream.new
28
+ buf = ::Java::byte[102400].new
29
+ while not @eng.finished
30
+ done = @eng.inflate(buf)
31
+ teLogger.debug "Done #{done} bytes"
32
+ @os.write(buf,0,done)
33
+ end
34
+
35
+ @os.toByteArray
36
+
37
+ else
38
+ ::Java::byte[0].new
39
+
40
+ end
41
+ end
42
+
43
+ def final
44
+ end
45
+
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,208 @@
1
+
2
+ require_relative '../data_conversion'
3
+
4
+ module Ccrypto
5
+ module Java
6
+ class DigestEngine
7
+ include TR::CondUtils
8
+ include DataConversion
9
+
10
+ include TeLogger::TeLogHelper
11
+
12
+ teLogger_tag :j_digest
13
+
14
+ Potential = [
15
+
16
+ Ccrypto::SHA1.provider_info("SHA-1"),
17
+ Ccrypto::SHA224.provider_info("SHA-224"),
18
+ Ccrypto::SHA256.provider_info("SHA-256"),
19
+ Ccrypto::SHA384.provider_info("SHA-384"),
20
+ Ccrypto::SHA512.provider_info("SHA-512"),
21
+ Ccrypto::SHA512_224.provider_info("SHA-512/224"),
22
+ Ccrypto::SHA512_256.provider_info("SHA-512/256"),
23
+
24
+ Ccrypto::SHA3_224.provider_info("SHA3-224"),
25
+ Ccrypto::SHA3_256.provider_info("SHA3-256"),
26
+ Ccrypto::SHA3_384.provider_info("SHA3-384"),
27
+ Ccrypto::SHA3_512.provider_info("SHA3-512"),
28
+
29
+ Ccrypto::BLAKE2b160.provider_info("BLAKE2B-160"),
30
+ Ccrypto::BLAKE2b256.provider_info("BLAKE2B-256"),
31
+ Ccrypto::BLAKE2b384.provider_info("BLAKE2B-384"),
32
+ Ccrypto::BLAKE2b512.provider_info("BLAKE2B-512"),
33
+
34
+ Ccrypto::BLAKE2s128.provider_info("BLAKE2S-128"),
35
+ Ccrypto::BLAKE2s160.provider_info("BLAKE2s-160"),
36
+ Ccrypto::BLAKE2s224.provider_info("BLAKE2s-224"),
37
+ Ccrypto::BLAKE2s256.provider_info("BLAKE2s-256"),
38
+
39
+ Ccrypto::HARAKA256.provider_info("HARAKA-256"),
40
+ Ccrypto::HARAKA512.provider_info("HARAKA-512"),
41
+
42
+ Ccrypto::KECCAK224.provider_info("KECCAK-224"),
43
+ Ccrypto::KECCAK256.provider_info("KECCAK-256"),
44
+ Ccrypto::KECCAK288.provider_info("KECCAK-288"),
45
+ Ccrypto::KECCAK384.provider_info("KECCAK-384"),
46
+ Ccrypto::KECCAK512.provider_info("KECCAK-512"),
47
+
48
+ Ccrypto::RIPEMD128.provider_info("RIPEMD128"),
49
+ Ccrypto::RIPEMD160.provider_info("RIPEMD160"),
50
+ Ccrypto::RIPEMD256.provider_info("RIPEMD256"),
51
+ Ccrypto::RIPEMD320.provider_info("RIPEMD320"),
52
+
53
+ Ccrypto::SHAKE128_256.provider_info("SHAKE128-256"),
54
+ Ccrypto::SHAKE256_512.provider_info("SHAKE256-512"),
55
+
56
+ Ccrypto::SKEIN1024_1024.provider_info("SKEIN-1024-1024"),
57
+ Ccrypto::SKEIN1024_384.provider_info("SKEIN-1024-384"),
58
+ Ccrypto::SKEIN1024_512.provider_info("SKEIN-1024-512"),
59
+
60
+ Ccrypto::SKEIN256_128.provider_info("SKEIN-256-128"),
61
+ Ccrypto::SKEIN256_160.provider_info("SKEIN-256-160"),
62
+ Ccrypto::SKEIN256_224.provider_info("SKEIN-256-224"),
63
+ Ccrypto::SKEIN256_256.provider_info("SKEIN-256-256"),
64
+
65
+ Ccrypto::SKEIN512_128.provider_info("SKEIN-512-128"),
66
+ Ccrypto::SKEIN512_160.provider_info("SKEIN-512-160"),
67
+ Ccrypto::SKEIN512_224.provider_info("SKEIN-512-224"),
68
+ Ccrypto::SKEIN512_256.provider_info("SKEIN-512-256"),
69
+ Ccrypto::SKEIN512_384.provider_info("SKEIN-512-384"),
70
+ Ccrypto::SKEIN512_512.provider_info("SKEIN-512-512"),
71
+
72
+ SM3 = Ccrypto::SM3.provider_info("SM3"),
73
+ WHIRLPOOL = Ccrypto::WHIRLPOOL.provider_info("WHIRLPOOL")
74
+ ]
75
+
76
+ def self.supported
77
+ if @supported.nil?
78
+ @supported = []
79
+ probe = java.security.Security.getAlgorithms("MessageDigest").to_a.delete_if { |e| e.include?(".") }
80
+ Potential.each do |po|
81
+ @supported << po if probe.include?(po.provider_config)
82
+ end
83
+ end
84
+ @supported
85
+ end
86
+
87
+ def self.is_supported?(eng, prov = nil)
88
+ if is_empty?(eng)
89
+ false
90
+ else
91
+
92
+ jceName = algo_jce_map[eng]
93
+ begin
94
+ if not_empty?(prov)
95
+ #java.security.MessageDigest.getInstance(eng.to_s.gsub("_","-"), prov)
96
+ java.security.MessageDigest.getInstance(jceName, prov)
97
+ else
98
+ #java.security.MessageDigest.getInstance(eng.to_s.gsub("_","-"))
99
+ java.security.MessageDigest.getInstance(jceName)
100
+ end
101
+ true
102
+ rescue java.security.NoSuchAlgorithmException => ex
103
+ p ex.message
104
+ false
105
+ end
106
+ end
107
+ end
108
+
109
+ def self.default_algo
110
+ "SHA256"
111
+ end
112
+
113
+ def self.instance(conf, &block)
114
+ if block
115
+ prov = block.call(:jce_provider)
116
+ if not_empty?(prov)
117
+ DigestEngine.new(conf.provider_config, prov, &block)
118
+ else
119
+ DigestEngine.new(conf.provider_config, &block)
120
+ end
121
+ else
122
+ DigestEngine.new(conf.provider_config, &block)
123
+ end
124
+ end
125
+
126
+ def self.digest(key, &block)
127
+ res = engineKeys[key]
128
+ if is_empty?(res)
129
+ raise DigestEngine, "Not supported digest engine #{key}"
130
+ else
131
+ if block
132
+ digProv = block.call(:digest_jceProvider)
133
+ end
134
+
135
+ if digProv.nil?
136
+ DigestEngine.new(res.provider_config)
137
+ else
138
+ DigestEngine.new(res.provider_config, digProv)
139
+ end
140
+ end
141
+ end
142
+
143
+ def self.engineKeys
144
+ if @engineKeys.nil?
145
+ @engineKeys = {}
146
+ supported.each do |a|
147
+ @engineKeys[a.algo.to_sym] = a
148
+ end
149
+ end
150
+ @engineKeys
151
+ end
152
+
153
+ def self.algo_jce_map
154
+ if @algoMap.nil?
155
+ @algoMap = {}
156
+ supported.each do |a|
157
+ @algoMap[a.algo.to_sym] = a.provider_config
158
+ end
159
+ end
160
+ @algoMap
161
+ end
162
+
163
+ def initialize(algo, prov = nil, &block)
164
+ teLogger.debug "Algo : #{algo}"
165
+ @algo = algo #algo.to_s.gsub("_","-")
166
+ begin
167
+ if not_empty?(prov)
168
+ @inst = java.security.MessageDigest.getInstance(@algo, prov)
169
+ else
170
+ @inst = java.security.MessageDigest.getInstance(@algo)
171
+ end
172
+ #rescue java.security.NoSuchAlgorithmException => ex
173
+ rescue Exception => ex
174
+ raise DigestEngineException, ex
175
+ end
176
+ end
177
+
178
+ def digest(val, output = :binary)
179
+ digest_final(val, output)
180
+ end
181
+
182
+ def digest_update(val)
183
+ @inst.update(to_java_bytes(val))
184
+ end
185
+
186
+ def digest_final(val = nil, output = :binary)
187
+ if not_empty?(val)
188
+ @inst.update(to_java_bytes(val))
189
+ end
190
+ res = @inst.digest
191
+ @inst.reset
192
+ case output
193
+ when :hex
194
+ to_hex(res)
195
+ when :b64
196
+ to_b64(res)
197
+ else
198
+ res
199
+ end
200
+ end
201
+
202
+ def reset
203
+ @inst.reset
204
+ end
205
+
206
+ end
207
+ end
208
+ end