peass-ng/PEASS-ng · error · EndOfStreamException
EOF encountered in middle of BMPString
Error message
EOF encountered in middle of BMPString
What it means
Thrown by GetBmpCharBuffer while converting a definite-length BMPString's contents into a char buffer: the underlying stream ended before all of the BMP string's bytes could be read, so the encoding claims more content bytes than the stream actually contains.
Source
Thrown at winPEAS/winPEASexe/winPEAS/3rdParty/BouncyCastle/asn1/Asn1InputStream.cs:343
defIn.ReadAllIntoByteArray(buf);
return buf;
}
private static char[] GetBmpCharBuffer(DefiniteLengthInputStream defIn)
{
int remainingBytes = defIn.Remaining;
if (0 != (remainingBytes & 1))
throw new IOException("malformed BMPString encoding encountered");
char[] str = new char[remainingBytes / 2];
int stringPos = 0;
byte[] buf = new byte[8];
while (remainingBytes >= 8)
{
if (Streams.ReadFully(defIn, buf, 0, 8) != 8)
throw new EndOfStreamException("EOF encountered in middle of BMPString");
str[stringPos] = (char)((buf[0] << 8) | (buf[1] & 0xFF));
str[stringPos + 1] = (char)((buf[2] << 8) | (buf[3] & 0xFF));
str[stringPos + 2] = (char)((buf[4] << 8) | (buf[5] & 0xFF));
str[stringPos + 3] = (char)((buf[6] << 8) | (buf[7] & 0xFF));
stringPos += 4;
remainingBytes -= 8;
}
if (remainingBytes > 0)
{
if (Streams.ReadFully(defIn, buf, 0, remainingBytes) != remainingBytes)
throw new EndOfStreamException("EOF encountered in middle of BMPString");
int bufPos = 0;
do
{
int b1 = buf[bufPos++] << 8;
int b2 = buf[bufPos++] & 0xFF;View on GitHub (pinned to 53fb989abc)
Solutions
- Verify the input length matches the ASN.1 structure (complete file/blob)
- Buffer the whole source into a byte[] before parsing so the parser sees a self-consistent stream
- Re-download/re-copy the data; check transfer integrity
- Catch EndOfStreamException and treat the certificate/blob as truncated
Example fix
// before Asn1Object o = new Asn1InputStream(partialStream).ReadObject(); // after if (partialStream.CanSeek && partialStream.Position != 0) partialStream.Position = 0; byte[] all = ReadAllBytes(partialStream); Asn1Object o = Asn1Object.FromByteArray(all);
Defensive patterns
Strategy: try-catch
Validate before calling
static bool IsCompleteFile(string path)
{
var fi = new FileInfo(path);
return fi.Exists && fi.Length > 0; // plus upstream integrity checks (hash/size)
} Try / catch
try { Asn1Object o = Asn1Object.FromByteArray(data); }
catch (EndOfStreamException)
{
// BMPString (or object) content truncated mid-read
} Prevention
- Fully materialize input as byte[] before parsing
- Avoid sharing one Stream between multiple parsers
- Validate downloads against expected size/hash
When it happens
Trigger: A primitive BMPString whose definite-length content exceeds the actual bytes remaining in the stream (truncated input, or the DefiniteLengthInputStream hit EOF mid-string).
Common situations: Certificate files cut off mid-transfer; streams read after an earlier consumer already drained them; truncated embedded blobs in logs/databases.
Related errors
- EOF found reading length
- malformed BMPString encoding encountered
- DEF length object truncated by
- truncated BIT STRING detected
- malformed BMPString encoding encountered
AI-assisted analysis of peass-ng/PEASS-ng@53fb989abc (2026-09-02).
Data as JSON: /api/errors/1ac4b4114d3f7d9e.
Report an issue: GitHub.