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
@@ -1,17 +0,0 @@
1
- module SSLyze
2
- module Types
3
- # Maps `"True"` and `"False"` to boolean values.
4
- Boolean = {
5
- 'True' => true,
6
- 'False' => false
7
- }
8
-
9
- # Maps `"None"` to `nil`
10
- None = proc { |value|
11
- case value
12
- when 'None' then nil
13
- else value
14
- end
15
- }
16
- end
17
- end
@@ -1,29 +0,0 @@
1
- require 'spec_helper'
2
- require 'xml_examples'
3
- require 'sslyze/cert_info'
4
-
5
- describe SSLyze::CertInfo do
6
- include_examples "XML specs"
7
-
8
- subject { described_class.new(xml.at('/document/results/target/certinfo')) }
9
-
10
- describe "#chain" do
11
- it "should return a CertificateChain object" do
12
- expect(subject.chain).to be_a(CertificateChain)
13
- end
14
- end
15
-
16
- describe "#validation" do
17
- it "should return a CertificateValidation element" do
18
- expect(subject.validation).to be_kind_of(CertificateValidation)
19
- end
20
- end
21
-
22
- describe "#ocsp_response" do
23
- subject { described_class.new(xml.at('/document/results/target/certinfo[ocspStapling/ocspResponse]')) }
24
-
25
- it "should return a OCSPResponse object" do
26
- expect(subject.ocsp_response).to be_kind_of(OCSPResponse)
27
- end
28
- end
29
- end
@@ -1,72 +0,0 @@
1
- require 'spec_helper'
2
- require 'sslyze/certificate/domain_name'
3
-
4
- describe SSLyze::Certificate::DomainName do
5
- let(:name) { 'twitter.com' }
6
-
7
- subject { described_class.new(name) }
8
-
9
- describe "#==" do
10
- context "when the domain names are the same" do
11
- let(:other) { described_class.new(name) }
12
-
13
- it "should return true" do
14
- expect(subject == other).to be true
15
- end
16
- end
17
-
18
- context "when the domain names are different" do
19
- let(:other) { described_class.new(name + 'XXX') }
20
-
21
- it "should return true" do
22
- expect(subject == other).to be false
23
- end
24
- end
25
- end
26
-
27
- describe "#include?" do
28
- context "when the domain name is literal" do
29
- it "should compare the given domain to the domain name" do
30
- expect(subject.include?(name)).to be true
31
- end
32
- end
33
-
34
- context "when the domain name has a wildcard" do
35
- let(:wildcard) { "*.#{name}" }
36
-
37
- subject { described_class.new(wildcard) }
38
-
39
- it "should match the domain" do
40
- expect(subject.include?(name)).to be true
41
- end
42
-
43
- it "should match any sub-domain" do
44
- expect(subject.include?("foo.#{name}")).to be true
45
- end
46
- end
47
- end
48
-
49
- describe "#to_s" do
50
- it "should return the domain name" do
51
- expect(subject.to_s).to be name
52
- end
53
- end
54
-
55
- describe "#to_str" do
56
- it "should return the domain name" do
57
- expect(subject.to_str).to be name
58
- end
59
- end
60
-
61
- describe "#inspect" do
62
- subject { super().inspect }
63
-
64
- it "should include the class name" do
65
- expect(subject).to include(described_class.name)
66
- end
67
-
68
- it "should include the domain name" do
69
- expect(subject).to include(name)
70
- end
71
- end
72
- end
@@ -1,61 +0,0 @@
1
- require 'spec_helper'
2
- require 'xml_examples'
3
- require 'sslyze/certificate_chain'
4
-
5
- describe SSLyze::CertificateChain do
6
- include_examples "XML specs"
7
-
8
- subject { described_class.new(xml.at('/document/results/target/certinfo/certificateChain')) }
9
-
10
- describe "#each" do
11
- context "when given a block" do
12
- it "should yield Certificate objects" do
13
- expect { |b|
14
- subject.each(&b)
15
- }.to yield_successive_args(Certificate, Certificate)
16
- end
17
- end
18
-
19
- context "when not given a block" do
20
- it "should return an Enumerator" do
21
- expect(subject.each).to be_kind_of(Enumerator)
22
- end
23
- end
24
- end
25
-
26
- describe "#leaf" do
27
- it "should return a Certificate with position leaf" do
28
- expect(subject.leaf).to be_a(Certificate)
29
- expect(subject.leaf.position).to be :leaf
30
- end
31
- end
32
-
33
- describe "#each_intermediate" do
34
- context "when given a block" do
35
- it "should return Certificates with position intermediate" do
36
- expect { |b|
37
- subject.each_intermediate(&b)
38
- }.to yield_successive_args(Certificate)
39
- end
40
- end
41
-
42
- context "when not given a block" do
43
- it "should return an Enumerator" do
44
- expect(subject.each_intermediate).to be_kind_of(Enumerator)
45
- end
46
- end
47
- end
48
-
49
- describe "#intermediate" do
50
- it "should return all intermediate certificates" do
51
- expect(subject.intermediate).to all(be_kind_of(Certificate))
52
- end
53
- end
54
-
55
- describe "#root" do
56
- it "should find the last intermediate certificate" do
57
- expect(subject.root.sha1_fingerprint).to be == subject.intermediate.to_a.last.sha1_fingerprint
58
- end
59
- end
60
-
61
- end
@@ -1,330 +0,0 @@
1
- require 'spec_helper'
2
- require 'xml_examples'
3
- require 'sslyze/certificate'
4
-
5
- describe SSLyze::Certificate do
6
- include_examples "XML specs"
7
-
8
- subject { described_class.new(xml.at('/document/results/target/certinfo/certificateChain/certificate')) }
9
-
10
- describe "#position" do
11
- it "should parse the position attribute" do
12
- expect(subject.position).to be :leaf
13
- end
14
- end
15
-
16
- describe "#sha1_fingerprint" do
17
- it "should parse the sha1Fingerprint attribute" do
18
- expect(subject.sha1_fingerprint).to be == 'a0c4a74600eda72dc0becb9a8cb607ca58ee745e'
19
- end
20
- end
21
-
22
- describe "#as_pem" do
23
- it "should parse the asPEM element" do
24
- expect(subject.as_pem).to be == %{
25
- -----BEGIN CERTIFICATE-----
26
- MIIF4DCCBMigAwIBAgIQDACTENIG2+M3VTWAEY3chzANBgkqhkiG9w0BAQsFADB1
27
- MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
28
- d3cuZGlnaWNlcnQuY29tMTQwMgYDVQQDEytEaWdpQ2VydCBTSEEyIEV4dGVuZGVk
29
- IFZhbGlkYXRpb24gU2VydmVyIENBMB4XDTE0MDQwODAwMDAwMFoXDTE2MDQxMjEy
30
- MDAwMFowgfAxHTAbBgNVBA8MFFByaXZhdGUgT3JnYW5pemF0aW9uMRMwEQYLKwYB
31
- BAGCNzwCAQMTAlVTMRkwFwYLKwYBBAGCNzwCAQITCERlbGF3YXJlMRAwDgYDVQQF
32
- Ewc1MTU3NTUwMRcwFQYDVQQJEw41NDggNHRoIFN0cmVldDEOMAwGA1UEERMFOTQx
33
- MDcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
34
- YW4gRnJhbmNpc2NvMRUwEwYDVQQKEwxHaXRIdWIsIEluYy4xEzARBgNVBAMTCmdp
35
- dGh1Yi5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx1Nw8r/3z
36
- Tu3BZ63myyLot+KrKPL33GJwCNEMr9YWaiGwNksXDTZjBK6/6iBRlWVm8r+5TaQM
37
- Kev1FbHoNbNwEJTVG1m0Jg/Wg1dZneF8Cd3gE8pNb0Obzc+HOhWnhd1mg+2TDP4r
38
- bTgceYiQz61YGC1R0cKj8keMbzgJubjvTJMLy4OUh+rgo7XZe5trD0P5yu6ADSin
39
- dvEl9ME1PPZ0rd5qM4J73P1LdqfC7vJqv6kkpl/nLnwO28N0c/p+xtjPYOs2ViG2
40
- wYq4JIJNeCS66R2hiqeHvmYlab++O3JuT+DkhSUIsZGJuNZ0ZXabLE9iH6H6Or6c
41
- JL+fyrDFwGeNAgMBAAGjggHuMIIB6jAfBgNVHSMEGDAWgBQ901Cl1qCt7vNKYApl
42
- 0yHU+PjWDzAdBgNVHQ4EFgQUakOQfTuYFHJSlTqqKApD+FF+06YwJQYDVR0RBB4w
43
- HIIKZ2l0aHViLmNvbYIOd3d3LmdpdGh1Yi5jb20wDgYDVR0PAQH/BAQDAgWgMB0G
44
- A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjB1BgNVHR8EbjBsMDSgMqAwhi5o
45
- dHRwOi8vY3JsMy5kaWdpY2VydC5jb20vc2hhMi1ldi1zZXJ2ZXItZzEuY3JsMDSg
46
- MqAwhi5odHRwOi8vY3JsNC5kaWdpY2VydC5jb20vc2hhMi1ldi1zZXJ2ZXItZzEu
47
- Y3JsMEIGA1UdIAQ7MDkwNwYJYIZIAYb9bAIBMCowKAYIKwYBBQUHAgEWHGh0dHBz
48
- Oi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwgYgGCCsGAQUFBwEBBHwwejAkBggrBgEF
49
- BQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMFIGCCsGAQUFBzAChkZodHRw
50
- Oi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRTSEEyRXh0ZW5kZWRWYWxp
51
- ZGF0aW9uU2VydmVyQ0EuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQAD
52
- ggEBAG/nbcuC8++QhwnXDxUiLIz+06scipbbXRJd0XjAMbD/RciJ9wiYUhcfTEsg
53
- ZGpt21DXEL5+q/4vgNipSlhBaYFyGQiDm5IQTmIte0ZwQ26jUxMf4pOmI1v3kj43
54
- FHU7uUskQS6lPUgND5nqHkKXxv6V2qtHmssrA9YNQMEK93ga2rWDpK21mUkgLviT
55
- PB5sPdE7IzprOCp+Ynpf3RcFddAkXb6NqJoQRPrStMrv19C1dqUmJRwIQdhkkqev
56
- ff6IQDlhC8BIMKmCNK33cEYDfDWROtW7JNgBvBTwww8jO1gyug8SbGZ6bZ3k8OV8
57
- XX4C2NesiZcLYbc2n7B9O+63M2k=
58
- -----END CERTIFICATE-----
59
- }.strip
60
- end
61
- end
62
-
63
- describe "#subject_public_key_info" do
64
- it "must return a Certificate::SubjectPublicKeyInfo object" do
65
- expect(subject.subject_public_key_info).to be_kind_of(described_class::SubjectPublicKeyInfo)
66
- end
67
- end
68
-
69
- describe "#version" do
70
- it "should parse the version element" do
71
- expect(subject.version).to be == 2
72
- end
73
- end
74
-
75
- describe "#extensions" do
76
- subject { super().extensions }
77
-
78
- it "should return an Extensions object" do
79
- expect(subject).to be_kind_of(described_class::Extensions)
80
- end
81
-
82
- describe "#x509v3_subject_key_identifier" do
83
- subject { super().x509v3_subject_key_identifier }
84
-
85
- it "should parse the X509v3SubjectKeyIdentifier element" do
86
- expect(subject).to be == '6A:43:90:7D:3B:98:14:72:52:95:3A:AA:28:0A:43:F8:51:7E:D3:A6'
87
- end
88
- end
89
-
90
- describe "#x509v3_extended_key_usage" do
91
- subject { super().x509v3_extended_key_usage }
92
-
93
- it "should return a X509v3ExtendedKeyUsage object" do
94
- expect(subject).to be_kind_of(described_class::Extensions::X509v3ExtendedKeyUsage)
95
- end
96
-
97
- describe "#tls_web_client_authentication" do
98
- subject { super().tls_web_client_authentication }
99
-
100
- it "should parse the TLSWebClientAuthentication element" do
101
- expect(subject).to be == ''
102
- end
103
- end
104
-
105
- describe "#tls_web_server_authentication" do
106
- subject { super().tls_web_server_authentication }
107
-
108
- it "should parse the TLSWebServerAuthentication element" do
109
- expect(subject).to be == ''
110
- end
111
- end
112
- end
113
-
114
- describe "#authority_information_access" do
115
- subject { super().authority_information_access }
116
-
117
- it "should return an AuthorityInformationAccess object" do
118
- expect(subject).to be_kind_of(described_class::Extensions::AuthorityInformationAccess)
119
- end
120
-
121
- describe "#ca_issuers" do
122
- subject { super().ca_issuers }
123
-
124
- it "should parse the CAIssuers element" do
125
- expect(subject).to be == [
126
- URI('http://cacerts.digicert.com/DigiCertSHA2ExtendedValidationServerCA.crt')
127
- ]
128
- end
129
- end
130
-
131
- describe "#ocsp" do
132
- subject { super().ocsp }
133
-
134
- it "should parse the OCSP element" do
135
- expect(subject).to be == [
136
- URI('http://ocsp.digicert.com')
137
- ]
138
- end
139
- end
140
- end
141
-
142
- describe "#x509v3_crl_distribution_points" do
143
- subject { super().x509v3_crl_distribution_points }
144
-
145
- it "should return a X509v3CRLDistributionPoints object" do
146
- expect(subject).to be_kind_of(described_class::Extensions::X509v3CRLDistributionPoints)
147
- end
148
-
149
- describe "#full_name" do
150
- subject { super().full_name }
151
-
152
- it "should parse the FullName element" do
153
- expect(subject).to be == ['', '']
154
- end
155
- end
156
-
157
- describe "#uri" do
158
- subject { super().uri }
159
-
160
- it "should parse the URI element" do
161
- expect(subject).to be == [
162
- URI('http://crl3.digicert.com/sha2-ev-server-g1.crl'),
163
- URI('http://crl4.digicert.com/sha2-ev-server-g1.crl')
164
- ]
165
- end
166
- end
167
- end
168
-
169
- describe "#x509v3_basic_constraints" do
170
- subject { super().x509v3_basic_constraints }
171
-
172
- it "should parse the X509v3BasicConstraints element" do
173
- expect(subject).to be_kind_of(described_class::Extensions::X509v3BasicConstraints)
174
- end
175
-
176
- describe "#ca?" do
177
- subject { super().ca? }
178
-
179
- it "should parse the 'CA:' constraint" do
180
- expect(subject).to be false
181
- end
182
- end
183
-
184
- describe "#path_length" do
185
- subject { super().path_length }
186
-
187
- pending "need data" do
188
- it "should parse the 'pathLen:' constraint" do
189
- expect(subject).to be == 0
190
- end
191
- end
192
- end
193
- end
194
-
195
- describe "#x509v3_key_usage" do
196
- subject { super().x509v3_key_usage }
197
-
198
- it "should return a X509v3KeyUsage object" do
199
- expect(subject).to be_kind_of(described_class::Extensions::X509v3KeyUsage)
200
- end
201
-
202
- describe "#key_encipherment" do
203
- subject { super().key_encipherment }
204
-
205
- it "should parse the KeyEncipherment element" do
206
- expect(subject).to be == ''
207
- end
208
- end
209
-
210
- describe "#digital_signature" do
211
- subject { super().digital_signature }
212
-
213
- it "should parse the DigitalSignature element" do
214
- expect(subject).to be == ''
215
- end
216
- end
217
- end
218
-
219
- describe "#x509v3_subject_alternative_name" do
220
- subject { super().x509v3_subject_alternative_name }
221
-
222
- it "should parse the X509v3SubjectAlternativeName elements" do
223
- expect(subject).to be_kind_of(described_class::Extensions::X509v3SubjectAlternativeName)
224
- end
225
-
226
- describe "#dns" do
227
- subject { super().dns }
228
-
229
- it "should parse the DNS/listEntry elements" do
230
- expect(subject).to be == [
231
- described_class::DomainName.new('github.com'),
232
- described_class::DomainName.new('www.github.com')
233
- ]
234
- end
235
- end
236
- end
237
-
238
- describe "#x509v3_authority_key_identifier" do
239
- subject { super().x509v3_authority_key_identifier }
240
-
241
- it "should parse the X509v3AuthorityKeyIdentifier element" do
242
- expect(subject).to be == 'keyid:3D:D3:50:A5:D6:A0:AD:EE:F3:4A:60:0A:65:D3:21:D4:F8:F8:D6:0F'
243
- end
244
- end
245
-
246
- describe "#x509v3_certificate_policies" do
247
- subject { super().x509v3_certificate_policies }
248
-
249
- it "should return a X509v3CertificatePolicies object" do
250
- expect(subject).to be_kind_of(described_class::Extensions::X509v3CertificatePolicies)
251
- end
252
-
253
- describe "#policy" do
254
- subject { super().policy }
255
-
256
- it "should parse the Policy element" do
257
- expect(subject).to be == ['2.16.840.1.114412.2.1']
258
- end
259
- end
260
-
261
- describe "#explicit_text" do
262
- subject { super().explicit_text }
263
-
264
- it "should parse the ExplicitText element" do
265
- expect(subject).to be == []
266
- end
267
- end
268
-
269
- describe "#cps" do
270
- subject { super().cps }
271
-
272
- it "should parse the CPS element" do
273
- expect(subject).to be == ['https://www.digicert.com/CPS']
274
- end
275
- end
276
-
277
- describe "#user_notice" do
278
- subject { super().user_notice }
279
-
280
- it "should parse the UserNotice element" do
281
- expect(subject).to be == []
282
- end
283
- end
284
- end
285
- end
286
-
287
- describe "#signature_value" do
288
- it "should parse the signatureValue element" do
289
- expect(subject.signature_value).to be == %{6f:e7:6d:cb:82:f3:ef:90:87:09:d7:0f:15:22:2c:8c:fe:d3:ab:1c:8a:96:db:5d:12:5d:d1:78:c0:31:b0:ff:45:c8:89:f7:08:98:52:17:1f:4c:4b:20:64:6a:6d:db:50:d7:10:be:7e:ab:fe:2f:80:d8:a9:4a:58:41:69:81:72:19:08:83:9b:92:10:4e:62:2d:7b:46:70:43:6e:a3:53:13:1f:e2:93:a6:23:5b:f7:92:3e:37:14:75:3b:b9:4b:24:41:2e:a5:3d:48:0d:0f:99:ea:1e:42:97:c6:fe:95:da:ab:47:9a:cb:2b:03:d6:0d:40:c1:0a:f7:78:1a:da:b5:83:a4:ad:b5:99:49:20:2e:f8:93:3c:1e:6c:3d:d1:3b:23:3a:6b:38:2a:7e:62:7a:5f:dd:17:05:75:d0:24:5d:be:8d:a8:9a:10:44:fa:d2:b4:ca:ef:d7:d0:b5:76:a5:26:25:1c:08:41:d8:64:92:a7:af:7d:fe:88:40:39:61:0b:c0:48:30:a9:82:34:ad:f7:70:46:03:7c:35:91:3a:d5:bb:24:d8:01:bc:14:f0:c3:0f:23:3b:58:32:ba:0f:12:6c:66:7a:6d:9d:e4:f0:e5:7c:5d:7e:02:d8:d7:ac:89:97:0b:61:b7:36:9f:b0:7d:3b:ee:b7:33:69}
290
- end
291
- end
292
-
293
- describe "#signature_algorithm" do
294
- it "should parse the signatureAlgorithm element" do
295
- expect(subject.signature_algorithm).to be == 'sha256WithRSAEncryption'
296
- end
297
- end
298
-
299
- describe "#serial_number" do
300
- it "should parse the serialNumber element" do
301
- expect(subject.serial_number).to be == '0C009310D206DBE337553580118DDC87'
302
- end
303
- end
304
-
305
- describe "#subject" do
306
- it "should return a Subject object" do
307
- expect(subject.subject).to be_kind_of(described_class::Subject)
308
- end
309
- end
310
-
311
- describe "#validity" do
312
- it "should return a Validity object" do
313
- expect(subject.validity).to be_kind_of(described_class::Validity)
314
- end
315
-
316
- it "should parse the validity/notAfter element" do
317
- expect(subject.validity.not_after).to be == Date.parse('Apr 12 12:00:00 2016 GMT')
318
- end
319
-
320
- it "should parse the validity/notBefore element" do
321
- expect(subject.validity.not_before).to be == Date.parse('Apr 8 00:00:00 2014 GMT')
322
- end
323
- end
324
-
325
- describe "#issuer" do
326
- it "should return an Issuer object" do
327
- expect(subject.issuer).to be_kind_of(described_class::Issuer)
328
- end
329
- end
330
- end