OSDN Git Service

refactor
[bytom/bytom-java-sdk.git] / tx-signer / src / main / java / io / bytom / common / Signer.java
1 package io.bytom.common;\r
2 \r
3 import java.security.MessageDigest;\r
4 import java.security.NoSuchAlgorithmException;\r
5 import java.util.Arrays;\r
6 \r
7 public class Signer {\r
8 \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
15             digestDataIndex++;\r
16         }\r
17         for (int i = 0; i < message.length; i++) {\r
18             digestData[digestDataIndex] = message[i];\r
19             digestDataIndex++;\r
20         }\r
21         md.update(digestData);\r
22         byte[] messageDigest = md.digest();\r
23 \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
28 \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
33             hramDigestIndex++;\r
34         }\r
35         for (int i = 0; i < 32; i++) {\r
36             hramDigestData[hramDigestIndex] = publicKey[i];\r
37             hramDigestIndex++;\r
38         }\r
39         for (int i = 0; i < message.length; i++) {\r
40             hramDigestData[hramDigestIndex] = message[i];\r
41             hramDigestIndex++;\r
42         }\r
43         md.reset();\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
48 \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
52 \r
53         byte[] signature = new byte[64];\r
54         for (int i = 0; i < encodedR.length; i++) {\r
55             signature[i] = encodedR[i];\r
56         }\r
57         int signatureIndex = 32;\r
58         for (int i = 0; i < s.length; i++) {\r
59             signature[signatureIndex] = s[i];\r
60             signatureIndex++;\r
61         }\r
62         return signature;\r
63     }\r
64 \r
65 }\r