コード例 #1
0
        private static string GetPayload(JObject webhookBody, string timestamp)
        {
            var signaturePayload = new SignaturePayload
            {
                ContentType         = "application/json",
                XTLWebhookTimestamp = timestamp,
                Body = webhookBody,
            };

            return(JsonConvert.SerializeObject(signaturePayload, Formatting.None));
        }
コード例 #2
0
ファイル: SignatureTests.cs プロジェクト: rodcarls/Signing
        public void ConstructorProducesUnsignedSignatureRequest()
        {
            // Arrange
            var testData = GenerateTestData();
            var hash     = HashAlgorithm.Create(Signature.DefaultDigestAlgorithmName).ComputeHash(testData);

            // Act
            var sigreq = new Signature(
                SignaturePayload.Compute(
                    "testdata",
                    testData,
                    Signature.DefaultDigestAlgorithmName));

            // Assert
            Assert.Equal("testdata", sigreq.Payload.ContentIdentifier);
            Assert.Equal(hash, sigreq.Payload.Digest);
            Assert.Equal(1, sigreq.Payload.Version);
            Assert.Equal("2.16.840.1.101.3.4.2.1", sigreq.Payload.DigestAlgorithm.Value); // sha256 OID
        }
コード例 #3
0
        public async Task <string> Sign(IEnclaveKey key, object value)
        {
            using (var client = KeyVault.CreateClient())
                using (var sha = SHA256.Create())
                {
                    var kvKey = key.RetrieveKey <JsonWebKey>();

                    var hashed = sha.ComputeHash(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value)));

                    var result = await client.SignAsync(kvKey.Kid, JsonWebKeySignatureAlgorithm.RS256, hashed);

                    var signed = new SignaturePayload
                    {
                        Val = value,
                        Dig = hashed,
                        Kid = result.Kid,
                        Sig = result.Result,
                    };

                    return(Convert.ToBase64String(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(signed))));
                }
        }
コード例 #4
0
        private string ExtrinsicQueryString(byte[] encodedMethodBytes, string module, string method, Address sender, string privateKey)
        {
            _logger.Info("=== Started Invoking Extrinsic ===");

            // Get account Nonce
            var nonce        = GetAccountNonce(sender);
            var compactNonce = Scale.EncodeCompactInteger(nonce);

            _logger.Info($"sender nonce: {nonce}");

            byte[] mmBuf = new byte[3];
            // Module + Method
            var absoluteIndex = _protocolParams.Metadata.GetModuleIndex(module, false);

            mmBuf[0] = (byte)_protocolParams.Metadata.GetModuleIndex(module, true);
            mmBuf[1] = (byte)_protocolParams.Metadata.GetCallMethodIndex(absoluteIndex, method);

            // Address separator
            mmBuf[2] = Consts.ADDRESS_SEPARATOR;

            Extrinsic ce = new Extrinsic();

            var completeMessage = new byte[encodedMethodBytes.Length + 3];

            mmBuf.CopyTo(completeMessage.AsMemory());
            encodedMethodBytes.CopyTo(completeMessage.AsMemory(3));

            // memcpy(completeMessage + 3, encodedMethodBytes, encodedMethodBytesSize);

            ce.Signature.Version = Consts.SIGNATURE_VERSION;
            var senderPK = _protocolParams.Metadata.GetPublicKeyFromAddr(sender);

            ce.Signature.SignerPublicKey = senderPK.Bytes;
            ce.Signature.Nonce           = nonce;
            ce.Signature.Era             = ExtrinsicEra.IMMORTAL_ERA;

            // Format signature payload
            SignaturePayload sp = new SignaturePayload();

            sp.Nonce = nonce;

            sp.MethodBytesLength = encodedMethodBytes.Length + 3;
            sp.MethodBytes       = completeMessage;
            sp.Era = ExtrinsicEra.IMMORTAL_ERA;
            sp.AuthoringBlockHash = _protocolParams.GenesisBlockHash;

            // Serialize and Sign payload
            var  signaturePayloadBytes = new byte[Consts.MAX_METHOD_BYTES_SZ];
            long payloadLength         = sp.SerializeBinary(ref signaturePayloadBytes);

            var secretKeyVec = Converters.StringToByteArray(privateKey);

            var message = signaturePayloadBytes.AsMemory().Slice(0, (int)payloadLength).ToArray();
            var sig     = Sr25519v011.SignSimple(ce.Signature.SignerPublicKey, secretKeyVec, message);

            ce.Signature.Sr25519Signature = sig;

            // Copy signature bytes to transaction
            ce.Signature.Sr25519Signature = sig;
            var length        = Consts.DEFAULT_FIXED_EXSTRINSIC_SIZE + encodedMethodBytes.Length + compactNonce.Length - 1;
            var compactLength = Scale.EncodeCompactInteger(length);

            /////////////////////////////////////////
            // Serialize message signature and write to buffer

            long writtenLength = 0;
            var  buf           = new byte[2048];
            var  buf2          = new List <byte>();

            // Length
            writtenLength += Scale.WriteCompactToBuf(compactLength, ref buf, writtenLength);

            // Signature version
            buf[writtenLength++] = ce.Signature.Version;

            // Address separator
            buf[writtenLength++] = Consts.ADDRESS_SEPARATOR;

            // Signer public key
            ce.Signature.SignerPublicKey.CopyTo(buf.AsMemory((int)writtenLength));

            writtenLength += Consts.SR25519_PUBLIC_SIZE;

            // SR25519 Signature
            ce.Signature.Sr25519Signature.CopyTo(buf.AsMemory((int)writtenLength));
            writtenLength += Consts.SR25519_SIGNATURE_SIZE;

            // Nonce
            writtenLength += Scale.WriteCompactToBuf(compactNonce, ref buf, writtenLength);

            // Extrinsic Era
            buf[writtenLength++] = (byte)ce.Signature.Era;

            // Serialize and send transaction
            var teBytes = new byte[Consts.MAX_METHOD_BYTES_SZ];

            teBytes = buf;
            completeMessage.AsMemory().CopyTo(teBytes.AsMemory((int)writtenLength));

            long teByteLength = writtenLength + encodedMethodBytes.Length + 3;

            return($"0x{Converters.ByteArrayToString(teBytes, (int)teByteLength)}");
        }
コード例 #5
0
        public string SignAndSendTransfer(string sender, string privateKey, string recipient, BigInteger amount, Action <string> callback)
        {
            _logger.Info("=== Starting a Transfer Extrinsic ===");

            // Get account Nonce
            var address = new Address {
                Symbols = sender
            };
            var nonce = GetAccountNonce(address);

            _logger.Info($"sender nonce: {nonce} ");

            // Format transaction
            TransferExtrinsic te = new TransferExtrinsic();

            te.Method.ModuleIndex = _protocolParams.BalanceModuleIndex;
            te.Method.MethodIndex = _protocolParams.TransferMethodIndex;

            var recipientPK = _protocolParams.Metadata.GetPublicKeyFromAddr(new Address(recipient));

            te.Method.ReceiverPublicKey = recipientPK.Bytes;
            te.Method.Amount            = amount;
            te.Signature.Version        = Consts.SIGNATURE_VERSION;
            var senderPK = _protocolParams.Metadata.GetPublicKeyFromAddr(new Address(sender));

            te.Signature.SignerPublicKey = senderPK.Bytes;
            te.Signature.Nonce           = nonce;
            te.Signature.Era             = ExtrinsicEra.IMMORTAL_ERA;

            // Format signature payload
            SignaturePayload sp = new SignaturePayload();

            sp.Nonce = nonce;
            var methodBytes = new byte[Consts.MAX_METHOD_BYTES_SZ];

            sp.MethodBytesLength = (int)te.SerializeMethodBinary(ref methodBytes);
            sp.MethodBytes       = methodBytes;
            sp.Era = ExtrinsicEra.IMMORTAL_ERA;
            sp.AuthoringBlockHash = _protocolParams.GenesisBlockHash;

            // Serialize and Sign payload
            var  signaturePayloadBytes = new byte[Consts.MAX_METHOD_BYTES_SZ];
            long payloadLength         = sp.SerializeBinary(ref signaturePayloadBytes);

            byte[] secretKeyVec = Converters.StringToByteArray(privateKey);

            var message = signaturePayloadBytes.AsMemory().Slice(0, (int)payloadLength).ToArray();
            var sig     = Sr25519v011.SignSimple(te.Signature.SignerPublicKey, secretKeyVec, message);

            te.Signature.Sr25519Signature = sig;

            // Serialize and send transaction
            var    teBytes      = new byte[Consts.MAX_METHOD_BYTES_SZ];
            long   teByteLength = te.SerializeBinary(ref teBytes);
            string teStr        = $"0x{Converters.ByteArrayToString(teBytes, (int)teByteLength)}";

            var query = new JObject {
                { "method", "author_submitAndWatchExtrinsic" }, { "params", new JArray {
                                                                      teStr
                                                                  } }
            };

            // Send == Subscribe callback to completion
            return(Subscribe(query, (json) =>
            {
                callback(json.ToString());
            }));
        }