icn_saml_idp 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (129) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +2 -0
  3. data/LICENSE +22 -0
  4. data/README.md +238 -0
  5. data/app/controllers/saml_idp/idp_controller.rb +53 -0
  6. data/app/views/saml_idp/idp/new.html.erb +22 -0
  7. data/app/views/saml_idp/idp/saml_post.html.erb +14 -0
  8. data/lib/saml_idp.rb +92 -0
  9. data/lib/saml_idp/algorithmable.rb +19 -0
  10. data/lib/saml_idp/assertion_builder.rb +172 -0
  11. data/lib/saml_idp/attribute_decorator.rb +27 -0
  12. data/lib/saml_idp/attributeable.rb +24 -0
  13. data/lib/saml_idp/configurator.rb +48 -0
  14. data/lib/saml_idp/controller.rb +128 -0
  15. data/lib/saml_idp/default.rb +49 -0
  16. data/lib/saml_idp/encryptor.rb +86 -0
  17. data/lib/saml_idp/engine.rb +5 -0
  18. data/lib/saml_idp/hashable.rb +26 -0
  19. data/lib/saml_idp/incoming_metadata.rb +144 -0
  20. data/lib/saml_idp/logout_builder.rb +42 -0
  21. data/lib/saml_idp/logout_request_builder.rb +34 -0
  22. data/lib/saml_idp/logout_response_builder.rb +35 -0
  23. data/lib/saml_idp/metadata_builder.rb +160 -0
  24. data/lib/saml_idp/name_id_formatter.rb +68 -0
  25. data/lib/saml_idp/persisted_metadata.rb +10 -0
  26. data/lib/saml_idp/request.rb +180 -0
  27. data/lib/saml_idp/response_builder.rb +62 -0
  28. data/lib/saml_idp/saml_response.rb +79 -0
  29. data/lib/saml_idp/service_provider.rb +76 -0
  30. data/lib/saml_idp/signable.rb +131 -0
  31. data/lib/saml_idp/signature_builder.rb +42 -0
  32. data/lib/saml_idp/signed_info_builder.rb +88 -0
  33. data/lib/saml_idp/version.rb +4 -0
  34. data/lib/saml_idp/xml_security.rb +181 -0
  35. data/saml_idp.gemspec +65 -0
  36. data/spec/acceptance/acceptance_helper.rb +9 -0
  37. data/spec/acceptance/idp_controller_spec.rb +16 -0
  38. data/spec/lib/saml_idp/algorithmable_spec.rb +48 -0
  39. data/spec/lib/saml_idp/assertion_builder_spec.rb +106 -0
  40. data/spec/lib/saml_idp/attribute_decorator_spec.rb +53 -0
  41. data/spec/lib/saml_idp/configurator_spec.rb +43 -0
  42. data/spec/lib/saml_idp/controller_spec.rb +94 -0
  43. data/spec/lib/saml_idp/encryptor_spec.rb +27 -0
  44. data/spec/lib/saml_idp/logout_request_builder_spec.rb +41 -0
  45. data/spec/lib/saml_idp/logout_response_builder_spec.rb +41 -0
  46. data/spec/lib/saml_idp/metadata_builder_spec.rb +19 -0
  47. data/spec/lib/saml_idp/name_id_formatter_spec.rb +42 -0
  48. data/spec/lib/saml_idp/request_spec.rb +106 -0
  49. data/spec/lib/saml_idp/response_builder_spec.rb +42 -0
  50. data/spec/lib/saml_idp/saml_response_spec.rb +68 -0
  51. data/spec/lib/saml_idp/service_provider_spec.rb +27 -0
  52. data/spec/lib/saml_idp/signable_spec.rb +77 -0
  53. data/spec/lib/saml_idp/signature_builder_spec.rb +19 -0
  54. data/spec/lib/saml_idp/signed_info_builder_spec.rb +25 -0
  55. data/spec/rails_app/.gitignore +15 -0
  56. data/spec/rails_app/README.rdoc +261 -0
  57. data/spec/rails_app/Rakefile +7 -0
  58. data/spec/rails_app/app/assets/images/rails.png +0 -0
  59. data/spec/rails_app/app/assets/javascripts/application.js +15 -0
  60. data/spec/rails_app/app/assets/stylesheets/application.css +13 -0
  61. data/spec/rails_app/app/controllers/application_controller.rb +3 -0
  62. data/spec/rails_app/app/controllers/saml_controller.rb +8 -0
  63. data/spec/rails_app/app/controllers/saml_idp_controller.rb +11 -0
  64. data/spec/rails_app/app/helpers/application_helper.rb +2 -0
  65. data/spec/rails_app/app/mailers/.gitkeep +0 -0
  66. data/spec/rails_app/app/models/.gitkeep +0 -0
  67. data/spec/rails_app/app/views/layouts/application.html.erb +14 -0
  68. data/spec/rails_app/config.ru +4 -0
  69. data/spec/rails_app/config/application.rb +60 -0
  70. data/spec/rails_app/config/boot.rb +6 -0
  71. data/spec/rails_app/config/database.yml +25 -0
  72. data/spec/rails_app/config/environment.rb +5 -0
  73. data/spec/rails_app/config/environments/development.rb +37 -0
  74. data/spec/rails_app/config/environments/production.rb +67 -0
  75. data/spec/rails_app/config/environments/test.rb +37 -0
  76. data/spec/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  77. data/spec/rails_app/config/initializers/inflections.rb +15 -0
  78. data/spec/rails_app/config/initializers/mime_types.rb +5 -0
  79. data/spec/rails_app/config/initializers/secret_token.rb +7 -0
  80. data/spec/rails_app/config/initializers/session_store.rb +8 -0
  81. data/spec/rails_app/config/initializers/wrap_parameters.rb +14 -0
  82. data/spec/rails_app/config/locales/en.yml +5 -0
  83. data/spec/rails_app/config/routes.rb +6 -0
  84. data/spec/rails_app/db/seeds.rb +7 -0
  85. data/spec/rails_app/doc/README_FOR_APP +2 -0
  86. data/spec/rails_app/lib/assets/.gitkeep +0 -0
  87. data/spec/rails_app/lib/tasks/.gitkeep +0 -0
  88. data/spec/rails_app/log/.gitkeep +0 -0
  89. data/spec/rails_app/public/404.html +26 -0
  90. data/spec/rails_app/public/422.html +26 -0
  91. data/spec/rails_app/public/500.html +25 -0
  92. data/spec/rails_app/public/favicon.ico +0 -0
  93. data/spec/rails_app/public/index.html +241 -0
  94. data/spec/rails_app/public/robots.txt +5 -0
  95. data/spec/rails_app/script/rails +6 -0
  96. data/spec/rails_app/test/fixtures/.gitkeep +0 -0
  97. data/spec/rails_app/test/functional/.gitkeep +0 -0
  98. data/spec/rails_app/test/integration/.gitkeep +0 -0
  99. data/spec/rails_app/test/performance/browsing_test.rb +12 -0
  100. data/spec/rails_app/test/test_helper.rb +13 -0
  101. data/spec/rails_app/test/unit/.gitkeep +0 -0
  102. data/spec/rails_app/vendor/assets/javascripts/.gitkeep +0 -0
  103. data/spec/rails_app/vendor/assets/stylesheets/.gitkeep +0 -0
  104. data/spec/rails_app/vendor/plugins/.gitkeep +0 -0
  105. data/spec/spec_helper.rb +49 -0
  106. data/spec/support/certificates/certificate1 +12 -0
  107. data/spec/support/certificates/r1_certificate2_base64 +1 -0
  108. data/spec/support/responses/adfs_response_sha1.xml +46 -0
  109. data/spec/support/responses/adfs_response_sha256.xml +46 -0
  110. data/spec/support/responses/adfs_response_sha384.xml +46 -0
  111. data/spec/support/responses/adfs_response_sha512.xml +46 -0
  112. data/spec/support/responses/logoutresponse_fixtures.rb +67 -0
  113. data/spec/support/responses/no_signature_ns.xml +48 -0
  114. data/spec/support/responses/open_saml_response.xml +56 -0
  115. data/spec/support/responses/r1_response6.xml.base64 +1 -0
  116. data/spec/support/responses/response1.xml.base64 +1 -0
  117. data/spec/support/responses/response2.xml.base64 +79 -0
  118. data/spec/support/responses/response3.xml.base64 +66 -0
  119. data/spec/support/responses/response4.xml.base64 +93 -0
  120. data/spec/support/responses/response5.xml.base64 +102 -0
  121. data/spec/support/responses/response_with_ampersands.xml +139 -0
  122. data/spec/support/responses/response_with_ampersands.xml.base64 +93 -0
  123. data/spec/support/responses/simple_saml_php.xml +71 -0
  124. data/spec/support/responses/starfield_response.xml.base64 +1 -0
  125. data/spec/support/responses/wrapped_response_2.xml.base64 +150 -0
  126. data/spec/support/saml_request_macros.rb +38 -0
  127. data/spec/support/security_helpers.rb +61 -0
  128. data/spec/xml_security_spec.rb +137 -0
  129. metadata +465 -0
@@ -0,0 +1,93 @@
1
+ PHNhbWxwOlJlc3BvbnNlIHhtbG5zOnNhbWw9InVybjpvYXNpczpuYW1lczp0
2
+ YzpTQU1MOjIuMDphc3NlcnRpb24iIHhtbG5zOnNhbWxwPSJ1cm46b2FzaXM6
3
+ bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIElEPSJHT1NBTUxSMTMwNzE1
4
+ NDEyMjM0MDkiIFZlcnNpb249IjIuMCIgSXNzdWVJbnN0YW50PSIyMDExLTA2
5
+ LTA0VDAyOjIyOjAyWiIgRGVzdGluYXRpb249InJlY2lwaWVudCI+PHNhbWw6
6
+ SXNzdWVyPmh0dHBzOi8vYXBwLm9uZWxvZ2luLmNvbS9zYW1sMjwvc2FtbDpJ
7
+ c3N1ZXI+PHNhbWxwOlN0YXR1cz48c2FtbHA6U3RhdHVzQ29kZSBWYWx1ZT0i
8
+ dXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIi8+
9
+ PC9zYW1scDpTdGF0dXM+PHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzPSJodHRw
10
+ Oi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRw
11
+ Oi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgVmVyc2lv
12
+ bj0iMi4wIiBJRD0iZmFrZV9hc3NlcnRpb24iIElzc3VlSW5zdGFudD0iMjAx
13
+ MS0wNi0wNFQwMjoyMjowMloiPjxzYW1sOklzc3Vlcj5odHRwczovL2FwcC5v
14
+ bmVsb2dpbi5jb20vc2FtbDI8L3NhbWw6SXNzdWVyPjxzYW1sOlN1YmplY3Q+
15
+ PHNhbWw6TmFtZUlEIEZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6
16
+ MS4xOm5hbWVpZC1mb3JtYXQ6ZW1haWxBZGRyZXNzIj5ib2d1c0BvbmVsb2dp
17
+ bi5jb208L3NhbWw6TmFtZUlEPjxzYW1sOlN1YmplY3RDb25maXJtYXRpb24g
18
+ TWV0aG9kPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6Y206YmVhcmVy
19
+ Ij48c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uRGF0YSBOb3RPbk9yQWZ0ZXI9
20
+ IjIwMTEtMDYtMDRUMDI6Mjc6MDJaIiBSZWNpcGllbnQ9InJlY2lwaWVudCIv
21
+ Pjwvc2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uPjwvc2FtbDpTdWJqZWN0Pjxz
22
+ YW1sOkNvbmRpdGlvbnMgTm90QmVmb3JlPSIyMDExLTA2LTA0VDAyOjE3OjAy
23
+ WiIgTm90T25PckFmdGVyPSIyMDExLTA2LTA0VDAyOjI3OjAyWiI+PHNhbWw6
24
+ QXVkaWVuY2VSZXN0cmljdGlvbj48c2FtbDpBdWRpZW5jZT5hdWRpZW5jZTwv
25
+ c2FtbDpBdWRpZW5jZT48L3NhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj48L3Nh
26
+ bWw6Q29uZGl0aW9ucz48c2FtbDpBdXRoblN0YXRlbWVudCBBdXRobkluc3Rh
27
+ bnQ9IjIwMTEtMDYtMDRUMDI6MjI6MDJaIiBTZXNzaW9uTm90T25PckFmdGVy
28
+ PSIyMDExLTA2LTA1VDAyOjIyOjAyWiIgU2Vzc2lvbkluZGV4PSJfMTZmNTcw
29
+ ZmJjMDMxNTAwN2EwMzU1ZGZlYTZiM2M0NmMiPjxzYW1sOkF1dGhuQ29udGV4
30
+ dD48c2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj51cm46b2FzaXM6bmFtZXM6
31
+ dGM6U0FNTDoyLjA6YWM6Y2xhc3NlczpQYXNzd29yZFByb3RlY3RlZFRyYW5z
32
+ cG9ydDwvc2FtbDpBdXRobkNvbnRleHRDbGFzc1JlZj48L3NhbWw6QXV0aG5D
33
+ b250ZXh0Pjwvc2FtbDpBdXRoblN0YXRlbWVudD48L3NhbWw6QXNzZXJ0aW9u
34
+ PjxzYW1sOkFzc2VydGlvbiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcv
35
+ MjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcv
36
+ MjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIFZlcnNpb249IjIuMCIgSUQ9InBm
37
+ eDk1MTZiMGYzLTQ1MzYtMTBmNi1jNmZhLTlkZDUyM2UxNDk4YyIgSXNzdWVJ
38
+ bnN0YW50PSIyMDExLTA2LTA0VDAyOjIyOjAyWiI+PHNhbWw6SXNzdWVyPmh0
39
+ dHBzOi8vYXBwLm9uZWxvZ2luLmNvbS9zYW1sMjwvc2FtbDpJc3N1ZXI+PGRz
40
+ OlNpZ25hdHVyZSB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8w
41
+ OS94bWxkc2lnIyI+CiAgPGRzOlNpZ25lZEluZm8+PGRzOkNhbm9uaWNhbGl6
42
+ YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAx
43
+ LzEwL3htbC1leGMtYzE0biMiLz4KICAgIDxkczpTaWduYXR1cmVNZXRob2Qg
44
+ QWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcj
45
+ cnNhLXNoYTEiLz4KICA8ZHM6UmVmZXJlbmNlIFVSST0iI3BmeDk1MTZiMGYz
46
+ LTQ1MzYtMTBmNi1jNmZhLTlkZDUyM2UxNDk4YyI+PGRzOlRyYW5zZm9ybXM+
47
+ PGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIw
48
+ MDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIi8+PGRzOlRyYW5z
49
+ Zm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1s
50
+ LWV4Yy1jMTRuIyIvPjwvZHM6VHJhbnNmb3Jtcz48ZHM6RGlnZXN0TWV0aG9k
51
+ IEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2ln
52
+ I3NoYTEiLz48ZHM6RGlnZXN0VmFsdWU+L0ZFUHRwVlhKTDJHNzJ1UDZMd2Vv
53
+ R1ltYnpVPTwvZHM6RGlnZXN0VmFsdWU+PC9kczpSZWZlcmVuY2U+PC9kczpT
54
+ aWduZWRJbmZvPjxkczpTaWduYXR1cmVWYWx1ZT5rSEhrMFFOekMwTFlvVkVQ
55
+ UnE0MGRNT1puckpSdzdlT1dkWWdJY240MXQ2N25xOHJwVjhpSEF2WWQva0RS
56
+ MVJKcEc2UjU4K25LRVhtTUFLcFNDY29GeC9tQU1UNjNodzQ5RlhOYWZ4WWhj
57
+ MGc1bjFSVGhaQURFNlJZSFZpV2pvRHdxZzVCT3FnNnNLNUxlZk5ZM080dVhn
58
+ QXFyMUw4R3pVNXNtMGlMWm9xSUU9PC9kczpTaWduYXR1cmVWYWx1ZT4KPGRz
59
+ OktleUluZm8+PGRzOlg1MDlEYXRhPjxkczpYNTA5Q2VydGlmaWNhdGU+TUlJ
60
+ QnJUQ0NBYUdnQXdJQkFnSUJBVEFEQmdFQU1HY3hDekFKQmdOVkJBWVRBbFZU
61
+ TVJNd0VRWURWUVFJREFwRFlXeHBabTl5Ym1saE1SVXdFd1lEVlFRSERBeFRZ
62
+ VzUwWVNCTmIyNXBZMkV4RVRBUEJnTlZCQW9NQ0U5dVpVeHZaMmx1TVJrd0Z3
63
+ WURWUVFEREJCaGNIQXViMjVsYkc5bmFXNHVZMjl0TUI0WERURXdNVEF4TVRJ
64
+ eE1UVXhNbG9YRFRFMU1UQXhNVEl4TVRVeE1sb3daekVMTUFrR0ExVUVCaE1D
65
+ VlZNeEV6QVJCZ05WQkFnTUNrTmhiR2xtYjNKdWFXRXhGVEFUQmdOVkJBY01E
66
+ Rk5oYm5SaElFMXZibWxqWVRFUk1BOEdBMVVFQ2d3SVQyNWxURzluYVc0eEdU
67
+ QVhCZ05WQkFNTUVHRndjQzV2Ym1Wc2IyZHBiaTVqYjIwd2daOHdEUVlKS29a
68
+ SWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFNUG1qZmp5N0wzNW9EcGVCWEJv
69
+ UlZDZ2t0UGtMbm85RE9FV0I3TWdZTU1WS3MyQjZ5bVdRTEVXckR1Z01LMWhr
70
+ eldGaEliNWZxV0xHYld5MEowdmVHUjkvZ0hPUUcrckQvSTM2eEFYbmtkaVhY
71
+ aHpvaUFHL3pReE0wZWRNT1VmNDBuMzE0RkM4bW9FcmNVZzZRYWJ0dHplc081
72
+ OUhGejZzaFB1eGNXYVZBZ3hBZ01CQUFFd0F3WUJBQU1CQUE9PTwvZHM6WDUw
73
+ OUNlcnRpZmljYXRlPjwvZHM6WDUwOURhdGE+PC9kczpLZXlJbmZvPjwvZHM6
74
+ U2lnbmF0dXJlPjxzYW1sOlN1YmplY3Q+PHNhbWw6TmFtZUlEIEZvcm1hdD0i
75
+ dXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6MS4xOm5hbWVpZC1mb3JtYXQ6ZW1h
76
+ aWxBZGRyZXNzIj50ZXN0QG9uZWxvZ2luLmNvbTwvc2FtbDpOYW1lSUQ+PHNh
77
+ bWw6U3ViamVjdENvbmZpcm1hdGlvbiBNZXRob2Q9InVybjpvYXNpczpuYW1l
78
+ czp0YzpTQU1MOjIuMDpjbTpiZWFyZXIiPjxzYW1sOlN1YmplY3RDb25maXJt
79
+ YXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjAxMS0wNi0wNFQwMjoyNzowMloi
80
+ IFJlY2lwaWVudD0icmVjaXBpZW50Ii8+PC9zYW1sOlN1YmplY3RDb25maXJt
81
+ YXRpb24+PC9zYW1sOlN1YmplY3Q+PHNhbWw6Q29uZGl0aW9ucyBOb3RCZWZv
82
+ cmU9IjIwMTEtMDYtMDRUMDI6MTc6MDJaIiBOb3RPbk9yQWZ0ZXI9IjIwMTEt
83
+ MDYtMDRUMDI6Mjc6MDJaIj48c2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPjxz
84
+ YW1sOkF1ZGllbmNlPmF1ZGllbmNlPC9zYW1sOkF1ZGllbmNlPjwvc2FtbDpB
85
+ dWRpZW5jZVJlc3RyaWN0aW9uPjwvc2FtbDpDb25kaXRpb25zPjxzYW1sOkF1
86
+ dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAxMS0wNi0wNFQwMjoyMjow
87
+ MloiIFNlc3Npb25Ob3RPbk9yQWZ0ZXI9IjIwMTEtMDYtMDVUMDI6MjI6MDJa
88
+ IiBTZXNzaW9uSW5kZXg9Il8xNmY1NzBmYmMwMzE1MDA3YTAzNTVkZmVhNmIz
89
+ YzQ2YyI+PHNhbWw6QXV0aG5Db250ZXh0PjxzYW1sOkF1dGhuQ29udGV4dENs
90
+ YXNzUmVmPnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2Vz
91
+ OlBhc3N3b3JkUHJvdGVjdGVkVHJhbnNwb3J0PC9zYW1sOkF1dGhuQ29udGV4
92
+ dENsYXNzUmVmPjwvc2FtbDpBdXRobkNvbnRleHQ+PC9zYW1sOkF1dGhuU3Rh
93
+ dGVtZW50Pjwvc2FtbDpBc3NlcnRpb24+PC9zYW1scDpSZXNwb25zZT4=
@@ -0,0 +1,71 @@
1
+ <?xml version="1.0"?>
2
+ <samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="pfxc32aed67-820f-4296-0c20-205a10dd5787" Version="2.0" IssueInstant="2011-06-17T14:54:14Z" Destination="https://example.hello.com/access/saml" InResponseTo="_57bcbf70-7b1f-012e-c821-782bcb13bb38">
3
+ <saml:Issuer>https://federate.example.net/saml/saml2/idp/metadata.php</saml:Issuer>
4
+ <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
5
+ <ds:SignedInfo>
6
+ <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
7
+ <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
8
+ <ds:Reference URI="#pfxc32aed67-820f-4296-0c20-205a10dd5787">
9
+ <ds:Transforms>
10
+ <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
11
+ <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
12
+ </ds:Transforms>
13
+ <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
14
+ <ds:DigestValue>dVJ592k5xPjCHBCMiJ8eZkPUiT8=</ds:DigestValue>
15
+ </ds:Reference>
16
+ </ds:SignedInfo>
17
+ <ds:SignatureValue>LHNK1FJfcOIUuWVKJmGABQ+W98+pQ==</ds:SignatureValue>
18
+ <ds:KeyInfo>
19
+ <ds:X509Data>
20
+ <ds:X509Certificate>MIIQmS6WmmIht3k=</ds:X509Certificate>
21
+ </ds:X509Data>
22
+ </ds:KeyInfo>
23
+ </ds:Signature>
24
+ <samlp:Status>
25
+ <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
26
+ </samlp:Status>
27
+ <saml:Assertion xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" ID="pfx7841991c-c73f-4035-e2ee-c170c0e1d3e4" Version="2.0" IssueInstant="2011-06-17T14:54:14Z">
28
+ <saml:Issuer>https://federate.example.net/saml/saml2/idp/metadata.php</saml:Issuer>
29
+ <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
30
+ <ds:SignedInfo>
31
+ <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
32
+ <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
33
+ <ds:Reference URI="#pfx7841991c-c73f-4035-e2ee-c170c0e1d3e4">
34
+ <ds:Transforms>
35
+ <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
36
+ <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
37
+ </ds:Transforms>
38
+ <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
39
+ <ds:DigestValue>mi0IAultZkpsZa1XxGx9X4iAPQg=</ds:DigestValue>
40
+ </ds:Reference>
41
+ </ds:SignedInfo>
42
+ <ds:SignatureValue>LqkW39SOYbttYxlGhIBw==</ds:SignatureValue>
43
+ <ds:KeyInfo>
44
+ <ds:X509Data>
45
+ <ds:X509Certificate>MIIGmmIht3k=</ds:X509Certificate>
46
+ </ds:X509Data>
47
+ </ds:KeyInfo>
48
+ </ds:Signature>
49
+ <saml:Subject>
50
+ <saml:NameID SPNameQualifier="hello.com" Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">someone@example.com</saml:NameID>
51
+ <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
52
+ <saml:SubjectConfirmationData NotOnOrAfter="2011-06-17T14:59:14Z" Recipient="https://example.hello.com/access/saml" InResponseTo="_57bcbf70-7b1f-012e-c821-782bcb13bb38"/>
53
+ </saml:SubjectConfirmation>
54
+ </saml:Subject>
55
+ <saml:Conditions NotBefore="2011-06-17T14:53:44Z" NotOnOrAfter="2011-06-17T14:59:14Z">
56
+ <saml:AudienceRestriction>
57
+ <saml:Audience>hello.com</saml:Audience>
58
+ </saml:AudienceRestriction>
59
+ </saml:Conditions>
60
+ <saml:AuthnStatement AuthnInstant="2011-06-17T14:54:07Z" SessionNotOnOrAfter="2011-06-17T22:54:14Z" SessionIndex="_51be37965feb5579d803141076936dc2e9d1d98ebf">
61
+ <saml:AuthnContext>
62
+ <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</saml:AuthnContextClassRef>
63
+ </saml:AuthnContext>
64
+ </saml:AuthnStatement>
65
+ <saml:AttributeStatement>
66
+ <saml:Attribute Name="mail" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic">
67
+ <saml:AttributeValue xsi:type="xs:string">someone@example.com</saml:AttributeValue>
68
+ </saml:Attribute>
69
+ </saml:AttributeStatement>
70
+ </saml:Assertion>
71
+ </samlp:Response>
@@ -0,0 +1 @@
1
+ PHNhbWxwOlJlc3BvbnNlIElEPSJCZWViMzkyYjc1Ny02ZGM3LTRlYjktYmI1Yy03NmU1MTFmZDZiZWIiIElzc3VlSW5zdGFudD0iMjAxMi0xMS0yOFQxODoxMzo0NVoiIFZlcnNpb249IjIuMCIgeG1sbnM9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIHhtbG5zOnNhbWxwPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIHhtbG5zOnhlbmM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZW5jIyI+PFNpZ25hdHVyZSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+PFNpZ25lZEluZm8+PENhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIgLz48U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3JzYS1zaGExIiAvPjxSZWZlcmVuY2UgVVJJPSIjQmVlYjM5MmI3NTctNmRjNy00ZWI5LWJiNWMtNzZlNTExZmQ2YmViIj48VHJhbnNmb3Jtcz48VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmUiIC8+PC9UcmFuc2Zvcm1zPjxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz48RGlnZXN0VmFsdWU+S0RqNHlxK0RDaVVJZVpDZUcyRFhFZWxWVURNPTwvRGlnZXN0VmFsdWU+PC9SZWZlcmVuY2U+PC9TaWduZWRJbmZvPjxTaWduYXR1cmVWYWx1ZT5zTDZjakVJTkt0U2l3THpRamk3RzYvRXVXMytZVXUzOHNUa3A1WnJva2pmUUxxZlZacVE0MDltYXowSU9neDVwWW44TmxrdWpIZUtTQ1N6ME9uRjlLRUxUNEpINi82Sklob0JuSjdiY1JFMG0vSFdEbFhCRGU2V3hkd2w4M1Y2aENKMTZtM25tTHhLTldDRThPU3BuaEdqK3d3UFRxRU56NVRTdGgrbkU1WVcyLzNBU3ZYK3ZENjFBUFNUeWkxWm5CR0huWWRiZVQ5Yk9LUUFVck1kQ1ZwWFlYZlVrK1I5Qkh6U3grR1VaL3RWU01mUjQ0ZE01dlpjTXFnSHhtd1c0eUQrQUVYNVNNQlZEYkdRd1o5dUFnQk14YWtQYjU4VHM1YlVtVUVFUzFDbFV6Zm95S3lvdHR3WmIwSVVsQVh4bSs3RHNpT2tkQ1BTQjhyUDRnMXIvNHc9PTwvU2lnbmF0dXJlVmFsdWU+PEtleUluZm8+PFg1MDlEYXRhPjxYNTA5Q2VydGlmaWNhdGU+TUlJQ1dUQ0NBZ2VnQXdJQkFnSVF5K0lPeGE5UkZZcE1mZjlPYkJMNThqQUpCZ1VyRGdNQ0hRVUFNQll4RkRBU0JnTlZCQU1UQzFKdmIzUWdRV2RsYm1ONU1CNFhEVEV3TURFeU1URTFNREl4TUZvWERUTTVNVEl6TVRJek5UazFPVm93T0RFMk1EUUdBMVVFQXhNdFUwRk5URlJsYzNRdE5qSTVOalF4T0dRdFlUWmpOeTAwTVRoa0xUZzBaV0V0WmpSak1EUmlPV1JrTVdJMk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBM1JtMW9oaEcwdE5XdVRIdnpNYWJaWUgwclJSeUFGQ012Wk9EczBBNVArVjJSYVU2b3IwcmNpREhLQUlhaG5FVGRNcUl0RzhzbEtxeUhRRVAzbXFVTk1adjMrd3ByMVBlV0I2REJZMnBBUmoxM2pQaTUyTjVHSWF2UUtCS0E1OEJBcmtJK0pzQjZmMmpXWXM4c0YyekZ5TUg5aEEvZDJVRm50L1BDWjNBLytUU1FJY3lqTldiUVByZUNDdW1hRUJDVWkvbGRhQ2lZSXM2SUJ5aGdFeXRKYWhTejdPTWVPdWNKanFmUGRHbWlHVzZ1dzRmZmZaR3l1U0k0TC9memFKQTZGdU9XZlZCTUdLb3NoZzQxUnB3U3V1dDRXWU05dXlLZzdYQ1dZbndSL1F3YTJDQmgzdGZHd3E3ME5uMzcyWVdqYkszdU1OU2JzOHlhUGtqb0psLzJRSURBUUFCbzBzd1NUQkhCZ05WSFFFRVFEQStnQkFTNUFrdEJoMGRUd0NOWVNIY0ZtUmpvUmd3RmpFVU1CSUdBMVVFQXhNTFVtOXZkQ0JCWjJWdVkzbUNFQVkzYkFDcUFHU0tFYys0MUtwY05mUXdDUVlGS3c0REFoMEZBQU5CQUM1K2RFaElTbFB4bEZLeDIvQTVXcU9WTWZVVG96N2F6c0k3VDVmMXJkdWhrWXlDVnlvc3RUb3BSQWQrL3JSdzhxYmVGVXhYTVZHK3VHaG5RVlR3N0ljPTwvWDUwOUNlcnRpZmljYXRlPjwvWDUwOURhdGE+PC9LZXlJbmZvPjwvU2lnbmF0dXJlPjxzYW1scDpTdGF0dXM+PHNhbWxwOlN0YXR1c0NvZGUgVmFsdWU9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpzdGF0dXM6U3VjY2VzcyIgLz48L3NhbWxwOlN0YXR1cz48QXNzZXJ0aW9uIElEPSJCZWVhYjUwOTk1My01ZDE0LTQwMDctYTY0NC1mOWFjMmRlOWNlMjIiIElzc3VlSW5zdGFudD0iMjAwMy0wNC0xN1QwMDo0NjowMloiIFZlcnNpb249IjIuMCIgeG1sbnM9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iPjxJc3N1ZXI+QmVlbGluZS5jb20NCiAgICAgICAgICAgICAgICA8L0lzc3Vlcj48U3ViamVjdD48TmFtZUlEIEZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOm5hbWVpZC1mb3JtYXQ6ZW1haWxBZGRyZXNzIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJldm9yLmxpdHRsZUBzdGFyZmllbGR0bXMuY29tDQogICAgICAgICAgICAgICAgICAgICAgICA8L05hbWVJRD48U3ViamVjdENvbmZpcm1hdGlvbiBNZXRob2Q9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpjbTpiZWFyZXIiIC8+PC9TdWJqZWN0PjxDb25kaXRpb25zIE5vdEJlZm9yZT0iMjAxMi0xMS0yOFQxNzo1Mzo0NVoiIE5vdE9uT3JBZnRlcj0iMjAxMi0xMS0yOFQxODozMzo0NVoiPjwvQ29uZGl0aW9ucz48QXV0aG5TdGF0ZW1lbnQgQXV0aG5JbnN0YW50PSIyMDEyLTExLTI4VDE4OjEzOjQ1WiI+PEF1dGhuQ29udGV4dD48QXV0aG5Db250ZXh0Q2xhc3NSZWY+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFjOmNsYXNzZXM6UGFzc3dvcmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9BdXRobkNvbnRleHRDbGFzc1JlZj48L0F1dGhuQ29udGV4dD48L0F1dGhuU3RhdGVtZW50PjwvQXNzZXJ0aW9uPjwvc2FtbHA6UmVzcG9uc2U+
@@ -0,0 +1,150 @@
1
+ 77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjxzYW1s
2
+ cDpSZXNwb25zZSB4bWxuczpzYW1scD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6
3
+ Mi4wOnByb3RvY29sIiB4bWxuczpzYW1sPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FN
4
+ TDoyLjA6YXNzZXJ0aW9uIiBJRD0iXzI2NTAyNGI0NjAyZmM2OGMwMTQ1YzZlOWM1
5
+ NzFkOGY2MjE5ZTZjZmVlMCIgVmVyc2lvbj0iMi4wIiBJc3N1ZUluc3RhbnQ9IjIw
6
+ MTEtMDYtMTNUMTY6MDI6MjVaIiBEZXN0aW5hdGlvbj0iaHR0cDovL2xvY2FsaG9z
7
+ dC9waHAtc2FtbC1maXhlZC9jb25zdW1lLnBocCIgSW5SZXNwb25zZVRvPSJfMzI0
8
+ NDJhOGMzZDFiYThlYTEzNmMiPg0KICA8c2FtbDpJc3N1ZXI+aHR0cHM6Ly9pZHAv
9
+ c2ltcGxlc2FtbC9zYW1sMi9pZHAvbWV0YWRhdGEucGhwPC9zYW1sOklzc3Vlcj4N
10
+ CiAgPHNhbWxwOlN0YXR1cz4NCiAgICA8c2FtbHA6U3RhdHVzQ29kZSBWYWx1ZT0i
11
+ dXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIiAvPg0K
12
+ ICA8L3NhbWxwOlN0YXR1cz4NCiAgPHNhbWw6QXNzZXJ0aW9uIHhtbG5zOnhzaT0i
13
+ aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5z
14
+ OnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgSUQ9Il82M2Iw
15
+ YWVhZWMyYmJiNDU4ZjcxMTUzZjIxODBjNzJjNDM5MzFkM2M5MjAiIFZlcnNpb249
16
+ IjIuMCIgSXNzdWVJbnN0YW50PSIyMDExLTA2LTEzVDE2OjAyOjI1WiI+DQogICAg
17
+ PHNhbWw6SXNzdWVyPmh0dHBzOi8vaWRwL3NpbXBsZXNhbWwvc2FtbDIvaWRwL21l
18
+ dGFkYXRhLnBocDwvc2FtbDpJc3N1ZXI+DQogICAgPHNhbWw6U3ViamVjdD4NCiAg
19
+ ICAgIDxzYW1sOk5hbWVJRCBTUE5hbWVRdWFsaWZpZXI9InBocC1zYW1sLWZpeGVk
20
+ IiBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjEuMTpuYW1laWQtZm9y
21
+ bWF0OmVtYWlsQWRkcmVzcyI+cm9vdEBleGFtcGxlLmNvbTwvc2FtbDpOYW1lSUQ+
22
+ DQogICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9h
23
+ c2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI+DQogICAgICAgIDxzYW1s
24
+ OlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjAxMS0wNi0x
25
+ M1QxNjowNzoyNVoiIFJlY2lwaWVudD0iaHR0cDovL2xvY2FsaG9zdC9waHAtc2Ft
26
+ bC1maXhlZC9jb25zdW1lLnBocCIgSW5SZXNwb25zZVRvPSJfMzI0NDJhOGMzZDFi
27
+ YThlYTEzNmMiIC8+DQogICAgICA8L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj4N
28
+ CiAgICA8L3NhbWw6U3ViamVjdD4NCiAgICA8c2FtbDpDb25kaXRpb25zIE5vdEJl
29
+ Zm9yZT0iMjAxMS0wNi0xM1QxNjowMTo1NVoiIE5vdE9uT3JBZnRlcj0iMjAxMS0w
30
+ Ni0xM1QxNjowNzoyNVoiPg0KICAgICAgPHNhbWw6QXVkaWVuY2VSZXN0cmljdGlv
31
+ bj4NCiAgICAgICAgPHNhbWw6QXVkaWVuY2U+cGhwLXNhbWwtZml4ZWQ8L3NhbWw6
32
+ QXVkaWVuY2U+DQogICAgICA8L3NhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAg
33
+ ICA8L3NhbWw6Q29uZGl0aW9ucz4NCiAgICA8c2FtbDpBdXRoblN0YXRlbWVudCBB
34
+ dXRobkluc3RhbnQ9IjIwMTEtMDYtMTNUMTI6NDc6MzNaIiBTZXNzaW9uTm90T25P
35
+ ckFmdGVyPSIyMDExLTA2LTE0VDAwOjAyOjI1WiIgU2Vzc2lvbkluZGV4PSJfNTk5
36
+ NGFjYjUyODc4MTc4ZjAyYjY2ZTY5M2RlYmUzNDA3MjU3OTZjZDJjIj4NCiAgICAg
37
+ IDxzYW1sOkF1dGhuQ29udGV4dD4NCiAgICAgICAgPHNhbWw6QXV0aG5Db250ZXh0
38
+ Q2xhc3NSZWY+dXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFjOmNsYXNzZXM6
39
+ UGFzc3dvcmQ8L3NhbWw6QXV0aG5Db250ZXh0Q2xhc3NSZWY+DQogICAgICA8L3Nh
40
+ bWw6QXV0aG5Db250ZXh0Pg0KICAgIDwvc2FtbDpBdXRoblN0YXRlbWVudD4NCiAg
41
+ PC9zYW1sOkFzc2VydGlvbj4NCiAgPG1kOkVudGl0eURlc2NyaXB0b3IgeG1sbnM6
42
+ bWQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDptZXRhZGF0YSIgeG1sbnM6
43
+ ZHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiIGVudGl0eUlE
44
+ PSJodHRwczovL2lkcC9zaW1wbGVzYW1sL3NhbWwyL2lkcC9tZXRhZGF0YS5waHAi
45
+ IElEPSJwZng4YjhmZTFkMC0wZjhmLTJlMDAtYTAwOC1iOThiYmM1ZGExZDAiPg0K
46
+ ICAgIDxkczpTaWduYXR1cmU+DQogICAgICA8ZHM6U2lnbmVkSW5mbz4NCiAgICAg
47
+ ICAgPGRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8v
48
+ d3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiIC8+DQogICAgICAgIDxk
49
+ czpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8y
50
+ MDAwLzA5L3htbGRzaWcjcnNhLXNoYTEiIC8+DQogICAgICAgIDxkczpSZWZlcmVu
51
+ Y2UgVVJJPSIjcGZ4OGI4ZmUxZDAtMGY4Zi0yZTAwLWEwMDgtYjk4YmJjNWRhMWQw
52
+ Ij4NCiAgICAgICAgICA8ZHM6VHJhbnNmb3Jtcz4NCiAgICAgICAgICAgIDxkczpU
53
+ cmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3ht
54
+ bGRzaWcjZW52ZWxvcGVkLXNpZ25hdHVyZSIgLz4NCiAgICAgICAgICAgIDxkczpU
55
+ cmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3ht
56
+ bC1leGMtYzE0biMiIC8+DQogICAgICAgICAgPC9kczpUcmFuc2Zvcm1zPg0KICAg
57
+ ICAgICAgIDxkczpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3Lncz
58
+ Lm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4NCiAgICAgICAgICA8ZHM6RGln
59
+ ZXN0VmFsdWU+NVVmdy9lUlMwVHpIbC9vc2pMVCtJOGxlUDZVPTwvZHM6RGlnZXN0
60
+ VmFsdWU+DQogICAgICAgIDwvZHM6UmVmZXJlbmNlPg0KICAgICAgPC9kczpTaWdu
61
+ ZWRJbmZvPg0KICAgICAgPGRzOlNpZ25hdHVyZVZhbHVlPkM0OFpLQ2FwQVdsNHBx
62
+ WlM1ZFhMTmVmdjZSYS9hMXZGSDlGWDZsd3c3RS94VmxtZXFTbHh1WGEra0JicE4r
63
+ RWFzWmJaMGE4blYxTE1oNGN5TER2ajVnVURyYkhvMG1aOVNhRDBZaFhxcnBQY21H
64
+ djVmSGZxZFRtRTVJUUs2MjQ0UkFPdk05MklyYU0vU0hRQ0dROE1hdkhTNSs4Nm11
65
+ MGdkbjVuNWJrcUU1ND08L2RzOlNpZ25hdHVyZVZhbHVlPg0KICAgICAgPGRzOktl
66
+ eUluZm8+DQogICAgICAgIDxkczpYNTA5RGF0YT4NCiAgICAgICAgICA8ZHM6WDUw
67
+ OUNlcnRpZmljYXRlPk1JSUNnVENDQWVvQ0NRQ2JPbHJXRGRYN0ZUQU5CZ2txaGtp
68
+ Rzl3MEJBUVVGQURDQmhERUxNQWtHQTFVRUJoTUNUazh4R0RBV0JnTlZCQWdURDBG
69
+ dVpISmxZWE1nVTI5c1ltVnlaekVNTUFvR0ExVUVCeE1EUm05dk1SQXdEZ1lEVlFR
70
+ S0V3ZFZUa2xPUlZSVU1SZ3dGZ1lEVlFRREV3OW1aV2xrWlM1bGNteGhibWN1Ym04
71
+ eElUQWZCZ2txaGtpRzl3MEJDUUVXRW1GdVpISmxZWE5BZFc1cGJtVjBkQzV1YnpB
72
+ ZUZ3MHdOekEyTVRVeE1qQXhNelZhRncwd056QTRNVFF4TWpBeE16VmFNSUdFTVFz
73
+ d0NRWURWUVFHRXdKT1R6RVlNQllHQTFVRUNCTVBRVzVrY21WaGN5QlRiMnhpWlhK
74
+ bk1Rd3dDZ1lEVlFRSEV3TkdiMjh4RURBT0JnTlZCQW9UQjFWT1NVNUZWRlF4R0RB
75
+ V0JnTlZCQU1URDJabGFXUmxMbVZ5YkdGdVp5NXViekVoTUI4R0NTcUdTSWIzRFFF
76
+ SkFSWVNZVzVrY21WaGMwQjFibWx1WlhSMExtNXZNSUdmTUEwR0NTcUdTSWIzRFFF
77
+ QkFRVUFBNEdOQURDQmlRS0JnUURpdmJoUjdQNTE2eC9TM0JxS3h1cFFlMExPTm9s
78
+ aXVwaUJPZXNDTzNTSGJEcmwzK3E5SWJmbmZtRTA0ck51TWNQc0l4QjE2MVRkRHBJ
79
+ ZXNMQ243YzhhUEhJU0tPdFBsQWVUWlNuYjhRQXU3YVJqWnEzK1BiclA1dVczVGNm
80
+ Q0dQdEtUeXRIT2dlL09sSmJvMDc4ZFZoWFExNGQxRUR3WEpXMXJSWHVVdDRDOFFJ
81
+ REFRQUJNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0JBQ0RWZnA4NkhPYnFZK2U4QlVv
82
+ V1E5K1ZNUXgxQVNEb2hCandPc2cyV3lrVXFSWEYrZExmY1VIOWRXUjYzQ3RaSUtG
83
+ RGJTdE5vbVBuUXo3bmJLK29ueWd3QnNwVkVibkh1VWloWnEzWlVkbXVtUXFDdzRV
84
+ dnMvMVV2cTNvck9vL1dKVmhUeXZMZ0ZWSzJRYXJRNC82N09aZkhkN1IrUE9CWGhv
85
+ cGhTTXYxWk9vPC9kczpYNTA5Q2VydGlmaWNhdGU+DQogICAgICAgIDwvZHM6WDUw
86
+ OURhdGE+DQogICAgICA8L2RzOktleUluZm8+DQogICAgPC9kczpTaWduYXR1cmU+
87
+ DQogICAgPG1kOklEUFNTT0Rlc2NyaXB0b3IgcHJvdG9jb2xTdXBwb3J0RW51bWVy
88
+ YXRpb249InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpwcm90b2NvbCI+DQog
89
+ ICAgICA8bWQ6S2V5RGVzY3JpcHRvciB1c2U9InNpZ25pbmciPg0KICAgICAgICA8
90
+ ZHM6S2V5SW5mbyB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94
91
+ bWxkc2lnIyI+DQogICAgICAgICAgPGRzOlg1MDlEYXRhPg0KICAgICAgICAgICAg
92
+ PGRzOlg1MDlDZXJ0aWZpY2F0ZT5NSUlDZ1RDQ0Flb0NDUUNiT2xyV0RkWDdGVEFO
93
+ QmdrcWhraUc5dzBCQVFVRkFEQ0JoREVMTUFrR0ExVUVCaE1DVGs4eEdEQVdCZ05W
94
+ QkFnVEQwRnVaSEpsWVhNZ1UyOXNZbVZ5WnpFTU1Bb0dBMVVFQnhNRFJtOXZNUkF3
95
+ RGdZRFZRUUtFd2RWVGtsT1JWUlVNUmd3RmdZRFZRUURFdzltWldsa1pTNWxjbXho
96
+ Ym1jdWJtOHhJVEFmQmdrcWhraUc5dzBCQ1FFV0VtRnVaSEpsWVhOQWRXNXBibVYw
97
+ ZEM1dWJ6QWVGdzB3TnpBMk1UVXhNakF4TXpWYUZ3MHdOekE0TVRReE1qQXhNelZh
98
+ TUlHRU1Rc3dDUVlEVlFRR0V3Sk9UekVZTUJZR0ExVUVDQk1QUVc1a2NtVmhjeUJU
99
+ YjJ4aVpYSm5NUXd3Q2dZRFZRUUhFd05HYjI4eEVEQU9CZ05WQkFvVEIxVk9TVTVG
100
+ VkZReEdEQVdCZ05WQkFNVEQyWmxhV1JsTG1WeWJHRnVaeTV1YnpFaE1COEdDU3FH
101
+ U0liM0RRRUpBUllTWVc1a2NtVmhjMEIxYm1sdVpYUjBMbTV2TUlHZk1BMEdDU3FH
102
+ U0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FEaXZiaFI3UDUxNngvUzNCcUt4dXBR
103
+ ZTBMT05vbGl1cGlCT2VzQ08zU0hiRHJsMytxOUliZm5mbUUwNHJOdU1jUHNJeEIx
104
+ NjFUZERwSWVzTENuN2M4YVBISVNLT3RQbEFlVFpTbmI4UUF1N2FSalpxMytQYnJQ
105
+ NXVXM1RjZkNHUHRLVHl0SE9nZS9PbEpibzA3OGRWaFhRMTRkMUVEd1hKVzFyUlh1
106
+ VXQ0QzhRSURBUUFCTUEwR0NTcUdTSWIzRFFFQkJRVUFBNEdCQUNEVmZwODZIT2Jx
107
+ WStlOEJVb1dROStWTVF4MUFTRG9oQmp3T3NnMld5a1VxUlhGK2RMZmNVSDlkV1I2
108
+ M0N0WklLRkRiU3ROb21QblF6N25iSytvbnlnd0JzcFZFYm5IdVVpaFpxM1pVZG11
109
+ bVFxQ3c0VXZzLzFVdnEzb3JPby9XSlZoVHl2TGdGVksyUWFyUTQvNjdPWmZIZDdS
110
+ K1BPQlhob3BoU012MVpPbzwvZHM6WDUwOUNlcnRpZmljYXRlPg0KICAgICAgICAg
111
+ IDwvZHM6WDUwOURhdGE+DQogICAgICAgIDwvZHM6S2V5SW5mbz4NCiAgICAgIDwv
112
+ bWQ6S2V5RGVzY3JpcHRvcj4NCiAgICAgIDxtZDpLZXlEZXNjcmlwdG9yIHVzZT0i
113
+ ZW5jcnlwdGlvbiI+DQogICAgICAgIDxkczpLZXlJbmZvIHhtbG5zOmRzPSJodHRw
114
+ Oi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4NCiAgICAgICAgICA8ZHM6
115
+ WDUwOURhdGE+DQogICAgICAgICAgICA8ZHM6WDUwOUNlcnRpZmljYXRlPk1JSUNn
116
+ VENDQWVvQ0NRQ2JPbHJXRGRYN0ZUQU5CZ2txaGtpRzl3MEJBUVVGQURDQmhERUxN
117
+ QWtHQTFVRUJoTUNUazh4R0RBV0JnTlZCQWdURDBGdVpISmxZWE1nVTI5c1ltVnla
118
+ ekVNTUFvR0ExVUVCeE1EUm05dk1SQXdEZ1lEVlFRS0V3ZFZUa2xPUlZSVU1SZ3dG
119
+ Z1lEVlFRREV3OW1aV2xrWlM1bGNteGhibWN1Ym04eElUQWZCZ2txaGtpRzl3MEJD
120
+ UUVXRW1GdVpISmxZWE5BZFc1cGJtVjBkQzV1YnpBZUZ3MHdOekEyTVRVeE1qQXhN
121
+ elZhRncwd056QTRNVFF4TWpBeE16VmFNSUdFTVFzd0NRWURWUVFHRXdKT1R6RVlN
122
+ QllHQTFVRUNCTVBRVzVrY21WaGN5QlRiMnhpWlhKbk1Rd3dDZ1lEVlFRSEV3Tkdi
123
+ Mjh4RURBT0JnTlZCQW9UQjFWT1NVNUZWRlF4R0RBV0JnTlZCQU1URDJabGFXUmxM
124
+ bVZ5YkdGdVp5NXViekVoTUI4R0NTcUdTSWIzRFFFSkFSWVNZVzVrY21WaGMwQjFi
125
+ bWx1WlhSMExtNXZNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0Jn
126
+ UURpdmJoUjdQNTE2eC9TM0JxS3h1cFFlMExPTm9saXVwaUJPZXNDTzNTSGJEcmwz
127
+ K3E5SWJmbmZtRTA0ck51TWNQc0l4QjE2MVRkRHBJZXNMQ243YzhhUEhJU0tPdFBs
128
+ QWVUWlNuYjhRQXU3YVJqWnEzK1BiclA1dVczVGNmQ0dQdEtUeXRIT2dlL09sSmJv
129
+ MDc4ZFZoWFExNGQxRUR3WEpXMXJSWHVVdDRDOFFJREFRQUJNQTBHQ1NxR1NJYjNE
130
+ UUVCQlFVQUE0R0JBQ0RWZnA4NkhPYnFZK2U4QlVvV1E5K1ZNUXgxQVNEb2hCandP
131
+ c2cyV3lrVXFSWEYrZExmY1VIOWRXUjYzQ3RaSUtGRGJTdE5vbVBuUXo3bmJLK29u
132
+ eWd3QnNwVkVibkh1VWloWnEzWlVkbXVtUXFDdzRVdnMvMVV2cTNvck9vL1dKVmhU
133
+ eXZMZ0ZWSzJRYXJRNC82N09aZkhkN1IrUE9CWGhvcGhTTXYxWk9vPC9kczpYNTA5
134
+ Q2VydGlmaWNhdGU+DQogICAgICAgICAgPC9kczpYNTA5RGF0YT4NCiAgICAgICAg
135
+ PC9kczpLZXlJbmZvPg0KICAgICAgPC9tZDpLZXlEZXNjcmlwdG9yPg0KICAgICAg
136
+ PG1kOlNpbmdsZUxvZ291dFNlcnZpY2UgQmluZGluZz0idXJuOm9hc2lzOm5hbWVz
137
+ OnRjOlNBTUw6Mi4wOmJpbmRpbmdzOkhUVFAtUmVkaXJlY3QiIExvY2F0aW9uPSJo
138
+ dHRwczovL2lkcC9zaW1wbGVzYW1sL3NhbWwyL2lkcC9TaW5nbGVMb2dvdXRTZXJ2
139
+ aWNlLnBocCIgLz4NCiAgICAgIDxtZDpOYW1lSURGb3JtYXQ+dXJuOm9hc2lzOm5h
140
+ bWVzOnRjOlNBTUw6Mi4wOm5hbWVpZC1mb3JtYXQ6dHJhbnNpZW50PC9tZDpOYW1l
141
+ SURGb3JtYXQ+DQogICAgICA8bWQ6U2luZ2xlU2lnbk9uU2VydmljZSBCaW5kaW5n
142
+ PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YmluZGluZ3M6SFRUUC1SZWRp
143
+ cmVjdCIgTG9jYXRpb249Imh0dHBzOi8vaWRwL3NpbXBsZXNhbWwvc2FtbDIvaWRw
144
+ L1NTT1NlcnZpY2UucGhwIiAvPg0KICAgIDwvbWQ6SURQU1NPRGVzY3JpcHRvcj4N
145
+ CiAgICA8bWQ6Q29udGFjdFBlcnNvbiBjb250YWN0VHlwZT0idGVjaG5pY2FsIj4N
146
+ CiAgICAgIDxtZDpHaXZlbk5hbWU+QW5kcmVhczwvbWQ6R2l2ZW5OYW1lPg0KICAg
147
+ ICAgPG1kOlN1ck5hbWU+TWF5ZXI8L21kOlN1ck5hbWU+DQogICAgICA8bWQ6RW1h
148
+ aWxBZGRyZXNzPmFuZHJlYXMubWF5ZXJAd3VlcnRoLmNvbTwvbWQ6RW1haWxBZGRy
149
+ ZXNzPg0KICAgIDwvbWQ6Q29udGFjdFBlcnNvbj4NCiAgPC9tZDpFbnRpdHlEZXNj
150
+ cmlwdG9yPg0KPC9zYW1scDpSZXNwb25zZT4=
@@ -0,0 +1,38 @@
1
+ require 'saml_idp/logout_request_builder'
2
+
3
+ module SamlRequestMacros
4
+
5
+ def make_saml_request(requested_saml_acs_url = "https://foo.example.com/saml/consume")
6
+ auth_request = OneLogin::RubySaml::Authrequest.new
7
+ auth_url = auth_request.create(saml_settings(requested_saml_acs_url))
8
+ CGI.unescape(auth_url.split("=").last)
9
+ end
10
+
11
+ def make_saml_logout_request(requested_saml_logout_url = 'https://foo.example.com/saml/logout')
12
+ request_builder = SamlIdp::LogoutRequestBuilder.new(
13
+ 'some_response_id',
14
+ 'http://example.com',
15
+ requested_saml_logout_url,
16
+ 'some_name_id',
17
+ OpenSSL::Digest::SHA256
18
+ )
19
+ request_builder.encoded
20
+ end
21
+
22
+ def saml_settings(saml_acs_url = "https://foo.example.com/saml/consume")
23
+ settings = OneLogin::RubySaml::Settings.new
24
+ settings.assertion_consumer_service_url = saml_acs_url
25
+ settings.issuer = "http://example.com/issuer"
26
+ settings.idp_sso_target_url = "http://idp.com/saml/idp"
27
+ settings.idp_cert_fingerprint = SamlIdp::Default::FINGERPRINT
28
+ settings.name_identifier_format = SamlIdp::Default::NAME_ID_FORMAT
29
+ settings
30
+ end
31
+
32
+ def print_pretty_xml(xml_string)
33
+ doc = REXML::Document.new xml_string
34
+ outbuf = ""
35
+ doc.write(outbuf, 1)
36
+ puts outbuf
37
+ end
38
+ end
@@ -0,0 +1,61 @@
1
+ module SecurityHelpers
2
+ def fixture(document, base64 = true)
3
+ response = Dir.glob(File.join(File.dirname(__FILE__), "responses", "#{document}*")).first
4
+ if base64 && response =~ /\.xml$/
5
+ Base64.encode64(File.read(response))
6
+ else
7
+ File.read(response)
8
+ end
9
+ end
10
+
11
+ def response_document
12
+ @response_document ||= File.read(File.join(File.dirname(__FILE__), 'responses', 'response1.xml.base64'))
13
+ end
14
+
15
+ def response_document_2
16
+ @response_document2 ||= File.read(File.join(File.dirname(__FILE__), 'responses', 'response2.xml.base64'))
17
+ end
18
+
19
+ def response_document_3
20
+ @response_document3 ||= File.read(File.join(File.dirname(__FILE__), 'responses', 'response3.xml.base64'))
21
+ end
22
+
23
+ def response_document_4
24
+ @response_document4 ||= File.read(File.join(File.dirname(__FILE__), 'responses', 'response4.xml.base64'))
25
+ end
26
+
27
+ def response_document_5
28
+ @response_document5 ||= File.read(File.join(File.dirname(__FILE__), 'responses', 'response5.xml.base64'))
29
+ end
30
+
31
+ def r1_response_document_6
32
+ @response_document6 ||= File.read(File.join(File.dirname(__FILE__), 'responses', 'r1_response6.xml.base64'))
33
+ end
34
+
35
+ def ampersands_response
36
+ @ampersands_resposne ||= File.read(File.join(File.dirname(__FILE__), 'responses', 'response_with_ampersands.xml.base64'))
37
+ end
38
+
39
+ def response_document_6
40
+ doc = Base64.decode64(response_document)
41
+ doc.gsub!(/NotBefore=\"(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z\"/, "NotBefore=\"#{(Time.now-300).getutc.strftime("%Y-%m-%dT%XZ")}\"")
42
+ doc.gsub!(/NotOnOrAfter=\"(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z\"/, "NotOnOrAfter=\"#{(Time.now+300).getutc.strftime("%Y-%m-%dT%XZ")}\"")
43
+ Base64.encode64(doc)
44
+ end
45
+
46
+ def wrapped_response_2
47
+ @wrapped_response_2 ||= File.read(File.join(File.dirname(__FILE__), 'responses', 'wrapped_response_2.xml.base64'))
48
+ end
49
+
50
+ def signature_fingerprint_1
51
+ @signature_fingerprint1 ||= "C5:19:85:D9:47:F1:BE:57:08:20:25:05:08:46:EB:27:F6:CA:B7:83"
52
+ end
53
+
54
+ def signature_1
55
+ @signature1 ||= File.read(File.join(File.dirname(__FILE__), 'certificates', 'certificate1'))
56
+ end
57
+
58
+ def r1_signature_2
59
+ @signature2 ||= File.read(File.join(File.dirname(__FILE__), 'certificates', 'r1_certificate2_base64'))
60
+ end
61
+ end
@@ -0,0 +1,137 @@
1
+ require 'spec_helper'
2
+ require 'xml_security'
3
+
4
+ module SamlIdp
5
+ describe XMLSecurity, security: true do
6
+ let(:document) { XMLSecurity::SignedDocument.new(Base64.decode64(response_document)) }
7
+ let(:base64cert) { document.elements["//ds:X509Certificate"].text }
8
+
9
+ it "it run validate without throwing NS related exceptions" do
10
+ document.validate_doc(base64cert, true).should be_falsey
11
+ end
12
+
13
+ it "it run validate with throwing NS related exceptions" do
14
+ expect { document.validate_doc(base64cert, false) }.to raise_error(SamlIdp::XMLSecurity::SignedDocument::ValidationError)
15
+ end
16
+
17
+ it "not raise an error when softly validating the document multiple times" do
18
+ expect { 2.times { document.validate_doc(base64cert, true) } }.to_not raise_error
19
+ end
20
+
21
+ it "it raise Fingerprint mismatch" do
22
+ expect { document.validate("no:fi:ng:er:pr:in:t", false) }.to(
23
+ raise_error(SamlIdp::XMLSecurity::SignedDocument::ValidationError, "Fingerprint mismatch")
24
+ )
25
+ end
26
+
27
+ it "it raise Digest mismatch" do
28
+ expect { document.validate_doc(base64cert, false) }.to(
29
+ raise_error(SamlIdp::XMLSecurity::SignedDocument::ValidationError, "Digest mismatch")
30
+ )
31
+ end
32
+
33
+ it "it raise Key validation error" do
34
+ response = Base64.decode64(response_document)
35
+ response.sub!("<ds:DigestValue>pJQ7MS/ek4KRRWGmv/H43ReHYMs=</ds:DigestValue>",
36
+ "<ds:DigestValue>b9xsAXLsynugg3Wc1CI3kpWku+0=</ds:DigestValue>")
37
+ document = XMLSecurity::SignedDocument.new(response)
38
+ base64cert = document.elements["//ds:X509Certificate"].text
39
+ expect { document.validate_doc(base64cert, false) }.to(
40
+ raise_error(SamlIdp::XMLSecurity::SignedDocument::ValidationError, "Key validation error")
41
+ )
42
+ end
43
+
44
+ it "raise validation error when the X509Certificate is missing" do
45
+ response = Base64.decode64(response_document)
46
+ response.sub!(/<ds:X509Certificate>.*<\/ds:X509Certificate>/, "")
47
+ document = XMLSecurity::SignedDocument.new(response)
48
+ expect { document.validate("a fingerprint", false) }.to(
49
+ raise_error(
50
+ SamlIdp::XMLSecurity::SignedDocument::ValidationError,
51
+ "Certificate element missing in response (ds:X509Certificate)"
52
+ )
53
+ )
54
+ end
55
+ end
56
+
57
+ describe "Algorithms" do
58
+ it "validate using SHA1" do
59
+ document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_sha1, false))
60
+ document.validate("F1:3C:6B:80:90:5A:03:0E:6C:91:3E:5D:15:FA:DD:B0:16:45:48:72").should be_truthy
61
+ end
62
+
63
+ it "validate using SHA256" do
64
+ document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_sha256, false))
65
+ document.validate("28:74:9B:E8:1F:E8:10:9C:A8:7C:A9:C3:E3:C5:01:6C:92:1C:B4:BA").should be_truthy
66
+ end
67
+
68
+ it "validate using SHA384" do
69
+ document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_sha384, false))
70
+ document.validate("F1:3C:6B:80:90:5A:03:0E:6C:91:3E:5D:15:FA:DD:B0:16:45:48:72").should be_truthy
71
+ end
72
+
73
+ it "validate using SHA512" do
74
+ document = XMLSecurity::SignedDocument.new(fixture(:adfs_response_sha512, false))
75
+ document.validate("F1:3C:6B:80:90:5A:03:0E:6C:91:3E:5D:15:FA:DD:B0:16:45:48:72").should be_truthy
76
+ end
77
+ end
78
+
79
+ describe "XmlSecurity::SignedDocument" do
80
+ describe "#extract_inclusive_namespaces" do
81
+ it "support explicit namespace resolution for exclusive canonicalization" do
82
+ response = fixture(:open_saml_response, false)
83
+ document = XMLSecurity::SignedDocument.new(response)
84
+ inclusive_namespaces = document.send(:extract_inclusive_namespaces)
85
+
86
+ inclusive_namespaces.should == %w[xs]
87
+ end
88
+
89
+ it "support implicit namespace resolution for exclusive canonicalization" do
90
+ response = fixture(:no_signature_ns, false)
91
+ document = XMLSecurity::SignedDocument.new(response)
92
+ inclusive_namespaces = document.send(:extract_inclusive_namespaces)
93
+
94
+ inclusive_namespaces.should == %w[#default saml ds xs xsi]
95
+ end
96
+
97
+ it "return an empty list when inclusive namespace element is missing" do
98
+ response = fixture(:no_signature_ns, false)
99
+ response.slice! %r{<InclusiveNamespaces xmlns="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="#default saml ds xs xsi"/>}
100
+
101
+ document = XMLSecurity::SignedDocument.new(response)
102
+ inclusive_namespaces = document.send(:extract_inclusive_namespaces)
103
+
104
+ inclusive_namespaces.should be_empty
105
+ end
106
+ end
107
+
108
+ describe "StarfieldTMS" do
109
+ let(:response) { ::OneLogin::RubySaml::Response.new(fixture(:starfield_response)) }
110
+
111
+ before do
112
+ response.settings = ::OneLogin::RubySaml::Settings.new(
113
+ :idp_cert_fingerprint => "8D:BA:53:8E:A3:B6:F9:F1:69:6C:BB:D9:D8:BD:41:B3:AC:4F:9D:4D"
114
+ )
115
+ end
116
+
117
+ it "be able to validate a good response" do
118
+ Timecop.freeze Time.parse('2012-11-28 17:55:00 UTC') do
119
+ response.stub(:validate_subject_confirmation).and_return(true)
120
+ response.should be_is_valid
121
+ end
122
+ end
123
+
124
+ it "fail before response is valid" do
125
+ Timecop.freeze Time.parse('2012-11-20 17:55:00 UTC') do
126
+ response.should_not be_is_valid
127
+ end
128
+ end
129
+
130
+ it "fail after response expires" do
131
+ Timecop.freeze Time.parse('2012-11-30 17:55:00 UTC') do
132
+ response.should_not be_is_valid
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end