def get_result(result): try: verify_key = nacl.signing.VerifyKey(node_to_ask.pubkey) verify_key.verify(result[1][0], result[1][1]) ratings = json.loads(result[1][0].decode("zlib"), object_pairs_hook=OrderedDict) ret = [] for rating in ratings: address = rating["tx_summary"]["address"] buyer_key = rating["tx_summary"]["buyer_key"] amount = rating["tx_summary"]["amount"] listing_hash = rating["tx_summary"]["listing"] proof_sig = rating["tx_summary"]["proof_of_tx"] try: verify_key.verify(str(address) + str(amount) + str(listing_hash) + str(buyer_key), base64.b64decode(proof_sig)) valid = bitcointools.ecdsa_raw_verify(json.dumps(rating["tx_summary"], indent=4), bitcointools.decode_sig(rating["signature"]), buyer_key) if not valid: raise Exception("Bitcoin signature not valid") ret.append(rating) except Exception: pass return ret except Exception: import traceback traceback.print_exc() return None
def get_result(result): try: if result[0] and digest(result[1][0]) == contract_hash: contract = json.loads(result[1][0], object_pairs_hook=OrderedDict) # TODO: verify the guid in the contract matches this node's guid signature = contract["vendor_offer"]["signatures"]["guid"] pubkey = node_to_ask.signed_pubkey[64:] verify_obj = json.dumps(contract["vendor_offer"]["listing"], indent=4) verify_key = nacl.signing.VerifyKey(pubkey) verify_key.verify(verify_obj, base64.b64decode(signature)) bitcoin_key = contract["vendor_offer"]["listing"]["id"]["pubkeys"]["bitcoin"] bitcoin_sig = contract["vendor_offer"]["signatures"]["bitcoin"] valid = bitcointools.ecdsa_raw_verify(verify_obj, bitcointools.decode_sig(bitcoin_sig), bitcoin_key) if not valid: raise Exception("Invalid Bitcoin signature") if "moderators" in contract["vendor_offer"]["listing"]: for moderator in contract["vendor_offer"]["listing"]["moderators"]: guid = moderator["guid"] guid_key = moderator["pubkeys"]["signing"]["key"] guid_sig = base64.b64decode(moderator["pubkeys"]["signing"]["signature"]) enc_key = moderator["pubkeys"]["encryption"]["key"] enc_sig = base64.b64decode(moderator["pubkeys"]["encryption"]["signature"]) bitcoin_key = moderator["pubkeys"]["bitcoin"]["key"] bitcoin_sig = base64.b64decode(moderator["pubkeys"]["bitcoin"]["signature"]) h = nacl.hash.sha512(guid_sig + unhexlify(guid_key)) pow_hash = h[64:128] if int(pow_hash[:6], 16) >= 50 or guid != h[:40]: raise Exception('Invalid GUID') verify_key = nacl.signing.VerifyKey(guid_key, encoder=nacl.encoding.HexEncoder) verify_key.verify(unhexlify(guid_key), guid_sig) verify_key.verify(unhexlify(enc_key), enc_sig) verify_key.verify(unhexlify(bitcoin_key), bitcoin_sig) #TODO: should probably also validate the handle here. self.cache(result[1][0]) if "image_hashes" in contract["vendor_offer"]["listing"]["item"]: for image_hash in contract["vendor_offer"]["listing"]["item"]["image_hashes"]: self.get_image(node_to_ask, unhexlify(image_hash)) return contract else: return None except Exception: return None
def get_result(result): try: if result[0] and digest(result[1][0]) == contract_hash: contract = json.loads(result[1][0], object_pairs_hook=OrderedDict) # TODO: verify the guid in the contract matches this node's guid signature = contract["vendor_offer"]["signatures"]["guid"] pubkey = node_to_ask.signed_pubkey[64:] verify_obj = json.dumps(contract["vendor_offer"]["listing"], indent=4) verify_key = nacl.signing.VerifyKey(pubkey) verify_key.verify(verify_obj, base64.b64decode(signature)) bitcoin_key = contract["vendor_offer"]["listing"]["id"]["pubkeys"]["bitcoin"] bitcoin_sig = contract["vendor_offer"]["signatures"]["bitcoin"] valid = bitcoin.ecdsa_raw_verify(verify_obj, bitcoin.decode_sig(bitcoin_sig), bitcoin_key) if not valid: raise Exception("Invalid Bitcoin signature") if "moderators" in contract["vendor_offer"]["listing"]: for moderator in contract["vendor_offer"]["listing"]["moderators"]: guid = moderator["guid"] guid_key = moderator["pubkeys"]["signing"]["key"] guid_sig = base64.b64decode(moderator["pubkeys"]["signing"]["signature"]) enc_key = moderator["pubkeys"]["encryption"]["key"] enc_sig = base64.b64decode(moderator["pubkeys"]["encryption"]["signature"]) bitcoin_key = moderator["pubkeys"]["bitcoin"]["key"] bitcoin_sig = base64.b64decode(moderator["pubkeys"]["bitcoin"]["signature"]) h = nacl.hash.sha512(guid_sig + unhexlify(guid_key)) pow_hash = h[64:128] if int(pow_hash[:6], 16) >= 50 or guid != h[:40]: raise Exception('Invalid GUID') verify_key = nacl.signing.VerifyKey(guid_key, encoder=nacl.encoding.HexEncoder) verify_key.verify(unhexlify(guid_key), guid_sig) verify_key.verify(unhexlify(enc_key), enc_sig) verify_key.verify(unhexlify(bitcoin_key), bitcoin_sig) #TODO: should probably also validate the handle here. self.cache(result[1][0]) if "image_hashes" in contract["vendor_offer"]["listing"]["item"]: for image_hash in contract["vendor_offer"]["listing"]["item"]["image_hashes"]: self.get_image(node_to_ask, unhexlify(image_hash)) return contract else: return None except Exception: return None