diff options
author | Peter Dettman <peter.dettman@bouncycastle.org> | 2023-03-07 16:24:01 +0700 |
---|---|---|
committer | Peter Dettman <peter.dettman@bouncycastle.org> | 2023-03-07 16:24:01 +0700 |
commit | e78d715bfd0c981d5f11dfae4442491289ad5690 (patch) | |
tree | 58550dec8481292a828d50b41d558602f0ff22ec /crypto/src/asn1/DerBitString.cs | |
parent | Remove lazy ASN.1 behaviour (diff) | |
download | BouncyCastle.NET-ed25519-e78d715bfd0c981d5f11dfae4442491289ad5690.tar.xz |
Sort DER sets without encoding elements
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) |