Made message signing in Cryptography use SHA512 as the message content for... #1
4 changed files with 405 additions and 7 deletions
|
@ -2,8 +2,12 @@
|
||||||
|
|
||||||
namespace Socialbox\Objects\Database;
|
namespace Socialbox\Objects\Database;
|
||||||
|
|
||||||
|
use DateMalformedStringException;
|
||||||
|
use DateTime;
|
||||||
|
use InvalidArgumentException;
|
||||||
use Socialbox\Enums\Types\CommunicationRecipientType;
|
use Socialbox\Enums\Types\CommunicationRecipientType;
|
||||||
use Socialbox\Interfaces\SerializableInterface;
|
use Socialbox\Interfaces\SerializableInterface;
|
||||||
|
use Socialbox\Objects\Standard\EncryptionChannelMessage;
|
||||||
|
|
||||||
class ChannelMessageRecord implements SerializableInterface
|
class ChannelMessageRecord implements SerializableInterface
|
||||||
{
|
{
|
||||||
|
@ -13,7 +17,7 @@
|
||||||
private string $message;
|
private string $message;
|
||||||
private string $signature;
|
private string $signature;
|
||||||
private bool $received;
|
private bool $received;
|
||||||
private \DateTime $timestamp;
|
private DateTime $timestamp;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a new instance of this class and initializes its properties with the provided data.
|
* Constructs a new instance of this class and initializes its properties with the provided data.
|
||||||
|
@ -26,7 +30,7 @@
|
||||||
* - 'signature' (string): The signature.
|
* - 'signature' (string): The signature.
|
||||||
* - 'received' (bool): Whether the message has been received.
|
* - 'received' (bool): Whether the message has been received.
|
||||||
* - 'timestamp' (int|string|\DateTime): The timestamp of the message.
|
* - 'timestamp' (int|string|\DateTime): The timestamp of the message.
|
||||||
* @return void
|
* @throws DateMalformedStringException If the timestamp is a string that cannot be parsed.
|
||||||
*/
|
*/
|
||||||
public function __construct(array $data)
|
public function __construct(array $data)
|
||||||
{
|
{
|
||||||
|
@ -37,21 +41,21 @@
|
||||||
$this->signature = $data['signature'];
|
$this->signature = $data['signature'];
|
||||||
$this->received = (bool)$data['received'];
|
$this->received = (bool)$data['received'];
|
||||||
|
|
||||||
if($data['timestamp'] instanceof \DateTime)
|
if($data['timestamp'] instanceof DateTime)
|
||||||
{
|
{
|
||||||
$this->timestamp = $data['timestamp'];
|
$this->timestamp = $data['timestamp'];
|
||||||
}
|
}
|
||||||
elseif(is_int($data['timestamp']))
|
elseif(is_int($data['timestamp']))
|
||||||
{
|
{
|
||||||
$this->timestamp = (new \DateTime())->setTimestamp($data['timestamp']);
|
$this->timestamp = (new DateTime())->setTimestamp($data['timestamp']);
|
||||||
}
|
}
|
||||||
elseif(is_string($data['timestamp']))
|
elseif(is_string($data['timestamp']))
|
||||||
{
|
{
|
||||||
$this->timestamp = new \DateTime($data['timestamp']);
|
$this->timestamp = new DateTime($data['timestamp']);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw new \InvalidArgumentException('Invalid timestamp type, got ' . gettype($data['timestamp']));
|
throw new InvalidArgumentException('Invalid timestamp type, got ' . gettype($data['timestamp']));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,12 +109,22 @@
|
||||||
return $this->signature;
|
return $this->signature;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether the message has been received.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
public function isReceived(): bool
|
public function isReceived(): bool
|
||||||
{
|
{
|
||||||
return $this->received;
|
return $this->received;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getTimestamp(): \DateTime
|
/**
|
||||||
|
* Returns the timestamp of the message.
|
||||||
|
*
|
||||||
|
* @return DateTime
|
||||||
|
*/
|
||||||
|
public function getTimestamp(): DateTime
|
||||||
{
|
{
|
||||||
return $this->timestamp;
|
return $this->timestamp;
|
||||||
}
|
}
|
||||||
|
@ -138,4 +152,10 @@
|
||||||
'timestamp' => $this->timestamp->format('Y-m-d H:i:s')
|
'timestamp' => $this->timestamp->format('Y-m-d H:i:s')
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function toStandard(): EncryptionChannelMessage
|
||||||
|
{
|
||||||
|
return new EncryptionChannelMessage($this->toArray());
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -7,6 +7,7 @@
|
||||||
use Socialbox\Enums\Status\EncryptionChannelState;
|
use Socialbox\Enums\Status\EncryptionChannelState;
|
||||||
use Socialbox\Interfaces\SerializableInterface;
|
use Socialbox\Interfaces\SerializableInterface;
|
||||||
use Socialbox\Objects\PeerAddress;
|
use Socialbox\Objects\PeerAddress;
|
||||||
|
use Socialbox\Objects\Standard\EncryptionChannel;
|
||||||
|
|
||||||
class EncryptionChannelRecord implements SerializableInterface
|
class EncryptionChannelRecord implements SerializableInterface
|
||||||
{
|
{
|
||||||
|
@ -256,4 +257,14 @@
|
||||||
'created' => $this->created->format('Y-m-d H:i:s')
|
'created' => $this->created->format('Y-m-d H:i:s')
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts the Encryption Channel Record to a Standard Encryption Channel
|
||||||
|
*
|
||||||
|
* @return EncryptionChannel
|
||||||
|
*/
|
||||||
|
public function toStandard(): EncryptionChannel
|
||||||
|
{
|
||||||
|
return new EncryptionChannel($this->toArray());
|
||||||
|
}
|
||||||
}
|
}
|
222
src/Socialbox/Objects/Standard/EncryptionChannel.php
Normal file
222
src/Socialbox/Objects/Standard/EncryptionChannel.php
Normal file
|
@ -0,0 +1,222 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Socialbox\Objects\Standard;
|
||||||
|
|
||||||
|
use DateTime;
|
||||||
|
use InvalidArgumentException;
|
||||||
|
use Socialbox\Enums\Status\EncryptionChannelState;
|
||||||
|
use Socialbox\Interfaces\SerializableInterface;
|
||||||
|
|
||||||
|
class EncryptionChannel implements SerializableInterface
|
||||||
|
{
|
||||||
|
private string $uuid;
|
||||||
|
private string $callingPeer;
|
||||||
|
private string $callingSignatureUuid;
|
||||||
|
private string $callingSignaturePublicKey;
|
||||||
|
private string $callingEncryptionPublicKey;
|
||||||
|
private string $receivingPeer;
|
||||||
|
private ?string $receivingSignatureUuid;
|
||||||
|
private ?string $receivingSignaturePublicKey;
|
||||||
|
private ?string $receivingEncryptionPublicKey;
|
||||||
|
private string $transportEncryptionAlgorithm;
|
||||||
|
private ?string $transportEncryptionKey;
|
||||||
|
private EncryptionChannelState $state;
|
||||||
|
private int $created;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* EncryptionChannel constructor.
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
*/
|
||||||
|
public function __construct(array $data)
|
||||||
|
{
|
||||||
|
$this->uuid = $data['uuid'];
|
||||||
|
$this->callingPeer = $data['calling_peer'];
|
||||||
|
$this->callingSignatureUuid = $data['calling_signature_uuid'];
|
||||||
|
$this->callingSignaturePublicKey = $data['calling_signature_public_key'];
|
||||||
|
$this->callingEncryptionPublicKey = $data['calling_encryption_public_key'];
|
||||||
|
$this->receivingPeer = $data['receiving_peer'];
|
||||||
|
$this->receivingSignatureUuid = $data['receiving_signature_uuid'];
|
||||||
|
$this->receivingSignaturePublicKey = $data['receiving_signature_public_key'];
|
||||||
|
$this->receivingEncryptionPublicKey = $data['receiving_encryption_public_key'];
|
||||||
|
$this->transportEncryptionAlgorithm = $data['transport_encryption_algorithm'];
|
||||||
|
$this->transportEncryptionKey = $data['transport_encryption_key'];
|
||||||
|
$this->state = EncryptionChannelState::from($data['state']);
|
||||||
|
|
||||||
|
if($data['created'] instanceof DateTime)
|
||||||
|
{
|
||||||
|
$this->created = $data['created']->getTimestamp();
|
||||||
|
}
|
||||||
|
elseif(is_int($data['created']))
|
||||||
|
{
|
||||||
|
$this->created = $data['created'];
|
||||||
|
}
|
||||||
|
elseif(is_string($data['created']))
|
||||||
|
{
|
||||||
|
$this->created = strtotime($data['created']) ?: throw new InvalidArgumentException('Invalid date format');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new InvalidArgumentException('Invalid date format, got type: ' . gettype($data['created']));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Unique Universal Identifier of the Encryption Channel
|
||||||
|
*
|
||||||
|
* @return string The UUID of the Encryption Channel
|
||||||
|
*/
|
||||||
|
public function getUuid(): string
|
||||||
|
{
|
||||||
|
return $this->uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Peer address that initiated the Encryption Channel
|
||||||
|
*
|
||||||
|
* @return string The Peer address that initiated the Encryption Channel
|
||||||
|
*/
|
||||||
|
public function getCallingPeer(): string
|
||||||
|
{
|
||||||
|
return $this->callingPeer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Unique Universal Identifier of the Signature used by the calling Peer
|
||||||
|
*
|
||||||
|
* @return string The UUID of the Signature used by the calling Peer
|
||||||
|
*/
|
||||||
|
public function getCallingSignatureUuid(): string
|
||||||
|
{
|
||||||
|
return $this->callingSignatureUuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Public Key of the Signature used by the calling Peer
|
||||||
|
*
|
||||||
|
* @return string The Public Key of the Signature used by the calling Peer
|
||||||
|
*/
|
||||||
|
public function getCallingSignaturePublicKey(): string
|
||||||
|
{
|
||||||
|
return $this->callingSignaturePublicKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Public Key of the Encryption used by the calling Peer
|
||||||
|
*
|
||||||
|
* @return string The Public Key of the Encryption used by the calling Peer
|
||||||
|
*/
|
||||||
|
public function getCallingEncryptionPublicKey(): string
|
||||||
|
{
|
||||||
|
return $this->callingEncryptionPublicKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Peer address that received the Encryption Channel
|
||||||
|
*
|
||||||
|
* @return string The Peer address that received the Encryption Channel
|
||||||
|
*/
|
||||||
|
public function getReceivingPeer(): string
|
||||||
|
{
|
||||||
|
return $this->receivingPeer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Unique Universal Identifier of the Signature used by the receiving Peer
|
||||||
|
*
|
||||||
|
* @return string|null The UUID of the Signature used by the receiving Peer, or null if not set
|
||||||
|
*/
|
||||||
|
public function getReceivingSignatureUuid(): ?string
|
||||||
|
{
|
||||||
|
return $this->receivingSignatureUuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Public Key of the Signature used by the receiving Peer
|
||||||
|
*
|
||||||
|
* @return string|null The Public Key of the Signature used by the receiving Peer, or null if not set
|
||||||
|
*/
|
||||||
|
public function getReceivingSignaturePublicKey(): ?string
|
||||||
|
{
|
||||||
|
return $this->receivingSignaturePublicKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Public Key of the Encryption used by the receiving Peer
|
||||||
|
*
|
||||||
|
* @return string|null The Public Key of the Encryption used by the receiving Peer, or null if not set
|
||||||
|
*/
|
||||||
|
public function getReceivingEncryptionPublicKey(): ?string
|
||||||
|
{
|
||||||
|
return $this->receivingEncryptionPublicKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Algorithm used for the Transport Encryption
|
||||||
|
*
|
||||||
|
* @return string The Algorithm used for the Transport Encryption
|
||||||
|
*/
|
||||||
|
public function getTransportEncryptionAlgorithm(): string
|
||||||
|
{
|
||||||
|
return $this->transportEncryptionAlgorithm;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Key used for the Transport Encryption
|
||||||
|
*
|
||||||
|
* @return string|null The Key used for the Transport Encryption, or null if not set
|
||||||
|
*/
|
||||||
|
public function getTransportEncryptionKey(): ?string
|
||||||
|
{
|
||||||
|
return $this->transportEncryptionKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the State of the Encryption Channel
|
||||||
|
*
|
||||||
|
* @return EncryptionChannelState The State of the Encryption Channel
|
||||||
|
*/
|
||||||
|
public function getState(): EncryptionChannelState
|
||||||
|
{
|
||||||
|
return $this->state;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Unix Timestamp of the creation date of the Encryption Channel
|
||||||
|
*
|
||||||
|
* @return int The Unix Timestamp of the creation date of the Encryption Channel
|
||||||
|
*/
|
||||||
|
public function getCreated(): int
|
||||||
|
{
|
||||||
|
return $this->created;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public static function fromArray(array $data): EncryptionChannel
|
||||||
|
{
|
||||||
|
return new self($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function toArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'uuid' => $this->uuid,
|
||||||
|
'calling_peer' => $this->callingPeer,
|
||||||
|
'calling_signature_uuid' => $this->callingSignatureUuid,
|
||||||
|
'calling_encryption_public_key' => $this->callingEncryptionPublicKey,
|
||||||
|
'receiving_peer' => $this->receivingPeer,
|
||||||
|
'receiving_signature_uuid' => $this->receivingSignatureUuid,
|
||||||
|
'receiving_signature_public_key' => $this->receivingSignaturePublicKey,
|
||||||
|
'receiving_encryption_public_key' => $this->receivingEncryptionPublicKey,
|
||||||
|
'transport_encryption_algorithm' => $this->transportEncryptionAlgorithm,
|
||||||
|
'transport_encryption_key' => $this->transportEncryptionKey,
|
||||||
|
'state' => $this->state->value,
|
||||||
|
'created' => $this->created
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
145
src/Socialbox/Objects/Standard/EncryptionChannelMessage.php
Normal file
145
src/Socialbox/Objects/Standard/EncryptionChannelMessage.php
Normal file
|
@ -0,0 +1,145 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Socialbox\Objects\Standard;
|
||||||
|
|
||||||
|
use DateTime;
|
||||||
|
use InvalidArgumentException;
|
||||||
|
use Socialbox\Enums\Types\CommunicationRecipientType;
|
||||||
|
use Socialbox\Interfaces\SerializableInterface;
|
||||||
|
|
||||||
|
class EncryptionChannelMessage implements SerializableInterface
|
||||||
|
{
|
||||||
|
private string $uuid;
|
||||||
|
private string $channelUuid;
|
||||||
|
private CommunicationRecipientType $recipient;
|
||||||
|
private string $message;
|
||||||
|
private string $signature;
|
||||||
|
private bool $received;
|
||||||
|
private int $timestamp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* EncryptionChannelMessage constructor.
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
*/
|
||||||
|
public function __construct(array $data)
|
||||||
|
{
|
||||||
|
$this->uuid = $data['uuid'];
|
||||||
|
$this->channelUuid = $data['channel_uuid'];
|
||||||
|
$this->recipient = CommunicationRecipientType::from($data['recipient']);
|
||||||
|
$this->message = $data['message'];
|
||||||
|
$this->signature = $data['signature'];
|
||||||
|
$this->received = (bool)$data['received'];
|
||||||
|
|
||||||
|
if($data['timestamp'] instanceof DateTime)
|
||||||
|
{
|
||||||
|
$this->timestamp = $data['timestamp']->getTimestamp();
|
||||||
|
}
|
||||||
|
elseif(is_int($data['timestamp']))
|
||||||
|
{
|
||||||
|
$this->timestamp = $data['timestamp'];
|
||||||
|
}
|
||||||
|
elseif(is_string($data['timestamp']))
|
||||||
|
{
|
||||||
|
$this->timestamp = strtotime($data['timestamp']) ?: throw new InvalidArgumentException('Invalid date format');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new InvalidArgumentException('Invalid date format, got type: ' . gettype($data['timestamp']));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Unique Universal Identifier of the message.
|
||||||
|
*
|
||||||
|
* @return string The UUID of the message.
|
||||||
|
*/
|
||||||
|
public function getUuid(): string
|
||||||
|
{
|
||||||
|
return $this->uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Unique Universal Identifier of the channel.
|
||||||
|
*
|
||||||
|
* @return string The UUID of the channel.
|
||||||
|
*/
|
||||||
|
public function getChannelUuid(): string
|
||||||
|
{
|
||||||
|
return $this->channelUuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The recipient of the message.
|
||||||
|
*
|
||||||
|
* @return CommunicationRecipientType The recipient of the message.
|
||||||
|
*/
|
||||||
|
public function getRecipient(): CommunicationRecipientType
|
||||||
|
{
|
||||||
|
return $this->recipient;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The encrypted message.
|
||||||
|
*
|
||||||
|
* @return string The message.
|
||||||
|
*/
|
||||||
|
public function getMessage(): string
|
||||||
|
{
|
||||||
|
return $this->message;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The signature of the decrypted message.
|
||||||
|
*
|
||||||
|
* @return string The signature of the message.
|
||||||
|
*/
|
||||||
|
public function getSignature(): string
|
||||||
|
{
|
||||||
|
return $this->signature;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether the message has been received.
|
||||||
|
*
|
||||||
|
* @return bool Whether the message has been received.
|
||||||
|
*/
|
||||||
|
public function isReceived(): bool
|
||||||
|
{
|
||||||
|
return $this->received;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The timestamp of the message.
|
||||||
|
*
|
||||||
|
* @return int The timestamp of the message.
|
||||||
|
*/
|
||||||
|
public function getTimestamp(): int
|
||||||
|
{
|
||||||
|
return $this->timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public static function fromArray(array $data): EncryptionChannelMessage
|
||||||
|
{
|
||||||
|
return new self($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
*/
|
||||||
|
public function toArray(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'uuid' => $this->uuid,
|
||||||
|
'channel_uuid' => $this->channelUuid,
|
||||||
|
'recipient' => $this->recipient->value,
|
||||||
|
'message' => $this->message,
|
||||||
|
'signature' => $this->signature,
|
||||||
|
'received' => $this->received,
|
||||||
|
'timestamp' => $this->timestamp
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue