|  | 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] |