public static QuantumModel FromQuantumContainer(MessageEnvelope quantum, List <Effect> effects, int[] accounts, byte[] buffer)
        {
            if (quantum == null)
            {
                throw new ArgumentNullException(nameof(quantum));
            }
            if (accounts == null)
            {
                throw new ArgumentNullException(nameof(accounts));
            }
            if (effects == null)
            {
                throw new ArgumentNullException(nameof(effects));
            }

            var quantumMessage = (Quantum)quantum.Message;

            using var writer = new XdrBufferWriter(buffer);
            XdrConverter.Serialize(new QuantumContainer {
                Quantum = quantum, Effects = effects
            }, writer);
            return(new QuantumModel
            {
                Apex = quantumMessage.Apex,
                Accounts = accounts,
                Bin = writer.ToArray()
            });
        }
Ejemplo n.º 2
0
        public void XdrReaderPerformanceTest(int rounds, int iterations)
        {
            var testArray = new byte[32];

            Array.Fill(testArray, (byte)100);

            var stream = new XdrBufferWriter();

            for (var i = 0; i < iterations; i++)
            {
                stream.WriteInt32(435);
                stream.WriteString("oiewurouqwe");
                stream.WriteVariable(testArray);
            }
            var serialized = stream.ToArray();

            PerfCounter.MeasureTime(() =>
            {
                for (var r = 0; r < rounds; r++)
                {
                    var reader = new XdrBufferReader(serialized);
                    for (var i = 0; i < iterations; i++)
                    {
                        reader.ReadInt32();
                        reader.ReadString();
                        reader.ReadVariableAsSpan();
                    }
                }
            }, () => $"({rounds} rounds, {iterations} iterations)");
        }
Ejemplo n.º 3
0
        public static IncomingMessage ToIncomingMessage(this MessageEnvelope envelope, XdrBufferWriter writer)
        {
            if (envelope == null)
            {
                throw new ArgumentNullException(nameof(envelope));
            }
            XdrConverter.Serialize(envelope.Message, writer);
            var messageHash = writer.ToArray().ComputeHash();

            return(new IncomingMessage(envelope, messageHash));
        }
        public static byte[] ToByteArray(this object objToSerialize, XdrBufferWriter writer)
        {
            var bytes = objToSerialize as byte[];

            if (bytes != null)
            {
                return(bytes);
            }

            XdrConverter.Serialize(objToSerialize, writer);
            return(writer.ToArray());
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Signs an envelope with a given <see cref="KeyPair"/> and appends the signature to the <see cref="MessageEnvelope.Signatures"/>.
        /// </summary>
        /// <param name="messageEnvelope">Envelope to sign</param>
        /// <param name="keyPair">Key pair to use for signing</param>
        /// <param name="buffer">Buffer to use for computing hash code.</param>
        public static MessageEnvelope Sign(this MessageEnvelope messageEnvelope, KeyPair keyPair, byte[] buffer)
        {
            if (messageEnvelope == null)
            {
                throw new ArgumentNullException(nameof(messageEnvelope));
            }
            if (keyPair == null)
            {
                throw new ArgumentNullException(nameof(keyPair));
            }
            if (buffer == null)
            {
                throw new ArgumentNullException(nameof(buffer));
            }
            using var writer = new XdrBufferWriter(buffer);
            XdrConverter.Serialize(messageEnvelope.Message, writer);
            var signature = writer.ToArray().ComputeHash().Sign(keyPair);

            messageEnvelope.Signatures.Add(signature);
            return(messageEnvelope);
        }
Ejemplo n.º 6
0
        public void XdrCompatibilityTest()
        {
            var testArray = new byte[32];

            Array.Fill(testArray, (byte)100);

            //forward compatibility
            var legacyXdrSerializationStream = new XdrDataOutputStream();

            legacyXdrSerializationStream.WriteInt(435);
            legacyXdrSerializationStream.WriteUInt(435);
            legacyXdrSerializationStream.WriteLong(43546345634657565L);
            legacyXdrSerializationStream.WriteDoubleArray(new double[] { 435.15, 64656.11 });
            legacyXdrSerializationStream.WriteString("oiewurouqwe");
            legacyXdrSerializationStream.WriteVarOpaque(32, testArray);

            var bufferReader = new XdrBufferReader(legacyXdrSerializationStream.ToArray());

            Assert.AreEqual(435, bufferReader.ReadInt32());
            Assert.AreEqual((uint)435, bufferReader.ReadUInt32());
            Assert.AreEqual(43546345634657565L, bufferReader.ReadInt64());
            {
                var length = bufferReader.ReadInt32();
                var value  = new double[length];
                for (var i = 0; i < length; i++)
                {
                    value[i] = bufferReader.ReadDouble();
                }
                Assert.AreEqual(new double[] { 435.15, 64656.11 }, value);
            }
            Assert.AreEqual("oiewurouqwe", bufferReader.ReadString());
            Assert.AreEqual(testArray, bufferReader.ReadVariable());

            using var streamReader = new XdrStreamReader(new MemoryStream(legacyXdrSerializationStream.ToArray()));
            Assert.AreEqual(435, streamReader.ReadInt32());
            Assert.AreEqual((uint)435, streamReader.ReadUInt32());
            Assert.AreEqual(43546345634657565L, streamReader.ReadInt64());
            {
                var length = streamReader.ReadInt32();
                var value  = new double[length];
                for (var i = 0; i < length; i++)
                {
                    value[i] = streamReader.ReadDouble();
                }
                Assert.AreEqual(new double[] { 435.15, 64656.11 }, value);
            }
            Assert.AreEqual("oiewurouqwe", streamReader.ReadString());
            Assert.AreEqual(testArray, streamReader.ReadVariable());

            //backward compatibility
            var bufferWriter = new XdrBufferWriter();

            bufferWriter.WriteInt32(435);
            bufferWriter.WriteUInt32((uint)435);
            {
                var arr = new double[] { 435.15, 64656.11 };
                bufferWriter.WriteInt32(arr.Length);
                foreach (var d in arr)
                {
                    bufferWriter.WriteDouble(d);
                }
            }
            bufferWriter.WriteString("oiewurouqwe");
            bufferWriter.WriteVariable(testArray);

            var legacyXdrReader = new XdrDataInputStream(bufferWriter.ToArray());

            Assert.AreEqual(435, legacyXdrReader.ReadInt());
            Assert.AreEqual((uint)435, legacyXdrReader.ReadUInt());
            Assert.AreEqual(new double[] { 435.15, 64656.11 }, legacyXdrReader.ReadDoubleArray());
            Assert.AreEqual("oiewurouqwe", legacyXdrReader.ReadString());
            Assert.AreEqual(testArray, legacyXdrReader.ReadVarOpaque(32));


            using var memoryStream = new MemoryStream();
            var streamWriter = new XdrStreamWriter(memoryStream);

            streamWriter.WriteInt32(435);
            streamWriter.WriteUInt32((uint)435);
            {
                var arr = new double[] { 435.15, 64656.11 };
                streamWriter.WriteInt32(arr.Length);
                foreach (var d in arr)
                {
                    streamWriter.WriteDouble(d);
                }
            }
            streamWriter.WriteString("oiewurouqwe");
            streamWriter.WriteVariable(testArray);
            var res       = memoryStream.ToArray();
            var reference = bufferWriter.ToArray();

            CollectionAssert.AreEqual(reference, res);
        }