ethereum / ethereumj

DEPRECATED! Java implementation of the Ethereum yellowpaper. For JSON-RPC and other client features check Ethereum Harmony
GNU Lesser General Public License v3.0
2.18k stars 1.09k forks source link

The secp256k1 algorithm signature result is one byte less. #1269

Open sujiulong opened 5 years ago

sujiulong commented 5 years ago

@test public void verifyTest() { String pri = "87385e10d018f971f66cf2c065663d4aa427286f259f85bb8b2438130f4f1ee7"; String sourceHash = "7d50e029128286afba20cb62cf1b874d76a527a896f3d39167289a9b0446c518"; ECKey ecKey = ECKey.fromPrivate(Hex.decode(pri)); byte[] sign = ecKey.sign(Hex.decode(sourceHash)).toByteArray(); System.out.println(sign.length); }

The result is always 64 not 65 bytes.

mkalinin commented 5 years ago

65 on my side for this particular test.

sujiulong commented 5 years ago

Thank you very much for your reply. My code is too old. This is my local code. public byte[] toByteArray() { final byte fixedV = this.v >= 27 ? (byte) (this.v - 27) : this.v;

        return ByteUtil.merge(
                ByteUtil.bigIntegerToBytes(this.r),
                ByteUtil.bigIntegerToBytes(this.s),
                new byte[]{fixedV});
    }

This is latest code. public byte[] toByteArray() { final byte fixedV = this.v >= 27 ? (byte) (this.v - 27) : this.v;

        return ByteUtil.merge(
                ByteUtil.bigIntegerToBytes(this.r, 32),
                ByteUtil.bigIntegerToBytes(this.s, 32),
                new byte[]{fixedV});
    }