Open Journal Systems  3.3.0
SMimeSigner.php
1 <?php
2 
3 /*
4  * This file is part of the Symfony package.
5  *
6  * (c) Fabien Potencier <fabien@symfony.com>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11 
13 
16 
20 final class SMimeSigner extends SMime
21 {
22  private $signCertificate;
23  private $signPrivateKey;
24  private $signOptions;
25  private $extraCerts;
26 
30  private $privateKeyPassphrase;
31 
39  public function __construct(string $certificate, string $privateKey, string $privateKeyPassphrase = null, string $extraCerts = null, int $signOptions = null)
40  {
41  if (!\extension_loaded('openssl')) {
42  throw new \LogicException('PHP extension "openssl" is required to use SMime.');
43  }
44 
45  $this->signCertificate = $this->normalizeFilePath($certificate);
46 
47  if (null !== $privateKeyPassphrase) {
48  $this->signPrivateKey = [$this->normalizeFilePath($privateKey), $privateKeyPassphrase];
49  } else {
50  $this->signPrivateKey = $this->normalizeFilePath($privateKey);
51  }
52 
53  $this->signOptions = $signOptions ?? PKCS7_DETACHED;
54  $this->extraCerts = $extraCerts ? realpath($extraCerts) : null;
55  $this->privateKeyPassphrase = $privateKeyPassphrase;
56  }
57 
58  public function sign(Message $message): Message
59  {
60  $bufferFile = tmpfile();
61  $outputFile = tmpfile();
62 
63  $this->iteratorToFile($message->getBody()->toIterable(), $bufferFile);
64 
65  if (!@openssl_pkcs7_sign(stream_get_meta_data($bufferFile)['uri'], stream_get_meta_data($outputFile)['uri'], $this->signCertificate, $this->signPrivateKey, [], $this->signOptions, $this->extraCerts)) {
66  throw new RuntimeException(sprintf('Failed to sign S/Mime message. Error: "%s".', openssl_error_string()));
67  }
68 
69  return new Message($message->getHeaders(), $this->convertMessageToSMimePart($outputFile, 'multipart', 'signed'));
70  }
71 }
Symfony\Component\Mime\Exception\RuntimeException
Definition: vendor/symfony/mime/Exception/RuntimeException.php:17
Symfony\Component\Mime\Crypto\SMime\iteratorToFile
iteratorToFile(iterable $iterator, $stream)
Definition: SMime.php:33
Symfony\Component\Mime\Crypto\SMimeSigner\sign
sign(Message $message)
Definition: SMimeSigner.php:61
Symfony\Component\Mime\Crypto\SMimeSigner
Definition: SMimeSigner.php:20
Symfony\Component\Mime\Message
Definition: Message.php:22
Symfony\Component\Mime\Crypto\SMimeSigner\__construct
__construct(string $certificate, string $privateKey, string $privateKeyPassphrase=null, string $extraCerts=null, int $signOptions=null)
Definition: SMimeSigner.php:42
Symfony\Component\Mime\Message\getBody
getBody()
Definition: Message.php:52
Symfony\Component\Mime\Crypto
Definition: SMime.php:12
Symfony\Component\Mime\Crypto\SMime
Definition: SMime.php:22
Symfony\Component\Mime\Crypto\SMime\normalizeFilePath
normalizeFilePath(string $path)
Definition: SMime.php:24
Symfony\Component\Mime\Message\getHeaders
getHeaders()
Definition: Message.php:67