Skip to content

Commit 68dd8a9

Browse files
committed
Improve how fingerprint is calcultated
1 parent a62a6bf commit 68dd8a9

3 files changed

Lines changed: 29 additions & 19 deletions

File tree

lib/Saml2/Utils.php

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -902,7 +902,7 @@ public static function deleteLocalSession()
902902
/**
903903
* Calculates the fingerprint of a x509cert.
904904
*
905-
* @param string $x509cert x509 cert
905+
* @param string $x509cert x509 cert formatted
906906
* @param string $alg Algorithm to be used in order to calculate the fingerprint
907907
*
908908
* @return null|string Formatted fingerprint
@@ -911,27 +911,30 @@ public static function calculateX509Fingerprint($x509cert, $alg = 'sha1')
911911
{
912912
assert(is_string($x509cert));
913913

914-
$lines = explode("\n", $x509cert);
915-
914+
$arCert = explode("\n", $x509cert);
916915
$data = '';
917-
918-
foreach ($lines as $line) {
919-
/* Remove '\r' from end of line if present. */
920-
$line = rtrim($line);
921-
if ($line === '-----BEGIN CERTIFICATE-----') {
922-
/* Delete junk from before the certificate. */
923-
$data = '';
924-
} elseif ($line === '-----END CERTIFICATE-----') {
925-
/* Ignore data after the certificate. */
926-
break;
927-
} elseif ($line === '-----BEGIN PUBLIC KEY-----' || $line === '-----BEGIN RSA PRIVATE KEY-----') {
928-
/* This isn't an X509 certificate. */
929-
return null;
916+
$inData = false;
917+
918+
foreach ($arCert as $curData) {
919+
if (! $inData) {
920+
if (strncmp($curData, '-----BEGIN CERTIFICATE', 22) == 0) {
921+
$inData = true;
922+
} elseif ((strncmp($curData, '-----BEGIN PUBLIC KEY', 21) == 0) || (strncmp($curData, '-----BEGIN RSA PRIVATE KEY', 26) == 0)) {
923+
/* This isn't an X509 certificate. */
924+
return null;
925+
}
930926
} else {
931-
/* Append the current line to the certificate data. */
932-
$data .= $line;
927+
if (strncmp($curData, '-----END CERTIFICATE', 20) == 0) {
928+
break;
929+
}
930+
$data .= trim($curData);
933931
}
934932
}
933+
934+
if (empty($data)) {
935+
return null;
936+
}
937+
935938
$decodedData = base64_decode($data);
936939

937940
switch ($alg) {

tests/src/OneLogin/Saml2/ResponseTest.php

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

14571457
$settingsDir = TEST_ROOT .'/settings/';
14581458
include $settingsDir.'settings1.php';
1459-
$settingsInfo['idp']['certFingerprint'] = OneLogin_Saml2_Utils::calculateX509Fingerprint($settingsInfo['idp']['x509cert']);
1459+
$cert = OneLogin_Saml2_Utils::formatCert($settingsInfo['idp']['x509cert']);
1460+
$settingsInfo['idp']['certFingerprint'] = OneLogin_Saml2_Utils::calculateX509Fingerprint($cert);
14601461
$settingsInfo['idp']['x509cert'] = null;
14611462

14621463
$settings = new OneLogin_Saml2_Settings($settingsInfo);

tests/src/OneLogin/Saml2/UtilsTest.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -958,6 +958,12 @@ public function testCalculateX509Fingerprint()
958958

959959
$this->assertNull(OneLogin_Saml2_Utils::calculateX509Fingerprint($key));
960960

961+
$this->assertNull(OneLogin_Saml2_Utils::calculateX509Fingerprint(""));
962+
963+
$this->assertNull(OneLogin_Saml2_Utils::calculateX509Fingerprint($settingsInfo['idp']['x509cert']));
964+
965+
$this->assertEquals('afe71c28ef740bc87425be13a2263d37971da1f9', OneLogin_Saml2_Utils::calculateX509Fingerprint(OneLogin_Saml2_Utils::formatCert($settingsInfo['idp']['x509cert'])));
966+
961967
$this->assertEquals('afe71c28ef740bc87425be13a2263d37971da1f9', OneLogin_Saml2_Utils::calculateX509Fingerprint($cert));
962968

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

0 commit comments

Comments
 (0)