| 
<?php
 use LSNepomuceno\LaravelA1PdfSign\{ManageCert, SignaturePdf, ValidatePdfSignature};
 use Illuminate\Support\{Str, Facades\File, Fluent};
 use Illuminate\Http\UploadedFile;
 
 if (!function_exists('signPdf')) {
 /**
 * signPdf - Helper to fast signature pdf from pfx file
 *
 * @param string $pfxPath
 * @param string $password
 * @param string $pdfPath
 * @param string $mode
 * @return mixed
 * @throws Throwable
 */
 function signPdfFromFile(string $pfxPath, string $password, string $pdfPath, string $mode = SignaturePdf::MODE_RESOURCE)
 {
 try {
 return (new SignaturePdf(
 $pdfPath,
 (new ManageCert)->fromPfx($pfxPath, $password),
 $mode
 ))->signature();
 } catch (\Throwable $th) {
 throw $th;
 }
 }
 }
 
 if (!function_exists('signPdfFromUpload')) {
 /**
 * signPdfFromUpload - Helper to fast signature pdf from uploaded certificate
 *
 * @param UploadedFile $uploadedPfx
 * @param string $password
 * @param string $pdfPath
 * @param string $mode
 * @return mixed
 * @throws Throwable
 */
 function signPdfFromUpload(UploadedFile $uploadedPfx, string $password, string $pdfPath, string $mode = SignaturePdf::MODE_RESOURCE)
 {
 try {
 return (new SignaturePdf(
 $pdfPath,
 (new ManageCert)->fromUpload($uploadedPfx, $password),
 $mode
 ))->signature();
 } catch (\Throwable $th) {
 throw $th;
 }
 }
 }
 
 if (!function_exists('encryptCertData')) {
 /**
 * encryptCertData - Helper to fast encrypt certificate data
 *
 * @param UploadedFile|string $uploadedOrPfxPath
 * @param string $password
 * @return Fluent
 * @throws Throwable
 */
 function encryptCertData($uploadedOrPfxPath, string $password): Fluent
 {
 try {
 $cert = new ManageCert;
 
 if ($uploadedOrPfxPath instanceof UploadedFile) {
 $cert->fromUpload($uploadedOrPfxPath, $password);
 } else {
 $cert->fromPfx($uploadedOrPfxPath, $password);
 }
 
 return new Fluent([
 'certificate' => $cert->getEncrypter()->encryptString($cert->getCert()->original),
 'password' => $cert->getEncrypter()->encryptString($password),
 'hash' => $cert->getHashKey(), // IMPORTANT, USE ON DECRYPT HELPER
 ]);
 } catch (\Throwable $th) {
 throw $th;
 }
 }
 }
 
 if (!function_exists('decryptCertData')) {
 /**
 * decryptCertData - Helper to fast decrypt certificate
 *
 * @param string $hashKey
 * @param string $encryptCert
 * @param string $password
 * @param bool $isBase64
 * @return ManageCert
 * @throws Throwable
 */
 function decryptCertData(string $hashKey, string $encryptCert, string $password, bool $isBase64 = false): ManageCert
 {
 try {
 $cert = (new ManageCert)->setHashKey($hashKey);
 $uuid = Str::orderedUuid();
 $pfxName = "{$cert->getTempDir()}{$uuid}.pfx";
 
 $decryptedData = $cert->getEncrypter()->decryptString($encryptCert);
 File::put($pfxName, $isBase64 ? base64_decode($decryptedData) : $decryptedData);
 
 return $cert->fromPfx(
 $pfxName,
 $cert->getEncrypter()->decryptString($password)
 );
 } catch (\Throwable $th) {
 throw $th;
 }
 }
 }
 
 if (!function_exists('a1TempDir')) {
 /**
 * a1TempDir - Helper to make temp dir and files
 *
 * @param bool $tempFile
 * @param string $fileExt
 * @return string
 */
 function a1TempDir(bool $tempFile = false, string $fileExt = '.pfx'): string
 {
 $tempDir = __DIR__ . '/Temp/';
 
 if ($tempFile) $tempDir .= Str::orderedUuid() . $fileExt;
 
 return $tempDir;
 }
 }
 
 if (!function_exists('validatePdfSignature')) {
 /**
 * validatePdfSignature - Validate pdf signature
 *
 * @param string $pdfPath
 * @return Fluent
 * @throws Throwable
 */
 function validatePdfSignature(string $pdfPath): Fluent
 {
 try {
 return ValidatePdfSignature::from($pdfPath);
 } catch (\Throwable $th) {
 throw $th;
 }
 }
 }
 
 |