示例#1
0
        /// <summary>
        /// Creates a new instance of <see cref="Signature"/> by reading it from a DER encoded byte array with loose rules.
        /// Return value indicates success.
        /// </summary>
        /// <param name="derSig">Signature bytes encoded using DER encoding</param>
        /// <param name="result">Resulting signature (null in case of failure)</param>
        /// <param name="error">Error message (null if sucessful, otherwise contains information about the failure)</param>
        /// <returns>True if successful, otherwise false.</returns>
        public static bool TryReadLoose(byte[] derSig, out Signature result, out string error)
        {
            result = null;

            if (derSig == null)
            {
                error = "Byte array can not be null.";
                return(false);
            }

            // Min = 3006[0201(01)0201(01)]-01
            if (derSig.Length < 9)
            {
                // This also handles the Length == 0 case
                error = "Invalid DER encoding length.";
                return(false);
            }

            FastStreamReader stream = new FastStreamReader(derSig);

            if (!stream.TryReadByte(out byte seqTag) || seqTag != SequenceTag)
            {
                error = "Sequence tag was not found in DER encoded signature.";
                return(false);
            }

            if (!stream.TryReadDerLength(out int seqLen))
            {
                error = "Invalid sequence length.";
                return(false);
            }

            if (seqLen < 6 || !stream.CheckRemaining(seqLen + 1)) // +1 is the SigHash byte (at least 1 byte)
            {
                error = "Invalid total length according to sequence length.";
                return(false);
            }

            if (!stream.TryReadByte(out byte intTag1) || intTag1 != IntegerTag)
            {
                error = "First integer tag was not found in DER encoded signature.";
                return(false);
            }

            if (!stream.TryReadDerLength(out int rLen) || rLen == 0)
            {
                error = "Invalid R length.";
                return(false);
            }

            if (!stream.TryReadByteArray(rLen, out byte[] rBa))
示例#2
0
        public void CheckRemainingTest()
        {
            var stream = new FastStreamReader(new byte[5]);

            Assert.True(stream.CheckRemaining(1));
            Assert.True(stream.CheckRemaining(5));
            Assert.False(stream.CheckRemaining(6));

            _ = stream.TryReadByteArray(2, out _);
            Assert.True(stream.CheckRemaining(1));
            Assert.False(stream.CheckRemaining(5));
            Assert.False(stream.CheckRemaining(6));
        }
示例#3
0
        public void SkipTest()
        {
            var stream = new FastStreamReader(new byte[10]);

            Assert.Equal(0, stream.GetCurrentIndex());

            stream.Skip(0);
            Assert.Equal(0, stream.GetCurrentIndex());

            stream.Skip(1);
            Assert.Equal(1, stream.GetCurrentIndex());

            stream.Skip(4);
            Assert.Equal(5, stream.GetCurrentIndex());

            stream.Skip(7);
            Assert.Equal(12, stream.GetCurrentIndex());

            Assert.False(stream.CheckRemaining(1));
        }