<?php
// Own namespace
-namespace CoreFramework\Helper\Crypto;
+namespace Org\Mxchange\CoreFramework\Helper\Crypto;
// Import framework stuff
-use CoreFramework\Factory\ObjectFactory;
-use CoreFramework\Object\BaseFrameworkSystem;
+use Org\Mxchange\CoreFramework\Bootstrap\FrameworkBootstrap;
+use Org\Mxchange\CoreFramework\Crypto\Cryptable;
+use Org\Mxchange\CoreFramework\Crypto\RandomNumber\RandomNumberGenerator;
+use Org\Mxchange\CoreFramework\Factory\Object\ObjectFactory;
+use Org\Mxchange\CoreFramework\Object\BaseFrameworkSystem;
/**
* A helper class for cryptographical things like hashing passwords and so on
*
* @author Roland Haeder <webmaster@shipsimu.org>
* @version 0.0.0
- * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2017 Core Developer Team
+ * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2023 Core Developer Team
* @license GNU GPL 3.0 or any newer version
* @link http://www.shipsimu.org
*
*/
private $salt = '';
+ /**
+ * Instance of a RNG
+ */
+ private $rngInstance = NULL;
+
/**
* Protected constructor
*
* @return void
*/
- protected function __construct () {
+ private function __construct () {
// Call parent constructor
parent::__construct(__CLASS__);
}
if (is_null(self::$selfInstance)) {
// Then get a new one
self::$selfInstance = self::createCryptoHelper();
- } // END - if
+ }
// Return the instance
return self::$selfInstance;
}
+ /**
+ * Setter for RNG instance
+ *
+ * @param $rngInstance An instance of a random number generator (RNG)
+ * @return void
+ */
+ protected final function setRngInstance (RandomNumberGenerator $rngInstance) {
+ $this->rngInstance = $rngInstance;
+ }
+
+ /**
+ * Getter for RNG instance
+ *
+ * @return $rngInstance An instance of a random number generator (RNG)
+ */
+ public final function getRngInstance () {
+ return $this->rngInstance;
+ }
+
/**
* Attaches a crypto stream to this crypto helper by detecting loaded
* modules.
* @return void
*/
protected function attachCryptoStream () {
- // Do we have mcrypt loaded?
+ // @TODO Maybe rewrite this with DirectoryIterator, similar to Compressor thing?
+ // Do we have openssl/mcrypt loaded?
if ($this->isPhpExtensionLoaded('mcrypt')) {
// Then use it
- $this->cryptoStreamInstance = ObjectFactory::createObjectByName('McryptStream', array($this->getRngInstance()));
+ $this->cryptoStreamInstance = ObjectFactory::createObjectByConfiguredName('crypto_mcrypt_stream_class', array($this->getRngInstance()));
+ } elseif ($this->isPhpExtensionLoaded('openssl')) {
+ // Then use it
+ $this->cryptoStreamInstance = ObjectFactory::createObjectByConfiguredName('crypto_openssl_stream_class', array($this->getRngInstance()));
} else {
// If nothing works ...
- $this->cryptoStreamInstance = ObjectFactory::createObjectByName('NullCryptoStream');
+ $this->cryptoStreamInstance = ObjectFactory::createObjectByConfiguredName('crypto_null_stream_class');
}
}
$randomString = $this->getRngInstance()->randomString() . $this->createUuid();
// Get config entry for salt length
- $length = $this->getConfigInstance()->getConfigEntry('salt_length');
+ $length = FrameworkBootstrap::getConfigurationInstance()->getConfigEntry('salt_length');
// Keep only defined number of characters
$this->salt = substr(sha1($randomString), -$length, $length);
$uuid = '';
// Is the UUID extension loaded and enabled? (see pecl)
- if ($this->getConfigInstance()->getConfigEntry('extension_uuid_loaded') === TRUE) {
+ if (FrameworkBootstrap::getConfigurationInstance()->getConfigEntry('extension_uuid_loaded') === true) {
// Then add it as well
$uuid = uuid_create();
- } // END - if
+ }
// Return it
return $uuid;
* @param $withFixed Whether to include a fixed salt (not recommended in p2p applications)
* @return $hashed The hashed and salted string
*/
- public function hashString ($str, $oldHash = '', $withFixed = TRUE) {
- // Cast the string
- $str = (string) $str;
-
+ public function hashString (string $str, string $oldHash = '', bool $withFixed = true) {
// Default is the default salt ;-)
$salt = $this->salt;
// Is the old password set?
if (!empty($oldHash)) {
// Use the salt from hash, first get length
- $length = $this->getConfigInstance()->getConfigEntry('salt_length');
+ $length = FrameworkBootstrap::getConfigurationInstance()->getConfigEntry('salt_length');
// Then extract the X first characters from the hash as our salt
$salt = substr($oldHash, 0, $length);
- } // END - if
+ }
// Hash the password with salt
//* DEBUG: */ echo "salt=".$salt."/plain=".$str."<br />\n";
- if ($withFixed === TRUE) {
+ if ($withFixed === true) {
// Use additional fixed salt
- $hashed = $salt . md5(sprintf($this->getConfigInstance()->getConfigEntry('hash_extra_mask'),
+ $hashed = $salt . md5(sprintf(FrameworkBootstrap::getConfigurationInstance()->getConfigEntry('hash_extra_mask'),
$salt,
$this->getRngInstance()->getFixedSalt(),
$str
));
} else {
// Use salt+string to hash
- $hashed = $salt . md5(sprintf($this->getConfigInstance()->getConfigEntry('hash_normal_mask'),
+ $hashed = $salt . md5(sprintf(FrameworkBootstrap::getConfigurationInstance()->getConfigEntry('hash_normal_mask'),
$salt,
$str
));
* @param $key Optional key, if none provided, a random key will be generated
* @return $encrypted Encrypted string
*/
- public function encryptString ($str, $key = NULL) {
+ public function encryptString (string $str, string $key = NULL) {
// Encrypt the string through the stream
$encrypted = $this->cryptoStreamInstance->encryptStream($str, $key);
* @param $encrypted Encrypted string
* @return $str The unencrypted string
*/
- public function decryptString ($encrypted) {
+ public function decryptString (string $encrypted) {
// Encrypt the string through the stream
$str = $this->cryptoStreamInstance->decryptStream($encrypted);