Verifier.checkTxProposalBody = function(credentials, txp) { $.checkArgument(txp.creatorId); $.checkState(credentials.isComplete()); var creatorKeys = _.find(credentials.publicKeyRing, function(item) { if (WalletUtils.xPubToCopayerId(item.xPubKey) === txp.creatorId) return true; }); if (!creatorKeys) return false; var creatorSigningPubKey; // If the txp using a selfsigned pub key? if (txp.proposalSignaturePubKey) { // Verify it... if (!WalletUtils.verifyRequestPubKey(txp.proposalSignaturePubKey, txp.proposalSignaturePubKeySig, creatorKeys.xPubKey)) return false; creatorSigningPubKey = txp.proposalSignaturePubKey; } else { creatorSigningPubKey = creatorKeys.requestPubKey; } if (!creatorSigningPubKey) return false; var hash; if (txp.outputs) { var outputs = _.map(txp.outputs, function(o) { return { toAddress: o.toAddress, amount: o.amount, message: o.encryptedMessage || o.message || null }; }); var proposalHeader = { outputs: outputs, message: txp.encryptedMessage || txp.message || null, payProUrl: txp.payProUrl }; hash = WalletUtils.getProposalHash(proposalHeader); } else { hash = WalletUtils.getProposalHash(txp.toAddress, txp.amount, txp.encryptedMessage || txp.message || null, txp.payProUrl); } log.debug('Regenerating & verifying tx proposal hash -> Hash: ', hash, ' Signature: ', txp.proposalSignature); if (!WalletUtils.verifyMessage(hash, txp.proposalSignature, creatorSigningPubKey)) return false; if (!Verifier.checkAddress(credentials, txp.changeAddress)) return false; return true; };
_.each(copayers, function(copayer) { if (error) return; if (uniq[copayers.xPubKey]++) { log.error('Repeated public keys in server response'); error = true; } // Not signed pub keys if (!copayer.name || !copayer.xPubKey || !copayer.requestPubKey || !copayer.signature) { log.error('Missing copayer fields in server response'); error = true; } else { var hash = WalletUtils.getCopayerHash(copayer.name, copayer.xPubKey, copayer.requestPubKey); if (!WalletUtils.verifyMessage(hash, copayer.signature, walletPubKey)) { log.error('Invalid signatures in server response'); error = true; } } });
WalletService.prototype._verifySignature = function(text, signature, pubKey) { return WalletUtils.verifyMessage(text, signature, pubKey); };