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,85 @@
1
+
2
+ require_relative 'symkey_signer'
3
+
4
+ module CcipherFactory
5
+ module SymKeySigner
6
+
7
+ module SymKeyAttVerify
8
+ include Common
9
+ include Compression::CompressionHelper
10
+
11
+ attr_accessor :verification_key
12
+ def att_verify_init(opts = { }, &block)
13
+
14
+ @params = opts
15
+
16
+ raise SymKeySignerError, "Please provide output for attached verify" if not is_output_given?
17
+
18
+ if block
19
+ instance_eval(&block)
20
+ att_verify_final
21
+ else
22
+ self
23
+ end
24
+
25
+ end
26
+
27
+ def att_verify_update(val)
28
+
29
+ if @ver.nil?
30
+ intOutputBuf.write(val)
31
+ begin
32
+ Encoding.extract_meta(intOutputBuf) do |meta, bal|
33
+
34
+ ts = BinStruct.instance.struct_from_bin(meta)
35
+
36
+ vmeta = ts.symkey_signature
37
+ compression = ts.compression
38
+
39
+ cts = BinStruct.instance.struct_from_bin(compression)
40
+ if cts.oid == BTag.constant_value(:compression_zlib)
41
+ compression_on
42
+ decompressor.decompress_update_meta(compression)
43
+ end
44
+
45
+ @ver = SymKeySigner.verifier
46
+
47
+ @ver.verification_key = @verification_key
48
+ @ver.verify_init(@params)
49
+ @ver.verify_update_meta(vmeta)
50
+
51
+ att_verify_update(bal) if bal.length > 0
52
+
53
+ intOutputBuf.rewind
54
+ intOutputBuf = nil
55
+ end
56
+ rescue Encoding::InsufficientData
57
+ end
58
+ else
59
+ res = decompress_data_if_active(val)
60
+ @ver.verify_update_data(res)
61
+ intOutputFile.write(res)
62
+ end
63
+
64
+ end
65
+
66
+ def att_verify_final
67
+ res = @ver.verify_final
68
+
69
+ if res
70
+ intOutputFile.rewind
71
+ while not intOutputFile.eof?
72
+ write_to_output(intOutputFile.read)
73
+ end
74
+
75
+ disposeOutput(intOutputFile)
76
+ end
77
+
78
+ res
79
+
80
+ end
81
+
82
+ end
83
+
84
+ end
85
+ end
@@ -0,0 +1,101 @@
1
+
2
+
3
+ require_relative 'symkey_encrypt'
4
+ require_relative 'symkey_decrypt'
5
+
6
+ require_relative 'symkey_att_encrypt'
7
+ require_relative 'symkey_att_decrypt'
8
+
9
+ module CcipherFactory
10
+ module SymKeyCipher
11
+ include TR::CondUtils
12
+
13
+ class SKCipher; end
14
+
15
+ #class SymKeyCipherError < StandardError; end
16
+
17
+ def self.encryptor
18
+ c = SKCipher.new
19
+ c.extend(SymKeyEncrypt)
20
+ c
21
+ end
22
+
23
+ def self.decryptor
24
+ dec = SKCipher.new
25
+ dec.extend(SymKeyDecrypt)
26
+ dec
27
+ end
28
+
29
+ def self.att_encryptor
30
+ c = SKCipher.new
31
+ c.extend(SymKeyAttEncrypt)
32
+ c
33
+ end
34
+
35
+ def self.att_decryptor
36
+ c = SKCipher.new
37
+ c.extend(SymKeyAttDecrypt)
38
+ c
39
+ end
40
+
41
+ #def self.mode_to_spec(mode)
42
+ # if not_empty?(mode)
43
+ # mode.to_s.upcase
44
+ # else
45
+ # mode
46
+ # end
47
+ #end
48
+
49
+ #def self.key_to_spec(key, mode)
50
+ # if not_empty?(key)
51
+ # case key.keytype
52
+ # when :aes
53
+ # "AES-#{key.keysize}-#{mode_to_spec(mode)}"
54
+ # when :chacha20_poly1305, :chacha20
55
+ # "chacha20-poly1305"
56
+ # when :blowfish
57
+ # "bf-#{mode_to_spec(mode)}"
58
+ # when :camellia
59
+ # "camellia-#{key.keysize}-#{mode_to_spec(mode)}"
60
+ # when :aria
61
+ # "aria-#{key.keysize}-#{mode_to_spec(mode)}"
62
+ # else
63
+ # raise SymKeyCipherError, "Unknown key type '#{key.keytype}'"
64
+ # end
65
+ # else
66
+ # raise SymKeyCipherError, "Given key to translate to spec is nil"
67
+ # end
68
+ #end
69
+
70
+ #def self.iv_length(key, mode)
71
+ # c = OpenSSL::Cipher.new(key_to_spec(key, mode))
72
+ # c.random_iv.length
73
+ #end
74
+
75
+ def SymKeyCipher.algo_default(algo)
76
+ case algo
77
+ when :aes
78
+ # param 0: Algo name for spec
79
+ # param 1: key size
80
+ # param 2: default mdoe
81
+ #["AES", 256, :gcm]
82
+ Ccrypto::DirectCipherConfig.new({ algo: :aes, keysize: 256, mode: :gcm, padding: :pkcs5 })
83
+ when :chacha20_poly1305, :chacha20
84
+ Ccrypto::DirectCipherConfig.new({ algo: :chacha20, keysize: 256, mode: :poly1305 })
85
+ #["chacha20-poly1305", 256]
86
+ when :blowfish
87
+ Ccrypto::DirectCipherConfig.new({ algo: :blowfish, keysize: 128, mode: :cfb, padding: :pkcs5 })
88
+ #["bf", 128, :ofb]
89
+ when :camellia
90
+ Ccrypto::DirectCipherConfig.new({ algo: :camellia, keysize: 256, mode: :ctr, padding: :pkcs5 })
91
+ #["camellia", 256, :ctr]
92
+ when :aria
93
+ Ccrypto::DirectCipherConfig.new({ algo: :aria, keysize: 256, mode: :gcm, padding: :pkcs5 })
94
+ #["aria", 256, :gcm]
95
+ else
96
+ raise SymKeyCipherError, "Unknown algo '#{algo}' default"
97
+ end
98
+ end
99
+
100
+ end
101
+ end
@@ -0,0 +1,144 @@
1
+
2
+ require_relative '../compression/compressor'
3
+
4
+ module CcipherFactory
5
+ module SymKeyCipher
6
+ module SymKeyDecrypt
7
+ include TR::CondUtils
8
+ include Common
9
+ include Compression::CompressionHelper
10
+
11
+ class SymKeyDecryptError < StandardError; end
12
+
13
+ attr_accessor :key
14
+
15
+ def init
16
+
17
+ end
18
+
19
+ def decrypt_init(*args, &block)
20
+
21
+ #@decKey = args.first
22
+ raise SymKeyDecryptError, "Decryption key is required" if is_empty?(@key)
23
+
24
+ if block
25
+ instance_eval(&block)
26
+ decrypt_final
27
+ else
28
+ self
29
+ end
30
+
31
+ end
32
+
33
+ def decrypt_update_meta(val)
34
+
35
+ intOutputBuf.write(val)
36
+ begin
37
+ Encoding.extract_meta(intOutputBuf) do |meta, bal|
38
+
39
+ ts = BinStruct.instance.struct_from_bin(meta)
40
+ @mode = BTag.value_constant(ts.mode)
41
+ iv = ts.iv
42
+ comp = ts.compression
43
+
44
+ cts = BinStruct.instance.struct_from_bin(comp)
45
+ if cts.oid == BTag.constant_value(:compression_zlib)
46
+ @decompressor = CcipherFactory::Compression::Compressor.new
47
+ @decompressor.decompress
48
+ @decompressor.decompress_init
49
+ @decompressor.decompress_update_meta(comp)
50
+
51
+ compression_on
52
+ logger.tdebug :symkey_dec, "Compression is active"
53
+ else
54
+ compression_off
55
+ logger.tdebug :symkey_dec, "Compression is NOT active"
56
+ end
57
+
58
+ authTag = ts.auth_tag
59
+
60
+ algoDef = SymKeyCipher.algo_default(@key.keytype)
61
+
62
+ cconf = Ccrypto::DirectCipherConfig.new({ algo: @key.keytype, keysize: @key.keysize, mode: @mode, padding: :pkcs5 })
63
+ cconf.cipherOps = :decrypt
64
+ cconf.key = @key.key
65
+ cconf.iv = iv if not_empty?(iv)
66
+ cconf.auth_tag = authTag if cconf.respond_to?(:auth_tag=)
67
+ @cipher = Ccrypto::AlgoFactory.engine(cconf)
68
+
69
+ @cipher
70
+
71
+ end
72
+ rescue Encoding::InsufficientData => e
73
+ end
74
+
75
+
76
+ end
77
+
78
+ def decrypt_update_cipher(val)
79
+
80
+ raise SymKeyCipherError, "Please call update_meta() first before update_cipher()" if @cipher.nil?
81
+
82
+ logger.debug "Given cipher data : #{val.length}"
83
+
84
+ dec = @cipher.update(val)
85
+
86
+
87
+ if not_empty?(dec) and dec.length > 0
88
+
89
+ logger.debug "After cipher before compression check : #{dec.length}"
90
+ res = decompress_data_if_active(dec)
91
+ write_to_output(res)
92
+
93
+ #if @decompressor.nil?
94
+ # dc = dec
95
+ #else
96
+ # begin
97
+ # dc = @decompressor.decompress_update(dec)
98
+ # rescue Zlib::Error => ex
99
+ # raise SymKeyDecryptionError, "Data decompression failed: #{ex.message}"
100
+ # end
101
+ #end
102
+
103
+ #write_to_output(dc)
104
+
105
+ else
106
+
107
+ logger.debug "Cipher update returns nothing"
108
+ end
109
+
110
+ end
111
+
112
+ def decrypt_final
113
+
114
+ begin
115
+ dec = @cipher.final
116
+ logger.debug "Final length : #{dec.length}"
117
+ res = decompress_data_if_active(dec)
118
+ write_to_output(res)
119
+ rescue Ccrypto::CipherEngineException => ex
120
+ raise SymKeyDecryptionError, ex
121
+ end
122
+
123
+ @cipher = nil
124
+
125
+ @key = nil
126
+ # this is to clear up the cipher object from memory
127
+ # including key and IV value
128
+ # Tested with aes-finder utility on ruby 3.0.2
129
+ # https://github.com/mmozeiko/aes-finder
130
+ GC.start
131
+
132
+ end
133
+
134
+ def logger
135
+ if @logger.nil?
136
+ @logger = Tlogger.new
137
+ @logger.tag = :symkey_dec
138
+ end
139
+ @logger
140
+ end
141
+
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,164 @@
1
+
2
+ require_relative '../compression/compression_helper'
3
+
4
+ module CcipherFactory
5
+ module SymKeyCipher
6
+ module SymKeyEncrypt
7
+ include TR::CondUtils
8
+ include Common
9
+ include Compression::CompressionHelper
10
+
11
+ attr_accessor :key, :mode, :iv
12
+
13
+ def encrypt_init(*args, &block)
14
+
15
+ raise SymKeyCipherError, "Encryption key is required" if is_empty?(@key)
16
+ raise SymKeyCipherError, "SymKey object is required" if not @key.is_a?(SymKey)
17
+ raise SymKeyCipherError, "Cipher requires output to be set" if not is_output_given?
18
+
19
+ #_, _, mode = SymKeyCipher.algo_default(@key.keytype)
20
+ @cconf = SymKeyCipher.algo_default(@key.keytype)
21
+ @cconf.key = @key.key
22
+ @cconf.keysize = @key.keysize
23
+ @cconf.iv = @iv if not_empty?(@iv)
24
+ if is_empty?(@mode)
25
+ @mode = @cconf.mode
26
+ else
27
+ @cconf.mode = @mode
28
+ end
29
+
30
+ #spec = SymKeyCipher.key_to_spec(@key, @mode)
31
+ logger.tdebug :symkey_enc, "Encrypt cipher spec : #{@cconf}"
32
+
33
+
34
+ @cconf.cipherOps = :encrypt
35
+ begin
36
+ @cipher = Ccrypto::AlgoFactory.engine(@cconf)
37
+ #rescue Ccrypto::CipherEngineException => ex
38
+ rescue Exception => ex
39
+ raise SymKeyCipherError, ex
40
+ end
41
+
42
+
43
+ #@cipher = OpenSSL::Cipher.new(cconf.provider_config)
44
+ #@cipher.encrypt
45
+ #@cipher.key = @key.key
46
+
47
+ #if is_empty?(@iv)
48
+ # @iv = @cipher.random_iv
49
+ #else
50
+ # @cipher.iv = @iv
51
+ #end
52
+
53
+ if is_compression_on?
54
+ logger.tdebug :symkey_enc, "Compression on"
55
+ else
56
+ logger.tdebug :symkey_enc, "Compression off"
57
+ end
58
+
59
+ @totalPlain = 0
60
+ @totalCompressed = 0
61
+
62
+ if block
63
+ instance_eval(&block)
64
+ encrypt_final
65
+ else
66
+ self
67
+ end
68
+
69
+ end
70
+
71
+ def encrypt_update(val)
72
+
73
+ if not_empty?(val)
74
+ @totalPlain += val.length
75
+ cval = compress_data_if_active(val)
76
+ @totalCompressed += cval.length
77
+
78
+ enc = @cipher.update(cval)
79
+ if not_empty?(enc)
80
+ write_to_output(enc)
81
+ end
82
+ end
83
+
84
+ end
85
+
86
+ def encrypt_final
87
+
88
+ #if not is_gcm_mode?
89
+ enc = @cipher.final
90
+ logger.debug "Cipher final returns #{enc.length} bytes"
91
+ write_to_output(enc)
92
+ #end
93
+
94
+ @cipher = nil
95
+ # this is to clear up the cipher object from memory
96
+ # including key and IV value
97
+ # Tested with aes-finder utility on ruby 3.0.2
98
+ # https://github.com/mmozeiko/aes-finder
99
+ GC.start
100
+
101
+ @iv = @cconf.iv if is_empty?(@iv)
102
+
103
+ conv = Ccrypto::UtilFactory.instance(:data_converter)
104
+ #logger.debug "Key : #{conv.to_hex(@key.key)}"
105
+ #logger.debug "IV : #{conv.to_hex(@iv)}"
106
+ #logger.debug "Mode : #{@mode}"
107
+ #logger.debug "Output : #{conv.to_hex(@output.string)}"
108
+
109
+ #ts = Encoding::ASN1Encoder.instance(:symkey_cipher)
110
+ ts = BinStruct.instance.struct(:symkey_cipher)
111
+ if is_empty?(@mode)
112
+ ts.mode = 0
113
+ logger.debug "Encoding null mode"
114
+ else
115
+ ts.mode = BTag.constant_value(@mode)
116
+ logger.debug "Encoding mode #{@mode}"
117
+ end
118
+
119
+ if is_empty?(@iv)
120
+ ts.iv = ""
121
+ logger.debug "Encoding empty IV"
122
+ else
123
+ ts.iv = @iv
124
+ logger.debug "Encoding IV of #{@iv.length} bytes"
125
+ end
126
+
127
+ if is_compression_on?
128
+ ts.compression = compressor.compress_final
129
+ logger.tdebug :symkey_enc, "Plain : #{@totalPlain} / Compressed : #{@totalCompressed} = #{(@totalCompressed*1.0)/@totalPlain*100} %"
130
+ else
131
+ ts.compression = BinStruct.instance.struct(:compression_none).encoded
132
+ end
133
+
134
+ if @cconf.respond_to?(:auth_tag)
135
+ if is_empty?(@cconf.auth_tag)
136
+ ts.auth_tag = ""
137
+ logger.debug "Encoding empty AuthTag"
138
+ else
139
+ ts.auth_tag = @cconf.auth_tag
140
+ logger.debug "Encoding AuthTag of #{@cconf.auth_tag.length}"
141
+ end
142
+ else
143
+ ts.auth_tag = ""
144
+ logger.debug "AuthTag not relevent"
145
+ end
146
+
147
+ #logger.debug "encoding : #{ts.inspect}"
148
+
149
+ ts.encoded
150
+
151
+ end
152
+
153
+ private
154
+ def logger
155
+ if @logger.nil?
156
+ @logger = Tlogger.new
157
+ @logger.tag = :symkey_enc
158
+ end
159
+ @logger
160
+ end
161
+
162
+ end
163
+ end
164
+ end
@@ -0,0 +1,70 @@
1
+
2
+ require 'openssl'
3
+
4
+ require_relative '../digest/supported_digest'
5
+
6
+ module CcipherFactory
7
+ module SymKeySigner
8
+
9
+ module SymKeySign
10
+ include TR::CondUtils
11
+ include Common
12
+
13
+ attr_accessor :signing_key, :digest_algo
14
+
15
+ def init
16
+ @digest_algo = Digest::SupportedDigest.instance.default_digest
17
+ end
18
+
19
+ def sign_init(opts = { }, &block)
20
+
21
+ raise SymKeySignerError, "Signing symkey is required" if is_empty?(@signing_key)
22
+ raise SymKeySignerError, "Given digest algo is not supported" if not Digest::SupportedDigest.instance.is_supported?(@digest_algo)
23
+
24
+ hconf = Ccrypto::HMACConfig.new
25
+ hconf.key = Ccrypto::SecretKey.new(@signing_key.keytype, @signing_key.key)
26
+ hconf.digest = @digest_algo
27
+
28
+ @hmac = Ccrypto::AlgoFactory.engine(hconf)
29
+
30
+ #@hmac = OpenSSL::HMAC.new(@signing_key.key, OpenSSL::Digest.new(Digest.to_digest_string(@digest_algo)))
31
+
32
+ if block
33
+ instance_eval(&block)
34
+ sign_final
35
+ else
36
+ self
37
+ end
38
+
39
+ end
40
+
41
+ def sign_update(val)
42
+ raise SymKeySignerError, "Please call sign_init before sign_update" if @hmac.nil?
43
+ @hmac.hmac_update(val)
44
+ end
45
+
46
+ def sign_final
47
+
48
+ raise SymKeySignerError, "Please call sign_init before sign_update" if @hmac.nil?
49
+
50
+ sign = @hmac.hmac_final
51
+
52
+ ts = BinStruct.instance.struct(:symkey_signature)
53
+ ts.digest_algo = BTag.constant_value(@digest_algo)
54
+ ts.signature = sign
55
+ ts.encoded
56
+
57
+ end
58
+
59
+ def logger
60
+ if @logger.nil?
61
+ @logger = Tlogger.new
62
+ @logger.tag = :symkey_sign
63
+ end
64
+ @logger
65
+ end
66
+
67
+ end
68
+
69
+ end
70
+ end
@@ -0,0 +1,59 @@
1
+
2
+
3
+ module CcipherFactory
4
+ module SymKeySigner
5
+ include TR::CondUtils
6
+
7
+ class SKSigner; end
8
+
9
+ class SymKeySignerError < StandardError; end
10
+
11
+ def self.signer
12
+ s = SKSigner.new
13
+ s.extend(CcipherFactory::SymKeySigner::SymKeySign)
14
+ s.init if s.respond_to?(:init)
15
+ s
16
+ end
17
+
18
+ def self.att_signer
19
+ s = SKSigner.new
20
+ s.extend(SymKeyAttSign)
21
+ s.init if s.respond_to?(:init)
22
+ s
23
+ end
24
+
25
+ def self.verifier
26
+ s = SKSigner.new
27
+ s.extend(SymKeyVerify)
28
+ s.init if s.respond_to?(:init)
29
+ s
30
+ end
31
+
32
+ def self.att_verifier
33
+ s = SKSigner.new
34
+ s.extend(SymKeyAttVerify)
35
+ s.init if s.respond_to?(:init)
36
+ s
37
+ end
38
+
39
+ def SymKeySigner.algo_default(algo)
40
+
41
+ case algo
42
+ when :ecc
43
+ { curve: :prime256v1 }
44
+ when :rsa
45
+ { keysize: 2048 }
46
+ end
47
+
48
+ end
49
+
50
+ end
51
+ end
52
+
53
+
54
+ require_relative 'symkey_sign'
55
+ require_relative 'symkey_verify'
56
+
57
+ require_relative 'symkey_att_sign'
58
+ require_relative 'symkey_att_verify'
59
+
@@ -0,0 +1,76 @@
1
+
2
+
3
+
4
+ module CcipherFactory
5
+ module SymKeySigner
6
+
7
+ module SymKeyVerify
8
+ include TR::CondUtils
9
+
10
+ attr_accessor :verification_key
11
+ def verify_init(opts = { }, &block)
12
+
13
+ if block
14
+ instance_eval(&block)
15
+ verify_final
16
+ else
17
+ self
18
+ end
19
+
20
+ end
21
+
22
+ def verify_update_meta(meta)
23
+
24
+ ts = BinStruct.instance.struct_from_bin(meta)
25
+ digestAlgo = BTag.value_constant(ts.digest_algo)
26
+ @sign = ts.signature
27
+
28
+ raise SymKeySignerError, "Verification key must be given" if is_empty?(@verification_key)
29
+
30
+ raise SymKeySignerError, "Symmetric key type is expected" if not @verification_key.is_a?(SymKey)
31
+
32
+ raise SymKeySignerError, "Given digest algo '#{digestAlgo}' is not supported" if not Digest::SupportedDigest.instance.is_supported?(digestAlgo)
33
+
34
+ hconf = Ccrypto::HMACConfig.new
35
+ hconf.key = Ccrypto::SecretKey.new(@verification_key.keytype, @verification_key.key)
36
+ hconf.digest = digestAlgo
37
+
38
+ @hmac = Ccrypto::AlgoFactory.engine(hconf)
39
+
40
+ #@hmac = OpenSSL::HMAC.new(@verification_key.key, OpenSSL::Digest.new(Digest.to_digest_string(digestAlgo)))
41
+
42
+ end
43
+
44
+ def verify_update_data(val)
45
+ @hmac.hmac_update(val)
46
+ end
47
+
48
+ def verify_final
49
+
50
+ sign = @hmac.hmac_final
51
+
52
+ comp = Ccrypto::UtilFactory.instance(:comparator)
53
+ res = comp.is_equal?(sign, @sign)
54
+ #res = (sign == @sign)
55
+
56
+ if not res
57
+ logger.tdebug :symkey_ver, "Generated : #{sign}"
58
+ logger.tdebug :symkey_ver, "Enveloped : #{@sign}"
59
+ end
60
+
61
+ res
62
+
63
+ end
64
+
65
+ def logger
66
+ if @logger.nil?
67
+ @logger = Tlogger.new
68
+ @logger.tag = :symkey_ver
69
+ end
70
+ @logger
71
+ end
72
+
73
+ end
74
+
75
+ end
76
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CcipherFactory
4
+ VERSION = "0.1.0"
5
+ end