1 package io.bytom.common;
\r
3 import java.security.MessageDigest;
\r
4 import java.security.NoSuchAlgorithmException;
\r
5 import java.util.Arrays;
\r
7 public class Signer {
\r
9 public static byte[] ed25519InnerSign(byte[] privateKey, byte[] message) throws NoSuchAlgorithmException {
\r
10 MessageDigest md = MessageDigest.getInstance("SHA-512");
\r
11 byte[] digestData = new byte[32 + message.length];
\r
12 int digestDataIndex = 0;
\r
13 for (int i = 32; i < 64; i++) {
\r
14 digestData[digestDataIndex] = privateKey[i];
\r
17 for (int i = 0; i < message.length; i++) {
\r
18 digestData[digestDataIndex] = message[i];
\r
21 md.update(digestData);
\r
22 byte[] messageDigest = md.digest();
\r
24 com.google.crypto.tink.subtle.Ed25519.reduce(messageDigest);
\r
25 byte[] messageDigestReduced = Arrays.copyOfRange(messageDigest, 0, 32);
\r
26 byte[] encodedR = com.google.crypto.tink.subtle.Ed25519.scalarMultWithBaseToBytes(messageDigestReduced);
\r
27 byte[] publicKey = DeriveXpub.deriveXpub(privateKey);
\r
29 byte[] hramDigestData = new byte[32 + encodedR.length + message.length];
\r
30 int hramDigestIndex = 0;
\r
31 for (int i = 0; i < encodedR.length; i++) {
\r
32 hramDigestData[hramDigestIndex] = encodedR[i];
\r
35 for (int i = 0; i < 32; i++) {
\r
36 hramDigestData[hramDigestIndex] = publicKey[i];
\r
39 for (int i = 0; i < message.length; i++) {
\r
40 hramDigestData[hramDigestIndex] = message[i];
\r
44 md.update(hramDigestData);
\r
45 byte[] hramDigest = md.digest();
\r
46 com.google.crypto.tink.subtle.Ed25519.reduce(hramDigest);
\r
47 byte[] hramDigestReduced = Arrays.copyOfRange(hramDigest, 0, 32);
\r
49 byte[] sk = Arrays.copyOfRange(privateKey, 0, 32);
\r
50 byte[] s = new byte[32];
\r
51 com.google.crypto.tink.subtle.Ed25519.mulAdd(s, hramDigestReduced, sk, messageDigestReduced);
\r
53 byte[] signature = new byte[64];
\r
54 for (int i = 0; i < encodedR.length; i++) {
\r
55 signature[i] = encodedR[i];
\r
57 int signatureIndex = 32;
\r
58 for (int i = 0; i < s.length; i++) {
\r
59 signature[signatureIndex] = s[i];
\r