blob: d17a5f876ce802c982f62a535178112d8396aafa [file] [log] [blame]
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +01001<?php
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +02002
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +01003namespace RobThree\Auth\Providers\Rng;
4
5class HashRNGProvider implements IRNGProvider
6{
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +02007 /** @var string */
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +01008 private $algorithm;
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +02009
10 /**
11 * @param string $algorithm
12 */
13 public function __construct($algorithm = 'sha256')
14 {
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010015 $algos = array_values(hash_algos());
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020016 if (!in_array($algorithm, $algos, true)) {
17 throw new RNGException('Unsupported algorithm specified');
18 }
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010019 $this->algorithm = $algorithm;
20 }
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020021
22 /**
23 * {@inheritdoc}
24 */
25 public function getRandomBytes($bytecount)
26 {
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010027 $result = '';
28 $hash = mt_rand();
29 for ($i = 0; $i < $bytecount; $i++) {
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020030 $hash = hash($this->algorithm, $hash . mt_rand(), true);
31 $result .= $hash[mt_rand(0, strlen($hash) - 1)];
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010032 }
33 return $result;
34 }
Matthias Andreas Benkard7b2a3a12021-08-16 10:57:25 +020035
36 /**
37 * {@inheritdoc}
38 */
39 public function isCryptographicallySecure()
40 {
Matthias Andreas Benkardb382b102021-01-02 15:32:21 +010041 return false;
42 }
43}