blob: eb82b3b61563f66e7ac05d6a62b1d00bf91e57ff [file] [log] [blame]
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +01001<?php
2
3namespace RobThree\Auth\Providers\Rng;
4
5class OpenSSLRNGProvider implements IRNGProvider
6{
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +02007 /** @var bool */
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +01008 private $requirestrong;
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +02009
10 /**
11 * @param bool $requirestrong
12 */
13 public function __construct($requirestrong = true)
14 {
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010015 $this->requirestrong = $requirestrong;
16 }
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020017
18 /**
19 * {@inheritdoc}
20 */
21 public function getRandomBytes($bytecount)
22 {
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010023 $result = openssl_random_pseudo_bytes($bytecount, $crypto_strong);
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020024 if ($this->requirestrong && ($crypto_strong === false)) {
25 throw new RNGException('openssl_random_pseudo_bytes returned non-cryptographically strong value');
26 }
27 if ($result === false) {
28 throw new RNGException('openssl_random_pseudo_bytes returned an invalid value');
29 }
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010030 return $result;
31 }
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020032
33 /**
34 * {@inheritdoc}
35 */
36 public function isCryptographicallySecure()
37 {
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010038 return $this->requirestrong;
39 }
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020040}