Skip to content
Snippets Groups Projects
Commit bfee6397 authored by Olav Morken's avatar Olav Morken
Browse files

SAMLParser: Extract raw certificate data from metadata

git-svn-id: https://simplesamlphp.googlecode.com/svn/trunk@927 44740490-163a-0410-bde0-09ae8108e29a
parent a577a2bf
No related branches found
No related tags found
No related merge requests found
......@@ -408,6 +408,7 @@ class SimpleSAML_Metadata_SAMLParser {
* - 'entityid': The entity id of the entity described in the metadata.
* - 'AssertionConsumerService': String with the url of the assertion consumer service which supports
* the browser-post binding.
* - 'certData': X509Certificate for entity (if present).
*
* Metadata must be loaded with one of the parse functions before this function can be called.
*
......@@ -444,6 +445,21 @@ class SimpleSAML_Metadata_SAMLParser {
$ret['AssertionConsumerService'] = $acs['location'];
/* Add certificate data. Only the first valid certificate will be added. */
foreach($spd['keys'] as $key) {
if($key['type'] !== 'X509Certificate') {
continue;
}
$certData = base64_decode($key['X509Certificate']);
if($certData === FALSE) {
/* Empty/invalid certificate. */
continue;
}
$ret['certData'] = str_replace(array("\r", "\n"), '', $key['X509Certificate']);
break;
}
/* Add organization info. */
$this->addOrganizationInfo($ret);
......@@ -459,6 +475,7 @@ class SimpleSAML_Metadata_SAMLParser {
* - 'name': Autogenerated name for this entity. Currently set to the entity id.
* - 'SingleSignOnService': String with the url of the SSO service which supports the redirect binding.
* - 'SingleLogoutService': String with the url where we should send logout requests/responses.
* - 'certData': X509Certificate for entity (if present).
* - 'certFingerprint': Fingerprint of the X509Certificate from the metadata.
*
* Metadata must be loaded with one of the parse functions before this function can be called.
......@@ -495,7 +512,7 @@ class SimpleSAML_Metadata_SAMLParser {
}
$ret['SingleSignOnService'] = $sso['location'];
/* Find the certificate fingerprints. */
/* Add certificate to metadata. Only the first valid certificate will be added. */
$ret['certFingerprint'] = array();
foreach($idp['keys'] as $key) {
if($key['type'] !== 'X509Certificate') {
......@@ -504,16 +521,12 @@ class SimpleSAML_Metadata_SAMLParser {
$certData = base64_decode($key['X509Certificate']);
if($certData === FALSE) {
/* Empty/invalid certificate. */
continue;
/*
* At 2008-06-18 we removed the requirement for certificate to be emedded in metadata. Instead
* of throwing an exception which caused the whole parsing to crash, we just skip adding the
* certificate fingerprint for this entity.
*
* throw new Exception('Unable to parse base64 encoded certificate data.');
*/
}
/* Add the certificate data to the metadata. Only the first certificate will be added. */
$ret['certData'] = str_replace(array("\r", "\n"), '', $key['X509Certificate']);
$ret['certFingerprint'][] = sha1($certData);
break;
}
......@@ -534,6 +547,7 @@ class SimpleSAML_Metadata_SAMLParser {
* the browser-post binding.
* - 'SingleLogoutService': String with the url where we should send logout requests/responses.
* - 'NameIDFormat': The name ID format this SP expects. This may be unset.
* - 'certData': X509Certificate for entity (if present).
*
* Metadata must be loaded with one of the parse functions before this function can be called.
*
......@@ -584,6 +598,22 @@ class SimpleSAML_Metadata_SAMLParser {
$ret['NameIDFormat'] = $spd['nameIDFormats'][0];
}
/* Add certificate data. Only the first valid certificate will be added. */
foreach($idp['keys'] as $key) {
if($key['type'] !== 'X509Certificate') {
continue;
}
$certData = base64_decode($key['X509Certificate']);
if($certData === FALSE) {
/* Empty/invalid certificate. */
continue;
}
$ret['certData'] = str_replace(array("\r", "\n"), '', $key['X509Certificate']);
break;
}
/* Add organization info. */
$this->addOrganizationInfo($ret);
......@@ -601,6 +631,7 @@ class SimpleSAML_Metadata_SAMLParser {
* - 'SingleLogoutService': String with the url where we should send logout requests(/responses).
* - 'SingleLogoutServiceResponse': String where we should send logout responses (if this is different from
* the 'SingleLogoutService' endpoint.
* - 'certData': X509Certificate for entity (if present).
* - 'certFingerprint': Fingerprint of the X509Certificate from the metadata.
*
* Metadata must be loaded with one of the parse functions before this function can be called.
......@@ -650,7 +681,7 @@ class SimpleSAML_Metadata_SAMLParser {
}
/* Find the certificate fingerprint. */
/* Add certificate to metadata. Only the first valid certificate will be added. */
$ret['certFingerprint'] = array();
foreach($idp['keys'] as $key) {
if($key['type'] !== 'X509Certificate') {
......@@ -659,9 +690,12 @@ class SimpleSAML_Metadata_SAMLParser {
$certData = base64_decode($key['X509Certificate']);
if($certData === FALSE) {
throw new Exception('Unable to parse base64 encoded certificate data.');
/* Empty/invalid certificate. */
continue;
}
/* Add the certificate data to the metadata. Only the first certificate will be added. */
$ret['certData'] = str_replace(array("\r", "\n"), '', $key['X509Certificate']);
$ret['certFingerprint'][] = sha1($certData);
break;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment