private void maybeStartSigningVerifyingTask(boolean sign, @Nullable CharSequence password) { if (signVerifyMessageTask == null) { String address = signingAddressView.getText().toString().trim(); String message = messageView.getText().toString(); String signature = signatureView.getText().toString(); SignedMessage signedMessage; if (sign) { signedMessage = new SignedMessage(address, message); } else { signedMessage = new SignedMessage(address, message, signature); } signVerifyMessageTask = new SignVerifyMessageTask(account, sign, password) { @Override protected void onPostExecute(SignedMessage message) { showSignVerifyStatus(message); signVerifyMessageTask = null; } }; signVerifyMessageTask.execute(signedMessage); } }
private void showSignVerifyStatus(SignedMessage signedMessage) { clearMessages(); switch (signedMessage.getStatus()) { case SignedOK: signatureView.setText(signedMessage.getSignature()); signatureOK.setVisibility(View.VISIBLE); signatureOK.setText(R.string.message_signed); break; case VerifiedOK: signatureOK.setVisibility(View.VISIBLE); signatureOK.setText(R.string.message_verified); break; default: showSignVerifyError(signedMessage.getStatus()); } }
@Test public void signMessageEncrypted() throws AddressMalformedException, MissingPrivateKeyException, KeyIsEncryptedException { WalletPocketHD pocketHD = new WalletPocketHD(rootKey, BTC, null, null); pocketHD.getReceiveAddress(); // Generate the first key pocketHD.encrypt(crypter, aesKey); SignedMessage signedMessage = new SignedMessage("1KUDsEDqSBAgxubSEWszoA9xscNRRCmujM", MESSAGE); pocketHD.signMessage(signedMessage, aesKey); assertEquals(EXPECTED_BITCOIN_SIG, signedMessage.getSignature()); signedMessage = new SignedMessage("1KUDsEDqSBAgxubSEWszoA9xscNRRCmujM", MESSAGE_UNICODE); pocketHD.signMessage(signedMessage, aesKey); assertEquals(EXPECTED_BITCOIN_SIG_UNICODE, signedMessage.getSignature()); }
@Override public void signMessage(SignedMessage unsignedMessage, @Nullable KeyParameter aesKey) { String message = unsignedMessage.message; lock.lock(); try { ECKey key; try { BitAddress address = BitAddress.from(type, unsignedMessage.getAddress()); key = findKeyFromPubHash(address.getHash160()); } catch (AddressMalformedException e) { unsignedMessage.status = SignedMessage.Status.AddressMalformed; return; } if (key == null) { unsignedMessage.status = SignedMessage.Status.MissingPrivateKey; return; } try { unsignedMessage.signature = key.signMessage(type.getSignedMessageHeader(), message, aesKey); unsignedMessage.status = SignedMessage.Status.SignedOK; } catch (ECKey.KeyIsEncryptedException e) { unsignedMessage.status = SignedMessage.Status.KeyIsEncrypted; } catch (ECKey.MissingPrivateKeyException e) { unsignedMessage.status = SignedMessage.Status.MissingPrivateKey; } } finally { lock.unlock(); } }
@Test public void signMessage() throws AddressMalformedException, MissingPrivateKeyException, KeyIsEncryptedException { WalletPocketHD pocketHD = new WalletPocketHD(rootKey, BTC, null, null); pocketHD.getReceiveAddress(); // Generate the first key SignedMessage signedMessage = new SignedMessage("1KUDsEDqSBAgxubSEWszoA9xscNRRCmujM", MESSAGE); pocketHD.signMessage(signedMessage, null); assertEquals(EXPECTED_BITCOIN_SIG, signedMessage.getSignature()); signedMessage = new SignedMessage("1KUDsEDqSBAgxubSEWszoA9xscNRRCmujM", MESSAGE_UNICODE); pocketHD.signMessage(signedMessage, null); assertEquals(EXPECTED_BITCOIN_SIG_UNICODE, signedMessage.getSignature()); pocketHD = new WalletPocketHD(rootKey, NBT, null, null); pocketHD.getReceiveAddress(); // Generate the first key signedMessage = new SignedMessage("BNvJUwg3BgkbQk5br1CxvHxdcDp1EC3saE", MESSAGE); pocketHD.signMessage(signedMessage, null); assertEquals(EXPECTED_NUBITS_SIG, signedMessage.getSignature()); signedMessage = new SignedMessage("BNvJUwg3BgkbQk5br1CxvHxdcDp1EC3saE", MESSAGE_UNICODE); pocketHD.signMessage(signedMessage, null); assertEquals(EXPECTED_NUBITS_SIG_UNICODE, signedMessage.getSignature()); }
@Override protected SignedMessage doInBackground(SignedMessage... params) { SignedMessage message = params[0]; try { if (signMessage) { KeyParameter key = null; if (account.isEncrypted() && account.getKeyCrypter() != null && password != null) { key = account.getKeyCrypter().deriveKey(password); } account.signMessage(message, key); } else { account.verifyMessage(message); } } catch (KeyCrypterException e) { message = new SignedMessage(message, SignedMessage.Status.KeyIsEncrypted); } catch (Exception e) { // Should not happen ACRA.getErrorReporter().handleSilentException(e); // Return the message with unknown status message = new SignedMessage(message, SignedMessage.Status.Unknown); } return message; }
@Test public void signMessageEncryptedFailed() throws AddressMalformedException, MissingPrivateKeyException, KeyIsEncryptedException { WalletPocketHD pocketHD = new WalletPocketHD(rootKey, BTC, null, null); pocketHD.getReceiveAddress(); // Generate the first key pocketHD.encrypt(crypter, aesKey); SignedMessage signedMessage = new SignedMessage("1KUDsEDqSBAgxubSEWszoA9xscNRRCmujM", MESSAGE); pocketHD.signMessage(signedMessage, null); assertEquals(SignedMessage.Status.KeyIsEncrypted, signedMessage.status); }