ProtobufUtils.java 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package com.fuzamei.util.blockchain;
  2. import smsc.Api;
  3. import java.lang.reflect.Method;
  4. import java.security.InvalidKeyException;
  5. import java.security.MessageDigest;
  6. import java.security.NoSuchAlgorithmException;
  7. import java.security.PrivateKey;
  8. import java.security.SecureRandom;
  9. import java.security.Signature;
  10. import java.security.SignatureException;
  11. import java.util.ArrayList;
  12. import java.util.List;
  13. import java.util.Map;
  14. import com.fuzamei.eddsa.EdDSAEngine;
  15. import com.fuzamei.eddsa.EdDSAPrivateKey;
  16. import com.fuzamei.eddsa.spec.EdDSANamedCurveTable;
  17. import com.fuzamei.eddsa.spec.EdDSAParameterSpec;
  18. import com.fuzamei.eddsa.spec.EdDSAPrivateKeySpec;
  19. import com.fuzamei.util.ReadConfUtil;
  20. import com.google.protobuf.ByteString;
  21. /**
  22. * Created by zhengfan on 2017/7/17.
  23. * Explain
  24. */
  25. public class ProtobufUtils {
  26. /**
  27. *
  28. * @Title: initPlatform
  29. * @Description: TODO 平台初始化---广发催收项目
  30. * @param @return
  31. * @return ProtobufBean
  32. * @author: Ma Amin
  33. * @date: 2017-11-16 下午2:37:39
  34. */
  35. /*public static ProtobufBean initPlatform(){
  36. ProtobufBean protobufBean = new ProtobufBean();
  37. //取出最大公钥和私钥
  38. String pubkey = ReadConfUtil.getProperty("publicKey"); //平台最大的公钥
  39. String platformPrivateKey = "90b289fda1fb0439158f837bbe60cc1ec99616dd0bc6335d6fd0bf3d22888e20"; //平台公钥,随便弄一个
  40. String platformKey = ReadConfUtil.getProperty("privateKey"); //平台最大的私钥
  41. Api.RequestInitPlatform.Builder builder = Api.RequestInitPlatform.newBuilder();
  42. try {
  43. builder.setPlatformKey(ByteString.copyFrom(HexUtil.hexString2Bytes(platformKey)));
  44. builder.setInfo("平台初始化");
  45. SecureRandom secureRandom = new SecureRandom();
  46. long instructionId = secureRandom.nextLong(); //随机数
  47. protobufBean.setInstructionId(instructionId);
  48. //将requestCreateAccount对象签名
  49. Api.RequestInitPlatform requestBuyServe = builder.build();
  50. //request携带请求信息
  51. Api.Request.Builder request = Api.Request.newBuilder();
  52. request.setInitPlatform(builder);
  53. request.setInstructionId(instructionId);
  54. request.setActionId(Api.MessageType.MsgInitPlatform);
  55. request.setPubkey(ByteString.copyFrom(HexUtil.hexString2Bytes(pubkey)));
  56. Api.Request request1 = request.build();
  57. //用操作者的私钥签名
  58. byte[] bytePrivateKey = HexUtil.hexString2Bytes(platformPrivateKey);
  59. //签名啊
  60. ByteString signByteString = getSign(request1.toByteArray(), bytePrivateKey);
  61. //签名后的结果也给request
  62. request.setSign(signByteString);
  63. //将携带着签名后的参数信息通过http给合约,在callback里解析
  64. Api.Request request2 = request.build();
  65. byte[] requestByte = request2.toByteArray();
  66. // String signdata = HexUtil.bytes2HexString(requestByte);
  67. String signdateBase64 = encodeBase64(requestByte);
  68. protobufBean.setSignature(signdateBase64);
  69. } catch (Exception e) {
  70. e.printStackTrace();
  71. }
  72. return protobufBean;
  73. }*/
  74. public static ProtobufBean requestUserCreate(long userUid,String adminPubKey) { //用户公钥,调用者的公钥
  75. // String operatorPrivateKey = "90b289fda1fb0439158f837bbe60cc1ec99616dd0bc6335d6fd0bf3d22888e20";
  76. String platformPrivateKey = "90b289fda1fb0439158f837bbe60cc1ec99616dd0bc6335d6fd0bf3d22888e20"; //平台私钥
  77. String pubkey = "b15a4f6c5c1163b5f80715c9bd87d5118ec4b5668cb29f148eeceec61ddeadc2"; //平台公钥
  78. ProtobufBean protobufBean = new ProtobufBean();
  79. //创建 RequestUserCreate 对象,设置参数
  80. Api.RequestSetAdmin.Builder builder = Api.RequestSetAdmin.newBuilder();
  81. try {
  82. // builder.setUserUid(userUid);
  83. // builder.setUserName(userName);
  84. builder.setPubkey(ByteString.copyFrom(HexUtil.hexString2Bytes(adminPubKey)));
  85. SecureRandom secureRandom = new SecureRandom();
  86. long instructionId = secureRandom.nextLong(); //随机数
  87. protobufBean.setInstructionId(instructionId);
  88. //将requestCreateAccount对象签名
  89. Api.RequestSetAdmin requestBuyServe = builder.build();
  90. //request携带请求信息
  91. Api.Request.Builder request = Api.Request.newBuilder();
  92. request.setSetAdmin(builder);
  93. request.setInstructionId(instructionId);
  94. request.setActionId(Api.MessageType.MsgSetAdmin);
  95. request.setPubkey(ByteString.copyFrom(HexUtil.hexString2Bytes(pubkey)));
  96. request.setUid(userUid);
  97. Api.Request request1 = request.build();
  98. // 用操作者的私钥签名
  99. byte[] bytePrivateKey = HexUtil.hexString2Bytes(platformPrivateKey);
  100. //签名啊
  101. ByteString signByteString = getSign(request1.toByteArray(), bytePrivateKey);
  102. //签名后的结果也给request
  103. request.setSign(signByteString);
  104. //将携带着签名后的参数信息通过http给合约,在callback里解析
  105. Api.Request request2 = request.build();
  106. byte[] requestByte = request2.toByteArray();
  107. // String signdata = HexUtil.bytes2HexString(requestByte);
  108. String signdateBase64 = encodeBase64(requestByte);
  109. protobufBean.setSignature(signdateBase64);
  110. } catch (Exception e) {
  111. throw new RuntimeException(e);
  112. }
  113. return protobufBean;
  114. }
  115. private static ByteString getSign(byte[] requestByte, byte[] bytePrivateKey) {
  116. EdDSAParameterSpec spec = EdDSANamedCurveTable.getByName("Ed25519");
  117. byte[] signbyte = new byte[0];
  118. try {
  119. Signature sgr = new EdDSAEngine(MessageDigest.getInstance(spec.getHashAlgorithm()));
  120. EdDSAPrivateKeySpec privKey = new EdDSAPrivateKeySpec(bytePrivateKey, spec);
  121. PrivateKey sKey = new EdDSAPrivateKey(privKey);
  122. sgr.initSign(sKey);
  123. sgr.update(requestByte);
  124. signbyte = sgr.sign();
  125. } catch (NoSuchAlgorithmException e) {
  126. throw new RuntimeException(e);
  127. } catch (SignatureException e) {
  128. throw new RuntimeException(e);
  129. } catch (InvalidKeyException e) {
  130. throw new RuntimeException(e);
  131. }
  132. return ByteString.copyFrom(signbyte,0,64);
  133. }
  134. public static String encodeBase64(byte[]input) throws Exception{
  135. Class clazz=Class.forName("com.sun.org.apache.xerces.internal.impl.dv.util.Base64");
  136. Method mainMethod= clazz.getMethod("encode", byte[].class);
  137. mainMethod.setAccessible(true);
  138. Object retObj=mainMethod.invoke(null, new Object[]{input});
  139. return (String)retObj;
  140. }
  141. }