예제 #1
0
        private static byte[] SignData(FiscoTransModel trans, ECKeyPair key)
        {
            byte[][] b = new byte[10][];
            b[0] = trans.data.AccountNonce;
            b[1] = LibraryHelper.FromBigInteger(trans.data.Price);
            b[2] = LibraryHelper.FromBigInteger(trans.data.GasLimit);
            b[3] = LibraryHelper.FromBigInteger(trans.data.BlockLimit);
            b[4] = trans.data.Recipient;
            b[5] = trans.data.Amount == null ? null : LibraryHelper.FromBigInteger(trans.data.Amount);
            b[6] = trans.data.Payload;
            b[7] = LibraryHelper.FromBigInteger(trans.data.ChainID);
            b[8] = LibraryHelper.FromBigInteger(trans.data.GroupID);
            b[9] = trans.data.ExtraData;

            var txb = Nethereum.RLP.RLP.EncodeElementsAndList(b);

            if (trans.smcrypto)
            {
                BigInteger r, s;
                SM2Utils.Sign(SM2Utils.SM3Hash(txb), key.prik, out r, out s);
                trans.data.R = LibraryHelper.FromBigInteger(r);
                trans.data.S = LibraryHelper.FromBigInteger(s);

                var    pub1 = key.pubk.Q.XCoord.GetEncoded();
                var    pub2 = key.pubk.Q.YCoord.GetEncoded();
                byte[] v    = new byte[pub1.Length + pub2.Length];
                Array.Copy(pub1, 0, v, 0, pub1.Length);
                Array.Copy(pub2, 0, v, pub1.Length, pub2.Length);
                Console.WriteLine(string.Format("sign.V:{0}", Hex.ToHexString(v)));
                trans.data.V = v;
            }
            else
            {
                var bytes = EthUtils.ConvertSHA256byte(txb);
                var sign  = EthUtils.Sign(bytes, key.prik);
                trans.data.R = sign.Item1;
                trans.data.S = sign.Item2;
                trans.data.V = sign.Item3;
            }
            byte[][] si = new byte[b.Length + 3][];
            Array.Copy(b, 0, si, 0, b.Length);
            si[b.Length]     = trans.data.V;
            si[b.Length + 1] = trans.data.R;
            si[b.Length + 2] = trans.data.S;

            var txs = Nethereum.RLP.RLP.EncodeElementsAndList(si);

            return(txs);
        }
예제 #2
0
        private static byte[] SignData(CitaTransaction trans, bool sm, ECKeyPair key)
        {
            var tx = Util.MarshalByte(trans);

            if (sm)
            {
                var publicKeyStr = fillStr64(formatHexString(Hex.ToHexString(key.pubk.Q.XCoord.ToBigInteger().ToByteArray())))
                                   + fillStr64(formatHexString(Hex.ToHexString(key.pubk.Q.YCoord.ToBigInteger().ToByteArray())));
                Console.WriteLine(string.Format("publicKeyStr:{0}", publicKeyStr));
                BigInteger r, s;
                SM2Utils.Sign(SM2Utils.SM3Hash(tx), key.prik, out r, out s);
                var signStr        = fillStr64(formatHexString(Hex.ToHexString(r.ToByteArray()))) + fillStr64(formatHexString(Hex.ToHexString(s.ToByteArray())));
                var publicKeyBytes = Hex.Decode(publicKeyStr);
                var signBytes      = Hex.Decode(signStr);
                var byteSource     = new byte[signBytes.Length + publicKeyBytes.Length];
                signBytes.CopyTo(byteSource, 0);
                publicKeyBytes.CopyTo(byteSource, signBytes.Length);
                return(byteSource);
            }
            return(null);
        }