]> git.mxchange.org Git - friendica.git/blobdiff - src/Util/Crypto.php
typo
[friendica.git] / src / Util / Crypto.php
index 2b1ce0f02be5b77f78f3d1844c34ddd7fd010427..78f7c349a71eb855e2f05ebb3d8c528b4adcc83e 100644 (file)
@@ -4,9 +4,10 @@
  */
 namespace Friendica\Util;
 
-use Friendica\Core\Addon;
 use Friendica\Core\Config;
+use Friendica\Core\Hook;
 use Friendica\Core\Logger;
+use Friendica\Core\System;
 use ASN_BASE;
 use ASNValue;
 
@@ -24,6 +25,9 @@ class Crypto
         */
        public static function rsaSign($data, $key, $alg = 'sha256')
        {
+               if (empty($key)) {
+                       Logger::warning('Empty key parameter', ['callstack' => System::callstack()]);
+               }
                openssl_sign($data, $sig, $key, (($alg == 'sha1') ? OPENSSL_ALGO_SHA1 : $alg));
                return $sig;
        }
@@ -37,12 +41,15 @@ class Crypto
         */
        public static function rsaVerify($data, $sig, $key, $alg = 'sha256')
        {
+               if (empty($key)) {
+                       Logger::warning('Empty key parameter', ['callstack' => System::callstack()]);
+               }
                return openssl_verify($data, $sig, $key, (($alg == 'sha1') ? OPENSSL_ALGO_SHA1 : $alg));
        }
 
        /**
         * @param string $Der     der formatted string
-        * @param string $Private key type optional, default false
+        * @param bool   $Private key type optional, default false
         * @return string
         */
        private static function DerToPem($Der, $Private = false)
@@ -149,6 +156,7 @@ class Crypto
         * @param string $m   modulo reference
         * @param object $e   exponent reference
         * @return void
+        * @throws \Exception
         */
        private static function pubRsaToMe($key, &$m, &$e)
        {
@@ -159,13 +167,14 @@ class Crypto
 
                $r = ASN_BASE::parseASNString($x);
 
-               $m = base64url_decode($r[0]->asnData[0]->asnData);
-               $e = base64url_decode($r[0]->asnData[1]->asnData);
+               $m = Strings::base64UrlDecode($r[0]->asnData[0]->asnData);
+               $e = Strings::base64UrlDecode($r[0]->asnData[1]->asnData);
        }
 
        /**
         * @param string $key key
         * @return string
+        * @throws \Exception
         */
        public static function rsaToPem($key)
        {
@@ -176,6 +185,7 @@ class Crypto
        /**
         * @param string $key key
         * @return string
+        * @throws \Exception
         */
        private static function pemToRsa($key)
        {
@@ -188,6 +198,7 @@ class Crypto
         * @param string $m   modulo reference
         * @param string $e   exponent reference
         * @return void
+        * @throws \Exception
         */
        public static function pemToMe($key, &$m, &$e)
        {
@@ -198,8 +209,8 @@ class Crypto
 
                $r = ASN_BASE::parseASNString($x);
 
-               $m = base64url_decode($r[0]->asnData[1]->asnData[0]->asnData[0]->asnData);
-               $e = base64url_decode($r[0]->asnData[1]->asnData[0]->asnData[1]->asnData);
+               $m = Strings::base64UrlDecode($r[0]->asnData[1]->asnData[0]->asnData[0]->asnData);
+               $e = Strings::base64UrlDecode($r[0]->asnData[1]->asnData[0]->asnData[1]->asnData);
        }
 
        /**
@@ -217,6 +228,7 @@ class Crypto
        /**
         * @param integer $bits number of bits
         * @return mixed
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
        public static function newKeypair($bits)
        {
@@ -318,14 +330,15 @@ class Crypto
        }
 
        /**
-        * 
+        *
         * Ported from Hubzilla: https://framagit.org/hubzilla/core/blob/master/include/crypto.php
-        * 
+        *
         * @param string $data
         * @param string $pubkey The public key.
         * @param string $alg    The algorithm used for encryption.
-        * 
+        *
         * @return array
+        * @throws \Exception
         */
        public static function encapsulate($data, $pubkey, $alg = 'aes256cbc')
        {
@@ -336,14 +349,15 @@ class Crypto
        }
 
        /**
-        * 
+        *
         * Ported from Hubzilla: https://framagit.org/hubzilla/core/blob/master/include/crypto.php
-        * 
-        * @param type $data
-        * @param type $pubkey The public key.
-        * @param type $alg    The algorithm used for encryption.
-        * 
+        *
+        * @param string $data
+        * @param string $pubkey The public key.
+        * @param string $alg    The algorithm used for encryption.
+        *
         * @return array
+        * @throws \Exception
         */
        private static function encapsulateOther($data, $pubkey, $alg)
        {
@@ -355,7 +369,7 @@ class Crypto
                        $result = ['encrypted' => true];
                        $key = random_bytes(256);
                        $iv  = random_bytes(256);
-                       $result['data'] = base64url_encode(self::$fn($data, $key, $iv), true);
+                       $result['data'] = Strings::base64UrlEncode(self::$fn($data, $key, $iv), true);
 
                        // log the offending call so we can track it down
                        if (!openssl_public_encrypt($key, $k, $pubkey)) {
@@ -364,27 +378,28 @@ class Crypto
                        }
 
                        $result['alg'] = $alg;
-                       $result['key'] = base64url_encode($k, true);
+                       $result['key'] = Strings::base64UrlEncode($k, true);
                        openssl_public_encrypt($iv, $i, $pubkey);
-                       $result['iv'] = base64url_encode($i, true);
+                       $result['iv'] = Strings::base64UrlEncode($i, true);
 
                        return $result;
                } else {
                        $x = ['data' => $data, 'pubkey' => $pubkey, 'alg' => $alg, 'result' => $data];
-                       Addon::callHooks('other_encapsulate', $x);
+                       Hook::callAll('other_encapsulate', $x);
 
                        return $x['result'];
                }
        }
 
        /**
-        * 
+        *
         * Ported from Hubzilla: https://framagit.org/hubzilla/core/blob/master/include/crypto.php
-        * 
+        *
         * @param string $data
         * @param string $pubkey
-        * 
+        *
         * @return array
+        * @throws \Exception
         */
        private static function encapsulateAes($data, $pubkey)
        {
@@ -395,7 +410,7 @@ class Crypto
                $key = random_bytes(32);
                $iv  = random_bytes(16);
                $result = ['encrypted' => true];
-               $result['data'] = base64url_encode(self::encryptAES256CBC($data, $key, $iv), true);
+               $result['data'] = Strings::base64UrlEncode(self::encryptAES256CBC($data, $key, $iv), true);
 
                // log the offending call so we can track it down
                if (!openssl_public_encrypt($key, $k, $pubkey)) {
@@ -404,23 +419,24 @@ class Crypto
                }
 
                $result['alg'] = 'aes256cbc';
-               $result['key'] = base64url_encode($k, true);
+               $result['key'] = Strings::base64UrlEncode($k, true);
                openssl_public_encrypt($iv, $i, $pubkey);
-               $result['iv'] = base64url_encode($i, true);
+               $result['iv'] = Strings::base64UrlEncode($i, true);
 
                return $result;
        }
 
        /**
-        * 
+        *
         * Ported from Hubzilla: https://framagit.org/hubzilla/core/blob/master/include/crypto.php
-        * 
-        * @param string $data
-        * @param string $prvkey  The private key used for decryption.
-        * 
+        *
+        * @param array $data ['iv' => $iv, 'key' => $key, 'alg' => $alg, 'data' => $data]
+        * @param string $prvkey The private key used for decryption.
+        *
         * @return string|boolean The decrypted string or false on failure.
+        * @throws \Exception
         */
-       public static function unencapsulate($data, $prvkey)
+       public static function unencapsulate(array $data, $prvkey)
        {
                if (!$data) {
                        return;
@@ -428,52 +444,75 @@ class Crypto
 
                $alg = ((array_key_exists('alg', $data)) ? $data['alg'] : 'aes256cbc');
                if ($alg === 'aes256cbc') {
-                       return self::encapsulateAes($data, $prvkey);
+                       return self::encapsulateAes($data['data'], $prvkey);
                }
-               return self::encapsulateOther($data, $prvkey, $alg);
+               return self::encapsulateOther($data['data'], $prvkey, $alg);
        }
 
        /**
-        * 
+        *
         * Ported from Hubzilla: https://framagit.org/hubzilla/core/blob/master/include/crypto.php
-        * 
-        * @param string $data
-        * @param string $prvkey  The private key used for decryption.
+        *
+        * @param array $data
+        * @param string $prvkey The private key used for decryption.
         * @param string $alg
-        * 
+        *
         * @return string|boolean The decrypted string or false on failure.
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       private static function unencapsulateOther($data, $prvkey, $alg)
+       private static function unencapsulateOther(array $data, $prvkey, $alg)
        {
                $fn = 'decrypt' . strtoupper($alg);
 
                if (method_exists(__CLASS__, $fn)) {
-                       openssl_private_decrypt(base64url_decode($data['key']), $k, $prvkey);
-                       openssl_private_decrypt(base64url_decode($data['iv']), $i, $prvkey);
+                       openssl_private_decrypt(Strings::base64UrlDecode($data['key']), $k, $prvkey);
+                       openssl_private_decrypt(Strings::base64UrlDecode($data['iv']), $i, $prvkey);
 
-                       return self::$fn(base64url_decode($data['data']), $k, $i);
+                       return self::$fn(Strings::base64UrlDecode($data['data']), $k, $i);
                } else {
                        $x = ['data' => $data, 'prvkey' => $prvkey, 'alg' => $alg, 'result' => $data];
-                       Addon::callHooks('other_unencapsulate', $x);
+                       Hook::callAll('other_unencapsulate', $x);
 
                        return $x['result'];
                }
        }
 
        /**
-        * 
+        *
         * Ported from Hubzilla: https://framagit.org/hubzilla/core/blob/master/include/crypto.php
-        * 
+        *
         * @param array  $data
-        * @param string $prvkey  The private key used for decryption.
-        * 
+        * @param string $prvkey The private key used for decryption.
+        *
         * @return string|boolean The decrypted string or false on failure.
+        * @throws \Exception
         */
        private static function unencapsulateAes($data, $prvkey)
        {
-               openssl_private_decrypt(base64url_decode($data['key']), $k, $prvkey);
-               openssl_private_decrypt(base64url_decode($data['iv']), $i, $prvkey);
+               openssl_private_decrypt(Strings::base64UrlDecode($data['key']), $k, $prvkey);
+               openssl_private_decrypt(Strings::base64UrlDecode($data['iv']), $i, $prvkey);
+
+               return self::decryptAES256CBC(Strings::base64UrlDecode($data['data']), $k, $i);
+       }
+
+
+       /**
+        * Creates cryptographic secure random digits
+        *
+        * @param string $digits The count of digits
+        * @return int The random Digits
+        *
+        * @throws \Exception In case 'random_int' isn't usable
+        */
+       public static function randomDigits($digits)
+       {
+               $rn = '';
+
+               // generating cryptographically secure pseudo-random integers
+               for ($i = 0; $i < $digits; $i++) {
+                       $rn .= random_int(0, 9);
+               }
 
-               return self::decryptAES256CBC(base64url_decode($data['data']), $k, $i);
+               return $rn;
        }
 }