parent
893d96d805
commit
8e330d06d6
@ -1,149 +1,20 @@ |
||||
require 'awesome_print' |
||||
|
||||
module CryptCheck |
||||
describe Grade do |
||||
describe '#grade' do |
||||
def obj(trust: true, valid: true, **states) |
||||
Class.new do |
||||
def initialize(trust, valid, states) |
||||
@trust, @valid, @states = trust, valid, states |
||||
end |
||||
|
||||
include Grade |
||||
|
||||
def trusted? |
||||
@trust |
||||
end |
||||
|
||||
def valid? |
||||
@valid |
||||
end |
||||
|
||||
def states |
||||
State.empty.merge @states |
||||
end |
||||
end.new trust, valid, states |
||||
end |
||||
|
||||
it 'must return :V if not valid' do |
||||
obj = obj valid: false, critical: { foo: false, bar: nil }, |
||||
error: { foo: false, bar: nil }, |
||||
warning: { foo: false, bar: nil }, |
||||
good: { foo: nil, bar: true }, |
||||
great: { foo: nil, bar: true }, |
||||
best: { foo: nil, bar: true } |
||||
expect(obj.grade).to eq :V |
||||
end |
||||
|
||||
it 'must return :T if not trusted' do |
||||
obj = obj trust: false, critical: { foo: false, bar: nil }, |
||||
error: { foo: false, bar: nil }, |
||||
warning: { foo: false, bar: nil }, |
||||
good: { foo: nil, bar: true }, |
||||
great: { foo: nil, bar: true }, |
||||
best: { foo: nil, bar: true } |
||||
expect(obj.grade).to eq :T |
||||
end |
||||
|
||||
it 'must return :G if critical' do |
||||
obj = obj critical: { foo: false, bar: nil, baz: true }, |
||||
error: { foo: false, bar: nil }, |
||||
warning: { foo: false, bar: nil }, |
||||
good: { foo: nil, bar: true }, |
||||
great: { foo: nil, bar: true }, |
||||
best: { foo: nil, bar: true } |
||||
expect(obj.grade).to eq :G |
||||
end |
||||
|
||||
it 'must return :F if error' do |
||||
obj = obj critical: { foo: false, bar: nil }, |
||||
error: { foo: false, bar: nil, baz: true }, |
||||
warning: { foo: false, bar: nil }, |
||||
good: { foo: nil, bar: true }, |
||||
great: { foo: nil, bar: true }, |
||||
best: { foo: nil, bar: true } |
||||
expect(obj.grade).to eq :F |
||||
end |
||||
|
||||
it 'must return :E if warning' do |
||||
obj = obj critical: { foo: false, bar: nil }, |
||||
error: { foo: false, bar: nil }, |
||||
warning: { foo: false, bar: nil, baz: true }, |
||||
good: { foo: nil, bar: true }, |
||||
great: { foo: nil, bar: true }, |
||||
best: { foo: nil, bar: true } |
||||
expect(obj.grade).to eq :E |
||||
end |
||||
|
||||
it 'must return :D if nor good nor bad' do |
||||
obj = obj critical: { foo: false, bar: nil }, |
||||
error: { foo: false, bar: nil }, |
||||
warning: { foo: false, bar: nil }, |
||||
good: { foo: false, bar: nil }, |
||||
great: { foo: nil, bar: true }, |
||||
best: { foo: nil, bar: true } |
||||
expect(obj.grade).to eq :D |
||||
end |
||||
|
||||
it 'must return :C if some good' do |
||||
obj = obj critical: { foo: false, bar: nil }, |
||||
error: { foo: false, bar: nil }, |
||||
warning: { foo: false, bar: nil }, |
||||
good: { foo: false, bar: nil, baz: true }, |
||||
great: { foo: nil, bar: true }, |
||||
best: { foo: nil, bar: true } |
||||
expect(obj.grade).to eq :C |
||||
end |
||||
|
||||
it 'must return :C+ if all good' do |
||||
obj = obj critical: { foo: false, bar: nil }, |
||||
error: { foo: false, bar: nil }, |
||||
warning: { foo: false, bar: nil }, |
||||
good: { foo: nil, bar: true }, |
||||
great: { foo: false, bar: nil }, |
||||
best: { foo: nil, bar: true } |
||||
expect(obj.grade).to eq :'C+' |
||||
end |
||||
|
||||
it 'must return :B if some great' do |
||||
obj = obj critical: { foo: false, bar: nil }, |
||||
error: { foo: false, bar: nil }, |
||||
warning: { foo: false, bar: nil }, |
||||
good: { foo: nil, bar: true }, |
||||
great: { foo: false, bar: nil, baz: true }, |
||||
best: { foo: true, bar: nil } |
||||
expect(obj.grade).to eq :B |
||||
end |
||||
|
||||
it 'must return :B+ if all great' do |
||||
obj = obj critical: { foo: false, bar: nil }, |
||||
error: { foo: false, bar: nil }, |
||||
warning: { foo: false, bar: nil }, |
||||
good: { foo: nil, bar: true }, |
||||
great: { foo: nil, bar: true }, |
||||
best: { foo: false, bar: nil } |
||||
expect(obj.grade).to eq :'B+' |
||||
end |
||||
|
||||
it 'must return :A if some best' do |
||||
obj = obj critical: { foo: false, bar: nil }, |
||||
error: { foo: false, bar: nil }, |
||||
warning: { foo: false, bar: nil }, |
||||
good: { foo: nil, bar: true }, |
||||
great: { foo: nil, bar: true }, |
||||
best: { foo: false, bar: nil, baz: true } |
||||
expect(obj.grade).to eq :A |
||||
end |
||||
|
||||
it 'must return :A+ if all best' do |
||||
obj = obj critical: { foo: false, bar: nil }, |
||||
error: { foo: false, bar: nil }, |
||||
warning: { foo: false, bar: nil }, |
||||
good: { foo: nil, bar: true }, |
||||
great: { foo: nil, bar: true }, |
||||
best: { foo: nil, bar: true } |
||||
expect(obj.grade).to eq :'A+' |
||||
end |
||||
end |
||||
end |
||||
describe Grade do |
||||
describe '#compare' do |
||||
it 'must return correct order' do |
||||
expect(Grade.compare('A', 'B')).to be -1 |
||||
expect(Grade.compare('A', 'A')).to be 0 |
||||
expect(Grade.compare('B', 'A')).to be 1 |
||||
|
||||
expect(Grade.compare('A+', 'A')).to be -1 |
||||
expect(Grade.compare('A+', 'A+')).to be 0 |
||||
expect(Grade.compare('A', 'A+')).to be 1 |
||||
|
||||
expected = %i[A+ A B+ B C+ C D E F G V T X] |
||||
sorted = expected.shuffle |
||||
.sort &Grade.method(:compare) |
||||
expect(sorted).to eq expected |
||||
end |
||||
end |
||||
end |
||||
end |
||||
|
@ -1,94 +1,94 @@ |
||||
module CryptCheck::Tls |
||||
describe Cert do |
||||
around :each do |example| |
||||
FakeTime.freeze(Time.utc 2000, 6, 1) { example.run } |
||||
end |
||||
|
||||
describe '::trusted?' do |
||||
it 'must accept valid certificate' do |
||||
cert, *chain, ca = chain(%w(ecdsa-prime256v1 intermediate ca)) |
||||
trust = Cert.trusted? cert, chain, roots: ca |
||||
expect(trust).to eq :trusted |
||||
end |
||||
|
||||
it 'must reject self signed certificate' do |
||||
cert, ca = chain(%w(self-signed ca)) |
||||
trust = Cert.trusted? cert, [], roots: ca |
||||
expect(trust).to eq 'self signed certificate' |
||||
|
||||
# Case for SSLv2 |
||||
cert, ca = chain(%w(self-signed ca)) |
||||
trust = Cert.trusted? cert, nil, roots: ca |
||||
expect(trust).to eq 'self signed certificate' |
||||
end |
||||
|
||||
it 'must reject unknown CA' do |
||||
cert, *chain = chain(%w(ecdsa-prime256v1 intermediate ca)) |
||||
trust = Cert.trusted? cert, chain, roots: [] |
||||
expect(trust).to eq 'unable to get issuer certificate' |
||||
end |
||||
|
||||
it 'must reject missing intermediate chain' do |
||||
cert, ca = chain(%w(ecdsa-prime256v1 ca)) |
||||
chain = [] |
||||
trust = Cert.trusted? cert, chain, roots: ca |
||||
expect(trust).to eq 'unable to get local issuer certificate' |
||||
end |
||||
|
||||
it 'must reject expired certificate' do |
||||
FakeTime.freeze Time.utc(2002, 1, 1) do |
||||
cert, *chain, ca = chain(%w(ecdsa-prime256v1 intermediate ca)) |
||||
trust = Cert.trusted? cert, chain, roots: ca |
||||
expect(trust).to eq 'certificate has expired' |
||||
end |
||||
end |
||||
|
||||
it 'must reject not yet valid certificate' do |
||||
FakeTime.freeze Time.utc(1999, 1, 1) do |
||||
cert, *chain, ca = chain(%w(ecdsa-prime256v1 intermediate ca)) |
||||
trust = Cert.trusted? cert, chain, roots: ca |
||||
expect(trust).to eq 'certificate is not yet valid' |
||||
end |
||||
end |
||||
end |
||||
|
||||
describe '#md5?' do |
||||
it 'must detect md5 certificate' do |
||||
cert = Cert.new cert(:md5) |
||||
expect(cert.md5?).to be true |
||||
|
||||
cert = Cert.new cert(:sha1) |
||||
expect(cert.md5?).to be false |
||||
|
||||
cert = Cert.new cert(:ecdsa, :prime256v1) |
||||
expect(cert.md5?).to be false |
||||
end |
||||
end |
||||
|
||||
describe '#sha1?' do |
||||
it 'must detect sha1 certificate' do |
||||
cert = Cert.new cert(:md5) |
||||
expect(cert.sha1?).to be false |
||||
|
||||
cert = Cert.new cert(:sha1) |
||||
expect(cert.sha1?).to be true |
||||
|
||||
cert = Cert.new cert(:ecdsa, :prime256v1) |
||||
expect(cert.sha1?).to be false |
||||
end |
||||
end |
||||
|
||||
describe '#sha2?' do |
||||
it 'must detect sha2 certificate' do |
||||
cert = Cert.new cert(:md5) |
||||
expect(cert.sha2?).to be false |
||||
|
||||
cert = Cert.new cert(:sha1) |
||||
expect(cert.sha2?).to be false |
||||
|
||||
cert = Cert.new cert(:ecdsa, :prime256v1) |
||||
expect(cert.sha2?).to be true |
||||
end |
||||
end |
||||
end |
||||
describe Cert do |
||||
around :each do |example| |
||||
Fake.freeze(Time.utc 2000, 6, 1) { example.run } |
||||
end |
||||
|
||||
describe '::trusted?' do |
||||
it 'must accept valid certificate' do |
||||
cert, *chain, ca = chain(%w(ecdsa-prime256v1 intermediate ca)) |
||||
trust = Cert.trusted? cert, chain, roots: ca |
||||
expect(trust).to eq :trusted |
||||
end |
||||
|
||||
it 'must reject self signed certificate' do |
||||
cert, ca = chain(%w(self-signed ca)) |
||||
trust = Cert.trusted? cert, [], roots: ca |
||||
expect(trust).to eq 'self signed certificate' |
||||
|
||||
# Case for SSLv2 |
||||
cert, ca = chain(%w(self-signed ca)) |
||||
trust = Cert.trusted? cert, nil, roots: ca |
||||
expect(trust).to eq 'self signed certificate' |
||||
end |
||||
|
||||
it 'must reject unknown CA' do |
||||
cert, *chain = chain(%w(ecdsa-prime256v1 intermediate ca)) |
||||
trust = Cert.trusted? cert, chain, roots: [] |
||||
expect(trust).to eq 'unable to get issuer certificate' |
||||
end |
||||
|
||||
it 'must reject missing intermediate chain' do |
||||
cert, ca = chain(%w(ecdsa-prime256v1 ca)) |
||||
chain = [] |
||||
trust = Cert.trusted? cert, chain, roots: ca |
||||
expect(trust).to eq 'unable to get local issuer certificate' |
||||
end |
||||
|
||||
it 'must reject expired certificate' do |
||||
Fake.freeze Time.utc(2002, 1, 1) do |
||||
cert, *chain, ca = chain(%w(ecdsa-prime256v1 intermediate ca)) |
||||
trust = Cert.trusted? cert, chain, roots: ca |
||||
expect(trust).to eq 'certificate has expired' |
||||
end |
||||
end |
||||
|
||||
it 'must reject not yet valid certificate' do |
||||
Fake.freeze Time.utc(1999, 1, 1) do |
||||
cert, *chain, ca = chain(%w(ecdsa-prime256v1 intermediate ca)) |
||||
trust = Cert.trusted? cert, chain, roots: ca |
||||
expect(trust).to eq 'certificate is not yet valid' |
||||
end |
||||
end |
||||
end |
||||
|
||||
describe '#md5?' do |
||||
it 'must detect md5 certificate' do |
||||
cert = Cert.new cert(:md5) |
||||
expect(cert.md5?).to be true |
||||
|
||||
cert = Cert.new cert(:sha1) |
||||
expect(cert.md5?).to be false |
||||
|
||||
cert = Cert.new cert(:ecdsa, :prime256v1) |
||||
expect(cert.md5?).to be false |
||||
end |
||||
end |
||||
|
||||
describe '#sha1?' do |
||||
it 'must detect sha1 certificate' do |
||||
cert = Cert.new cert(:md5) |
||||
expect(cert.sha1?).to be false |
||||
|
||||
cert = Cert.new cert(:sha1) |
||||
expect(cert.sha1?).to be true |
||||
|
||||
cert = Cert.new cert(:ecdsa, :prime256v1) |
||||
expect(cert.sha1?).to be false |
||||
end |
||||
end |
||||
|
||||
describe '#sha2?' do |
||||
it 'must detect sha2 certificate' do |
||||
cert = Cert.new cert(:md5) |
||||
expect(cert.sha2?).to be false |
||||
|
||||
cert = Cert.new cert(:sha1) |
||||
expect(cert.sha2?).to be false |
||||
|
||||
cert = Cert.new cert(:ecdsa, :prime256v1) |
||||
expect(cert.sha2?).to be true |
||||
end |
||||
end |
||||
end |
||||
end |
||||
|
@ -0,0 +1,149 @@ |
||||
module CryptCheck |
||||
module Tls |
||||
describe Grade do |
||||
describe '#grade' do |
||||
def obj(trust: true, valid: true, **states) |
||||
Class.new do |
||||
def initialize(trust, valid, states) |
||||
@trust, @valid, @states = trust, valid, states |
||||
end |
||||
|
||||
include Grade |
||||
|
||||
def trusted? |
||||
@trust |
||||
end |
||||
|
||||
def valid? |
||||
@valid |
||||
end |
||||
|
||||
def states |
||||
State.empty.merge @states |
||||
end |
||||
end.new trust, valid, states |
||||
end |
||||
|
||||
it 'must return :V if not valid' do |
||||
obj = obj valid: false, critical: { foo: false, bar: nil }, |
||||
error: { foo: false, bar: nil }, |
||||
warning: { foo: false, bar: nil }, |
||||
good: { foo: nil, bar: true }, |
||||
great: { foo: nil, bar: true }, |
||||
best: { foo: nil, bar: true } |
||||
expect(obj.grade).to eq :V |
||||
end |
||||
|
||||
it 'must return :T if not trusted' do |
||||
obj = obj trust: false, critical: { foo: false, bar: nil }, |
||||
error: { foo: false, bar: nil }, |
||||
warning: { foo: false, bar: nil }, |
||||
good: { foo: nil, bar: true }, |
||||
great: { foo: nil, bar: true }, |
||||
best: { foo: nil, bar: true } |
||||
expect(obj.grade).to eq :T |
||||
end |
||||
|
||||
it 'must return :G if critical' do |
||||
obj = obj critical: { foo: false, bar: nil, baz: true }, |
||||
error: { foo: false, bar: nil }, |
||||
warning: { foo: false, bar: nil }, |
||||
good: { foo: nil, bar: true }, |
||||
great: { foo: nil, bar: true }, |
||||
best: { foo: nil, bar: true } |
||||
expect(obj.grade).to eq :G |
||||
end |
||||
|
||||
it 'must return :F if error' do |
||||
obj = obj critical: { foo: false, bar: nil }, |
||||
error: { foo: false, bar: nil, baz: true }, |
||||
warning: { foo: false, bar: nil }, |
||||
good: { foo: nil, bar: true }, |
||||
great: { foo: nil, bar: true }, |
||||
best: { foo: nil, bar: true } |
||||
expect(obj.grade).to eq :F |
||||
end |
||||
|
||||
it 'must return :E if warning' do |
||||
obj = obj critical: { foo: false, bar: nil }, |
||||
error: { foo: false, bar: nil }, |
||||
warning: { foo: false, bar: nil, baz: true }, |
||||
good: { foo: nil, bar: true }, |
||||
great: { foo: nil, bar: true }, |
||||
best: { foo: nil, bar: true } |
||||
expect(obj.grade).to eq :E |
||||
end |
||||
|
||||
it 'must return :D if nor good nor bad' do |
||||
obj = obj critical: { foo: false, bar: nil }, |
||||
error: { foo: false, bar: nil }, |
||||
warning: { foo: false, bar: nil }, |
||||
good: { foo: false, bar: nil }, |
||||
great: { foo: nil, bar: true }, |
||||
best: { foo: nil, bar: true } |
||||
expect(obj.grade).to eq :D |
||||
end |
||||
|
||||
it 'must return :C if some good' do |
||||
obj = obj critical: { foo: false, bar: nil }, |
||||
error: { foo: false, bar: nil }, |
||||
warning: { foo: false, bar: nil }, |
||||
good: { foo: false, bar: nil, baz: true }, |
||||
great: { foo: nil, bar: true }, |
||||
best: { foo: nil, bar: true } |
||||
expect(obj.grade).to eq :C |
||||
end |
||||
|
||||
it 'must return :C+ if all good' do |
||||
obj = obj critical: { foo: false, bar: nil }, |
||||
error: { foo: false, bar: nil }, |
||||
warning: { foo: false, bar: nil }, |
||||
good: { foo: nil, bar: true }, |
||||
great: { foo: false, bar: nil }, |
||||
best: { foo: nil, bar: true } |
||||
expect(obj.grade).to eq :'C+' |
||||
end |
||||
|
||||
it 'must return :B if some great' do |
||||
obj = obj critical: { foo: false, bar: nil }, |
||||
error: { foo: false, bar: nil }, |
||||
warning: { foo: false, bar: nil }, |
||||
good: { foo: nil, bar: true }, |
||||
great: { foo: false, bar: nil, baz: true }, |
||||
best: { foo: true, bar: nil } |
||||
expect(obj.grade).to eq :B |
||||
end |
||||
|
||||
it 'must return :B+ if all great' do |
||||
obj = obj critical: { foo: false, bar: nil }, |
||||
error: { foo: false, bar: nil }, |
||||
warning: { foo: false, bar: nil }, |
||||
good: { foo: nil, bar: true }, |
||||
great: { foo: nil, bar: true }, |
||||
best: { foo: false, bar: nil } |
||||
expect(obj.grade).to eq :'B+' |
||||
end |
||||
|
||||
it 'must return :A if some best' do |
||||
obj = obj critical: { foo: false, bar: nil }, |
||||
error: { foo: false, bar: nil }, |
||||
warning: { foo: false, bar: nil }, |
||||
good: { foo: nil, bar: true }, |
||||
great: { foo: nil, bar: true }, |
||||
best: { foo: false, bar: nil, baz: true } |
||||
expect(obj.grade).to eq :A |
||||
end |
||||
|
||||
it 'must return :A+ if all best' do |
||||
obj = obj critical: { foo: false, bar: nil }, |
||||
error: { foo: false, bar: nil }, |
||||
warning: { foo: false, bar: nil }, |
||||
good: { foo: nil, bar: true }, |
||||
great: { foo: nil, bar: true }, |
||||
best: { foo: nil, bar: true } |
||||
expect(obj.grade).to eq :'A+' |
||||
end |
||||
end |
||||
end |
||||
end |
||||
end |
@ -1,185 +1,190 @@ |
||||
module CryptCheck::Tls |
||||
describe Server do |
||||
around :each do |example| |
||||
FakeTime.freeze (Time.utc 2000, 1, 1) { example.run } |
||||
end |
||||
|
||||
def server(*args, **kargs) |
||||
do_in_serv *args, **kargs do |host, port| |
||||
TcpServer.new 'localhost', host, ::Socket::PF_INET, port |
||||
end |
||||
end |
||||
|
||||
describe '#certs' do |
||||
it 'must detect RSA certificate' do |
||||
certs = server(:rsa).certs.collect &:fingerprint |
||||
expect(certs).to match_array %w(a11802a4407aaeb93ccd0bd8c8a61be17eaba6b378433af5ad45ecbb1d633f71) |
||||
end |
||||
|
||||
it 'must detect ECDSA certificate' do |
||||
certs = server.certs.collect &:fingerprint |
||||
expect(certs).to match_array %w(531ab9545f052818ff0559f648a147b104223834cc8f780516b3aacf1fdc8c06) |
||||
end |
||||
|
||||
it 'must detect RSA and ECDSA certificates' do |
||||
certs = server(:mixed).certs.collect &:fingerprint |
||||
expect(certs).to match_array %w(531ab9545f052818ff0559f648a147b104223834cc8f780516b3aacf1fdc8c06 |
||||
a11802a4407aaeb93ccd0bd8c8a61be17eaba6b378433af5ad45ecbb1d633f71) |
||||
end |
||||
end |
||||
|
||||
describe '#supported_methods' do |
||||
it 'must detect SSLv2' do |
||||
s = server :sslv2 |
||||
methods = s.supported_methods.collect &:to_sym |
||||
expect(methods).to match_array %i(SSLv2) |
||||
end |
||||
|
||||
it 'must detect SSLv3' do |
||||
server = server methods: %i(SSLv3) |
||||
methods = server.supported_methods.collect &:to_sym |
||||
expect(methods).to match_array %i(SSLv3) |
||||
end |
||||
|
||||
it 'must detect TLSv1.0' do |
||||
server = server methods: %i(TLSv1) |
||||
methods = server.supported_methods.collect &:to_sym |
||||
expect(methods).to match_array %i(TLSv1) |
||||
end |
||||
|
||||
it 'must detect TLSv1.1' do |
||||
server = server methods: %i(TLSv1_1) |
||||
methods = server.supported_methods.collect &:to_sym |
||||
expect(methods).to match_array %i(TLSv1_1) |
||||
end |
||||
|
||||
it 'must detect TLSv1.2' do |
||||
server = server methods: %i(TLSv1_2) |
||||
methods = server.supported_methods.collect &:to_sym |
||||
expect(methods).to match_array %i(TLSv1_2) |
||||
end |
||||
|
||||
it 'must detect mixed methods' do |
||||
server = server methods: %i(SSLv3 TLSv1 TLSv1_1 TLSv1_2) |
||||
methods = server.supported_methods.collect &:to_sym |
||||
expect(methods).to match_array %i(SSLv3 TLSv1 TLSv1_1 TLSv1_2) |
||||
end |
||||
end |
||||
|
||||
describe '#supported_ciphers' do |
||||
it 'must detect supported cipher' do |
||||
ciphers = server.supported_ciphers |
||||
.map { |k, v| [k.to_sym, v.keys.collect(&:name)] } |
||||
.to_h[:TLSv1_2] |
||||
expect(ciphers).to match_array %w(ECDHE-ECDSA-AES128-SHA) |
||||
end |
||||
end |
||||
|
||||
describe '#supported_curves' do |
||||
it 'must detect no supported curves' do |
||||
s = server :rsa, ciphers: %w(AES128-SHA) |
||||
curves = s.supported_curves.collect &:name |
||||
expect(curves).to be_empty |
||||
end |
||||
|
||||
it 'must detect supported curves for RSA' do |
||||
s = server :rsa, curves: %i(prime256v1 sect571r1) |
||||
curves = s.supported_curves.collect &:name |
||||
expect(curves).to contain_exactly :prime256v1, :sect571r1 |
||||
end |
||||
|
||||
it 'must detect supported curves from ECDSA' do |
||||
server = server server_preference: false |
||||
curves = server.supported_curves.collect &:name |
||||
expect(curves).to contain_exactly :prime256v1 |
||||
end |
||||
|
||||
it 'must detect supported curves from ECDSA and ECDHE' do |
||||
server = server curves: %i(prime256v1 sect571r1), server_preference: false |
||||
curves = server.supported_curves.collect &:name |
||||
expect(curves).to contain_exactly :prime256v1, :sect571r1 |
||||
end |
||||
|
||||
# No luck here :'( |
||||
it 'can\'t detect supported curves from ECDHE if server preference enforced' do |
||||
server = server curves: %i(prime256v1 sect571r1) |
||||
curves = server.supported_curves.collect &:name |
||||
expect(curves).to contain_exactly :prime256v1 |
||||
|
||||
server = server curves: %i(sect571r1 prime256v1) |
||||
curves = server.supported_curves.collect &:name |
||||
expect(curves).to contain_exactly :prime256v1, :sect571r1 |
||||
end |
||||
end |
||||
|
||||
describe '#curves_preference' do |
||||
it 'must report N/A if no curve on RSA' do |
||||
s = server :rsa, ciphers: %w(AES128-GCM-SHA256) |
||||
curves = s.curves_preference |
||||
expect(curves).to be_nil |
||||
|
||||
s = server :rsa, ciphers: %w(AES128-GCM-SHA256), server_preference: false |
||||
curves = s.curves_preference |
||||
expect(curves).to be_nil |
||||
end |
||||
|
||||
it 'must report N/A if a single curve on RSA' do |
||||
curves = server(:rsa).curves_preference |
||||
expect(curves).to be_nil |
||||
|
||||
curves = server(:rsa, server_preference: false).curves_preference |
||||
expect(curves).to be_nil |
||||
end |
||||
|
||||
it 'must report server preference if server preference enforced on RSA' do |
||||
s = server :rsa, curves: %i(prime256v1 sect571r1) |
||||
curves = s.curves_preference.collect &:name |
||||
expect(curves).to eq %i(prime256v1 sect571r1) |
||||
|
||||
s = server :rsa, curves: %i(sect571r1 prime256v1) |
||||
curves = s.curves_preference.collect &:name |
||||
expect(curves).to eq %i(sect571r1 prime256v1) |
||||
end |
||||
|
||||
it 'must report client preference if server preference not enforced on RSA' do |
||||
s = server :rsa, curves: %i(prime256v1 sect571r1), server_preference: false |
||||
curves = s.curves_preference |
||||
expect(curves).to be :client |
||||
|
||||
s = server :rsa, curves: %i(sect571r1 prime256v1), server_preference: false |
||||
curves = s.curves_preference |
||||
expect(curves).to be :client |
||||
end |
||||
|
||||
it 'must report N/A if a single curve on ECDSA' do |
||||
curves = server.curves_preference |
||||
expect(curves).to be_nil |
||||
|
||||
curves = server(server_preference: false).curves_preference |
||||
expect(curves).to be_nil |
||||
end |
||||
|
||||
# No luck here :'( |
||||
it 'can\'t detect server preference if server preference enforced on ECDSA with preference on ECDSA curve' do |
||||
curves = server(curves: %i(prime256v1 sect571r1)).curves_preference |
||||
expect(curves).to be_nil |
||||
end |
||||
|
||||
it 'must report server preference if server preference enforced on ECDSA with preference not on ECDSA curve' do |
||||
s = server curves: %i(sect571r1 prime256v1) |
||||
curves = s.curves_preference.collect &:name |
||||
expect(curves).to eq %i(sect571r1 prime256v1) |
||||
end |
||||
|
||||
it 'must report client preference if server preference not enforced on ECDSA' do |
||||
s = server curves: %i(prime256v1 sect571r1), server_preference: false |
||||
curves = s.curves_preference |
||||
expect(curves).to be :client |
||||
|
||||
s = server curves: %i(sect571r1 prime256v1), server_preference: false |
||||
curves = s.curves_preference |
||||
expect(curves).to be :client |
||||
end |
||||
end |
||||
end |
||||
describe Server do |
||||
around :each do |example| |
||||
Fake.freeze (Time.utc 2000, 1, 1) { example.run } |
||||
end |
||||
|
||||
def server(*args, **kargs) |
||||
tls_serv *args, **kargs do |h, p| |
||||
Server.new h, Helpers::DEFAULT_IPv6, ::Socket::PF_INET6, p |
||||
end |
||||
end |
||||
|
||||
describe '#certs' do |
||||
it 'must detect RSA certificate' do |
||||
certs = server(:rsa).certs.collect &:fingerprint |
||||
expect(certs).to match_array %w(a11802a4407aaeb93ccd0bd8c8a61be17eaba6b378433af5ad45ecbb1d633f71) |
||||
end |
||||
|
||||
it 'must detect ECDSA certificate' do |
||||
certs = server.certs.collect &:fingerprint |
||||
expect(certs).to match_array %w(531ab9545f052818ff0559f648a147b104223834cc8f780516b3aacf1fdc8c06) |
||||
end |
||||
|
||||
it 'must detect RSA and ECDSA certificates' do |
||||
certs = server(:mixed).certs.collect &:fingerprint |
||||
expect(certs).to match_array %w(531ab9545f052818ff0559f648a147b104223834cc8f780516b3aacf1fdc8c06 |
||||
a11802a4407aaeb93ccd0bd8c8a61be17eaba6b378433af5ad45ecbb1d633f71) |
||||
end |
||||
end |
||||
|
||||
describe '#supported_methods' do |
||||
it 'must detect SSLv2' do |
||||
s = server :sslv2 |
||||
methods = s.supported_methods.collect &:to_sym |
||||
expect(methods).to match_array %i(SSLv2) |
||||
end |
||||
|
||||
it 'must detect SSLv3' do |
||||
server = server methods: %i(SSLv3) |
||||
methods = server.supported_methods.collect &:to_sym |
||||
expect(methods).to match_array %i(SSLv3) |
||||
end |
||||
|
||||
it 'must detect TLSv1.0' do |
||||
server = server methods: %i(TLSv1) |
||||
methods = server.supported_methods.collect &:to_sym |
||||
expect(methods).to match_array %i(TLSv1) |
||||
end |
||||
|
||||
it 'must detect TLSv1.1' do |
||||
server = server methods: %i(TLSv1_1) |
||||
methods = server.supported_methods.collect &:to_sym |
||||
expect(methods).to match_array %i(TLSv1_1) |
||||
end |
||||
|
||||
it 'must detect TLSv1.2' do |
||||
server = server methods: %i(TLSv1_2) |
||||
methods = server.supported_methods.collect &:to_sym |
||||
expect(methods).to match_array %i(TLSv1_2) |
||||
end |
||||
|
||||
it 'must detect mixed methods' do |
||||
server = server methods: %i(SSLv3 TLSv1 TLSv1_1 TLSv1_2) |
||||
methods = server.supported_methods.collect &:to_sym |
||||
expect(methods).to match_array %i(SSLv3 TLSv1 TLSv1_1 TLSv1_2) |
||||
end |
||||
end |
||||
|
||||
describe '#supported_ciphers' do |
||||
it 'must detect supported cipher' do |
||||
ciphers = server.supported_ciphers |
||||
.map { |k, v| [k.to_sym, v.keys.collect(&:name)] } |
||||
.to_h[:TLSv1_2] |
||||
expect(ciphers).to match_array %w(ECDHE-ECDSA-AES128-SHA) |
||||
end |
||||
end |
||||
|
||||
describe '#supported_curves' do |
||||
it 'must detect no supported curves' do |
||||
s = server :rsa, ciphers: %w(AES128-SHA) |
||||
curves = s.supported_curves.collect &:name |
||||
expect(curves).to be_empty |
||||
end |
||||
|
||||
it 'must detect supported curves for RSA' do |
||||
s = server :rsa, curves: %i(prime256v1 sect571r1) |
||||
curves = s.supported_curves.collect &:name |
||||
expect(curves).to contain_exactly :prime256v1, :sect571r1 |
||||
end |
||||
|
||||
it 'must detect supported curves from ECDSA' do |
||||
server = server server_preference: false |
||||
curves = server.supported_curves.collect &:name |
||||
expect(curves).to contain_exactly :prime256v1 |
||||
end |
||||
|
||||
it 'must detect supported curves from ECDSA and ECDHE' do |
||||
server = server curves: %i(prime256v1 sect571r1), server_preference: false |
||||
curves = server.supported_curves.collect &:name |
||||
expect(curves).to contain_exactly :prime256v1, :sect571r1 |
||||
end |
||||
|
||||
# |
||||
it 'can\'t detect supported curves from ECDHE if server preference enforced' do |
||||
server = server curves: %i(prime256v1 sect571r1), server_preference: true |
||||
curves = server.supported_curves.collect &:name |
||||
expect(curves).to contain_exactly :prime256v1 |
||||
|
||||
server = server curves: %i(sect571r1 prime256v1), server_preference: true |
||||
curves = server.supported_curves.collect &:name |
||||
expect(curves).to contain_exactly :prime256v1, :sect571r1 |
||||
end |
||||
end |
||||
|
||||
describe '#curves_preference' do |
||||
it 'must report N/A if no curve on RSA' do |
||||
s = server :rsa, ciphers: %w(AES128-GCM-SHA256), server_preference: true |
||||
curves = s.curves_preference |
||||
expect(curves).to be_nil |
||||
|
||||
s = server :rsa, ciphers: %w(AES128-GCM-SHA256), server_preference: false |
||||
curves = s.curves_preference |
||||
expect(curves).to be_nil |
||||
end |
||||
|
||||
it 'must report N/A if a single curve on RSA' do |
||||
s = server :rsa, server_preference: true |
||||
curves = s.curves_preference |
||||
expect(curves).to be_nil |
||||
|
||||
s = server :rsa, server_preference: false |
||||
curves = s.curves_preference |
||||
expect(curves).to be_nil |
||||
end |
||||
|
||||
it 'must report server preference if server preference enforced on RSA' do |
||||
s = server :rsa, curves: %i(prime256v1 sect571r1), server_preference: true |
||||
curves = s.curves_preference.collect &:name |
||||
expect(curves).to eq %i(prime256v1 sect571r1) |
||||
|
||||
s = server :rsa, curves: %i(sect571r1 prime256v1), server_preference: true |
||||
curves = s.curves_preference.collect &:name |
||||
expect(curves).to eq %i(sect571r1 prime256v1) |
||||
end |
||||
|
||||
it 'must report client preference if server preference not enforced on RSA' do |
||||
s = server :rsa, curves: %i(prime256v1 sect571r1), server_preference: false |
||||
curves = s.curves_preference |
||||
expect(curves).to be :client |
||||
|
||||
s = server :rsa, curves: %i(sect571r1 prime256v1), server_preference: false |
||||
curves = s.curves_preference |
||||
expect(curves).to be :client |
||||
end |
||||
|
||||
it 'must report N/A if a single curve on ECDSA' do |
||||
s = server curves: %i(prime256v1), server_preference: true |
||||
curves = s.curves_preference |
||||
expect(curves).to be_nil |
||||
|
||||
s = server curves: %i(prime256v1), server_preference: false |
||||
curves = s.curves_preference |
||||
expect(curves).to be_nil |
||||
end |
||||
|
||||
# No luck here :'( |
||||
it 'can\'t detect server preference if server preference enforced on ECDSA with preference on ECDSA curve' do |
||||
s = server curves: %i(prime256v1 sect571r1), server_preference: true |
||||
curves = s.curves_preference |
||||
expect(curves).to be_nil |
||||
end |
||||
|
||||
it 'must report server preference if server preference enforced on ECDSA with preference not on ECDSA curve' do |
||||
s = server curves: %i(sect571r1 prime256v1), server_preference: true |
||||
curves = s.curves_preference.collect &:name |
||||
expect(curves).to eq %i(sect571r1 prime256v1) |
||||
end |
||||
|
||||
it 'must report client preference if server preference not enforced on ECDSA' do |
||||
s = server curves: %i(prime256v1 sect571r1), server_preference: false |
||||
curves = s.curves_preference |
||||
expect(curves).to be :client |
||||
|
||||
s = server curves: %i(sect571r1 prime256v1), server_preference: false |
||||
curves = s.curves_preference |
||||
expect(curves).to be :client |
||||
end |
||||
end |
||||
end |
||||
end |
||||
|