def __handleDeposit(self, protocol, msgObj):
        account = self.__getCurrentAccount()

        bps = []
        bpData = msgObj.bpData
        # debugPrint(bpData[:15], "...", bpData[-15:], len(bpData), type(bpData))
        while bpData:
            newBitPoint, offset = BitPoint.deserialize(bpData)
            bpData = bpData[offset:]
            bps.append(newBitPoint)
        result = self.__bank.depositCash(account, bps)
        if not result.succeeded():
            self.__logSecure("Deposit failed, %s" % result.msg())
            response = self.__createResponse(msgObj, RequestFailure)
            response.RequestId = msgObj.RequestId
            response.ErrorMessage = result.msg()
        else:
            result = self.__bank.generateReceipt(account)
            if not result.succeeded():
                self.__logSecure("Could not generate receipt? %s" %
                                 result.msg())
                response = self.__createResponse(msgObj, RequestFailure)
                response.RequestId = msgObj.RequestId
                response.ErrorMessage = result.msg()
            else:
                self.__logSecure("Deposit complete. Sending Signed Receipt")
                receipt, signature = result.value()
                response = self.__createResponse(msgObj, Receipt)
                response.RequestId = msgObj.RequestId
                response.Receipt = receipt
                response.ReceiptSignature = signature
        self.sendPacket(response)
def main(BankCoreModule, args):
    #sys.path.append("../..")
    from playground.crypto import X509Certificate
    from getpass import getpass
    from Crypto.PublicKey import RSA
    from Exchange import BitPoint
    if args[0] == "create":
        cert, key, path = args[1:4]
        with open(cert) as f:
            cert = X509Certificate.loadPEM(f.read())
        with open(key) as f:
            key = RSA.importKey(f.read())
        passwd = getpass()
        BankCoreModule.Ledger.InitializeDb(path, cert, key, passwd)
    elif args[0] == "vault_deposit":
        cert, path, bpFile = args[1:4]
        with open(cert) as f:
            cert = X509Certificate.loadPEM(f.read())
        passwd = getpass()
        bank = BankCoreModule.Ledger(path, cert, passwd)
        with open(bpFile) as f:
            bpData = f.read()
        bps = []
        while bpData:
            newBitPoint, offset = BitPoint.deserialize(bpData)
            bpData = bpData[offset:]
            bps.append(newBitPoint)
        print "depositing", len(bps), "bit points"
        result = bank.depositCash("VAULT", bps)
        if not result.succeeded():
            print "Deposit failed", result.msg()
        else:
            print "Vault balance", bank.getBalance("VAULT")
    elif args[0] == "balances":
        cert, path = args[1:3]
        with open(cert) as f:
            cert = X509Certificate.loadPEM(f.read())
        passwd = getpass()
        bank = BankCoreModule.Ledger(path, cert, passwd)
        for account in bank.getAccounts():
            print "%s balance" % account, bank.getBalance(account)
    elif args[0] == "create_account":
        accountName, cert, path = args[1:4]
        with open(cert) as f:
            cert = X509Certificate.loadPEM(f.read())
        passwd = getpass()
        bank = BankCoreModule.Ledger(path, cert, passwd)
        bank.createAccount(accountName)
    elif args[0] == "transfer":
        fromAccount, toAccount, amount, cert, path = args[1:6]
        with open(cert) as f:
            cert = X509Certificate.loadPEM(f.read())
        passwd = getpass()
        bank = BankCoreModule.Ledger(path, cert, passwd)
        amount = int(amount)
        result = bank.transfer(fromAccount, toAccount, amount)
        if not result.succeeded():
            print "Failed: ", result.msg()
        for account in [fromAccount, toAccount]:
            print "%s balance" % account, bank.getBalance(account)
    elif args[0] == "correct":
        cert, path = args[1:3]
        with open(cert) as f:
            cert = X509Certificate.loadPEM(f.read())
        passwd = getpass()
        bank = BankCoreModule.Ledger(path, cert, passwd)
        for account in bank.getAccounts():
            if account == "VAULT": continue
            bank.transfer("VAULT", account, 100)
    elif args[0] == "display_receipt":
        receiptFile, sigFile, cert = args[1:4]
        with open(receiptFile) as f:
            receiptData = f.read()
        with open(sigFile) as f:
            sigData = f.read()
        with open(cert) as f:
            certData = f.read()
        cert = X509Certificate.loadPEM(certData)
        pubKey = RSA.importKey(cert.getPublicKeyBlob())
        verifier = PKCS1_v1_5.new(pubKey)
        receipt = pickle.loads(receiptData)
        print "Receipt:", receipt.toHumanReadableString()
        if verifier.verify(SHA.new(receiptData), sigData):
            print "Receipt is signed by the bank."
        else:
            print "Receipt is forged"
 def deserialize(cls, s):
     return BitPoint.deserialize(s)[0]