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)); }
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 }
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)))); } }
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)}"); }
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()); })); }