Beispiel #1
0
def unmake_item(batch_object,
                signer_public_key=None,
                batcher_public_key=BATCHER_KEY_PAIR.public_key):
    """Will unmake_item a transaction or payload, and return a message.
    Validation of signatures will occur if public keys are provided.
    Only used for testing purposes.
    """
    if isinstance(batch_object, transaction_pb2.Transaction):
        header = transaction_pb2.TransactionHeader()
        header.ParseFromString(batch_object.header)
        assert header.payload_sha512 == sha512(
            batch_object.payload).hexdigest()
        if signer_public_key:
            assert header.signer_public_key == signer_public_key
            signer = Key(public_key=signer_public_key)
            signer.verify(signature=batch_object.header_signature,
                          message=batch_object.header)
        payload = RBACPayload()
        payload.ParseFromString(batch_object.payload)
        batch_object = payload
    if isinstance(batch_object, RBACPayload):
        _, message, _, _ = unmake_payload(payload=batch_object)
        return message
    raise Exception("unmake doesn't handle type {}\n{}".format(
        type(batch_object), batch_object))
    def assertValidBatch(self, batch, payload, signer_public_key,
                         batcher_public_key):
        """Check a batch is valid given a payload"""
        self.assertIsInstance(batch, batch_pb2.Batch)
        batch_header = batch_pb2.BatchHeader()
        batch_header.ParseFromString(batch.header)
        self.assertIsInstance(batch_header, batch_pb2.BatchHeader)
        self.assertEqual(batch_header.signer_public_key, batcher_public_key)
        batcher_keypair = Key(public_key=batcher_public_key)
        self.assertTrue(
            batcher_keypair.verify(
                signature=batch.header_signature,
                message=batch_header.SerializeToString(),
            ))
        other_key = Key()
        self.assertFalse(
            other_key.verify(
                signature=batch.header_signature,
                message=batch_header.SerializeToString(),
            ))

        transactions = list(batch.transactions)
        self.assertEqual(len(transactions), 1)

        self.assertValidTransaction(
            transaction=transactions[0],
            payload=payload,
            signer_public_key=signer_public_key,
        )
    def assertValidTransactionHeader(self, header, signature, payload,
                                     signer_public_key):
        """Check a transaction header is valid given a payload"""
        if isinstance(header, bytes):
            decoded = transaction_pb2.TransactionHeader()
            decoded.ParseFromString(header)
            header = decoded

        self.assertIsInstance(header, transaction_pb2.TransactionHeader)
        self.assertEqual(header.family_name, addresser.family.name)
        self.assertEqual(header.family_version, addresser.family.version)
        self.assertIsInstance(header.nonce, str)
        self.assertEqual(len(header.nonce), 32)
        self.assertEqual(header.signer_public_key, signer_public_key)
        self.assertEqual(header.payload_sha512,
                         sha512(payload.SerializeToString()).hexdigest())
        signer = Key(public_key=signer_public_key)
        self.assertTrue(
            signer.verify(signature=signature,
                          message=header.SerializeToString()))
        other_key = Key()
        self.assertFalse(
            other_key.verify(signature=signature,
                             message=header.SerializeToString()))

        self.assertEqual(header.inputs, payload.inputs)
        self.assertEqual(header.outputs, payload.outputs)
Beispiel #4
0
def unmake(batch_object,
           signer_public_key=None,
           batcher_public_key=BATCHER_KEY_PAIR.public_key):
    """Will unmake a batch_request, batch_list, batch, transaction
    or payload, and return a list of the included messages.
    Validation of signatures will occur if public keys are provided.
    Only used for testing purposes.
    """
    if isinstance(
            batch_object,
            client_batch_submit_pb2.ClientBatchSubmitRequest) or isinstance(
                batch_object, batch_pb2.BatchList):
        return list(
            itertools.chain(*[unmake(batch)
                              for batch in batch_object.batches]))
    if isinstance(batch_object, batch_pb2.Batch):
        batch_header = batch_pb2.BatchHeader()
        batch_header.ParseFromString(batch_object.header)
        if batcher_public_key:
            assert batch_header.signer_public_key == batcher_public_key
            batcher_keypair = Key(public_key=batcher_public_key)
            assert batcher_keypair.verify(
                signature=batch_object.header_signature,
                message=batch_object.header)
        transactions = list(batch_object.transactions)
        return [unmake_item(transaction) for transaction in transactions]
    return [
        unmake_item(
            batch_object=batch_object,
            signer_public_key=signer_public_key,
            batcher_public_key=batcher_public_key,
        )
    ]
    def assertValidTransactionHeader(
        self,
        header,
        signature,
        message,
        message_type,
        inputs,
        outputs,
        signer_public_key,
    ):
        if isinstance(header, bytes):
            decoded = transaction_pb2.TransactionHeader()
            decoded.ParseFromString(header)
            header = decoded

        payload = self.make_payload(message=message, message_type=message_type)

        self.assertIsInstance(header, transaction_pb2.TransactionHeader)
        self.assertEqual(header.family_name, addresser.FAMILY_NAME)
        self.assertEqual(header.family_version, addresser.FAMILY_VERSION)
        self.assertIsInstance(header.nonce, str)
        self.assertEqual(len(header.nonce), 32)
        self.assertEqual(header.signer_public_key, signer_public_key)
        self.assertEqual(
            header.payload_sha512, sha512(payload.SerializeToString()).hexdigest()
        )

        signer = Key(public_key=signer_public_key)
        self.assertTrue(
            signer.verify(signature=signature, message=header.SerializeToString())
        )
        other_key = Key()
        self.assertFalse(
            other_key.verify(signature=signature, message=header.SerializeToString())
        )

        self.assertEqual(header.inputs, inputs)
        self.assertEqual(header.outputs, outputs)
        self.assertValidInputs(
            inputs=header.inputs,
            outputs=header.outputs,
            message_type=message_type,
            message=message,
        )
    def assertValidBatch(
        self,
        batch,
        message,
        message_type,
        inputs,
        outputs,
        signer_public_key,
        batcher_public_key,
    ):
        self.assertIsInstance(batch, batch_pb2.Batch)
        batch_header = batch_pb2.BatchHeader()
        batch_header.ParseFromString(batch.header)
        self.assertIsInstance(batch_header, batch_pb2.BatchHeader)
        self.assertEqual(batch_header.signer_public_key, batcher_public_key)
        batcher_keypair = Key(public_key=batcher_public_key)
        self.assertTrue(
            batcher_keypair.verify(
                signature=batch.header_signature,
                message=batch_header.SerializeToString(),
            )
        )
        other_key = Key()
        self.assertFalse(
            other_key.verify(
                signature=batch.header_signature,
                message=batch_header.SerializeToString(),
            )
        )

        transactions = list(batch.transactions)
        self.assertEqual(len(transactions), 1)

        self.assertValidTransaction(
            transaction=transactions[0],
            message=message,
            message_type=message_type,
            inputs=inputs,
            outputs=outputs,
            signer_public_key=signer_public_key,
        )