/// <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))
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)); }
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)); }