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,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Izokatu
|
4
|
+
# Izokatu importer for importing data from some file
|
5
|
+
class FileImporter
|
6
|
+
extend Callable
|
7
|
+
|
8
|
+
include Contracts
|
9
|
+
include Izokatu::Helpers
|
10
|
+
|
11
|
+
# @return [String] name of file to import from
|
12
|
+
attr_reader :filename
|
13
|
+
# @return [TrueClass, FalseClass] status of ability to delete file after import
|
14
|
+
attr_reader :delete_imported
|
15
|
+
# @return [TrueClass || FalseClass] status of ability to decode imported data
|
16
|
+
attr_reader :decode
|
17
|
+
|
18
|
+
Contract Contracts::HashOf[Symbol, Or[String, Bool]] => Any
|
19
|
+
# Initializing options for import
|
20
|
+
#
|
21
|
+
# @param filename (#filename)
|
22
|
+
# @param delete_imported (#delete_imported)
|
23
|
+
# @param decode (#decode)
|
24
|
+
#
|
25
|
+
# @since 0.1.0
|
26
|
+
def initialize(filename:, delete_imported:, decode:)
|
27
|
+
@filename = filename
|
28
|
+
@delete_imported = delete_imported
|
29
|
+
@decode = decode
|
30
|
+
end
|
31
|
+
|
32
|
+
Contract None => Contracts::HashOf[Symbol, String]
|
33
|
+
# Performing import of data
|
34
|
+
#
|
35
|
+
# @return [Hash] imported data
|
36
|
+
#
|
37
|
+
# @since 0.1.0
|
38
|
+
def perform
|
39
|
+
raise 'No data file!' unless File.exist?(filename)
|
40
|
+
|
41
|
+
encoded = File.readlines(filename, chomp: true)
|
42
|
+
File.delete(filename) if delete_imported
|
43
|
+
data = { data: encoded.length == 1 ? encoded[0] : encoded.join("\n") }
|
44
|
+
decode ? decode_data(data) : data
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Izokatu
|
4
|
+
# Izokatu importer for importing data from some function, via :data param
|
5
|
+
class FunctionImporter
|
6
|
+
extend Callable
|
7
|
+
|
8
|
+
include Contracts
|
9
|
+
include Izokatu::Helpers
|
10
|
+
|
11
|
+
# @return [String] data for import
|
12
|
+
attr_reader :data
|
13
|
+
|
14
|
+
Contract Contracts::HashOf[Symbol, Or[Contracts::HashOf[Symbol, Maybe[String]], String, Bool]] =>
|
15
|
+
Or[Contracts::HashOf[Symbol, Maybe[String]], String]
|
16
|
+
# Initializing options for import
|
17
|
+
#
|
18
|
+
# @param data (#data)
|
19
|
+
# @param decode [TrueClass || FalseClass] Enable/disable decoding of imported data
|
20
|
+
#
|
21
|
+
# @since 0.1.0
|
22
|
+
def initialize(data:, decode:)
|
23
|
+
@data = decode ? decode_data(data) : data
|
24
|
+
end
|
25
|
+
|
26
|
+
Contract None => Or[Contracts::HashOf[Symbol, Maybe[String]], String]
|
27
|
+
# Performing import of data
|
28
|
+
#
|
29
|
+
# @return [Hash] imported data
|
30
|
+
#
|
31
|
+
# @since 0.1.0
|
32
|
+
def perform
|
33
|
+
data
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'callable'
|
4
|
+
require_relative 'ciphers'
|
5
|
+
require_relative 'helpers'
|
6
|
+
|
7
|
+
require_relative 'exporter'
|
8
|
+
require_relative 'exporter/function_exporter'
|
9
|
+
require_relative 'exporter/file_exporter'
|
10
|
+
require_relative 'exporter/stdout_exporter'
|
11
|
+
|
12
|
+
require_relative 'importer/function_importer'
|
13
|
+
require_relative 'importer/file_importer'
|
14
|
+
|
15
|
+
require_relative 'keys_generator'
|
16
|
+
require_relative 'encrypter'
|
17
|
+
require_relative 'decrypter'
|
18
|
+
|
19
|
+
require_relative 'openssl/private_key/default/encrypter'
|
20
|
+
require_relative 'openssl/private_key/auth/encrypter'
|
21
|
+
require_relative 'openssl/private_key/auth/ccm/encrypter'
|
22
|
+
|
23
|
+
require_relative 'openssl/private_key/default/decrypter'
|
24
|
+
require_relative 'openssl/private_key/auth/decrypter'
|
25
|
+
require_relative 'openssl/private_key/auth/ccm/decrypter'
|
26
|
+
|
27
|
+
require_relative 'openssl/public_key/rsa/keys_generator'
|
28
|
+
require_relative 'openssl/public_key/rsa/encrypter'
|
29
|
+
require_relative 'openssl/public_key/rsa/decrypter'
|
30
|
+
|
31
|
+
require_relative 'openssl/public_key/ec/keys_generator'
|
32
|
+
require_relative 'openssl/public_key/ec/encrypter'
|
33
|
+
require_relative 'openssl/public_key/ec/decrypter'
|
34
|
+
|
35
|
+
require_relative 'rbnacl/encrypter'
|
36
|
+
require_relative 'rbnacl/decrypter'
|
37
|
+
|
38
|
+
require_relative 'rbnacl/private_key/encrypter'
|
39
|
+
require_relative 'rbnacl/private_key/decrypter'
|
40
|
+
|
41
|
+
require_relative 'rbnacl/public_key/keys_generator'
|
42
|
+
require_relative 'rbnacl/public_key/encrypter'
|
43
|
+
require_relative 'rbnacl/public_key/decrypter'
|
44
|
+
|
45
|
+
require_relative 'action_call_selector'
|
46
|
+
require_relative 'action_call_options_selector'
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Izokatu
|
4
|
+
# Abstract class for keys generators
|
5
|
+
#
|
6
|
+
# @abstract Subclasses are containing implementation of {#generate_private_key} and {#generate_public_key}
|
7
|
+
class KeysGenerator
|
8
|
+
extend Callable
|
9
|
+
|
10
|
+
include Contracts
|
11
|
+
|
12
|
+
# Default key symbols for RbNaCl and OpenSSL keys
|
13
|
+
KEYS_SYMBOLS = %i[private_key public_key].freeze
|
14
|
+
# Classes of RbNaCl and OpenSSL keys
|
15
|
+
KEY_CLASSES = [
|
16
|
+
RbNaCl::Boxes::Curve25519XSalsa20Poly1305::PrivateKey,
|
17
|
+
RbNaCl::Boxes::Curve25519XSalsa20Poly1305::PublicKey,
|
18
|
+
OpenSSL::PKey::RSA,
|
19
|
+
OpenSSL::PKey::EC
|
20
|
+
].freeze
|
21
|
+
|
22
|
+
Contract None => Contracts::HashOf[Or[*KEYS_SYMBOLS], Or[*KEY_CLASSES]]
|
23
|
+
# Performing generation of private and public keys
|
24
|
+
#
|
25
|
+
# @return [Hash] public and private keys
|
26
|
+
#
|
27
|
+
# @since 0.1.0
|
28
|
+
def perform
|
29
|
+
generate_private_key
|
30
|
+
.then { |private_key| { private_key: private_key, public_key: generate_public_key(private_key) } }
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
# Performing generation of private key
|
36
|
+
#
|
37
|
+
# @raise RuntimeError
|
38
|
+
#
|
39
|
+
# @since 0.1.0
|
40
|
+
def generate_private_key
|
41
|
+
raise 'Not implemented!'
|
42
|
+
end
|
43
|
+
|
44
|
+
# Performing generation of public key
|
45
|
+
#
|
46
|
+
# @raise RuntimeError
|
47
|
+
#
|
48
|
+
# @since 0.1.0
|
49
|
+
def generate_public_key(_private_key)
|
50
|
+
raise 'Not implemented!'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Izokatu
|
4
|
+
module Openssl
|
5
|
+
module PrivateKey
|
6
|
+
module Auth
|
7
|
+
# Namespace for OpenSSL private key authenticated CCM classes
|
8
|
+
module CCM
|
9
|
+
# OpenSSL private key decrypter for authenticated ciphers in CCM mode
|
10
|
+
class Decrypter < Izokatu::Openssl::PrivateKey::Auth::Decrypter
|
11
|
+
# Default iv (nonce) length for ciphers in CCM mode
|
12
|
+
DEFAULT_CCM_IV_LENGTH = 7
|
13
|
+
# Default authentication tag length for ciphers in CCM mode
|
14
|
+
DEFAULT_CCM_AUTH_TAG_LENGTH = 8
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
Contract None => Any
|
19
|
+
# Initializing decrypter params
|
20
|
+
#
|
21
|
+
# @since 0.1.0
|
22
|
+
def initialize_decrypter_params!
|
23
|
+
initialize_auth_ccm_decrypter_params!
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
Contract None => Any
|
28
|
+
# Set length for iv and auth_tag before their initialization
|
29
|
+
#
|
30
|
+
# @since 0.1.0
|
31
|
+
def initialize_auth_ccm_decrypter_params!
|
32
|
+
decrypter.iv_len = DEFAULT_CCM_IV_LENGTH
|
33
|
+
decrypter.auth_tag_len = DEFAULT_CCM_AUTH_TAG_LENGTH
|
34
|
+
end
|
35
|
+
|
36
|
+
Contract None => Any
|
37
|
+
# Initializing decrypter auth params
|
38
|
+
#
|
39
|
+
# @since 0.1.0
|
40
|
+
def initialize_auth_decrypter_params!
|
41
|
+
initialize_static_message_length!
|
42
|
+
super
|
43
|
+
end
|
44
|
+
|
45
|
+
Contract None => Any
|
46
|
+
# Initializing message length for cipher in CCM mode
|
47
|
+
#
|
48
|
+
# @since 0.1.0
|
49
|
+
def initialize_static_message_length!
|
50
|
+
decrypter.ccm_data_len = encrypted_data.length unless cipher.include?('ARIA')
|
51
|
+
end
|
52
|
+
|
53
|
+
# Raising exception if auth tag is truncated
|
54
|
+
# @note Redefined to use local auth tag length
|
55
|
+
#
|
56
|
+
# @raise RuntimeError
|
57
|
+
#
|
58
|
+
# @since 0.1.0
|
59
|
+
def verify_tag_size!
|
60
|
+
raise 'tag is truncated!' unless auth_tag.bytesize == DEFAULT_CCM_AUTH_TAG_LENGTH
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Izokatu
|
4
|
+
module Openssl
|
5
|
+
module PrivateKey
|
6
|
+
module Auth
|
7
|
+
module CCM
|
8
|
+
# OpenSSL private key encrypter for authenticated ciphers in CCM mode
|
9
|
+
class Encrypter < Izokatu::Openssl::PrivateKey::Auth::Encrypter
|
10
|
+
# Default iv (nonce) length for ciphers in CCM mode
|
11
|
+
DEFAULT_CCM_IV_LENGTH = 7
|
12
|
+
# Default authentication tag length for ciphers in CCM mode
|
13
|
+
DEFAULT_CCM_AUTH_TAG_LENGTH = 8
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
Contract None => Any
|
18
|
+
# Initializing encrypter params
|
19
|
+
#
|
20
|
+
# @since 0.1.0
|
21
|
+
def initialize_encrypter_params!
|
22
|
+
initialize_auth_ccm_encrypter_params!
|
23
|
+
super
|
24
|
+
end
|
25
|
+
|
26
|
+
Contract None => Any
|
27
|
+
# Set length for iv and auth_tag before their initialization
|
28
|
+
#
|
29
|
+
# @since 0.1.0
|
30
|
+
def initialize_auth_ccm_encrypter_params!
|
31
|
+
encrypter.iv_len = DEFAULT_CCM_IV_LENGTH
|
32
|
+
encrypter.auth_tag_len = DEFAULT_CCM_AUTH_TAG_LENGTH
|
33
|
+
end
|
34
|
+
|
35
|
+
Contract Maybe[String] => Any
|
36
|
+
# Initializing encrypter auth params
|
37
|
+
#
|
38
|
+
# @since 0.1.0
|
39
|
+
def initialize_auth_encrypter_params!(auth_data)
|
40
|
+
initialize_static_message_length!
|
41
|
+
super
|
42
|
+
end
|
43
|
+
|
44
|
+
Contract None => Any
|
45
|
+
# Initializing message length for cipher in CCM mode
|
46
|
+
#
|
47
|
+
# @since 0.1.0
|
48
|
+
def initialize_static_message_length!
|
49
|
+
encrypter.ccm_data_len = clear_data.length unless cipher.include?('ARIA')
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Izokatu
|
4
|
+
module Openssl
|
5
|
+
module PrivateKey
|
6
|
+
# Namespace for OpenSSL private key authenticated classes
|
7
|
+
module Auth
|
8
|
+
# OpenSSL private key decrypter for authenticated ciphers
|
9
|
+
class Decrypter < Izokatu::Openssl::PrivateKey::Default::Decrypter
|
10
|
+
# @return [String] authenticated data
|
11
|
+
attr_reader :auth_data
|
12
|
+
# @return [String] authentication tag
|
13
|
+
attr_reader :auth_tag
|
14
|
+
|
15
|
+
# Default Openssl::PrivateKey::Auth::Decrypter option
|
16
|
+
DEFAULT_AUTH_TAG_LENGTH = 16
|
17
|
+
|
18
|
+
Contract Contracts::HashOf[Symbol, Maybe[String]] => Any
|
19
|
+
# Initializing options for OpenSSL EC decryption
|
20
|
+
#
|
21
|
+
# @param encrypted_data (#encrypted_data)
|
22
|
+
# @param cipher (#cipher)
|
23
|
+
# @param key (#key)
|
24
|
+
# @param nonce (#nonce)
|
25
|
+
# @param auth_data (#auth_data)
|
26
|
+
# @param auth_tag (#auth_tag)
|
27
|
+
#
|
28
|
+
# @since 0.1.0
|
29
|
+
def initialize(auth_data:, auth_tag:, cipher:, encrypted_data:, key:, nonce:)
|
30
|
+
@auth_data = auth_data
|
31
|
+
@auth_tag = auth_tag
|
32
|
+
super(cipher: cipher, encrypted_data: encrypted_data, key: key, nonce: nonce)
|
33
|
+
end
|
34
|
+
|
35
|
+
Contract None => Contracts::HashOf[Symbol, String]
|
36
|
+
# Initializing decrypter
|
37
|
+
#
|
38
|
+
# @return [OpenSSL::Cipher] decrypter instance
|
39
|
+
#
|
40
|
+
# @since 0.1.0
|
41
|
+
def perform
|
42
|
+
verify_tag_size!
|
43
|
+
super
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
Contract None => Any
|
49
|
+
# Initializing decrypter params
|
50
|
+
#
|
51
|
+
# @since 0.1.0
|
52
|
+
def initialize_decrypter_params!
|
53
|
+
super
|
54
|
+
initialize_auth_decrypter_params!
|
55
|
+
end
|
56
|
+
|
57
|
+
Contract None => Any
|
58
|
+
# Initializing decrypter auth params
|
59
|
+
#
|
60
|
+
# @since 0.1.0
|
61
|
+
def initialize_auth_decrypter_params!
|
62
|
+
# unless added just for ARIA-***-CCM ciphers
|
63
|
+
decrypter.auth_data = auth_data unless cipher.include?('ARIA')
|
64
|
+
decrypter.auth_tag = auth_tag
|
65
|
+
end
|
66
|
+
|
67
|
+
# Raising exception if auth tag is truncated
|
68
|
+
#
|
69
|
+
# @raise RuntimeError
|
70
|
+
#
|
71
|
+
# @since 0.1.0
|
72
|
+
def verify_tag_size!
|
73
|
+
raise 'tag is truncated!' unless auth_tag.bytesize == DEFAULT_AUTH_TAG_LENGTH
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Izokatu
|
4
|
+
module Openssl
|
5
|
+
module PrivateKey
|
6
|
+
module Auth
|
7
|
+
# OpenSSL private key encrypter for authenticated ciphers
|
8
|
+
class Encrypter < Izokatu::Openssl::PrivateKey::Default::Encrypter
|
9
|
+
# @return [String] authenticated data
|
10
|
+
attr_reader :auth_data
|
11
|
+
|
12
|
+
# Default Openssl::PrivateKey::Auth::Encrypter option
|
13
|
+
DEFAULT_AUTH_OPTIONS = {
|
14
|
+
auth_data: ''
|
15
|
+
}.freeze
|
16
|
+
|
17
|
+
Contract Contracts::HashOf[Symbol, Maybe[String]] => Any
|
18
|
+
# Initializing options for OpenSSL EC encryption
|
19
|
+
#
|
20
|
+
# @param cipher (#cipher)
|
21
|
+
# @param clear_data (#clear_data)
|
22
|
+
# @param auth_data (#auth_data)
|
23
|
+
#
|
24
|
+
# @since 0.1.0
|
25
|
+
def initialize(cipher:, clear_data:, auth_data:)
|
26
|
+
super(cipher: cipher, clear_data: clear_data)
|
27
|
+
initialize_auth_encrypter_params!(auth_data)
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
Contract Maybe[String] => Maybe[String]
|
33
|
+
# Initializing encrypter auth param
|
34
|
+
#
|
35
|
+
# @return [String] authenticated data
|
36
|
+
#
|
37
|
+
# @since 0.1.0
|
38
|
+
def initialize_auth_encrypter_params!(auth_data)
|
39
|
+
@auth_data = auth_data || DEFAULT_AUTH_OPTIONS[:auth_data]
|
40
|
+
encrypter.auth_data = @auth_data
|
41
|
+
end
|
42
|
+
|
43
|
+
Contract None => Contracts::ArrayOf[Contracts::HashOf[Symbol, String]]
|
44
|
+
# Encrypting data
|
45
|
+
#
|
46
|
+
# @return [Array] encrypted data with decrypter params
|
47
|
+
#
|
48
|
+
# @since 0.1.0
|
49
|
+
def encrypt_data!
|
50
|
+
encrypted_data, decrypter_params = super
|
51
|
+
decrypter_params[:auth_data] = auth_data
|
52
|
+
decrypter_params.merge!(compute_auth_tag!)
|
53
|
+
[encrypted_data, decrypter_params]
|
54
|
+
end
|
55
|
+
|
56
|
+
Contract None => Contracts::HashOf[Symbol, String]
|
57
|
+
# Computing authentication tag
|
58
|
+
#
|
59
|
+
# @return [Hash] authentication tag
|
60
|
+
#
|
61
|
+
# @since 0.1.0
|
62
|
+
def compute_auth_tag!
|
63
|
+
{ auth_tag: encrypter.auth_tag }
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|