ILIAS  release_10 Revision v10.1-43-ga1241a92c2f
SigningSerializer.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
21 namespace ILIAS\FileDelivery\Token;
22 
31 
37 final class SigningSerializer
38 {
39  private const SEPARATOR = '<<>>';
40 
41  public function __construct(
42  private KeyRotatingSigner $signer,
43  private Serializer $serializer,
44  private Compression $compression,
45  private Transport $transport
46  ) {
47  }
48 
49  public function sign(Payload $payload, Salt $salt): string
50  {
51  // serialize payload
52  $serialized_payload = $this->serializer->serializePayload($payload->get());
53  $serialized_validity = $this->serializer->serializeValidity($payload->until());
54  $signable_payload = $serialized_payload . self::SEPARATOR . $serialized_validity;
55 
56  // sign payload
57  $signature = $this->signer->sign($signable_payload, $salt);
58 
59  $signed_payload = $signable_payload . self::SEPARATOR . $signature;
60 
61  $compressed_payload = $this->compression->compress($signed_payload);
62 
63  $prepare_for_transport = $this->transport->prepareForTransport($compressed_payload);
64 
65  return $prepare_for_transport;
66  }
67 
68  public function verify(string $data, Salt $salt): ?Payload
69  {
70  // decompress payload
71  try {
72  $decompressed_payload = $this->compression->decompress(
73  $this->transport->readFromTransport($data)
74  );
75  } catch (\Throwable $e) {
76  return null;
77  }
78 
79  $split_data = explode(self::SEPARATOR, $decompressed_payload);
80  $serialized_payload = $split_data[0] ?? '';
81  $validity = $split_data[1] ?? '';
82  $signature = $split_data[2] ?? '';
83 
84  $payload_with_validity = $serialized_payload . self::SEPARATOR . $validity;
85 
86  if ($this->signer->verify($payload_with_validity, $signature, (int) $validity, $salt) === false) {
87  return null;
88  }
89 
90  return new StructuredPayload($this->serializer->unserializePayload($serialized_payload));
91  }
92 }
if(count($parts) !=3) $payload
Definition: ltitoken.php:67
__construct(private KeyRotatingSigner $signer, private Serializer $serializer, private Compression $compression, private Transport $transport)
The salt is combined with the secret key to derive a unique key for distinguishing different contexts...
Definition: Salt.php:37