[#43] Client: Memory optimization
Signed-off-by: Pavel Gross <p.gross@yadro.com>
This commit is contained in:
parent
5e86f53b0e
commit
87fe8db674
76 changed files with 399 additions and 3668 deletions
|
@ -9,61 +9,13 @@ using FrostFS.Session;
|
|||
|
||||
using Google.Protobuf;
|
||||
|
||||
using Org.BouncyCastle.Asn1.Sec;
|
||||
using Org.BouncyCastle.Crypto.Digests;
|
||||
using Org.BouncyCastle.Crypto.Parameters;
|
||||
using Org.BouncyCastle.Crypto.Signers;
|
||||
using Org.BouncyCastle.Math;
|
||||
|
||||
namespace FrostFS.SDK.Client;
|
||||
|
||||
public static class Verifier
|
||||
{
|
||||
public const int RFC6979SignatureSize = 64;
|
||||
|
||||
private static BigInteger[] DecodeSignature(byte[] sig)
|
||||
{
|
||||
if (sig.Length != RFC6979SignatureSize)
|
||||
throw new FormatException($"Wrong signature size, expect={RFC6979SignatureSize}, actual={sig.Length}");
|
||||
|
||||
var rs = new BigInteger[2];
|
||||
rs[0] = new BigInteger(1, sig.AsSpan(0, 32).ToArray());
|
||||
rs[1] = new BigInteger(1, sig.AsSpan(32).ToArray());
|
||||
|
||||
return rs;
|
||||
}
|
||||
|
||||
public static bool VerifyRFC6979(this byte[] publicKey, byte[] data, byte[] sig)
|
||||
{
|
||||
if (publicKey is null || data is null || sig is null)
|
||||
return false;
|
||||
|
||||
var rs = DecodeSignature(sig);
|
||||
var digest = new Sha256Digest();
|
||||
var signer = new ECDsaSigner(new HMacDsaKCalculator(digest));
|
||||
var secp256R1 = SecNamedCurves.GetByName("secp256r1");
|
||||
var ecParameters = new ECDomainParameters(secp256R1.Curve, secp256R1.G, secp256R1.N);
|
||||
var bcPublicKey = new ECPublicKeyParameters(secp256R1.Curve.DecodePoint(publicKey), ecParameters);
|
||||
var hash = new byte[digest.GetDigestSize()];
|
||||
|
||||
digest.BlockUpdate(data, 0, data.Length);
|
||||
digest.DoFinal(hash, 0);
|
||||
signer.Init(false, bcPublicKey);
|
||||
|
||||
return signer.VerifySignature(hash, rs[0], rs[1]);
|
||||
}
|
||||
|
||||
public static bool VerifyRFC6979(this SignatureRFC6979 signature, IMessage message)
|
||||
{
|
||||
if (signature is null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(signature));
|
||||
}
|
||||
|
||||
return signature.Key.ToByteArray().VerifyRFC6979(message.ToByteArray(), signature.Sign.ToByteArray());
|
||||
}
|
||||
|
||||
public static bool VerifyData(this ECDsa key, ReadOnlyMemory<byte> data, byte[] sig)
|
||||
public static bool VerifyData(this ECDsa key, IMessage data, ByteString sig)
|
||||
{
|
||||
if (key is null)
|
||||
throw new ArgumentNullException(nameof(key));
|
||||
|
@ -71,7 +23,18 @@ public static class Verifier
|
|||
if (sig is null)
|
||||
throw new ArgumentNullException(nameof(sig));
|
||||
|
||||
return key.VerifyHash(data.Sha512(), sig.AsSpan(1).ToArray());
|
||||
var signature = sig.Span.Slice(1).ToArray();
|
||||
using var sha = SHA512.Create();
|
||||
|
||||
if (data is null)
|
||||
{
|
||||
return key.VerifyHash(DataHasher.Sha512(new Span<byte>([])), signature);
|
||||
}
|
||||
|
||||
using var stream = new HashStream(sha);
|
||||
data.WriteTo(stream);
|
||||
|
||||
return key.VerifyHash(stream.Hash(), signature);
|
||||
}
|
||||
|
||||
public static bool VerifyMessagePart(this Signature sig, IMessage data)
|
||||
|
@ -80,9 +43,8 @@ public static class Verifier
|
|||
return false;
|
||||
|
||||
using var key = sig.Key.ToByteArray().LoadPublicKey();
|
||||
var data2Verify = data is null ? [] : data.ToByteArray();
|
||||
|
||||
return key.VerifyData(data2Verify, sig.Sign.ToByteArray());
|
||||
return key.VerifyData(data, sig.Sign);
|
||||
}
|
||||
|
||||
internal static bool VerifyMatryoskaLevel(IMessage body, IMetaHeader meta, IVerificationHeader verification)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue