MasternodeSignature duplicate() { MasternodeSignature copy = new MasternodeSignature(params, getBytes(), 0); return copy; }
static public PublicKey recoverCompact(Sha256Hash hash, MasternodeSignature sig) throws SignatureException { if(sig.getBytes().length != 65) throw new SignatureException("signature is wrong size"); int recid = (sig.getBytes()[0] - 27) & 3; boolean comp = ((sig.getBytes()[0] - 27) & 4) != 0; //ECKey.ECDSASignature esig = ECKey.ECDSASignature.decodeFromDER(sig.getBytes()); BigInteger r = new BigInteger(1, Arrays.copyOfRange(sig.getBytes(), 1, 33)); BigInteger s = new BigInteger(1, Arrays.copyOfRange(sig.getBytes(), 33, 65)); ECKey.ECDSASignature esig = new ECKey.ECDSASignature(r, s); ECKey ecKey = ECKey.recoverFromSignature(recid, esig, hash, comp); return new PublicKey (ecKey.getPubKey()); }
public static boolean verifyMessage(PublicKey pubkey, MasternodeSignature vchSig, String strMessage, StringBuilder errorMessage) { //int length = Utils.BITCOIN_SIGNED_MESSAGE_HEADER.length()+strMessage.length(); //byte dataToHash [] = (Utils.BITCOIN_SIGNED_MESSAGE_HEADER_BYTES+strMessage).getBytes(); ECKey pubkey2 = null; try { //pubkey2 = PublicKey.recoverCompact(Sha256Hash.twiceOf(dataToHash), vchSig); pubkey2 = ECKey.fromPublicOnly(pubkey.getBytes()); pubkey2.verifyMessage(strMessage.getBytes(), vchSig.getBytes()); //ECKey.verify() //if(DarkCoinSystem.fDebug && !pubkey.getId().equals(pubkey2.getId())) // log.info("DarkSendSigner.verifyMessage -- keys don't match: " + pubkey2.getId().toString()+ " " + pubkey.getId().toString()); //return pubkey.getId().equals(pubkey2.getId()); return true; } catch(SignatureException x) { errorMessage.append("keys don't match - input: "+Utils.HEX.encode(pubkey.getId())); errorMessage.append(", recovered: " + (pubkey2 != null ? Utils.HEX.encode(pubkey2.getPubKeyHash()) : "null")); errorMessage.append(",\nmessage: "+ String.valueOf(strMessage)); errorMessage.append(", sig: \n" + Base64.toBase64String(vchSig.getBytes())+ "\n" + x.getMessage()); return false; } } public static boolean verifyMessage1(PublicKey pubkey, MasternodeSignature vchSig, byte[] message, StringBuilder errorMessage)
public static boolean verifyHash(Sha256Hash hash, byte [] pubkeyId, MasternodeSignature vchSig, StringBuilder strErrorRet) { ECKey pubkeyFromSig; try { pubkeyFromSig = ECKey.signedMessageToKey(hash, vchSig.getBytes()); if (pubkeyFromSig == null) { strErrorRet.append("Error recovering public key."); return false; } if (!Arrays.equals(pubkeyFromSig.getPubKeyHash(), pubkeyId)) { strErrorRet.append(String.format("Keys don't match: pubkey=%s, pubkeyFromSig=%s, hash=%s, vchSig=%s", HEX.encode(pubkeyId), HEX.encode(pubkeyFromSig.getPubKeyHash()), hash.toString(), Base64.toBase64String(vchSig.getBytes()))); return false; } return true; } catch (SignatureException x) { strErrorRet.append("exception: " + x.getMessage()); return false; } }
public static boolean verifyMessage1(PublicKey pubkey, MasternodeSignature vchSig, byte[] message, StringBuilder errorMessage) { //int length = Utils.BITCOIN_SIGNED_MESSAGE_HEADER.length()+strMessage.length(); byte dataToHash []; // = (Utils.BITCOIN_SIGNED_MESSAGE_HEADER_BYTES+strMessage).getBytes(); //ByteOutputStream bos = new ByteOutputStream(message.length + Utils.BITCOIN_SIGNED_MESSAGE_HEADER_BYTES.length); //bos.write(Utils.BITCOIN_SIGNED_MESSAGE_HEADER_BYTES); //bos.write(message); dataToHash = Utils.formatMessageForSigning(message);//bos.getBytes(); //PublicKey pubkey2; ECKey pubkey2 = null; try { // pubkey2 = PublicKey.recoverCompact(Sha256Hash.twiceOf(dataToHash), vchSig); //ECKey.verify() //if(DarkCoinSystem.fDebug && !pubkey.getId().equals(pubkey2.getId())); // log.info("DarkSendSigner.verifyMessage -- keys don't match: " + pubkey2.getId().toString()+ " " + pubkey.getId().toString()); //return pubkey.getId().equals(pubkey2.getId()); //return true; pubkey2 = ECKey.fromPublicOnly(pubkey.getBytes()); pubkey2.verifyMessage(message, vchSig.getBytes()); return true; } catch(SignatureException x) { errorMessage.append("keys don't match - input: "+Utils.HEX.encode(pubkey.getId())); errorMessage.append(", recovered: " + (pubkey2 != null ? Utils.HEX.encode(pubkey2.getPubKeyHash()) : "null")); errorMessage.append(", message: "+ Utils.sanitizeString(new String(message))); errorMessage.append(", sig: not impl!\n" + x.getMessage()); return false; } }
message = strMessage.getBytes(); log.info("CMasternodeBroadcast::VerifySignature - sanitized strMessage: "+Utils.sanitizeString(strMessage)+", pubKeyCollateralAddress address: "+new Address(params, pubKeyCollateralAddress.getId()).toString()+", sig: %s\n" + Base64.toBase64String(sig.getBytes()));