ruar 0.0.2 → 0.0.3
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.
- checksums.yaml +4 -4
- data/README.md +53 -0
- data/ext/ruar/ruar.c +56 -13
- data/lib/ruar.rb +6 -1
- data/lib/ruar/access.rb +8 -2
- data/lib/ruar/cipher.rb +64 -0
- data/lib/ruar/compression.rb +11 -0
- data/lib/ruar/core_ext/kernel_require.rb +8 -11
- data/lib/ruar/index.rb +12 -3
- data/lib/ruar/ruar.so +0 -0
- data/lib/ruar/serialize.rb +33 -0
- data/lib/ruar/setup.rb +4 -0
- data/lib/ruar/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 71e86cbea690ee3e4c66ca5079ba3ae43ffa2d21c1b01e3574a3324b9509d712
|
4
|
+
data.tar.gz: 4dd935f956cefc3c13fae4ca9c95edefea91c556e92944e36d1d1b7c89b32791
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7e31c46a4daa42ad6432b41e78c94004816a908810a4f1f51fd062129ac6244f44b7bcad9be7294a643a57559bdf179a91a60e2be85bc61c7961b908ca3517d6
|
7
|
+
data.tar.gz: f944938e97821f40ad011c30ebd62bf6586e4931184e3311feff029615503c8308fd117bae4958661a0414bfafacc72c91e86f765c95283ddf02db28d4d184d7
|
data/README.md
CHANGED
@@ -5,6 +5,8 @@ Tar-like Archive for RIEN
|
|
5
5
|
[](https://github.com/DarkKowalski/ruar/actions?query=workflow%3A%22CI+Tests%22)
|
6
6
|
[](https://github.com/DarkKowalski/ruar/actions?query=workflow%3ABuild)
|
7
7
|
|
8
|
+
This GEM is still in development, please use the latest git dev branch
|
9
|
+
|
8
10
|
## Usage
|
9
11
|
|
10
12
|
```ruby
|
@@ -33,6 +35,57 @@ require 'dir/file'
|
|
33
35
|
# Here you go
|
34
36
|
```
|
35
37
|
|
38
|
+
### AEAD
|
39
|
+
|
40
|
+
Encrypt
|
41
|
+
|
42
|
+
```ruby
|
43
|
+
require 'ruar'
|
44
|
+
require 'tmpdir'
|
45
|
+
|
46
|
+
auth_data = Base64.encode64('nekomimi')
|
47
|
+
Ruar.cipher.setup(auth_data: auth_data)
|
48
|
+
|
49
|
+
archive = File.join(Dir.tmpdir, 'aead.ruar')
|
50
|
+
Ruar::Serialize.aead('./test/sample', archive)
|
51
|
+
```
|
52
|
+
|
53
|
+
Then you will get `/tmp/aead.ruar.setup`
|
54
|
+
|
55
|
+
```ruby
|
56
|
+
Ruar.cipher.setup(
|
57
|
+
iv: 'niNGDaPcFiD8eKdb',
|
58
|
+
key: 'I0LpzLx3GuU19F5EOwTbfZJ6pYOlH4Pbumm9SolLJv8=',
|
59
|
+
auth_data: 'bmVrb21pbWk=',
|
60
|
+
tag: 'nN6rCnd5SmZaoTdpmUEjtw==')
|
61
|
+
Ruar.cipher.enable
|
62
|
+
```
|
63
|
+
|
64
|
+
Decrypt
|
65
|
+
|
66
|
+
```ruby
|
67
|
+
require 'lib/ruar'
|
68
|
+
require 'tmpdir'
|
69
|
+
|
70
|
+
# Decryption Setup
|
71
|
+
Ruar.cipher.setup(
|
72
|
+
iv: 'niNGDaPcFiD8eKdb',
|
73
|
+
key: 'I0LpzLx3GuU19F5EOwTbfZJ6pYOlH4Pbumm9SolLJv8=',
|
74
|
+
auth_data: 'bmVrb21pbWk=',
|
75
|
+
tag: 'nN6rCnd5SmZaoTdpmUEjtw==')
|
76
|
+
Ruar.cipher.enable
|
77
|
+
|
78
|
+
archive = File.join(Dir.tmpdir, 'aead.ruar')
|
79
|
+
Ruar.setup(archive: archive).activate
|
80
|
+
|
81
|
+
# Setup
|
82
|
+
Ruar.setup(
|
83
|
+
archive: archive
|
84
|
+
).activate
|
85
|
+
|
86
|
+
# Require from /tmp/aeae.ruar
|
87
|
+
require 'dir/file'
|
88
|
+
```
|
36
89
|
## Format
|
37
90
|
|
38
91
|
```
|
data/ext/ruar/ruar.c
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
#include <ctype.h>
|
4
4
|
#include <ruby.h>
|
5
|
+
#include <stdbool.h>
|
5
6
|
#include <stdint.h>
|
6
7
|
#include <stdio.h>
|
7
8
|
#include <stdlib.h>
|
@@ -43,7 +44,12 @@ STATIC_ASSERT(sizeof(struct ruar_header) == HEADER_SIZE);
|
|
43
44
|
/* Constants */
|
44
45
|
static const uint32_t current_major_version = 0;
|
45
46
|
static const uint32_t current_minor_version = 0;
|
46
|
-
static const uint32_t current_patch_version =
|
47
|
+
static const uint32_t current_patch_version = 3;
|
48
|
+
|
49
|
+
/* Flags */
|
50
|
+
#define PLAIN 0
|
51
|
+
#define AEAD_AES_256_GCM 1
|
52
|
+
#define ZLIB_DEFLATE 1
|
47
53
|
|
48
54
|
/* System info */
|
49
55
|
#ifdef __linux__
|
@@ -67,6 +73,7 @@ static VALUE rb_mRuar_Serialize_Native;
|
|
67
73
|
|
68
74
|
/* Functions exposed as module functions on Ruar::Serialize::Native */
|
69
75
|
static VALUE ruar_serialize_rb_plain_header(VALUE self, VALUE dstfile, VALUE index);
|
76
|
+
static VALUE ruar_serialize_rb_aead_header(VALUE self, VALUE dstfile, VALUE index);
|
70
77
|
static VALUE ruar_serialize_rb_append_file(VALUE self, VALUE dstfile, VALUE srcfile);
|
71
78
|
|
72
79
|
/* Ruar::Access::Native */
|
@@ -96,6 +103,7 @@ void Init_ruar(void)
|
|
96
103
|
rb_mRuar_Serialize = rb_define_module_under(rb_mRuar, "Serialize");
|
97
104
|
rb_mRuar_Serialize_Native = rb_define_module_under(rb_mRuar_Serialize, "Native");
|
98
105
|
rb_define_module_function(rb_mRuar_Serialize_Native, "plain_header", ruar_serialize_rb_plain_header, 2);
|
106
|
+
rb_define_module_function(rb_mRuar_Serialize_Native, "aead_header", ruar_serialize_rb_aead_header, 2);
|
99
107
|
rb_define_module_function(rb_mRuar_Serialize_Native, "append_file", ruar_serialize_rb_append_file, 2);
|
100
108
|
|
101
109
|
rb_kRuar_Access = rb_define_class_under(rb_mRuar, "Access", rb_cObject);
|
@@ -137,38 +145,74 @@ static VALUE ruar_rb_header_hash(const struct ruar_header *header)
|
|
137
145
|
return rb_header;
|
138
146
|
}
|
139
147
|
|
140
|
-
static
|
148
|
+
static struct ruar_header ruar_fillout_header(char *index_cstring, uint32_t index_size, uint32_t encryption_flags, uint32_t compression_flags)
|
141
149
|
{
|
142
|
-
/* Call into ruby to generate the index */
|
143
|
-
char *index_cstring = rb_string_value_cstr(&index);
|
144
|
-
uint32_t index_size = INDEX_SIZE(index_cstring);
|
145
|
-
|
146
150
|
/* Fill out a header */
|
147
151
|
struct ruar_header header = {
|
148
152
|
.major_version = current_major_version,
|
149
153
|
.minor_version = current_minor_version,
|
150
154
|
.patch_version = current_patch_version,
|
151
155
|
.platform = current_platform,
|
152
|
-
.encryption_flags =
|
153
|
-
.compression_flags =
|
156
|
+
.encryption_flags = encryption_flags,
|
157
|
+
.compression_flags = compression_flags,
|
154
158
|
.index_start = HEADER_SIZE,
|
155
159
|
.index_size = index_size,
|
156
160
|
.index_checksum = ruar_crc32_generate((unsigned char *)index_cstring, index_size),
|
157
161
|
.header_checksum = 0};
|
158
162
|
header.header_checksum = ruar_crc32_generate((unsigned char *)&header, HEADER_SIZE);
|
159
163
|
|
160
|
-
|
161
|
-
|
164
|
+
return header;
|
165
|
+
}
|
166
|
+
|
167
|
+
static bool ruar_write_header_to_file(char *dstfile_cstring, char *index_cstring, uint32_t index_size, struct ruar_header *header)
|
168
|
+
{
|
162
169
|
FILE *outfile = fopen(dstfile_cstring, "wb");
|
163
170
|
if (outfile == NULL)
|
164
171
|
{
|
165
172
|
fprintf(stderr, "\nFailed to open file! %s\n", dstfile_cstring);
|
166
|
-
return
|
173
|
+
return false;
|
167
174
|
}
|
168
175
|
|
169
|
-
fwrite(
|
176
|
+
fwrite(header, HEADER_SIZE, 1, outfile);
|
170
177
|
fwrite(index_cstring, index_size, 1, outfile);
|
171
178
|
fclose(outfile);
|
179
|
+
return true;
|
180
|
+
}
|
181
|
+
|
182
|
+
static VALUE ruar_serialize_rb_plain_header(VALUE self, VALUE dstfile, VALUE index)
|
183
|
+
{
|
184
|
+
char *index_cstring = rb_string_value_cstr(&index);
|
185
|
+
uint32_t index_size = INDEX_SIZE(index_cstring);
|
186
|
+
|
187
|
+
/* Fill out a header */
|
188
|
+
struct ruar_header header = ruar_fillout_header(index_cstring, index_size, PLAIN, PLAIN);
|
189
|
+
|
190
|
+
/* Write header */
|
191
|
+
char *dstfile_cstring = rb_string_value_cstr(&dstfile);
|
192
|
+
if (!ruar_write_header_to_file(dstfile_cstring, index_cstring, index_size, &header))
|
193
|
+
{
|
194
|
+
return Qnil;
|
195
|
+
}
|
196
|
+
|
197
|
+
/* Get Ruby Hash */
|
198
|
+
return ruar_rb_header_hash(&header);
|
199
|
+
}
|
200
|
+
|
201
|
+
static VALUE ruar_serialize_rb_aead_header(VALUE self, VALUE dstfile, VALUE index)
|
202
|
+
{
|
203
|
+
/* Index should be encrypted in Ruby land */
|
204
|
+
char *index_cstring = rb_string_value_cstr(&index);
|
205
|
+
uint32_t index_size = INDEX_SIZE(index_cstring);
|
206
|
+
|
207
|
+
/* Fill out a header */
|
208
|
+
struct ruar_header header = ruar_fillout_header(index_cstring, index_size, AEAD_AES_256_GCM, ZLIB_DEFLATE);
|
209
|
+
|
210
|
+
/* Write header */
|
211
|
+
char *dstfile_cstring = rb_string_value_cstr(&dstfile);
|
212
|
+
if (!ruar_write_header_to_file(dstfile_cstring, index_cstring, index_size, &header))
|
213
|
+
{
|
214
|
+
return Qnil;
|
215
|
+
}
|
172
216
|
|
173
217
|
/* Get Ruby Hash */
|
174
218
|
return ruar_rb_header_hash(&header);
|
@@ -310,7 +354,6 @@ static VALUE ruar_access_rb_file(VALUE self, VALUE archive, VALUE offset, VALUE
|
|
310
354
|
|
311
355
|
size_t size_cint = NUM2SIZET(size);
|
312
356
|
|
313
|
-
|
314
357
|
/* Ruby C API will convert this C-style String to a Ruby String Object
|
315
358
|
* Thus one extra byte for the trialing '\0'
|
316
359
|
*/
|
data/lib/ruar.rb
CHANGED
@@ -2,8 +2,11 @@
|
|
2
2
|
|
3
3
|
require 'json'
|
4
4
|
require 'tmpdir'
|
5
|
+
require 'base64'
|
6
|
+
require 'openssl'
|
5
7
|
require 'pathname'
|
6
|
-
require '
|
8
|
+
require 'zlib'
|
9
|
+
# require 'binding_of_caller'
|
7
10
|
|
8
11
|
require_relative 'ruar/version'
|
9
12
|
require_relative 'ruar/ruar'
|
@@ -12,6 +15,8 @@ require_relative 'ruar/error'
|
|
12
15
|
require_relative 'ruar/index'
|
13
16
|
require_relative 'ruar/serialize'
|
14
17
|
require_relative 'ruar/access'
|
18
|
+
require_relative 'ruar/cipher'
|
19
|
+
require_relative 'ruar/compression'
|
15
20
|
require_relative 'ruar/entrypoint'
|
16
21
|
|
17
22
|
require_relative 'ruar/setup'
|
data/lib/ruar/access.rb
CHANGED
@@ -27,6 +27,7 @@ module Ruar
|
|
27
27
|
rebuild
|
28
28
|
end
|
29
29
|
|
30
|
+
# TODO: Need to deliberately test this part
|
30
31
|
def lookup(path)
|
31
32
|
paths = Ruar::Access.clean_path(path)
|
32
33
|
filename = paths.pop
|
@@ -50,7 +51,10 @@ module Ruar
|
|
50
51
|
|
51
52
|
def read(path)
|
52
53
|
offset, size, _executable = lookup(path)
|
53
|
-
Ruar::Access::Native.file(@archive, offset.to_i, size.to_i)
|
54
|
+
file = Ruar::Access::Native.file(@archive, offset.to_i, size.to_i)
|
55
|
+
file = Ruar.cipher.decrypt(file)[:decrypted] if Ruar.cipher.enable?
|
56
|
+
|
57
|
+
file
|
54
58
|
end
|
55
59
|
|
56
60
|
def eval(path, eval_bind = TOPLEVEL_BINDING)
|
@@ -86,7 +90,9 @@ module Ruar
|
|
86
90
|
|
87
91
|
def rebuild
|
88
92
|
@header = Ruar::Access::Native.header(@archive)
|
89
|
-
|
93
|
+
index_data = Ruar::Access::Native.index(@archive)
|
94
|
+
index_data = Ruar.cipher.decrypt(index_data)[:decrypted] if Ruar.cipher.enable?
|
95
|
+
@index = JSON.parse(index_data)
|
90
96
|
@file_start = @header['index_start'] + @header['index_size']
|
91
97
|
end
|
92
98
|
end
|
data/lib/ruar/cipher.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Ruar
|
4
|
+
class Cipher
|
5
|
+
def initialize
|
6
|
+
@enable = false
|
7
|
+
end
|
8
|
+
|
9
|
+
def aead
|
10
|
+
@aead ||= OpenSSL::Cipher.new('aes-256-gcm')
|
11
|
+
end
|
12
|
+
|
13
|
+
def enable?
|
14
|
+
@enable
|
15
|
+
end
|
16
|
+
|
17
|
+
def enable
|
18
|
+
@enable = true
|
19
|
+
end
|
20
|
+
|
21
|
+
def setup(key: nil, iv: nil, auth_data: nil, tag: nil)
|
22
|
+
@key = key.nil? ? aead.random_key : Base64.decode64(key)
|
23
|
+
@iv = iv.nil? ? aead.random_iv : Base64.decode64(iv)
|
24
|
+
@auth_data = auth_data.nil? ? 'ruar_default_auth_data' : Base64.decode64(auth_data)
|
25
|
+
@tag = tag.nil? ? 'ruar_invalid_auth_tag' : Base64.decode64(tag)
|
26
|
+
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
def encrypt(data, auth_data: @auth_data, key: @key, iv: @iv)
|
31
|
+
cipher = aead.encrypt
|
32
|
+
cipher.key = key
|
33
|
+
cipher.iv = iv
|
34
|
+
cipher.auth_data = auth_data
|
35
|
+
|
36
|
+
compressed = Ruar::Compression.compress(data)
|
37
|
+
encrypted = Base64.encode64(cipher.update(compressed) + cipher.final)
|
38
|
+
tag = cipher.auth_tag
|
39
|
+
|
40
|
+
{
|
41
|
+
encrypted: encrypted,
|
42
|
+
iv: iv,
|
43
|
+
key: key,
|
44
|
+
tag: tag,
|
45
|
+
auth_data: auth_data
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
def decrypt(data, auth_data: @auth_data, key: @key, iv: @iv, tag: @tag)
|
50
|
+
raise 'tag is truncated!' unless tag.bytesize == 16
|
51
|
+
|
52
|
+
cipher = aead.decrypt
|
53
|
+
cipher.key = key
|
54
|
+
cipher.iv = iv
|
55
|
+
cipher.auth_tag = tag
|
56
|
+
cipher.auth_data = auth_data
|
57
|
+
|
58
|
+
decrypted = cipher.update(Base64.decode64(data))
|
59
|
+
decompressed = Ruar::Compression.decompress(decrypted)
|
60
|
+
|
61
|
+
{ decrypted: decompressed }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -14,9 +14,9 @@ module Ruar
|
|
14
14
|
prefix = Ruar.path_prefix
|
15
15
|
# TODO: support .so here
|
16
16
|
if File.extname(path) == '.rb'
|
17
|
-
File.join(prefix, path)
|
17
|
+
Pathname.new(File.join(prefix, path)).cleanpath.to_s
|
18
18
|
else
|
19
|
-
File.join(prefix, "#{path}.rb")
|
19
|
+
Pathname.new(File.join(prefix, "#{path}.rb")).cleanpath.to_s
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
@@ -27,15 +27,14 @@ module Kernel
|
|
27
27
|
module_function
|
28
28
|
|
29
29
|
def ruar_eval_wrap(path, eval_bind = TOPLEVEL_BINDING)
|
30
|
-
Ruar.eval(path, eval_bind)
|
31
|
-
yield
|
30
|
+
Ruar.eval("#{path}.rb", eval_bind) # Ruar.eval(path.rb, eval_bind)
|
31
|
+
yield if block_given?
|
32
32
|
true
|
33
33
|
rescue Ruar::Error::FileNotFound
|
34
|
-
# Try again
|
34
|
+
# Try again without .rb extension
|
35
35
|
begin
|
36
|
-
|
37
|
-
|
38
|
-
yield
|
36
|
+
Ruar.eval(path, eval_bind)
|
37
|
+
yield if block_given?
|
39
38
|
true
|
40
39
|
rescue Ruar::Error::BaseError
|
41
40
|
raise Ruar::Access::CoreExt.make_load_error(path)
|
@@ -91,9 +90,7 @@ module Kernel
|
|
91
90
|
alias load_without_ruar load
|
92
91
|
|
93
92
|
def load_with_ruar(path, eval_bind = TOPLEVEL_BINDING)
|
94
|
-
ruar_eval_wrap(path, eval_bind)
|
95
|
-
# Do nothing, just read and eval
|
96
|
-
end
|
93
|
+
ruar_eval_wrap(path, eval_bind)
|
97
94
|
end
|
98
95
|
|
99
96
|
def load(path, from: :both)
|
data/lib/ruar/index.rb
CHANGED
@@ -6,7 +6,9 @@ module Ruar
|
|
6
6
|
|
7
7
|
def initialize(dir = '.')
|
8
8
|
@dir = dir
|
9
|
-
generate(dir)
|
9
|
+
generate(dir) do |file|
|
10
|
+
yield(file) if block_given?
|
11
|
+
end
|
10
12
|
end
|
11
13
|
|
12
14
|
def json_index
|
@@ -17,7 +19,9 @@ module Ruar
|
|
17
19
|
|
18
20
|
# Generate json format index
|
19
21
|
def generate(dir)
|
20
|
-
@index, @source_info = scan(dir, 0)
|
22
|
+
@index, @source_info = scan(dir, 0) do |file|
|
23
|
+
yield(file) if block_given?
|
24
|
+
end
|
21
25
|
end
|
22
26
|
|
23
27
|
# FIXME: don't recurse
|
@@ -32,6 +36,9 @@ module Ruar
|
|
32
36
|
|
33
37
|
files = entities.select { |f| File.file?(f) }
|
34
38
|
files.each do |f|
|
39
|
+
# Do something else likes encrypting the file
|
40
|
+
yield(f) if block_given?
|
41
|
+
|
35
42
|
size = File.size(f)
|
36
43
|
|
37
44
|
index['files'][f] = {
|
@@ -52,7 +59,9 @@ module Ruar
|
|
52
59
|
dirs = entities.select { |d| File.directory?(d) }
|
53
60
|
dirs.each do |d|
|
54
61
|
# Notice: need to accumulate offset here
|
55
|
-
sub_index, sub_source_info, offset = scan(d, offset)
|
62
|
+
sub_index, sub_source_info, offset = scan(d, offset) do |f|
|
63
|
+
yield(f) if block_given?
|
64
|
+
end
|
56
65
|
index['files'][d] = sub_index
|
57
66
|
source_info.concat(sub_source_info)
|
58
67
|
end
|
data/lib/ruar/ruar.so
CHANGED
Binary file
|
data/lib/ruar/serialize.rb
CHANGED
@@ -9,5 +9,38 @@ module Ruar
|
|
9
9
|
Ruar::Serialize::Native.append_file(dstfile, src['realpath'])
|
10
10
|
end
|
11
11
|
end
|
12
|
+
|
13
|
+
def self.aead(srcdir, dstfile)
|
14
|
+
time = Time.now.strftime('%Y%m%dT%H%M')
|
15
|
+
tmpdir = File.expand_path("ruar_#{time}", Dir.tmpdir)
|
16
|
+
FileUtils.copy_entry(srcdir, tmpdir)
|
17
|
+
|
18
|
+
encryption_info = nil
|
19
|
+
index = Ruar::Index.new(tmpdir) do |file|
|
20
|
+
data = File.read(file)
|
21
|
+
encryption_info = Ruar.cipher.encrypt(data)
|
22
|
+
File.write(file, encryption_info[:encrypted])
|
23
|
+
end
|
24
|
+
|
25
|
+
encrypted_index = Ruar.cipher.encrypt(index.json_index)[:encrypted]
|
26
|
+
Ruar::Serialize::Native.aead_header(dstfile, encrypted_index)
|
27
|
+
|
28
|
+
index.source_info.each do |src|
|
29
|
+
Ruar::Serialize::Native.append_file(dstfile, src['realpath'])
|
30
|
+
end
|
31
|
+
|
32
|
+
setup_file = <<~SETUP
|
33
|
+
Ruar.cipher.setup(
|
34
|
+
iv: '#{Base64.encode64(encryption_info[:iv]).chomp}',
|
35
|
+
key: '#{Base64.encode64(encryption_info[:key]).chomp}',
|
36
|
+
auth_data: '#{Base64.encode64(encryption_info[:auth_data]).chomp}',
|
37
|
+
tag: '#{Base64.encode64(encryption_info[:tag]).chomp}')
|
38
|
+
Ruar.cipher.enable
|
39
|
+
SETUP
|
40
|
+
|
41
|
+
File.write("#{dstfile}.setup", setup_file)
|
42
|
+
|
43
|
+
FileUtils.rm_rf(tmpdir)
|
44
|
+
end
|
12
45
|
end
|
13
46
|
end
|
data/lib/ruar/setup.rb
CHANGED
data/lib/ruar/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruar
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kowalski Dark
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-02-
|
11
|
+
date: 2021-02-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: binding_of_caller
|
@@ -137,6 +137,8 @@ files:
|
|
137
137
|
- ext/ruar/ruar.h
|
138
138
|
- lib/ruar.rb
|
139
139
|
- lib/ruar/access.rb
|
140
|
+
- lib/ruar/cipher.rb
|
141
|
+
- lib/ruar/compression.rb
|
140
142
|
- lib/ruar/core_ext/kernel_require.rb
|
141
143
|
- lib/ruar/core_ext/string_colorize.rb
|
142
144
|
- lib/ruar/entrypoint.rb
|