Ejemplo n.º 1
0
    def reply_commit(blockchain, logger, values):
        logger.debug("in reply_commit fxn")
        signature = values.get('tc_signed')
        node_address = values.get('address')
        if signature is None or node_address is None:
            return jsonify("Error: invalid json received, Bad request"), 400
        if node_address not in blockchain.public_key_list:
            return jsonify("Bad request"), 400

        signature = BLS.deserialize(signature, Signature)
        hash_of_priority_block = blockchain.proposed_block.get_hash()
        temp_array = []
        for c in hash_of_priority_block:
            temp_array.append(ord(c))
        msg = bytes(temp_array)

        signature.set_aggregation_info(
            AggregationInfo.from_msg(
                PublicKey.from_bytes(
                    bytes(blockchain.public_key_list[node_address],
                          "ISO-8859-1")), msg))
        verify_sign = signature.verify()

        if verify_sign:
            logger.debug("reply commit signature verified")
            blockchain.commit_accepted[node_address] = signature
            # print("commit accepted by ", len(blockchain.commit_accepted))
            return jsonify("True"), 200
        else:
            logger.warning("reply commit signature tempered")
            return jsonify("False"), 300
Ejemplo n.º 2
0
    def verified_commit(blockchain, logger, values):
        block_hash = values.get('block')
        if block_hash is None:
            return jsonify("tempered Data"), 401
        block = blockchain.commit_verified_list.get(block_hash)
        if block is None:
            return jsonify("verification block missing"), 402
        signers = values.get('n_list')
        co_sig = values.get('co_sig')
        if (signers is None) or (co_sig is None):
            return jsonify("tempered block data"), 403
        co_sig = BLS.deserialize(co_sig, Signature)
        flag = block.verify_block(blockchain)
        if not flag:
            return jsonify("invalid block!"), 301
        node_address = block.harvester
        block_hash_hexdigest = block.get_hash()
        if node_address in blockchain.public_key_list:
            if len(signers) / len(blockchain.public_key_list) > 0.66:

                temp_array = []
                for c in block_hash_hexdigest:
                    temp_array.append(ord(c))
                msg = bytes(temp_array)
                agg_info_list = []
                for node in signers:
                    if node in blockchain.public_key_list:
                        agg_info = AggregationInfo.from_msg(
                            PublicKey.from_bytes(
                                bytes(blockchain.public_key_list[node],
                                      "ISO-8859-1")), msg)
                        agg_info_list.append(agg_info)
                    else:
                        return jsonify("BlockChain couldn't updated "), 302

                agg_public_key = AggregationInfo.merge_infos(agg_info_list)
                co_sig.set_aggregation_info(agg_public_key)
                verify_signature = co_sig.verify()

                if verify_signature:
                    logger.debug("hey you verified commit block" +
                                 block.get_hash())
                    block.signers = signers
                    block.signature = values.get('co_sig')
                    blockchain.update_blockchain(block)
                    return jsonify("BlockChain should be updated "), 200
                else:
                    return jsonify("BlockChain couldn't updated "), 303
            else:
                logger.warning("you didn't get majority")
                return jsonify("BlockChain couldn't updated "), 304
        logger.debug("node address didn't exists")
        return jsonify("BlockChain couldn't updated "), 305
Ejemplo n.º 3
0
 def commit(blockchain, logger, values):
     block_hash = values.get('block')
     signers = values.get('n_list')
     co_sig = values.get('co_sig')
     if block_hash is None or co_sig is None:
         return jsonify("tempered Data"), 300
     # co_sig = bytes(co_sig, "ISO-8859-1")
     # co_sig = Signature.from_bytes(co_sig)
     block = blockchain.proposal_verified_list.get(block_hash)
     if (block is None) or (signers is None):
         return jsonify("tempered Data"), 301
     # temp_co_sig = []
     # if type(co_sig) == list:
     #     for each_sig in co_sig:
     #         each_sig = bytes(each_sig, "ISO-8859-1")
     #         each_sig = Signature.from_bytes(each_sig)
     #         temp_co_sig.append(each_sig)
     #
     #     co_sig = Signature.aggregate(temp_co_sig)
     #     co_sig = str(co_sig.serialize(), "ISO-8859-1")
     node_address = block.harvester
     co_sig = BLS.deserialize(co_sig, Signature)
     block_hash_hash_digest = sha256(str(block_hash).encode()).hexdigest()
     if node_address in blockchain.public_key_list and block_hash_hash_digest not in blockchain.broadcast_list:
         if len(signers) / len(blockchain.public_key_list) > 0.66:
             _block = copy(block)
             _block.signature = co_sig
             _block.signers = signers
             if _block.verify_block_signature(blockchain):
                 blockchain.broadcast_list.append(block_hash_hash_digest)
                 blockchain.broadcast_it("/commit", values)
                 logger.debug("commit fxn call using hash: " + block_hash)
                 blockchain.commit_queue[block_hash] = block
                 threading.Thread(target=blockchain.sign_commit_block,
                                  args={blockchain.sign_commit_block_delay
                                        }).start()
                 return jsonify("BlockChain should be updated "), 200
             else:
                 logger.warning(
                     "given signature for commit verification is tempered")
                 return jsonify("BlockChain couldn't updated "), 201
         else:
             logger.warning("you did not get majority")
             return jsonify("BlockChain couldn't updated "), 202
     logger.warning("tempered data or retransmitted data")
     return jsonify("BlockChain couldn't updated "), 203
Ejemplo n.º 4
0
 def reply_proposed(blockchain, logger, values):
     logger.debug("in reply_proposed fxn")
     signature = values.get('p_signed')
     node_address = values.get('address')
     if signature is None or node_address is None:
         return jsonify("Error: invalid json received, Bad request"), 200
     if node_address not in blockchain.public_key_list:
         return jsonify("Bad request"), 200
     signature = BLS.deserialize(signature, Signature)
     _block = copy(blockchain.proposed_block)
     _block.signature = signature
     _block.signers = []
     _block.signers.append(node_address)
     if _block.verify_block_signature(blockchain):
         logger.debug("reply proposal signature verified")
         blockchain.proposal_accepted[node_address] = signature
         return jsonify("proposal reply signature verified"), 200
     else:
         logger.warning("proposal reply signature tempered")
         return jsonify("proposal reply signature tempered"), 400
Ejemplo n.º 5
0
    def verify_block_signature(self, blockchain):
        if type(self.txn) == list:
            txn_hash = self.txn
            txn_hash.sort()
        elif type(self.txn) == dict:
            txn_hash = list(self.txn.keys())
            txn_hash.sort()
        else:
            return False
        msg = dumps({
            "index": self.index,
            "harvester": self.harvester,
            "previous_hash": self.previous_hash,
            "txn": txn_hash,
            "signature": "",
            "signers": "",
            "timestamp": self.timestamp,
        })
        temp_array = []
        for c in msg:
            temp_array.append(ord(c))
        msg = bytes(temp_array)

        if type(self.signature) == Signature:
            pass
        else:
            self.signature = BLS.deserialize(self.signature, Signature)

        agg_info_list = []
        for node in self.signers:
            if node in blockchain.public_key_list:
                agg_info = AggregationInfo.from_msg(
                    PublicKey.from_bytes(
                        bytes(blockchain.public_key_list[node], "ISO-8859-1")),
                    msg)
                agg_info_list.append(agg_info)
            else:
                return False
        agg_public_key = AggregationInfo.merge_infos(agg_info_list)
        self.signature.set_aggregation_info(agg_public_key)
        return self.signature.verify()
Ejemplo n.º 6
0
    def verify_offline_block_signature(self, blockchain):
        if type(self.txn) == list:
            txn_hash = self.txn
            txn_hash.sort()
        elif type(self.txn) == dict:
            txn_hash = list(self.txn.keys())
            txn_hash.sort()
        else:
            return False
        block = copy(self)
        block.signature = ""
        block.signers = ""
        block.txn = txn_hash
        msg = block.get_hash()

        temp_array = []
        for c in msg:
            temp_array.append(ord(c))
        msg = bytes(temp_array)

        if type(self.signature) == Signature:
            pass
        else:
            self.signature = BLS.deserialize(self.signature, Signature)

        agg_info_list = []
        for node in self.signers:
            if node in blockchain.public_key_list:
                agg_info = AggregationInfo.from_msg(
                    PublicKey.from_bytes(
                        bytes(blockchain.public_key_list[node], "ISO-8859-1")),
                    msg)
                agg_info_list.append(agg_info)
            else:
                return False
        agg_public_key = AggregationInfo.merge_infos(agg_info_list)
        self.signature.set_aggregation_info(agg_public_key)
        return self.signature.verify()
Ejemplo n.º 7
0
    def check_proposed(blockchain, logger, values):
        block = values.get('block')
        sig = values.get('sig')
        a = values.get('int_a')
        b = values.get('int_b')

        if (block is None) or (sig is None) or (a is None) or (b is None):
            return jsonify("Error: invalid json data received"), 301
        # sig = bytes(sig, "ISO-8859-1")
        # sig = Signature.from_bytes(sig)
        block = Block.create_block(block)
        flag = block.verify_block(blockchain)
        node_address = block.harvester
        if not flag:

            url = "http://" + node_address + "/check_conflict"
            json_data = {'node_address': blockchain.address}
            try:
                response = requests.post(url, json=json_data)
                blockchain.logger.info("----conflict response----")
                blockchain.logger.info(response.status_code)
                blockchain.logger.info(response.json())
                blockchain.logger.info("****conflict response****")
            except:
                pass
            print(node_address, " block didn't verified ")
            return jsonify("invalid block!"), 302

        # leader verification
        blockchain.logger.info("----fp----")
        blockchain.logger.info("before_true_leader " + node_address)
        blockchain.logger.info("first_sign_hash " +
                               sha256(a.encode()).hexdigest())
        blockchain.logger.info("second_sign_hash " +
                               sha256(b.encode()).hexdigest())
        blockchain.logger.info("****fp****")
        is_verified_leader = blockchain.true_leader(a, b, node_address)

        if not is_verified_leader:
            print("invalid leader", node_address)
            return jsonify("invalid leader!"), 303
        sig = BLS.deserialize(sig, Signature)
        # verify whether proposed block is from valid validator(node) with valid signature
        if node_address in blockchain.public_key_list and block.get_hash(
        ) not in blockchain.broadcast_list:
            _block = copy(block)
            _block.signature = sig
            _block.signers = []
            _block.signers.append(node_address)
            if _block.verify_block_signature(blockchain):

                # print("received proposed block, signature verified")

                blockchain.broadcast_list.append(block.get_hash())
                blockchain.broadcast_it("/proposed", values)
                logger.debug("proposed fxn call using hash: " +
                             block.get_hash())

                blockchain.proposal_queue[a] = block
                threading.Thread(target=blockchain.sign_proposed_block,
                                 args={blockchain.sign_proposed_block_delay
                                       }).start()
            else:
                print("verify_block_signature")
                return jsonify("block signature couldn't verified"), 304
        return jsonify("True"), 200