fernet-cli 0.1 → 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 +25 -0
- data/bin/fernet-decrypt +2 -57
- data/bin/fernet-encrypt +2 -47
- data/fernet-cli.gemspec +1 -0
- data/lib/fernet/cli/version.rb +1 -1
- data/lib/fernet/cli.rb +92 -0
- metadata +17 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5a654c836525e88646cbb7142cafaa905aab09a7
|
4
|
+
data.tar.gz: e2d9ab9a0450fb6e4127289b34836ea4cad8ab2f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7b36d9e0360d9158ac682d4abf8e87d0a19c3b7bc742a50d78867b73fd8fc1ec876835477fce8a22e5b0d2f1176a79320d14a685ec5f09a73cee0f95017056b5
|
7
|
+
data.tar.gz: f011d30cb64e6898d97c2dd994c30de6e93b1de8e0a88559e29d7f40bc259d11a2f39087953149bc228e5b050f5d92078b2cf001327e04e26f3293f5838bd5da
|
data/README.md
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
fernet-cli
|
2
|
+
==========
|
3
|
+
|
4
|
+
Now, the power of [Fernet](https://github.com/fernet/spec) is
|
5
|
+
available from the shell!
|
6
|
+
|
7
|
+
```
|
8
|
+
tmaher@og-kush:~$ fernet-encrypt --help
|
9
|
+
Usage: fernet-encrypt [-p | -k <keyfile>] -i <infile> -o <outfile>
|
10
|
+
-p, --prompt Prompt for keys
|
11
|
+
-k, --keyfile KEYFILE
|
12
|
+
-i, --infile INPUTFILE
|
13
|
+
-o, --outfile OUTPUTFILE
|
14
|
+
```
|
15
|
+
|
16
|
+
And there's a corresponding `fernet-decrypt` too. The key should be a
|
17
|
+
base64-encoded blob of 256-bits. If you'd rather not write it out to
|
18
|
+
a file or get promted for it, you can save it to shell environment
|
19
|
+
variable `FERNET_CLI_KEY`.
|
20
|
+
|
21
|
+
For `fernet-encrypt`, the infile is plaintext and the outfile is
|
22
|
+
ciphertext. For `fernet-decrypt`, the infile is ciphertext and the
|
23
|
+
outfile is plaintext.
|
24
|
+
|
25
|
+
For more information, see https://github.com/fernet/spec
|
data/bin/fernet-decrypt
CHANGED
@@ -1,60 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require 'fernet'
|
4
|
-
require 'optparse'
|
5
|
-
require 'highline/import'
|
3
|
+
require 'fernet/cli'
|
6
4
|
|
7
|
-
|
8
|
-
OptionParser.new do |opts|
|
9
|
-
opts.banner = "Usage: fernet-decrypt [-p | -k <keyfile>] -i <ciphertext> -o <plaintext>"
|
10
|
-
|
11
|
-
opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
|
12
|
-
options[:verbose] = v
|
13
|
-
end
|
14
|
-
opts.on("-p", "--prompt", "Prompt for keys") do |prompt|
|
15
|
-
options[:prompt] = prompt
|
16
|
-
end
|
17
|
-
opts.on("-k", "--keyfile KEYFILE") do |keyfile|
|
18
|
-
options[:keyfile] = keyfile
|
19
|
-
end
|
20
|
-
opts.on("-i", "--infile CIPHERFILE") do |cipherfile|
|
21
|
-
options[:cipherfile] = cipherfile
|
22
|
-
end
|
23
|
-
opts.on("-o", "--outfile PLAINFILE") do |plainfile|
|
24
|
-
options[:plainfile] = plainfile
|
25
|
-
end
|
26
|
-
opts.on("--enforce-ttl") do |ttl|
|
27
|
-
options[:ttl] = true
|
28
|
-
end
|
29
|
-
end.parse!
|
30
|
-
|
31
|
-
if ENV["FERNET_CLI_KEY"].nil?
|
32
|
-
if options[:prompt]
|
33
|
-
KEY = ask("Enter Key: ") {|q| q.echo = false}
|
34
|
-
elsif options[:keyfile]
|
35
|
-
KEY = File.read(options[:keyfile]).chomp
|
36
|
-
end
|
37
|
-
else
|
38
|
-
KEY=ENV["FERNET_CLI_KEY"]
|
39
|
-
end
|
40
|
-
|
41
|
-
if KEY.nil?
|
42
|
-
puts "i have no key"
|
43
|
-
exit(1)
|
44
|
-
end
|
45
|
-
|
46
|
-
if options[:cipherfile].nil? or (! File.readable?(options[:cipherfile]))
|
47
|
-
puts "can't read ciphertext file"
|
48
|
-
exit(1)
|
49
|
-
end
|
50
|
-
|
51
|
-
plaintext = Fernet.verifier(KEY.chomp, File.read(options[:cipherfile]),
|
52
|
-
enforce_ttl: options[:ttl])
|
53
|
-
if ! plaintext.valid?
|
54
|
-
puts "ciphertext corrupt"
|
55
|
-
exit(1)
|
56
|
-
end
|
57
|
-
|
58
|
-
File.open(options[:plainfile], "w+") do |f|
|
59
|
-
f.write(plaintext.message)
|
60
|
-
end
|
5
|
+
Fernet::CLI.new().decrypt
|
data/bin/fernet-encrypt
CHANGED
@@ -1,50 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require 'fernet'
|
4
|
-
require 'optparse'
|
5
|
-
require 'highline/import'
|
3
|
+
require 'fernet/cli'
|
6
4
|
|
7
|
-
|
8
|
-
OptionParser.new do |opts|
|
9
|
-
opts.banner = "Usage: fernet-encrypt [-p | -k <keyfile>] -i <plaintext> -o <ciphertext>"
|
10
|
-
|
11
|
-
opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
|
12
|
-
options[:verbose] = v
|
13
|
-
end
|
14
|
-
opts.on("-p", "--prompt", "Prompt for keys") do |prompt|
|
15
|
-
options[:prompt] = prompt
|
16
|
-
end
|
17
|
-
opts.on("-k", "--keyfile KEYFILE") do |keyfile|
|
18
|
-
options[:keyfile] = keyfile
|
19
|
-
end
|
20
|
-
opts.on("-i", "--infile PLAINFILE") do |plainfile|
|
21
|
-
options[:plainfile] = plainfile
|
22
|
-
end
|
23
|
-
opts.on("-o", "--outfile CIPHERFILE") do |cipherfile|
|
24
|
-
options[:cipherfile] = cipherfile
|
25
|
-
end
|
26
|
-
end.parse!
|
27
|
-
|
28
|
-
if ENV["FERNET_CLI_KEY"].nil?
|
29
|
-
if options[:prompt]
|
30
|
-
KEY = ask("Enter Key: ") {|q| q.echo = false}
|
31
|
-
elsif options[:keyfile]
|
32
|
-
KEY = File.read(options[:keyfile]).chomp
|
33
|
-
end
|
34
|
-
else
|
35
|
-
KEY=ENV["FERNET_CLI_KEY"]
|
36
|
-
end
|
37
|
-
|
38
|
-
if KEY.nil?
|
39
|
-
puts "i have no key"
|
40
|
-
exit(1)
|
41
|
-
end
|
42
|
-
|
43
|
-
if options[:plainfile].nil? or (! File.readable?(options[:plainfile]))
|
44
|
-
puts "can't read plaintext file"
|
45
|
-
exit(1)
|
46
|
-
end
|
47
|
-
|
48
|
-
File.open(options[:cipherfile], "w+") do |f|
|
49
|
-
f.write(Fernet.generate(KEY.chomp, File.read(options[:plainfile])))
|
50
|
-
end
|
5
|
+
Fernet::CLI.new().encrypt
|
data/fernet-cli.gemspec
CHANGED
data/lib/fernet/cli/version.rb
CHANGED
data/lib/fernet/cli.rb
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'fernet'
|
2
|
+
require 'optparse'
|
3
|
+
require 'highline/import'
|
4
|
+
|
5
|
+
module Fernet
|
6
|
+
class CLI
|
7
|
+
def initialize
|
8
|
+
@options = {}
|
9
|
+
@op_obj = parse_args
|
10
|
+
@key = get_key
|
11
|
+
(@in_fd, @out_fd) = set_file_descriptors
|
12
|
+
end
|
13
|
+
|
14
|
+
def abort msg="unspecified error"
|
15
|
+
$stderr.puts "FAIL: #{msg}", @op_obj.banner, @op_obj.summarize
|
16
|
+
exit(1)
|
17
|
+
end
|
18
|
+
|
19
|
+
def parse_args
|
20
|
+
op = OptionParser.new do |opts|
|
21
|
+
opts.banner = "Usage: #{$0} [-p | -k <keyfile>] -i <infile> -o <outfile>"
|
22
|
+
|
23
|
+
opts.on("-p", "--prompt", "Prompt for keys") do |prompt|
|
24
|
+
@options[:prompt] = prompt
|
25
|
+
end
|
26
|
+
opts.on("-k", "--keyfile KEYFILE") do |keyfile|
|
27
|
+
@options[:keyfile] = keyfile
|
28
|
+
end
|
29
|
+
opts.on("-i", "--infile INPUTFILE") do |infile|
|
30
|
+
@options[:infile] = infile
|
31
|
+
end
|
32
|
+
opts.on("-o", "--outfile OUTPUTFILE") do |outfile|
|
33
|
+
@options[:outfile] = outfile
|
34
|
+
end
|
35
|
+
end
|
36
|
+
op.parse!
|
37
|
+
op
|
38
|
+
end
|
39
|
+
|
40
|
+
def get_key
|
41
|
+
if ENV["FERNET_CLI_KEY"].nil?
|
42
|
+
if @options[:prompt]
|
43
|
+
key = ask("Enter Key: ") {|q| q.echo = false}
|
44
|
+
elsif @options[:keyfile]
|
45
|
+
key = File.read(@options[:keyfile])
|
46
|
+
end
|
47
|
+
else
|
48
|
+
key=ENV["FERNET_CLI_KEY"]
|
49
|
+
end
|
50
|
+
|
51
|
+
abort("please specify a key") if key.nil?
|
52
|
+
|
53
|
+
key.chomp
|
54
|
+
end
|
55
|
+
|
56
|
+
def set_file_descriptors
|
57
|
+
if @options[:infile].nil? or @options[:outfile].nil?
|
58
|
+
abort "must specify input & output files. Use '-' for stdin/stdout"
|
59
|
+
end
|
60
|
+
|
61
|
+
if @options[:infile] == "-"
|
62
|
+
in_fd = $stdin
|
63
|
+
else
|
64
|
+
abort("can't read input file") unless File.readable?(@options[:infile])
|
65
|
+
in_fd = File.open(@options[:infile])
|
66
|
+
end
|
67
|
+
|
68
|
+
if @options[:outfile] == "-"
|
69
|
+
out_fd = $stdout
|
70
|
+
else
|
71
|
+
out_fd = File.open(@options[:outfile], "w+")
|
72
|
+
end
|
73
|
+
|
74
|
+
[in_fd, out_fd]
|
75
|
+
end
|
76
|
+
|
77
|
+
def encrypt
|
78
|
+
@out_fd.write(Fernet.generate(@key, @in_fd.read))
|
79
|
+
@out_fd.close
|
80
|
+
end
|
81
|
+
|
82
|
+
def decrypt
|
83
|
+
plaintext = Fernet.verifier(@key, @in_fd.read,
|
84
|
+
enforce_ttl: false)
|
85
|
+
abort("ciphertext corrupt") unless plaintext.valid?
|
86
|
+
|
87
|
+
@out_fd.write(plaintext.message)
|
88
|
+
@out_fd.close
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fernet-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.3'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Maher
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '2.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: highline
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.6'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.6'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: rspec
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -49,10 +63,12 @@ extra_rdoc_files: []
|
|
49
63
|
files:
|
50
64
|
- ".gitignore"
|
51
65
|
- Gemfile
|
66
|
+
- README.md
|
52
67
|
- Rakefile
|
53
68
|
- bin/fernet-decrypt
|
54
69
|
- bin/fernet-encrypt
|
55
70
|
- fernet-cli.gemspec
|
71
|
+
- lib/fernet/cli.rb
|
56
72
|
- lib/fernet/cli/version.rb
|
57
73
|
- version
|
58
74
|
homepage: https://github.com/tmaher/fernet-cli
|