summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorMaxence Lange <maxence@artificial-owl.com>2019-07-11 18:55:00 -0100
committerMaxence Lange <maxence@artificial-owl.com>2019-07-11 18:55:00 -0100
commitc64f502718e8d31a4ee7cf1a00cb0cdd260e9eff (patch)
tree8f5845f4f7d25a05c00907a283113c61284c3fd2 /lib
parent7fccfc23257b6103e999ec90a8120b8f5cc69521 (diff)
cleaner signature process
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/Service/SignatureService.php71
1 files changed, 48 insertions, 23 deletions
diff --git a/lib/Service/SignatureService.php b/lib/Service/SignatureService.php
index 637c2de8..e29a7210 100644
--- a/lib/Service/SignatureService.php
+++ b/lib/Service/SignatureService.php
@@ -154,31 +154,57 @@ class SignatureService {
$localActor = $this->actorsRequest->getFromId($queue->getAuthor());
-// $localActorLink =
-// $this->configService->getSocialUrl() . '@' . $localActor->getPreferredUsername();
+ $headersElements = ['content-length', 'date', 'host', 'digest'];
+ $allElements = [
+ '(request-target)' => 'post ' . $path->getPath(),
+ 'date' => $date,
+ 'host' => $path->getAddress(),
+ 'digest' => $this->generateDigest($request->getDataBody()),
+ 'content-length' => strlen($request->getDataBody())
+ ];
+
+ $signing = $this->generateHeaders($headersElements, $allElements, $request);
+ openssl_sign($signing, $signed, $localActor->getPrivateKey(), OPENSSL_ALGO_SHA256);
- $digest = $this->generateDigest($request->getDataBody());
- $contentSize = strlen($request->getDataBody());
+ $signed = base64_encode($signed);
+ $signature = $this->generateSignature($headersElements, $localActor->getId(), $signed);
- $signature = '';
-// $signature .= "(request-target): post " . $path->getPath() . "\n";
- $signature .= 'content-length: ' . $contentSize . "\n";
- $signature .= 'date: ' . $date . "\n";
- $signature .= 'digest: ' . $digest . "\n";
- $signature .= 'host: ' . $path->getAddress();
+ $request->addHeader('Signature: ' . $signature);
+ }
- openssl_sign($signature, $signed, $localActor->getPrivateKey(), OPENSSL_ALGO_SHA256);
- $signed = base64_encode($signed);
- $header = 'keyId="' . $localActor->getId() . '#main-key'
- . '",algorithm="rsa-sha256",headers="content-length date digest host",signature="'
- . $signed . '"';
+ /**
+ * @param array $elements
+ * @param array $data
+ * @param Request $request
+ *
+ * @return string
+ */
+ private function generateHeaders(array $elements, array $data, Request $request): string {
+ $signingElements = [];
+ foreach ($elements as $element) {
+ $signingElements[] = $element . ': ' . $data[$element];
+ $request->addHeader($element . ': ' . $data[$element]);
+ }
+
+ return implode("\n", $signingElements);
+ }
+
- $request->addHeader('Content-length: ' . $contentSize);
- $request->addHeader('Host: ' . $path->getAddress());
- $request->addHeader('Date: ' . $date);
- $request->addHeader('Digest: ' . $digest);
- $request->addHeader('Signature: ' . $header);
+ /**
+ * @param array $elements
+ * @param string $actorId
+ * @param string $signed
+ *
+ * @return array
+ */
+ private function generateSignature(array $elements, string $actorId, string $signed): string {
+ $signatureElements[] = 'keyId="' . $actorId . '#main-key"';
+ $signatureElements[] = 'algorithm="rsa-sha256"';
+ $signatureElements[] = 'headers="' . implode(' ', $elements) . '"';
+ $signatureElements[] = 'signature="' . $signed . '"';
+
+ return implode(',', $signatureElements);
}
@@ -360,8 +386,8 @@ class SignatureService {
if ($publicKey === ''
|| openssl_verify($estimated, $signed, $publicKey, $algorithm) !== 1) {
throw new SignatureException(
- 'signature cannot be checked key: ' . $publicKey . ' - algo: ' . $algorithm
- . ' - estimated: ' . $estimated
+ 'signature cannot be checked - signed: ' . $signed . ' - key: ' . $publicKey
+ . ' - algo: ' . $algorithm . ' - estimated: ' . $estimated
);
}
@@ -473,7 +499,6 @@ class SignatureService {
);
}
-
/**
* @param array $sign
*