diff --git a/TwoFactorAuth.phpproj b/TwoFactorAuth.phpproj
index c17df88..76a1830 100644
--- a/TwoFactorAuth.phpproj
+++ b/TwoFactorAuth.phpproj
@@ -30,6 +30,7 @@
+
diff --git a/composer.json b/composer.json
index c73bb07..43fa999 100644
--- a/composer.json
+++ b/composer.json
@@ -1,7 +1,7 @@
{
"name": "robthree/twofactorauth",
"description": "Two Factor Authentication",
- "version": "1.3",
+ "version": "1.4",
"type": "library",
"keywords": [ "Authentication", "Two Factor Authentication", "Multi Factor Authentication", "TFA", "MFA", "PHP", "Authenticator", "Authy" ],
"homepage": "https://github.com/RobThree/TwoFactorAuth",
diff --git a/lib/Providers/Qr/QRServerProvider.php b/lib/Providers/Qr/QRServerProvider.php
index 87717f1..2d889f9 100644
--- a/lib/Providers/Qr/QRServerProvider.php
+++ b/lib/Providers/Qr/QRServerProvider.php
@@ -43,6 +43,7 @@ class QRServerProvider extends BaseHTTPQRCodeProvider
case 'eps':
return 'application/postscript';
}
+ throw new QRException(sprintf('Unknown MIME-type: %s', $this->format));
}
public function getQRCodeImage($qrtext, $size)
diff --git a/lib/Providers/Qr/QRicketProvider.php b/lib/Providers/Qr/QRicketProvider.php
index b6aed5a..e2f404b 100644
--- a/lib/Providers/Qr/QRicketProvider.php
+++ b/lib/Providers/Qr/QRicketProvider.php
@@ -33,6 +33,7 @@ class QRicketProvider extends BaseHTTPQRCodeProvider
case 'j':
return 'image/jpeg';
}
+ throw new QRException(sprintf('Unknown MIME-type: %s', $this->format));
}
public function getQRCodeImage($qrtext, $size)
diff --git a/lib/Providers/Rng/CSRNGProvider.php b/lib/Providers/Rng/CSRNGProvider.php
new file mode 100644
index 0000000..8dba7fc
--- /dev/null
+++ b/lib/Providers/Rng/CSRNGProvider.php
@@ -0,0 +1,14 @@
+getCode('FOO1BAR8BAZ9'); //1, 8 & 9 are invalid chars
+ $tfa->getCode('FOO1BAR8BAZ9'); //1, 8 & 9 are invalid chars
}
/**
@@ -155,7 +155,7 @@ class TwoFactorAuthTest extends PHPUnit_Framework_TestCase
*/
public function testGetCodeThrowsOnInvalidBase32String2() {
$tfa = new TwoFactorAuth('Test');
- $result = $tfa->getCode('mzxw6==='); //Lowercase
+ $tfa->getCode('mzxw6==='); //Lowercase
}
public function testKnownBase32DecodeTestVectors() {
@@ -242,7 +242,62 @@ class TwoFactorAuthTest extends PHPUnit_Framework_TestCase
$this->assertEquals('47863826', $tfa->getCode($secret, 20000000000));
}
+ /**
+ * @requires function random_bytes
+ */
+ public function testCSRNGProvidersReturnExpectedNumberOfBytes() {
+ $rng = new \RobThree\Auth\Providers\Rng\CSRNGProvider();
+ foreach ($this->getRngTestLengths() as $l)
+ $this->assertEquals($l, strlen($rng->getRandomBytes($l)));
+ $this->assertEquals(true, $rng->isCryptographicallySecure());
+ }
+
+ /**
+ * @requires function hash_algos
+ * @requires function hash
+ */
+ public function testHashRNGProvidersReturnExpectedNumberOfBytes() {
+ $rng = new \RobThree\Auth\Providers\Rng\HashRNGProvider();
+ foreach ($this->getRngTestLengths() as $l)
+ $this->assertEquals($l, strlen($rng->getRandomBytes($l)));
+ $this->assertEquals(false, $rng->isCryptographicallySecure());
+ }
+ /**
+ * @requires function mcrypt_create_iv
+ */
+ public function testMCryptRNGProvidersReturnExpectedNumberOfBytes() {
+ $rng = new \RobThree\Auth\Providers\Rng\MCryptRNGProvider();
+ foreach ($this->getRngTestLengths() as $l)
+ $this->assertEquals($l, strlen($rng->getRandomBytes($l)));
+ $this->assertEquals(true, $rng->isCryptographicallySecure());
+ }
+
+ /**
+ * @requires function openssl_random_pseudo_bytes
+ */
+ public function testStrongOpenSSLRNGProvidersReturnExpectedNumberOfBytes() {
+ $rng = new \RobThree\Auth\Providers\Rng\OpenSSLRNGProvider(true);
+ foreach ($this->getRngTestLengths() as $l)
+ $this->assertEquals($l, strlen($rng->getRandomBytes($l)));
+ $this->assertEquals(true, $rng->isCryptographicallySecure());
+ }
+
+ /**
+ * @requires function openssl_random_pseudo_bytes
+ */
+ public function testNonStrongOpenSSLRNGProvidersReturnExpectedNumberOfBytes() {
+ $rng = new \RobThree\Auth\Providers\Rng\OpenSSLRNGProvider(false);
+ foreach ($this->getRngTestLengths() as $l)
+ $this->assertEquals($l, strlen($rng->getRandomBytes($l)));
+ $this->assertEquals(false, $rng->isCryptographicallySecure());
+ }
+
+
+ private function getRngTestLengths() {
+ return array(1, 16, 32, 256);
+ }
+
private function DecodeDataUri($datauri) {
if (preg_match('/data:(?P[\w\.\-\/]+);(?P\w+),(?P.*)/', $datauri, $m) === 1) {
return array(