Skip to content

Instantly share code, notes, and snippets.

@mwleinad
Created July 18, 2018 14:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mwleinad/a47f9d469383d46c91fe22e7351f3845 to your computer and use it in GitHub Desktop.
Save mwleinad/a47f9d469383d46c91fe22e7351f3845 to your computer and use it in GitHub Desktop.
Salesloft Payload decryption in PHP
<?php
namespace Modules\Integrations\Salesloft\Services;
use Jose\Component\Core\AlgorithmManager;
use Jose\Component\Encryption\Algorithm\KeyEncryption\A256GCMKW;
use Jose\Component\Encryption\Algorithm\ContentEncryption\A256GCM;
use Jose\Component\Encryption\Compression\CompressionMethodManager;
use Jose\Component\Encryption\Compression\Deflate;
use Jose\Component\Encryption\JWEDecrypter;
use Jose\Component\Core\Converter\StandardConverter;
use Jose\Component\Core\JWK;
use Jose\Component\Encryption\Serializer\JWESerializerManager;
use Jose\Component\Encryption\Serializer\CompactSerializer;
use Base64Url\Base64Url;
use Exception;
use Log;
/**
* Class SalesloftPayloadEncryptionService
* @package Integrations\Salesloft\Services
*/
class SalesloftPayloadService {
public function decrypt($secret, $payload) {
try {
$jweDecrypter = $this->getDecrypter();
$jwk = $this->getJwk($secret);
$jwe = $this->getJwe($payload);
$jweDecrypter->decryptUsingKey($jwe, $jwk, 0);
$decryptedPayload = json_decode($jwe->getPayload());
return $decryptedPayload;
} catch(Exception $e) {
Log::info(config('salesloft.name').$e->getMessage());
return null;
}
}
private function getDecrypter() {
$keyEncryptionAlgorithmManager = AlgorithmManager::create([
new A256GCMKW()
]);
$contentEncryptionAlgorithmManager = AlgorithmManager::create([
new A256GCM()
]);
$compressionMethodManager = CompressionMethodManager::create([
new Deflate(),
]);
return new JWEDecrypter(
$keyEncryptionAlgorithmManager,
$contentEncryptionAlgorithmManager,
$compressionMethodManager
);
}
private function getJwk($secret) {
$key = Base64Url::encode(hash('sha256', $secret, true));
return JWK::create([
'kty' => 'oct',
'k' => $key,
]);
}
private function getJwe($payload) {
$jsonConverter = new StandardConverter();
// The serializer manager. We only use the JWE Compact Serialization Mode.
$serializerManager = JWESerializerManager::create([
new CompactSerializer($jsonConverter),
]);
// We try to load the token.
return $serializerManager->unserialize($payload);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment