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;
 | |
|     }
 | |
| }
 |