package com.greenaddress.greenapi; import org.bitcoinj.core.ECKey; import org.bitcoinj.core.Transaction; import org.bitcoinj.crypto.DeterministicKey; import org.bitcoinj.crypto.TransactionSignature; import java.util.List; public abstract class ISigningWallet { protected static final int HARDENED = 0x80000000; protected static final int PASSWORD_PATH = 0x70617373 | HARDENED; // 'pass' protected static final byte[] PASSWORD_SALT = new byte[] { 0x70, 0x61, 0x73, 0x73, 0x73, 0x61, 0x6c, 0x74 // 'passsalt' }; public abstract boolean requiresPrevoutRawTxs(); // FIXME: Get rid of this public abstract DeterministicKey getSubAccountPublicKey(final int subAccount); public abstract List<byte[]> signTransaction(PreparedTransaction ptx); public abstract List<byte[]> signTransaction(final Transaction tx, final PreparedTransaction ptx, final List<Output> prevOuts); // FIXME: This is only needed until the challenge RPC is unified public abstract Object[] getChallengeArguments(); public abstract String[] signChallenge(final String challengeString, final String[] challengePath); public static byte[] getTxSignature(final ECKey.ECDSASignature sig) { final TransactionSignature txSig = new TransactionSignature(sig, Transaction.SigHash.ALL, false); return txSig.encodeToBitcoin(); } // Derive a local password for encryption of client side data. // This takes a hardened public key using PASSWORD_PATH and returns // the pbkdf2_hmac_sha512 of its serialized bytes with PASSWORD_SALT. public abstract byte[] getLocalEncryptionPassword(); }