ruby-sslyze 0.2.1 → 1.0.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.
Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +6 -4
  3. data/.travis.yml +15 -7
  4. data/ChangeLog.md +29 -12
  5. data/Gemfile +3 -2
  6. data/LICENSE.txt +1 -1
  7. data/README.md +5 -5
  8. data/Rakefile +1 -1
  9. data/lib/sslyze/cipher_suites.rb +176 -0
  10. data/lib/sslyze/program.rb +8 -8
  11. data/lib/sslyze/task.rb +40 -33
  12. data/lib/sslyze/version.rb +1 -1
  13. data/lib/sslyze/{certificate/domain_name.rb → x509/domain.rb} +5 -3
  14. data/lib/sslyze/x509/extension.rb +15 -0
  15. data/lib/sslyze/x509/extension_set.rb +140 -0
  16. data/lib/sslyze/x509/extensions.rb +6 -0
  17. data/lib/sslyze/x509/extensions/basic_constraints.rb +41 -0
  18. data/lib/sslyze/x509/extensions/certificate_policies.rb +108 -0
  19. data/lib/sslyze/x509/extensions/crl_distribution_points.rb +47 -0
  20. data/lib/sslyze/x509/extensions/extended_key_usage.rb +58 -0
  21. data/lib/sslyze/x509/extensions/key_usage.rb +66 -0
  22. data/lib/sslyze/x509/extensions/subject_alt_name.rb +144 -0
  23. data/lib/sslyze/x509/name.rb +194 -0
  24. data/lib/sslyze/x509/public_key.rb +53 -0
  25. data/lib/sslyze/xml.rb +26 -37
  26. data/lib/sslyze/xml/attributes.rb +5 -0
  27. data/lib/sslyze/xml/attributes/error.rb +30 -0
  28. data/lib/sslyze/xml/attributes/exception.rb +30 -0
  29. data/lib/sslyze/xml/attributes/is_supported.rb +29 -0
  30. data/lib/sslyze/xml/attributes/is_vulnerable.rb +29 -0
  31. data/lib/sslyze/xml/attributes/title.rb +31 -0
  32. data/lib/sslyze/xml/certinfo.rb +67 -0
  33. data/lib/sslyze/xml/certinfo/certificate.rb +202 -0
  34. data/lib/sslyze/xml/certinfo/certificate_validation.rb +69 -0
  35. data/lib/sslyze/xml/certinfo/certificate_validation/hostname_validation.rb +54 -0
  36. data/lib/sslyze/xml/certinfo/certificate_validation/path_validation.rb +84 -0
  37. data/lib/sslyze/xml/certinfo/certificate_validation/verified_certificate_chain.rb +41 -0
  38. data/lib/sslyze/xml/certinfo/has_certificates.rb +102 -0
  39. data/lib/sslyze/xml/certinfo/ocsp_stapling.rb +45 -0
  40. data/lib/sslyze/xml/certinfo/ocsp_stapling/ocsp_response.rb +87 -0
  41. data/lib/sslyze/xml/certinfo/received_certificate_chain.rb +48 -0
  42. data/lib/sslyze/xml/compression.rb +33 -0
  43. data/lib/sslyze/xml/compression/compression_method.rb +38 -0
  44. data/lib/sslyze/xml/fallback.rb +34 -0
  45. data/lib/sslyze/xml/fallback/tls_fallback_scsv.rb +27 -0
  46. data/lib/sslyze/xml/heartbleed.rb +38 -0
  47. data/lib/sslyze/xml/heartbleed/openssl_heartbleed.rb +29 -0
  48. data/lib/sslyze/xml/http_headers.rb +42 -0
  49. data/lib/sslyze/xml/http_headers/http_public_key_pinning.rb +121 -0
  50. data/lib/sslyze/xml/http_headers/http_strict_transport_security.rb +59 -0
  51. data/lib/sslyze/xml/invalid_target.rb +33 -0
  52. data/lib/sslyze/xml/openssl_ccs.rb +34 -0
  53. data/lib/sslyze/xml/openssl_ccs/openssl_ccs_injection.rb +26 -0
  54. data/lib/sslyze/xml/plugin.rb +27 -0
  55. data/lib/sslyze/xml/protocol.rb +143 -0
  56. data/lib/sslyze/xml/protocol/cipher_suite.rb +93 -0
  57. data/lib/sslyze/xml/protocol/cipher_suite/key_exchange.rb +127 -0
  58. data/lib/sslyze/xml/reneg.rb +28 -0
  59. data/lib/sslyze/xml/reneg/session_renegotiation.rb +51 -0
  60. data/lib/sslyze/xml/resum.rb +42 -0
  61. data/lib/sslyze/xml/resum/session_resumption_with_session_ids.rb +94 -0
  62. data/lib/sslyze/xml/resum/session_resumption_with_tls_tickets.rb +69 -0
  63. data/lib/sslyze/xml/resum_rate.rb +30 -0
  64. data/lib/sslyze/xml/target.rb +371 -0
  65. data/lib/sslyze/xml/types.rb +19 -0
  66. data/ruby-sslyze.gemspec +3 -3
  67. data/spec/spec_helper.rb +2 -4
  68. data/spec/sslyze.xml +2356 -2580
  69. data/spec/x509/domain_spec.rb +125 -0
  70. data/spec/x509/extension_set_spec.rb +208 -0
  71. data/spec/x509/extension_spec.rb +58 -0
  72. data/spec/x509/extensions/basic_constraints_spec.rb +41 -0
  73. data/spec/x509/extensions/certificate_policies_spec.rb +38 -0
  74. data/spec/x509/extensions/crl_distribution_points_spec.rb +38 -0
  75. data/spec/x509/extensions/extended_key_usage_spec.rb +58 -0
  76. data/spec/x509/extensions/key_usage_spec.rb +84 -0
  77. data/spec/x509/extensions/subject_alt_name_spec.rb +146 -0
  78. data/spec/x509/name_spec.rb +85 -0
  79. data/spec/x509/public_key_spec.rb +113 -0
  80. data/spec/xml/certinfo/certificate_spec.rb +166 -0
  81. data/spec/xml/certinfo/certificate_validation/hostname_validation_spec.rb +23 -0
  82. data/spec/xml/certinfo/certificate_validation/path_validation_spec.rb +107 -0
  83. data/spec/xml/certinfo/certificate_validation/verified_certificate_chain_spec.rb +163 -0
  84. data/spec/xml/certinfo/certificate_validation_spec.rb +40 -0
  85. data/spec/xml/certinfo/ocsp_stapling/ocsp_response_spec.rb +61 -0
  86. data/spec/xml/certinfo/ocsp_stapling_spec.rb +31 -0
  87. data/spec/xml/certinfo/received_certificate_chain_spec.rb +165 -0
  88. data/spec/xml/certinfo_spec.rb +45 -0
  89. data/spec/xml/compression/compression_method_spec.rb +23 -0
  90. data/spec/xml/compression_spec.rb +23 -0
  91. data/spec/xml/heartbleed/openssl_heartbleed_spec.rb +17 -0
  92. data/spec/xml/heartbleed_spec.rb +37 -0
  93. data/spec/xml/http_headers/http_public_key_pinning_spec.rb +73 -0
  94. data/spec/xml/http_headers/http_strict_transport_security_spec.rb +107 -0
  95. data/spec/xml/http_headers_spec.rb +63 -0
  96. data/spec/xml/invalid_target_spec.rb +23 -0
  97. data/spec/xml/plugin_examples.rb +14 -0
  98. data/spec/{key_exchange_spec.rb → xml/protocol/cipher_suite/key_exchange_spec.rb} +9 -3
  99. data/spec/xml/protocol/cipher_suite_spec.rb +66 -0
  100. data/spec/xml/protocol_spec.rb +115 -0
  101. data/spec/xml/reneg/session_renegotiation_spec.rb +23 -0
  102. data/spec/xml/reneg_spec.rb +35 -0
  103. data/spec/xml/resum/session_resumption_with_session_ids_spec.rb +103 -0
  104. data/spec/xml/resum/session_resumption_with_tls_tickets_spec.rb +121 -0
  105. data/spec/xml/resum_rate_spec.rb +30 -0
  106. data/spec/xml/resum_spec.rb +47 -0
  107. data/spec/{target_spec.rb → xml/target_spec.rb} +73 -27
  108. data/spec/xml_spec.rb +13 -21
  109. metadata +138 -61
  110. data/lib/sslyze/cert_info.rb +0 -57
  111. data/lib/sslyze/certificate.rb +0 -139
  112. data/lib/sslyze/certificate/extensions.rb +0 -127
  113. data/lib/sslyze/certificate/extensions/authority_information_access.rb +0 -38
  114. data/lib/sslyze/certificate/extensions/extension.rb +0 -26
  115. data/lib/sslyze/certificate/extensions/x509v3_basic_constraints.rb +0 -60
  116. data/lib/sslyze/certificate/extensions/x509v3_certificate_policies.rb +0 -50
  117. data/lib/sslyze/certificate/extensions/x509v3_crl_distribution_points.rb +0 -32
  118. data/lib/sslyze/certificate/extensions/x509v3_extended_key_usage.rb +0 -32
  119. data/lib/sslyze/certificate/extensions/x509v3_key_usage.rb +0 -50
  120. data/lib/sslyze/certificate/extensions/x509v3_subject_alternative_name.rb +0 -71
  121. data/lib/sslyze/certificate/issuer.rb +0 -56
  122. data/lib/sslyze/certificate/public_key.rb +0 -9
  123. data/lib/sslyze/certificate/subject.rb +0 -117
  124. data/lib/sslyze/certificate/subject_public_key_info.rb +0 -53
  125. data/lib/sslyze/certificate/validity.rb +0 -9
  126. data/lib/sslyze/certificate_chain.rb +0 -89
  127. data/lib/sslyze/certificate_validation.rb +0 -70
  128. data/lib/sslyze/cipher_suite.rb +0 -237
  129. data/lib/sslyze/invalid_target.rb +0 -35
  130. data/lib/sslyze/key_exchange.rb +0 -106
  131. data/lib/sslyze/ocsp_response.rb +0 -87
  132. data/lib/sslyze/protocol.rb +0 -133
  133. data/lib/sslyze/target.rb +0 -312
  134. data/lib/sslyze/types.rb +0 -17
  135. data/spec/cert_info_spec.rb +0 -29
  136. data/spec/certificate/subject_name_spec.rb +0 -72
  137. data/spec/certificate_chain_spec.rb +0 -61
  138. data/spec/certificate_spec.rb +0 -330
  139. data/spec/certificate_validation_spec.rb +0 -39
  140. data/spec/cipher_suite_spec.rb +0 -50
  141. data/spec/invalid_target_spec.rb +0 -21
  142. data/spec/issuer_spec.rb +0 -33
  143. data/spec/ocsp_response_spec.rb +0 -59
  144. data/spec/protocol_spec.rb +0 -99
  145. data/spec/subject_public_key_info_spec.rb +0 -35
  146. data/spec/subject_spec.rb +0 -69
@@ -0,0 +1,48 @@
1
+ require 'sslyze/xml/plugin'
2
+ require 'sslyze/xml/types'
3
+ require 'sslyze/xml/certinfo/has_certificates'
4
+
5
+ module SSLyze
6
+ class XML
7
+ class Certinfo < Plugin
8
+ #
9
+ # Represents the `<receivedCertificateChain>` XML element.
10
+ #
11
+ # @since 1.0.0
12
+ #
13
+ class ReceivedCertificateChain
14
+
15
+ include Types
16
+ include HasCertificates
17
+
18
+ #
19
+ # Initializes the {ReceivedCertificateChain} object.
20
+ #
21
+ # @param [Nokogiri::XML::Element] node
22
+ #
23
+ def initialize(node)
24
+ @node = node
25
+ end
26
+
27
+ #
28
+ # Parses the `isChainOrderValid` XML attribute.
29
+ #
30
+ # @return [Boolean]
31
+ #
32
+ def is_chain_order_valid?
33
+ Boolean[@node['isChainOrderValid']]
34
+ end
35
+
36
+ #
37
+ # Parses the `containsAnchorCertificate` XML attribute.
38
+ #
39
+ # @return [Boolean]
40
+ #
41
+ def contains_anchor_certificate?
42
+ Boolean[@node['containsAnchorCertificate']]
43
+ end
44
+
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,33 @@
1
+ require 'sslyze/xml/plugin'
2
+ require 'sslyze/xml/compression/compression_method'
3
+
4
+ module SSLyze
5
+ class XML
6
+ #
7
+ # Represents the `<compression>` XML element.
8
+ #
9
+ # @since 1.0.0
10
+ #
11
+ class Compression < Plugin
12
+
13
+ #
14
+ # Parses the `<compressionMethod>` XML element.
15
+ #
16
+ # @return [CompressionMethod]
17
+ #
18
+ def deflate
19
+ @compression_method ||= CompressionMethod.new(
20
+ @node.at_xpath('compressionMethod[@type="DEFLATE"]')
21
+ )
22
+ end
23
+
24
+ #
25
+ # @see CompressionMethod#is_supported?
26
+ #
27
+ def deflate?
28
+ deflate.is_supported?
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,38 @@
1
+ require 'sslyze/xml/plugin'
2
+ require 'sslyze/xml/attributes/is_supported'
3
+
4
+ module SSLyze
5
+ class XML
6
+ class Compression < Plugin
7
+ #
8
+ # Represents the `<compressionMethod>` XML element.
9
+ #
10
+ # @since 1.0.0
11
+ #
12
+ class CompressionMethod
13
+
14
+ include Attributes::IsSupported
15
+
16
+ #
17
+ # Initializes the {CompressionMethod} object.
18
+ #
19
+ # @param [Nokogiri::XML::Element] node
20
+ # The `<compressionMethod>` XML element.
21
+ #
22
+ def initialize(node)
23
+ @node = node
24
+ end
25
+
26
+ #
27
+ # The type of compression.
28
+ #
29
+ # @return [Symbol]
30
+ #
31
+ def type
32
+ @type ||= @node['type'].to_sym
33
+ end
34
+
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,34 @@
1
+ require 'sslyze/xml/plugin'
2
+
3
+ module SSLyze
4
+ class XML
5
+ #
6
+ # Represents the `<fallback>` XML element.
7
+ #
8
+ # @since 1.0.0
9
+ #
10
+ class Fallback < Plugin
11
+
12
+ #
13
+ # Parses the `<tlsFallbackScsv>` XML element.
14
+ #
15
+ # @return [TLSFallbackSCSV]
16
+ #
17
+ def tls_fallback_scsv
18
+ @tls_fallback_scsv ||= TLSFallbackSCSV.new(
19
+ @node.at_xpath('tlsFallbackScsv')
20
+ )
21
+ end
22
+
23
+ #
24
+ # @see TLSFallbackSCSV#is_supported?
25
+ #
26
+ def is_supported?
27
+ tls_fallback_scsv.is_supported?
28
+ end
29
+
30
+ alias supported? is_supported?
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,27 @@
1
+ require 'sslyze/xml/plugin'
2
+ require 'sslyze/xml/is_supported'
3
+
4
+ module SSLyze
5
+ class XML
6
+ class Fallback < Plugin
7
+ #
8
+ # Represents the `<tlsFallbackScsv>` XML element.
9
+ #
10
+ class TLSFallbackSCSV
11
+
12
+ include IsSupported
13
+
14
+ #
15
+ # Initializes the {TLSFallbackSCSV} object.
16
+ #
17
+ # @param [Nokogiri::XML::Element] node
18
+ # The `<tlsFallbackScsv>` XML element.
19
+ #
20
+ def initialize(node)
21
+ @node = node
22
+ end
23
+
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,38 @@
1
+ require 'sslyze/xml/plugin'
2
+ require 'sslyze/xml/types'
3
+ require 'sslyze/xml/heartbleed/openssl_heartbleed'
4
+
5
+ module SSLyze
6
+ class XML
7
+ #
8
+ # Represents the `<heartbleed>` XML element.
9
+ #
10
+ # @since 1.0.0
11
+ #
12
+ class Heartbleed < Plugin
13
+
14
+ #
15
+ # Parses the `<openSslHeartbleed>` XML element.
16
+ #
17
+ # @return [OpenSSLHeartbleed]
18
+ #
19
+ def openssl_heartbleed
20
+ @openssl_heartbleed ||= if (element = @node.at_xpath('openSslHeartbleed'))
21
+ OpenSSLHeartbleed.new(element)
22
+ end
23
+ end
24
+
25
+ alias openssl openssl_heartbleed
26
+
27
+ #
28
+ # @see #has_openssl_heartbleed?
29
+ #
30
+ def is_vulnerable?
31
+ openssl_heartbleed && openssl_heartbleed.is_vulnerable?
32
+ end
33
+
34
+ alias vulnerable? is_vulnerable?
35
+
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,29 @@
1
+ require 'sslyze/xml/plugin'
2
+ require 'sslyze/xml/attributes/is_vulnerable'
3
+
4
+ module SSLyze
5
+ class XML
6
+ class Heartbleed < Plugin
7
+ #
8
+ # Represents the `<openSslHeartbleed>` XML element.
9
+ #
10
+ # @since 1.0.0
11
+ #
12
+ class OpenSSLHeartbleed
13
+
14
+ include Attributes::IsVulnerable
15
+
16
+ #
17
+ # Initializes the {OpenSSLHeartbleed} object.
18
+ #
19
+ # @param [Nokogiri::XML::Element] node
20
+ # The `<openSslHeartbleed>` XML element.
21
+ #
22
+ def initialize(node)
23
+ @node = node
24
+ end
25
+
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,42 @@
1
+ require 'sslyze/xml/plugin'
2
+ require 'sslyze/xml/http_headers/http_strict_transport_security'
3
+ require 'sslyze/xml/http_headers/http_public_key_pinning'
4
+
5
+ module SSLyze
6
+ class XML
7
+ #
8
+ # Represents the `<http_headers>` XML element.
9
+ #
10
+ # @since 1.0.0
11
+ #
12
+ class HTTPHeaders < Plugin
13
+
14
+ #
15
+ # HTTP Strict-Transport-Security header information.
16
+ #
17
+ # @return [HTTPStrictTransportSecurity, nil]
18
+ #
19
+ def http_strict_transport_security
20
+ @http_strict_transport_security ||= if (element = @node.at_xpath('httpStrictTransportSecurity'))
21
+ HTTPStrictTransportSecurity.new(element)
22
+ end
23
+ end
24
+
25
+ alias strict_transport_security http_strict_transport_security
26
+
27
+ #
28
+ # HTTP Public-Key-Pinning header information.
29
+ #
30
+ # @return [HTTPPublicKeyPinning, nil]
31
+ #
32
+ def http_public_key_pinning
33
+ @http_public_key_pinning ||= if (element = @node.at_xpath('httpPublicKeyPinning'))
34
+ HTTPPublicKeyPinning.new(element)
35
+ end
36
+ end
37
+
38
+ alias public_key_pinning http_public_key_pinning
39
+
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,121 @@
1
+ require 'sslyze/xml/plugin'
2
+ require 'sslyze/xml/types'
3
+ require 'sslyze/xml/attributes/is_supported'
4
+ require 'sslyze/xml/attributes/exception'
5
+
6
+ module SSLyze
7
+ class XML
8
+ class HTTPHeaders < Plugin
9
+ #
10
+ # Represents the `<httpPublicKeyPinning>` XML element.
11
+ #
12
+ # @since 1.0.0
13
+ #
14
+ class HTTPPublicKeyPinning
15
+
16
+ include Types
17
+ include Attributes::IsSupported
18
+ include Attributes::Exception
19
+
20
+ #
21
+ # Initializes the {HTTPPublicKeyPinning} element.
22
+ #
23
+ def initialize(node)
24
+ @node = node
25
+ end
26
+
27
+ #
28
+ # Parses each `pinSha256` XML element.
29
+ #
30
+ # @yield [sha256]
31
+ # Yields each SHA256 checksum.
32
+ #
33
+ # @yieldparam [String] sha256
34
+ # An individual pinned SHA256 checksum.
35
+ #
36
+ # @return [Enumerator]
37
+ #
38
+ def each_pin_sha256
39
+ return enum_for(__method__) unless block_given?
40
+
41
+ @node.xpath('pinSha256').each do |element|
42
+ yield element.inner_text
43
+ end
44
+ end
45
+
46
+ alias each_sha256 each_pin_sha256
47
+
48
+ #
49
+ # @return [Array<String>]
50
+ #
51
+ # @see #each_pin_sha256
52
+ #
53
+ def pin_sha256s
54
+ each_pin_sha256.to_a
55
+ end
56
+
57
+ alias sha256s pin_sha256s
58
+
59
+ #
60
+ # Parses the `includeSubDomains` XML attribute.
61
+ #
62
+ # @return [Boolean]
63
+ #
64
+ def include_sub_domains?
65
+ Boolean[@node['includeSubDomains']]
66
+ end
67
+
68
+ #
69
+ # Parses the `maxAge` attribute.
70
+ #
71
+ # @return [Integer, nil]
72
+ #
73
+ def max_age
74
+ @max_age ||= if (value = @node['maxAge'])
75
+ value.to_i
76
+ end
77
+ end
78
+
79
+ #
80
+ # Parses the `reportOnly` XML attribute.
81
+ #
82
+ # @return [Boolean]
83
+ #
84
+ def report_only
85
+ Boolean[@node['reportOnly']]
86
+ end
87
+
88
+ #
89
+ # Parses the `reportUri` XML attribute.
90
+ #
91
+ # @return [String, nil]
92
+ #
93
+ def report_uri
94
+ @report_uri ||= case (value = @node['reportUri'])
95
+ when nil, 'None' then nil
96
+ else value
97
+ end
98
+ end
99
+
100
+ #
101
+ # Parses the `isValidPinConfigured` XML attribute.
102
+ #
103
+ # @return [Boolean]
104
+ #
105
+ def is_valid_pin_configured?
106
+ Boolean[@node['isValidPinConfigured']]
107
+ end
108
+
109
+ #
110
+ # Parses the `isBackupPinConfigured` XML attribute.
111
+ #
112
+ # @return [Boolean]
113
+ #
114
+ def is_backup_pin_configured?
115
+ Boolean[@node['isBackupPinConfigured']]
116
+ end
117
+
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,59 @@
1
+ require 'sslyze/xml/plugin'
2
+ require 'sslyze/xml/types'
3
+ require 'sslyze/xml/attributes/is_supported'
4
+ require 'sslyze/xml/attributes/exception'
5
+
6
+ module SSLyze
7
+ class XML
8
+ class HTTPHeaders < Plugin
9
+ #
10
+ # Represents the `<httpStrictTransportSecurity/>` XML element.
11
+ #
12
+ # @since 1.0.0
13
+ #
14
+ class HTTPStrictTransportSecurity
15
+
16
+ include Types
17
+ include Attributes::IsSupported
18
+ include Attributes::Exception
19
+
20
+ #
21
+ # Initializes the {HTTPStrictTransportSecurity} object.
22
+ #
23
+ def initialize(node)
24
+ @node = node
25
+ end
26
+
27
+ #
28
+ # Parses the `includeSubDomains` XML attribute.
29
+ #
30
+ # @return [Boolean]
31
+ #
32
+ def include_sub_domains?
33
+ Boolean[@node['includeSubDomains']]
34
+ end
35
+
36
+ #
37
+ # Parses the `maxAge` XML attribute.
38
+ #
39
+ # @return [Integer, nil]
40
+ #
41
+ def max_age
42
+ @max_age ||= if (value = @node['maxAge'])
43
+ value.to_i
44
+ end
45
+ end
46
+
47
+ #
48
+ # Parses the `preload` XML attribute.
49
+ #
50
+ # @return [Boolean]
51
+ #
52
+ def preload?
53
+ Boolean[@node['preload']]
54
+ end
55
+
56
+ end
57
+ end
58
+ end
59
+ end