From 00a1e9412f964a5d4cb8004132fa271a220c4766 Mon Sep 17 00:00:00 2001
From: Pavel Gross
Date: Thu, 11 Jul 2024 11:17:48 +0300
Subject: [PATCH] [#16] Remove Tz fix formating
Signed-off-by: Pavel Gross
---
.../Services/NetmapServiceProvider.cs | 7 +-
.../Services/ObjectServiceProvider.cs | 139 ++++++----
.../Services/ObjectTools.cs | 10 +-
.../Tools/NetworkSettings.cs | 32 +--
src/FrostFS.SDK.Cryptography/Extentions.cs | 28 +-
src/FrostFS.SDK.Cryptography/Tz/GF127.cs | 253 ------------------
src/FrostFS.SDK.Cryptography/Tz/Helper.cs | 30 ---
src/FrostFS.SDK.Cryptography/Tz/SL2.cs | 179 -------------
src/FrostFS.SDK.Cryptography/Tz/TzHash.cs | 140 ----------
.../PutObjectParameters.cs | 2 +
src/FrostFS.SDK.Tests/ContainerTest.cs | 1 -
.../ContainerServiceMocks/GetContainerMock.cs | 1 -
src/FrostFS.SDK.Tests/Mocks/NetworkMocker.cs | 1 -
src/FrostFS.SDK.Tests/ObjectTest.cs | 3 +-
src/FrostFS.SDK.Tests/SmokeTests.cs | 20 +-
15 files changed, 123 insertions(+), 723 deletions(-)
delete mode 100644 src/FrostFS.SDK.Cryptography/Tz/GF127.cs
delete mode 100644 src/FrostFS.SDK.Cryptography/Tz/Helper.cs
delete mode 100644 src/FrostFS.SDK.Cryptography/Tz/SL2.cs
delete mode 100644 src/FrostFS.SDK.Cryptography/Tz/TzHash.cs
diff --git a/src/FrostFS.SDK.ClientV2/Services/NetmapServiceProvider.cs b/src/FrostFS.SDK.ClientV2/Services/NetmapServiceProvider.cs
index 441d13b..aabc133 100644
--- a/src/FrostFS.SDK.ClientV2/Services/NetmapServiceProvider.cs
+++ b/src/FrostFS.SDK.ClientV2/Services/NetmapServiceProvider.cs
@@ -111,13 +111,16 @@ internal class NetmapServiceProvider : ContextAccessor
var valueBytes = param.Value.ToByteArray();
switch (key)
{
+ case "AuditFee": settings.AuditFee = GetLongValue(valueBytes); break;
+ case "BasicIncomeRate": settings.BasicIncomeRate = GetLongValue(valueBytes); break;
case "ContainerFee": settings.ContainerFee = GetLongValue(valueBytes); break;
+ case "ContainerAliasFee": settings.ContainerAliasFee = GetLongValue(valueBytes); break;
case "EpochDuration": settings.EpochDuration = GetLongValue(valueBytes); break;
- case "IRCandidateFee": settings.IRCandidateFee = GetLongValue(valueBytes); break;
+ case "InnerRingCandidateFee": settings.InnerRingCandidateFee = GetLongValue(valueBytes); break;
case "MaxECDataCount": settings.MaxECDataCount = GetLongValue(valueBytes); break;
case "MaxECParityCount": settings.MaxECParityCount = GetLongValue(valueBytes); break;
case "MaxObjectSize": settings.MaxObjectSize = GetLongValue(valueBytes); break;
- case "WithdrawalFee": settings.WithdrawalFee = GetLongValue(valueBytes); break;
+ case "WithdrawFee": settings.WithdrawFee = GetLongValue(valueBytes); break;
case "HomomorphicHashingDisabled": settings.HomomorphicHashingDisabled = GetBoolValue(valueBytes); break;
case "MaintenanceModeAllowed": settings.MaintenanceModeAllowed = GetBoolValue(valueBytes); break;
default: settings.UnnamedSettings.Add(key, valueBytes); break;
diff --git a/src/FrostFS.SDK.ClientV2/Services/ObjectServiceProvider.cs b/src/FrostFS.SDK.ClientV2/Services/ObjectServiceProvider.cs
index 1937e70..bc38d7b 100644
--- a/src/FrostFS.SDK.ClientV2/Services/ObjectServiceProvider.cs
+++ b/src/FrostFS.SDK.ClientV2/Services/ObjectServiceProvider.cs
@@ -73,52 +73,6 @@ internal class ObjectServiceProvider(ObjectService.ObjectServiceClient client, C
return await GetObject(request, ctx);
}
- internal Task PutObjectAsync(PutObjectParameters parameters, Context ctx)
- {
- if (parameters.Header == null)
- throw new ArgumentException("Value cannot be null", nameof(parameters.Header));
-
- if (parameters.Payload == null)
- throw new ArgumentException("Value cannot be null", nameof(parameters.Payload));
-
- if (parameters.ClientCut)
- return PutClientCutObject(parameters, ctx);
- else
- return PutStreamObject(parameters, ctx);
- }
-
- internal async Task PutSingleObjectAsync(FrostFsObject modelObject, Context ctx)
- {
- var sessionToken = await GetOrCreateSession(ctx);
-
- var grpcObject = tools.CreateObject(modelObject);
-
- var request = new PutSingleRequest
- {
- Body = new PutSingleRequest.Types.Body()
- {
- Object = grpcObject
- }
- };
-
- request.AddMetaHeader();
- request.AddObjectSessionToken(
- sessionToken,
- grpcObject.Header.ContainerId,
- grpcObject.ObjectId,
- ObjectSessionContext.Types.Verb.Put,
- Context.Key
- );
-
- request.Sign(Context.Key);
-
- var response = await client.PutSingleAsync(request, null, ctx.Deadline, ctx.CancellationToken);
-
- Verifier.CheckResponse(response);
-
- return ObjectId.FromHash(grpcObject.ObjectId.Value.ToByteArray());
- }
-
internal async Task DeleteObjectAsync(ContainerId cid, ObjectId oid, Context ctx)
{
var request = new DeleteRequest
@@ -169,6 +123,52 @@ internal class ObjectServiceProvider(ObjectService.ObjectServiceClient client, C
}
}
+ internal Task PutObjectAsync(PutObjectParameters parameters, Context ctx)
+ {
+ if (parameters.Header == null)
+ throw new ArgumentException("Value cannot be null", nameof(parameters.Header));
+
+ if (parameters.Payload == null)
+ throw new ArgumentException("Value cannot be null", nameof(parameters.Payload));
+
+ if (parameters.ClientCut)
+ return PutClientCutObject(parameters, ctx);
+ else
+ return PutStreamObject(parameters, ctx);
+ }
+
+ internal async Task PutSingleObjectAsync(FrostFsObject modelObject, Context ctx)
+ {
+ var sessionToken = await GetOrCreateSession(ctx);
+
+ var grpcObject = tools.CreateObject(modelObject);
+
+ var request = new PutSingleRequest
+ {
+ Body = new PutSingleRequest.Types.Body()
+ {
+ Object = grpcObject
+ }
+ };
+
+ request.AddMetaHeader();
+ request.AddObjectSessionToken(
+ sessionToken,
+ grpcObject.Header.ContainerId,
+ grpcObject.ObjectId,
+ ObjectSessionContext.Types.Verb.Put,
+ Context.Key
+ );
+
+ request.Sign(Context.Key);
+
+ var response = await client.PutSingleAsync(request, null, ctx.Deadline, ctx.CancellationToken);
+
+ Verifier.CheckResponse(response);
+
+ return ObjectId.FromHash(grpcObject.ObjectId.Value.ToByteArray());
+ }
+
private async Task PutClientCutObject(PutObjectParameters parameters, Context ctx)
{
var payloadStream = parameters.Payload!;
@@ -181,24 +181,36 @@ internal class ObjectServiceProvider(ObjectService.ObjectServiceClient client, C
var networkSettings = await Context.Client.GetNetworkSettingsAsync(ctx);
- var partSize = (int)networkSettings.MaxObjectSize;
- var buffer = new byte[partSize];
+ var objectSize = (int)networkSettings.MaxObjectSize;
+
+ var fullLength = header.PayloadLength;
+
+ if (payloadStream.CanSeek)
+ {
+ objectSize = (int)Math.Min(objectSize, payloadStream.Length);
+
+ if (fullLength == 0)
+ fullLength = (ulong)payloadStream.Length;
+ }
+
+ if (fullLength == 0)
+ throw new ArgumentException("Payload stream must be able to seek or PayloadLength must be specified");
+
+ var buffer = new byte[objectSize];
var largeObject = new LargeObject(header.ContainerId);
var split = new Split();
-
- var fullLength = (ulong)payloadStream.Length;
-
+
while (true)
{
- var bytesCount = await payloadStream.ReadAsync(buffer, 0, partSize);
+ var bytesCount = await payloadStream.ReadAsync(buffer, 0, objectSize);
split.Previous = sentObjectIds.LastOrDefault();
largeObject.AppendBlock(buffer, bytesCount);
- currentObject = new FrostFsObject(header.ContainerId, bytesCount < partSize ? buffer.Take(bytesCount).ToArray() : buffer)
+ currentObject = new FrostFsObject(header.ContainerId, bytesCount < objectSize ? buffer[..bytesCount] : buffer)
.SetSplit(split);
if (largeObject.PayloadLength == fullLength)
@@ -270,21 +282,32 @@ internal class ObjectServiceProvider(ObjectService.ObjectServiceClient client, C
initRequest.Sign(Context.Key);
using var stream = await PutObjectInit(initRequest, ctx);
-
- var buffer = new byte[Constants.ObjectChunkSize];
+
+ var bufferSize = parameters.BufferMaxSize > 0 ? parameters.BufferMaxSize : Constants.ObjectChunkSize;
+
+ if (payload.CanSeek)
+ {
+ bufferSize = (int)Math.Min(payload.Length, bufferSize);
+ }
+ else if (header.PayloadLength > 0)
+ {
+ bufferSize = (int)Math.Min((long)header.PayloadLength, bufferSize);
+ }
+
+ var buffer = new byte[bufferSize];
while (true)
{
- var bufferLength = await payload.ReadAsync(buffer, 0, Constants.ObjectChunkSize, ctx.CancellationToken);
+ var bytesCount = await payload.ReadAsync(buffer, 0, bufferSize, ctx.CancellationToken);
- if (bufferLength == 0)
+ if (bytesCount == 0)
break;
var chunkRequest = new PutRequest(initRequest)
{
Body = new PutRequest.Types.Body
{
- Chunk = ByteString.CopyFrom(buffer[..bufferLength]),
+ Chunk = ByteString.CopyFrom(buffer[..bytesCount]),
},
VerifyHeader = null
};
diff --git a/src/FrostFS.SDK.ClientV2/Services/ObjectTools.cs b/src/FrostFS.SDK.ClientV2/Services/ObjectTools.cs
index 35f68ae..48a1275 100644
--- a/src/FrostFS.SDK.ClientV2/Services/ObjectTools.cs
+++ b/src/FrostFS.SDK.ClientV2/Services/ObjectTools.cs
@@ -25,13 +25,9 @@ internal class ObjectTools(ClientEnvironment ctx) : ContextAccessor (ctx)
grpcHeader.OwnerId = Context.Owner.ToGrpcMessage();
grpcHeader.Version = Context.Version.ToGrpcMessage();
-
- if (@object.Payload != null)
- {
- grpcHeader.PayloadLength = (ulong)@object.Payload.Length;
- grpcHeader.PayloadHash = Sha256Checksum(@object.Payload);
- }
-
+ grpcHeader.PayloadLength = (ulong)@object.Payload.Length;
+ grpcHeader.PayloadHash = Sha256Checksum(@object.Payload);
+
var split = @object.Header.Split;
if (split != null)
{
diff --git a/src/FrostFS.SDK.ClientV2/Tools/NetworkSettings.cs b/src/FrostFS.SDK.ClientV2/Tools/NetworkSettings.cs
index 03067c6..d06ce03 100644
--- a/src/FrostFS.SDK.ClientV2/Tools/NetworkSettings.cs
+++ b/src/FrostFS.SDK.ClientV2/Tools/NetworkSettings.cs
@@ -3,19 +3,19 @@ using System.Collections.Generic;
namespace FrostFS.SDK.ClientV2;
public class NetworkSettings
- {
- public ulong ContainerFee { get; internal set; }
- public ulong ContainerAliasFee { get; internal set; }
- public ulong InnerRingCandidateFee { get; internal set; }
- public ulong WithdrawFee { get; internal set; }
- public ulong EpochDuration { get; internal set; }
- public ulong IRCandidateFee { get; internal set; }
- public ulong MaxObjectSize { get; internal set; }
- public ulong MaxECDataCount { get; internal set; }
- public ulong MaxECParityCount { get; internal set; }
- public ulong WithdrawalFee { get; internal set; }
- public bool HomomorphicHashingDisabled { get; internal set; }
- public bool MaintenanceModeAllowed { get; internal set; }
-
- public Dictionary UnnamedSettings { get; } = [];
- }
\ No newline at end of file
+{
+ public ulong AuditFee { get; internal set; }
+ public ulong BasicIncomeRate { get; internal set; }
+ public ulong ContainerFee { get; internal set; }
+ public ulong ContainerAliasFee { get; internal set; }
+ public ulong EpochDuration { get; internal set; }
+ public ulong InnerRingCandidateFee { get; internal set; }
+ public ulong MaxObjectSize { get; internal set; }
+ public ulong MaxECDataCount { get; internal set; }
+ public ulong MaxECParityCount { get; internal set; }
+ public ulong WithdrawFee { get; internal set; }
+ public bool HomomorphicHashingDisabled { get; internal set; }
+ public bool MaintenanceModeAllowed { get; internal set; }
+
+ public Dictionary UnnamedSettings { get; } = [];
+}
\ No newline at end of file
diff --git a/src/FrostFS.SDK.Cryptography/Extentions.cs b/src/FrostFS.SDK.Cryptography/Extentions.cs
index c27f5ef..5584136 100644
--- a/src/FrostFS.SDK.Cryptography/Extentions.cs
+++ b/src/FrostFS.SDK.Cryptography/Extentions.cs
@@ -1,7 +1,5 @@
using Google.Protobuf;
using Org.BouncyCastle.Crypto.Digests;
-using System;
-using System.Buffers.Binary;
using System.Security.Cryptography;
namespace FrostFS.SDK.Cryptography;
@@ -20,35 +18,11 @@ public static class Extentions
public static byte[] Sha256(this byte[] value)
{
- using var sha256 = SHA256.Create();
+ var sha256 = SHA256.Create();
return sha256.ComputeHash(value);
}
-
- internal static byte[] Sha256(this byte[] value, int offset, int count)
- {
- using var sha256 = SHA256.Create();
- return sha256.ComputeHash(value, offset, count);
- }
-
- internal static byte[] Sha256(this ReadOnlySpan value)
- {
- using var sha256 = SHA256.Create();
- return sha256.ComputeHash(value.ToArray());
- }
-
public static ByteString Sha256(this IMessage data)
{
return ByteString.CopyFrom(data.ToByteArray().Sha256());
}
-
- public static ByteString Sha256(this ByteString data)
- {
- return ByteString.CopyFrom(data.ToByteArray().Sha256());
- }
-
- public static ulong Murmur64(this byte[] value, uint seed)
- {
- using var murmur = new Murmur3_128(seed);
- return BinaryPrimitives.ReadUInt64LittleEndian(murmur.ComputeHash(value));
- }
}
diff --git a/src/FrostFS.SDK.Cryptography/Tz/GF127.cs b/src/FrostFS.SDK.Cryptography/Tz/GF127.cs
deleted file mode 100644
index d1abdcf..0000000
--- a/src/FrostFS.SDK.Cryptography/Tz/GF127.cs
+++ /dev/null
@@ -1,253 +0,0 @@
-using System;
-using System.Security.Cryptography;
-
-namespace FrostFS.SDK.Cryptography.Tz;
-
-// GF127 represents element of GF(2^127)
-public class GF127 : IEquatable
-{
- public const int ByteSize = 16;
- public const ulong MSB64 = (ulong)1 << 63; // 2^63
- public static readonly GF127 Zero = new(0, 0);
- public static readonly GF127 One = new(1, 0);
- public static readonly GF127 X127X631 = new(MSB64 + 1, MSB64); // x^127+x^63+1
-
- private readonly ulong[] _data;
-
- public ulong this[int index]
- {
- get { return _data[index]; }
- set { _data[index] = value; }
- }
-
- public GF127(ulong[] value)
- {
- if (value is null || value.Length != 2)
- throw new ArgumentException(nameof(value) + "is invalid");
- _data = value;
- }
-
- // Constructs new element of GF(2^127) as u1*x^64 + u0.
- // It is assumed that u1 has zero MSB.
- public GF127(ulong u0, ulong u1) : this(new ulong[] { u0, u1 })
- {
- }
-
- public GF127() : this(0, 0)
- {
- }
-
- public override bool Equals(object obj)
- {
- if (obj is null)
- return false;
- if (ReferenceEquals(this, obj))
- return true;
- if (obj is GF127 b)
- return Equals(b);
- return false;
- }
-
- public override int GetHashCode()
- {
- return this[0].GetHashCode() + this[1].GetHashCode();
- }
-
- public bool Equals(GF127 other)
- {
- if (other is null)
- return false;
- if (ReferenceEquals(this, other))
- return true;
- return this[0] == other[0] && this[1] == other[1];
- }
-
- // return the index of MSB
- private int IndexOfMSB()
- {
- int i = Helper.GetLeadingZeros(this[1]);
- if (i == 64)
- i += Helper.GetLeadingZeros(this[0]);
- return 127 - i;
- }
-
- // Set index n to 1
- public static GF127 SetN(int n)
- {
- if (n < 64)
- return new GF127((ulong)1 << n, 0);
- return new GF127(0, (ulong)1 << (n - 64));
- }
-
- // Add
- public static GF127 operator +(GF127 a, GF127 b)
- {
- return new GF127(a[0] ^ b[0], a[1] ^ b[1]);
- }
-
- // Bitwise-and
- public static GF127 operator &(GF127 a, GF127 b)
- {
- return new GF127(a[0] & b[0], a[1] & b[1]);
- }
-
- // Multiply
- public static GF127 operator *(GF127 a, GF127 b) // 2^63 * 2, 10
- {
- GF127 r = new();
- GF127 c = a;
-
- if (b[1] == 0)
- {
- for (int i = 0; i < b[0].GetNonZeroLength(); i++)
- {
- if ((b[0] & ((ulong)1 << i)) != 0)
- r += c;
- c = Mul10(c); // c = c * 2
- }
- }
- else
- {
- for (int i = 0; i < 64; i++)
- {
- if ((b[0] & ((ulong)1 << i)) != 0)
- r += c;
- c = Mul10(c); // c = c * 2
- }
-
- for (int i = 0; i < b[1].GetNonZeroLength(); i++)
- {
- if ((b[1] & ((ulong)1 << i)) != 0)
- r += c;
- c = Mul10(c);
- }
- }
-
- return r;
- }
-
- // Inverse, returns a^-1
- // Extended Euclidean Algorithm
- // https://link.springer.com/content/pdf/10.1007/3-540-44499-8_1.pdf
- public static GF127 Inv(GF127 a)
- {
- GF127 v = X127X631,
- u = a,
- c = new(1, 0),
- d = new(0, 0),
- t,
- x;
-
- int du = u.IndexOfMSB();
- int dv = v.IndexOfMSB();
- // degree of polynomial is a position of most significant bit
- while (du != 0)
- {
- if (du < dv)
- {
- (v, u) = (u, v);
- (dv, du) = (du, dv);
- (d, c) = (c, d);
- }
-
- x = SetN(du - dv);
- t = x * v;
- u += t;
- // because * performs reduction on t, manually reduce u at first step
- if (u.IndexOfMSB() == 127)
- u += X127X631;
-
- t = x * d;
- c += t;
-
- du = u.IndexOfMSB();
- dv = v.IndexOfMSB();
- }
-
- return c;
- }
-
- // Mul10 returns a*x
- public static GF127 Mul10(GF127 a)
- {
- GF127 b = new();
- var c = (a[0] & MSB64) >> 63;
- b[0] = a[0] << 1;
- b[1] = (a[1] << 1) ^ c;
- if ((b[1] & MSB64) != 0)
- {
- b[0] ^= X127X631[0];
- b[1] ^= X127X631[1];
- }
-
- return b;
- }
-
- // Mul11 returns a*(x+1)
- public static GF127 Mul11(GF127 a)
- {
- GF127 b = new();
- var c = (a[0] & MSB64) >> 63;
- b[0] = a[0] ^ (a[0] << 1);
- b[1] = a[1] ^ (a[1] << 1) ^ c;
- if ((b[1] & MSB64) == 0) return b;
- b[0] ^= X127X631[0];
- b[1] ^= X127X631[1];
- return b;
- }
-
- // Random returns random element from GF(2^127).
- // Is used mostly for testing.
- public static GF127 Random()
- {
- using RandomNumberGenerator rng = RandomNumberGenerator.Create();
- return new GF127(rng.NextUlong(), rng.NextUlong() >> 1);
- }
-
- // FromByteArray does the deserialization stuff
- public GF127 FromByteArray(byte[] data)
- {
- if (data.Length != ByteSize)
- throw new ArgumentException(
- nameof(data) + $" wrong data lenght, {nameof(GF127)} expect={ByteSize}, actual={data.Length}"
- );
- var t0 = new byte[8];
- var t1 = new byte[8];
- Array.Copy(data, 0, t1, 0, 8);
- Array.Copy(data, 8, t0, 0, 8);
- if (BitConverter.IsLittleEndian)
- {
- Array.Reverse(t0);
- Array.Reverse(t1);
- }
-
- _data[0] = BitConverter.ToUInt64(t0, 0);
- _data[1] = BitConverter.ToUInt64(t1, 0);
- if ((_data[1] & MSB64) != 0)
- throw new ArgumentException(nameof(data) + " invalid data");
- return this;
- }
-
- // ToArray() represents element of GF(2^127) as byte array of length 16.
- public byte[] ToByteArray()
- {
- var buff = new byte[16];
- var b0 = BitConverter.GetBytes(_data[0]);
- var b1 = BitConverter.GetBytes(_data[1]);
- if (BitConverter.IsLittleEndian)
- {
- Array.Reverse(b0);
- Array.Reverse(b1);
- }
-
- Array.Copy(b1, 0, buff, 0, 8);
- Array.Copy(b0, 0, buff, 8, 8);
- return buff;
- }
-
- // ToString() returns hex-encoded representation, starting with MSB.
- public override string ToString()
- {
- return BitConverter.ToString(ToByteArray()).Replace("-", "");
- }
-}
\ No newline at end of file
diff --git a/src/FrostFS.SDK.Cryptography/Tz/Helper.cs b/src/FrostFS.SDK.Cryptography/Tz/Helper.cs
deleted file mode 100644
index 807870e..0000000
--- a/src/FrostFS.SDK.Cryptography/Tz/Helper.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-using System;
-using System.Security.Cryptography;
-
-namespace FrostFS.SDK.Cryptography.Tz;
-
-public static class Helper
-{
- public static ulong NextUlong(this RandomNumberGenerator rng)
- {
- var buff = new byte[8];
- rng.GetBytes(buff);
- return BitConverter.ToUInt64(buff, 0);
- }
-
- public static int GetLeadingZeros(ulong value)
- {
- var i = 64;
- while (value != 0)
- {
- value >>= 1;
- i--;
- }
- return i;
- }
-
- public static int GetNonZeroLength(this ulong value)
- {
- return 64 - GetLeadingZeros(value);
- }
-}
diff --git a/src/FrostFS.SDK.Cryptography/Tz/SL2.cs b/src/FrostFS.SDK.Cryptography/Tz/SL2.cs
deleted file mode 100644
index 6802501..0000000
--- a/src/FrostFS.SDK.Cryptography/Tz/SL2.cs
+++ /dev/null
@@ -1,179 +0,0 @@
-using System;
-using System.Linq;
-
-namespace FrostFS.SDK.Cryptography.Tz;
-
-public class SL2 : IEquatable
-{
- // 2x2 matrix
- private readonly GF127[][] data;
-
- public static readonly SL2 ID = new(
- new GF127(1, 0), new GF127(0, 0), new GF127(0, 0), new GF127(1, 0));
-
- public static readonly SL2 A = new(
- new GF127(2, 0), new GF127(1, 0), new GF127(1, 0), new GF127(0, 0));
-
- public static readonly SL2 B = new(
- new GF127(2, 0), new GF127(3, 0), new GF127(1, 0), new GF127(1, 0));
-
- // Indexer
- public GF127[] this[int i]
- {
- get { return data[i]; }
- set { data[i] = value; }
- }
-
- public SL2(GF127[][] value)
- {
- if (value is null || value.Length != 2 || !value.All(p => p.Length == 2))
- throw new ArgumentException(nameof(value) + $" invalid {nameof(GF127)} matrics");
- data = value;
- }
-
- public SL2(GF127 g00, GF127 g01, GF127 g10, GF127 g11)
- : this([[g00, g01], [g10, g11]])
- {
- }
-
- public SL2() : this(GF127.One, GF127.Zero, GF127.Zero, GF127.One)
- {
- }
-
- public override bool Equals(object obj)
- {
- if (obj is null)
- return false;
- if (ReferenceEquals(this, obj))
- return true;
- if (obj is SL2 b)
- return Equals(b);
- return false;
- }
-
- public override int GetHashCode()
- {
- return this[0][0].GetHashCode() +
- this[0][1].GetHashCode() +
- this[1][0].GetHashCode() +
- this[1][1].GetHashCode();
- }
-
- public bool Equals(SL2 other)
- {
- if (other is null)
- return false;
- if (ReferenceEquals(this, other))
- return true;
- return this[0][0].Equals(other[0][0]) &&
- this[0][1].Equals(other[0][1]) &&
- this[1][0].Equals(other[1][0]) &&
- this[1][1].Equals(other[1][1]);
- }
-
- // 2X2 matrix multiplication
- public static SL2 operator *(SL2 a, SL2 b)
- {
- return new SL2(
- a[0][0] * b[0][0] + a[0][1] * b[1][0],
- a[0][0] * b[0][1] + a[0][1] * b[1][1],
- a[1][0] * b[0][0] + a[1][1] * b[1][0],
- a[1][0] * b[0][1] + a[1][1] * b[1][1]);
- }
-
- // Multiplication using strassen algorithm
- public static SL2 MulStrassen(SL2 a, SL2 b)
- {
- GF127[] t =
- [
- (a[0][0] + a[1][1]) * (b[0][0] + b[1][1]), // t[0] == (a11 + a22) * (b11 + b22)
- (a[1][0] + a[1][1]) * b[0][0], // t[1] == (a21 + a22) * b11
- (b[0][1] + b[1][1]) * a[0][0], // t[2] == (b12 + b22) * a11
- (b[1][0] + b[0][0]) * a[1][1], // t[3] == (b21 + b11) * a22
- (a[0][0] + a[0][1]) * b[1][1], // t[4] == (a11 + a12) * b22
- (a[1][0] + a[0][0]) * (b[0][0] + b[0][1]), // t[5] == (a21 + a11) * (b11 + b12)
- (a[0][1] + a[1][1]) * (b[1][0] + b[1][1]), // t[6] == (a12 + a22) * (b21 + b22)
- ];
-
- SL2 r = new();
- r[0][1] = t[2] + t[4]; // r12 == a11*b12 + a11*b22 + a11*b22 + a12*b22 == a11*b12 + a12*b22
- r[1][0] = t[1] + t[3]; // r21 == a21*b11 + a22*b11 + a22*b21 + a22*b11 == a21*b11 + a22*b21
- // r11 == (a11*b11 + a22*b11` + a11*b22` + a22*b22`) + (a22*b21` + a22*b11`) + (a11*b22` + a12*b22`) +
- // (a12*b21 + a22*b21` + a12*b22` + a22*b22`) == a11*b11 + a12*b21
- r[0][0] = t[0] + t[3] + t[4] + t[6];
- // r22 == (a11*b11` + a22*b11` + a11*b22` + a22*b22) + (a21*b11` + a22*b11`) + (a11*b12` + a11*b22`) +
- // (a21*b11` + a11*b11` + a21*b12 + a11*b12`) == a21*b12 + a22*b22
- r[1][1] = t[0] + t[1] + t[2] + t[5];
-
- return r;
- }
-
- // Inv() returns inverse of a in SL2(GF(2^127))
- public static SL2 Inv(SL2 a)
- {
- GF127[] t = new GF127[2];
- t[0] = a[0][0] * a[1][1] + a[0][1] * a[1][0];
- t[1] = GF127.Inv(t[0]);
-
- SL2 r = new();
- r[1][1] = t[1] * a[0][0];
- r[0][1] = t[1] * a[0][1];
- r[1][0] = t[1] * a[1][0];
- r[0][0] = t[1] * a[1][1];
-
- return r;
- }
-
- // MulA() returns this*A, A = {{x, 1}, {1, 0}}
- public SL2 MulA()
- {
- var r = new SL2();
- r[0][0] = GF127.Mul10(this[0][0]) + this[0][1]; // r11 == t11*x + t12
- r[0][1] = this[0][0]; // r12 == t11
-
- r[1][0] = GF127.Mul10(this[1][0]) + this[1][1]; // r21 == t21*x + t22
- r[1][1] = this[1][0]; // r22 == t21
-
- return r;
- }
-
- // MulB() returns this*B, B = {{x, x+1}, {1, 1}}
- public SL2 MulB()
- {
- var r = new SL2();
- r[0][0] = GF127.Mul10(this[0][0]) + this[0][1]; // r11 == t11*x + t12
- r[0][1] = GF127.Mul10(this[0][0]) + this[0][0] + this[0][1]; // r12 == t11*x + t11 + t12
-
- r[1][0] = GF127.Mul10(this[1][0]) + this[1][1]; // r21 == t21*x + t22
- r[1][1] = GF127.Mul10(this[1][0]) + this[1][0] + this[1][1]; // r22 == t21*x + t21 + t22
-
- return r;
- }
-
- public SL2 FromByteArray(byte[] data)
- {
- if (data.Length != 64)
- throw new ArgumentException(nameof(SL2) + $" invalid data, exect={64}, ecatual={data.Length}");
- this[0][0] = new GF127().FromByteArray(data[0..16]);
- this[0][1] = new GF127().FromByteArray(data[16..32]);
- this[1][0] = new GF127().FromByteArray(data[32..48]);
- this[1][1] = new GF127().FromByteArray(data[48..64]);
- return this;
- }
-
- public byte[] ToByteArray()
- {
- var buff = new byte[64];
- Array.Copy(this[0][0].ToByteArray(), 0, buff, 0, 16);
- Array.Copy(this[0][1].ToByteArray(), 0, buff, 16, 16);
- Array.Copy(this[1][0].ToByteArray(), 0, buff, 32, 16);
- Array.Copy(this[1][1].ToByteArray(), 0, buff, 48, 16);
- return buff;
- }
-
- public override string ToString()
- {
- return this[0][0].ToString() + this[0][1].ToString() +
- this[1][0].ToString() + this[1][1].ToString();
- }
-}
diff --git a/src/FrostFS.SDK.Cryptography/Tz/TzHash.cs b/src/FrostFS.SDK.Cryptography/Tz/TzHash.cs
deleted file mode 100644
index 7114bed..0000000
--- a/src/FrostFS.SDK.Cryptography/Tz/TzHash.cs
+++ /dev/null
@@ -1,140 +0,0 @@
-//using System;
-//using System.Collections.Generic;
-//using System.Security;
-//using System.Security.Cryptography;
-
-//namespace FrostFS.SDK.Cryptography.Tz;
-
-//public class TzHash : HashAlgorithm
-//{
-// private const int TzHashLength = 64;
-// private GF127[] x;
-// public override int HashSize => TzHashLength;
-
-// public TzHash()
-// {
-// Initialize();
-// }
-
-// public override void Initialize()
-// {
-// x = new GF127[4];
-// Reset();
-// HashValue = null;
-// }
-
-// public void Reset()
-// {
-// x[0] = new GF127(1, 0);
-// x[1] = new GF127(0, 0);
-// x[2] = new GF127(0, 0);
-// x[3] = new GF127(1, 0);
-// }
-
-// public byte[] ToByteArray()
-// {
-// var buff = new byte[HashSize];
-// for (int i = 0; i < 4; i++)
-// {
-// Array.Copy(x[i].ToByteArray(), 0, buff, i * 16, 16);
-// }
-// return buff;
-// }
-
-// [SecurityCritical]
-// protected override void HashCore(byte[] array, int ibStart, int cbSize)
-// {
-// _ = HashData(array[ibStart..(ibStart + cbSize)]);
-// }
-
-// [SecurityCritical]
-// protected override byte[] HashFinal()
-// {
-// return HashValue = ToByteArray();
-// }
-
-// [SecurityCritical]
-// private int HashData(byte[] data)
-// {
-// var n = data.Length;
-// for (int i = 0; i < n; i++)
-// {
-// for (int j = 7; j >= 0; j--)
-// {
-// MulBitRight(ref x[0], ref x[1], ref x[2], ref x[3], (data[i] & (1 << j)) != 0);
-// }
-// }
-// return n;
-// }
-
-// // MulBitRight() multiply A (if the bit is 0) or B (if the bit is 1) on the right side
-// private void MulBitRight(ref GF127 c00, ref GF127 c01, ref GF127 c10, ref GF127 c11, bool bit)
-// {
-// // plan 1
-// GF127 t;
-// if (bit)
-// { // MulB
-// t = c00;
-// c00 = GF127.Mul10(c00) + c01; // c00 = c00 * x + c01
-// c01 = GF127.Mul11(t) + c01; // c01 = c00 * (x+1) + c01
-
-// t = c10;
-// c10 = GF127.Mul10(c10) + c11; // c10 = c10 * x + c11
-// c11 = GF127.Mul11(t) + c11; // c11 = c10 * (x+1) + c11
-// }
-// else
-// { // MulA
-// t = c00;
-// c00 = GF127.Mul10(c00) + c01; // c00 = c00 * x + c01
-// c01 = t; // c01 = c00
-
-// t = c10;
-// c10 = GF127.Mul10(c10) + c11; // c10 = c10 * x + c11
-// c11 = t; // c11 = c10;
-// }
-
-// //// plan 2
-// //var r = new SL2(c00, c01, c10, c11);
-// //if (bit)
-// // r.MulB();
-// //else
-// // r.MulA();
-// }
-
-// // Concat() performs combining of hashes based on homomorphic characteristic.
-// public static byte[] Concat(List hs)
-// {
-// var r = SL2.ID;
-// foreach (var h in hs)
-// {
-// r *= new SL2().FromByteArray(h);
-// }
-// return r.ToByteArray();
-// }
-
-// // Validate() checks if hashes in hs combined are equal to h.
-// public static bool Validate(byte[] h, List hs)
-// {
-// var expected = new SL2().FromByteArray(h);
-// var actual = new SL2().FromByteArray(Concat(hs));
-// return expected.Equals(actual);
-// }
-
-// // SubtractR() returns hash a, such that Concat(a, b) == c
-// public static byte[] SubstractR(byte[] b, byte[] c)
-// {
-// var t1 = new SL2().FromByteArray(b);
-// var t2 = new SL2().FromByteArray(c);
-// var r = t2 * SL2.Inv(t1);
-// return r.ToByteArray();
-// }
-
-// // SubtractL() returns hash b, such that Concat(a, b) == c
-// public static byte[] SubstractL(byte[] a, byte[] c)
-// {
-// var t1 = new SL2().FromByteArray(a);
-// var t2 = new SL2().FromByteArray(c);
-// var r = SL2.Inv(t1) * t2;
-// return r.ToByteArray();
-// }
-//}
diff --git a/src/FrostFS.SDK.ModelsV2/PutObjectParameters.cs b/src/FrostFS.SDK.ModelsV2/PutObjectParameters.cs
index 23cbc38..69a5a99 100644
--- a/src/FrostFS.SDK.ModelsV2/PutObjectParameters.cs
+++ b/src/FrostFS.SDK.ModelsV2/PutObjectParameters.cs
@@ -9,4 +9,6 @@ public class PutObjectParameters
public Stream? Payload { get; set; }
public bool ClientCut { get; set; }
+
+ public int BufferMaxSize { get; set; }
}
\ No newline at end of file
diff --git a/src/FrostFS.SDK.Tests/ContainerTest.cs b/src/FrostFS.SDK.Tests/ContainerTest.cs
index d41edb8..498a47a 100644
--- a/src/FrostFS.SDK.Tests/ContainerTest.cs
+++ b/src/FrostFS.SDK.Tests/ContainerTest.cs
@@ -1,4 +1,3 @@
-using FrostFS.SDK.ClientV2;
using FrostFS.SDK.ModelsV2;
using FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap;
using FrostFS.SDK.ClientV2.Mappers.GRPC;
diff --git a/src/FrostFS.SDK.Tests/Mocks/ContainerServiceMocks/GetContainerMock.cs b/src/FrostFS.SDK.Tests/Mocks/ContainerServiceMocks/GetContainerMock.cs
index 9a72f09..2188795 100644
--- a/src/FrostFS.SDK.Tests/Mocks/ContainerServiceMocks/GetContainerMock.cs
+++ b/src/FrostFS.SDK.Tests/Mocks/ContainerServiceMocks/GetContainerMock.cs
@@ -10,7 +10,6 @@ using FrostFS.SDK.ClientV2.Mappers.GRPC.Netmap;
using FrostFS.SDK.ClientV2.Mappers.GRPC;
using FrostFS.Session;
using FrostFS.Refs;
-using System.Collections.Generic;
namespace FrostFS.SDK.Tests;
diff --git a/src/FrostFS.SDK.Tests/Mocks/NetworkMocker.cs b/src/FrostFS.SDK.Tests/Mocks/NetworkMocker.cs
index 6cef45f..f078df6 100644
--- a/src/FrostFS.SDK.Tests/Mocks/NetworkMocker.cs
+++ b/src/FrostFS.SDK.Tests/Mocks/NetworkMocker.cs
@@ -3,7 +3,6 @@ using FrostFS.Netmap;
using Grpc.Core;
using FrostFS.SDK.ClientV2;
using Google.Protobuf;
-using NuGet.Frameworks;
namespace FrostFS.SDK.Tests;
diff --git a/src/FrostFS.SDK.Tests/ObjectTest.cs b/src/FrostFS.SDK.Tests/ObjectTest.cs
index 399dc07..d524284 100644
--- a/src/FrostFS.SDK.Tests/ObjectTest.cs
+++ b/src/FrostFS.SDK.Tests/ObjectTest.cs
@@ -45,8 +45,7 @@ public abstract class ObjectTestsBase
ContainerId = new ContainerId(Base58.Encode(Mocker.ContainerGuid.ToBytes()));
Mocker.ObjectHeader = new(ContainerId, ModelsV2.Enums.ObjectType.Regular, [new ObjectAttribute("k", "v")])
- {
- PayloadLength = 1,
+ {
Version = new ModelsV2.Version(2, 13),
OwnerId = OwnerId.FromKey(ecdsaKey)
};
diff --git a/src/FrostFS.SDK.Tests/SmokeTests.cs b/src/FrostFS.SDK.Tests/SmokeTests.cs
index 6a33209..ad9f5ee 100644
--- a/src/FrostFS.SDK.Tests/SmokeTests.cs
+++ b/src/FrostFS.SDK.Tests/SmokeTests.cs
@@ -63,8 +63,11 @@ public class SmokeTests
var result = await fsClient.GetNodeInfoAsync();
}
- [Fact]
- public async void SimpleScenarioTest()
+ [Theory]
+ [InlineData(1)]
+ [InlineData(3 * 1024 * 1024)] // exactly one chunk size - 3MB
+ [InlineData(6 * 1024 * 1024 + 100)]
+ public async void SimpleScenarioTest(int objectSize)
{
using var fsClient = Client.GetInstance(GetOptions(this.key, this.url));
@@ -88,7 +91,7 @@ public class SmokeTests
Assert.NotNull(container);
- var bytes = GetRandomBytes(6 * 1024 * 1024 + 100);
+ var bytes = GetRandomBytes(objectSize);
var param = new PutObjectParameters
{
@@ -144,8 +147,13 @@ public class SmokeTests
}
}
- [Fact]
- public async void ClientCutScenarioTest()
+ [Theory]
+ [InlineData(1)]
+ [InlineData(64 * 1024 * 1024)] // exactly 1 block size - 64MB
+ [InlineData(64 * 1024 * 1024 - 1)]
+ [InlineData(64 * 1024 * 1024 + 1)]
+ [InlineData(2 * 64 * 1024 * 1024 + 256)]
+ public async void ClientCutScenarioTest(int objectSize)
{
using var fsClient = Client.GetInstance(GetOptions(this.key, this.url));
@@ -165,7 +173,7 @@ public class SmokeTests
Assert.NotNull(container);
- byte[] bytes = GetRandomBytes(150 * 1024 * 1024);
+ byte[] bytes = GetRandomBytes(objectSize);
var param = new PutObjectParameters
{