diff options
Diffstat (limited to 'crypto/src/asn1/DerBitString.cs')
-rw-r--r-- | crypto/src/asn1/DerBitString.cs | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/crypto/src/asn1/DerBitString.cs b/crypto/src/asn1/DerBitString.cs index 44b3bb95a..2712c3056 100644 --- a/crypto/src/asn1/DerBitString.cs +++ b/crypto/src/asn1/DerBitString.cs @@ -266,6 +266,38 @@ namespace Org.BouncyCastle.Asn1 return new PrimitiveEncoding(tagClass, tagNo, contents); } + internal sealed override DerEncoding GetEncodingDer() + { + int padBits = contents[0]; + if (padBits != 0) + { + int last = contents.Length - 1; + byte lastBer = contents[last]; + byte lastDer = (byte)(lastBer & (0xFF << padBits)); + + if (lastBer != lastDer) + return new PrimitiveDerEncodingSuffixed(Asn1Tags.Universal, Asn1Tags.BitString, contents, lastDer); + } + + return new PrimitiveDerEncoding(Asn1Tags.Universal, Asn1Tags.BitString, contents); + } + + internal sealed override DerEncoding GetEncodingDerImplicit(int tagClass, int tagNo) + { + int padBits = contents[0]; + if (padBits != 0) + { + int last = contents.Length - 1; + byte lastBer = contents[last]; + byte lastDer = (byte)(lastBer & (0xFF << padBits)); + + if (lastBer != lastDer) + return new PrimitiveDerEncodingSuffixed(tagClass, tagNo, contents, lastDer); + } + + return new PrimitiveDerEncoding(tagClass, tagNo, contents); + } + protected override int Asn1GetHashCode() { if (contents.Length < 2) |