Made message signing in Cryptography use SHA512 as the message content for... #1
1 changed files with 83 additions and 0 deletions
|
@ -32,11 +32,13 @@
|
||||||
use Socialbox\Managers\PeerInformationManager;
|
use Socialbox\Managers\PeerInformationManager;
|
||||||
use Socialbox\Managers\RegisteredPeerManager;
|
use Socialbox\Managers\RegisteredPeerManager;
|
||||||
use Socialbox\Managers\SessionManager;
|
use Socialbox\Managers\SessionManager;
|
||||||
|
use Socialbox\Managers\SigningKeysManager;
|
||||||
use Socialbox\Objects\ClientRequest;
|
use Socialbox\Objects\ClientRequest;
|
||||||
use Socialbox\Objects\PeerAddress;
|
use Socialbox\Objects\PeerAddress;
|
||||||
use Socialbox\Objects\Standard\InformationField;
|
use Socialbox\Objects\Standard\InformationField;
|
||||||
use Socialbox\Objects\Standard\Peer;
|
use Socialbox\Objects\Standard\Peer;
|
||||||
use Socialbox\Objects\Standard\ServerInformation;
|
use Socialbox\Objects\Standard\ServerInformation;
|
||||||
|
use Socialbox\Objects\Standard\SigningKey;
|
||||||
use Throwable;
|
use Throwable;
|
||||||
|
|
||||||
class Socialbox
|
class Socialbox
|
||||||
|
@ -747,6 +749,87 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resolves a peer signature key based on the given peer address or string identifier.
|
||||||
|
*
|
||||||
|
* @param PeerAddress|string $peerAddress The peer address or string identifier to be resolved.
|
||||||
|
* @param string $signatureUuid The UUID of the signature key to be resolved.
|
||||||
|
* @return SigningKey The resolved signing key for the peer.
|
||||||
|
* @throws StandardException If there was an error while resolving the peer signature key.
|
||||||
|
*/
|
||||||
|
public static function resolvePeerSignature(PeerAddress|string $peerAddress, string $signatureUuid): SigningKey
|
||||||
|
{
|
||||||
|
// Convert string peer address to object PeerAddress
|
||||||
|
if(is_string($peerAddress))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$peerAddress = PeerAddress::fromAddress($peerAddress);
|
||||||
|
}
|
||||||
|
catch(InvalidArgumentException $e)
|
||||||
|
{
|
||||||
|
throw new StandardException($e->getMessage(), StandardError::RPC_INVALID_ARGUMENTS, $e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prevent resolutions against any host
|
||||||
|
if($peerAddress->getUsername() == ReservedUsernames::HOST)
|
||||||
|
{
|
||||||
|
throw new StandardException('Cannot resolve signature for a host peer', StandardError::FORBIDDEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the peer is registered within this server
|
||||||
|
if($peerAddress->getDomain() === Configuration::getInstanceConfiguration()->getDomain())
|
||||||
|
{
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$peer = RegisteredPeerManager::getPeerByAddress($peerAddress);
|
||||||
|
if($peer === null || !$peer?->isEnabled())
|
||||||
|
{
|
||||||
|
// Fail if the peer is not found or enabled
|
||||||
|
throw new StandardException(sprintf('The peer %s does not exist', $peerAddress), StandardError::PEER_NOT_FOUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
$signingKey = SigningKeysManager::getSigningKey($peer->getUuid(), $signatureUuid);
|
||||||
|
if($signingKey === null)
|
||||||
|
{
|
||||||
|
throw new StandardException(sprintf('The requested signing key %s was not found', $signatureUuid), StandardError::NOT_FOUND);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(StandardException $e)
|
||||||
|
{
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
|
catch(Exception $e)
|
||||||
|
{
|
||||||
|
throw new StandardException('There was an error while trying to resolve the signature key for the peer locally', StandardError::INTERNAL_SERVER_ERROR, $e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $signingKey->toStandard();
|
||||||
|
}
|
||||||
|
|
||||||
|
// The requested peer is coming from an external server
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$client = self::getExternalSession($peerAddress->getDomain());
|
||||||
|
}
|
||||||
|
catch(Exception $e)
|
||||||
|
{
|
||||||
|
throw new StandardException(sprintf('There was an error while trying to communicate with %s', $peerAddress->getDomain()), StandardError::RESOLUTION_FAILED, $e);
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return $client->resolvePeerSignature($peerAddress, $signatureUuid);
|
||||||
|
}
|
||||||
|
catch(RpcException $e)
|
||||||
|
{
|
||||||
|
// Reflect the server error to the client
|
||||||
|
throw new StandardException($e->getMessage(), StandardError::tryFrom((int)$e->getCode()) ?? StandardError::UNKNOWN, $e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resolves an external peer based on the given peer address or string identifier.
|
* Resolves an external peer based on the given peer address or string identifier.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Add table
Reference in a new issue