<PackageReference Include="BouncyCastle.Cryptography" Version="2.7.0-beta.98" />

SXprUtilities

public sealed class SXprUtilities
using Org.BouncyCastle.Utilities.IO; using System; using System.IO; namespace Org.BouncyCastle.Bcpg.OpenPgp { public sealed class SXprUtilities { private class MyS2k : S2k { private readonly long m_iterationCount64; public override long IterationCount => m_iterationCount64; internal MyS2k(HashAlgorithmTag algorithm, byte[] iv, long iterationCount64) : base(algorithm, iv, (int)iterationCount64) { m_iterationCount64 = iterationCount64; } } private SXprUtilities() { } private static int ReadLength(Stream input, int ch) { int num = ch - 48; while ((ch = input.ReadByte()) >= 0 && ch != 58) { num = num * 10 + ch - 48; } return num; } internal static string ReadString(Stream input, int ch) { return string.Create(ReadLength(input, ch), input, delegate(Span<char> chars, Stream input) { for (int i = 0; i < chars.Length; i++) { chars[i] = Convert.ToChar(input.ReadByte()); } }); } internal static byte[] ReadBytes(Stream input, int ch) { int num = ReadLength(input, ch); byte[] array = new byte[num]; if (num != Streams.ReadFully(input, array)) throw new EndOfStreamException(); return array; } internal static S2k ParseS2k(Stream input) { SkipOpenParenthesis(input); ReadString(input, input.ReadByte()); byte[] iv = ReadBytes(input, input.ReadByte()); long iterationCount = long.Parse(ReadString(input, input.ReadByte())); SkipCloseParenthesis(input); return new MyS2k(HashAlgorithmTag.Sha1, iv, iterationCount); } internal static void SkipOpenParenthesis(Stream input) { int num = input.ReadByte(); if (num != 40) throw new IOException("unknown character encountered: " + Convert.ToChar(num).ToString()); } internal static void SkipCloseParenthesis(Stream input) { int num = input.ReadByte(); if (num != 41) throw new IOException("unknown character encountered: " + Convert.ToChar(num).ToString()); } } }