diff options
author | Peter Dettman <peter.dettman@bouncycastle.org> | 2020-07-07 20:00:51 +0700 |
---|---|---|
committer | Peter Dettman <peter.dettman@bouncycastle.org> | 2020-07-07 20:00:51 +0700 |
commit | 21a69a8385d0d23504892d2af51af2271b2675f9 (patch) | |
tree | 8155f816d648e84877a68c6191339a3d1c0fd754 | |
parent | Fermat inversion for all custom curves (diff) | |
download | BouncyCastle.NET-ed25519-21a69a8385d0d23504892d2af51af2271b2675f9.tar.xz |
Rewrite enumeration of BEROctetString
-rw-r--r-- | crypto/src/asn1/BerOctetString.cs | 69 |
1 files changed, 50 insertions, 19 deletions
diff --git a/crypto/src/asn1/BerOctetString.cs b/crypto/src/asn1/BerOctetString.cs index fb4291612..f41aaf6a5 100644 --- a/crypto/src/asn1/BerOctetString.cs +++ b/crypto/src/asn1/BerOctetString.cs @@ -88,9 +88,7 @@ namespace Org.BouncyCastle.Asn1 public IEnumerator GetEnumerator() { if (octs == null) - { - return GenerateOcts().GetEnumerator(); - } + return new ChunkEnumerator(str, chunkSize); return octs.GetEnumerator(); } @@ -101,22 +99,6 @@ namespace Org.BouncyCastle.Asn1 return GetEnumerator(); } - private IList GenerateOcts() - { - IList vec = Platform.CreateArrayList(); - for (int i = 0; i < str.Length; i += chunkSize) - { - int end = System.Math.Min(str.Length, i + chunkSize); - - byte[] nStr = new byte[end - i]; - - Array.Copy(str, i, nStr, 0, nStr.Length); - - vec.Add(new DerOctetString(nStr)); - } - return vec; - } - internal override void Encode( DerOutputStream derOut) { @@ -142,5 +124,54 @@ namespace Org.BouncyCastle.Asn1 base.Encode(derOut); } } + + private class ChunkEnumerator + : IEnumerator + { + private readonly byte[] octets; + private readonly int chunkSize; + + private DerOctetString currentChunk = null; + private int nextChunkPos = 0; + + internal ChunkEnumerator(byte[] octets, int chunkSize) + { + this.octets = octets; + this.chunkSize = chunkSize; + } + + public object Current + { + get + { + if (null == currentChunk) + throw new InvalidOperationException(); + + return currentChunk; + } + } + + public bool MoveNext() + { + if (nextChunkPos >= octets.Length) + { + this.currentChunk = null; + return false; + } + + int length = System.Math.Min(octets.Length - nextChunkPos, chunkSize); + byte[] chunk = new byte[length]; + Array.Copy(octets, nextChunkPos, chunk, 0, length); + this.currentChunk = new DerOctetString(chunk); + this.nextChunkPos += length; + return true; + } + + public void Reset() + { + this.currentChunk = null; + this.nextChunkPos = 0; + } + } } } |