|
@@ -0,0 +1,190 @@
|
|
|
|
+<?php
|
|
|
|
+
|
|
|
|
+namespace Tests\Unit\HttpSignatures;
|
|
|
|
+
|
|
|
|
+use GuzzleHttp\Psr7\Request;
|
|
|
|
+use App\Util\HttpSignatures\Context;
|
|
|
|
+
|
|
|
|
+class HmacContextTest extends \PHPUnit\Framework\TestCase
|
|
|
|
+{
|
|
|
|
+ private $context;
|
|
|
|
+
|
|
|
|
+ public function setUp()
|
|
|
|
+ {
|
|
|
|
+ $this->noDigestContext = new Context([
|
|
|
|
+ 'keys' => ['pda' => 'secret'],
|
|
|
|
+ 'algorithm' => 'hmac-sha256',
|
|
|
|
+ 'headers' => ['(request-target)', 'date'],
|
|
|
|
+ ]);
|
|
|
|
+ $this->withDigestContext = new Context([
|
|
|
|
+ 'keys' => ['pda' => 'secret'],
|
|
|
|
+ 'algorithm' => 'hmac-sha256',
|
|
|
|
+ 'headers' => ['(request-target)', 'date', 'digest'],
|
|
|
|
+ ]);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public function testSignerNoDigestAction()
|
|
|
|
+ {
|
|
|
|
+ $message = new Request('GET', '/path?query=123', ['date' => 'today', 'accept' => 'llamas']);
|
|
|
|
+ $message = $this->noDigestContext->signer()->sign($message);
|
|
|
|
+
|
|
|
|
+ $expectedString = implode(',', [
|
|
|
|
+ 'keyId="pda"',
|
|
|
|
+ 'algorithm="hmac-sha256"',
|
|
|
|
+ 'headers="(request-target) date"',
|
|
|
|
+ 'signature="SFlytCGpsqb/9qYaKCQklGDvwgmrwfIERFnwt+yqPJw="',
|
|
|
|
+ ]);
|
|
|
|
+
|
|
|
|
+ $this->assertEquals(
|
|
|
|
+ $expectedString,
|
|
|
|
+ $message->getHeader('Signature')[0]
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ $this->assertEquals(
|
|
|
|
+ 'Signature '.$expectedString,
|
|
|
|
+ $message->getHeader('Authorization')[0]
|
|
|
|
+ );
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public function testSignerAddDigestToHeadersList()
|
|
|
|
+ {
|
|
|
|
+ $message = new Request(
|
|
|
|
+ 'POST', '/path/to/things?query=123',
|
|
|
|
+ ['date' => 'today', 'accept' => 'llamas'],
|
|
|
|
+ 'Thing to POST');
|
|
|
|
+ $message = $this->noDigestContext->signer()->signWithDigest($message);
|
|
|
|
+
|
|
|
|
+ $expectedString = implode(',', [
|
|
|
|
+ 'keyId="pda"',
|
|
|
|
+ 'algorithm="hmac-sha256"',
|
|
|
|
+ 'headers="(request-target) date digest"',
|
|
|
|
+ 'signature="HH6R3OJmJbKUFqqL0tGVIIb7xi1WbbSh/HBXHUtLkUs="', ]);
|
|
|
|
+ $expectedDigestHeader =
|
|
|
|
+ 'SHA-256=rEcNhYZoBKiR29D30w1JcgArNlF8rXIXf5MnIL/4kcc=';
|
|
|
|
+
|
|
|
|
+ $this->assertEquals(
|
|
|
|
+ $expectedString,
|
|
|
|
+ $message->getHeader('Signature')[0]
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ $this->assertEquals(
|
|
|
|
+ $expectedDigestHeader,
|
|
|
|
+ $message->getHeader('Digest')[0]
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ $this->assertEquals(
|
|
|
|
+ 'Signature '.$expectedString,
|
|
|
|
+ $message->getHeader('Authorization')[0]
|
|
|
|
+ );
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public function testSignerReplaceDigest()
|
|
|
|
+ {
|
|
|
|
+ $message = new Request(
|
|
|
|
+ 'PUT', '/things/thething?query=123',
|
|
|
|
+ ['date' => 'today',
|
|
|
|
+ 'accept' => 'llamas',
|
|
|
|
+ 'Digest' => 'SHA-256=E/P+4y4x6EySO9qNAjCtQKxVwE1xKsNI/k+cjK+vtLU=', ],
|
|
|
|
+ 'Thing to PUT at /things/thething please...');
|
|
|
|
+ $message = $this->noDigestContext->signer()->signWithDigest($message);
|
|
|
|
+
|
|
|
|
+ $expectedString = implode(',', [
|
|
|
|
+ 'keyId="pda"',
|
|
|
|
+ 'algorithm="hmac-sha256"',
|
|
|
|
+ 'headers="(request-target) date digest"',
|
|
|
|
+ 'signature="Hyatt1lSR/4XLI9Gcx8XOEKiG8LVktH7Lfr+0tmhwRU="', ]);
|
|
|
|
+ $expectedDigestHeader =
|
|
|
|
+ 'SHA-256=mulOx+77mQU1EbPET50SCGA4P/4bYxVCJA1pTwJsaMw=';
|
|
|
|
+
|
|
|
|
+ $this->assertEquals(
|
|
|
|
+ $expectedString,
|
|
|
|
+ $message->getHeader('Signature')[0]
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ $this->assertEquals(
|
|
|
|
+ $expectedDigestHeader,
|
|
|
|
+ $message->getHeader('Digest')[0]
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ $this->assertEquals(
|
|
|
|
+ 'Signature '.$expectedString,
|
|
|
|
+ $message->getHeader('Authorization')[0]
|
|
|
|
+ );
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public function testSignerNewDigestIsInHeaderList()
|
|
|
|
+ {
|
|
|
|
+ $message = new Request(
|
|
|
|
+ 'POST', '/path?query=123',
|
|
|
|
+ ['date' => 'today',
|
|
|
|
+ 'accept' => 'llamas', ],
|
|
|
|
+ 'Stuff that belongs in /path');
|
|
|
|
+ $message = $this->withDigestContext->signer()->signWithDigest($message);
|
|
|
|
+
|
|
|
|
+ $expectedString = implode(',', [
|
|
|
|
+ 'keyId="pda"',
|
|
|
|
+ 'algorithm="hmac-sha256"',
|
|
|
|
+ 'headers="(request-target) date digest"',
|
|
|
|
+ 'signature="p8gQHs59X2WzQLUecfmxm1YO0OBTCNKldRZZBQsepfk="', ]);
|
|
|
|
+ $expectedDigestHeader =
|
|
|
|
+ 'SHA-256=jnSMEfBSum4Rh2k6/IVFyvLuQLmGYwMAGBS9WybyDqQ=';
|
|
|
|
+
|
|
|
|
+ $this->assertEquals(
|
|
|
|
+ $expectedString,
|
|
|
|
+ $message->getHeader('Signature')[0]
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ $this->assertEquals(
|
|
|
|
+ $expectedDigestHeader,
|
|
|
|
+ $message->getHeader('Digest')[0]
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ $this->assertEquals(
|
|
|
|
+ 'Signature '.$expectedString,
|
|
|
|
+ $message->getHeader('Authorization')[0]
|
|
|
|
+ );
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public function testSignerNewDigestWithoutBody()
|
|
|
|
+ {
|
|
|
|
+ $message = new Request(
|
|
|
|
+ 'GET', '/path?query=123',
|
|
|
|
+ ['date' => 'today',
|
|
|
|
+ 'accept' => 'llamas', ]);
|
|
|
|
+ $message = $this->withDigestContext->signer()->signWithDigest($message);
|
|
|
|
+
|
|
|
|
+ $expectedString = implode(',', [
|
|
|
|
+ 'keyId="pda"',
|
|
|
|
+ 'algorithm="hmac-sha256"',
|
|
|
|
+ 'headers="(request-target) date digest"',
|
|
|
|
+ 'signature="7iFqqryI6I9opV/Zp3eEg6PDY1tKw/3GqioOM7ACHHA="', ]);
|
|
|
|
+ $zeroLengthStringDigest =
|
|
|
|
+ 'SHA-256=47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=';
|
|
|
|
+
|
|
|
|
+ $this->assertEquals(
|
|
|
|
+ $expectedString,
|
|
|
|
+ $message->getHeader('Signature')[0]
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ $this->assertEquals(
|
|
|
|
+ $zeroLengthStringDigest,
|
|
|
|
+ $message->getHeader('Digest')[0]
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ $this->assertEquals(
|
|
|
|
+ 'Signature '.$expectedString,
|
|
|
|
+ $message->getHeader('Authorization')[0]
|
|
|
|
+ );
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public function testVerifier()
|
|
|
|
+ {
|
|
|
|
+ $message = $this->noDigestContext->signer()->sign(new Request('GET', '/path?query=123', [
|
|
|
|
+ 'Signature' => 'keyId="pda",algorithm="hmac-sha1",headers="date",signature="x"',
|
|
|
|
+ 'Date' => 'x',
|
|
|
|
+ ]));
|
|
|
|
+
|
|
|
|
+ // assert it works without errors; correctness of results tested elsewhere.
|
|
|
|
+ $this->assertTrue(is_bool($this->noDigestContext->verifier()->isValid($message)));
|
|
|
|
+ }
|
|
|
|
+}
|