router_crypt 0.3.1 → 0.4.0
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 +7 -0
- data/Gemfile +3 -3
- data/Gemfile.lock +28 -9
- data/{rakefile → Rakefile} +14 -13
- data/bin/rtrcrypt +2 -1
- data/lib/cli/cli.rb +36 -10
- data/lib/junos/common.rb +53 -16
- data/lib/junos/crypt.rb +26 -0
- data/lib/router_crypt.rb +8 -7
- data/router_crypt.gemspec +4 -1
- data/spec/ios/decrypt_spec.rb +1 -1
- data/spec/junos/common_spec.rb +8 -8
- data/spec/junos/crypt_spec.rb +10 -0
- data/spec/junos/decrypt_spec.rb +1 -1
- data/spec/nxos/decrypt_spec.rb +1 -1
- metadata +55 -16
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 27c72c9db801e1733ea262975a6057782fc5351b
|
4
|
+
data.tar.gz: 60f4d105d9b314e5a8991321bd7a83f081a6590a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 98c8aac4fa9fbc0e7de60ab4f6c67480dc84db69f050f38b67ac1ea11e47bf4d7cbf25d0f2d25a702be35bc653554605f858ad9eb56d6c20c74764450d0c108b
|
7
|
+
data.tar.gz: d78ee283d8a74445ffb368b9a9fcdfab392bddecd830c2bf2d06f32a399f60409f288045a9a1ab3e1611c07533d884701e64354c2a850e8bb217fd000df33378
|
data/Gemfile
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
gemspec
|
data/Gemfile.lock
CHANGED
@@ -1,17 +1,36 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
router_crypt (0.4.0)
|
5
|
+
slop (~> 4.4)
|
6
|
+
|
1
7
|
GEM
|
8
|
+
remote: https://rubygems.org/
|
2
9
|
specs:
|
3
|
-
diff-lcs (1.2.
|
4
|
-
|
5
|
-
|
6
|
-
rspec-
|
7
|
-
rspec-
|
8
|
-
|
9
|
-
rspec-
|
10
|
-
|
11
|
-
rspec-
|
10
|
+
diff-lcs (1.2.5)
|
11
|
+
rake (10.5.0)
|
12
|
+
rspec (3.5.0)
|
13
|
+
rspec-core (~> 3.5.0)
|
14
|
+
rspec-expectations (~> 3.5.0)
|
15
|
+
rspec-mocks (~> 3.5.0)
|
16
|
+
rspec-core (3.5.4)
|
17
|
+
rspec-support (~> 3.5.0)
|
18
|
+
rspec-expectations (3.5.0)
|
19
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
20
|
+
rspec-support (~> 3.5.0)
|
21
|
+
rspec-mocks (3.5.0)
|
22
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
23
|
+
rspec-support (~> 3.5.0)
|
24
|
+
rspec-support (3.5.0)
|
25
|
+
slop (4.4.1)
|
12
26
|
|
13
27
|
PLATFORMS
|
14
28
|
ruby
|
15
29
|
|
16
30
|
DEPENDENCIES
|
31
|
+
rake
|
32
|
+
router_crypt!
|
17
33
|
rspec
|
34
|
+
|
35
|
+
BUNDLED WITH
|
36
|
+
1.11.2
|
data/{rakefile → Rakefile}
RENAMED
@@ -1,5 +1,6 @@
|
|
1
1
|
begin
|
2
2
|
require 'bundler'
|
3
|
+
require 'bundler/gem_tasks'
|
3
4
|
require 'rspec/core/rake_task'
|
4
5
|
Bundler.setup
|
5
6
|
rescue LoadError
|
@@ -9,6 +10,7 @@ end
|
|
9
10
|
|
10
11
|
|
11
12
|
gemspec = eval(File.read(Dir['*.gemspec'].first))
|
13
|
+
file = [gemspec.name, gemspec.version].join('-') + '.gem'
|
12
14
|
|
13
15
|
desc 'Validate the gemspec'
|
14
16
|
task :gemspec do
|
@@ -17,20 +19,19 @@ end
|
|
17
19
|
|
18
20
|
RSpec::Core::RakeTask.new(:spec)
|
19
21
|
|
20
|
-
|
21
|
-
desc "Build gem locally"
|
22
|
-
task :build => %i(spec gemspec) do
|
23
|
-
system "gem build #{gemspec.name}.gemspec"
|
24
|
-
FileUtils.mkdir_p "gems"
|
25
|
-
FileUtils.mv "#{gemspec.name}-#{gemspec.version}.gem", "gems"
|
26
|
-
end
|
27
|
-
|
28
|
-
desc "Install gem locally"
|
29
|
-
task :install => :build do
|
30
|
-
system "sudo sh -c \'umask 022; gem20 install gems/#{gemspec.name}-#{gemspec.version}\'"
|
31
|
-
end
|
32
|
-
|
33
22
|
desc "Clean automatically generated files"
|
34
23
|
task :clean do
|
35
24
|
FileUtils.rm_rf "gems"
|
36
25
|
end
|
26
|
+
|
27
|
+
desc 'Tag the release'
|
28
|
+
task :tag do
|
29
|
+
system "git tag #{gemspec.version}"
|
30
|
+
end
|
31
|
+
|
32
|
+
desc 'Push to rubygems'
|
33
|
+
task :push => :tag do
|
34
|
+
system "gem push pkg/#{file}"
|
35
|
+
end
|
36
|
+
|
37
|
+
task default: :spec
|
data/bin/rtrcrypt
CHANGED
data/lib/cli/cli.rb
CHANGED
@@ -1,17 +1,43 @@
|
|
1
|
+
require 'slop'
|
2
|
+
require 'pp'
|
3
|
+
|
4
|
+
|
1
5
|
class RouterCrypt::CLI
|
2
6
|
class << self
|
3
7
|
def run
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
opts=opts_parse.to_hash
|
9
|
+
#ARGV[0] or raise ArgumentError, 'no password given'
|
10
|
+
|
11
|
+
if opts[:junipercrypt]
|
12
|
+
pw=opts[:junipercrypt]
|
13
|
+
if opts[:salt]
|
14
|
+
RouterCrypt::JunOS.crypt(opts[:junipercrypt], opts[:salt])
|
15
|
+
else
|
16
|
+
RouterCrypt::JunOS.crypt opts[:junipercrypt]
|
17
|
+
end
|
18
|
+
elsif opts [:decrypt]
|
19
|
+
pw=opts[:decrypt].dup
|
20
|
+
case pw
|
21
|
+
when /^\$9\$/
|
22
|
+
RouterCrypt::JunOS.decrypt pw
|
23
|
+
when /^[\dA-F]+$/
|
24
|
+
RouterCrypt::IOS.decrypt pw
|
25
|
+
else
|
26
|
+
#presume it's NXOS, no clear way to separate garbage and NXOS PW
|
27
|
+
RouterCrypt::NXOS.decrypt pw
|
28
|
+
end
|
14
29
|
end
|
15
30
|
end
|
31
|
+
|
32
|
+
def opts_parse
|
33
|
+
Slop.parse do |o|
|
34
|
+
o.on '-h', '--help' do puts o; exit; end
|
35
|
+
o.bool '-D', '--debug', 'turn on debugging'
|
36
|
+
o.string '-j', '--junipercrypt', 'crypt Juniper'
|
37
|
+
o.string '-s', '--salt', 'salt for crypt'
|
38
|
+
o.string '-d', '--decrypt', 'decrypt'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
16
42
|
end
|
17
43
|
end
|
data/lib/junos/common.rb
CHANGED
@@ -1,40 +1,77 @@
|
|
1
1
|
class RouterCrypt::JunOS
|
2
2
|
class InvalidPW < StandardError; end
|
3
|
-
|
3
|
+
|
4
4
|
ENCODE = [
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
5
|
+
[ 1, 4, 32 ],
|
6
|
+
[ 1, 16, 32 ],
|
7
|
+
[ 1, 8, 32 ],
|
8
|
+
[ 1, 64 ],
|
9
|
+
[ 1, 32 ],
|
10
|
+
[ 1, 4, 16, 128 ],
|
11
|
+
[ 1, 32, 64 ],
|
12
12
|
]
|
13
13
|
EXTRA = {}
|
14
14
|
KEY = %w( QzF3n6/9CAtpu0O B1IREhcSyrleKvMW8LXx 7N-dVbwsY2g4oaJZGUDj iHkq.mPf5T )
|
15
15
|
KEYCHAR = KEY.join.each_char.to_a
|
16
|
+
CHARKEY = {}
|
17
|
+
for q in 0..(KEYCHAR.length - 1)
|
18
|
+
CHARKEY[KEYCHAR[q]] = q;
|
19
|
+
end
|
16
20
|
KEY.each_with_index do |key, index|
|
17
21
|
key.each_char { |c| EXTRA[c] = 3-index }
|
18
22
|
end
|
19
|
-
|
23
|
+
|
20
24
|
class << self
|
21
|
-
|
22
|
-
private
|
23
|
-
|
25
|
+
|
26
|
+
private
|
27
|
+
|
24
28
|
def nibble str, len
|
25
29
|
nib, str[0..len-1] = str[0..len-1], ''
|
26
30
|
nib.size == len or raise InvalidPW, 'Insufficent amont of characters'
|
27
31
|
nib
|
28
32
|
end
|
29
|
-
|
33
|
+
|
30
34
|
def gap c1, c2
|
31
|
-
(KEYCHAR.index(c1) - KEYCHAR.index(c2)) % KEYCHAR.size - 1
|
35
|
+
(KEYCHAR.index(c1) - KEYCHAR.index(c2)) % KEYCHAR.size - 1
|
32
36
|
end
|
33
|
-
|
37
|
+
|
34
38
|
def gap_decode gaps, dec
|
35
39
|
gaps.size == dec.size or raise InvalidPW, 'gaps and dec are unequal size'
|
36
40
|
(gaps.each_with_index.inject(0) { |num, (e, index)| num + e * dec[index] } % 256).chr
|
37
41
|
end
|
38
|
-
|
42
|
+
|
43
|
+
## return a random number of characters from our alphabet
|
44
|
+
def randc cnt
|
45
|
+
r = ''
|
46
|
+
while cnt>0
|
47
|
+
r << KEYCHAR[(rand KEYCHAR.length).to_i]
|
48
|
+
cnt-=1
|
49
|
+
end
|
50
|
+
r
|
51
|
+
end
|
52
|
+
|
53
|
+
## encode a plain-text character with a series of gaps,
|
54
|
+
## according to the current encoder.
|
55
|
+
def gap_encode pc,prev,enc
|
56
|
+
ord = pc.ord
|
57
|
+
|
58
|
+
crypt = ''
|
59
|
+
gaps=[]
|
60
|
+
|
61
|
+
enc.reverse.each do |x|
|
62
|
+
gaps.unshift (ord/x).to_i
|
63
|
+
ord %= x
|
64
|
+
end
|
65
|
+
|
66
|
+
gaps.each do |gap|
|
67
|
+
gap += CHARKEY[prev]+1
|
68
|
+
c = KEYCHAR[gap % KEYCHAR.length]
|
69
|
+
prev = c
|
70
|
+
crypt<<c
|
71
|
+
end
|
72
|
+
|
73
|
+
crypt
|
74
|
+
end
|
75
|
+
|
39
76
|
end
|
40
77
|
end
|
data/lib/junos/crypt.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
class RouterCrypt::JunOS
|
2
|
+
class << self
|
3
|
+
# Encrypts JunOS $9$ style passwords. This is reimplementation of CPAN
|
4
|
+
# Crypt::Juniper (by Kevin Brintnall, <kbrint at rufus.net>) ''juniper_crypt' function
|
5
|
+
#
|
6
|
+
# @param [String] the plaintext string
|
7
|
+
# @return [String] the encrypted string
|
8
|
+
def crypt (plaintext, *opts)
|
9
|
+
salt = opts[0] ? opts[0][0] : randc(1)
|
10
|
+
rand = randc(EXTRA[salt])
|
11
|
+
|
12
|
+
prev = salt
|
13
|
+
crypt="$9$"
|
14
|
+
crypt<<salt
|
15
|
+
crypt<<rand
|
16
|
+
|
17
|
+
plaintext.chars.each_with_index do |p, pos|
|
18
|
+
encode = ENCODE[ pos % ENCODE.length]
|
19
|
+
crypt<< gap_encode(p, prev, encode)
|
20
|
+
prev = crypt[crypt.size-1]
|
21
|
+
end
|
22
|
+
|
23
|
+
crypt
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/router_crypt.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
class RouterCrypt
|
2
2
|
end
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
4
|
+
require_relative 'junos/common'
|
5
|
+
require_relative 'junos/decrypt'
|
6
|
+
require_relative 'junos/crypt'
|
7
|
+
require_relative 'ios/common'
|
8
|
+
require_relative 'ios/decrypt'
|
9
|
+
require_relative 'nxos/common'
|
10
|
+
require_relative 'nxos/decrypt'
|
11
|
+
require_relative 'cli/cli'
|
data/router_crypt.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'router_crypt'
|
3
|
-
s.version = '0.
|
3
|
+
s.version = '0.4.0'
|
4
4
|
s.platform = Gem::Platform::RUBY
|
5
5
|
s.authors = [ 'Saku Ytti' ]
|
6
6
|
s.email = %w( saku@ytti.fi )
|
@@ -12,4 +12,7 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.executables = %w( rtrcrypt )
|
13
13
|
s.require_path = 'lib'
|
14
14
|
s.required_rubygems_version = '>= 1.3.6'
|
15
|
+
s.add_runtime_dependency 'slop', '~> 4.4'
|
16
|
+
s.add_development_dependency 'rake'
|
17
|
+
s.add_development_dependency 'rspec'
|
15
18
|
end
|
data/spec/ios/decrypt_spec.rb
CHANGED
data/spec/junos/common_spec.rb
CHANGED
@@ -5,35 +5,35 @@ describe RouterCrypt::JunOS, '#nibble' do
|
|
5
5
|
it 'returns k for 1 char out of "kakka"' do
|
6
6
|
str = 'kakka'
|
7
7
|
nib = RouterCrypt::JunOS.send :nibble, str, 1
|
8
|
-
nib.
|
9
|
-
str.
|
8
|
+
expect(nib).to eq 'k'
|
9
|
+
expect(str).to eq 'akka'
|
10
10
|
end
|
11
11
|
it 'returns kak for 3 char out of "kakka"' do
|
12
12
|
str = 'kakka'
|
13
13
|
nib = RouterCrypt::JunOS.send :nibble, str, 3
|
14
|
-
nib.
|
15
|
-
str.
|
14
|
+
expect(nib).to eq 'kak'
|
15
|
+
expect(str).to eq 'ka'
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
describe RouterCrypt::JunOS, '#gap' do
|
20
20
|
it 'returns 7 for gap between k and J' do
|
21
21
|
gap = RouterCrypt::JunOS.send :gap, 'k', 'J'
|
22
|
-
gap.
|
22
|
+
expect(gap).to eq 7
|
23
23
|
end
|
24
24
|
it 'returns 56 for gap between J and k' do
|
25
25
|
gap = RouterCrypt::JunOS.send :gap, 'J', 'k'
|
26
|
-
gap.
|
26
|
+
expect(gap).to eq 56
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
30
|
describe RouterCrypt::JunOS, "#gaps" do
|
31
31
|
it 'returns ) for [gaps], [dec]' do
|
32
32
|
chr = RouterCrypt::JunOS.send :gap_decode, RouterCrypt::JunOS::ENCODE[1], [9, 42, 12]
|
33
|
-
chr.
|
33
|
+
expect(chr).to eq ')'
|
34
34
|
end
|
35
35
|
it 'returns n for [gaps2], [dec2]' do
|
36
36
|
chr = RouterCrypt::JunOS.send :gap_decode, RouterCrypt::JunOS::ENCODE[5], [42, 69, 99, 4]
|
37
|
-
chr.
|
37
|
+
expect(chr).to eq 'n'
|
38
38
|
end
|
39
39
|
end
|
data/spec/junos/decrypt_spec.rb
CHANGED
data/spec/nxos/decrypt_spec.rb
CHANGED
metadata
CHANGED
@@ -1,16 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: router_crypt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.4.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Saku Ytti
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
13
|
-
dependencies:
|
11
|
+
date: 2016-11-22 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: slop
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '4.4'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '4.4'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
14
55
|
description: Library and binary which decrypt (crypt unimplemented) Juniper JunOS
|
15
56
|
$9$, Cisco IOS type 7 and Cisco NX-OS passwords
|
16
57
|
email:
|
@@ -20,52 +61,50 @@ executables:
|
|
20
61
|
extensions: []
|
21
62
|
extra_rdoc_files: []
|
22
63
|
files:
|
23
|
-
- .gitignore
|
24
|
-
- .rspec
|
64
|
+
- ".gitignore"
|
65
|
+
- ".rspec"
|
25
66
|
- Gemfile
|
26
67
|
- Gemfile.lock
|
27
68
|
- README.md
|
69
|
+
- Rakefile
|
28
70
|
- bin/rtrcrypt
|
29
71
|
- lib/cli/cli.rb
|
30
72
|
- lib/ios/common.rb
|
31
73
|
- lib/ios/decrypt.rb
|
32
74
|
- lib/junos/common.rb
|
75
|
+
- lib/junos/crypt.rb
|
33
76
|
- lib/junos/decrypt.rb
|
34
77
|
- lib/nxos/common.rb
|
35
78
|
- lib/nxos/decrypt.rb
|
36
79
|
- lib/router_crypt.rb
|
37
|
-
- rakefile
|
38
80
|
- router_crypt.gemspec
|
39
81
|
- spec/ios/decrypt_spec.rb
|
40
82
|
- spec/junos/common_spec.rb
|
83
|
+
- spec/junos/crypt_spec.rb
|
41
84
|
- spec/junos/decrypt_spec.rb
|
42
85
|
- spec/nxos/decrypt_spec.rb
|
43
86
|
- spec/spec_helper.rb
|
44
87
|
homepage: http://github.com/ytti/router_crypt
|
45
88
|
licenses: []
|
89
|
+
metadata: {}
|
46
90
|
post_install_message:
|
47
91
|
rdoc_options: []
|
48
92
|
require_paths:
|
49
93
|
- lib
|
50
94
|
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
-
none: false
|
52
95
|
requirements:
|
53
|
-
- -
|
96
|
+
- - ">="
|
54
97
|
- !ruby/object:Gem::Version
|
55
98
|
version: '0'
|
56
|
-
segments:
|
57
|
-
- 0
|
58
|
-
hash: -1168524170456204524
|
59
99
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
-
none: false
|
61
100
|
requirements:
|
62
|
-
- -
|
101
|
+
- - ">="
|
63
102
|
- !ruby/object:Gem::Version
|
64
103
|
version: 1.3.6
|
65
104
|
requirements: []
|
66
105
|
rubyforge_project: router_crypt
|
67
|
-
rubygems_version:
|
106
|
+
rubygems_version: 2.5.2
|
68
107
|
signing_key:
|
69
|
-
specification_version:
|
108
|
+
specification_version: 4
|
70
109
|
summary: Crypt library for JunOS/IOS/NX-OS passwords
|
71
110
|
test_files: []
|