1 package io.bytom.common;
\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
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
16 public class Utils {
\r
18 public static String rfc3339DateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";
\r
20 public static final Gson serializer = new GsonBuilder().setDateFormat(rfc3339DateFormat).create();
\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
31 public static int writeVarStr(byte[] buf, ByteArrayOutputStream stream) throws IOException {
\r
32 int n = writeVarint(buf.length, stream);
\r
35 return n + (buf.length);
\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
45 private static int putUvarint(byte[] buf, long x) {
\r
48 buf[i] = (byte) (x | 0x80);
\r
56 public static byte[] BigIntegerToBytes(BigInteger value) {
\r
57 if (value == null) {
\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
71 public static byte[] pruneIntermediateScalar(byte[] f) {
\r
73 f[31] &= 31; // clear top 3 bits
\r
74 f[31] |= 64; // set second highest bit
\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