izokatu 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +3 -0
- data.tar.gz.sig +2 -0
- data/.gitignore +19 -0
- data/.rspec +3 -0
- data/.rubocop.yml +42 -0
- data/.yardopts +1 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +86 -0
- data/LICENSE.txt +21 -0
- data/README.md +152 -0
- data/Rakefile +8 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/certs/mongalless.pem +26 -0
- data/izokatu.gemspec +47 -0
- data/lib/izokatu.rb +423 -0
- data/lib/izokatu/action_call_options_selector.rb +214 -0
- data/lib/izokatu/action_call_selector.rb +132 -0
- data/lib/izokatu/callable.rb +13 -0
- data/lib/izokatu/ciphers.rb +18 -0
- data/lib/izokatu/decrypter.rb +62 -0
- data/lib/izokatu/encrypter.rb +67 -0
- data/lib/izokatu/exporter.rb +36 -0
- data/lib/izokatu/exporter/file_exporter.rb +36 -0
- data/lib/izokatu/exporter/function_exporter.rb +16 -0
- data/lib/izokatu/exporter/stdout_exporter.rb +18 -0
- data/lib/izokatu/helpers.rb +213 -0
- data/lib/izokatu/importer/file_importer.rb +47 -0
- data/lib/izokatu/importer/function_importer.rb +36 -0
- data/lib/izokatu/izokatu_elements_requires.rb +46 -0
- data/lib/izokatu/keys_generator.rb +53 -0
- data/lib/izokatu/openssl/private_key/auth/ccm/decrypter.rb +67 -0
- data/lib/izokatu/openssl/private_key/auth/ccm/encrypter.rb +56 -0
- data/lib/izokatu/openssl/private_key/auth/decrypter.rb +79 -0
- data/lib/izokatu/openssl/private_key/auth/encrypter.rb +69 -0
- data/lib/izokatu/openssl/private_key/default/decrypter.rb +75 -0
- data/lib/izokatu/openssl/private_key/default/encrypter.rb +75 -0
- data/lib/izokatu/openssl/public_key/ec/decrypter.rb +105 -0
- data/lib/izokatu/openssl/public_key/ec/encrypter.rb +106 -0
- data/lib/izokatu/openssl/public_key/ec/keys_generator.rb +77 -0
- data/lib/izokatu/openssl/public_key/rsa/decrypter.rb +53 -0
- data/lib/izokatu/openssl/public_key/rsa/encrypter.rb +55 -0
- data/lib/izokatu/openssl/public_key/rsa/keys_generator.rb +64 -0
- data/lib/izokatu/rbnacl/decrypter.rb +42 -0
- data/lib/izokatu/rbnacl/encrypter.rb +45 -0
- data/lib/izokatu/rbnacl/private_key/decrypter.rb +56 -0
- data/lib/izokatu/rbnacl/private_key/encrypter.rb +61 -0
- data/lib/izokatu/rbnacl/public_key/decrypter.rb +51 -0
- data/lib/izokatu/rbnacl/public_key/encrypter.rb +61 -0
- data/lib/izokatu/rbnacl/public_key/keys_generator.rb +33 -0
- data/lib/izokatu/version.rb +6 -0
- metadata +315 -0
- metadata.gz.sig +0 -0
@@ -0,0 +1,132 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Izokatu
|
4
|
+
# Izokatu selector of action class to be called
|
5
|
+
class ActionCallSelector
|
6
|
+
extend Callable
|
7
|
+
|
8
|
+
include Contracts
|
9
|
+
|
10
|
+
# @return [Symbol] library used for encryption/decryption
|
11
|
+
attr_reader :via
|
12
|
+
# @return [Symbol] mode of encryption/decryption
|
13
|
+
attr_reader :mode
|
14
|
+
# @return [Symbol] action to execute
|
15
|
+
attr_reader :action
|
16
|
+
# @return [Symbol] OpenSSL public key cipher type
|
17
|
+
attr_reader :asym_cipher_type
|
18
|
+
# @return [Bool] equality of cipher mode to CCM
|
19
|
+
attr_reader :ccm_cipher
|
20
|
+
# @return [Bool] status of cipher as authenticated
|
21
|
+
attr_reader :auth_cipher
|
22
|
+
|
23
|
+
Contract Contracts::HashOf[Symbol, Or[Symbol, Bool]] => Any
|
24
|
+
# Initializing options for selection of action class
|
25
|
+
#
|
26
|
+
# @param via (#via)
|
27
|
+
# @param mode (#mode)
|
28
|
+
# @param action (#action)
|
29
|
+
# @param asym_cipher_type (#asym_cipher_type)
|
30
|
+
# @param ccm_cipher (#ccm_cipher)
|
31
|
+
# @param auth_cipher (#auth_cipher)
|
32
|
+
#
|
33
|
+
# @since 0.1.0
|
34
|
+
def initialize(via:, mode:, action:, asym_cipher_type:, ccm_cipher:, auth_cipher:)
|
35
|
+
@via = via
|
36
|
+
@mode = mode
|
37
|
+
@action = action
|
38
|
+
@asym_cipher_type = asym_cipher_type
|
39
|
+
@ccm_cipher = ccm_cipher
|
40
|
+
@auth_cipher = auth_cipher
|
41
|
+
end
|
42
|
+
|
43
|
+
Contract None => Class
|
44
|
+
# Selecting action class for keys generation or encryption/decryption
|
45
|
+
#
|
46
|
+
# @return [Class] selected class for keys generation
|
47
|
+
#
|
48
|
+
# @since 0.1.0
|
49
|
+
def perform
|
50
|
+
action == :keys_generation ? select_keys_generation_action_call : select_default_action_call
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
Contract None => Class
|
56
|
+
# Selecting action class for keys generation
|
57
|
+
#
|
58
|
+
# @return [Class] selected class for keys generation
|
59
|
+
#
|
60
|
+
# @since 0.1.0
|
61
|
+
def select_keys_generation_action_call
|
62
|
+
case [via, mode, action, asym_cipher_type, ccm_cipher, auth_cipher]
|
63
|
+
in [:rbnacl, :public_key, :keys_generation, _, _, _]
|
64
|
+
Izokatu::Rbnacl::PublicKey::KeysGenerator
|
65
|
+
in [:openssl, :public_key, :keys_generation, :rsa, _, _]
|
66
|
+
Izokatu::Openssl::PublicKey::RSA::KeysGenerator
|
67
|
+
in [:openssl, :public_key, :keys_generation, :ec, _, _]
|
68
|
+
Izokatu::Openssl::PublicKey::EC::KeysGenerator
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
Contract None => Class
|
73
|
+
# Selecting action class for encryption/decryption
|
74
|
+
#
|
75
|
+
# @return [Class] selected class for encryption/decryption
|
76
|
+
#
|
77
|
+
# @since 0.1.0
|
78
|
+
def select_default_action_call
|
79
|
+
via == :rbnacl ? select_rbnacl_action_call : select_openssl_action_call
|
80
|
+
end
|
81
|
+
|
82
|
+
Contract None => Class
|
83
|
+
# Selecting action class for Rbnacl encryption/decryption
|
84
|
+
#
|
85
|
+
# @return [Class] selected class for Rbnal encryption/decryption
|
86
|
+
#
|
87
|
+
# @since 0.1.0
|
88
|
+
def select_rbnacl_action_call
|
89
|
+
case [via, mode, action, asym_cipher_type, ccm_cipher, auth_cipher]
|
90
|
+
in [:rbnacl, :private_key, :encryption, _, _, _]
|
91
|
+
Izokatu::Rbnacl::PrivateKey::Encrypter
|
92
|
+
in [:rbnacl, :private_key, :decryption, _, _, _]
|
93
|
+
Izokatu::Rbnacl::PrivateKey::Decrypter
|
94
|
+
in [:rbnacl, :public_key, :encryption, _, _, _]
|
95
|
+
Izokatu::Rbnacl::PublicKey::Encrypter
|
96
|
+
in [:rbnacl, :public_key, :decryption, _, _, _]
|
97
|
+
Izokatu::Rbnacl::PublicKey::Decrypter
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
Contract None => Class
|
102
|
+
# Selecting action class for Openssl encryption/decryption
|
103
|
+
#
|
104
|
+
# @return [Class] selected class for encryption/decryption
|
105
|
+
#
|
106
|
+
# @since 0.1.0
|
107
|
+
def select_openssl_action_call
|
108
|
+
case [via, mode, action, asym_cipher_type, ccm_cipher, auth_cipher]
|
109
|
+
in [:openssl, :private_key, :encryption, _, false, false]
|
110
|
+
Izokatu::Openssl::PrivateKey::Default::Encrypter
|
111
|
+
in [:openssl, :private_key, :decryption, _, false, false]
|
112
|
+
Izokatu::Openssl::PrivateKey::Default::Decrypter
|
113
|
+
in [:openssl, :private_key, :encryption, _, false, true]
|
114
|
+
Izokatu::Openssl::PrivateKey::Auth::Encrypter
|
115
|
+
in [:openssl, :private_key, :decryption, _, false, true]
|
116
|
+
Izokatu::Openssl::PrivateKey::Auth::Decrypter
|
117
|
+
in [:openssl, :private_key, :encryption, _, true, _]
|
118
|
+
Izokatu::Openssl::PrivateKey::Auth::CCM::Encrypter
|
119
|
+
in [:openssl, :private_key, :decryption, _, true, _]
|
120
|
+
Izokatu::Openssl::PrivateKey::Auth::CCM::Decrypter
|
121
|
+
in [:openssl, :public_key, :encryption, :rsa, _, _]
|
122
|
+
Izokatu::Openssl::PublicKey::RSA::Encrypter
|
123
|
+
in [:openssl, :public_key, :decryption, :rsa, _, _]
|
124
|
+
Izokatu::Openssl::PublicKey::RSA::Decrypter
|
125
|
+
in [:openssl, :public_key, :encryption, :ec, _, _]
|
126
|
+
Izokatu::Openssl::PublicKey::EC::Encrypter
|
127
|
+
in [:openssl, :public_key, :decryption, :ec, _, _]
|
128
|
+
Izokatu::Openssl::PublicKey::EC::Decrypter
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Izokatu
|
4
|
+
# Namespace for OpenSSL classes
|
5
|
+
module Openssl
|
6
|
+
# List of OpenSSL private key ciphers
|
7
|
+
PKEY_CIPHERS = OpenSSL::Cipher.ciphers.map(&:upcase)
|
8
|
+
|
9
|
+
# Wrap cipher are not working in Openssl. Here text of error:
|
10
|
+
# OpenSSL::Cipher::CipherError: wrap mode not allowed
|
11
|
+
# Or straight from openssl 1.1.1d
|
12
|
+
# error:0607B0AA:digital envelope routines:EVP_CipherInit_ex:wrap mode not allowed:../crypto/evp/evp_enc.c:161
|
13
|
+
PKEY_CIPHERS.delete_if { |name| name.include?('WRAP') }
|
14
|
+
|
15
|
+
# List of OpenSSL public key EC ciphers
|
16
|
+
PBKEY_EC_CIPHERS = OpenSSL::PKey::EC.builtin_curves.map! { |cipher_name, _| cipher_name }
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Izokatu
|
4
|
+
# Abstract class for decrypters
|
5
|
+
#
|
6
|
+
# @abstract Subclasses are containing implementation of {#decrypt_data!}
|
7
|
+
class Decrypter
|
8
|
+
extend Callable
|
9
|
+
|
10
|
+
include Contracts
|
11
|
+
|
12
|
+
# @return decrypter instance
|
13
|
+
attr_reader :decrypter
|
14
|
+
# @return [String] encrypted data for decryption
|
15
|
+
attr_reader :encrypted_data
|
16
|
+
# @return [Hash] decrypted data for export
|
17
|
+
attr_reader :decrypted_data
|
18
|
+
|
19
|
+
Contract Contracts::HashOf[Symbol, String] => Any
|
20
|
+
# Initializing option for decryption
|
21
|
+
#
|
22
|
+
# @param encrypted_data (#encrypted_data)
|
23
|
+
#
|
24
|
+
# @since 0.1.0
|
25
|
+
def initialize(encrypted_data:)
|
26
|
+
import_encrypted_data!(encrypted_data)
|
27
|
+
end
|
28
|
+
|
29
|
+
Contract String => String
|
30
|
+
# Importing encrypted data from param
|
31
|
+
#
|
32
|
+
# @param encrypted_data (#encrypted_data)
|
33
|
+
#
|
34
|
+
# @return [String] (#encrypted_data)
|
35
|
+
#
|
36
|
+
# @since 0.1.0
|
37
|
+
def import_encrypted_data!(encrypted_data)
|
38
|
+
@encrypted_data = encrypted_data
|
39
|
+
end
|
40
|
+
|
41
|
+
Contract None => Contracts::HashOf[Symbol, String]
|
42
|
+
# Performing data decryption
|
43
|
+
#
|
44
|
+
# @return [Hash] decrypted data
|
45
|
+
#
|
46
|
+
# @since 0.1.0
|
47
|
+
def perform
|
48
|
+
decrypt_data!
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
# Decrypting data
|
54
|
+
#
|
55
|
+
# @raise RuntimeError
|
56
|
+
#
|
57
|
+
# @since 0.1.0
|
58
|
+
def decrypt_data!
|
59
|
+
raise 'Not implemented!'
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Izokatu
|
4
|
+
# Abstract class for encrypters
|
5
|
+
#
|
6
|
+
# @abstract Subclasses are containing implementation of {#encrypt_data!}
|
7
|
+
class Encrypter
|
8
|
+
extend Callable
|
9
|
+
|
10
|
+
include Contracts
|
11
|
+
|
12
|
+
# @return encrypter instance
|
13
|
+
attr_reader :encrypter
|
14
|
+
# @return [String] clear data for encryption
|
15
|
+
attr_reader :clear_data
|
16
|
+
# @return [Hash] encrypted data for export
|
17
|
+
attr_reader :encrypted_data
|
18
|
+
|
19
|
+
# Default options for Izokatu::Encrypter
|
20
|
+
DEFAULT_OPTIONS = {
|
21
|
+
clear_data_string: 'Testing, testing...'
|
22
|
+
}.freeze
|
23
|
+
|
24
|
+
Contract Contracts::HashOf[Symbol, String] => Any
|
25
|
+
# Initializing option for encryption
|
26
|
+
#
|
27
|
+
# @param clear_data (#clear_data)
|
28
|
+
#
|
29
|
+
# @since 0.1.0
|
30
|
+
def initialize(clear_data:)
|
31
|
+
import_clear_data!(clear_data)
|
32
|
+
end
|
33
|
+
|
34
|
+
Contract String => String
|
35
|
+
# Imporing clear data from options
|
36
|
+
#
|
37
|
+
# @param clear_data (#clear_data)
|
38
|
+
#
|
39
|
+
# @return [String] (#clear_data)
|
40
|
+
#
|
41
|
+
# @since 0.1.0
|
42
|
+
def import_clear_data!(clear_data)
|
43
|
+
@clear_data = clear_data || DEFAULT_OPTIONS[:clear_data_string]
|
44
|
+
end
|
45
|
+
|
46
|
+
Contract None => Contracts::ArrayOf[Contracts::HashOf[Symbol, Maybe[String]]]
|
47
|
+
# Performing encryption
|
48
|
+
#
|
49
|
+
# @return [Hash] encrypted data with params
|
50
|
+
#
|
51
|
+
# @since 0.1.0
|
52
|
+
def perform
|
53
|
+
encrypt_data!
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
# Encrypting data`
|
59
|
+
#
|
60
|
+
# @raise RuntimeError
|
61
|
+
#
|
62
|
+
# @since 0.1.0
|
63
|
+
def encrypt_data!
|
64
|
+
raise 'Not implemented!'
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Izokatu
|
4
|
+
# Abstract class for exporters
|
5
|
+
#
|
6
|
+
# @abstract Subclasses are containing implementation of {#perform}
|
7
|
+
class Exporter
|
8
|
+
extend Callable
|
9
|
+
|
10
|
+
include Contracts
|
11
|
+
include Izokatu::Helpers
|
12
|
+
|
13
|
+
# @return [String] data for export
|
14
|
+
attr_reader :data
|
15
|
+
|
16
|
+
Contract Contracts::HashOf[Symbol, Or[Contracts::HashOf[Symbol, Maybe[String]], Bool]] => Any
|
17
|
+
# Initializing data for export
|
18
|
+
#
|
19
|
+
# @param data (#data)
|
20
|
+
# @param encode [TrueClass || FalseClass] Enable/disable encoding of exported data
|
21
|
+
#
|
22
|
+
# @since 0.1.0
|
23
|
+
def initialize(data:, encode:)
|
24
|
+
@data = encode ? encode_data(data) : data
|
25
|
+
end
|
26
|
+
|
27
|
+
# Performing export of initialized data
|
28
|
+
#
|
29
|
+
# @raise RuntimeError
|
30
|
+
#
|
31
|
+
# @since 0.1.0
|
32
|
+
def perform
|
33
|
+
raise 'Not implemented!'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Izokatu
|
4
|
+
# Izokatu exporter for exporting data in some file
|
5
|
+
class FileExporter < Izokatu::Exporter
|
6
|
+
# @return [String] name of file to export
|
7
|
+
attr_reader :filename
|
8
|
+
|
9
|
+
Contract Contracts::HashOf[Symbol, Or[Contracts::HashOf[Symbol, Maybe[String]], String, Bool]] => Any
|
10
|
+
# Initializing data for file export
|
11
|
+
#
|
12
|
+
# @param data (#data)
|
13
|
+
# @param filename (#filename)
|
14
|
+
# @param encode [TrueClass || FalseClass] Enable/disable encoding of exported data
|
15
|
+
#
|
16
|
+
# @since 0.1.0
|
17
|
+
def initialize(data:, filename:, encode:)
|
18
|
+
super(data: data, encode: encode)
|
19
|
+
@filename = filename
|
20
|
+
end
|
21
|
+
|
22
|
+
Contract None => Contracts::HashOf[Symbol, Maybe[String]]
|
23
|
+
# Performing export of initialized data
|
24
|
+
#
|
25
|
+
# @return [Hash] exported data
|
26
|
+
#
|
27
|
+
# @since 0.1.0
|
28
|
+
def perform
|
29
|
+
File.open(filename, 'w') do |f|
|
30
|
+
data.each do |_k, v|
|
31
|
+
f.puts(v)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Izokatu
|
4
|
+
# Izokatu exporter for exporting data in some function
|
5
|
+
class FunctionExporter < Izokatu::Exporter
|
6
|
+
Contract None => Contracts::HashOf[Symbol, Maybe[String]]
|
7
|
+
# Performing export of initialized data
|
8
|
+
#
|
9
|
+
# @return [Hash] exported data
|
10
|
+
#
|
11
|
+
# @since 0.1.0
|
12
|
+
def perform
|
13
|
+
data
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Izokatu
|
4
|
+
# Izokatu exporter for exporting data in STDOUT
|
5
|
+
class StdoutExporter < Izokatu::Exporter
|
6
|
+
Contract None => Contracts::HashOf[Symbol, String]
|
7
|
+
# Performing export of initialized data
|
8
|
+
#
|
9
|
+
# @return [Hash] exported data
|
10
|
+
#
|
11
|
+
# @since 0.1.0
|
12
|
+
def perform
|
13
|
+
data.each do |_k, v|
|
14
|
+
puts v
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,213 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Izokatu
|
4
|
+
# Izokatu helper methods
|
5
|
+
module Helpers
|
6
|
+
include Contracts
|
7
|
+
|
8
|
+
# Default Symbol keys for keys
|
9
|
+
KEY_SYMBOL = %i[private_key public_key].freeze
|
10
|
+
# Rbnacl classes for keys
|
11
|
+
RBNACL_KEY_CLASSES = [
|
12
|
+
RbNaCl::Boxes::Curve25519XSalsa20Poly1305::PrivateKey,
|
13
|
+
RbNaCl::Boxes::Curve25519XSalsa20Poly1305::PublicKey
|
14
|
+
].freeze
|
15
|
+
|
16
|
+
# Verify cipher is included in OpenSSL public key EC ciphers
|
17
|
+
EC_CIPHER = ->(c) { Izokatu::Openssl::PBKEY_EC_CIPHERS.include?(c) }
|
18
|
+
|
19
|
+
Contract EC_CIPHER => Contracts::HashOf[Or[*KEY_SYMBOL], String]
|
20
|
+
# Generating EC keypair
|
21
|
+
#
|
22
|
+
# @param cipher [String] cipher for keys encryption
|
23
|
+
#
|
24
|
+
# @return [Hash] keypair of EC public and private key
|
25
|
+
#
|
26
|
+
# @since 0.1.0
|
27
|
+
def generate_ec_keypair(cipher = 'secp521r1')
|
28
|
+
Izokatu::Openssl::PublicKey::EC::KeysGenerator.call(cipher: cipher)
|
29
|
+
end
|
30
|
+
|
31
|
+
Contract Pos => Contracts::HashOf[Or[*KEY_SYMBOL], String]
|
32
|
+
# Generating RSA keypair
|
33
|
+
#
|
34
|
+
# @param bit_number [Integer] number of key bits
|
35
|
+
#
|
36
|
+
# @return [Hash] keypair of RSA public and private key
|
37
|
+
#
|
38
|
+
# @since 0.1.0
|
39
|
+
def generate_rsa_keypair(bit_number = 4096)
|
40
|
+
Izokatu::Openssl::PublicKey::RSA::KeysGenerator.call(bit_number: bit_number)
|
41
|
+
end
|
42
|
+
|
43
|
+
Contract None => Contracts::HashOf[Or[*KEY_SYMBOL], Or[*RBNACL_KEY_CLASSES]]
|
44
|
+
# Generating RbNaCl keypair
|
45
|
+
#
|
46
|
+
# @return [Hash] keypair of RbNaCl public and private key
|
47
|
+
#
|
48
|
+
# @since 0.1.0
|
49
|
+
def generate_rbnacl_keypair
|
50
|
+
Izokatu::Rbnacl::PublicKey::KeysGenerator.call
|
51
|
+
end
|
52
|
+
|
53
|
+
Contract None => Contracts::HashOf[Symbol, Or[String, Symbol, Bool]]
|
54
|
+
# Performing encryption and merging result in options
|
55
|
+
#
|
56
|
+
# @since 0.1.0
|
57
|
+
def import_encrypted_in_options!
|
58
|
+
encrypted_data, decrypter_params = encrypt(options)
|
59
|
+
options.merge!(encrypted_data)
|
60
|
+
options.merge!(decrypter_params)
|
61
|
+
end
|
62
|
+
|
63
|
+
Contract Contracts::HashOf[Symbol, Or[Contracts::HashOf[Symbol, Maybe[String]], String, Bool]] =>
|
64
|
+
Contracts::HashOf[Symbol, Maybe[String]]
|
65
|
+
# Exporting encrypted data and decrypter params
|
66
|
+
#
|
67
|
+
# @param encrypted_data [Hash] Hash with encrypted data for export
|
68
|
+
# @param decrypter_params [Hash] Hash with decrypter params for export
|
69
|
+
# @param encode [TrueClass || FalseClass] Enable/disable encoding of exported data
|
70
|
+
#
|
71
|
+
# @return [Hash] merged encrypted data and decrypter params
|
72
|
+
#
|
73
|
+
# @note Returning merged value even if not using :function exporter
|
74
|
+
#
|
75
|
+
# @since 0.1.0
|
76
|
+
def export_encrypted!(encrypted_data:, decrypter_params:, encode:)
|
77
|
+
export_data(
|
78
|
+
data: encrypted_data,
|
79
|
+
filename: options[:encrypted_data_filename],
|
80
|
+
encode: encode
|
81
|
+
).merge!(
|
82
|
+
export_data(
|
83
|
+
data: decrypter_params,
|
84
|
+
filename: options[:decrypter_params_filename],
|
85
|
+
encode: encode
|
86
|
+
)
|
87
|
+
)
|
88
|
+
end
|
89
|
+
|
90
|
+
Contract Contracts::HashOf[Symbol, Or[Contracts::HashOf[Symbol, String], String, Bool]] =>
|
91
|
+
Contracts::HashOf[Symbol, String]
|
92
|
+
# Exporting decrypted data
|
93
|
+
#
|
94
|
+
# @param decrypted_data [Hash] Hash with encrypted data for export
|
95
|
+
# @param encode [TrueClass || FalseClass] Enable/disable encoding of exported data
|
96
|
+
#
|
97
|
+
# @return [Hash] decrypted data
|
98
|
+
#
|
99
|
+
# @note Returning value even if not using :function exporter
|
100
|
+
#
|
101
|
+
# @since 0.1.0
|
102
|
+
def export_decrypted!(decrypted_data:, encode:)
|
103
|
+
export_data(
|
104
|
+
data: decrypted_data,
|
105
|
+
filename: options[:decrypted_data_filename],
|
106
|
+
encode: encode
|
107
|
+
)
|
108
|
+
end
|
109
|
+
|
110
|
+
Contract Contracts::HashOf[Symbol, Or[Contracts::HashOf[Symbol, Maybe[String]], Maybe[String], Bool]] =>
|
111
|
+
Contracts::HashOf[Symbol, Maybe[String]]
|
112
|
+
# Exporting data
|
113
|
+
#
|
114
|
+
# @param data [Hash] Hash with data for export
|
115
|
+
# @param filename [String] Name of file for export
|
116
|
+
# @param encode [TrueClass || FalseClass] Enable/disable encoding of exported data
|
117
|
+
#
|
118
|
+
# @return [Hash] exported data
|
119
|
+
#
|
120
|
+
# @note Returning value even if not using :function exporter
|
121
|
+
#
|
122
|
+
# @since 0.1.0
|
123
|
+
def export_data(data:, filename:, encode:)
|
124
|
+
other_options = { data: data, encode: encode }
|
125
|
+
file_options = {
|
126
|
+
data: data,
|
127
|
+
filename: filename,
|
128
|
+
encode: encode
|
129
|
+
}
|
130
|
+
exporter = options[:exporter]
|
131
|
+
exporter_options = exporter == Izokatu::FileExporter ? file_options : other_options
|
132
|
+
exporter.call(**exporter_options)
|
133
|
+
end
|
134
|
+
|
135
|
+
Contract Contracts::HashOf[Symbol, Or[Contracts::HashOf[Symbol, Any], Bool]] =>
|
136
|
+
Contracts::HashOf[Symbol, Any]
|
137
|
+
# Importing encrypted data and decrypter params
|
138
|
+
#
|
139
|
+
# @param options [Hash] Hash with options
|
140
|
+
# @param decode [TrueClass || FalseClass] Enable/disable decoding of imported data
|
141
|
+
#
|
142
|
+
# @return [Hash] Hash with updated options
|
143
|
+
#
|
144
|
+
# @since 0.1.0
|
145
|
+
def import_encrypted!(options:, decode:)
|
146
|
+
encrypted_data = options.select { |k, _v| k == :encrypted_data_string }
|
147
|
+
decrypter_params_default_keys = %i[nonce key auth_data auth_tag]
|
148
|
+
decrypter_params = options.select { |k, _v| decrypter_params_default_keys.include?(k) }
|
149
|
+
options.merge! import_data(
|
150
|
+
data: encrypted_data,
|
151
|
+
filename: options[:encrypted_data_filename],
|
152
|
+
delete_imported: options[:delete_imported],
|
153
|
+
decode: decode
|
154
|
+
)
|
155
|
+
options.merge! import_data(
|
156
|
+
data: decrypter_params,
|
157
|
+
filename: options[:decrypter_params_filename],
|
158
|
+
delete_imported: options[:delete_imported],
|
159
|
+
decode: decode
|
160
|
+
)
|
161
|
+
end
|
162
|
+
|
163
|
+
Contract Contracts::HashOf[Symbol, Or[Contracts::HashOf[Symbol, String], Any]] =>
|
164
|
+
Contracts::HashOf[Symbol, Maybe[String]]
|
165
|
+
# Importing data
|
166
|
+
#
|
167
|
+
# @param data [Hash] Hash with data to import from
|
168
|
+
# @param filename [String] Name of file to import from
|
169
|
+
# @param delete_imported [TrueClass, FalseClass] Enable/disable deleting file after import
|
170
|
+
# @param decode [TrueClass || FalseClass] Enable/disable decoding of imported data
|
171
|
+
#
|
172
|
+
# @return [Hash] imported data
|
173
|
+
#
|
174
|
+
# @since 0.1.0
|
175
|
+
def import_data(data:, filename:, delete_imported:, decode:)
|
176
|
+
function_options = { data: data, decode: decode }
|
177
|
+
file_options = {
|
178
|
+
filename: filename,
|
179
|
+
delete_imported: delete_imported,
|
180
|
+
decode: decode
|
181
|
+
}
|
182
|
+
importer = options[:importer]
|
183
|
+
importer_options = importer == Izokatu::FunctionImporter ? function_options : file_options
|
184
|
+
importer.call(**importer_options)
|
185
|
+
end
|
186
|
+
|
187
|
+
Contract Contracts::HashOf[Symbol, Maybe[String]] =>
|
188
|
+
Contracts::HashOf[Symbol, Maybe[String]]
|
189
|
+
# Encoding data
|
190
|
+
#
|
191
|
+
# @param data [Hash] Hash with data for encoding
|
192
|
+
#
|
193
|
+
# @return [Hash] encoded data
|
194
|
+
#
|
195
|
+
# @since 0.1.0
|
196
|
+
def encode_data(data)
|
197
|
+
data.transform_values { |v| Base64.strict_encode64(v) if v }
|
198
|
+
end
|
199
|
+
|
200
|
+
Contract Contracts::HashOf[Symbol, Maybe[String]] =>
|
201
|
+
Contracts::HashOf[Symbol, Maybe[String]]
|
202
|
+
# Decoding data
|
203
|
+
#
|
204
|
+
# @param data [Hash] Hash with data for decoding
|
205
|
+
#
|
206
|
+
# @return [Hash] decoded data
|
207
|
+
#
|
208
|
+
# @since 0.1.0
|
209
|
+
def decode_data(data)
|
210
|
+
data.transform_values { |v| Base64.strict_decode64(v) if v }
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|