示例#1
0
        public void Encoding_UnescapedString()
        {
            var unescaped = @"""a(b)c:d<e>f[g\h]i{j}";
            var escaped   = @"\""a\(b\)c\:d\<e\>f\[g\\h\]i\{j\}";

            Assert.AreEqual(unescaped, PascalAsciiEncoding.Unescape(escaped));
            Assert.AreEqual(unescaped, PascalAsciiEncoding.Unescape(PascalAsciiEncoding.Unescape(escaped)));
            Assert.IsTrue(PascalAsciiEncoding.IsValidUnescaped(escaped));             // escaped string is also valid as unescaped, since \ is allowed
            Assert.IsTrue(PascalAsciiEncoding.IsValidUnescaped(unescaped));
        }
示例#2
0
        public void Encoding_EscapeString()
        {
            var unescaped = @"""a(b)c:d<e>f[g\h]i{j}";
            var escaped   = @"\""a\(b\)c\:d\<e\>f\[g\\h\]i\{j\}";

            Assert.AreEqual(escaped, PascalAsciiEncoding.Escape(unescaped));
            Assert.AreEqual(escaped, PascalAsciiEncoding.Escape(PascalAsciiEncoding.Escape(unescaped)));
            Assert.IsTrue(PascalAsciiEncoding.IsValidEscaped(escaped));
            Assert.IsTrue(PascalAsciiEncoding.IsValidEscaped(unescaped));             // unescaped is also a valid escaped string (unlike pascal64 encoding)
        }
示例#3
0
        public void EdgeCase_AllEscapeChars()
        {
            var parser    = NewInstance();
            var name      = @"(a)b{c}d[e]f:g""h<i>";
            var content   = @"""a(b)c:d<e>f[g\h]i{j}";
            var password  = name;
            var epasaText = $@"{Pascal64Encoding.Escape(name)}{{""{PascalAsciiEncoding.Escape(content)}"":{PascalAsciiEncoding.Escape(password)}}}";
            var checksum  = EPasaHelper.ComputeExtendedChecksum(epasaText);

            epasaText = $"{epasaText}:{checksum}";
            Assert.IsTrue(parser.TryParse(epasaText, out var epasa));
            Assert.AreEqual(null, epasa.Account);
            Assert.AreEqual(null, epasa.AccountChecksum);
            Assert.AreEqual(name, epasa.AccountName);
            Assert.AreEqual(checksum, epasa.ExtendedChecksum);
            Assert.AreEqual(password, epasa.Password);
            Assert.AreEqual(PayloadType.AddressedByName | PayloadType.PasswordEncrypted | PayloadType.AsciiFormatted, epasa.PayloadType);
            Assert.AreEqual(content, epasa.Payload);
            Assert.AreEqual(epasaText, epasa.ToString());
        }
示例#4
0
 public void PascalAsciiStringPattern_FullCharSet_Escaped()
 {
     AssertEx.RegexMatch(PascalAsciiEncoding.Escape(PascalAsciiEncoding.CharSet), PascalAsciiEncoding.StringPattern);
 }
示例#5
0
        public static bool IsValidPayloadLength(PayloadType payloadType, string payloadContent)
        {
            if (string.IsNullOrEmpty(payloadContent))
            {
                return(true);
            }

            if (payloadType.HasFlag(PayloadType.Public))
            {
                if (payloadType.HasFlag(PayloadType.AsciiFormatted))
                {
                    return(PascalAsciiEncoding.Unescape(payloadContent).Length <= MaxPublicAsciiContentLength);
                }

                if (payloadType.HasFlag(PayloadType.HexFormatted))
                {
                    return(payloadContent.Length <= MaxPublicHexContentLength);
                }

                if (payloadType.HasFlag(PayloadType.Base58Formatted))
                {
                    return(payloadContent.Length <= MaxPublicBase58ContentLength);
                }

                // unknown encoding format
                return(false);
            }

            if (payloadType.HasFlag(PayloadType.SenderKeyEncrypted) || payloadType.HasFlag(PayloadType.RecipientKeyEncrypted))
            {
                if (payloadType.HasFlag(PayloadType.AsciiFormatted))
                {
                    return(PascalAsciiEncoding.Unescape(payloadContent).Length <= MaxECIESAsciiContentLength);
                }

                if (payloadType.HasFlag(PayloadType.HexFormatted))
                {
                    return(payloadContent.Length <= MaxECIESHexContentLength);
                }

                if (payloadType.HasFlag(PayloadType.Base58Formatted))
                {
                    return(payloadContent.Length <= MaxECIESBase58ContentLength);
                }

                // unknown encoding format
                return(false);
            }

            if (payloadType.HasFlag(PayloadType.PasswordEncrypted))
            {
                if (payloadType.HasFlag(PayloadType.AsciiFormatted))
                {
                    return(PascalAsciiEncoding.Unescape(payloadContent).Length <= MaxAESAsciiContentLength);
                }

                if (payloadType.HasFlag(PayloadType.HexFormatted))
                {
                    return(payloadContent.Length <= MaxAESHexContentLength);
                }

                if (payloadType.HasFlag(PayloadType.Base58Formatted))
                {
                    return(payloadContent.Length <= MaxAESBase58ContentLength);
                }

                // unknown encoding format
                return(false);
            }

            // unknown encryption format
            return(false);
        }
示例#6
0
        public string ToString(bool omitExtendedChecksum)
        {
            var result = string.Empty;

            if (PayloadType.HasFlag(PayloadType.AddressedByName))
            {
                result += Pascal64Encoding.Escape(AccountName);
            }
            else
            {
                result += Account.ToString();
                if (AccountChecksum != null)
                {
                    result += $"-{AccountChecksum}";
                }
            }

            var payloadContent = string.Empty;

            if (PayloadType.HasFlag(PayloadType.AsciiFormatted))
            {
                payloadContent = $@"""{PascalAsciiEncoding.Escape(Payload)}""";
            }
            else if (PayloadType.HasFlag(PayloadType.HexFormatted))
            {
                payloadContent = $@"0x{Payload}";
            }
            else if (PayloadType.HasFlag(PayloadType.Base58Formatted))
            {
                payloadContent = $"{Payload}";
            }
            else
            {
                // it is non-deterministic, so payload content is ignored
                payloadContent = string.Empty;
            }

            if (PayloadType.HasFlag(PayloadType.Public))
            {
                result += $"[{payloadContent}]";
            }
            else if (PayloadType.HasFlag(PayloadType.RecipientKeyEncrypted))
            {
                result += $"({payloadContent})";
            }
            else if (PayloadType.HasFlag(PayloadType.SenderKeyEncrypted))
            {
                result += $"<{payloadContent}>";
            }
            else if (PayloadType.HasFlag(PayloadType.PasswordEncrypted))
            {
                result += $"{{{payloadContent}:{PascalAsciiEncoding.Escape(Password)}}}";
            }
            else
            {
                // it is non-deterministic, so payload omitted entirely
            }

            if (ExtendedChecksum != null && !omitExtendedChecksum)
            {
                result += $":{ExtendedChecksum}";
            }

            return(result);
        }