ciphersurfer 1.0.0.rc1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,8 +1,6 @@
1
1
  source "http://rubygems.org"
2
2
 
3
3
  gem 'rainbow'
4
- gem 'progressbar'
5
- gem "awesome_print"
6
4
  gem 'json'
7
5
  gem 'httpclient'
8
6
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,6 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- awesome_print (1.0.2)
5
4
  diff-lcs (1.1.3)
6
5
  git (1.2.5)
7
6
  httpclient (2.2.4)
@@ -10,7 +9,6 @@ GEM
10
9
  git (>= 1.2.5)
11
10
  rake
12
11
  json (1.6.5)
13
- progressbar (0.9.2)
14
12
  rainbow (1.1.3)
15
13
  rake (0.9.2.2)
16
14
  rcov (0.9.11)
@@ -27,12 +25,10 @@ PLATFORMS
27
25
  ruby
28
26
 
29
27
  DEPENDENCIES
30
- awesome_print
31
28
  bundler (~> 1.0.0)
32
29
  httpclient
33
30
  jeweler (~> 1.6.4)
34
31
  json
35
- progressbar
36
32
  rainbow
37
33
  rcov
38
34
  rspec (~> 2.3.0)
File without changes
data/README.md CHANGED
@@ -1,24 +1,108 @@
1
1
  # ciphersurfer
2
2
 
3
- ciphersurfer is a tool to enumerate a website for ciphers it supports. It can
4
- be used for testing pourposes and to evaluate te security configuration for an
5
- SSL configured web server.
3
+ ciphersurfer is a tool written for the early stages of a penetration test
4
+ activities. While gathering information about an host, it's important to
5
+ evaluate how strong is the cryptography applied to the HTTP traffic. This is
6
+ the ciphersurfer goal.
7
+
8
+ The tool tries for every SSL protocols it supports to connect to the host with
9
+ all ciphers saving the ones the server supports.
10
+
11
+ This information used with certificate key lenght and the list of supported
12
+ protocols by the server it's used to evaluate how strong is the target HTTPS
13
+ configuration. This gives the penetration test an information about how secure
14
+ is the communication between clients and the target machine.
15
+
16
+ ## Some disclaimer
17
+
18
+ ciphersurfer performs neither of the followings:
19
+
20
+ * denial of service attacks
21
+ * cross site scripting or injection attempts
22
+ * data manipulation or leakage
23
+
24
+ The requests the tool makes are just an HTTP GET / of target website to ensure
25
+ the server accept an HTTP communication given a SSL protocol and cipher
26
+ proposed by the client. No more. Really, ciphersurer won't hurt your webserver,
27
+ nor your business.
28
+
29
+ If you don't trust this disclaimer, just check the source code.
6
30
 
7
31
  ## Installing ciphersurfer
8
32
 
9
- Installing ciphersurfer is easy. Just follow the standard ruby gem way:
33
+ ciphersurfer is deployed as standard gem served by
34
+ [rubygems](http://rubygems.org).
35
+
36
+ To install latest ciphersurfer stable release, just issue this command:
37
+
38
+ ```
39
+ gem install ciphersurfer
40
+ ```
41
+
42
+ If you want to install a _pre_ release, such as a _release candidate_ you can do it this way:
43
+
44
+ ```
45
+ gem install ciphersurfer --pre
46
+ ```
47
+
48
+ I recommend you to install [rvm](https://rvm.beginrescueend.com/) in order to
49
+ have your gem binaries tool installed in your home directory, otherwise
50
+ ciphersurfer will try to install itself in standard /usr/bin directory if no
51
+ other flags are passed to gem command.
52
+
53
+ ## Using ciphersurfer
54
+
55
+ After ciphersurfer has been installed, using it it's very simple.
56
+
57
+ To evaluate secure communication with the target host _test-this.com_ at the
58
+ standard HTTPS port, you just give the tool the target name as option:
59
+
60
+ ```
61
+ ciphersurfer test-this.com
62
+ ```
63
+
64
+ As output you will see an evaluation for HTTPS test-this.com configuration.
65
+ The evaluation scale is:
66
+
67
+ * A: _prime class_ HTTPS configuration. Servers handling **very** sensitive
68
+ information
69
+ * B: strong HTTPS configuration, suitable for must production servers
70
+ * C: quite goot HTTPS configuration. If your web server is a private server and
71
+ for development or testing purposes, it can be acceptable. If your server is
72
+ exposed to the Internet, you want to improve your SSL configuration.
73
+ * D: poor HTTPS configuration. Suitable **only** for development machines.
74
+ * E: weak HTTPS configuration. You really don't want to have this score
75
+
76
+ If your HTTPS server is listening to a non standard port, you can supply the
77
+ port number (e.g. 4433) this way:
78
+
79
+ ```
80
+ ciphersurfer test-this.com:4433
81
+ ```
82
+
83
+ You can also just listen ciphers supported by your web server instead of having
84
+ an SSL evaluation:
85
+
86
+ ```
87
+ $ ciphersurfer -l gmail.com
10
88
 
11
- gem install ciphersurfer
89
+ "Evaluating secure communication with gmail.com:443"
90
+ "[+] accepted RC4-MD5"
91
+ "[+] accepted AES256-SHA"
92
+ "[+] accepted DES-CBC3-SHA"
93
+ "[+] accepted AES128-SHA"
94
+ "[+] accepted RC4-SHA"
95
+ ```
12
96
 
13
- Now you've got a ciphersurfer executable you can invoke using your command line.
97
+ ## Some theory behind ciphersurfer
14
98
 
15
- ## SSLabs
99
+ ### SSLabs
16
100
 
17
101
  For the SSL security evaluation, we use [SSLabs
18
102
  document](https://www.ssllabs.com/downloads/SSL_Server_Rating_Guide_2009.pdf)
19
103
  as reference.
20
104
 
21
- ## OWASP Testing guide
105
+ ### OWASP Testing guide
22
106
 
23
107
  ciphersurfer goal is to make tests described in the [Owasp Testing
24
108
  guide](https://www.owasp.org/index.php/Testing_for_SSL-TLS_(OWASP-CM-001\))
data/Rakefile CHANGED
@@ -12,14 +12,18 @@ end
12
12
  require 'rake'
13
13
 
14
14
  require 'jeweler'
15
+ require './lib/ciphersurfer/version'
16
+
15
17
  Jeweler::Tasks.new do |gem|
16
18
  # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
17
19
  gem.name = "ciphersurfer"
18
20
  gem.homepage = "http://github.com/thesp0nge/ciphersurfer"
19
21
  gem.license = "BSD"
20
- gem.version = File.read('VERSION')
21
- gem.summary = %Q{list all enable ciphers for a given website}
22
- gem.description = %Q{ciphersurfer is a security tool that list enabled ciphers for a secure HTTP connection}
22
+ gem.version = Ciphersurfer::Version::STRING
23
+ File.open('VERSION', 'w') {|f| f.write(Ciphersurfer::Version::STRING) }
24
+
25
+ gem.summary = %Q{evaluates web server SSL configuration}
26
+ gem.description = %Q{ciphersurfer is a security tool that evaluates web server SSL configuration}
23
27
  gem.email = "thesp0nge@gmail.com"
24
28
  gem.authors = ["Paolo Perego"]
25
29
  gem.executables = ['ciphersurfer']
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.0.rc1
1
+ 1.0.0
data/bin/ciphersurfer CHANGED
@@ -1,42 +1,59 @@
1
1
  #!/usr/bin/env ruby
2
- require 'ciphersurfer'
2
+
3
3
  require 'rainbow'
4
- require 'awesome_print'
5
- require 'progressbar'
4
+ require 'ciphersurfer'
6
5
  require 'getoptlong'
7
6
  require 'json'
8
7
 
8
+ def score_to_color(score)
9
+ case score
10
+ when 1...40
11
+ return "red".to_sym
12
+ when 40...80
13
+ return "yellow".to_sym
14
+ when 80..100
15
+ return "green".to_sym
16
+ end
17
+ end
18
+
9
19
  opts = GetoptLong.new(
10
20
  [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
11
21
  [ '--version', '-v', GetoptLong::NO_ARGUMENT ],
12
- [ '--list-ciphers', '-l', GetoptLong::NO_ARGUMENT ]#,
13
- # [ '--json', '-j', GetoptLong::NO_ARGUMENT]
22
+ [ '--list-ciphers', '-l', GetoptLong::NO_ARGUMENT ],
23
+ [ '--json', '-j', GetoptLong::NO_ARGUMENT]
14
24
  )
25
+ trap("INT") { puts '['+'INTERRUPTED'.color(:red)+']'; exit -1 }
15
26
 
16
27
  options={:json=>false,:list_ciphers=>false}
17
28
 
18
29
  opts.each do |opt, arg|
19
30
  case opt
20
31
  when '--help'
21
- ap "usage: ciphersurfer [-ljvh] server[:port]"
22
- ap " -l: lists supported ciphers instead of just evaluate the security level"
23
- # ap " -j: formats the output using JSON"
24
- ap " -v: shows version"
25
- ap " -h: this help"
32
+ puts "usage: ciphersurfer [-ljvh] server[:port]"
33
+ puts " -l: lists supported ciphers instead of just evaluate the security level"
34
+ puts " -j: formats the output using JSON"
35
+ puts " -v: shows version"
36
+ puts " -h: this help"
26
37
  exit 0
27
38
  when '--version'
28
- ap "ciphersurfer " + Ciphersurfer::Version.version[:string]
39
+ puts "ciphersurfer " + Ciphersurfer::Version::STRING
29
40
  exit 0
30
- # unsupported right now...
31
- #when '--json'
32
- # options[:json]=true
41
+ when '--json'
42
+ options[:json]=true
33
43
  when '--list-ciphers'
34
44
  options[:list_ciphers]=true
35
45
  end
36
46
  end
37
47
 
38
48
  if ( ARGV.length != 1 )
39
- ap 'ciphersurfer: missing target'
49
+ puts 'missing target'.color(:red)
50
+
51
+ puts "usage: ciphersurfer [-ljvh] server[:port]"
52
+ puts " -l: lists supported ciphers instead of just evaluate the security level"
53
+ puts " -j: formats the output using JSON"
54
+ puts " -v: shows version"
55
+ puts " -h: this help"
56
+
40
57
  exit -1
41
58
  end
42
59
 
@@ -44,19 +61,17 @@ target = ARGV.shift
44
61
  host = target.split(':')[0] ||= "localhost" #fallback here should never occur... however it's better to be paranoid
45
62
  port = target.split(':')[1] ||= 443 # more common here
46
63
 
47
- ap "scanning #{host}:#{port} for supported ciphers"
64
+ puts "Evaluating secure communication with #{host}:#{port}"
48
65
 
49
66
  if ! Ciphersurfer::Scanner.alive?(host, port)
50
- ap "it seems there is no server listening @#{host}:#{port}"
51
67
  exit -2
52
68
  end
53
69
 
54
70
  protocol_version = [:SSLv2, :SSLv3, :TLSv1]#, :TLSv11, :TLSv12]
55
71
 
56
- # ok = {}
57
72
  supported_protocols = []
58
73
  cipher_bits=[]
59
-
74
+ ciphers=[]
60
75
 
61
76
 
62
77
  protocol_version.each do |version|
@@ -66,36 +81,48 @@ protocol_version.each do |version|
66
81
  if (s.ok_ciphers.size != 0)
67
82
  supported_protocols << version
68
83
  cipher_bits = cipher_bits | s.ok_bits
84
+ ciphers = ciphers | s.ok_ciphers
69
85
  end
70
-
71
- # ok << {:proto=>version, :ciphers=>s.ok_ciphers}
72
86
 
73
87
  end
74
88
 
75
- cert = Ciphersurfer::Scanner.cert(host, port)
76
- a=cert.public_key.to_text
77
- key_size=/Modulus \((\d+)/i.match(a)[1]
78
-
79
-
80
- proto_score= Ciphersurfer::Score.evaluate_protocols(supported_protocols)
81
- cipher_score= Ciphersurfer::Score.evaluate_ciphers(cipher_bits)
82
- key_score= Ciphersurfer::Score.evaluate_key(key_size.to_i)
83
- score= Ciphersurfer::Score.score(proto_score, key_score, cipher_score)
84
- ap Ciphersurfer::Score.evaluate(score) + " ("+score.to_s+")"
85
-
86
- ap "Protocol support: " + proto_score.to_s
87
- ap "Key exchange: " + key_score.to_s
88
- ap "Cipher strength: " + cipher_score.to_s
89
-
89
+ if (options[:list_ciphers])
90
+ ciphers.each do |c|
91
+ puts "[+] accepted #{c}".green
92
+ end
93
+ exit 0
94
+ end
90
95
 
96
+ cert= Ciphersurfer::Scanner.cert(host, port)
97
+ if ! cert.nil?
98
+ a=cert.public_key.to_text
99
+ key_size=/Modulus \((\d+)/i.match(a)[1]
100
+ else
101
+ puts "warning: the server didn't give us the certificate".color(:yellow)
102
+ key_size=0
103
+ end
104
+
91
105
 
106
+ proto_score= Ciphersurfer::Score.evaluate_protocols(supported_protocols)
107
+ cipher_score= Ciphersurfer::Score.evaluate_ciphers(cipher_bits)
108
+ key_score= Ciphersurfer::Score.evaluate_key(key_size.to_i)
109
+ score= Ciphersurfer::Score.score(proto_score, key_score, cipher_score)
92
110
 
93
- # e.g. supported_protocols = [:SSLv2, :TLSv1]
94
- # e.g. cipher_bits = [0, 256, 1024]
111
+ if (options[:json])
112
+ a={:evaluation => Ciphersurfer::Score.evaluate(score), :score => score, :protocol_score=>proto_score, :key_exchange_score=>key_score, :cipher_score=>cipher_score}
113
+ puts a.to_json
114
+
115
+ exit 0
116
+ end
95
117
 
96
- # if options[:list_ciphers]
97
- # ok.each do |o|
98
- # puts "[+] Accepted\\t #{o[:bits]} bits\\t#{o[:name]}"
99
- # end
100
- # end
118
+ printf "%20s : %s (%s)\n", "Overall evaluation", Ciphersurfer::Score.evaluate(score), score.to_s
119
+ printf "%20s : ", "Protocol support"
120
+ proto_score.to_i.times{print 'o'.color(score_to_color(proto_score))}
121
+ puts ' ('+proto_score.to_s+')'
122
+ printf "%20s : ", "Key exchange"
123
+ key_score.to_i.times{print 'o'.color(score_to_color(key_score))}
124
+ puts ' ('+key_score.to_s+')'
125
+ printf "%20s : ", "Cipher strength"
126
+ cipher_score.to_i.times{print 'o'.color(score_to_color(cipher_score))}
127
+ puts ' ('+cipher_score.to_s+')'
101
128
 
@@ -9,35 +9,58 @@ module Ciphersurfer
9
9
  attr_reader :ok_ciphers, :ok_bits
10
10
  attr_reader :peer_cert
11
11
 
12
+
13
+
12
14
  def initialize(options={})
13
15
  @host=options[:host]
14
16
  @port=options[:port] ||= 443
15
17
  @proto=options[:proto]
16
18
  @ok_ciphers=[]
17
19
  @ok_bits=[]
20
+ @alive=false
18
21
  end
19
22
 
20
23
  def self.cert(host, port)
21
- client=HTTPClient.new
22
- response=client.get("https://#{host}:#{port}")
23
- peer_cert = response.peer_cert
24
+ if (! @alive)
25
+ self.alive?(host.port)
26
+ end
27
+
28
+ @peer_cert
29
+
30
+ # client=HTTPClient.new
31
+ # response=client.get("https://#{host}:#{port}")
32
+ # peer_cert = response.peer_cert
24
33
  end
25
34
 
26
35
  def self.alive?(host, port)
27
- request = Net::HTTP.new(host, port)
28
- request.use_ssl = true
29
- request.verify_mode = OpenSSL::SSL::VERIFY_NONE
36
+ client=HTTPClient.new
30
37
  begin
31
- response = request.get("/")
38
+ @alive=true
39
+ response=client.get("https://#{host}:#{port}")
40
+ @peer_cert = response.peer_cert
32
41
  return true
33
- rescue Errno::ECONNREFUSED => e
34
- return false
35
- rescue OpenSSL::SSL::SSLError => e
36
- return false
37
- rescue
42
+ rescue => e
43
+ puts "alive?(): #{e.message}".color(:red)
38
44
  return false
39
45
  end
46
+
40
47
  end
48
+
49
+ # def self.alive?(host, port)
50
+ # request = Net::HTTP.new(host, port)
51
+ # request.use_ssl = true
52
+ # request.verify_mode = OpenSSL::SSL::VERIFY_NONE
53
+ # begin
54
+ # response = request.get("/")
55
+ # return true
56
+ # rescue Errno::ECONNREFUSED => e
57
+ # return false
58
+ # rescue OpenSSL::SSL::SSLError => e
59
+ # return false
60
+ # rescue
61
+ # return false
62
+ # end
63
+ # end
41
64
 
42
65
  def go
43
66
  context=OpenSSL::SSL::SSLContext.new(@proto)
@@ -46,14 +69,12 @@ module Ciphersurfer
46
69
 
47
70
  request = Net::HTTP.new(@host, @port)
48
71
  request.use_ssl = true
49
-
50
- request.ca_file='/Users/thesp0nge/src/hacking/ciphersurfer/cacert.pem'
51
72
  request.verify_mode = OpenSSL::SSL::VERIFY_NONE
52
73
  request.ciphers= cipher_name
53
74
  begin
54
75
  response = request.get("/")
55
76
  @ok_bits << bits
56
- @ok_ciphers << {:bits=>bits, :name=>cipher_name}
77
+ @ok_ciphers << cipher_name
57
78
  rescue OpenSSL::SSL::SSLError => e
58
79
  # Quietly discard SSLErrors, really I don't care if the cipher has
59
80
  # not been accepted
@@ -1,7 +1,4 @@
1
1
  module Ciphersurfer
2
- PROTOCOL_SUPPORT_RATIO = 0.3
3
- KEY_EXCHANGE_RATIO = 0.3
4
- CIPHER_STRENGTH = 0.4
5
2
 
6
3
  class Score
7
4
 
@@ -92,7 +89,6 @@ module Ciphersurfer
92
89
 
93
90
 
94
91
  # FIXME: How can I test Weak key (Debian OpenSSL flaw)?
95
- # FIXME: Evaluate if "Exportable key exchange limited to 512 bits is fully covered in k_len<1024
96
92
  def self.evaluate_key(key_length)
97
93
  case (key_length)
98
94
  when 0
@@ -1,89 +1,10 @@
1
1
  module Ciphersurfer
2
- class Version
3
-
4
- # Returns a hash representing the version of ciphersurfer.
5
- # The `:major`, `:minor`, and `:patch` keys have their respective numbers as Fixnums.
6
- # The `:name` key has the name of the version.
7
- # The `:string` key contains a human-readable string representation of the version.
8
- # The `:number` key is the major, minor, and patch keys separated by periods.
9
- # If ciphersurfer is checked out from Git, the `:rev` key will have the revision hash.
10
- #
11
- # For example:
12
- #
13
- # {
14
- # :string => "0.1.4.160676a",
15
- # :rev => "160676ab8924ef36639c7e82aa88a51a24d16949",
16
- # :number => "0.1.4",
17
- # :major => 0, :minor => 1, :patch => 4
18
- # }
19
- #
20
- # If a prerelease version of ciphersurfer is being used,
21
- # the `:string` and `:number` fields will reflect the full version
22
- # (e.g. `"1.0.beta.1"`), and the `:patch` field will be `-1`.
23
- #
24
- # A `:prerelease` key will contain the name of the prerelease (e.g. `"beta"`),
25
- # and a `:prerelease_number` key will contain the rerelease number.
26
- #
27
- # For example:
28
- #
29
- # {
30
- # :string => "1.0.beta.1",
31
- # :number => "1.0.beta.1",
32
- # :major => 1, :minor => 0, :patch => -1,
33
- # :prerelease => "beta",
34
- # :prerelease_number => 1
35
- # }
36
- #
37
- # @return [{Symbol => String/Fixnum}] The version hash
38
- def self.version
39
- return @@version if defined?(@@version)
40
- numbers = File.read('VERSION').strip.split('.').map {|n| n =~ /^[0-9]+$/ ? n.to_i : n}
41
- @@version = {
42
- :major => numbers[0],
43
- :minor => numbers[1],
44
- :patch => numbers[2]
45
- }
46
- if numbers[3].is_a?(String)
47
- @@version[:patch] = -1
48
- @@version[:prerelease] = numbers[3]
49
- @@version[:prerelease_number] = numbers[4]
50
- end
51
- @@version[:number] = numbers.join('.')
52
- @@version[:string] = @@version[:number].dup
53
-
54
- rev = revision_number
55
- @@version[:rev] = rev
56
- unless rev[0] == ?(
57
- @@version[:string] << "." << rev[0...7]
58
- end
59
-
60
- @@version
61
- end
62
-
63
- def self.revision_number
64
- if File.exists?('REVISION')
65
- rev = File.read('REVISION').strip
66
- return rev unless rev =~ /^([a-f0-9]+|\(.*\))$/ || rev == '(unknown)'
67
- end
68
-
69
- return unless File.exists?('.git/HEAD')
70
- rev = File.read('.git/HEAD').strip
71
- return rev unless rev =~ /^ref: (.*)$/
72
-
73
- ref_name = $1
74
- ref_file = "./.git/#{ref_name}"
75
- info_file = "./.git/info/refs"
76
- return File.read(ref_file).strip if File.exists?(ref_file)
77
- return unless File.exists?(info_file)
78
- File.open(info_file) do |f|
79
- f.each do |l|
80
- sha, ref = l.strip.split("\t", 2)
81
- next unless ref == ref_name
82
- return sha
83
- end
84
- end
85
- return nil
86
- end
87
-
2
+ module Version
3
+ MAJOR = 1
4
+ MINOR = 0
5
+ PATCH = 0
6
+ #BUILD = ''
7
+ #STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
8
+ STRING = [MAJOR, MINOR, PATCH].compact.join('.')
88
9
  end
89
10
  end
data/spec/scoring_spec.rb CHANGED
@@ -40,22 +40,22 @@ describe 'Ciphersurfer' do
40
40
  end
41
41
 
42
42
  it "should give a 0.5 if both SSLv2 and SSLv3 are supported but no TLS" do
43
- Ciphersurfer::Score.evaluate_protocols([:SSLv2, :SSLv3]).should == 0.5
43
+ Ciphersurfer::Score.evaluate_protocols([:SSLv2, :SSLv3]).should == 50
44
44
  end
45
45
  it "should give a 0.2 if only SSLv2 protocol is supported" do
46
- Ciphersurfer::Score.evaluate_protocols([:SSLv2]).should == 0.2
46
+ Ciphersurfer::Score.evaluate_protocols([:SSLv2]).should == 20
47
47
  end
48
48
 
49
49
  it "should give a 0.55 if SSLv2 and TLSv1 are supported but no SSLv3" do
50
- Ciphersurfer::Score.evaluate_protocols([:SSLv2, :TLSv1]).should == 0.55
50
+ Ciphersurfer::Score.evaluate_protocols([:SSLv2, :TLSv1]).should == 55
51
51
  end
52
52
 
53
53
  it "should give a 0.55 if SSLv2, SSLv3 and TLSv1 are supported" do
54
- Ciphersurfer::Score.evaluate_protocols([:SSLv2, :SSLv3, :TLSv1]).should == 0.55
54
+ Ciphersurfer::Score.evaluate_protocols([:SSLv2, :SSLv3, :TLSv1]).should == 55
55
55
  end
56
56
 
57
57
  it "should give a 1 if only TLSv1.2 is supported" do
58
- Ciphersurfer::Score.evaluate_protocols([:TLSv12]).should == 1.0
58
+ Ciphersurfer::Score.evaluate_protocols([:TLSv12]).should == 100
59
59
  end
60
60
 
61
61
  it "should give a 0 if cipher has 0 length" do
@@ -63,27 +63,27 @@ describe 'Ciphersurfer' do
63
63
  end
64
64
 
65
65
  it "should give a 0.2 if ciphers supported have length < 128" do
66
- Ciphersurfer::Score.evaluate_ciphers([40, 56, 64]).should == 0.2
66
+ Ciphersurfer::Score.evaluate_ciphers([40, 56, 64]).should == 20
67
67
  end
68
68
 
69
69
  it "should give a 0.8 if ciphers supported have length < 256" do
70
- Ciphersurfer::Score.evaluate_ciphers([128, 168, 255]).should == 0.8
70
+ Ciphersurfer::Score.evaluate_ciphers([128, 168, 255]).should == 80
71
71
  end
72
72
 
73
73
  it "should give a 1.0 if ciphers supported have length >= 256" do
74
- Ciphersurfer::Score.evaluate_ciphers([256, 512, 2048]).should == 1.0
74
+ Ciphersurfer::Score.evaluate_ciphers([256, 512, 2048]).should == 100
75
75
  end
76
76
 
77
77
  it "should give 0.1 if no encryption or ciphers lenght < 128" do
78
- Ciphersurfer::Score.evaluate_ciphers([0, 40, 56, 64]).should == 0.1
78
+ Ciphersurfer::Score.evaluate_ciphers([0, 40, 56, 64]).should == 10
79
79
  end
80
80
 
81
81
  it "should give a 0.5 if ciphers supported have length < 256 and < 128" do
82
- Ciphersurfer::Score.evaluate_ciphers([40, 56, 128, 168, 255]).should == 0.5
82
+ Ciphersurfer::Score.evaluate_ciphers([40, 56, 128, 168, 255]).should == 50
83
83
  end
84
84
 
85
85
  it "should give a 0.6 if ciphers supported have length >= 256 and < 128" do
86
- Ciphersurfer::Score.evaluate_ciphers([40, 56, 1024, 2048]).should == 0.6
86
+ Ciphersurfer::Score.evaluate_ciphers([40, 56, 1024, 2048]).should == 60
87
87
  end
88
88
 
89
89
  it "should give a 0 if no key provided" do
@@ -91,41 +91,41 @@ describe 'Ciphersurfer' do
91
91
  end
92
92
 
93
93
  it "should give a 0.2 if key < 512" do
94
- Ciphersurfer::Score.evaluate_key(128).should == 0.2
95
- Ciphersurfer::Score.evaluate_key(256).should == 0.2
96
- Ciphersurfer::Score.evaluate_key(511).should == 0.2
97
- Ciphersurfer::Score.evaluate_key(512).should_not == 0.2
94
+ Ciphersurfer::Score.evaluate_key(128).should == 20
95
+ Ciphersurfer::Score.evaluate_key(256).should == 20
96
+ Ciphersurfer::Score.evaluate_key(511).should == 20
97
+ Ciphersurfer::Score.evaluate_key(512).should_not == 20
98
98
  end
99
99
 
100
100
  it "should give a 0.4 if 512 <= key < 1024" do
101
- Ciphersurfer::Score.evaluate_key(512).should == 0.4
102
- Ciphersurfer::Score.evaluate_key(1000).should == 0.4
103
- Ciphersurfer::Score.evaluate_key(1024).should_not == 0.4
101
+ Ciphersurfer::Score.evaluate_key(512).should == 40
102
+ Ciphersurfer::Score.evaluate_key(1000).should == 40
103
+ Ciphersurfer::Score.evaluate_key(1024).should_not == 40
104
104
  end
105
105
 
106
106
  it "should give a 0.8 if 1024 <= key < 2048" do
107
- Ciphersurfer::Score.evaluate_key(1024).should == 0.8
108
- Ciphersurfer::Score.evaluate_key(2043).should == 0.8
109
- Ciphersurfer::Score.evaluate_key(2048).should_not == 0.8
107
+ Ciphersurfer::Score.evaluate_key(1024).should == 80
108
+ Ciphersurfer::Score.evaluate_key(2043).should == 80
109
+ Ciphersurfer::Score.evaluate_key(2048).should_not == 80
110
110
  end
111
111
 
112
112
  it "should give a 0.9 if 2048 <= key < 4096" do
113
- Ciphersurfer::Score.evaluate_key(2048).should == 0.9
114
- Ciphersurfer::Score.evaluate_key(4095).should == 0.9
115
- Ciphersurfer::Score.evaluate_key(4096).should_not == 0.9
113
+ Ciphersurfer::Score.evaluate_key(2048).should == 90
114
+ Ciphersurfer::Score.evaluate_key(4095).should == 90
115
+ Ciphersurfer::Score.evaluate_key(4096).should_not == 90
116
116
  end
117
117
 
118
118
  it "should give a 1.0 if key >= 4096" do
119
- Ciphersurfer::Score.evaluate_key(4096).should == 1.0
119
+ Ciphersurfer::Score.evaluate_key(4096).should == 100
120
120
  end
121
121
 
122
122
 
123
123
  it "should evalute the overall score" do
124
- Ciphersurfer::Score.score([1.0, 1.0, 1.0]).should == 1.0
125
- Ciphersurfer::Score.score([0, 1.0, 1.0]).should == 0.7
126
- Ciphersurfer::Score.score([1.0, 0, 1.0]).should == 0.7
127
- Ciphersurfer::Score.score([1.0, 1.0, 0]).should == 0.6
128
- Ciphersurfer::Score.score([0, 0, 1.0]).should == 0.4
124
+ Ciphersurfer::Score.score(100, 100, 100).should == 100
125
+ Ciphersurfer::Score.score(0, 100, 100).should == 70
126
+ Ciphersurfer::Score.score(100, 0, 100).should == 70
127
+ Ciphersurfer::Score.score(100, 100, 0).should == 60
128
+ Ciphersurfer::Score.score(0, 0, 100).should == 40
129
129
  end
130
130
  end
131
131
  end
metadata CHANGED
@@ -1,19 +1,19 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ciphersurfer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.rc1
5
- prerelease: 6
4
+ version: 1.0.0
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Paolo Perego
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-30 00:00:00.000000000Z
12
+ date: 2012-01-31 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rainbow
16
- requirement: &70292333333420 !ruby/object:Gem::Requirement
16
+ requirement: &70151800022700 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,32 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70292333333420
25
- - !ruby/object:Gem::Dependency
26
- name: progressbar
27
- requirement: &70292333332820 !ruby/object:Gem::Requirement
28
- none: false
29
- requirements:
30
- - - ! '>='
31
- - !ruby/object:Gem::Version
32
- version: '0'
33
- type: :runtime
34
- prerelease: false
35
- version_requirements: *70292333332820
36
- - !ruby/object:Gem::Dependency
37
- name: awesome_print
38
- requirement: &70292333332280 !ruby/object:Gem::Requirement
39
- none: false
40
- requirements:
41
- - - ! '>='
42
- - !ruby/object:Gem::Version
43
- version: '0'
44
- type: :runtime
45
- prerelease: false
46
- version_requirements: *70292333332280
24
+ version_requirements: *70151800022700
47
25
  - !ruby/object:Gem::Dependency
48
26
  name: json
49
- requirement: &70292333331760 !ruby/object:Gem::Requirement
27
+ requirement: &70151800022200 !ruby/object:Gem::Requirement
50
28
  none: false
51
29
  requirements:
52
30
  - - ! '>='
@@ -54,10 +32,10 @@ dependencies:
54
32
  version: '0'
55
33
  type: :runtime
56
34
  prerelease: false
57
- version_requirements: *70292333331760
35
+ version_requirements: *70151800022200
58
36
  - !ruby/object:Gem::Dependency
59
37
  name: httpclient
60
- requirement: &70292333331180 !ruby/object:Gem::Requirement
38
+ requirement: &70151800021680 !ruby/object:Gem::Requirement
61
39
  none: false
62
40
  requirements:
63
41
  - - ! '>='
@@ -65,10 +43,10 @@ dependencies:
65
43
  version: '0'
66
44
  type: :runtime
67
45
  prerelease: false
68
- version_requirements: *70292333331180
46
+ version_requirements: *70151800021680
69
47
  - !ruby/object:Gem::Dependency
70
48
  name: rspec
71
- requirement: &70292333330580 !ruby/object:Gem::Requirement
49
+ requirement: &70151800021200 !ruby/object:Gem::Requirement
72
50
  none: false
73
51
  requirements:
74
52
  - - ~>
@@ -76,10 +54,10 @@ dependencies:
76
54
  version: 2.3.0
77
55
  type: :development
78
56
  prerelease: false
79
- version_requirements: *70292333330580
57
+ version_requirements: *70151800021200
80
58
  - !ruby/object:Gem::Dependency
81
59
  name: bundler
82
- requirement: &70292333329980 !ruby/object:Gem::Requirement
60
+ requirement: &70151800020700 !ruby/object:Gem::Requirement
83
61
  none: false
84
62
  requirements:
85
63
  - - ~>
@@ -87,10 +65,10 @@ dependencies:
87
65
  version: 1.0.0
88
66
  type: :development
89
67
  prerelease: false
90
- version_requirements: *70292333329980
68
+ version_requirements: *70151800020700
91
69
  - !ruby/object:Gem::Dependency
92
70
  name: jeweler
93
- requirement: &70292333329400 !ruby/object:Gem::Requirement
71
+ requirement: &70151800020200 !ruby/object:Gem::Requirement
94
72
  none: false
95
73
  requirements:
96
74
  - - ~>
@@ -98,10 +76,10 @@ dependencies:
98
76
  version: 1.6.4
99
77
  type: :development
100
78
  prerelease: false
101
- version_requirements: *70292333329400
79
+ version_requirements: *70151800020200
102
80
  - !ruby/object:Gem::Dependency
103
81
  name: rcov
104
- requirement: &70292333328800 !ruby/object:Gem::Requirement
82
+ requirement: &70151800019680 !ruby/object:Gem::Requirement
105
83
  none: false
106
84
  requirements:
107
85
  - - ! '>='
@@ -109,22 +87,21 @@ dependencies:
109
87
  version: '0'
110
88
  type: :development
111
89
  prerelease: false
112
- version_requirements: *70292333328800
113
- description: ciphersurfer is a security tool that list enabled ciphers for a secure
114
- HTTP connection
90
+ version_requirements: *70151800019680
91
+ description: ciphersurfer is a security tool that evaluates web server SSL configuration
115
92
  email: thesp0nge@gmail.com
116
93
  executables:
117
94
  - ciphersurfer
118
95
  extensions: []
119
96
  extra_rdoc_files:
120
- - LICENSE
97
+ - LICENSE.txt
121
98
  - README.md
122
99
  files:
123
100
  - .document
124
101
  - .rspec
125
102
  - Gemfile
126
103
  - Gemfile.lock
127
- - LICENSE
104
+ - LICENSE.txt
128
105
  - README.md
129
106
  - Rakefile
130
107
  - VERSION
@@ -151,17 +128,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
151
128
  version: '0'
152
129
  segments:
153
130
  - 0
154
- hash: -2946885741293011983
131
+ hash: -144423805926763558
155
132
  required_rubygems_version: !ruby/object:Gem::Requirement
156
133
  none: false
157
134
  requirements:
158
- - - ! '>'
135
+ - - ! '>='
159
136
  - !ruby/object:Gem::Version
160
- version: 1.3.1
137
+ version: '0'
161
138
  requirements: []
162
139
  rubyforge_project:
163
140
  rubygems_version: 1.8.10
164
141
  signing_key:
165
142
  specification_version: 3
166
- summary: list all enable ciphers for a given website
143
+ summary: evaluates web server SSL configuration
167
144
  test_files: []