OSDN Git Service

merge tx signer
[bytom/bytom-java-sdk.git] / tx-signer / src / main / java / io / bytom / common / Utils.java
1 package io.bytom.common;\r
2 \r
3 import com.google.gson.Gson;\r
4 import com.google.gson.GsonBuilder;\r
5 import io.bytom.types.ExpandedKeys;\r
6 import org.bouncycastle.util.encoders.Hex;\r
7 \r
8 import java.io.ByteArrayOutputStream;\r
9 import java.io.IOException;\r
10 import java.math.BigInteger;\r
11 import java.security.InvalidKeyException;\r
12 import java.security.NoSuchAlgorithmException;\r
13 import java.security.SignatureException;\r
14 import java.util.Arrays;\r
15 \r
16 public class Utils {\r
17 \r
18     public static String rfc3339DateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";\r
19 \r
20     public static final Gson serializer = new GsonBuilder().setDateFormat(rfc3339DateFormat).create();\r
21 \r
22     public static int writeVarint(long value, ByteArrayOutputStream stream) throws IOException {\r
23         byte[] varint = new byte[9];\r
24         int n = putUvarint(varint, value);\r
25         byte[] varintTime = Arrays.copyOf(varint, n);\r
26         stream.write(varintTime);\r
27         return n;\r
28     }\r
29 \r
30 \r
31     public static int writeVarStr(byte[] buf, ByteArrayOutputStream stream) throws IOException {\r
32         int n = writeVarint(buf.length, stream);\r
33         stream.write(buf);\r
34 \r
35         return n + (buf.length);\r
36     }\r
37 \r
38     public static int getLengthVarInt(long x) {\r
39         byte[] varint = new byte[9];\r
40         int n = putUvarint(varint, x);\r
41         byte[] varintTime = Arrays.copyOf(varint, n);\r
42         return varintTime.length;\r
43     }\r
44 \r
45     private static int putUvarint(byte[] buf, long x) {\r
46         int i = 0;\r
47         while (x >= 0x80) {\r
48             buf[i] = (byte) (x | 0x80);\r
49             x >>= 7;\r
50             i++;\r
51         }\r
52         buf[i] = (byte) x;\r
53         return i + 1;\r
54     }\r
55 \r
56     public static byte[] BigIntegerToBytes(BigInteger value) {\r
57         if (value == null) {\r
58             return null;\r
59         } else {\r
60             byte[] data = value.toByteArray();\r
61             if (data.length != 1 && data[0] == 0) {\r
62                 byte[] tmp = new byte[data.length - 1];\r
63                 System.arraycopy(data, 1, tmp, 0, tmp.length);\r
64                 data = tmp;\r
65             }\r
66 \r
67             return data;\r
68         }\r
69     }\r
70 \r
71     public static byte[] pruneIntermediateScalar(byte[] f) {\r
72         f[0] &= 248;\r
73         f[31] &= 31; // clear top 3 bits\r
74         f[31] |= 64; // set second highest bit\r
75         return f;\r
76     }\r
77 \r
78     public static ExpandedKeys expandedPriKey(String priKey, String key) throws NoSuchAlgorithmException, SignatureException, InvalidKeyException {\r
79         byte[] hashPriKey = ExpandedPrivateKey.HMacSha512(Hex.decode(priKey), key.getBytes());\r
80         //begin operate res[:32]\r
81         byte[] f = new byte[hashPriKey.length / 2];\r
82         System.arraycopy(hashPriKey, 0, f, 0, hashPriKey.length / 2);\r
83         f = pruneIntermediateScalar(f);\r
84         System.arraycopy(f, 0, hashPriKey, 0, hashPriKey.length / 2);\r
85         //end operate res[:32]\r
86         byte[] hashPubKey = DeriveXpub.deriveXpub(hashPriKey);\r
87         ExpandedKeys expandedKeys = new ExpandedKeys();\r
88         expandedKeys.setPriKey(Hex.toHexString(hashPriKey));\r
89         expandedKeys.setPubKey(Hex.toHexString(hashPubKey));\r
90         return expandedKeys;\r
91     }\r
92 }\r