sekreti 0.1.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +5 -0
- data/README.md +25 -9
- data/Rakefile +11 -6
- data/lib/sekreti.rb +1 -1
- data/lib/sekreti/core.rb +29 -19
- data/lib/sekreti/crypt.rb +50 -17
- data/lib/sekreti/version.rb +1 -1
- data/sekreti.gemspec +4 -2
- metadata +32 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b1d51efb62be86810b62a97753d3be7a475c2bbe2e729eb84cb88638f6d56fb7
|
4
|
+
data.tar.gz: 8821f5364226ed49628cf4a7283c8e35d61be2a69fb471effddc4248762e1367
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c0a5cbc6fc2b87101d66b251af285bd879dbc1d375858973b68cfc3c447437d49bcac9e50a8430dbb803cf9c523f485e391b33da4cd41d1bf3e2eab98be2308b
|
7
|
+
data.tar.gz: 5a10038e3e8d038414b93196937508fa12d019ac5307372484d401d1c4234c41d3c598cc17e977bed8565c0a21fbd47f44c6cd5e5ec7554e01efc590ce661e0e
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,15 +1,17 @@
|
|
1
1
|
# sekreti
|
2
2
|
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/sekreti.svg)](https://badge.fury.io/rb/sekreti)
|
4
|
+
|
3
5
|
sekreti is an easy-to use yet minimal Gem to encrypt and decrypt file. It is based upon OpenSSL and intends to be as easy as possible on usage.
|
4
6
|
\
|
5
|
-
|
7
|
+
Sekreti currently supports `AES-128-CBC` and `AES-256-CBC` protocol.
|
6
8
|
|
7
9
|
## Installation
|
8
10
|
|
9
11
|
Add this line to your application's Gemfile:
|
10
12
|
|
11
13
|
```ruby
|
12
|
-
gem 'sekreti'
|
14
|
+
gem 'sekreti', '1.0.0'
|
13
15
|
```
|
14
16
|
|
15
17
|
And then execute:
|
@@ -29,22 +31,28 @@ From a Ruby file, basic steps are :
|
|
29
31
|
```ruby
|
30
32
|
require "sekreti"
|
31
33
|
|
32
|
-
# Encrypt a file
|
33
34
|
encrypt = sekreti::Crypt.new
|
34
35
|
encrypt.file = "./decrypted_file.txt"
|
35
36
|
encrypt.output_file = "./encrypted_output.txt"
|
36
|
-
encrypt.
|
37
|
+
encrypt.protocol = "AES-256-CBC" # is aes-128-cbc by default
|
38
|
+
|
39
|
+
# You must define an encryption key.
|
40
|
+
# Is 16 bytes long for aes-128-cbc
|
41
|
+
# Is 32 bytes long for aes-256-cbc
|
42
|
+
encrypt.key = "a" * 32 # a 16 bytes long encryption key for aes-128-cbc
|
37
43
|
|
38
44
|
# Validate that everything is ok
|
39
45
|
|
40
46
|
encrypt.file? # true
|
41
47
|
encrypt.output_file? # true
|
42
|
-
encrypt.
|
48
|
+
encrypt.key? # true
|
49
|
+
|
43
50
|
|
44
51
|
# Encrypt the file
|
45
52
|
encrypt.status? # false
|
46
53
|
encrypt.encrypt! # returns true
|
47
54
|
encrypt.status? # true
|
55
|
+
encrypt.dump # Returns the whole state
|
48
56
|
```
|
49
57
|
|
50
58
|
### Decrypt a file
|
@@ -54,18 +62,21 @@ require "sekreti"
|
|
54
62
|
decrypt = sekreti::Crypt.new
|
55
63
|
decrypt.file = "./encrypted_file.txt"
|
56
64
|
decrypt.output_file = "./decrypted_output.txt"
|
57
|
-
decrypt.
|
65
|
+
decrypt.key = "a" * 32
|
58
66
|
|
59
67
|
# Validate that everything is ok
|
60
68
|
|
61
69
|
decrypt.file? # true
|
62
70
|
decrypt.output_file? # true
|
63
|
-
decrypt.
|
71
|
+
decrypt.key? # true
|
64
72
|
|
65
73
|
# Decrypt the file
|
66
74
|
decrypt.status? # false
|
67
75
|
decrypt.decrypt! # returns true
|
68
76
|
decrypt.status? # true
|
77
|
+
|
78
|
+
# Dump the whole state
|
79
|
+
decrypt.dump
|
69
80
|
```
|
70
81
|
|
71
82
|
## Development
|
@@ -74,9 +85,14 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
|
|
74
85
|
|
75
86
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
76
87
|
|
88
|
+
The documentation can be generated with `Yard` :
|
89
|
+
```bash
|
90
|
+
bundle exec rake doc
|
91
|
+
```
|
92
|
+
|
77
93
|
## Contributing
|
78
94
|
|
79
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
95
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/atilleh/sekreti. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
80
96
|
|
81
97
|
## License
|
82
98
|
|
@@ -84,4 +100,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
|
|
84
100
|
|
85
101
|
## Code of Conduct
|
86
102
|
|
87
|
-
Everyone interacting in the sekreti project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/
|
103
|
+
Everyone interacting in the sekreti project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/atilleh/sekreti/blob/master/CODE_OF_CONDUCT.md).
|
data/Rakefile
CHANGED
@@ -10,12 +10,12 @@ namespace :sekreti do
|
|
10
10
|
desc "Encrypt a file using sekreti gem"
|
11
11
|
task :encrypt do
|
12
12
|
sekreti = sekreti::Crypt.new
|
13
|
-
sekreti.file = ENV["
|
13
|
+
sekreti.file = ENV["SEKRETI_FILE"]
|
14
14
|
sekreti.output_file = ENV["sekreti_OUTPUT"]
|
15
|
-
unless ENV["
|
15
|
+
unless ENV["SEKRETI_KEY"]
|
16
16
|
sekreti.salt = SecureRandom.hex(32)[0..15]
|
17
17
|
else
|
18
|
-
sekreti.salt = ENV["
|
18
|
+
sekreti.salt = ENV["SEKRETI_KEY"]
|
19
19
|
end
|
20
20
|
|
21
21
|
if sekreti.encrypt!
|
@@ -26,11 +26,16 @@ namespace :sekreti do
|
|
26
26
|
desc "Decrypt a file using sekreti gem"
|
27
27
|
task :decrypt do
|
28
28
|
sekreti = sekreti::Crypt.new
|
29
|
-
sekreti.file = ENV["
|
30
|
-
sekreti.outpuf_file = ENV["
|
31
|
-
sekreti.salt = ENV["
|
29
|
+
sekreti.file = ENV["SEKRETI_FILE"]
|
30
|
+
sekreti.outpuf_file = ENV["SEKRETI_OUTPUT"]
|
31
|
+
sekreti.salt = ENV["SEKRETI_KEY"]
|
32
32
|
if sekreti.decrypt!
|
33
33
|
puts "File decrypted."
|
34
34
|
end
|
35
35
|
end
|
36
|
+
end
|
37
|
+
|
38
|
+
desc "Generates documentation with Yard"
|
39
|
+
task :doc do
|
40
|
+
sh "bundle exec yardoc"
|
36
41
|
end
|
data/lib/sekreti.rb
CHANGED
data/lib/sekreti/core.rb
CHANGED
@@ -2,39 +2,49 @@ require "openssl"
|
|
2
2
|
module Sekreti
|
3
3
|
# Main class performing operations.
|
4
4
|
class Core
|
5
|
+
|
6
|
+
protected
|
5
7
|
# Encrypts a file with AES-128-CBC cipher, using
|
6
8
|
# a submitted 16 bytes string.
|
7
9
|
# @param options [Hash] submitted parameters
|
8
10
|
# @return boolean
|
9
11
|
def self.encrypt!(options)
|
10
|
-
|
11
|
-
|
12
|
-
|
12
|
+
begin
|
13
|
+
cipher = OpenSSL::Cipher.new(options[:protocol])
|
14
|
+
cipher.encrypt
|
15
|
+
cipher.key = options[:key]
|
13
16
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
f = File.open(
|
18
|
+
options[:output_file],
|
19
|
+
'wb'
|
20
|
+
)
|
21
|
+
|
22
|
+
encrypted = cipher.update(File.read(options[:path])) + cipher.final
|
23
|
+
f.write(encrypted)
|
21
24
|
|
22
|
-
|
25
|
+
return true
|
26
|
+
rescue
|
27
|
+
return false
|
28
|
+
end
|
23
29
|
end
|
24
30
|
|
25
31
|
# Decrypts a file with a submitted key.
|
26
32
|
# @param options [Hash] submitted parameters
|
27
33
|
# @return boolean
|
28
34
|
def self.decrypt!(options)
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
35
|
+
begin
|
36
|
+
decipher = OpenSSL::Cipher.new(options[:protocol])
|
37
|
+
decipher.decrypt
|
38
|
+
decipher.key = options[:key]
|
39
|
+
|
40
|
+
f = File.open(options[:output_file], 'w')
|
41
|
+
decrypted = decipher.update(File.read(options[:path])) + decipher.final
|
42
|
+
f.write(decrypted)
|
36
43
|
|
37
|
-
|
44
|
+
return true
|
45
|
+
rescue
|
46
|
+
return false
|
47
|
+
end
|
38
48
|
end
|
39
49
|
end
|
40
50
|
end
|
data/lib/sekreti/crypt.rb
CHANGED
@@ -4,8 +4,31 @@ module Sekreti
|
|
4
4
|
# Access helper to call the encryption and decryption
|
5
5
|
# actions.
|
6
6
|
class Crypt
|
7
|
-
def initialize(
|
8
|
-
@options =
|
7
|
+
def initialize()
|
8
|
+
@options = {
|
9
|
+
path: nil,
|
10
|
+
output_file: nil,
|
11
|
+
protocol: "AES-128-CBC",
|
12
|
+
status: false
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
# Returns encryption protocol
|
17
|
+
# @return encryption protocol
|
18
|
+
def protocol
|
19
|
+
@options[:protocol]
|
20
|
+
end
|
21
|
+
|
22
|
+
def protocol?
|
23
|
+
unless @options.key?(:protocol)
|
24
|
+
return false
|
25
|
+
end
|
26
|
+
|
27
|
+
true
|
28
|
+
end
|
29
|
+
|
30
|
+
def protocol=(protocol)
|
31
|
+
@options[:protocol] = protocol
|
9
32
|
end
|
10
33
|
|
11
34
|
# Returns entry file
|
@@ -64,27 +87,31 @@ module Sekreti
|
|
64
87
|
true
|
65
88
|
end
|
66
89
|
|
67
|
-
# Returns the encryption
|
68
|
-
# @return encryption
|
69
|
-
def
|
70
|
-
@options[:
|
90
|
+
# Returns the encryption key
|
91
|
+
# @return encryption key
|
92
|
+
def key
|
93
|
+
@options[:key]
|
71
94
|
end
|
72
95
|
|
73
|
-
# Set the encryption
|
74
|
-
# @param
|
96
|
+
# Set the encryption key
|
97
|
+
# @param key [String] 16 bytes string
|
75
98
|
# @return boolean
|
76
|
-
def
|
77
|
-
|
78
|
-
raise
|
99
|
+
def key=(key)
|
100
|
+
if @options[:protocol] == "AES-128-CBC"
|
101
|
+
raise(StandardError, "Key must be 16 bytes long.") if key.length != 16
|
79
102
|
end
|
80
103
|
|
81
|
-
@options[:
|
104
|
+
if @options[:protocol] == "AES-256-CBC"
|
105
|
+
raise(StandardError, "Key must be 32 bytes long.") if key.length != 32
|
106
|
+
end
|
107
|
+
|
108
|
+
@options[:key] = key
|
82
109
|
end
|
83
110
|
|
84
|
-
# returns true if
|
111
|
+
# returns true if key is defined.
|
85
112
|
# @return boolean
|
86
|
-
def
|
87
|
-
unless @options.key?(:
|
113
|
+
def key?
|
114
|
+
unless @options.key?(:key)
|
88
115
|
return false
|
89
116
|
end
|
90
117
|
|
@@ -96,7 +123,7 @@ module Sekreti
|
|
96
123
|
def encrypt!
|
97
124
|
raise StandardError, "No entry file defined." unless file?
|
98
125
|
raise StandardError, "No output file defnined" unless output_file?
|
99
|
-
raise StandardError, "No
|
126
|
+
raise StandardError, "No key defined" unless key?
|
100
127
|
|
101
128
|
if Core.encrypt!(@options)
|
102
129
|
@options[:status] = true
|
@@ -110,7 +137,7 @@ module Sekreti
|
|
110
137
|
def decrypt!
|
111
138
|
raise StandardError, "No entry file defined." unless file?
|
112
139
|
raise StandardError, "No output file defnined" unless output_file?
|
113
|
-
raise StandardError, "No
|
140
|
+
raise StandardError, "No key defined" unless key?
|
114
141
|
|
115
142
|
if Core.decrypt!(@options)
|
116
143
|
@options[:status] = true
|
@@ -123,5 +150,11 @@ module Sekreti
|
|
123
150
|
def status?
|
124
151
|
@options[:status]
|
125
152
|
end
|
153
|
+
|
154
|
+
# Returns the configuration
|
155
|
+
# @return current instance configuration.
|
156
|
+
def dump
|
157
|
+
@options
|
158
|
+
end
|
126
159
|
end
|
127
160
|
end
|
data/lib/sekreti/version.rb
CHANGED
data/sekreti.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.authors = ["atille"]
|
9
9
|
spec.email = ["gautierfrancois@outlook.com\n"]
|
10
10
|
|
11
|
-
spec.summary = %q{Easy-to-use encryption/decryption library}
|
12
|
-
spec.description = %q{Easy-to-use and configure encryption and decryption library based upon OpenSSL}
|
11
|
+
spec.summary = %q{Easy-to-use encryption/decryption library.}
|
12
|
+
spec.description = %q{Easy-to-use and configure encryption and decryption library based upon OpenSSL. Currently supports AES-128-CBC and AES-256-CBC encryption protocol.}
|
13
13
|
spec.homepage = "https://github.com/atilleh/sekreti"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
@@ -31,4 +31,6 @@ Gem::Specification.new do |spec|
|
|
31
31
|
spec.add_development_dependency "bundler", "~> 2.0"
|
32
32
|
spec.add_development_dependency "rake", "~> 10.0"
|
33
33
|
spec.add_development_dependency "rspec", "~> 3.0"
|
34
|
+
spec.add_development_dependency "yard"
|
35
|
+
spec.add_development_dependency "redcarpet"
|
34
36
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sekreti
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- atille
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-07-
|
11
|
+
date: 2019-07-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,8 +52,36 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: yard
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: redcarpet
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
55
83
|
description: Easy-to-use and configure encryption and decryption library based upon
|
56
|
-
OpenSSL
|
84
|
+
OpenSSL. Currently supports AES-128-CBC and AES-256-CBC encryption protocol.
|
57
85
|
email:
|
58
86
|
- 'gautierfrancois@outlook.com
|
59
87
|
|
@@ -103,5 +131,5 @@ requirements: []
|
|
103
131
|
rubygems_version: 3.0.4
|
104
132
|
signing_key:
|
105
133
|
specification_version: 4
|
106
|
-
summary: Easy-to-use encryption/decryption library
|
134
|
+
summary: Easy-to-use encryption/decryption library.
|
107
135
|
test_files: []
|