151 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
declare(strict_types=1);
 | 
						|
 | 
						|
/*
 | 
						|
 * The MIT License (MIT)
 | 
						|
 *
 | 
						|
 * Copyright (c) 2014-2020 Spomky-Labs
 | 
						|
 *
 | 
						|
 * This software may be modified and distributed under the terms
 | 
						|
 * of the MIT license.  See the LICENSE file for details.
 | 
						|
 */
 | 
						|
 | 
						|
namespace Jose\Component\Signature;
 | 
						|
 | 
						|
use function count;
 | 
						|
use InvalidArgumentException;
 | 
						|
use Jose\Component\Core\JWT;
 | 
						|
 | 
						|
class JWS implements JWT
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @var bool
 | 
						|
     */
 | 
						|
    private $isPayloadDetached = false;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var null|string
 | 
						|
     */
 | 
						|
    private $encodedPayload;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var Signature[]
 | 
						|
     */
 | 
						|
    private $signatures = [];
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var null|string
 | 
						|
     */
 | 
						|
    private $payload;
 | 
						|
 | 
						|
    public function __construct(?string $payload, ?string $encodedPayload = null, bool $isPayloadDetached = false)
 | 
						|
    {
 | 
						|
        $this->payload = $payload;
 | 
						|
        $this->encodedPayload = $encodedPayload;
 | 
						|
        $this->isPayloadDetached = $isPayloadDetached;
 | 
						|
    }
 | 
						|
 | 
						|
    public function getPayload(): ?string
 | 
						|
    {
 | 
						|
        return $this->payload;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Returns true if the payload is detached.
 | 
						|
     */
 | 
						|
    public function isPayloadDetached(): bool
 | 
						|
    {
 | 
						|
        return $this->isPayloadDetached;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Returns the Base64Url encoded payload.
 | 
						|
     * If the payload is detached, this method returns null.
 | 
						|
     */
 | 
						|
    public function getEncodedPayload(): ?string
 | 
						|
    {
 | 
						|
        if (true === $this->isPayloadDetached()) {
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
 | 
						|
        return $this->encodedPayload;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Returns the signatures associated with the JWS.
 | 
						|
     *
 | 
						|
     * @return Signature[]
 | 
						|
     */
 | 
						|
    public function getSignatures(): array
 | 
						|
    {
 | 
						|
        return $this->signatures;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Returns the signature at the given index.
 | 
						|
     *
 | 
						|
     * @throws InvalidArgumentException if the signature index does not exist
 | 
						|
     */
 | 
						|
    public function getSignature(int $id): Signature
 | 
						|
    {
 | 
						|
        if (isset($this->signatures[$id])) {
 | 
						|
            return $this->signatures[$id];
 | 
						|
        }
 | 
						|
 | 
						|
        throw new InvalidArgumentException('The signature does not exist.');
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * This method adds a signature to the JWS object.
 | 
						|
     * Its returns a new JWS object.
 | 
						|
     *
 | 
						|
     * @internal
 | 
						|
     *
 | 
						|
     * @return JWS
 | 
						|
     */
 | 
						|
    public function addSignature(string $signature, array $protectedHeader, ?string $encodedProtectedHeader, array $header = []): self
 | 
						|
    {
 | 
						|
        $jws = clone $this;
 | 
						|
        $jws->signatures[] = new Signature($signature, $protectedHeader, $encodedProtectedHeader, $header);
 | 
						|
 | 
						|
        return $jws;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Returns the number of signature associated with the JWS.
 | 
						|
     */
 | 
						|
    public function countSignatures(): int
 | 
						|
    {
 | 
						|
        return count($this->signatures);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * This method splits the JWS into a list of JWSs.
 | 
						|
     * It is only useful when the JWS contains more than one signature (JSON General Serialization).
 | 
						|
     *
 | 
						|
     * @return JWS[]
 | 
						|
     */
 | 
						|
    public function split(): array
 | 
						|
    {
 | 
						|
        $result = [];
 | 
						|
        foreach ($this->signatures as $signature) {
 | 
						|
            $jws = new self(
 | 
						|
                $this->payload,
 | 
						|
                $this->encodedPayload,
 | 
						|
                $this->isPayloadDetached
 | 
						|
            );
 | 
						|
            $jws = $jws->addSignature(
 | 
						|
                $signature->getSignature(),
 | 
						|
                $signature->getProtectedHeader(),
 | 
						|
                $signature->getEncodedProtectedHeader(),
 | 
						|
                $signature->getHeader()
 | 
						|
            );
 | 
						|
 | 
						|
            $result[] = $jws;
 | 
						|
        }
 | 
						|
 | 
						|
        return $result;
 | 
						|
    }
 | 
						|
}
 |