]> git.mxchange.org Git - hub.git/blobdiff - application/hub/main/package/class_NetworkPackage.php
Rewrote determineSenderPrivateKeyHash() to accept whole raw data array.
[hub.git] / application / hub / main / package / class_NetworkPackage.php
index 72667ee5d0b883488174c3a8c50ada7002b00d2c..71e39f89b4b2dbc6477d5c8baa6ea15a5160996f 100644 (file)
@@ -77,12 +77,12 @@ class NetworkPackage extends BaseHubSystem implements Deliverable, Receivable, R
        const INDEX_PACKAGE_RECIPIENT = 1;
        const INDEX_PACKAGE_CONTENT   = 2;
        const INDEX_PACKAGE_STATUS    = 3;
-       const INDEX_PACKAGE_SIGNATURE = 4;
+       const INDEX_PACKAGE_HASH      = 4;
 
        /**
-        * Size of the decoded data array ('status' is not included)
+        * Size of the decoded data array
         */
-       const DECODED_DATA_ARRAY_SIZE = 4;
+       const DECODED_DATA_ARRAY_SIZE = 5;
 
        /**
         * Named array elements for decoded package content
@@ -91,6 +91,8 @@ class NetworkPackage extends BaseHubSystem implements Deliverable, Receivable, R
        const PACKAGE_CONTENT_MESSAGE   = 'message';
        const PACKAGE_CONTENT_TAGS      = 'tags';
        const PACKAGE_CONTENT_CHECKSUM  = 'checksum';
+       const PACKAGE_CONTENT_SENDER    = 'sender';
+       const PACKAGE_CONTENT_HASH      = 'hash';
 
        /**
         * Named array elements for package data
@@ -99,7 +101,7 @@ class NetworkPackage extends BaseHubSystem implements Deliverable, Receivable, R
        const PACKAGE_DATA_RECIPIENT = 'recipient';
        const PACKAGE_DATA_CONTENT   = 'content';
        const PACKAGE_DATA_STATUS    = 'status';
-       const PACKAGE_DATA_SIGNATURE = 'signature';
+       const PACKAGE_DATA_HASH      = 'hash';
 
        /**
         * All package status
@@ -333,6 +335,36 @@ class NetworkPackage extends BaseHubSystem implements Deliverable, Receivable, R
                ), $forceReInit);
        }
 
+       /**
+        * Determines private key hash from given session id
+        *
+        * @param       $decodedData    Array with decoded data
+        * @return      $hash                   Private key's hash
+        */
+       private function determineSenderPrivateKeyHash (array $decodedData) {
+               // Get DHT instance
+               $dhtInstance = DhtObjectFactory::createDhtInstance('node');
+
+               // Ask DHT for session id
+               $senderData = $dhtInstance->findNodeLocalBySessionId($decodedData[self::]);
+
+               // Is an entry found?
+               if (count($senderData) > 0) {
+                       // Make sure the element 'private_key_hash' is there
+                       /* NOISY-DEBUG */ self::createDebugInstance(__CLASS__)->debugOutput('NETWORK-PACKAGE[' . __METHOD__ . ':' . __LINE__ . ']: senderData=' . print_r($senderData, TRUE));
+                       assert(isset($senderData[NodeDistributedHashTableDatabaseWrapper::DB_COLUMN_PRIVATE_KEY_HASH]));
+
+                       // Return it
+                       return $senderData[NodeDistributedHashTableDatabaseWrapper::DB_COLUMN_PRIVATE_KEY_HASH];
+               } // END - if
+
+               // Make sure the requested element is there
+               assert(isset($decodedData[self::INDEX_PACKAGE_HASH]));
+
+               // There is no DHT entry so, accept the hash from decoded data
+               return $decodedData[self::INDEX_PACKAGE_HASH];
+       }
+
        /**
         * "Getter" for hash from given content
         *
@@ -396,8 +428,8 @@ class NetworkPackage extends BaseHubSystem implements Deliverable, Receivable, R
                // Pop the entry (it should be it)
                $nextData = $this->getStackInstance()->popNamed($stackerName);
 
-               // Compare both signatures
-               assert($nextData[self::PACKAGE_DATA_SIGNATURE] == $packageData[self::PACKAGE_DATA_SIGNATURE]);
+               // Compare both hashes
+               assert($nextData[self::PACKAGE_DATA_HASH] == $packageData[self::PACKAGE_DATA_HASH]);
 
                // Temporary set the new status
                $packageData[self::PACKAGE_DATA_STATUS] = $newStatus;
@@ -610,41 +642,42 @@ class NetworkPackage extends BaseHubSystem implements Deliverable, Receivable, R
        }
 
        /**
-        * Generates a signature for given raw package content and sender id
+        * Generates a secure hash for given raw package content and sender id
         *
         * @param       $content        Raw package data
-        * @param       $senderId       Sender id to generate a signature for
-        * @return      $signature      Signature as BASE64-encoded string
-        */
-       private function generatePackageSignature ($content, $senderId) {
-               // Hash content and sender id together, use md5() as last algo
-               $hash = md5($this->getCryptoInstance()->hashString($senderId . $content, $this->getPrivateKey(), FALSE));
-
-               // Encrypt the content again with the hash as a key
-               $encryptedContent = $this->getCryptoInstance()->encryptString($content, $hash);
-
-               // Encode it with BASE64
-               $signature = base64_encode($encryptedContent);
+        * @param       $senderId       Sender id to generate a hash for
+        * @return      $hash   Hash as hex-encoded string
+        */
+       private function generatePackageHash ($content, $senderId) {
+               // Fake array
+               $data = array(
+                       self::INDEX_PACKAGE_SENDER  => $senderId,
+                       self::INDEX_PACKAGE_CONTENT => $content,
+                       self::INDEX_PACKAGE_HASH    => ''
+               );
+       
+               // Hash content and sender id together, use scrypt
+               $hash = Scrypt::hashScrypt($senderId . ':' . $content . ':' . $this->determineSenderPrivateKeyHash($data));
 
                // Return it
-               return $signature;
+               return $hash;
        }
 
        /**
-        * Checks whether the signature of given package data is 'valid', here that
+        * Checks whether the hash of given package data is 'valid', here that
         * means it is the same or not.
         *
         * @param       $decodedArray           An array with 'decoded' (explode() was mostly called) data
-        * @return      $isSignatureValid       Whether the signature is valid
-        * @todo        Unfinished area, signatures are currently NOT fully supported
+        * @return      $isHashValid    Whether the hash is valid
+        * @todo        Unfinished area, hashes are currently NOT fully supported
         */
-       private function isPackageSignatureValid (array $decodedArray) {
-               // Generate the signature of comparing it
-               $signature = $this->generatePackageSignature($decodedArray[self::INDEX_PACKAGE_CONTENT], $decodedArray[self::INDEX_PACKAGE_SENDER]);
+       private function isPackageHashValid (array $decodedArray) {
+               // Check validity
+               $isHashValid = Scrypt::checkScrypt($decodedArray[self::INDEX_PACKAGE_SENDER] . ':' . $decodedArray[self::INDEX_PACKAGE_CONTENT] . ':' . $this->determineSenderPrivateKeyHash($decodedArray);
 
-               // Is it the same?
-               //$isSignatureValid = 
-               exit(__METHOD__ . ': signature=' . $signature . chr(10) . ',decodedArray=' . print_r($decodedArray, TRUE));
+               // Return it
+               //* DEBUG-DIE: */ die(__METHOD__ . ': isHashValid=' . intval($isHashValid) . chr(10) . ',decodedArray=' . print_r($decodedArray, TRUE));
+               return $isHashValid;
        }
 
        /**
@@ -693,7 +726,7 @@ class NetworkPackage extends BaseHubSystem implements Deliverable, Receivable, R
                        self::PACKAGE_DATA_RECIPIENT => $helperInstance->getRecipientType(),
                        self::PACKAGE_DATA_CONTENT   => $packageContent,
                        self::PACKAGE_DATA_STATUS    => self::PACKAGE_STATUS_NEW,
-                       self::PACKAGE_DATA_SIGNATURE => $this->generatePackageSignature($packageContent, $this->getSessionId())
+                       self::PACKAGE_DATA_HASH      => $this->generatePackageHash($packageContent, $this->getSessionId())
                ));
 
                // Debug message
@@ -1201,24 +1234,21 @@ class NetworkPackage extends BaseHubSystem implements Deliverable, Receivable, R
                // Assert on count (should be always 3)
                assert(count($decodedArray) == self::DECODED_DATA_ARRAY_SIZE);
 
-               // Generate the signature of comparing it
-               /*
-                * @todo Unsupported feature of "signed" messages commented out
-               if (!$this->isPackageSignatureValid($decodedArray)) {
+               // Generate the hash of comparing it
+               if (!$this->isPackageHashValid($decodedArray)) {
                        // Is not valid, so throw an exception here
-                       exit(__METHOD__ . ':INVALID SIG! UNDER CONSTRUCTION!' . chr(10));
+                       exit(__METHOD__ . ':INVALID HASH! UNDER CONSTRUCTION!' . chr(10));
                } // END - if
-               */
 
                /*
-                * Create 'decodedData' array with all assoziative array elements,
-                * except signature.
+                * Create 'decodedData' array with all assoziative array elements.
                 */
                $decodedData = array(
                        self::PACKAGE_DATA_SENDER    => $decodedArray[self::INDEX_PACKAGE_SENDER],
                        self::PACKAGE_DATA_RECIPIENT => $decodedArray[self::INDEX_PACKAGE_RECIPIENT],
                        self::PACKAGE_DATA_CONTENT   => $decodedArray[self::INDEX_PACKAGE_CONTENT],
-                       self::PACKAGE_DATA_STATUS    => self::PACKAGE_STATUS_DECODED
+                       self::PACKAGE_DATA_STATUS    => self::PACKAGE_STATUS_DECODED,
+                       self::PACKAGE_DATA_HASH      => $decodedArray[self::INDEX_PACKAGE_HASH]
                );
 
                // And return it
@@ -1256,7 +1286,11 @@ class NetworkPackage extends BaseHubSystem implements Deliverable, Receivable, R
                        // Tags as an indexed array for "tagging" the message
                        self::PACKAGE_CONTENT_TAGS      => explode(self::PACKAGE_TAGS_SEPARATOR, $decodedContent[self::INDEX_TAGS]),
                        // Checksum of the _decoded_ data
-                       self::PACKAGE_CONTENT_CHECKSUM  => $decodedContent[self::INDEX_CHECKSUM]
+                       self::PACKAGE_CONTENT_CHECKSUM  => $decodedContent[self::INDEX_CHECKSUM],
+                       // Sender's id
+                       self::PACKAGE_CONTENT_SENDER    => $decodedData[self::PACKAGE_DATA_SENDER],
+                       // Hash from decoded raw data
+                       self::PACKAGE_CONTENT_HASH      => $decodedData[self::PACKAGE_DATA_HASH]
                );
 
                // Is the checksum valid?
@@ -1305,7 +1339,7 @@ class NetworkPackage extends BaseHubSystem implements Deliverable, Receivable, R
                 * Process the message through all filters, note that all other
                 * elements from $decodedContent are no longer needed.
                 */
-               $chainInstance->processMessage($decodedContent[self::PACKAGE_CONTENT_MESSAGE], $this);
+               $chainInstance->processMessage($decodedContent, $this);
        }
 
        /**
@@ -1342,6 +1376,37 @@ class NetworkPackage extends BaseHubSystem implements Deliverable, Receivable, R
                // Handle message data
                $handlerInstance->handleMessageData($messageArray[self::MESSAGE_ARRAY_DATA], $this);
        }
+
+       /**
+        * Feeds the hash and sender (as recipient for the 'sender' reward) to the
+        * miner's queue, unless the message is not a "reward claim" message as this
+        * leads to an endless loop. You may wish to run the miner to get some
+        * reward ("HubCoins") for "mining" this hash.
+        *
+        * @param       $decodedDataArray       Array with decoded message
+        * @return      void
+        * @todo        ~10% done?
+        */
+       public function feedHashToMiner (array $decodedDataArray) {
+               // Make sure the required elements are there
+               assert(isset($decodedDataArray[self::PACKAGE_CONTENT_SENDER]));
+               assert(isset($decodedDataArray[self::PACKAGE_CONTENT_HASH]));
+               assert(isset($decodedDataArray[self::PACKAGE_CONTENT_TAGS]));
+
+               // Resolve session id ('sender' is a session id) into node id
+               $nodeId = HubTools::resolveNodeIdBySessionId($decodedDataArray[self::PACKAGE_CONTENT_SENDER]);
+
+               // Is 'claim_reward' the message type?
+               if (in_array('claim_reward', $decodedDataArray[self::PACKAGE_CONTENT_TAGS])) {
+                       /*
+                        * Then don't feed this message to the miner as this causes and
+                        * endless loop of mining.
+                        */
+                       return;
+               } // END - if
+
+               $this->partialStub('@TODO nodeId=' . $nodeId . ',decodedDataArray=' . print_r($decodedDataArray, TRUE));
+       }
 }
 
 // [EOF]