Skip to content

Commit f485367

Browse files
author
Mihkel Kivisild
committed
Harmonizing the PHP library with Java library
WE2-971 Signed-off-by: Mihkel Kivisild <[email protected]>
1 parent a937108 commit f485367

File tree

11 files changed

+51
-64
lines changed

11 files changed

+51
-64
lines changed

example/src/Auth.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,11 @@ public function getNonce()
8787

8888
private function getPrincipalNameFromCertificate(X509 $userCertificate): string
8989
{
90-
try {
91-
return CertificateData::getSubjectGivenName($userCertificate) . " " . CertificateData::getSubjectSurname($userCertificate);
92-
} catch (Exception $e) {
90+
$givenName = CertificateData::getSubjectGivenName($userCertificate);
91+
$surname = CertificateData::getSubjectSurname($userCertificate);
92+
if ($givenName && $surname) {
93+
return $givenName . " " . $surname;
94+
} else {
9395
return CertificateData::getSubjectCN($userCertificate);
9496
}
9597
}

src/authtoken/WebEidAuthToken.php

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,6 @@ class WebEidAuthToken
4848
* @var string Format
4949
*/
5050
private ?string $format = null;
51-
/**
52-
* @var string App version
53-
*/
54-
private ?string $appVersion = null;
5551

5652
public function __construct(string $authenticationTokenJSON)
5753
{
@@ -76,10 +72,6 @@ public function __construct(string $authenticationTokenJSON)
7672
if (isset($jsonDecoded['format'])) {
7773
$this->format = $this->filterString('format', $jsonDecoded['format']);
7874
}
79-
// appVersion
80-
if (isset($jsonDecoded['appVersion'])) {
81-
$this->appVersion = $this->filterString('appVersion', $jsonDecoded['appVersion']);
82-
}
8375
}
8476

8577
public function getUnverifiedCertificate(): ?string
@@ -102,11 +94,6 @@ public function getFormat(): ?string
10294
return $this->format;
10395
}
10496

105-
public function getAppVersion(): ?string
106-
{
107-
return $this->appVersion;
108-
}
109-
11097
private function filterString(string $key, $data): string
11198
{
11299
$type = gettype($data);

src/certificate/CertificateData.php

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
namespace web_eid\web_eid_authtoken_validation_php\certificate;
2828

2929
use phpseclib3\File\X509;
30-
use UnexpectedValueException;
3130
use BadFunctionCallException;
3231

3332
final class CertificateData
@@ -40,66 +39,56 @@ public function __construct()
4039

4140
/**
4241
* Get commonName from x509 certificate
43-
*
44-
* @throws UnexpectedValueException
4542
*/
46-
public static function getSubjectCN(X509 $certificate): string
43+
public static function getSubjectCN(X509 $certificate): ?string
4744
{
4845
return self::getField($certificate, 'id-at-commonName');
4946
}
5047

5148
/**
5249
* Get surname from x509 certificate
53-
*
54-
* @throws UnexpectedValueException
5550
*/
56-
public static function getSubjectSurname(X509 $certificate): string
51+
public static function getSubjectSurname(X509 $certificate): ?string
5752
{
5853
return self::getField($certificate, 'id-at-surname');
5954
}
6055

6156
/**
6257
* Get given name from x509 certificate
63-
*
64-
* @throws UnexpectedValueException
6558
*/
66-
public static function getSubjectGivenName(X509 $certificate): string
59+
public static function getSubjectGivenName(X509 $certificate): ?string
6760
{
6861
return self::getField($certificate, 'id-at-givenName');
6962
}
7063

7164
/**
7265
* Get serialNumber (ID-code) from x509 certificate
73-
*
74-
* @throws UnexpectedValueException
7566
*/
76-
public static function getSubjectIdCode(X509 $certificate): string
67+
public static function getSubjectIdCode(X509 $certificate): ?string
7768
{
7869
return self::getField($certificate, 'id-at-serialNumber');
7970
}
8071

8172
/**
8273
* Get country code from x509 certificate
83-
*
84-
* @throws UnexpectedValueException
8574
*/
86-
public static function getSubjectCountryCode(X509 $certificate): string
75+
public static function getSubjectCountryCode(X509 $certificate): ?string
8776
{
8877
return self::getField($certificate, 'id-at-countryName');
8978
}
9079

9180
/**
9281
* Get specified subject field from x509 certificate
9382
*
94-
* @throws UnexpectedValueException field identifier not found
95-
* @return string
83+
* @return ?string
9684
*/
97-
private static function getField(X509 $certificate, string $fieldId): string
85+
private static function getField(X509 $certificate, string $fieldId): ?string
9886
{
9987
$result = $certificate->getSubjectDNProp($fieldId);
10088
if ($result) {
101-
return $result[0];
89+
return join(", ", $result);
90+
} else {
91+
return null;
10292
}
103-
throw new UnexpectedValueException("fieldId " . $fieldId . " not found in certificate subject");
10493
}
10594
}

src/validator/AuthTokenSignatureValidator.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,19 +54,19 @@ public function __construct(Uri $siteOrigin)
5454

5555
public function validate(string $algorithm, string $signature, $publicKey, string $currentChallengeNonce): void
5656
{
57-
$this->requireNotEmpty($algorithm, "algorithm");
58-
$this->requireNotEmpty($signature, "signature");
59-
60-
if (is_null($publicKey)) {
61-
throw new InvalidArgumentException("Public key is null");
62-
}
63-
6457
if (empty($currentChallengeNonce)) {
6558
throw new ChallengeNullOrEmptyException();
6659
}
60+
61+
if (is_null($publicKey)) {
62+
throw new InvalidArgumentException("Public key is null");
63+
}
64+
65+
$this->requireNotEmpty($algorithm, "algorithm");
66+
$this->requireNotEmpty($signature, "signature");
6767

6868
if (!in_array($algorithm, self::ALLOWED_SIGNATURE_ALGORITHMS)) {
69-
throw new AuthTokenParseException("Invalid signature algorithm");
69+
throw new AuthTokenParseException("Unsupported signature algorithm");
7070
}
7171

7272
$decodedSignature = base64_decode($signature);

src/validator/ocsp/OcspRequestBuilder.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
namespace web_eid\web_eid_authtoken_validation_php\validator\ocsp;
2828

29+
use InvalidArgumentException;
2930
use web_eid\web_eid_authtoken_validation_php\ocsp\OcspRequest;
3031
use web_eid\web_eid_authtoken_validation_php\util\SecureRandom;
3132

@@ -58,6 +59,9 @@ public function enableOcspNonce(bool $ocspNonceEnabled): OcspRequestBuilder
5859
public function build(): OcspRequest
5960
{
6061
$ocspRequest = new OcspRequest();
62+
if (is_null($this->certificateId)) {
63+
throw new InvalidArgumentException("Certificate Id must not be null");
64+
}
6165
$ocspRequest->addCertificateId($this->certificateId);
6266

6367
if ($this->ocspNonceEnabled) {

src/validator/ocsp/OcspServiceProvider.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
namespace web_eid\web_eid_authtoken_validation_php\validator\ocsp;
2828

29+
use InvalidArgumentException;
2930
use phpseclib3\File\X509;
3031
use web_eid\web_eid_authtoken_validation_php\validator\ocsp\service\AiaOcspService;
3132
use web_eid\web_eid_authtoken_validation_php\validator\ocsp\service\AiaOcspServiceConfiguration;
@@ -41,7 +42,8 @@ class OcspServiceProvider
4142
public function __construct(?DesignatedOcspServiceConfiguration $designatedOcspServiceConfiguration, AiaOcspServiceConfiguration $aiaOcspServiceConfiguration)
4243
{
4344
$this->designatedOcspService = !is_null($designatedOcspServiceConfiguration) ? new DesignatedOcspService($designatedOcspServiceConfiguration) : null;
44-
$this->aiaOcspServiceConfiguration = $aiaOcspServiceConfiguration;
45+
$this->aiaOcspServiceConfiguration = $aiaOcspServiceConfiguration ?? throw new InvalidArgumentException("AIA Ocsp Service Configuration must not be null");
46+
4547
}
4648

4749
/**

src/validator/ocsp/OcspUrl.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
use phpseclib3\File\X509;
2929
use GuzzleHttp\Psr7\Uri;
3030
use Exception;
31+
use InvalidArgumentException;
3132

3233
final class OcspUrl
3334
{
@@ -43,6 +44,9 @@ public function __construct()
4344
*/
4445
public static function getOcspUri(X509 $certificate): ?Uri
4546
{
47+
if (is_null($certificate)) {
48+
throw new InvalidArgumentException("Certificate must not be null");
49+
}
4650
$authorityInformationAccess = $certificate->getExtension("id-pe-authorityInfoAccess");
4751
if ($authorityInformationAccess) {
4852
foreach ($authorityInformationAccess as $accessDescription) {

src/validator/ocsp/service/AiaOcspService.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
use DateTime;
3636
use web_eid\web_eid_authtoken_validation_php\validator\ocsp\OcspResponseValidator;
3737
use Exception;
38+
use InvalidArgumentException;
3839

3940
/**
4041
* An OCSP service that uses the responders from the Certificates' Authority Information Access (AIA) extension.
@@ -48,6 +49,9 @@ class AiaOcspService implements OcspService
4849

4950
public function __construct(AiaOcspServiceConfiguration $configuration, X509 $certificate)
5051
{
52+
if (is_null($configuration)) {
53+
throw new InvalidArgumentException("Configuration cannot be null");
54+
}
5155
$this->url = self::getOcspAiaUrlFromCertificate($certificate);
5256
$this->trustedCACertificates = $configuration->getTrustedCACertificates();
5357
$this->supportsNonce = !in_array($this->url->jsonSerialize(), $configuration->getNonceDisabledOcspUrls()->getUrlsArray());

tests/authtoken/WebEidAuthTokenTest.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ public function testValidateAuthTokenParameters(): void
4848
$this->assertEquals("RS256", $authToken->getAlgorithm());
4949
$this->assertEquals("HBjNXIaUskXbfhzYQHvwjKDUWfNu4yxXZh", $authToken->getSignature());
5050
$this->assertEquals("web-eid:1.0", $authToken->getFormat());
51-
$this->assertEquals("https://web-eid.eu/web-eid-app/releases/v2.0.0", $authToken->getAppVersion());
5251
}
5352

5453
public function testWhenNotAuthToken(): void

tests/certificate/CertificateDataTest.php

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -49,28 +49,24 @@ public function testWhenOrganizationCertificateThenSubjectCNAndIdCodeAndCountryC
4949
$this->assertEquals("EE", CertificateData::getSubjectCountryCode($cert));
5050
}
5151

52-
public function testWhenOrganizationCertificateThenSubjectGivenNameExtractionFails(): void
52+
public function testWhenOrganizationCertificateThenSubjectGivenNameAndSurnameAreEmpty(): void
5353
{
5454
$cert = Certificates::getOrganizationCert();
55-
$this->expectException(UnexpectedValueException::class);
56-
$this->expectExceptionMessage("fieldId id-at-givenName not found in certificate subject");
57-
CertificateData::getSubjectGivenName($cert);
58-
}
59-
60-
public function testWhenOrganizationCertificateThenSubjectSurnameExtractionFails(): void
61-
{
62-
$cert = Certificates::getOrganizationCert();
63-
$this->expectException(UnexpectedValueException::class);
64-
$this->expectExceptionMessage("fieldId id-at-surname not found in certificate subject");
65-
CertificateData::getSubjectSurname($cert);
55+
$givenName = CertificateData::getSubjectGivenName($cert);
56+
$surname = CertificateData::getSubjectSurname($cert);
57+
$this->assertEmpty($givenName);
58+
$this->assertEmpty($surname);
6659
}
6760

6861
public function testWhenOrganizationCertificateThenSucceeds(): void
6962
{
7063
$cert = Certificates::getOrganizationCert();
71-
try {
72-
$principalName = CertificateData::getSubjectSurname($cert) . " " . CertificateData::getSubjectSurname($cert);
73-
} catch (UnexpectedValueException $e) {
64+
65+
$givenName = CertificateData::getSubjectGivenName($cert);
66+
$surname = CertificateData::getSubjectSurname($cert);
67+
if ($givenName && $surname) {
68+
$principalName = $givenName . " " . $surname;
69+
} else {
7470
$principalName = CertificateData::getSubjectCN($cert);
7571
}
7672
$this->assertEquals("Testijad.ee isikutuvastus", $principalName);

0 commit comments

Comments
 (0)