|
Posted by razorfold@gmail.com on 10/26/05 05:59
Hi,
I've written something that takes text and passes it to gpg to encrypt.
It works great except when the text size is greater than 64k at which
point PHP/Apache hangs. Is there any way around this? Below is a code
snippet (which may or may not help).
Thanks,
-r
function encryptContent($fileContent, $encryptionKey)
{
if(!$this->gpgVerify())
{
$this->displayTextInTable('gpgVerify failed!');
exit;
}
$command = '/safeModeExecDir/gpg --homedir /data/.gnupg --armor
--cipher-algo AES256 --passphrase-fd 3 --batch
--no-tty --yes -c';
// set up pipes for handling I/O to/from GnuPG
// 0 === STDIN, a pipe that GnuPG will read the content from
// 1 === STDOUT, a pipe that GnuPG will write the encrypted
content to
// 2 === STDERR, a pipe that GnuPG will write to
// 3 === STDIN, a pipe that GnuPG will read the passphrase from
$descriptorSpec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w"),
3 => array("pipe", "r")
);
$gpgProcess = proc_open($command, $descriptorSpec, $gpgPipes);
if(is_resource($gpgProcess))
{
// this writes $fileContent to GnuPG on STDIN
if(false === fwrite($gpgPipes[0], $fileContent,
strlen($fileContent)))
{
$this->displayTextInTable('fwrite failed!');
exit;
}
fclose($gpgPipes[0]);
// this writes the $encryptionKey to GnuPG on fd 3
fwrite($gpgPipes[3], $encryptionKey);
fclose($gpgPipes[3]);
// this reads the encrypted output from GnuPG from STDOUT
$encryptedContent = '';
while(!feof($gpgPipes[1]))
{
$encryptedContent .= fgets($gpgPipes[1], 1024);
}
fclose($gpgPipes[1]);
// this reads warnings and notices from GnuPG from STDERR
$gpgErrorMessage = '';
while(!feof($gpgPipes[2]))
{
$gpgErrorMessage .= fgets($gpgPipes[2], 1024);
}
fclose($gpgPipes[2]);
// this collects the exit status of GnuPG
$processExitStatus = proc_close($gpgProcess);
// unset variables that are no longer needed
// and can only cause trouble
unset(
$fileContent,
$encryptionKey,
$command,
$descriptorSpec,
$gpgProcess,
$gpgPipes,
$gpgErrorMessage,
$gpgExitStatus
);
}
else
{
$this->displayTextInTable('proc_open() failed.');
exit;
}
return $encryptedContent;
}
[Back to original message]
|