From 0dca56adc504522dbc66dd8541de0c8f53644dda Mon Sep 17 00:00:00 2001 From: Peter Dettman Date: Thu, 27 Jul 2023 17:42:58 +0700 Subject: Refactoring around stream calculators --- crypto/src/crmf/PKMacBuilder.cs | 78 ++++------------------ .../src/crypto/operators/DefaultMacCalculator.cs | 21 ++++++ crypto/src/crypto/operators/DefaultMacResult.cs | 27 ++++++++ .../crypto/operators/DefaultSignatureCalculator.cs | 18 ++--- .../src/crypto/operators/DefaultSignatureResult.cs | 11 ++- .../crypto/operators/DefaultVerifierCalculator.cs | 15 ++--- .../src/crypto/operators/DefaultVerifierResult.cs | 19 ++---- 7 files changed, 82 insertions(+), 107 deletions(-) create mode 100644 crypto/src/crypto/operators/DefaultMacCalculator.cs create mode 100644 crypto/src/crypto/operators/DefaultMacResult.cs diff --git a/crypto/src/crmf/PKMacBuilder.cs b/crypto/src/crmf/PKMacBuilder.cs index 6db80325d..f59ba8f35 100644 --- a/crypto/src/crmf/PKMacBuilder.cs +++ b/crypto/src/crmf/PKMacBuilder.cs @@ -8,90 +8,36 @@ using Org.BouncyCastle.Asn1.Oiw; using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.IO; +using Org.BouncyCastle.Crypto.Operators; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Security; using Org.BouncyCastle.Utilities; namespace Org.BouncyCastle.Crmf { - internal class PKMacStreamCalculator - : IStreamCalculator - { - private readonly MacSink _stream; - - public PKMacStreamCalculator(IMac mac) - { - _stream = new MacSink(mac); - } - - public Stream Stream - { - get { return _stream; } - } - - public DefaultPKMacResult GetResult() - { - return new DefaultPKMacResult(_stream.Mac); - } - } - - internal class PKMacFactory + internal sealed class PKMacFactory : IMacFactory { - protected readonly PbmParameter parameters; - private readonly byte[] key; + private readonly KeyParameter m_key; + private readonly PbmParameter m_parameters; public PKMacFactory(byte[] key, PbmParameter parameters) { - this.key = Arrays.Clone(key); - this.parameters = parameters; + m_key = new KeyParameter(key); + m_parameters = parameters; } - public virtual object AlgorithmDetails - { - get { return new AlgorithmIdentifier(CmpObjectIdentifiers.passwordBasedMac, parameters); } - } + public object AlgorithmDetails => + new AlgorithmIdentifier(CmpObjectIdentifiers.passwordBasedMac, m_parameters); - public virtual IStreamCalculator CreateCalculator() + public IStreamCalculator CreateCalculator() { - IMac mac = MacUtilities.GetMac(parameters.Mac.Algorithm); - mac.Init(new KeyParameter(key)); - return new PKMacStreamCalculator(mac); + IMac mac = MacUtilities.GetMac(m_parameters.Mac.Algorithm); + mac.Init(m_key); + return new DefaultMacCalculator(mac); } } - internal sealed class DefaultPKMacResult - : IBlockResult - { - private readonly IMac mac; - - public DefaultPKMacResult(IMac mac) - { - this.mac = mac; - } - - public byte[] Collect() - { - byte[] res = new byte[mac.GetMacSize()]; - mac.DoFinal(res, 0); - return res; - } - - public int Collect(byte[] buf, int off) - { - return mac.DoFinal(buf, off); - } - -#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER - public int Collect(Span output) - { - return mac.DoFinal(output); - } -#endif - - public int GetMaxResultLength() => mac.GetMacSize(); - } - public class PKMacBuilder { private AlgorithmIdentifier owf; diff --git a/crypto/src/crypto/operators/DefaultMacCalculator.cs b/crypto/src/crypto/operators/DefaultMacCalculator.cs new file mode 100644 index 000000000..2137bcde5 --- /dev/null +++ b/crypto/src/crypto/operators/DefaultMacCalculator.cs @@ -0,0 +1,21 @@ +using System.IO; + +using Org.BouncyCastle.Crypto.IO; + +namespace Org.BouncyCastle.Crypto.Operators +{ + public sealed class DefaultMacCalculator + : IStreamCalculator + { + private readonly MacSink m_macSink; + + public DefaultMacCalculator(IMac mac) + { + m_macSink = new MacSink(mac); + } + + public Stream Stream => m_macSink; + + public IBlockResult GetResult() => new DefaultMacResult(m_macSink.Mac); + } +} diff --git a/crypto/src/crypto/operators/DefaultMacResult.cs b/crypto/src/crypto/operators/DefaultMacResult.cs new file mode 100644 index 000000000..9a45d6792 --- /dev/null +++ b/crypto/src/crypto/operators/DefaultMacResult.cs @@ -0,0 +1,27 @@ +using System; + +using Org.BouncyCastle.Security; + +namespace Org.BouncyCastle.Crypto.Operators +{ + public sealed class DefaultMacResult + : IBlockResult + { + private readonly IMac m_mac; + + public DefaultMacResult(IMac mac) + { + m_mac = mac; + } + + public byte[] Collect() => MacUtilities.DoFinal(m_mac); + + public int Collect(byte[] buf, int off) => m_mac.DoFinal(buf, off); + +#if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER + public int Collect(Span output) => m_mac.DoFinal(output); +#endif + + public int GetMaxResultLength() => m_mac.GetMacSize(); + } +} diff --git a/crypto/src/crypto/operators/DefaultSignatureCalculator.cs b/crypto/src/crypto/operators/DefaultSignatureCalculator.cs index 851662622..0b9f151d3 100644 --- a/crypto/src/crypto/operators/DefaultSignatureCalculator.cs +++ b/crypto/src/crypto/operators/DefaultSignatureCalculator.cs @@ -1,28 +1,22 @@ -using System; -using System.IO; +using System.IO; using Org.BouncyCastle.Crypto.IO; namespace Org.BouncyCastle.Crypto.Operators { + // TODO[api] sealed public class DefaultSignatureCalculator : IStreamCalculator { - private readonly SignerSink mSignerSink; + private readonly SignerSink m_signerSink; public DefaultSignatureCalculator(ISigner signer) { - this.mSignerSink = new SignerSink(signer); + m_signerSink = new SignerSink(signer); } - public Stream Stream - { - get { return mSignerSink; } - } + public Stream Stream => m_signerSink; - public IBlockResult GetResult() - { - return new DefaultSignatureResult(mSignerSink.Signer); - } + public IBlockResult GetResult() => new DefaultSignatureResult(m_signerSink.Signer); } } diff --git a/crypto/src/crypto/operators/DefaultSignatureResult.cs b/crypto/src/crypto/operators/DefaultSignatureResult.cs index cbbc04d20..3ac66c2b4 100644 --- a/crypto/src/crypto/operators/DefaultSignatureResult.cs +++ b/crypto/src/crypto/operators/DefaultSignatureResult.cs @@ -5,17 +5,14 @@ namespace Org.BouncyCastle.Crypto.Operators public sealed class DefaultSignatureResult : IBlockResult { - private readonly ISigner mSigner; + private readonly ISigner m_signer; public DefaultSignatureResult(ISigner signer) { - this.mSigner = signer; + m_signer = signer; } - public byte[] Collect() - { - return mSigner.GenerateSignature(); - } + public byte[] Collect() => m_signer.GenerateSignature(); public int Collect(byte[] buf, int off) { @@ -33,6 +30,6 @@ namespace Org.BouncyCastle.Crypto.Operators } #endif - public int GetMaxResultLength() => mSigner.GetMaxSignatureSize(); + public int GetMaxResultLength() => m_signer.GetMaxSignatureSize(); } } diff --git a/crypto/src/crypto/operators/DefaultVerifierCalculator.cs b/crypto/src/crypto/operators/DefaultVerifierCalculator.cs index cbf4e77d6..719a3f9a4 100644 --- a/crypto/src/crypto/operators/DefaultVerifierCalculator.cs +++ b/crypto/src/crypto/operators/DefaultVerifierCalculator.cs @@ -5,24 +5,19 @@ using Org.BouncyCastle.Crypto.IO; namespace Org.BouncyCastle.Crypto.Operators { + // TODO[api] sealed public class DefaultVerifierCalculator : IStreamCalculator { - private readonly SignerSink mSignerSink; + private readonly SignerSink m_signerSink; public DefaultVerifierCalculator(ISigner signer) { - this.mSignerSink = new SignerSink(signer); + m_signerSink = new SignerSink(signer); } - public Stream Stream - { - get { return mSignerSink; } - } + public Stream Stream => m_signerSink; - public IVerifier GetResult() - { - return new DefaultVerifierResult(mSignerSink.Signer); - } + public IVerifier GetResult() => new DefaultVerifierResult(m_signerSink.Signer); } } diff --git a/crypto/src/crypto/operators/DefaultVerifierResult.cs b/crypto/src/crypto/operators/DefaultVerifierResult.cs index fb259c8f8..994020a46 100644 --- a/crypto/src/crypto/operators/DefaultVerifierResult.cs +++ b/crypto/src/crypto/operators/DefaultVerifierResult.cs @@ -4,26 +4,21 @@ using Org.BouncyCastle.Utilities; namespace Org.BouncyCastle.Crypto.Operators { + // TODO[api] sealed public class DefaultVerifierResult : IVerifier { - private readonly ISigner mSigner; + private readonly ISigner m_signer; public DefaultVerifierResult(ISigner signer) { - this.mSigner = signer; + m_signer = signer; } - public bool IsVerified(byte[] signature) - { - return mSigner.VerifySignature(signature); - } + public bool IsVerified(byte[] signature) => m_signer.VerifySignature(signature); - public bool IsVerified(byte[] sig, int sigOff, int sigLen) - { - byte[] signature = Arrays.CopyOfRange(sig, sigOff, sigOff + sigLen); - - return IsVerified(signature); - } + // TODO[api] Use ISigner.VerifySignature(ReadOnlySpan) when available + public bool IsVerified(byte[] sig, int sigOff, int sigLen) => + IsVerified(Arrays.CopyOfRange(sig, sigOff, sigOff + sigLen)); } } -- cgit 1.4.1