ccipher_factory 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 (62) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/Gemfile +30 -0
  4. data/Gemfile.lock-java +65 -0
  5. data/Gemfile.lock-ruby +67 -0
  6. data/README.md +80 -0
  7. data/Rakefile +10 -0
  8. data/bin/console +15 -0
  9. data/bin/setup +8 -0
  10. data/ccipher_factory.gemspec +46 -0
  11. data/lib/ccipher_factory/asymkey/asymkey.rb +16 -0
  12. data/lib/ccipher_factory/asymkey/asymkey_generator.rb +87 -0
  13. data/lib/ccipher_factory/asymkey/ecc_keypair.rb +56 -0
  14. data/lib/ccipher_factory/asymkey_cipher/asymkey_cipher.rb +63 -0
  15. data/lib/ccipher_factory/asymkey_cipher/asymkey_signer.rb +44 -0
  16. data/lib/ccipher_factory/asymkey_cipher/ecc/ecc_att_decrypt.rb +55 -0
  17. data/lib/ccipher_factory/asymkey_cipher/ecc/ecc_att_encrypt.rb +70 -0
  18. data/lib/ccipher_factory/asymkey_cipher/ecc/ecc_att_signer.rb +88 -0
  19. data/lib/ccipher_factory/asymkey_cipher/ecc/ecc_att_verifier.rb +100 -0
  20. data/lib/ccipher_factory/asymkey_cipher/ecc/ecc_decrypt.rb +80 -0
  21. data/lib/ccipher_factory/asymkey_cipher/ecc/ecc_encrypt.rb +101 -0
  22. data/lib/ccipher_factory/asymkey_cipher/ecc/ecc_signer.rb +80 -0
  23. data/lib/ccipher_factory/asymkey_cipher/ecc/ecc_verifier.rb +56 -0
  24. data/lib/ccipher_factory/composite_cipher/composite_cipher.rb +28 -0
  25. data/lib/ccipher_factory/composite_cipher/decrypt_verifier.rb +116 -0
  26. data/lib/ccipher_factory/composite_cipher/sign_encryptor.rb +100 -0
  27. data/lib/ccipher_factory/compression/compression_helper.rb +103 -0
  28. data/lib/ccipher_factory/compression/compressor.rb +55 -0
  29. data/lib/ccipher_factory/compression/zlib_compressor.rb +48 -0
  30. data/lib/ccipher_factory/compression/zlib_decompressor.rb +67 -0
  31. data/lib/ccipher_factory/digest/digest.rb +180 -0
  32. data/lib/ccipher_factory/digest/supported_digest.rb +47 -0
  33. data/lib/ccipher_factory/encoding/asn1.rb +43 -0
  34. data/lib/ccipher_factory/encoding/bin_struct.rb +207 -0
  35. data/lib/ccipher_factory/encoding/binenc_constant.rb +149 -0
  36. data/lib/ccipher_factory/helpers/common.rb +124 -0
  37. data/lib/ccipher_factory/kcv/kcv.rb +89 -0
  38. data/lib/ccipher_factory/kdf/hkdf.rb +114 -0
  39. data/lib/ccipher_factory/kdf/kdf.rb +73 -0
  40. data/lib/ccipher_factory/kdf/pbkdf2.rb +82 -0
  41. data/lib/ccipher_factory/kdf/scrypt.rb +105 -0
  42. data/lib/ccipher_factory/shamir/shamir_sharing.rb +293 -0
  43. data/lib/ccipher_factory/shamir/shamir_sharing_helper.rb +88 -0
  44. data/lib/ccipher_factory/symkey/derived_symkey.rb +110 -0
  45. data/lib/ccipher_factory/symkey/hardware_symkey.rb +0 -0
  46. data/lib/ccipher_factory/symkey/soft_symkey.rb +63 -0
  47. data/lib/ccipher_factory/symkey/symkey.rb +122 -0
  48. data/lib/ccipher_factory/symkey/symkey_generator.rb +70 -0
  49. data/lib/ccipher_factory/symkey_cipher/symkey_att_decrypt.rb +64 -0
  50. data/lib/ccipher_factory/symkey_cipher/symkey_att_encrypt.rb +65 -0
  51. data/lib/ccipher_factory/symkey_cipher/symkey_att_sign.rb +84 -0
  52. data/lib/ccipher_factory/symkey_cipher/symkey_att_verify.rb +85 -0
  53. data/lib/ccipher_factory/symkey_cipher/symkey_cipher.rb +101 -0
  54. data/lib/ccipher_factory/symkey_cipher/symkey_decrypt.rb +144 -0
  55. data/lib/ccipher_factory/symkey_cipher/symkey_encrypt.rb +164 -0
  56. data/lib/ccipher_factory/symkey_cipher/symkey_sign.rb +70 -0
  57. data/lib/ccipher_factory/symkey_cipher/symkey_signer.rb +59 -0
  58. data/lib/ccipher_factory/symkey_cipher/symkey_verify.rb +76 -0
  59. data/lib/ccipher_factory/version.rb +5 -0
  60. data/lib/ccipher_factory.rb +52 -0
  61. data/run_test.rb +27 -0
  62. metadata +172 -0
@@ -0,0 +1,116 @@
1
+
2
+ require_relative '../asymkey_cipher/asymkey_cipher'
3
+ require_relative '../symkey_cipher/symkey_cipher'
4
+
5
+ module CcipherFactory
6
+ module CompositeCipher
7
+
8
+ module DecryptVerifier
9
+ include TR::CondUtils
10
+ include Common
11
+
12
+ include TeLogger::TeLogHelper
13
+ teLogger_tag :decVer
14
+
15
+ attr_accessor :decryption_key, :verification_key
16
+ def decrypt_verify_init(opts = { }, &block)
17
+
18
+ #@dKey = opts[:decryption_key]
19
+ #@vKey = opts[:verification_key] # optional as asymkey the key is included
20
+
21
+ raise CompositeCipherError, "Decryption key is required" if is_empty?(@decryption_key)
22
+ raise CompositeCipherError, "Output is required" if not is_output_given?
23
+
24
+ if block
25
+ instance_eval(&block)
26
+ decrypt_verify_final
27
+ else
28
+ self
29
+ end
30
+
31
+ end
32
+
33
+ def decrypt_verify_update_meta(meta)
34
+
35
+ intOutputBuf.write(meta)
36
+
37
+ begin
38
+
39
+ Encoding.extract_meta(intOutputBuf) do |meta, bal|
40
+
41
+ ts = BinStruct.instance.struct_from_bin(meta)
42
+ ccBin = ts.cipher_config
43
+ cc = BinStruct.instance.struct_from_bin(ccBin)
44
+ scBin = ts.signer_config
45
+ sc = BinStruct.instance.struct_from_bin(scBin)
46
+
47
+ case BTag.value_constant(cc.oid)
48
+ when :symkey_cipher
49
+ @cipher = CcipherFactory::SymKeyCipher.decryptor
50
+ @cipher.output(intOutputFile)
51
+ @cipher.key = @decryption_key
52
+ @cipher.decrypt_init
53
+ @cipher.decrypt_update_meta(ccBin)
54
+ when :ecc_cipher
55
+ @cipher = CcipherFactory::AsymKeyCipher.decryptor
56
+ @cipher.output(intOutputFile)
57
+ @cipher.decryption_key = @decryption_key
58
+ @cipher.decrypt_init
59
+ @cipher.decrypt_update_meta(ccBin)
60
+ else
61
+ raise CompositeCipherError, "Unknown envelope type '#{cc.id}'"
62
+ end
63
+
64
+ case BTag.value_constant(sc.oid)
65
+ when :ecc_att_sign
66
+ @verifier = AsymKeySigner.att_verifier
67
+ @verifier.output(@output)
68
+ when :symkey_att_sign
69
+ @verifier = SymKeySigner.att_verifier
70
+ @verifier.output(@output)
71
+ @verifier.verification_key = @verification_key
72
+ @verifier.att_verify_init
73
+ else
74
+ raise CompositeCipherError, "Unknown signer type '#{sc.id}'"
75
+ end
76
+
77
+ decrypt_verify_update_cipher(bal) if bal.length > 0
78
+
79
+ disposeOutput(intOutputBuf)
80
+
81
+ end
82
+
83
+ rescue Encoding::InsufficientData
84
+ end
85
+
86
+
87
+
88
+ end
89
+
90
+ def decrypt_verify_update_cipher(cipher)
91
+ raise CompositeCipherError, "Please call update_meta() before calling update_cipher()" if is_empty?(@cipher)
92
+
93
+ @cipher.decrypt_update_cipher(cipher)
94
+ end
95
+
96
+ def decrypt_verify_final
97
+
98
+ @cipher.decrypt_final
99
+
100
+ intOutputFile.rewind
101
+ while not intOutputFile.eof?
102
+ @verifier.att_verify_update(intOutputFile.read)
103
+ end
104
+
105
+ @verifier.att_verify_final
106
+
107
+ end
108
+
109
+ def embedded_signer
110
+ @verifier.embedded_signer if not_empty?(@verifier) and @verifier.respond_to?(:embedded_signer)
111
+ end
112
+
113
+ end
114
+
115
+ end
116
+ end
@@ -0,0 +1,100 @@
1
+
2
+
3
+ require_relative '../asymkey_cipher/asymkey_cipher'
4
+ require_relative '../symkey_cipher/symkey_cipher'
5
+
6
+ module CcipherFactory
7
+ module CompositeCipher
8
+
9
+ module SignEncryptor
10
+ include TR::CondUtils
11
+ include Common
12
+ include Compression::CompressionHelper
13
+
14
+ attr_accessor :signing_key, :encryption_key, :sender_keypair
15
+
16
+ def sign_encrypt_init(opts = { }, &block)
17
+
18
+ sKey = @signing_key
19
+ eKey = @encryption_key
20
+ sender = @sender_keypair
21
+
22
+ compress = opts[:compress] || false
23
+
24
+ raise CompositeCipherError, "Signing key is required" if is_empty?(sKey)
25
+ raise CompositeCipherError, "Encryption key is required" if is_empty?(eKey)
26
+ raise CompositeCipherError, "Output is required" if not is_output_given?
27
+
28
+ @signingBuf = Tempfile.new
29
+ @signingBuf.binmode
30
+
31
+ case sKey
32
+ when SymKey
33
+ @signer = SymKeySigner.att_signer
34
+ @signer.output(@signingBuf)
35
+ @signer.compression_on if is_compression_on?
36
+ @signer.signing_key = sKey
37
+ @signer.att_sign_init
38
+ when AsymKey
39
+ @signer = AsymKeySigner.att_signer
40
+ @signer.output(@signingBuf)
41
+ @signer.compression_on if is_compression_on?
42
+ @signer.signing_key = sKey
43
+ @signer.att_sign_init
44
+ else
45
+ raise CompositeCipherError, "Unknown signing key type '#{sKey.class}'"
46
+ end
47
+
48
+ # Encryption Key
49
+ case eKey
50
+ when SymKey
51
+ @enc = SymKeyCipher.encryptor
52
+ @enc.output(@output)
53
+ @enc.key = eKey
54
+ @enc.encrypt_init
55
+ when AsymKey, Ccrypto::PublicKey #, OpenSSL::PKey::EC::Point
56
+ @enc = AsymKeyCipher.encryptor
57
+ @enc.output(@output)
58
+ @enc.recipient_key = eKey
59
+ @enc.sender_keypair = sender if not_empty?(sender)
60
+ @enc.encrypt_init
61
+ else
62
+ raise CompositeCipherError, "Unknown encryption key type '#{eKey.class}'"
63
+ end
64
+
65
+ if block
66
+ instance_eval(&block)
67
+ sign_encrypt_final
68
+ else
69
+ self
70
+ end
71
+
72
+ end
73
+
74
+ def sign_encrypt_update(data)
75
+ @signer.att_sign_update(data)
76
+ end
77
+
78
+ def sign_encrypt_final
79
+
80
+ smeta = @signer.att_sign_final
81
+
82
+ @signingBuf.rewind
83
+ while not @signingBuf.eof?
84
+ @enc.encrypt_update(@signingBuf.read)
85
+ end
86
+
87
+ meta = @enc.encrypt_final
88
+
89
+ ts = BinStruct.instance.struct(:sign_encrypt_cipher)
90
+ ts.signer_config = smeta
91
+ ts.cipher_config = meta
92
+ ts.encoded
93
+
94
+ end
95
+
96
+ end
97
+
98
+ end
99
+ end
100
+
@@ -0,0 +1,103 @@
1
+
2
+ require_relative 'compressor'
3
+
4
+ module CcipherFactory
5
+ module Compression
6
+
7
+ module CompressionHelper
8
+
9
+ def decompressor_from_encoded(bin)
10
+
11
+ ts = BinStruct.instance.struct_from_bin(bin)
12
+ case BTag.value_constant(ts.oid)
13
+ when :compression_zlib
14
+ compression_on
15
+ when :compression_none
16
+ compression_off
17
+ else
18
+ compression_off
19
+ end
20
+
21
+ decompressor.decompress_update_meta(bin)
22
+
23
+ end
24
+
25
+ def compression_on
26
+ @compress = true
27
+ end
28
+
29
+ def compression_off
30
+ @compress = false
31
+ end
32
+
33
+ def is_compression_on?
34
+ if @compress.nil?
35
+ false
36
+ else
37
+ @compress
38
+ end
39
+ end
40
+
41
+ def compressor
42
+ if @compressor.nil?
43
+ if is_compression_on?
44
+ @compressor = Compressor.instance.compress
45
+ @compressor.compress_init
46
+ else
47
+ @compressor = Compressor.instance.null_engine
48
+ end
49
+ end
50
+
51
+ @compressor
52
+ end
53
+
54
+ def compress_data_if_active(val)
55
+ if is_compression_on?
56
+ logger.tdebug :compress_if_active, "Compression is on"
57
+ compressor.compress_update(val)
58
+ else
59
+ logger.tdebug :compress_if_active, "Compression is OFF"
60
+ val
61
+ end
62
+ end
63
+
64
+ def decompress_data_if_active(val)
65
+ if is_compression_on?
66
+ logger.tdebug :decompress_if_active, "Decompression is on"
67
+ decompressor.decompress_update(val)
68
+ else
69
+ logger.tdebug :decompress_if_active, "decompression is OFF"
70
+ val
71
+ end
72
+ end
73
+
74
+ def decompressor
75
+ if @decompressor.nil?
76
+ if is_compression_on?
77
+ @decompressor = Compressor.instance.decompress
78
+ @decompressor.decompress_init
79
+ else
80
+ @decompressor = Compressor.instance.null_engine
81
+ end
82
+ end
83
+
84
+ @decompressor
85
+ end
86
+
87
+ def encode_null_compressor
88
+ BinStruct.instance.struct(:compression_none).encoded
89
+ end
90
+
91
+ def logger
92
+ if @logger.nil?
93
+ @logger = Tlogger.new
94
+ @logger.tag = :comp_helper
95
+ end
96
+ @logger
97
+ end
98
+
99
+ end
100
+
101
+
102
+ end
103
+ end
@@ -0,0 +1,55 @@
1
+
2
+ require_relative 'zlib_compressor'
3
+ require_relative 'zlib_decompressor'
4
+
5
+ module CcipherFactory
6
+ class CompressionError < StandardError; end
7
+ class DecompressionError < StandardError; end
8
+ end
9
+
10
+ module CcipherFactory
11
+ module Compression
12
+ #class CompressionError < StandardError; end
13
+ #class DecompressionError < StandardError; end
14
+
15
+ module NullCompressor
16
+ def method_missing(mtd, *args, &block)
17
+ # sink hole
18
+ #args
19
+ end
20
+ end
21
+
22
+ class Compressor
23
+
24
+ def self.instance(eng = :zlib)
25
+ Compressor.new
26
+ end
27
+
28
+ def compress
29
+ self.extend(ZlibCompressor)
30
+ self
31
+ end
32
+
33
+ def decompress
34
+ self.extend(ZlibDecompressor)
35
+ self
36
+ end
37
+
38
+ def null_engine
39
+ self.extend(NullCompressor)
40
+ self
41
+ end
42
+
43
+ def self.supported_envelope
44
+ [:compression_none, :compression_zlib]
45
+ end
46
+
47
+ def self.rebuild(ts, &block)
48
+ Compressor.new
49
+ end
50
+
51
+ end
52
+ end
53
+ end
54
+
55
+
@@ -0,0 +1,48 @@
1
+
2
+ require 'zlib'
3
+
4
+ module CcipherFactory
5
+ module Compression
6
+ module ZlibCompressor
7
+ include CcipherFactory::Common
8
+
9
+ def compress_init(*args, &block)
10
+
11
+ @compressor = Ccrypto::UtilFactory.instance(:compression, Ccrypto::CompressionConfig.new)
12
+ #@compressor = Zlib::Deflate.new
13
+
14
+ if block
15
+ instance_eval(&block)
16
+ compress_final
17
+ else
18
+ self
19
+ end
20
+
21
+ end
22
+
23
+ def compress_update(val)
24
+ res = @compressor.update(val)
25
+ #res = @compressor.deflate(val, Zlib::SYNC_FLUSH)
26
+ write_to_output(res)
27
+ res
28
+ end
29
+
30
+ def compress_final
31
+ @compressor.final
32
+
33
+ ts = BinStruct.instance.struct(:compression_zlib)
34
+ ts.encoded
35
+ end
36
+
37
+ private
38
+ def logger
39
+ if @logger.nil?
40
+ @logger = Tlogger.new
41
+ @logger.tag = :zlibComp
42
+ end
43
+ @logger
44
+ end
45
+
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,67 @@
1
+
2
+ require 'zlib'
3
+
4
+ module CcipherFactory
5
+ module Compression
6
+ module ZlibDecompressor
7
+ include CcipherFactory::Common
8
+
9
+ def decompress_init(*args, &block)
10
+
11
+ if block
12
+ instance_eval(&block)
13
+ decompress_final
14
+ else
15
+ self
16
+ end
17
+
18
+ end
19
+
20
+ def decompress_update_meta(val)
21
+ if @decompressor.nil?
22
+ begin
23
+ intOutputBuf.write(val)
24
+ Encoding.extract_meta(intOutputBuf) do |meta, bal|
25
+ ts = BinStruct.instance.struct_from_bin(meta)
26
+
27
+ case ts.oid
28
+ when BTag.constant_value(:compression_zlib)
29
+ @decompressor = Ccrypto::UtilFactory.instance(:decompression)
30
+ else
31
+ raise DecompressionError, "Unknown compression type '#{ts.id}'"
32
+ end
33
+
34
+ decompress_update(bal)
35
+ end
36
+ rescue Encoding::InsufficientData => e
37
+ end
38
+ else
39
+ decompress_update(val)
40
+ end
41
+ end
42
+
43
+ def decompress_update(val)
44
+ if val.length > 0
45
+ check_state
46
+ begin
47
+ res = @decompressor.update(val)
48
+ write_to_output(res)
49
+ res
50
+ rescue Exception => ex
51
+ raise DecompressionError, ex
52
+ end
53
+ end
54
+ end
55
+
56
+ def decompress_final
57
+ @decompressor.final
58
+ end
59
+
60
+ private
61
+ def check_state
62
+ raise DecompressionError, "Please call decompress_update_meta() to setup the state first." if @decompressor.nil?
63
+ end
64
+
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,180 @@
1
+
2
+ require_relative 'supported_digest'
3
+
4
+ module CcipherFactory
5
+ module Digest
6
+ include TR::CondUtils
7
+ include CcipherFactory::Common
8
+
9
+ class DigestError < StandardError; end
10
+
11
+ class DigestEngine; end
12
+
13
+ def self.instance #(eng = SupportedDigest.instance.default_digest, *args)
14
+ #raise DigestEror, "Digest '#{eng}' is not supported" if not SupportedDigest.instance.is_supported?(eng)
15
+ dig = DigestEngine.new
16
+ dig.extend(Digest)
17
+ dig
18
+ end
19
+
20
+ def self.from_encoded(bin, &block)
21
+ ts = BinStruct.instance.struct_from_bin(bin)
22
+ from_tspec(ts, &block)
23
+ end
24
+
25
+ def self.from_tspec(ts, &block)
26
+
27
+ if ts.oid == BTag.constant_value(:digest_attached)
28
+ dig = from_encoded(ts.digest_config)
29
+ dig.digestVal = ts.digest_value
30
+ dig
31
+ else
32
+
33
+ algo = BTag.value_constant(ts.digest_algo)
34
+ logger.debug "from_encoded algo : #{algo}"
35
+ dig = instance
36
+ dig.salt = ts.salt
37
+ dig.digest_init(algo, dig.salt, &block)
38
+ end
39
+ end
40
+
41
+ def self.parse(bin, &block)
42
+
43
+ res = { }
44
+ ts = BinStruct.instance.struct_from_bin(bin)
45
+ res[:type] = BTag.value_constant(ts.oid)
46
+
47
+ if res[:type] == :digest_attached
48
+ #conf = Encoding::ASN1Decoder.from_encoded(ts.value(:digest_config))
49
+ conf = BinStruct.instance.struct_from_bin(ts.digest_config)
50
+ res[:algo] = BTag.value_constant(conf.digest_algo)
51
+ res[:salt] = conf.salt
52
+ #res[:algo] = Tag.constant_key(conf.value(:digest_algo))
53
+ #res[:salt] = conf.value(:salt)
54
+ end
55
+
56
+ res[:digest] = ts.digest_value
57
+
58
+ res
59
+
60
+ end
61
+
62
+ def self.logger
63
+ if @logger.nil?
64
+ @logger = Tlogger.new
65
+ @logger.tag = :ccfact_digest
66
+ end
67
+ @logger
68
+ end
69
+
70
+ ##
71
+ # Mixin methods
72
+ ##
73
+ attr_accessor :algo, :salt, :digestVal
74
+ def digest_init(*args, &block)
75
+
76
+ logger.debug "args : #{args}"
77
+
78
+ @algo = args.first
79
+ @algo = SupportedDigest.instance.default_digest if is_empty?(@algo)
80
+ raise DigestError, "Given digest '#{@algo}' is not supported.\nPossible digest algo including: #{SupportedDigest.instance.supported.join(", ")}" if not SupportedDigest.instance.is_supported?(@algo)
81
+
82
+ logger.debug "Digest algo in init : #{@algo}"
83
+
84
+ @digest = Ccrypto::AlgoFactory.engine(Ccrypto::DigestConfig).digest(@algo)
85
+
86
+ #@digest = OpenSSL::Digest.new(Digest.to_digest_string(@algo))
87
+
88
+ salt = args[1]
89
+ if not_empty?(salt)
90
+ logger.debug "Salt given #{salt} / #{salt.length}"
91
+
92
+ case salt
93
+ when :random_salt, :random
94
+ saltLen = args[2] || 16
95
+ sre = Ccrypto::AlgoFactory.engine(Ccrypto::SecureRandomConfig)
96
+ @salt = sre.random_bytes(saltLen)
97
+ @digest.digest_update(@salt)
98
+ else
99
+ if salt.is_a?(String)
100
+ @salt = salt
101
+ @digest.digest_update(@salt)
102
+ else
103
+ raise DigestError, "Unknown option '#{salt}' for salt"
104
+ end
105
+ end
106
+ end
107
+
108
+ if block
109
+ instance_eval(&block)
110
+ digest_final
111
+ else
112
+ self
113
+ end
114
+
115
+ end
116
+
117
+ def digest_update(val)
118
+ raise DigestError, "Please call digest_init first before call update() (#{@digest.inspect})" if @digest.nil?
119
+ @digest.digest_update(val)
120
+ end
121
+
122
+ def digest_final
123
+
124
+ raise DigestError, "Please call digest_init first before call final() (#{@digest.inspect})" if @digest.nil?
125
+
126
+ @digestVal = @digest.digest_final
127
+ @digest = nil
128
+
129
+ write_to_output(@digestVal)
130
+
131
+ #ts = Encoding::ASN1Encoder.instance(:digest)
132
+ ts = BinStruct.instance.struct(:digest)
133
+ ts.digest_algo = BTag.constant_value(@algo)
134
+ if not_empty?(@salt)
135
+ ts.salt = @salt
136
+ else
137
+ ts.salt = ""
138
+ end
139
+
140
+ if is_attach_mode?
141
+ tsd = BinStruct.instance.struct(:digest_attached)
142
+ #tsd = Encoding::ASN1Encoder.instance(:digest_attached)
143
+ tsd.digest_config = ts.encoded
144
+ tsd.digest_value = @digestVal
145
+ res = tsd.encoded
146
+ else
147
+ res = ts.encoded
148
+ end
149
+
150
+ res
151
+
152
+ end
153
+
154
+ def self.to_digest_string(sym)
155
+ if not_empty?(sym)
156
+ sym.to_s.gsub("_","-")
157
+ else
158
+ sym
159
+ end
160
+ end
161
+
162
+ #def self.from_digest_engine_to_symbol(str)
163
+ # if not_empty?(str)
164
+ # str.gsub("-","_").to_sym
165
+ # else
166
+ # str
167
+ # end
168
+ #end
169
+
170
+ #def self.init_native_digest_object(digest)
171
+ # OpenSSL::Digest.new(to_digest_string(digest))
172
+ #end
173
+
174
+ private
175
+ def logger
176
+ Digest.logger
177
+ end
178
+
179
+ end
180
+ end
@@ -0,0 +1,47 @@
1
+
2
+ require 'singleton'
3
+
4
+ module CcipherFactory
5
+ module Digest
6
+
7
+ class SupportedDigest
8
+ include Singleton
9
+ attr_reader :supported, :possible, :default_digest
10
+ def initialize
11
+ #@possible = [:sha1, :sha224, :sha256, :sha384, :sha512, :sha3_224, :sha3_256, :sha3_384, :sha3_512, :shake128, :shake256]
12
+ #@supported = []
13
+ #test_algo
14
+
15
+ @dig = Ccrypto::AlgoFactory.engine(Ccrypto::DigestConfig)
16
+
17
+ @possible = @dig.engineKeys.keys
18
+ @supported = @possible
19
+
20
+ if @dig.is_supported?(:sha3_256)
21
+ @default_digest = :sha3_256
22
+ elsif @dig.is_supported?(:sha256)
23
+ @default_digest = :sha256
24
+ else
25
+ raise DigestError, "Failed to set default digest"
26
+ end
27
+ end
28
+
29
+ def is_supported?(algo)
30
+ #@supported.include?(algo)
31
+ @dig.is_supported?(algo)
32
+ end
33
+
34
+ #def test_algo
35
+ # @possible.each do |dig|
36
+ # begin
37
+ # OpenSSL::Digest.new(Digest.to_digest_string(dig))
38
+ # @supported << dig
39
+ # rescue NotImplementedError => e
40
+ # end
41
+ # end
42
+ #end
43
+
44
+ end # class SupportedDigest
45
+
46
+ end
47
+ end