| 
<?phpdeclare(strict_types=1);
 
 namespace ParagonIE\Sapient\Traits;
 
 use ParagonIE\Sapient\CryptographyKeys\{
 SealingPublicKey,
 SealingSecretKey,
 SharedAuthenticationKey,
 SharedEncryptionKey,
 SigningPublicKey,
 SigningSecretKey
 };
 use Psr\Http\Message\{
 RequestInterface,
 ResponseInterface
 };
 
 /**
 * Trait JsonSugar
 * @package ParagonIE\Sapient
 *
 * @method RequestInterface authenticateRequestWithSharedKey(RequestInterface $request, SharedAuthenticationKey $key)
 * @method ResponseInterface authenticateResponseWithSharedKey(ResponseInterface $response, SharedAuthenticationKey $key)
 * @method RequestInterface decryptRequestWithSharedKey(RequestInterface $request, SharedEncryptionKey $key)
 * @method ResponseInterface decryptResponseWithSharedKey(ResponseInterface $response, SharedEncryptionKey $key)
 * @method RequestInterface encryptRequestWithSharedKey(RequestInterface $request, SharedEncryptionKey $key)
 * @method ResponseInterface encryptResponseWithSharedKey(ResponseInterface $response, SharedEncryptionKey $key)
 * @method RequestInterface sealRequest(RequestInterface $request, SealingPublicKey $publicKey)
 * @method ResponseInterface sealResponse(ResponseInterface $response, SealingPublicKey $publicKey)
 * @method RequestInterface signRequest(RequestInterface $request, SigningSecretKey $secretKey)
 * @method ResponseInterface signResponse(ResponseInterface $response, SigningSecretKey $secretKey)
 * @method RequestInterface unsealRequest(RequestInterface $request, SealingSecretKey $secretKey)
 * @method ResponseInterface unsealResponse(ResponseInterface $response, SealingSecretKey $secretKey)
 * @method RequestInterface verifySignedRequest(RequestInterface $request, SigningPublicKey $publicKey)
 * @method ResponseInterface verifySignedResponse(ResponseInterface $response, SigningPublicKey $publicKey)
 * @method RequestInterface verifySymmetricAuthenticatedRequest(RequestInterface $response, SharedAuthenticationKey $key)
 * @method ResponseInterface verifySymmetricAuthenticatedResponse(ResponseInterface $response, SharedAuthenticationKey $key)
 */
 trait JsonSugar
 {
 use StringSugar;
 
 /**
 * @param RequestInterface $request
 * @param SharedAuthenticationKey $key
 * @return array
 */
 public function decodeSymmetricAuthenticatedJsonRequest(
 RequestInterface $request,
 SharedAuthenticationKey $key
 ): array {
 return \json_decode(
 $this->verifySymmetricAuthenticatedStringRequest($request, $key),
 true
 );
 }
 
 /**
 * @param ResponseInterface $response
 * @param SharedAuthenticationKey $key
 * @return array
 */
 public function decodeSymmetricAuthenticatedJsonResponse(
 ResponseInterface $response,
 SharedAuthenticationKey $key
 ): array {
 return \json_decode(
 $this->verifySymmetricAuthenticatedStringResponse($response, $key),
 true
 );
 }
 
 /**
 * Verify the Body-Signature-Ed25519 header, and then decode the HTTP
 * Request body into an array (assuming the body is a valid JSON string).
 *
 * @param RequestInterface $request
 * @param SigningPublicKey $publicKey
 * @return array
 */
 public function decodeSignedJsonRequest(
 RequestInterface $request,
 SigningPublicKey $publicKey
 ): array {
 return \json_decode(
 $this->verifySignedStringRequest($request, $publicKey),
 true
 );
 }
 
 /**
 * Verify the Body-Signature-Ed25519 header, and then decode the HTTP
 * Response body into an array (assuming the body is a valid JSON string).
 *
 * @param ResponseInterface $response
 * @param SigningPublicKey $publicKey
 * @return array
 */
 public function decodeSignedJsonResponse(
 ResponseInterface $response,
 SigningPublicKey $publicKey
 ): array {
 return \json_decode(
 $this->verifySignedStringResponse($response, $publicKey),
 true
 );
 }
 
 /**
 * Decrypt an HTTP request with a pre-shared key, then decode into an
 * array (assuming the body is a valid JSON string).
 *
 * @param RequestInterface $request
 * @param SharedEncryptionKey $key
 * @return array
 */
 public function decryptJsonRequestWithSharedKey(
 RequestInterface $request,
 SharedEncryptionKey $key
 ): array {
 $decrypted = $this->decryptRequestWithSharedKey(
 $request,
 $key
 );
 return \json_decode(
 (string) $decrypted->getBody(),
 true
 );
 }
 
 /**
 * Decrypt an HTTP response with a pre-shared key, then decode into an
 * array (assuming the body is a valid JSON string).
 *
 * @param ResponseInterface $response
 * @param SharedEncryptionKey $key
 * @return array
 */
 public function decryptJsonResponseWithSharedKey(
 ResponseInterface $response,
 SharedEncryptionKey $key
 ): array {
 $decrypted = $this->decryptResponseWithSharedKey(
 $response,
 $key
 );
 return \json_decode(
 (string) $decrypted->getBody(),
 true
 );
 }
 
 /**
 * Decrypt a message with your secret key, that had been encrypted with
 * your public key by the other endpoint, then decode into an array.
 *
 * @param RequestInterface $request
 * @param SealingSecretKey $secretKey
 * @return array
 */
 public function unsealJsonRequest(
 RequestInterface $request,
 SealingSecretKey $secretKey
 ): array {
 return \json_decode(
 $this->unsealStringRequest($request, $secretKey),
 true
 );
 }
 
 /**
 * Decrypt a message with your secret key, that had been encrypted with
 * your public key by the other endpoint, then decode into an array.
 *
 * @param ResponseInterface $response
 * @param SealingSecretKey $secretKey
 * @return array
 */
 public function unsealJsonResponse(
 ResponseInterface $response,
 SealingSecretKey $secretKey
 ): array {
 return \json_decode(
 $this->unsealStringResponse($response, $secretKey),
 true
 );
 }
 }
 
 |