Skip to content

Commit 8c491d5

Browse files
committed
Improve how fingerprint is calcultated
1 parent 47cc109 commit 8c491d5

File tree

3 files changed

+33
-24
lines changed

3 files changed

+33
-24
lines changed

lib/Saml2/Utils.php

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -727,7 +727,7 @@ public static function parseDuration($duration, $timestamp = null)
727727

728728
/* Parse the duration. We use a very strict pattern. */
729729
$durationRegEx = '#^(-?)P(?:(?:(?:(\\d+)Y)?(?:(\\d+)M)?(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+)S)?)?)|(?:(\\d+)W))$#D';
730-
$matches = array();
730+
$matches = array();
731731
if (!preg_match($durationRegEx, $duration, $matches)) {
732732
throw new Exception('Invalid ISO 8601 duration: ' . $duration);
733733
}
@@ -894,27 +894,30 @@ public static function calculateX509Fingerprint($x509cert, $alg = 'sha1')
894894
{
895895
assert('is_string($x509cert)');
896896

897-
$lines = explode("\n", $x509cert);
898-
897+
$arCert = explode("\n", $x509cert);
899898
$data = '';
900-
901-
foreach ($lines as $line) {
902-
/* Remove '\r' from end of line if present. */
903-
$line = rtrim($line);
904-
if ($line === '-----BEGIN CERTIFICATE-----') {
905-
/* Delete junk from before the certificate. */
906-
$data = '';
907-
} elseif ($line === '-----END CERTIFICATE-----') {
908-
/* Ignore data after the certificate. */
909-
break;
910-
} elseif ($line === '-----BEGIN PUBLIC KEY-----' || $line === '-----BEGIN RSA PRIVATE KEY-----') {
911-
/* This isn't an X509 certificate. */
912-
return null;
899+
$inData = false;
900+
901+
foreach ($arCert as $curData) {
902+
if (! $inData) {
903+
if (strncmp($curData, '-----BEGIN CERTIFICATE', 22) == 0) {
904+
$inData = true;
905+
} elseif ((strncmp($curData, '-----BEGIN PUBLIC KEY', 21) == 0) || (strncmp($curData, '-----BEGIN RSA PRIVATE KEY', 26) == 0)) {
906+
/* This isn't an X509 certificate. */
907+
return null;
908+
}
913909
} else {
914-
/* Append the current line to the certificate data. */
915-
$data .= $line;
910+
if (strncmp($curData, '-----END CERTIFICATE', 20) == 0) {
911+
break;
912+
}
913+
$data .= trim($curData);
916914
}
917915
}
916+
917+
if (empty($data)) {
918+
return null;
919+
}
920+
918921
$decodedData = base64_decode($data);
919922

920923
switch ($alg) {
@@ -1185,6 +1188,7 @@ public static function castKey(XMLSecurityKey $key, $algorithm, $type = 'public'
11851188
if ($key->type === $algorithm) {
11861189
return $key;
11871190
}
1191+
11881192
$keyInfo = openssl_pkey_get_details($key->key);
11891193
if ($keyInfo === false) {
11901194
throw new Exception('Unable to get key details from XMLSecurityKey.');

tests/src/OneLogin/Saml2/ResponseTest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1475,7 +1475,8 @@ public function testIsValid2()
14751475

14761476
$settingsDir = TEST_ROOT .'/settings/';
14771477
include $settingsDir.'settings1.php';
1478-
$settingsInfo['idp']['certFingerprint'] = OneLogin_Saml2_Utils::calculateX509Fingerprint($settingsInfo['idp']['x509cert']);
1478+
$cert = OneLogin_Saml2_Utils::formatCert($settingsInfo['idp']['x509cert']);
1479+
$settingsInfo['idp']['certFingerprint'] = OneLogin_Saml2_Utils::calculateX509Fingerprint($cert);
14791480
$settingsInfo['idp']['x509cert'] = null;
14801481

14811482
$settings = new OneLogin_Saml2_Settings($settingsInfo);

tests/src/OneLogin/Saml2/UtilsTest.php

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ public function testSetBaseURL()
455455
$this->assertNull(OneLogin_Saml2_Utils::getSelfPort());
456456
$this->assertNull(OneLogin_Saml2_Utils::getBaseURLPath());
457457

458-
$this->assertEquals($expectedUrlNQ, OneLogin_Saml2_Utils::getSelfURLNoQuery());
458+
$this->assertEquals($expectedUrlNQ, OneLogin_Saml2_Utils::getSelfURLNoQuery());
459459
$this->assertEquals($expectedRoutedUrlNQ, OneLogin_Saml2_Utils::getSelfRoutedURLNoQuery());
460460
$this->assertEquals($expectedUrl, OneLogin_Saml2_Utils::getSelfURL());
461461

@@ -469,14 +469,14 @@ public function testSetBaseURL()
469469
$this->assertEquals('81', OneLogin_Saml2_Utils::getSelfPort());
470470
$this->assertEquals('/example2/', OneLogin_Saml2_Utils::getBaseURLPath());
471471

472-
$this->assertEquals($expectedUrlNQ2, OneLogin_Saml2_Utils::getSelfURLNoQuery());
472+
$this->assertEquals($expectedUrlNQ2, OneLogin_Saml2_Utils::getSelfURLNoQuery());
473473
$this->assertEquals($expectedRoutedUrlNQ2, OneLogin_Saml2_Utils::getSelfRoutedURLNoQuery());
474474
$this->assertEquals($expectedUrl2, OneLogin_Saml2_Utils::getSelfURL());
475475

476476
$_SERVER['PATH_INFO'] = '/test';
477477
$expectedUrlNQ2 = 'http://anothersp.example.com:81/example2/route.php/test';
478478

479-
$this->assertEquals($expectedUrlNQ2, OneLogin_Saml2_Utils::getSelfURLNoQuery());
479+
$this->assertEquals($expectedUrlNQ2, OneLogin_Saml2_Utils::getSelfURLNoQuery());
480480
$this->assertEquals($expectedRoutedUrlNQ2, OneLogin_Saml2_Utils::getSelfRoutedURLNoQuery());
481481
$this->assertEquals($expectedUrl2, OneLogin_Saml2_Utils::getSelfURL());
482482
}
@@ -929,7 +929,6 @@ public function testDeleteLocalSession()
929929
// Can't test that on TRAVIS
930930
$this->markTestSkipped("Can't test that on TRAVIS");
931931
} else {
932-
933932
if (!isset($_SESSION)) {
934933
$_SESSION = array();
935934
}
@@ -964,7 +963,6 @@ public function testisSessionStarted()
964963
// Can't test that on TRAVIS
965964
$this->markTestSkipped("Can't test that on TRAVIS");
966965
} else {
967-
968966
$this->assertFalse(OneLogin_Saml2_Utils::isSessionStarted());
969967

970968
$prev = error_reporting(0);
@@ -994,6 +992,12 @@ public function testCalculateX509Fingerprint()
994992

995993
$this->assertNull(OneLogin_Saml2_Utils::calculateX509Fingerprint($key));
996994

995+
$this->assertNull(OneLogin_Saml2_Utils::calculateX509Fingerprint(""));
996+
997+
$this->assertNull(OneLogin_Saml2_Utils::calculateX509Fingerprint($settingsInfo['idp']['x509cert']));
998+
999+
$this->assertEquals('afe71c28ef740bc87425be13a2263d37971da1f9', OneLogin_Saml2_Utils::calculateX509Fingerprint(OneLogin_Saml2_Utils::formatCert($settingsInfo['idp']['x509cert'])));
1000+
9971001
$this->assertEquals('afe71c28ef740bc87425be13a2263d37971da1f9', OneLogin_Saml2_Utils::calculateX509Fingerprint($cert));
9981002

9991003
$this->assertEquals('afe71c28ef740bc87425be13a2263d37971da1f9', OneLogin_Saml2_Utils::calculateX509Fingerprint($cert, 'sha1'));

0 commit comments

Comments
 (0)