From 0a5d0ff1a2212af7100c98573fd375bf69dd1a3b Mon Sep 17 00:00:00 2001 From: Alex Vanin Date: Wed, 12 Aug 2020 09:37:59 +0300 Subject: [PATCH] Remove v1 code --- accounting/fixtures/cheque.sh | 8 - accounting/fixtures/cheque_data | Bin 650 -> 0 bytes accounting/service.go | 46 --- accounting/service.pb.go | Bin 21246 -> 0 bytes accounting/service.proto | 36 --- accounting/sign.go | 167 ---------- accounting/sign_test.go | 185 ----------- accounting/types.go | 453 --------------------------- accounting/types.pb.go | Bin 83790 -> 0 bytes accounting/types.proto | 125 -------- accounting/types_test.go | 193 ------------ accounting/withdraw.go | 35 --- accounting/withdraw.pb.go | Bin 71469 -> 0 bytes accounting/withdraw.proto | 101 ------ acl/extended/enum.go | 126 -------- acl/extended/marshal.go | 333 -------------------- acl/extended/types.go | 73 ----- acl/extended/wrappers.go | 528 -------------------------------- acl/extended/wrappers_test.go | 136 -------- acl/types.go | 57 ---- acl/types.pb.go | Bin 37624 -> 0 bytes acl/types.proto | 106 ------- bootstrap/service.go | 8 - bootstrap/service.pb.go | Bin 17378 -> 0 bytes bootstrap/service.proto | 42 --- bootstrap/sign.go | 46 --- bootstrap/sign_test.go | 82 ----- bootstrap/types.go | 137 --------- bootstrap/types.pb.go | Bin 17631 -> 0 bytes bootstrap/types.proto | 29 -- bootstrap/types_test.go | 39 --- chain/address.go | 30 -- chain/address_test.go | 41 --- container/service.go | 60 ---- container/service.pb.go | Bin 97427 -> 0 bytes container/service.proto | 146 --------- container/sign.go | 194 ------------ container/sign_test.go | 187 ----------- container/types.go | 188 ------------ container/types.pb.go | Bin 13077 -> 0 bytes container/types.proto | 24 -- container/types_test.go | 162 ---------- decimal/decimal.go | 110 ------- decimal/decimal.pb.go | Bin 8694 -> 0 bytes decimal/decimal.proto | 18 -- decimal/decimal_test.go | 445 --------------------------- hash/hash.go | 106 ------- hash/hash_test.go | 166 ---------- hash/hashesslice.go | 20 -- hash/salt.go | 17 - internal/error.go | 7 - internal/proto.go | 19 -- object/doc.go | 143 --------- object/extensions.go | 64 ---- object/service.go | 196 ------------ object/service.pb.go | Bin 128417 -> 0 bytes object/service.proto | 197 ------------ object/service_test.go | 43 --- object/sg.go | 43 --- object/sg_test.go | 88 ------ object/sign.go | 272 ---------------- object/sign_test.go | 239 --------------- object/types.go | 422 ------------------------- object/types.pb.go | Bin 85256 -> 0 bytes object/types.proto | 134 -------- object/types_test.go | 234 -------------- object/utils.go | 100 ------ object/utils_test.go | 53 ---- object/verification.go | 149 --------- object/verification_test.go | 144 --------- query/types.go | 43 --- query/types.pb.go | Bin 15521 -> 0 bytes query/types.proto | 33 -- refs/address.go | 80 ----- refs/cid.go | 104 ------- refs/owner.go | 77 ----- refs/sgid.go | 14 - refs/types.go | 123 -------- refs/types.pb.go | Bin 9400 -> 0 bytes refs/types.proto | 19 -- refs/types_test.go | 141 --------- refs/uuid.go | 84 ----- service/alias.go | 20 -- service/bearer.go | 140 --------- service/bearer_test.go | 199 ------------ service/epoch.go | 11 - service/epoch_test.go | 21 -- service/errors.go | 53 ---- service/meta.go | 131 -------- service/meta.pb.go | Bin 27975 -> 0 bytes service/meta.proto | 49 --- service/meta_test.go | 99 ------ service/raw.go | 6 - service/raw_test.go | 24 -- service/role.go | 37 --- service/role_test.go | 23 -- service/sign.go | 404 ------------------------ service/sign_test.go | 400 ------------------------ service/token.go | 265 ---------------- service/token_test.go | 248 --------------- service/ttl.go | 63 ---- service/ttl_test.go | 99 ------ service/types.go | 317 ------------------- service/utils.go | 18 -- service/utils_test.go | 34 -- service/verify.go | 174 ----------- service/verify.pb.go | Bin 55921 -> 0 bytes service/verify.proto | 119 ------- service/verify_test.go | 140 --------- service/verify_test.pb.go | Bin 14960 -> 0 bytes service/verify_test.proto | 18 -- service/version.go | 11 - service/version_test.go | 21 -- session/alias.go | 15 - session/create.go | 62 ---- session/create_test.go | 103 ------- session/errors.go | 19 -- session/private.go | 67 ---- session/private_test.go | 76 ----- session/request.go | 62 ---- session/request_test.go | 92 ------ session/response.go | 16 - session/response_test.go | 27 -- session/service.pb.go | Bin 21636 -> 0 bytes session/service.proto | 39 --- session/store.go | 64 ---- session/store_test.go | 111 ------- session/types.go | 80 ----- state/service.go | 88 ------ state/service.pb.go | Bin 75369 -> 0 bytes state/service.proto | 124 -------- state/service_test.go | 118 ------- state/sign.go | 67 ---- state/sign_test.go | 94 ------ state/types.go | 24 -- state/types_test.go | 18 -- storagegroup/storage.go | 39 --- storagegroup/types.go | 97 ------ storagegroup/types.pb.go | Bin 17704 -> 0 bytes storagegroup/types.proto | 36 --- 140 files changed, 12952 deletions(-) delete mode 100755 accounting/fixtures/cheque.sh delete mode 100644 accounting/fixtures/cheque_data delete mode 100644 accounting/service.go delete mode 100644 accounting/service.pb.go delete mode 100644 accounting/service.proto delete mode 100644 accounting/sign.go delete mode 100644 accounting/sign_test.go delete mode 100644 accounting/types.go delete mode 100644 accounting/types.pb.go delete mode 100644 accounting/types.proto delete mode 100644 accounting/types_test.go delete mode 100644 accounting/withdraw.go delete mode 100644 accounting/withdraw.pb.go delete mode 100644 accounting/withdraw.proto delete mode 100644 acl/extended/enum.go delete mode 100644 acl/extended/marshal.go delete mode 100644 acl/extended/types.go delete mode 100644 acl/extended/wrappers.go delete mode 100644 acl/extended/wrappers_test.go delete mode 100644 acl/types.go delete mode 100644 acl/types.pb.go delete mode 100644 acl/types.proto delete mode 100644 bootstrap/service.go delete mode 100644 bootstrap/service.pb.go delete mode 100644 bootstrap/service.proto delete mode 100644 bootstrap/sign.go delete mode 100644 bootstrap/sign_test.go delete mode 100644 bootstrap/types.go delete mode 100644 bootstrap/types.pb.go delete mode 100644 bootstrap/types.proto delete mode 100644 bootstrap/types_test.go delete mode 100644 chain/address.go delete mode 100644 chain/address_test.go delete mode 100644 container/service.go delete mode 100644 container/service.pb.go delete mode 100644 container/service.proto delete mode 100644 container/sign.go delete mode 100644 container/sign_test.go delete mode 100644 container/types.go delete mode 100644 container/types.pb.go delete mode 100644 container/types.proto delete mode 100644 container/types_test.go delete mode 100644 decimal/decimal.go delete mode 100644 decimal/decimal.pb.go delete mode 100644 decimal/decimal.proto delete mode 100644 decimal/decimal_test.go delete mode 100644 hash/hash.go delete mode 100644 hash/hash_test.go delete mode 100644 hash/hashesslice.go delete mode 100644 hash/salt.go delete mode 100644 internal/error.go delete mode 100644 internal/proto.go delete mode 100644 object/doc.go delete mode 100644 object/extensions.go delete mode 100644 object/service.go delete mode 100644 object/service.pb.go delete mode 100644 object/service.proto delete mode 100644 object/service_test.go delete mode 100644 object/sg.go delete mode 100644 object/sg_test.go delete mode 100644 object/sign.go delete mode 100644 object/sign_test.go delete mode 100644 object/types.go delete mode 100644 object/types.pb.go delete mode 100644 object/types.proto delete mode 100644 object/types_test.go delete mode 100644 object/utils.go delete mode 100644 object/utils_test.go delete mode 100644 object/verification.go delete mode 100644 object/verification_test.go delete mode 100644 query/types.go delete mode 100644 query/types.pb.go delete mode 100644 query/types.proto delete mode 100644 refs/address.go delete mode 100644 refs/cid.go delete mode 100644 refs/owner.go delete mode 100644 refs/sgid.go delete mode 100644 refs/types.go delete mode 100644 refs/types.pb.go delete mode 100644 refs/types.proto delete mode 100644 refs/types_test.go delete mode 100644 refs/uuid.go delete mode 100644 service/alias.go delete mode 100644 service/bearer.go delete mode 100644 service/bearer_test.go delete mode 100644 service/epoch.go delete mode 100644 service/epoch_test.go delete mode 100644 service/errors.go delete mode 100644 service/meta.go delete mode 100644 service/meta.pb.go delete mode 100644 service/meta.proto delete mode 100644 service/meta_test.go delete mode 100644 service/raw.go delete mode 100644 service/raw_test.go delete mode 100644 service/role.go delete mode 100644 service/role_test.go delete mode 100644 service/sign.go delete mode 100644 service/sign_test.go delete mode 100644 service/token.go delete mode 100644 service/token_test.go delete mode 100644 service/ttl.go delete mode 100644 service/ttl_test.go delete mode 100644 service/types.go delete mode 100644 service/utils.go delete mode 100644 service/utils_test.go delete mode 100644 service/verify.go delete mode 100644 service/verify.pb.go delete mode 100644 service/verify.proto delete mode 100644 service/verify_test.go delete mode 100644 service/verify_test.pb.go delete mode 100644 service/verify_test.proto delete mode 100644 service/version.go delete mode 100644 service/version_test.go delete mode 100644 session/alias.go delete mode 100644 session/create.go delete mode 100644 session/create_test.go delete mode 100644 session/errors.go delete mode 100644 session/private.go delete mode 100644 session/private_test.go delete mode 100644 session/request.go delete mode 100644 session/request_test.go delete mode 100644 session/response.go delete mode 100644 session/response_test.go delete mode 100644 session/service.pb.go delete mode 100644 session/service.proto delete mode 100644 session/store.go delete mode 100644 session/store_test.go delete mode 100644 session/types.go delete mode 100644 state/service.go delete mode 100644 state/service.pb.go delete mode 100644 state/service.proto delete mode 100644 state/service_test.go delete mode 100644 state/sign.go delete mode 100644 state/sign_test.go delete mode 100644 state/types.go delete mode 100644 state/types_test.go delete mode 100644 storagegroup/storage.go delete mode 100644 storagegroup/types.go delete mode 100644 storagegroup/types.pb.go delete mode 100644 storagegroup/types.proto diff --git a/accounting/fixtures/cheque.sh b/accounting/fixtures/cheque.sh deleted file mode 100755 index 581402a..0000000 --- a/accounting/fixtures/cheque.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -CHEQUE=7849b02d01cc7f7734295fa815ea64ec4d2012e45b8781eb891723ba2703c53263e8d6e522dc32203339dcd8eee9c6b7439a00ea56fa00000000611e000000000000060003012d47e76210aec73be39ab3d186e0a40fe8d86bfa3d4fabfda57ba13b88f96a8ebe4360627a1326f13fb9516c0dbc4af90f116e44bd33f4d04a0d1633afa243ad4f2fa9cd933e7631a619b5132cec6983906aba757af5590434124b232a43e302f7528ce97c9a93558efe7d4f62577aabdf771c931f54a71be6ad21e7d9cc177744b4b9781cf0c29adb503f33d2df9f810ebf33a774849848984cf7e2bbebd48ef0cd8592fbf9b6aee1dc74803e31c95a02dbbd5fd9783f9ecbcbf444b5942f830368a6f5829fb2a34fa03d0308ae6b05f433f2904d9a852fed1f5d2eb598ca794770adb1ece9dccd1c7ad98f709cfb890e3bdd5973dcdd838111fae2efa4c3c09ea2133e5d7c6eac6ae24afcce46db7c9f4dc154f123c835adff4e0b7e19bcffda0340750b92789821683283bcb98e32b7e032b94f267b6964613fc31a7ce5813fddad8298f71dfdc4f9b3e353f969727af476d43b12a25727cf6b9c73ae7152266d995bec807068ad2156288c4d946aeb17ebca787d498a1b87b9dae1bcd935763403fef27f744e829131d0ec980829fafa51db1714c2761d9f78762c008c323e9d66db9b5086d355897e52fe065e14f1cc70334248349aa4c7a3e6e3dc8f8693b1511c73dc88e6d6e8b6c6c68de922f351b5b1543917af2f2a3588aebfbd1ff3fac6023e00f03a16e8707ce045eb42ee80d392451541ee510dc18e1c8befbac54d742648b58f379b5337d9b74c5a61afb8ef3db7f3eb0454d6823777b613a3ee22cd6ce47e4fa72170d49267b773cc09c123654e0bcd7278aa2ae1e7c85d049b557a3c -DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) - -echo $CHEQUE | xxd -p -r > $DIR/cheque_data - -exit 0 diff --git a/accounting/fixtures/cheque_data b/accounting/fixtures/cheque_data deleted file mode 100644 index a1530960f321d4d6d1cb7f11f9cf1de82006ffc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 650 zcmV;50(Jd(Nw6&e%zt+@DPO1+>SXLqAQI$Thk@&f7bChS1I039=+@;T+%h0DIo#Op z>BhH1ngHrn`Tzg`0AU^g0000000sa90WC-8Vi2y!JL8(O(T3op59ruy`aMsp{iS=M zJBayej=n=+VtNxM@jtmyYz@3h`416pM7=Zg&`J#!Gq0jUtxqqh&67TMF{T-{6D;g$ zgOF;vb$az#1T+#$BPv7V0{2pk>3o`#RgV6BPhwYktKWAVlOI&48|JMc=h@5`cSN+g zcpUJ;n%hu6Gt%Fmfeybjr*wpvNSI9b;=AkAj_}QelKc6#uHoEtfIczFS_0d>U)gv+ zp3BShM75MJg9B)$^@5+Wqfekc0|>5b1@trWkWHF}FYO;)F147-c}H-qvFz#G%^Z5! zk8qs(i4Hs6S##XogMktH;_sxxz@DNLK3#lntZL#){LV((e4kChRPiIoHLd?n3w{~A z|JnmUbqkVsm?3B~gS@$pGPmF|xlbm0X=GtP!y0_$fj`}?f|&Om{lxjR<5T%*a(eW3 z)H@QQS0~SFoO7;mQYLMgTkL>vXssbuD2z>%YU>y4%6NTAiW`Ty+Tpy}HFh)u{_=lx zPJ)p!(CnB9Df;?R+ZPnVb{(I1b}RslGCrMV+nZ2^(^ZLnQvL>B6!FY(GeSr-nxx00 z=HuLthLf>T9CO@==GN%8#>S25BJ)wTu~a!1uP-V!h_1iAAM^Ug0zLrnIu__~eBedv zLhgXml0_9k?okcFjvR~cy2VX&CP=l9H=9#8*|$tuVXwIFJ-74g1XR|7H+QxZqwXTj kY~+4Vry+3El4rMb%n89GWljsta(JpL;pfO*1e;ZQJiRSO_W%F@ diff --git a/accounting/service.go b/accounting/service.go deleted file mode 100644 index 229707f..0000000 --- a/accounting/service.go +++ /dev/null @@ -1,46 +0,0 @@ -package accounting - -import ( - "github.com/nspcc-dev/neofs-api-go/decimal" - "github.com/nspcc-dev/neofs-api-go/internal" - "github.com/nspcc-dev/neofs-api-go/refs" -) - -type ( - // OwnerID type alias. - OwnerID = refs.OwnerID - - // Decimal type alias. - Decimal = decimal.Decimal - - // Filter is used to filter accounts by criteria. - Filter func(acc *Account) bool -) - -const ( - // ErrEmptyAddress is raised when passed Address is empty. - ErrEmptyAddress = internal.Error("empty address") - - // ErrEmptyLockTarget is raised when passed LockTarget is empty. - ErrEmptyLockTarget = internal.Error("empty lock target") - - // ErrEmptyContainerID is raised when passed CID is empty. - ErrEmptyContainerID = internal.Error("empty container ID") - - // ErrEmptyParentAddress is raised when passed ParentAddress is empty. - ErrEmptyParentAddress = internal.Error("empty parent address") -) - -// SumFunds goes through all accounts and sums up active funds. -func SumFunds(accounts []*Account) (res *decimal.Decimal) { - res = decimal.Zero.Copy() - - for i := range accounts { - if accounts[i] == nil { - continue - } - - res = res.Add(accounts[i].ActiveFunds) - } - return -} diff --git a/accounting/service.pb.go b/accounting/service.pb.go deleted file mode 100644 index 8dd146b376d32afaaf1f0d27e11fc383411b3347..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21246 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 int64(len(buf[offset:])) { - return ErrWrongChequeData - } - - for i := int64(0); i < count; i++ { - sign := ChequeSignature{ - Key: crypto.UnmarshalPublicKey(buf[offset : offset+crypto.PublicKeyCompressedSize]), - Hash: make([]byte, crypto.RFC6979SignatureSize), - } - - offset += crypto.PublicKeyCompressedSize - if sign.Key == nil { - return errors.Wrapf(ErrWrongPublicKey, "item #%d", i) - } - - offset += copy(sign.Hash, buf[offset:offset+crypto.RFC6979SignatureSize]) - if err := crypto.VerifyRFC6979(sign.Key, body, sign.Hash); err != nil { - return errors.Wrapf(ErrWrongSignature, "item #%d: %s (offset=%d, len=%d)", i, err.Error(), offset, len(sign.Hash)) - } - - b.Signatures = append(b.Signatures, sign) - } - - return nil -} - -// ErrNotEnoughFunds generates error using address and amounts. -func ErrNotEnoughFunds(addr string, needed, residue *decimal.Decimal) error { - return errors.Errorf("not enough funds (requested=%s, residue=%s, addr=%s", needed, residue, addr) -} - -func (m *Account) hasLockAcc(addr string) bool { - for i := range m.LockAccounts { - if m.LockAccounts[i].Address == addr { - return true - } - } - return false -} - -// ValidateLock checks that account can be locked. -func (m *Account) ValidateLock() error { - switch { - case m.Address == "": - return ErrEmptyAddress - case m.ParentAddress == "": - return ErrEmptyParentAddress - case m.LockTarget == nil: - return ErrEmptyLockTarget - } - - switch v := m.LockTarget.Target.(type) { - case *LockTarget_WithdrawTarget: - if v.WithdrawTarget.Cheque != m.Address { - return errors.Errorf("wrong cheque ID: expected %s, has %s", m.Address, v.WithdrawTarget.Cheque) - } - case *LockTarget_ContainerCreateTarget: - switch { - case v.ContainerCreateTarget.CID.Empty(): - return ErrEmptyContainerID - } - } - return nil -} - -// CanLock checks possibility to lock funds. -func (m *Account) CanLock(lockAcc *Account) error { - switch { - case m.ActiveFunds.LT(lockAcc.ActiveFunds): - return ErrNotEnoughFunds(lockAcc.ParentAddress, lockAcc.ActiveFunds, m.ActiveFunds) - case m.hasLockAcc(lockAcc.Address): - return errors.Errorf("could not lock account(%s) funds: duplicating lock(%s)", m.Address, lockAcc.Address) - default: - return nil - } -} - -// LockForWithdraw checks that account contains locked funds by passed ChequeID. -func (m *Account) LockForWithdraw(chequeID string) bool { - switch v := m.LockTarget.Target.(type) { - case *LockTarget_WithdrawTarget: - return v.WithdrawTarget.Cheque == chequeID - } - return false -} - -// LockForContainerCreate checks that account contains locked funds for container creation. -func (m *Account) LockForContainerCreate(cid refs.CID) bool { - switch v := m.LockTarget.Target.(type) { - case *LockTarget_ContainerCreateTarget: - return v.ContainerCreateTarget.CID.Equal(cid) - } - return false -} - -// Equal checks that current Settlement is equal to passed Settlement. -func (m *Settlement) Equal(s *Settlement) bool { - if s == nil || m.Epoch != s.Epoch || len(m.Transactions) != len(s.Transactions) { - return false - } - return len(m.Transactions) == 0 || reflect.DeepEqual(m.Transactions, s.Transactions) -} - -// GetOwnerID is an OwnerID field getter. -func (m BalanceRequest) GetOwnerID() OwnerID { - return m.OwnerID -} - -// SetOwnerID is an OwnerID field setter. -func (m *BalanceRequest) SetOwnerID(owner OwnerID) { - m.OwnerID = owner -} - -// GetID is an ID field getter. -func (m GetRequest) GetID() ChequeID { - return m.ID -} - -// SetID is an ID field setter. -func (m *GetRequest) SetID(id ChequeID) { - m.ID = id -} - -// GetOwnerID is an OwnerID field getter. -func (m GetRequest) GetOwnerID() OwnerID { - return m.OwnerID -} - -// SetOwnerID is an OwnerID field setter. -func (m *GetRequest) SetOwnerID(id OwnerID) { - m.OwnerID = id -} - -// GetOwnerID is an OwnerID field getter. -func (m PutRequest) GetOwnerID() OwnerID { - return m.OwnerID -} - -// SetOwnerID is an OwnerID field setter. -func (m *PutRequest) SetOwnerID(id OwnerID) { - m.OwnerID = id -} - -// GetMessageID is a MessageID field getter. -func (m PutRequest) GetMessageID() MessageID { - return m.MessageID -} - -// SetMessageID is a MessageID field setter. -func (m *PutRequest) SetMessageID(id MessageID) { - m.MessageID = id -} - -// SetAmount is an Amount field setter. -func (m *PutRequest) SetAmount(amount *decimal.Decimal) { - m.Amount = amount -} - -// SetHeight is a Height field setter. -func (m *PutRequest) SetHeight(h uint64) { - m.Height = h -} - -// GetOwnerID is an OwnerID field getter. -func (m ListRequest) GetOwnerID() OwnerID { - return m.OwnerID -} - -// SetOwnerID is an OwnerID field setter. -func (m *ListRequest) SetOwnerID(id OwnerID) { - m.OwnerID = id -} - -// GetID is an ID field getter. -func (m DeleteRequest) GetID() ChequeID { - return m.ID -} - -// SetID is an ID field setter. -func (m *DeleteRequest) SetID(id ChequeID) { - m.ID = id -} - -// GetOwnerID is an OwnerID field getter. -func (m DeleteRequest) GetOwnerID() OwnerID { - return m.OwnerID -} - -// SetOwnerID is an OwnerID field setter. -func (m *DeleteRequest) SetOwnerID(id OwnerID) { - m.OwnerID = id -} - -// GetMessageID is a MessageID field getter. -func (m DeleteRequest) GetMessageID() MessageID { - return m.MessageID -} - -// SetMessageID is a MessageID field setter. -func (m *DeleteRequest) SetMessageID(id MessageID) { - m.MessageID = id -} diff --git a/accounting/types.pb.go b/accounting/types.pb.go deleted file mode 100644 index 576ba1f7f219f030581218b37cf0e0a8fd9c5fe3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83790 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 Shx-*@Ya5Pnvn|1EH~$}hwGt=* diff --git a/accounting/withdraw.proto b/accounting/withdraw.proto deleted file mode 100644 index 080a100..0000000 --- a/accounting/withdraw.proto +++ /dev/null @@ -1,101 +0,0 @@ -syntax = "proto3"; -package accounting; -option go_package = "github.com/nspcc-dev/neofs-api-go/accounting"; -option csharp_namespace = "NeoFS.API.Accounting"; - -import "service/meta.proto"; -import "service/verify.proto"; -import "decimal/decimal.proto"; -import "github.com/gogo/protobuf/gogoproto/gogo.proto"; - -option (gogoproto.stable_marshaler_all) = true; - -// Withdraw is a service that provides withdraw assets operations from the NeoFS -service Withdraw { - // Get returns cheque if it was signed by inner ring nodes - rpc Get(GetRequest) returns (GetResponse); - // Put ask inner ring nodes to sign a cheque for withdraw invoke - rpc Put(PutRequest) returns (PutResponse); - // List shows all user's checks - rpc List(ListRequest) returns (ListResponse); - // Delete allows user to remove unused cheque - rpc Delete(DeleteRequest) returns (DeleteResponse); -} - -message Item { - // ID is a cheque identifier - bytes ID = 1 [(gogoproto.customtype) = "ChequeID", (gogoproto.nullable) = false]; - // OwnerID is a wallet address - bytes OwnerID = 2 [(gogoproto.customtype) = "OwnerID", (gogoproto.nullable) = false]; - // Amount of funds - decimal.Decimal Amount = 3; - // Height is the neo blockchain height until the cheque is valid - uint64 Height = 4; - // Payload contains cheque representation in bytes - bytes Payload = 5; -} - -message GetRequest { - // ID is cheque identifier - bytes ID = 1 [(gogoproto.customtype) = "ChequeID", (gogoproto.nullable) = false]; - // OwnerID is a wallet address - bytes OwnerID = 2 [(gogoproto.customtype) = "OwnerID", (gogoproto.nullable) = false]; - // RequestMetaHeader contains information about request meta headers (should be embedded into message) - service.RequestMetaHeader Meta = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; - // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message) - service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} - -message GetResponse { - // Withdraw is cheque with meta information - Item Withdraw = 1; -} - -message PutRequest { - // OwnerID is a wallet address - bytes OwnerID = 1 [(gogoproto.customtype) = "OwnerID", (gogoproto.nullable) = false]; - // Amount of funds - decimal.Decimal Amount = 2; - // Height is the neo blockchain height until the cheque is valid - uint64 Height = 3; - // MessageID is a nonce for uniq request (UUIDv4) - bytes MessageID = 4 [(gogoproto.customtype) = "MessageID", (gogoproto.nullable) = false]; - // RequestMetaHeader contains information about request meta headers (should be embedded into message) - service.RequestMetaHeader Meta = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; - // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message) - service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} -message PutResponse { - // ID is cheque identifier - bytes ID = 1 [(gogoproto.customtype) = "ChequeID", (gogoproto.nullable) = false]; -} - -message ListRequest { - // OwnerID is a wallet address - bytes OwnerID = 1 [(gogoproto.customtype) = "OwnerID", (gogoproto.nullable) = false]; - // RequestMetaHeader contains information about request meta headers (should be embedded into message) - service.RequestMetaHeader Meta = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; - // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message) - service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} - -message ListResponse { - // Items is a set of cheques with meta information - repeated Item Items = 1; -} - -message DeleteRequest { - // ID is cheque identifier - bytes ID = 1 [(gogoproto.customtype) = "ChequeID", (gogoproto.nullable) = false]; - // OwnerID is a wallet address - bytes OwnerID = 2 [(gogoproto.customtype) = "OwnerID", (gogoproto.nullable) = false]; - // MessageID is a nonce for uniq request (UUIDv4) - bytes MessageID = 3 [(gogoproto.customtype) = "MessageID", (gogoproto.nullable) = false]; - // RequestMetaHeader contains information about request meta headers (should be embedded into message) - service.RequestMetaHeader Meta = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; - // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message) - service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} - -// DeleteResponse is empty -message DeleteResponse {} diff --git a/acl/extended/enum.go b/acl/extended/enum.go deleted file mode 100644 index e803476..0000000 --- a/acl/extended/enum.go +++ /dev/null @@ -1,126 +0,0 @@ -package eacl - -const ( - // MatchUnknown is a MatchType value used to mark value as undefined. - // Most of the tools consider MatchUnknown as incalculable. - // Using MatchUnknown in HeaderFilter is unsafe. - MatchUnknown MatchType = iota - - // StringEqual is a MatchType of string equality. - StringEqual - - // StringNotEqual is a MatchType of string inequality. - StringNotEqual -) - -const ( - // ActionUnknown is Action used to mark value as undefined. - // Most of the tools consider ActionUnknown as incalculable. - // Using ActionUnknown in Record is unsafe. - ActionUnknown Action = iota - - // ActionAllow is Action used to mark an applicability of ACL rule. - ActionAllow - - // ActionDeny is Action used to mark an inapplicability of ACL rule. - ActionDeny -) - -const ( - // GroupUnknown is a Group value used to mark value as undefined. - // Most of the tools consider GroupUnknown as incalculable. - // Using GroupUnknown in Target is unsafe. - GroupUnknown Group = iota - - // GroupUser is a Group value for User access group. - GroupUser - - // GroupSystem is a Group value for System access group. - GroupSystem - - // GroupOthers is a Group value for Others access group. - GroupOthers -) - -const ( - // HdrTypeUnknown is a HeaderType value used to mark value as undefined. - // Most of the tools consider HdrTypeUnknown as incalculable. - // Using HdrTypeUnknown in HeaderFilter is unsafe. - HdrTypeUnknown HeaderType = iota - - // HdrTypeRequest is a HeaderType for request header. - HdrTypeRequest - - // HdrTypeObjSys is a HeaderType for system headers of object. - HdrTypeObjSys - - // HdrTypeObjUsr is a HeaderType for user headers of object. - HdrTypeObjUsr -) - -const ( - // OpTypeUnknown is a OperationType value used to mark value as undefined. - // Most of the tools consider OpTypeUnknown as incalculable. - // Using OpTypeUnknown in Record is unsafe. - OpTypeUnknown OperationType = iota - - // OpTypeGet is an OperationType for object.Get RPC - OpTypeGet - - // OpTypePut is an OperationType for object.Put RPC - OpTypePut - - // OpTypeHead is an OperationType for object.Head RPC - OpTypeHead - - // OpTypeSearch is an OperationType for object.Search RPC - OpTypeSearch - - // OpTypeDelete is an OperationType for object.Delete RPC - OpTypeDelete - - // OpTypeRange is an OperationType for object.GetRange RPC - OpTypeRange - - // OpTypeRangeHash is an OperationType for object.GetRangeHash RPC - OpTypeRangeHash -) - -const ( - // HdrObjSysNameID is a name of ID field in system header of object. - HdrObjSysNameID = "ID" - - // HdrObjSysNameCID is a name of CID field in system header of object. - HdrObjSysNameCID = "CID" - - // HdrObjSysNameOwnerID is a name of OwnerID field in system header of object. - HdrObjSysNameOwnerID = "OWNER_ID" - - // HdrObjSysNameVersion is a name of Version field in system header of object. - HdrObjSysNameVersion = "VERSION" - - // HdrObjSysNamePayloadLength is a name of PayloadLength field in system header of object. - HdrObjSysNamePayloadLength = "PAYLOAD_LENGTH" - - // HdrObjSysNameCreatedUnix is a name of CreatedAt.UnitTime field in system header of object. - HdrObjSysNameCreatedUnix = "CREATED_UNIX" - - // HdrObjSysNameCreatedEpoch is a name of CreatedAt.Epoch field in system header of object. - HdrObjSysNameCreatedEpoch = "CREATED_EPOCH" - - // HdrObjSysLinkPrev is a name of previous link header in extended headers of object. - HdrObjSysLinkPrev = "LINK_PREV" - - // HdrObjSysLinkNext is a name of next link header in extended headers of object. - HdrObjSysLinkNext = "LINK_NEXT" - - // HdrObjSysLinkChild is a name of child link header in extended headers of object. - HdrObjSysLinkChild = "LINK_CHILD" - - // HdrObjSysLinkPar is a name of parent link header in extended headers of object. - HdrObjSysLinkPar = "LINK_PAR" - - // HdrObjSysLinkSG is a name of storage group link header in extended headers of object. - HdrObjSysLinkSG = "LINK_SG" -) - diff --git a/acl/extended/marshal.go b/acl/extended/marshal.go deleted file mode 100644 index d1fac07..0000000 --- a/acl/extended/marshal.go +++ /dev/null @@ -1,333 +0,0 @@ -package eacl - -import ( - "encoding/binary" - - "github.com/pkg/errors" -) - -const ( - sliceLenSize = 2 // uint16 for len() - actionSize = 4 // uint32 - opTypeSize = 4 // uint32 - hdrTypeSize = 4 // uint32 - matchTypeSize = 4 // uint32 - targetSize = 4 // uint32 -) - -// MarshalTable encodes Table into a -// binary form and returns the result. -// -// If table is nil, empty slice is returned. -func MarshalTable(table Table) []byte { - if table == nil { - return make([]byte, 0) - } - - // allocate buffer - buf := make([]byte, tableBinSize(table)) - - records := table.Records() - - // write record number - binary.BigEndian.PutUint16(buf, uint16(len(records))) - off := sliceLenSize - - // write all records - for _, record := range records { - // write action - binary.BigEndian.PutUint32(buf[off:], uint32(record.Action())) - off += actionSize - - // write operation type - binary.BigEndian.PutUint32(buf[off:], uint32(record.OperationType())) - off += actionSize - - filters := record.HeaderFilters() - - // write filter number - binary.BigEndian.PutUint16(buf[off:], uint16(len(filters))) - off += sliceLenSize - - // write all filters - for _, filter := range filters { - // write header type - binary.BigEndian.PutUint32(buf[off:], uint32(filter.HeaderType())) - off += hdrTypeSize - - // write match type - binary.BigEndian.PutUint32(buf[off:], uint32(filter.MatchType())) - off += matchTypeSize - - // write header name size - name := []byte(filter.Name()) - binary.BigEndian.PutUint16(buf[off:], uint16(len(name))) - off += sliceLenSize - - // write header name bytes - off += copy(buf[off:], name) - - // write header value size - val := []byte(filter.Value()) - binary.BigEndian.PutUint16(buf[off:], uint16(len(val))) - off += sliceLenSize - - // write header value bytes - off += copy(buf[off:], val) - } - - targets := record.TargetList() - - // write target number - binary.BigEndian.PutUint16(buf[off:], uint16(len(targets))) - off += sliceLenSize - - // write all targets - for _, target := range targets { - // write target group - binary.BigEndian.PutUint32(buf[off:], uint32(target.Group())) - off += targetSize - - keys := target.KeyList() - - // write key number - binary.BigEndian.PutUint16(buf[off:], uint16(len(keys))) - off += sliceLenSize - - // write keys - for i := range keys { - // write key size - binary.BigEndian.PutUint16(buf[off:], uint16(len(keys[i]))) - off += sliceLenSize - - // write key bytes - off += copy(buf[off:], keys[i]) - } - } - } - - return buf -} - -// returns the size of Table in a binary format. -func tableBinSize(table Table) (sz int) { - sz = sliceLenSize // number of records - - records := table.Records() - ln := len(records) - - sz += ln * actionSize // action type of each record - sz += ln * opTypeSize // operation type of each record - - for _, record := range records { - sz += sliceLenSize // number of filters - - filters := record.HeaderFilters() - ln := len(filters) - - sz += ln * hdrTypeSize // header type of each filter - sz += ln * matchTypeSize // match type of each filter - - for _, filter := range filters { - sz += sliceLenSize // header name size - sz += len(filter.Name()) // header name bytes - - sz += sliceLenSize // header value size - sz += len(filter.Value()) // header value bytes - } - - sz += sliceLenSize // number of targets - - targets := record.TargetList() - ln = len(targets) - - sz += ln * targetSize // target group of each target - - for _, target := range targets { - sz += sliceLenSize // number of keys - - for _, key := range target.KeyList() { - sz += sliceLenSize // key size - sz += len(key) // key bytes - } - } - } - - return -} - -// UnmarshalTable unmarshals Table from -// a binary representation. -// -// If data is empty, table w/o records is returned. -func UnmarshalTable(data []byte) (Table, error) { - table := WrapTable(nil) - - if len(data) == 0 { - return table, nil - } - - // decode record number - if len(data) < sliceLenSize { - return nil, errors.New("could not decode record number") - } - - recordNum := binary.BigEndian.Uint16(data) - records := make([]Record, 0, recordNum) - - off := sliceLenSize - - // decode all records one by one - for i := uint16(0); i < recordNum; i++ { - record := WrapRecord(nil) - - // decode action - if len(data[off:]) < actionSize { - return nil, errors.Errorf("could not decode action of record #%d", i) - } - - record.SetAction(Action(binary.BigEndian.Uint32(data[off:]))) - off += actionSize - - // decode operation type - if len(data[off:]) < opTypeSize { - return nil, errors.Errorf("could not decode operation type of record #%d", i) - } - - record.SetOperationType(OperationType(binary.BigEndian.Uint32(data[off:]))) - off += opTypeSize - - // decode filter number - if len(data[off:]) < sliceLenSize { - return nil, errors.Errorf("could not decode filter number of record #%d", i) - } - - filterNum := binary.BigEndian.Uint16(data[off:]) - off += sliceLenSize - filters := make([]HeaderFilter, 0, filterNum) - - // decode filters one by one - for j := uint16(0); j < filterNum; j++ { - filter := WrapFilterInfo(nil) - - // decode header type - if len(data[off:]) < hdrTypeSize { - return nil, errors.Errorf("could not decode header type of filter #%d of record #%d", j, i) - } - - filter.SetHeaderType(HeaderType(binary.BigEndian.Uint32(data[off:])) ) - off += hdrTypeSize - - // decode match type - if len(data[off:]) < matchTypeSize { - return nil, errors.Errorf("could not decode match type of filter #%d of record #%d", j, i) - } - - filter.SetMatchType(MatchType(binary.BigEndian.Uint32(data[off:])) ) - off += matchTypeSize - - // decode header name size - if len(data[off:]) < sliceLenSize { - return nil, errors.Errorf("could not decode header name size of filter #%d of record #%d", j, i) - } - - hdrNameSize := int(binary.BigEndian.Uint16(data[off:])) - off += sliceLenSize - - // decode header name - if len(data[off:]) < hdrNameSize { - return nil, errors.Errorf("could not decode header name of filter #%d of record #%d", j, i) - } - - filter.SetName(string(data[off : off+hdrNameSize])) - - off += hdrNameSize - - // decode header value size - if len(data[off:]) < sliceLenSize { - return nil, errors.Errorf("could not decode header value size of filter #%d of record #%d", j, i) - } - - hdrValSize := int(binary.BigEndian.Uint16(data[off:])) - off += sliceLenSize - - // decode header value - if len(data[off:]) < hdrValSize { - return nil, errors.Errorf("could not decode header value of filter #%d of record #%d", j, i) - } - - filter.SetValue(string(data[off : off+hdrValSize])) - - off += hdrValSize - - filters = append(filters, filter) - } - - record.SetHeaderFilters(filters) - - // decode target number - if len(data[off:]) < sliceLenSize { - return nil, errors.Errorf("could not decode target number of record #%d", i) - } - - targetNum := int(binary.BigEndian.Uint16(data[off:])) - off += sliceLenSize - - targets := make([]Target, 0, targetNum) - - // decode targets one by one - for j := 0; j < targetNum; j++ { - target := WrapTarget(nil) - - // decode target group - if len(data[off:]) < targetSize { - return nil, errors.Errorf("could not decode target group of target #%d of record #%d", j, i) - } - - target.SetGroup( Group(binary.BigEndian.Uint32(data[off:])), ) - off += targetSize - - // decode key number - if len(data[off:]) < sliceLenSize { - return nil, errors.Errorf("could not decode key number of target #%d of record #%d", j, i) - } - - keyNum := int(binary.BigEndian.Uint16(data[off:])) - off += sliceLenSize - keys := make([][]byte, 0, keyNum) - - for k := 0; k < keyNum; k++ { - // decode key size - if len(data[off:]) < sliceLenSize { - return nil, errors.Errorf("could not decode size of key #%d target #%d of record #%d", k, j, i) - } - - keySz := int(binary.BigEndian.Uint16(data[off:])) - off += sliceLenSize - - // decode key - if len(data[off:]) < keySz { - return nil, errors.Errorf("could not decode key #%d target #%d of record #%d", k, j, i) - } - - key := make([]byte, keySz) - - off += copy(key, data[off:off+keySz]) - - keys = append(keys, key) - } - - target.SetKeyList(keys) - - targets = append(targets, target) - } - - record.SetTargetList(targets) - - records = append(records, record) - } - - table.SetRecords(records) - - return table, nil -} diff --git a/acl/extended/types.go b/acl/extended/types.go deleted file mode 100644 index 6b1b74b..0000000 --- a/acl/extended/types.go +++ /dev/null @@ -1,73 +0,0 @@ -package eacl - -// OperationType is an enumeration of operation types for extended ACL. -type OperationType uint32 - -// HeaderType is an enumeration of header types for extended ACL. -type HeaderType uint32 - -// MatchType is an enumeration of match types for extended ACL. -type MatchType uint32 - -// Action is an enumeration of extended ACL actions. -type Action uint32 - -// Group is an enumeration of access groups. -type Group uint32 - -// Header is an interface of string key-value pair, -type Header interface { - // Must return string identifier of header. - Name() string - - // Must return string value of header. - Value() string -} - -// TypedHeader is an interface of Header and HeaderType pair. -type TypedHeader interface { - Header - - // Must return type of filtered header. - HeaderType() HeaderType -} - -// HeaderFilter is an interface of grouped information about filtered header. -type HeaderFilter interface { - // Must return match type of filter. - MatchType() MatchType - - TypedHeader -} - -// Target is an interface of grouped information about extended ACL rule target. -type Target interface { - // Must return ACL target type. - Group() Group - - // Must return public key list of ACL targets. - KeyList() [][]byte -} - -// Record is an interface of record of extended ACL rule table. -type Record interface { - // Must return operation type of extended ACL rule. - OperationType() OperationType - - // Must return list of header filters of extended ACL rule. - HeaderFilters() []HeaderFilter - - // Must return target list of extended ACL rule. - TargetList() []Target - - // Must return action of extended ACL rule. - Action() Action -} - -// Table is an interface of extended ACL table. -type Table interface { - // Must return list of extended ACL rules. - Records() []Record -} - - diff --git a/acl/extended/wrappers.go b/acl/extended/wrappers.go deleted file mode 100644 index 2c8ff2e..0000000 --- a/acl/extended/wrappers.go +++ /dev/null @@ -1,528 +0,0 @@ -package eacl - -import ( - "github.com/nspcc-dev/neofs-api-go/acl" -) - -// FilterWrapper is a wrapper over acl.EACLRecord_FilterInfo pointer. -type FilterWrapper struct { - filter *acl.EACLRecord_FilterInfo -} - -// TargetWrapper is a wrapper over acl.EACLRecord_TargetInfo pointer. -type TargetWrapper struct { - target *acl.EACLRecord_TargetInfo -} - -// RecordWrapper is a wrapper over acl.EACLRecord pointer. -type RecordWrapper struct { - record *acl.EACLRecord -} - -// TableWrapper is a wrapper over acl.EACLTable pointer. -type TableWrapper struct { - table *acl.EACLTable -} - -// WrapFilterInfo wraps EACLRecord_FilterInfo pointer. -// -// If argument is nil, new EACLRecord_FilterInfo is initialized. -func WrapFilterInfo(v *acl.EACLRecord_FilterInfo) FilterWrapper { - if v == nil { - v = new(acl.EACLRecord_FilterInfo) - } - - return FilterWrapper{ - filter: v, - } -} - -// WrapTarget wraps EACLRecord_TargetInfo pointer. -// -// If argument is nil, new EACLRecord_TargetInfo is initialized. -func WrapTarget(v *acl.EACLRecord_TargetInfo) TargetWrapper { - if v == nil { - v = new(acl.EACLRecord_TargetInfo) - } - - return TargetWrapper{ - target: v, - } -} - -// WrapRecord wraps EACLRecord pointer. -// -// If argument is nil, new EACLRecord is initialized. -func WrapRecord(v *acl.EACLRecord) RecordWrapper { - if v == nil { - v = new(acl.EACLRecord) - } - - return RecordWrapper{ - record: v, - } -} - -// WrapTable wraps EACLTable pointer. -// -// If argument is nil, new EACLTable is initialized. -func WrapTable(v *acl.EACLTable) TableWrapper { - if v == nil { - v = new(acl.EACLTable) - } - - return TableWrapper{ - table: v, - } -} - -// MatchType returns the match type of the filter. -// -// If filter is not initialized, 0 returns. -// -// Returns 0 if MatchType is not one of: -// - EACLRecord_FilterInfo_StringEqual; -// - EACLRecord_FilterInfo_StringNotEqual. -func (s FilterWrapper) MatchType() (res MatchType) { - if s.filter != nil { - switch s.filter.GetMatchType() { - case acl.EACLRecord_FilterInfo_StringEqual: - res = StringEqual - case acl.EACLRecord_FilterInfo_StringNotEqual: - res = StringNotEqual - } - } - - return -} - -// SetMatchType sets the match type of the filter. -// -// If filter is not initialized, nothing changes. -// -// MatchType is set to EACLRecord_FilterInfo_MatchUnknown if argument is not one of: -// - StringEqual; -// - StringNotEqual. -func (s FilterWrapper) SetMatchType(v MatchType) { - if s.filter != nil { - switch v { - case StringEqual: - s.filter.SetMatchType(acl.EACLRecord_FilterInfo_StringEqual) - case StringNotEqual: - s.filter.SetMatchType(acl.EACLRecord_FilterInfo_StringNotEqual) - default: - s.filter.SetMatchType(acl.EACLRecord_FilterInfo_MatchUnknown) - } - } -} - -// Name returns the name of filtering header. -// -// If filter is not initialized, empty string returns. -func (s FilterWrapper) Name() string { - if s.filter == nil { - return "" - } - - return s.filter.GetHeaderName() -} - -// SetName sets the name of the filtering header. -// -// If filter is not initialized, nothing changes. -func (s FilterWrapper) SetName(v string) { - if s.filter != nil { - s.filter.SetHeaderName(v) - } -} - -// Value returns the value of filtering header. -// -// If filter is not initialized, empty string returns. -func (s FilterWrapper) Value() string { - if s.filter == nil { - return "" - } - - return s.filter.GetHeaderVal() -} - -// SetValue sets the value of filtering header. -// -// If filter is not initialized, nothing changes. -func (s FilterWrapper) SetValue(v string) { - if s.filter != nil { - s.filter.SetHeaderVal(v) - } -} - -// HeaderType returns the header type of the filter. -// -// If filter is not initialized, HdrTypeUnknown returns. -// -// Returns HdrTypeUnknown if Header is not one of: -// - EACLRecord_FilterInfo_Request; -// - EACLRecord_FilterInfo_ObjectSystem; -// - EACLRecord_FilterInfo_ObjectUser. -func (s FilterWrapper) HeaderType() (res HeaderType) { - res = HdrTypeUnknown - - if s.filter != nil { - switch s.filter.GetHeader() { - case acl.EACLRecord_FilterInfo_Request: - res = HdrTypeRequest - case acl.EACLRecord_FilterInfo_ObjectSystem: - res = HdrTypeObjSys - case acl.EACLRecord_FilterInfo_ObjectUser: - res = HdrTypeObjUsr - } - } - - return -} - -// SetHeaderType sets the header type of the filter. -// -// If filter is not initialized, nothing changes. -// -// Header is set to EACLRecord_FilterInfo_HeaderUnknown if argument is not one of: -// - HdrTypeRequest; -// - HdrTypeObjSys; -// - HdrTypeObjUsr. -func (s FilterWrapper) SetHeaderType(t HeaderType) { - if s.filter != nil { - switch t { - case HdrTypeRequest: - s.filter.SetHeader(acl.EACLRecord_FilterInfo_Request) - case HdrTypeObjSys: - s.filter.SetHeader(acl.EACLRecord_FilterInfo_ObjectSystem) - case HdrTypeObjUsr: - s.filter.SetHeader(acl.EACLRecord_FilterInfo_ObjectUser) - default: - s.filter.SetHeader(acl.EACLRecord_FilterInfo_HeaderUnknown) - } - } -} - -// Group returns the access group of the target. -// -// If target is not initialized, GroupUnknown returns. -// -// Returns GroupUnknown if Target is not one of: -// - Target_User; -// - GroupSystem; -// - GroupOthers. -func (s TargetWrapper) Group() (res Group) { - res = GroupUnknown - - if s.target != nil { - switch s.target.GetTarget() { - case acl.Target_User: - res = GroupUser - case acl.Target_System: - res = GroupSystem - case acl.Target_Others: - res = GroupOthers - } - } - - return -} - -// SetGroup sets the access group of the target. -// -// If target is not initialized, nothing changes. -// -// Target is set to Target_Unknown if argument is not one of: -// - GroupUser; -// - GroupSystem; -// - GroupOthers. -func (s TargetWrapper) SetGroup(g Group) { - if s.target != nil { - switch g { - case GroupUser: - s.target.SetTarget(acl.Target_User) - case GroupSystem: - s.target.SetTarget(acl.Target_System) - case GroupOthers: - s.target.SetTarget(acl.Target_Others) - default: - s.target.SetTarget(acl.Target_Unknown) - } - } -} - -// KeyList returns the key list of the target. -// -// If target is not initialized, nil returns. -func (s TargetWrapper) KeyList() [][]byte { - if s.target == nil { - return nil - } - - return s.target.GetKeyList() -} - -// SetKeyList sets the key list of the target. -// -// If target is not initialized, nothing changes. -func (s TargetWrapper) SetKeyList(v [][]byte) { - if s.target != nil { - s.target.SetKeyList(v) - } -} - -// OperationType returns the operation type of the record. -// -// If record is not initialized, OpTypeUnknown returns. -// -// Returns OpTypeUnknown if Operation is not one of: -// - EACLRecord_HEAD; -// - EACLRecord_PUT; -// - EACLRecord_SEARCH; -// - EACLRecord_GET; -// - EACLRecord_GETRANGE; -// - EACLRecord_GETRANGEHASH; -// - EACLRecord_DELETE. -func (s RecordWrapper) OperationType() (res OperationType) { - res = OpTypeUnknown - - if s.record != nil { - switch s.record.GetOperation() { - case acl.EACLRecord_HEAD: - res = OpTypeHead - case acl.EACLRecord_PUT: - res = OpTypePut - case acl.EACLRecord_SEARCH: - res = OpTypeSearch - case acl.EACLRecord_GET: - res = OpTypeGet - case acl.EACLRecord_GETRANGE: - res = OpTypeRange - case acl.EACLRecord_GETRANGEHASH: - res = OpTypeRangeHash - case acl.EACLRecord_DELETE: - res = OpTypeDelete - } - } - - return -} - -// SetOperationType sets the operation type of the record. -// -// If record is not initialized, nothing changes. -// -// Operation is set to EACLRecord_OPERATION_UNKNOWN if argument is not one of: -// - OpTypeHead; -// - OpTypePut; -// - OpTypeSearch; -// - OpTypeGet; -// - OpTypeRange; -// - OpTypeRangeHash; -// - OpTypeDelete. -func (s RecordWrapper) SetOperationType(v OperationType) { - if s.record != nil { - switch v { - case OpTypeHead: - s.record.SetOperation(acl.EACLRecord_HEAD) - case OpTypePut: - s.record.SetOperation(acl.EACLRecord_PUT) - case OpTypeSearch: - s.record.SetOperation(acl.EACLRecord_SEARCH) - case OpTypeGet: - s.record.SetOperation(acl.EACLRecord_GET) - case OpTypeRange: - s.record.SetOperation(acl.EACLRecord_GETRANGE) - case OpTypeRangeHash: - s.record.SetOperation(acl.EACLRecord_GETRANGEHASH) - case OpTypeDelete: - s.record.SetOperation(acl.EACLRecord_DELETE) - default: - s.record.SetOperation(acl.EACLRecord_OPERATION_UNKNOWN) - } - } -} - -// Action returns the action of the record. -// -// If record is not initialized, ActionUnknown returns. -// -// Returns ActionUnknown if Action is not one of: -// - EACLRecord_Deny; -// - EACLRecord_Allow. -func (s RecordWrapper) Action() (res Action) { - res = ActionUnknown - - if s.record != nil { - switch s.record.GetAction() { - case acl.EACLRecord_Deny: - res = ActionDeny - case acl.EACLRecord_Allow: - res = ActionAllow - } - } - - return -} - -// SetAction sets the action of the record. -// -// If record is not initialized, nothing changes. -// -// Action is set to EACLRecord_ActionUnknown if argument is not one of: -// - ActionDeny; -// - ActionAllow. -func (s RecordWrapper) SetAction(v Action) { - if s.record != nil { - switch v { - case ActionDeny: - s.record.SetAction(acl.EACLRecord_Deny) - case ActionAllow: - s.record.SetAction(acl.EACLRecord_Allow) - default: - s.record.SetAction(acl.EACLRecord_ActionUnknown) - } - } -} - -// HeaderFilters returns the header filter list of the record. -// -// If record is not initialized, nil returns. -func (s RecordWrapper) HeaderFilters() []HeaderFilter { - if s.record == nil { - return nil - } - - filters := s.record.GetFilters() - - res := make([]HeaderFilter, 0, len(filters)) - - for i := range filters { - res = append(res, WrapFilterInfo(filters[i])) - } - - return res -} - -// SetHeaderFilters sets the header filter list of the record. -// -// Ignores nil elements of argument. -// If record is not initialized, nothing changes. -func (s RecordWrapper) SetHeaderFilters(v []HeaderFilter) { - if s.record == nil { - return - } - - filters := make([]*acl.EACLRecord_FilterInfo, 0, len(v)) - - for i := range v { - if v[i] == nil { - continue - } - - w := WrapFilterInfo(nil) - w.SetMatchType(v[i].MatchType()) - w.SetHeaderType(v[i].HeaderType()) - w.SetName(v[i].Name()) - w.SetValue(v[i].Value()) - - filters = append(filters, w.filter) - } - - s.record.SetFilters(filters) -} - -// TargetList returns the target list of the record. -// -// If record is not initialized, nil returns. -func (s RecordWrapper) TargetList() []Target { - if s.record == nil { - return nil - } - - targets := s.record.GetTargets() - - res := make([]Target, 0, len(targets)) - - for i := range targets { - res = append(res, WrapTarget(targets[i])) - } - - return res -} - -// SetTargetList sets the target list of the record. -// -// Ignores nil elements of argument. -// If record is not initialized, nothing changes. -func (s RecordWrapper) SetTargetList(v []Target) { - if s.record == nil { - return - } - - targets := make([]*acl.EACLRecord_TargetInfo, 0, len(v)) - - for i := range v { - if v[i] == nil { - continue - } - - w := WrapTarget(nil) - w.SetGroup(v[i].Group()) - w.SetKeyList(v[i].KeyList()) - - targets = append(targets, w.target) - } - - s.record.SetTargets(targets) -} - -// Records returns the record list of the table. -// -// If table is not initialized, nil returns. -func (s TableWrapper) Records() []Record { - if s.table == nil { - return nil - } - - records := s.table.GetRecords() - - res := make([]Record, 0, len(records)) - - for i := range records { - res = append(res, WrapRecord(records[i])) - } - - return res -} - -// SetRecords sets the record list of the table. -// -// Ignores nil elements of argument. -// If table is not initialized, nothing changes. -func (s TableWrapper) SetRecords(v []Record) { - if s.table == nil { - return - } - - records := make([]*acl.EACLRecord, 0, len(v)) - - for i := range v { - if v[i] == nil { - continue - } - - w := WrapRecord(nil) - w.SetOperationType(v[i].OperationType()) - w.SetAction(v[i].Action()) - w.SetHeaderFilters(v[i].HeaderFilters()) - w.SetTargetList(v[i].TargetList()) - - records = append(records, w.record) - } - - s.table.SetRecords(records) -} - - diff --git a/acl/extended/wrappers_test.go b/acl/extended/wrappers_test.go deleted file mode 100644 index b139e59..0000000 --- a/acl/extended/wrappers_test.go +++ /dev/null @@ -1,136 +0,0 @@ -package eacl - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestEACLFilterWrapper(t *testing.T) { - s := WrapFilterInfo(nil) - - mt := StringEqual - s.SetMatchType(mt) - require.Equal(t, mt, s.MatchType()) - - ht := HdrTypeObjUsr - s.SetHeaderType(ht) - require.Equal(t, ht, s.HeaderType()) - - n := "name" - s.SetName(n) - require.Equal(t, n, s.Name()) - - v := "value" - s.SetValue(v) - require.Equal(t, v, s.Value()) -} - -func TestEACLTargetWrapper(t *testing.T) { - s := WrapTarget(nil) - - group := Group(3) - s.SetGroup(group) - require.Equal(t, group, s.Group()) - - keys := [][]byte{ - {1, 2, 3}, - {4, 5, 6}, - } - s.SetKeyList(keys) - require.Equal(t, keys, s.KeyList()) -} - -func TestEACLRecordWrapper(t *testing.T) { - s := WrapRecord(nil) - - action := ActionAllow - s.SetAction(action) - require.Equal(t, action, s.Action()) - - opType := OperationType(5) - s.SetOperationType(opType) - require.Equal(t, opType, s.OperationType()) - - f1Name := "name1" - f1 := WrapFilterInfo(nil) - f1.SetName(f1Name) - - f2Name := "name2" - f2 := WrapFilterInfo(nil) - f2.SetName(f2Name) - - s.SetHeaderFilters([]HeaderFilter{f1, f2}) - - filters := s.HeaderFilters() - require.Len(t, filters, 2) - require.Equal(t, f1Name, filters[0].Name()) - require.Equal(t, f2Name, filters[1].Name()) - - group1 := Group(1) - t1 := WrapTarget(nil) - t1.SetGroup(group1) - - group2 := Group(2) - t2 := WrapTarget(nil) - t2.SetGroup(group2) - - s.SetTargetList([]Target{t1, t2}) - - targets := s.TargetList() - require.Len(t, targets, 2) - require.Equal(t, group1, targets[0].Group()) - require.Equal(t, group2, targets[1].Group()) -} - -func TestEACLTableWrapper(t *testing.T) { - s := WrapTable(nil) - - action1 := Action(1) - r1 := WrapRecord(nil) - r1.SetAction(action1) - - action2 := Action(2) - r2 := WrapRecord(nil) - r2.SetAction(action2) - - s.SetRecords([]Record{r1, r2}) - - records := s.Records() - require.Len(t, records, 2) - require.Equal(t, action1, records[0].Action()) - require.Equal(t, action2, records[1].Action()) - - s2, err := UnmarshalTable(MarshalTable(s)) - require.NoError(t, err) - - records1 := s.Records() - records2 := s2.Records() - require.Len(t, records1, len(records2)) - - for i := range records1 { - require.Equal(t, records1[i].Action(), records2[i].Action()) - require.Equal(t, records1[i].OperationType(), records2[i].OperationType()) - - targets1 := records1[i].TargetList() - targets2 := records2[i].TargetList() - require.Len(t, targets1, len(targets2)) - - for j := range targets1 { - require.Equal(t, targets1[j].Group(), targets2[j].Group()) - require.Equal(t, targets1[j].KeyList(), targets2[j].KeyList()) - } - - filters1 := records1[i].HeaderFilters() - filters2 := records2[i].HeaderFilters() - require.Len(t, filters1, len(filters2)) - - for j := range filters1 { - require.Equal(t, filters1[j].MatchType(), filters2[j].MatchType()) - require.Equal(t, filters1[j].HeaderType(), filters2[j].HeaderType()) - require.Equal(t, filters1[j].Name(), filters2[j].Name()) - require.Equal(t, filters1[j].Value(), filters2[j].Value()) - require.Equal(t, filters1[j].Value(), filters2[j].Value()) - } - } -} diff --git a/acl/types.go b/acl/types.go deleted file mode 100644 index 4aaf8fb..0000000 --- a/acl/types.go +++ /dev/null @@ -1,57 +0,0 @@ -package acl - - -// SetMatchType is MatchType field setter. -func (m *EACLRecord_FilterInfo) SetMatchType(v EACLRecord_FilterInfo_MatchType) { - m.MatchType = v -} - -// SetHeader is a Header field setter. -func (m *EACLRecord_FilterInfo) SetHeader(v EACLRecord_FilterInfo_Header) { - m.Header = v -} - -// SetHeaderName is a HeaderName field setter. -func (m *EACLRecord_FilterInfo) SetHeaderName(v string) { - m.HeaderName = v -} - -// SetHeaderVal is a HeaderVal field setter. -func (m *EACLRecord_FilterInfo) SetHeaderVal(v string) { - m.HeaderVal = v -} - -// SetTarget is a Target field setter. -func (m *EACLRecord_TargetInfo) SetTarget(v Target) { - m.Target = v -} - -// SetKeyList is a KeyList field setter. -func (m *EACLRecord_TargetInfo) SetKeyList(v [][]byte) { - m.KeyList = v -} - -// SetOperation is an Operation field setter. -func (m *EACLRecord) SetOperation(v EACLRecord_Operation) { - m.Operation = v -} - -// SetAction is an Action field setter. -func (m *EACLRecord) SetAction(v EACLRecord_Action) { - m.Action = v -} - -// SetFilters is a Filters field setter. -func (m *EACLRecord) SetFilters(v []*EACLRecord_FilterInfo) { - m.Filters = v -} - -// SetTargets is a Targets field setter. -func (m *EACLRecord) SetTargets(v []*EACLRecord_TargetInfo) { - m.Targets = v -} - -// SetRecords is a Records field setter. -func (m *EACLTable) SetRecords(v []*EACLRecord) { - m.Records = v -} diff --git a/acl/types.pb.go b/acl/types.pb.go deleted file mode 100644 index 24ecf2814a556e10d7cb3b1a23647c4150bebd37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37624 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 e>c;kXhEb`sV>y*Y@{|UiS&%n&`v(ck0$N&94 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

Ya0S5Uv7^r9OnVA(Cq^#0vH zgKGNa^rXo#|7@1oSb#P<=|3q)R&e-hm;rw0DQ5#9wcE?f<>0TFe@;(-L!56`p#Fn* z*=-Qrm}$OX#q<9I@0&pR4RP;&v8TA_CQ^QNsoO>IOz{ENhVQC+s(kf(;aUi?Tq@p? z1QgG6D4G_cS6HHbWDS+rS&z+xuA?dmjYs8Ha?6LMUj zYbD*bs^}MbknYz**kEfr%#LLeD)eGd)z*vWc9f0V5RCCgT;l*m% zrD+vIbzNP783>VpN_BmIE9kPARO|r80=0Lp7pIjQWMs zqa(PH6g>p)*@SAUf$^1w_keE782xlH-F4s>N}3f=^IFT~%CA<>OQYBEpQWU=zV{^s zIqy=3AJ(QK$Z~-8`W)p_9LP6p1bwZmil(okwKbOPKdY=-8EHwB*{0D(ZsfYYJ|hco z^$^8n@6QAe(z}2fKcC;i(*K?j*BYw--9c49Oi|J+ 0 -} - -// SetFull changes state of node to indicate if node has enough space for storing users objects. -// If value is true - there's not enough space. -func (n *NodeStatus) SetFull(value bool) { - switch value { - case true: - *n |= NodeStatus(storageFullMask) - case false: - *n &= NodeStatus(^uint64(storageFullMask)) - } -} - -// Price returns price in 1e-8*GAS/Megabyte per month. -// User set price in GAS/Terabyte per month. -func (m NodeInfo) Price() uint64 { - for i := range m.Options { - if strings.HasPrefix(m.Options[i], optionPrice) { - n, err := strconv.ParseFloat(m.Options[i][len(optionPrice):], 64) - if err != nil { - return 0 - } - return uint64(n*1e8) / uint64(object.UnitsMB) // UnitsMB == megabytes in 1 terabyte - } - } - return 0 -} - -// Capacity returns node's capacity as reported by user. -func (m NodeInfo) Capacity() uint64 { - for i := range m.Options { - if strings.HasPrefix(m.Options[i], optionCapacity) { - n, err := strconv.ParseUint(m.Options[i][len(optionCapacity):], 10, 64) - if err != nil { - return 0 - } - return n - } - } - return 0 -} - -// String returns string representation of NodeInfo. -func (m NodeInfo) String() string { - return "(NodeInfo)<" + - "Address:" + m.Address + - ", " + - "PublicKey:" + hex.EncodeToString(m.PubKey) + - ", " + - "Options: [" + strings.Join(m.Options, ",") + "]>" -} - -// String returns string representation of SpreadMap. -func (m SpreadMap) String() string { - result := make([]string, 0, len(m.NetMap)) - for i := range m.NetMap { - result = append(result, m.NetMap[i].String()) - } - return "(SpreadMap)<" + - "Epoch: " + strconv.FormatUint(m.Epoch, 10) + - ", " + - "Netmap: [" + strings.Join(result, ",") + "]>" -} - -// GetType is a Type field getter. -func (m Request) GetType() NodeType { - return m.Type -} - -// SetType is a Type field setter. -func (m *Request) SetType(t NodeType) { - m.Type = t -} - -// SetState is a State field setter. -func (m *Request) SetState(state Request_State) { - m.State = state -} - -// SetInfo is an Info field getter. -func (m *Request) SetInfo(info NodeInfo) { - m.Info = info -} - -// Size returns the size necessary for a binary representation of the state. -func (x Request_State) Size() int { - return 4 -} - -// Bytes returns a binary representation of the state. -func (x Request_State) Bytes() []byte { - data := make([]byte, x.Size()) - - requestEndianness.PutUint32(data, uint32(x)) - - return data -} diff --git a/bootstrap/types.pb.go b/bootstrap/types.pb.go deleted file mode 100644 index fcd8848b9620a2680c7a1e76f7046e4422e51907..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17631 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 M#E+2t`C+&HKePlqxBvhE diff --git a/bootstrap/types.proto b/bootstrap/types.proto deleted file mode 100644 index 4ef0fff..0000000 --- a/bootstrap/types.proto +++ /dev/null @@ -1,29 +0,0 @@ -syntax = "proto3"; -package bootstrap; -option go_package = "github.com/nspcc-dev/neofs-api-go/bootstrap"; -option csharp_namespace = "NeoFS.API.Bootstrap"; - -import "github.com/gogo/protobuf/gogoproto/gogo.proto"; - -option (gogoproto.stable_marshaler_all) = true; - -option (gogoproto.stringer_all) = false; -option (gogoproto.goproto_stringer_all) = false; - -message SpreadMap { - // Epoch is current epoch for netmap - uint64 Epoch = 1; - // NetMap is a set of NodeInfos - repeated NodeInfo NetMap = 2 [(gogoproto.nullable) = false]; -} - -message NodeInfo { - // Address is a node [multi-address](https://github.com/multiformats/multiaddr) - string Address = 1 [(gogoproto.jsontag) = "address"]; - // PubKey is a compressed public key representation in bytes - bytes PubKey = 2 [(gogoproto.jsontag) = "pubkey,omitempty"]; - // Options is set of node optional information, such as storage capacity, node location, price and etc - repeated string Options = 3 [(gogoproto.jsontag) = "options,omitempty"]; - // Status is bitmap status of the node - uint64 Status = 4 [(gogoproto.jsontag) = "status", (gogoproto.nullable) = false, (gogoproto.customtype) = "NodeStatus"]; -} diff --git a/bootstrap/types_test.go b/bootstrap/types_test.go deleted file mode 100644 index 20b1b1a..0000000 --- a/bootstrap/types_test.go +++ /dev/null @@ -1,39 +0,0 @@ -package bootstrap - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestRequestGettersSetters(t *testing.T) { - t.Run("type", func(t *testing.T) { - rt := NodeType(1) - m := new(Request) - - m.SetType(rt) - - require.Equal(t, rt, m.GetType()) - }) - - t.Run("state", func(t *testing.T) { - st := Request_State(1) - m := new(Request) - - m.SetState(st) - - require.Equal(t, st, m.GetState()) - }) - - t.Run("info", func(t *testing.T) { - info := NodeInfo{ - Address: "some address", - } - - m := new(Request) - - m.SetInfo(info) - - require.Equal(t, info, m.GetInfo()) - }) -} diff --git a/chain/address.go b/chain/address.go deleted file mode 100644 index 0a56b8e..0000000 --- a/chain/address.go +++ /dev/null @@ -1,30 +0,0 @@ -package chain - -import ( - "crypto/ecdsa" - - "github.com/nspcc-dev/neo-go/pkg/crypto/keys" -) - -// WalletAddress implements NEO address. -type WalletAddress [AddressLength]byte - -const ( - // AddressLength contains size of address, - // 1 byte of address version + 20 bytes of ScriptHash + 4 bytes of checksum. - AddressLength = 25 -) - -// KeyToAddress returns NEO address composed from public key. -func KeyToAddress(key *ecdsa.PublicKey) string { - if key == nil { - return "" - } - - neoPublicKey := keys.PublicKey{ - X: key.X, - Y: key.Y, - } - - return neoPublicKey.Address() -} diff --git a/chain/address_test.go b/chain/address_test.go deleted file mode 100644 index a998a11..0000000 --- a/chain/address_test.go +++ /dev/null @@ -1,41 +0,0 @@ -package chain - -import ( - "encoding/hex" - "testing" - - crypto "github.com/nspcc-dev/neofs-crypto" - "github.com/stretchr/testify/require" -) - -type addressTestCase struct { - name string - publicKey string - wallet string -} - -func TestKeyToAddress(t *testing.T) { - tests := []addressTestCase{ - { - "nil key", - "", - "", - }, - { - "correct key", - "031a6c6fbbdf02ca351745fa86b9ba5a9452d785ac4f7fc2b7548ca2a46c4fcf4a", - "NgzuJWWGVEwFGsRrgzj8knswEYRJrTe7sm", - }, - } - - for i := range tests { - t.Run(tests[i].name, func(t *testing.T) { - data, err := hex.DecodeString(tests[i].publicKey) - require.NoError(t, err) - - key := crypto.UnmarshalPublicKey(data) - - require.Equal(t, tests[i].wallet, KeyToAddress(key)) - }) - } -} diff --git a/container/service.go b/container/service.go deleted file mode 100644 index 2f36dc1..0000000 --- a/container/service.go +++ /dev/null @@ -1,60 +0,0 @@ -package container - -import ( - "bytes" - "encoding/binary" - - "github.com/nspcc-dev/neofs-api-go/internal" - "github.com/nspcc-dev/neofs-api-go/refs" - "github.com/pkg/errors" -) - -type ( - // CID type alias. - CID = refs.CID - // UUID type alias. - UUID = refs.UUID - // OwnerID type alias. - OwnerID = refs.OwnerID - // MessageID type alias. - MessageID = refs.MessageID -) - -const ( - // ErrNotFound is raised when container could not be found. - ErrNotFound = internal.Error("could not find container") -) - -// PrepareData prepares bytes representation of PutRequest to satisfy SignedRequest interface. -func (m *PutRequest) PrepareData() ([]byte, error) { - var ( - err error - buf = new(bytes.Buffer) - capBytes = make([]byte, 8) - aclBytes = make([]byte, 4) - ) - - binary.BigEndian.PutUint64(capBytes, m.Capacity) - binary.BigEndian.PutUint32(capBytes, m.BasicACL) - - if _, err = buf.Write(m.MessageID.Bytes()); err != nil { - return nil, errors.Wrap(err, "could not write message id") - } else if _, err = buf.Write(capBytes); err != nil { - return nil, errors.Wrap(err, "could not write capacity") - } else if _, err = buf.Write(m.OwnerID.Bytes()); err != nil { - return nil, errors.Wrap(err, "could not write pub") - } else if data, err := m.Rules.Marshal(); err != nil { - return nil, errors.Wrap(err, "could not marshal placement") - } else if _, err = buf.Write(data); err != nil { - return nil, errors.Wrap(err, "could not write placement") - } else if _, err = buf.Write(aclBytes); err != nil { - return nil, errors.Wrap(err, "could not write basic acl") - } - - return buf.Bytes(), nil -} - -// PrepareData prepares bytes representation of DeleteRequest to satisfy SignedRequest interface. -func (m *DeleteRequest) PrepareData() ([]byte, error) { - return m.CID.Bytes(), nil -} diff --git a/container/service.pb.go b/container/service.pb.go deleted file mode 100644 index f49f79fe3cf389e9a31cf20aa425ee4e7ded81e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97427 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 LbI}2S+uHnpE~*8w diff --git a/container/service.proto b/container/service.proto deleted file mode 100644 index b174052..0000000 --- a/container/service.proto +++ /dev/null @@ -1,146 +0,0 @@ -syntax = "proto3"; -package container; -option go_package = "github.com/nspcc-dev/neofs-api-go/container"; -option csharp_namespace = "NeoFS.API.Container"; - -import "service/meta.proto"; -import "service/verify.proto"; -import "container/types.proto"; -import "github.com/nspcc-dev/netmap/selector.proto"; -import "github.com/gogo/protobuf/gogoproto/gogo.proto"; - -option (gogoproto.stable_marshaler_all) = true; - -// Container service provides API for manipulating with the container. -service Service { - // Put request proposes container to the inner ring nodes. They will - // accept new container if user has enough deposit. All containers - // are accepted by the consensus, therefore it is asynchronous process. - rpc Put(PutRequest) returns (PutResponse); - - // Delete container removes it from the inner ring container storage. It - // also asynchronous process done by consensus. - rpc Delete(DeleteRequest) returns (DeleteResponse); - - // Get container returns container instance - rpc Get(GetRequest) returns (GetResponse); - - // List returns all user's containers - rpc List(ListRequest) returns (ListResponse); - - // SetExtendedACL changes extended ACL rules of the container - rpc SetExtendedACL(SetExtendedACLRequest) returns (SetExtendedACLResponse); - - // GetExtendedACL returns extended ACL rules of the container - rpc GetExtendedACL(GetExtendedACLRequest) returns (GetExtendedACLResponse); -} - -message PutRequest { - // MessageID is a nonce for uniq container id calculation - bytes MessageID = 1 [(gogoproto.customtype) = "MessageID", (gogoproto.nullable) = false]; - - // Capacity defines amount of data that can be stored in the container (doesn't used for now). - uint64 Capacity = 2; - - // OwnerID is a wallet address - bytes OwnerID = 3 [(gogoproto.customtype) = "OwnerID", (gogoproto.nullable) = false]; - - // Rules define storage policy for the object inside the container. - netmap.PlacementRule rules = 4 [(gogoproto.nullable) = false]; - - // BasicACL of the container. - uint32 BasicACL = 5; - - // RequestMetaHeader contains information about request meta headers (should be embedded into message) - service.RequestMetaHeader Meta = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; - // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message) - service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} - -message PutResponse { - // CID (container id) is a SHA256 hash of the container structure - bytes CID = 1 [(gogoproto.customtype) = "CID", (gogoproto.nullable) = false]; -} - -message DeleteRequest { - // CID (container id) is a SHA256 hash of the container structure - bytes CID = 1 [(gogoproto.customtype) = "CID", (gogoproto.nullable) = false]; - - // RequestMetaHeader contains information about request meta headers (should be embedded into message) - service.RequestMetaHeader Meta = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; - // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message) - service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} - -// DeleteResponse is empty because delete operation is asynchronous and done -// via consensus in inner ring nodes -message DeleteResponse { } - - -message GetRequest { - // CID (container id) is a SHA256 hash of the container structure - bytes CID = 1 [(gogoproto.customtype) = "CID", (gogoproto.nullable) = false]; - - // RequestMetaHeader contains information about request meta headers (should be embedded into message) - service.RequestMetaHeader Meta = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; - // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message) - service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} - -message GetResponse { - // Container is a structure that contains placement rules and owner id - container.Container Container = 1; -} - -message ListRequest { - // OwnerID is a wallet address - bytes OwnerID = 1 [(gogoproto.customtype) = "OwnerID", (gogoproto.nullable) = false]; - // RequestMetaHeader contains information about request meta headers (should be embedded into message) - service.RequestMetaHeader Meta = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; - // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message) - service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} - -message ListResponse { - // CID (container id) is list of SHA256 hashes of the container structures - repeated bytes CID = 1 [(gogoproto.customtype) = "CID", (gogoproto.nullable) = false]; -} - -message ExtendedACLKey { - // ID (container id) is a SHA256 hash of the container structure - bytes ID = 1 [(gogoproto.customtype) = "CID", (gogoproto.nullable) = false]; -} - -message ExtendedACLValue { - // EACL carries binary representation of the table of extended ACL rules - bytes EACL = 1; - // Signature carries EACL field signature - bytes Signature = 2; -} - -message SetExtendedACLRequest { - // Key carries key to extended ACL information - ExtendedACLKey Key = 1 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; - // Value carries extended ACL information - ExtendedACLValue Value = 2 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; - // RequestMetaHeader contains information about request meta headers (should be embedded into message) - service.RequestMetaHeader Meta = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; - // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message) - service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} - -message SetExtendedACLResponse {} - -message GetExtendedACLRequest { - // Key carries key to extended ACL information - ExtendedACLKey Key = 1 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; - // RequestMetaHeader contains information about request meta headers (should be embedded into message) - service.RequestMetaHeader Meta = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; - // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message) - service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} - -message GetExtendedACLResponse { - // ACL carries extended ACL information - ExtendedACLValue ACL = 1 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} diff --git a/container/sign.go b/container/sign.go deleted file mode 100644 index f538f2d..0000000 --- a/container/sign.go +++ /dev/null @@ -1,194 +0,0 @@ -package container - -import ( - "encoding/binary" - "io" - - service "github.com/nspcc-dev/neofs-api-go/service" -) - -var requestEndianness = binary.BigEndian - -// SignedData returns payload bytes of the request. -func (m PutRequest) SignedData() ([]byte, error) { - return service.SignedDataFromReader(m) -} - -// SignedDataSize returns payload size of the request. -func (m PutRequest) SignedDataSize() (sz int) { - sz += m.GetMessageID().Size() - - sz += 8 - - sz += m.GetOwnerID().Size() - - rules := m.GetRules() - sz += rules.Size() - - sz += 4 - - return -} - -// ReadSignedData copies payload bytes to passed buffer. -// -// If the Request size is insufficient, io.ErrUnexpectedEOF returns. -func (m PutRequest) ReadSignedData(p []byte) (int, error) { - if len(p) < m.SignedDataSize() { - return 0, io.ErrUnexpectedEOF - } - - var off int - - off += copy(p[off:], m.GetMessageID().Bytes()) - - requestEndianness.PutUint64(p[off:], m.GetCapacity()) - off += 8 - - off += copy(p[off:], m.GetOwnerID().Bytes()) - - rules := m.GetRules() - // FIXME: implement and use stable functions - n, err := rules.MarshalTo(p[off:]) - off += n - if err != nil { - return off, err - } - - requestEndianness.PutUint32(p[off:], m.GetBasicACL()) - off += 4 - - return off, nil -} - -// SignedData returns payload bytes of the request. -func (m DeleteRequest) SignedData() ([]byte, error) { - return service.SignedDataFromReader(m) -} - -// SignedDataSize returns payload size of the request. -func (m DeleteRequest) SignedDataSize() int { - return m.GetCID().Size() -} - -// ReadSignedData copies payload bytes to passed buffer. -// -// If the Request size is insufficient, io.ErrUnexpectedEOF returns. -func (m DeleteRequest) ReadSignedData(p []byte) (int, error) { - if len(p) < m.SignedDataSize() { - return 0, io.ErrUnexpectedEOF - } - - var off int - - off += copy(p[off:], m.GetCID().Bytes()) - - return off, nil -} - -// SignedData returns payload bytes of the request. -func (m GetRequest) SignedData() ([]byte, error) { - return service.SignedDataFromReader(m) -} - -// SignedDataSize returns payload size of the request. -func (m GetRequest) SignedDataSize() int { - return m.GetCID().Size() -} - -// ReadSignedData copies payload bytes to passed buffer. -// -// If the Request size is insufficient, io.ErrUnexpectedEOF returns. -func (m GetRequest) ReadSignedData(p []byte) (int, error) { - if len(p) < m.SignedDataSize() { - return 0, io.ErrUnexpectedEOF - } - - var off int - - off += copy(p[off:], m.GetCID().Bytes()) - - return off, nil -} - -// SignedData returns payload bytes of the request. -func (m ListRequest) SignedData() ([]byte, error) { - return service.SignedDataFromReader(m) -} - -// SignedDataSize returns payload size of the request. -func (m ListRequest) SignedDataSize() int { - return m.GetOwnerID().Size() -} - -// ReadSignedData copies payload bytes to passed buffer. -// -// If the Request size is insufficient, io.ErrUnexpectedEOF returns. -func (m ListRequest) ReadSignedData(p []byte) (int, error) { - if len(p) < m.SignedDataSize() { - return 0, io.ErrUnexpectedEOF - } - - var off int - - off += copy(p[off:], m.GetOwnerID().Bytes()) - - return off, nil -} - -// SignedData returns payload bytes of the request. -func (m GetExtendedACLRequest) SignedData() ([]byte, error) { - return service.SignedDataFromReader(m) -} - -// SignedDataSize returns payload size of the request. -func (m GetExtendedACLRequest) SignedDataSize() int { - return m.GetID().Size() -} - -// ReadSignedData copies payload bytes to passed buffer. -// -// If the Request size is insufficient, io.ErrUnexpectedEOF returns. -func (m GetExtendedACLRequest) ReadSignedData(p []byte) (int, error) { - if len(p) < m.SignedDataSize() { - return 0, io.ErrUnexpectedEOF - } - - var off int - - off += copy(p[off:], m.GetID().Bytes()) - - return off, nil -} - -// SignedData returns payload bytes of the request. -func (m SetExtendedACLRequest) SignedData() ([]byte, error) { - return service.SignedDataFromReader(m) -} - -// SignedDataSize returns payload size of the request. -func (m SetExtendedACLRequest) SignedDataSize() int { - return 0 + - m.GetID().Size() + - len(m.GetEACL()) + - len(m.GetSignature()) -} - -// ReadSignedData copies payload bytes to passed buffer. -// -// If the Request size is insufficient, io.ErrUnexpectedEOF returns. -func (m SetExtendedACLRequest) ReadSignedData(p []byte) (int, error) { - if len(p) < m.SignedDataSize() { - return 0, io.ErrUnexpectedEOF - } - - var off int - - off += copy(p[off:], m.GetID().Bytes()) - - off += copy(p[off:], m.GetEACL()) - - off += copy(p[off:], m.GetSignature()) - - return off, nil -} diff --git a/container/sign_test.go b/container/sign_test.go deleted file mode 100644 index d04a698..0000000 --- a/container/sign_test.go +++ /dev/null @@ -1,187 +0,0 @@ -package container - -import ( - "testing" - - "github.com/nspcc-dev/neofs-api-go/service" - "github.com/nspcc-dev/neofs-crypto/test" - "github.com/stretchr/testify/require" -) - -func TestRequestSign(t *testing.T) { - sk := test.DecodeKey(0) - - type sigType interface { - service.RequestData - service.SignKeyPairAccumulator - service.SignKeyPairSource - SetToken(*service.Token) - } - - items := []struct { - constructor func() sigType - payloadCorrupt []func(sigType) - }{ - { // PutRequest - constructor: func() sigType { - return new(PutRequest) - }, - payloadCorrupt: []func(sigType){ - func(s sigType) { - req := s.(*PutRequest) - - id := req.GetMessageID() - id[0]++ - - req.SetMessageID(id) - }, - func(s sigType) { - req := s.(*PutRequest) - - req.SetCapacity(req.GetCapacity() + 1) - }, - func(s sigType) { - req := s.(*PutRequest) - - owner := req.GetOwnerID() - owner[0]++ - - req.SetOwnerID(owner) - }, - func(s sigType) { - req := s.(*PutRequest) - - rules := req.GetRules() - rules.ReplFactor++ - - req.SetRules(rules) - }, - func(s sigType) { - req := s.(*PutRequest) - - req.SetBasicACL(req.GetBasicACL() + 1) - }, - }, - }, - { // DeleteRequest - constructor: func() sigType { - return new(DeleteRequest) - }, - payloadCorrupt: []func(sigType){ - func(s sigType) { - req := s.(*DeleteRequest) - - cid := req.GetCID() - cid[0]++ - - req.SetCID(cid) - }, - }, - }, - { // GetRequest - constructor: func() sigType { - return new(GetRequest) - }, - payloadCorrupt: []func(sigType){ - func(s sigType) { - req := s.(*GetRequest) - - cid := req.GetCID() - cid[0]++ - - req.SetCID(cid) - }, - }, - }, - { // ListRequest - constructor: func() sigType { - return new(ListRequest) - }, - payloadCorrupt: []func(sigType){ - func(s sigType) { - req := s.(*ListRequest) - - owner := req.GetOwnerID() - owner[0]++ - - req.SetOwnerID(owner) - }, - }, - }, - { // GetExtendedACLRequest - constructor: func() sigType { - return new(GetExtendedACLRequest) - }, - payloadCorrupt: []func(sigType){ - func(s sigType) { - req := s.(*GetExtendedACLRequest) - - id := req.GetID() - id[0]++ - - req.SetID(id) - }, - }, - }, - { // SetExtendedACLRequest - constructor: func() sigType { - return new(SetExtendedACLRequest) - }, - payloadCorrupt: []func(sigType){ - func(s sigType) { - req := s.(*SetExtendedACLRequest) - - id := req.GetID() - id[0]++ - - req.SetID(id) - }, - func(s sigType) { - req := s.(*SetExtendedACLRequest) - - req.SetEACL( - append(req.GetEACL(), 1), - ) - }, - func(s sigType) { - req := s.(*SetExtendedACLRequest) - - req.SetSignature( - append(req.GetSignature(), 1), - ) - }, - }, - }, - } - - for _, item := range items { - { // token corruptions - v := item.constructor() - - token := new(service.Token) - v.SetToken(token) - - require.NoError(t, service.SignRequestData(sk, v)) - - require.NoError(t, service.VerifyRequestData(v)) - - token.SetSessionKey(append(token.GetSessionKey(), 1)) - - require.Error(t, service.VerifyRequestData(v)) - } - - { // payload corruptions - for _, corruption := range item.payloadCorrupt { - v := item.constructor() - - require.NoError(t, service.SignRequestData(sk, v)) - - require.NoError(t, service.VerifyRequestData(v)) - - corruption(v) - - require.Error(t, service.VerifyRequestData(v)) - } - } - } -} diff --git a/container/types.go b/container/types.go deleted file mode 100644 index be06b53..0000000 --- a/container/types.go +++ /dev/null @@ -1,188 +0,0 @@ -package container - -import ( - "bytes" - - "github.com/gogo/protobuf/proto" - "github.com/google/uuid" - "github.com/nspcc-dev/neofs-api-go/internal" - "github.com/nspcc-dev/neofs-api-go/refs" - "github.com/nspcc-dev/neofs-crypto/test" - "github.com/nspcc-dev/netmap" - "github.com/pkg/errors" -) - -var ( - _ internal.Custom = (*Container)(nil) - - emptySalt = (UUID{}).Bytes() - emptyOwner = (OwnerID{}).Bytes() -) - -// New creates new user container based on capacity, OwnerID, ACL and PlacementRules. -func New(cap uint64, owner OwnerID, acl uint32, rules netmap.PlacementRule) (*Container, error) { - if bytes.Equal(owner[:], emptyOwner) { - return nil, refs.ErrEmptyOwner - } else if cap == 0 { - return nil, refs.ErrEmptyCapacity - } - - salt, err := uuid.NewRandom() - if err != nil { - return nil, errors.Wrap(err, "could not create salt") - } - - return &Container{ - OwnerID: owner, - Salt: UUID(salt), - Capacity: cap, - Rules: rules, - BasicACL: acl, - }, nil -} - -// Bytes returns bytes representation of Container. -func (m *Container) Bytes() []byte { - data, err := m.Marshal() - if err != nil { - return nil - } - - return data -} - -// ID returns generated ContainerID based on Container (data). -func (m *Container) ID() (CID, error) { - if m.Empty() { - return CID{}, refs.ErrEmptyContainer - } - data, err := m.Marshal() - if err != nil { - return CID{}, err - } - - return refs.CIDForBytes(data), nil -} - -// Merge used by proto.Clone -func (m *Container) Merge(src proto.Message) { - if tmp, ok := src.(*Container); ok { - *m = *tmp - } -} - -// Empty checks that container is empty. -func (m *Container) Empty() bool { - return m.Capacity == 0 || bytes.Equal(m.Salt.Bytes(), emptySalt) || bytes.Equal(m.OwnerID.Bytes(), emptyOwner) -} - -// -- Test container definition -- // - -// NewTestContainer returns test container. -// WARNING: DON'T USE THIS OUTSIDE TESTS. -func NewTestContainer() (*Container, error) { - key := test.DecodeKey(0) - owner, err := refs.NewOwnerID(&key.PublicKey) - if err != nil { - return nil, err - } - return New(100, owner, 0xFFFFFFFF, netmap.PlacementRule{ - ReplFactor: 2, - SFGroups: []netmap.SFGroup{ - { - Selectors: []netmap.Select{ - {Key: "Country", Count: 1}, - {Key: netmap.NodesBucket, Count: 2}, - }, - Filters: []netmap.Filter{ - {Key: "Country", F: netmap.FilterIn("USA")}, - }, - }, - }, - }) -} - -// GetMessageID is a MessageID field getter. -func (m PutRequest) GetMessageID() MessageID { - return m.MessageID -} - -// SetMessageID is a MessageID field getter. -func (m *PutRequest) SetMessageID(id MessageID) { - m.MessageID = id -} - -// SetCapacity is a Capacity field setter. -func (m *PutRequest) SetCapacity(c uint64) { - m.Capacity = c -} - -// GetOwnerID is an OwnerID field getter. -func (m PutRequest) GetOwnerID() OwnerID { - return m.OwnerID -} - -// SetOwnerID is an OwnerID field setter. -func (m *PutRequest) SetOwnerID(owner OwnerID) { - m.OwnerID = owner -} - -// SetRules is a Rules field setter. -func (m *PutRequest) SetRules(rules netmap.PlacementRule) { - m.Rules = rules -} - -// SetBasicACL is a BasicACL field setter. -func (m *PutRequest) SetBasicACL(acl uint32) { - m.BasicACL = acl -} - -// GetCID is a CID field getter. -func (m DeleteRequest) GetCID() CID { - return m.CID -} - -// SetCID is a CID field setter. -func (m *DeleteRequest) SetCID(cid CID) { - m.CID = cid -} - -// GetCID is a CID field getter. -func (m GetRequest) GetCID() CID { - return m.CID -} - -// SetCID is a CID field setter. -func (m *GetRequest) SetCID(cid CID) { - m.CID = cid -} - -// GetOwnerID is an OwnerID field getter. -func (m ListRequest) GetOwnerID() OwnerID { - return m.OwnerID -} - -// SetOwnerID is an OwnerID field setter. -func (m *ListRequest) SetOwnerID(owner OwnerID) { - m.OwnerID = owner -} - -// GetID is an ID field getter. -func (m ExtendedACLKey) GetID() CID { - return m.ID -} - -// SetID is an ID field setter. -func (m *ExtendedACLKey) SetID(v CID) { - m.ID = v -} - -// SetEACL is an EACL field setter. -func (m *ExtendedACLValue) SetEACL(v []byte) { - m.EACL = v -} - -// SetSignature is a Signature field setter. -func (m *ExtendedACLValue) SetSignature(sig []byte) { - m.Signature = sig -} diff --git a/container/types.pb.go b/container/types.pb.go deleted file mode 100644 index 391656c8350df1f0d2c5f44517307336005e832a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13077 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 0 { - buf.WriteRune('.') - str = strconv.FormatInt(val, 10) - for i := len(str); i < int(m.Precision); i++ { - buf.WriteRune('0') - } - buf.WriteString(strings.TrimRight(str, "0")) - } - return buf.String() -} - -// Add returns d + m. -func (m Decimal) Add(d *Decimal) *Decimal { - precision := m.Precision - if precision < d.Precision { - precision = d.Precision - } - return &Decimal{ - Value: m.Value + d.Value, - Precision: precision, - } -} - -// Zero checks that Decimal is empty. -func (m Decimal) Zero() bool { return m.Value == 0 } - -// Equal checks that current Decimal is equal to passed Decimal. -func (m Decimal) Equal(v *Decimal) bool { return m.Value == v.Value && m.Precision == v.Precision } - -// GT checks that m > v. -func (m Decimal) GT(v *Decimal) bool { return m.Value > v.Value } - -// GTE checks that m >= v. -func (m Decimal) GTE(v *Decimal) bool { return m.Value >= v.Value } - -// LT checks that m < v. -func (m Decimal) LT(v *Decimal) bool { return m.Value < v.Value } - -// LTE checks that m <= v. -func (m Decimal) LTE(v *Decimal) bool { return m.Value <= v.Value } - -// Neg returns negative representation of current Decimal (m * -1). -func (m Decimal) Neg() *Decimal { - return &Decimal{ - Value: m.Value * -1, - Precision: m.Precision, - } -} diff --git a/decimal/decimal.pb.go b/decimal/decimal.pb.go deleted file mode 100644 index 9108e615837020ddb5a2f9e68d186200b07bfb52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8694 zcmds7>2KRc7XK{%6|(|TNR2G(vMj51f$kzpId}#jdGos@xUH`^iXuIt=QL@bPQgxhGn3SrGN84## zsrDi&uUB5*&yqu8bjbMLD&#Nz0383j0UNvNVhwE}qfE7<3@C|PUaK}e&Bv7&m4&Pv z(rer4I;6-SI@GyNeXT^qLY0{+R?B6si$du<&+w_{%v~r6= z=Vg?oB#};w6_}UTZixqg*X{~|L7HHZ@ZB=ImvJ6wL1GcFLV=V&; zu)gDGU{|x)YYMm55;Nz;Tb&nRK2}65)-IWOxyW4v>6Sulz-JPKV#A`$SAI#xBHySm z%T=z)n>sB;DTqq8ML4)gwn|H2(ezNNwT< zam|P2xZYOlzZJNRNBG{BVYHT^Lfw#Kz5Ym+ckkX^z0BUEH~K*bzd^{{jg=VX(--wY zbT}ZX338P})NGMPA7N|ydw=OYl$vDPfGhywyFMb){8{1akY5}pT&2G1BEtl>GDen^H958BlJsj(-JPUN zRjCN|P+Z}hBub;AjC|!~SzJ?wGnbX|U@q_d+;^89uY2jV(jJMR=4UFgrRpO4Cpqx% zs}RKyP)-XKkAVJmrqU=TlUSSJlkuI_m{o?i9{a<}w4hck-Ym-5gz?qLD%@9(b? zaTiKrc4d4E7{W<<3TV6SLXyLaa9z!FNne(C%JVELd^Zme=4p19Qj|EYU2<%|CL{}2 z@*N09#q$*IN!{3}N~$$Q_piF-iXb|mpgKWVUi(r3uJ=?5gscFKTgmEIt13dKIk z6?ijsL>Z+ZC~z_B|DhKMJDp#kbapyb?sX6Y-JWU(Qjz<{m2EZ|i)jfNBUw5xkZK)^ z_IR3T_r8{hT@(R!$X5~;i6FTSHBj6~gCS;}QWw;`T($TZEtjZbB+5GLxtKVu!Tm7o zslolsqvv48PgDTB?|P1CH)Jf$??Zl00$QJ(@RQ$t-6ICRUt8k$U`Q*oV|oUReC*Qu z;D{ml88V?!?R~onGo7k(^Cjdr%Xs>;rA)OpD>9dffUC44nl-mqfot* z1|DyW`FX@9l6RMhj+y;HRA%W0VpCujf`mBa4noW<{L?hwMk`CD{0y^RK5u0ns zPk{^=(qqy-vp*5Tihd%H)t)pkmSr@NRP*~toXm1fnDK<)XS^#xF=jnn(L*#~uZ)?2 zH)ajSvcaHZj*W@L6-y*hF=Gvm#Q6frEG6nh%cbGR3;bS?JM3!jzFiUeZkTgh7W)NHa4b>etu|cvo~f;UE?Ril2n# z$g4S7w#BjH#(Lt6IEn&h=8G9QF?~rcUI94-YaJKS#fiqU2kd8dRT#sJ~o z=xTf-C`=At9WMy?{hXjLzjx3O)b*^<(D{r;7g=2)sE7H0)yi`2V%sX2nQzBT^hoH& zmRm6<8`)8c?Ib;CTZV{i8tarLg(>I+896OFOvW_N$Vx2ZK!0o6uFYnVIuJ_978vNZ z=zzvd-bZuHX^lXb=4k5ZS91W(9|LOmtq5}Agp5mqw|u}cO`R$BRMg|~Vmj&6kh{b- zIyk_SEf-ya272g#rweApqs)K9gb{ZznANA3%Czc$q?GYgLS~mbRRUyTh(iZ?p{H(* zg4K{|HevH3yS3K1g~}eCRpC?tz+DFppSSAgGc`OtJ!V_7HDsGiLW9|?bNd6DYN$SQ z(ICqK2S~?w6VRtmS+8bfAeh)C_Kg!Sg(Rl84i1;*gu@f&+17L~{@D?M8y-v5Qz)jM z){Q{=a3oYt+7nlM2~=@Np0-5x&?7u^MQTn_Gk_f&o(` zs}Q4%?$O?)`hKZ>TqHez^`b)aNFb>-q~;})qBqK&R*SXxEF#0U9%bB%E?J(%G>koU z$~njeX|=puyEm2t2^U5>4qmPj;sxEuqYl%Bo5qy3^g#zAvn`uHfZ{RjLa_<}na2mc zO11SJVW-U}thv47m@^h%QRy^Li#%H``Bp29QJXD;#e=- zSe5QVJqeTu&Mcn<-8P-SMDHHUV%ZhAWAv}9O*WcO6>vC*K#%mTddWV8@A3?{l4~20 zC=_qZU9RFFi`^$FBx205m^uuteQSs|$EY>e&L9<@jbUnWcf_f|Y>LzthrEPp%j$!0 z<+N*zRuW(%T-Wg`oG4=1AEUp*A60?g;gf3r|HvE<*=bGD)I*DsB#RKq$!*y<`&snVG;XZjpR{H+^D z0ovT6ylyDW9jVM{`79ag=bu63=kKZW+ua@U<>KNd4H`N>E=lRM!D7!P$3*nYe!nkv zW4ohq$vO-LJ7K`DCAbmKn5i+jfn&#u^(81#toy6F0hSqK^OUu(T?cxJpL2G#?!Tr@ z2-;YZc-ZdLz-_dXiNdB5DBgM0tUG2z^16z<==V2l+bo(pvT0xy5RE}xFbABH ze@-LWXGY1%TBxl@9ve@)EoqV0Lk(SVhtW>iL66W!f_4Cbc3wjz`5 2 GAS", - expect: true, - values: [2]*Decimal{ - {Value: 5e8, Precision: GASPrecision}, - {Value: 2e8, Precision: GASPrecision}, - }, - }, - { - name: "100 GAS !> 100 GAS", - expect: false, - values: [2]*Decimal{ - {Value: 1e10, Precision: GASPrecision}, - {Value: 1e10, Precision: GASPrecision}, - }, - }, - } - for i := range tests { - tt := tests[i] - t.Run(tt.name, func(t *testing.T) { - require.NotPanicsf(t, func() { - require.Truef(t, tt.expect == (tt.values[0].GT(tt.values[1])), tt.name) - }, tt.name) - }) - } -} - -func TestDecimal_GTE(t *testing.T) { - tests := []struct { - name string - expect bool - values [2]*Decimal - }{ - {name: "two zeros", expect: true, values: [2]*Decimal{Zero, Zero}}, - { - name: "5 GAS >= 2 GAS", - expect: true, - values: [2]*Decimal{ - {Value: 5e8, Precision: GASPrecision}, - {Value: 2e8, Precision: GASPrecision}, - }, - }, - { - name: "1 GAS !>= 100 GAS", - expect: false, - values: [2]*Decimal{ - {Value: 1e8, Precision: GASPrecision}, - {Value: 1e10, Precision: GASPrecision}, - }, - }, - } - for i := range tests { - tt := tests[i] - t.Run(tt.name, func(t *testing.T) { - require.NotPanicsf(t, func() { - require.Truef(t, tt.expect == (tt.values[0].GTE(tt.values[1])), tt.name) - }, tt.name) - }) - } -} - -func TestDecimal_LT(t *testing.T) { - tests := []struct { - name string - expect bool - values [2]*Decimal - }{ - {name: "two zeros", expect: false, values: [2]*Decimal{Zero, Zero}}, - { - name: "5 GAS !< 2 GAS", - expect: false, - values: [2]*Decimal{ - {Value: 5e8, Precision: GASPrecision}, - {Value: 2e8, Precision: GASPrecision}, - }, - }, - { - name: "1 GAS < 100 GAS", - expect: true, - values: [2]*Decimal{ - {Value: 1e8, Precision: GASPrecision}, - {Value: 1e10, Precision: GASPrecision}, - }, - }, - { - name: "100 GAS !< 100 GAS", - expect: false, - values: [2]*Decimal{ - {Value: 1e10, Precision: GASPrecision}, - {Value: 1e10, Precision: GASPrecision}, - }, - }, - } - for i := range tests { - tt := tests[i] - t.Run(tt.name, func(t *testing.T) { - require.NotPanicsf(t, func() { - require.Truef(t, tt.expect == (tt.values[0].LT(tt.values[1])), tt.name) - }, tt.name) - }) - } -} - -func TestDecimal_LTE(t *testing.T) { - tests := []struct { - name string - expect bool - values [2]*Decimal - }{ - {name: "two zeros", expect: true, values: [2]*Decimal{Zero, Zero}}, - { - name: "5 GAS <= 2 GAS", - expect: false, - values: [2]*Decimal{ - {Value: 5e8, Precision: GASPrecision}, - {Value: 2e8, Precision: GASPrecision}, - }, - }, - { - name: "1 GAS <= 100 GAS", - expect: true, - values: [2]*Decimal{ - {Value: 1e8, Precision: GASPrecision}, - {Value: 1e10, Precision: GASPrecision}, - }, - }, - { - name: "100 GAS !<= 1 GAS", - expect: false, - values: [2]*Decimal{ - {Value: 1e10, Precision: GASPrecision}, - {Value: 1e8, Precision: GASPrecision}, - }, - }, - } - for i := range tests { - tt := tests[i] - t.Run(tt.name, func(t *testing.T) { - require.NotPanicsf(t, func() { - require.Truef(t, tt.expect == (tt.values[0].LTE(tt.values[1])), tt.name) - }, tt.name) - }) - } -} diff --git a/hash/hash.go b/hash/hash.go deleted file mode 100644 index 4e2fb05..0000000 --- a/hash/hash.go +++ /dev/null @@ -1,106 +0,0 @@ -package hash - -import ( - "bytes" - - "github.com/gogo/protobuf/proto" - "github.com/mr-tron/base58" - "github.com/nspcc-dev/neofs-api-go/internal" - "github.com/nspcc-dev/tzhash/tz" - "github.com/pkg/errors" -) - -// HomomorphicHashSize contains size of HH. -const HomomorphicHashSize = 64 - -// Hash is implementation of HomomorphicHash. -type Hash [HomomorphicHashSize]byte - -// ErrWrongDataSize raised when wrong size of bytes is passed to unmarshal HH. -const ErrWrongDataSize = internal.Error("wrong data size") - -var ( - _ internal.Custom = (*Hash)(nil) - - emptyHH [HomomorphicHashSize]byte -) - -// Size returns size of Hash (HomomorphicHashSize). -func (h Hash) Size() int { return HomomorphicHashSize } - -// Empty checks that Hash is empty. -func (h Hash) Empty() bool { return bytes.Equal(h.Bytes(), emptyHH[:]) } - -// Reset sets current Hash to empty value. -func (h *Hash) Reset() { *h = Hash{} } - -// ProtoMessage method to satisfy proto.Message interface. -func (h Hash) ProtoMessage() {} - -// Bytes represents Hash as bytes. -func (h Hash) Bytes() []byte { - buf := make([]byte, HomomorphicHashSize) - copy(buf, h[:]) - return h[:] -} - -// Marshal returns bytes representation of Hash. -func (h Hash) Marshal() ([]byte, error) { return h.Bytes(), nil } - -// MarshalTo tries to marshal Hash into passed bytes and returns count of copied bytes. -func (h *Hash) MarshalTo(data []byte) (int, error) { return copy(data, h.Bytes()), nil } - -// Unmarshal tries to parse bytes into valid Hash. -func (h *Hash) Unmarshal(data []byte) error { - if ln := len(data); ln != HomomorphicHashSize { - return errors.Wrapf(ErrWrongDataSize, "expect=%d, actual=%d", HomomorphicHashSize, ln) - } - - copy((*h)[:], data) - return nil -} - -// String returns string representation of Hash. -func (h Hash) String() string { return base58.Encode(h[:]) } - -// Equal checks that current Hash is equal to passed Hash. -func (h Hash) Equal(hash Hash) bool { return h == hash } - -// Verify validates if current hash generated from passed data. -func (h Hash) Verify(data []byte) bool { return h.Equal(Sum(data)) } - -// Validate checks if combined hashes are equal to current Hash. -func (h Hash) Validate(hashes []Hash) bool { - hashBytes := make([][]byte, 0, len(hashes)) - for i := range hashes { - hashBytes = append(hashBytes, hashes[i].Bytes()) - } - ok, err := tz.Validate(h.Bytes(), hashBytes) - return err == nil && ok -} - -// Merge used by proto.Clone -func (h *Hash) Merge(src proto.Message) { - if tmp, ok := src.(*Hash); ok { - *h = *tmp - } -} - -// Sum returns Tillich-Zémor checksum of data. -func Sum(data []byte) Hash { return tz.Sum(data) } - -// Concat combines hashes based on homomorphic property. -func Concat(hashes []Hash) (Hash, error) { - var ( - hash Hash - h = make([][]byte, 0, len(hashes)) - ) - for i := range hashes { - h = append(h, hashes[i].Bytes()) - } - cat, err := tz.Concat(h) - if err != nil { - return hash, err - } - return hash, hash.Unmarshal(cat) -} diff --git a/hash/hash_test.go b/hash/hash_test.go deleted file mode 100644 index b3ef703..0000000 --- a/hash/hash_test.go +++ /dev/null @@ -1,166 +0,0 @@ -package hash - -import ( - "bytes" - "crypto/rand" - "testing" - - "github.com/pkg/errors" - "github.com/stretchr/testify/require" -) - -func Test_Sum(t *testing.T) { - var ( - data = []byte("Hello world") - sum = Sum(data) - hash = []byte{0, 0, 0, 0, 1, 79, 16, 173, 134, 90, 176, 77, 114, 165, 253, 114, 0, 0, 0, 0, 0, 148, - 172, 222, 98, 248, 15, 99, 205, 129, 66, 91, 0, 0, 0, 0, 0, 138, 173, 39, 228, 231, 239, 123, - 170, 96, 186, 61, 0, 0, 0, 0, 0, 90, 69, 237, 131, 90, 161, 73, 38, 164, 185, 55} - ) - - require.Equal(t, hash, sum.Bytes()) -} - -func Test_Validate(t *testing.T) { - var ( - data = []byte("Hello world") - hash = Sum(data) - pieces = splitData(data, 2) - ln = len(pieces) - hashes = make([]Hash, 0, ln) - ) - - for i := 0; i < ln; i++ { - hashes = append(hashes, Sum(pieces[i])) - } - - require.True(t, hash.Validate(hashes)) -} - -func Test_Concat(t *testing.T) { - var ( - data = []byte("Hello world") - hash = Sum(data) - pieces = splitData(data, 2) - ln = len(pieces) - hashes = make([]Hash, 0, ln) - ) - - for i := 0; i < ln; i++ { - hashes = append(hashes, Sum(pieces[i])) - } - - res, err := Concat(hashes) - require.NoError(t, err) - require.Equal(t, hash, res) -} - -func Test_HashChunks(t *testing.T) { - var ( - chars = []byte("+") - size = 1400 - data = bytes.Repeat(chars, size) - hash = Sum(data) - count = 150 - ) - - hashes, err := dataHashes(data, count) - require.NoError(t, err) - require.Len(t, hashes, count) - - require.True(t, hash.Validate(hashes)) - - // 100 / 150 = 0 - hashes, err = dataHashes(data[:100], count) - require.Error(t, err) - require.Nil(t, hashes) -} - -func TestXOR(t *testing.T) { - var ( - dl = 10 - data = make([]byte, dl) - ) - - _, err := rand.Read(data) - require.NoError(t, err) - - t.Run("XOR with salt", func(t *testing.T) { - res := SaltXOR(data, nil) - require.Equal(t, res, data) - }) - - t.Run("XOR with empty salt", func(t *testing.T) { - xorWithSalt(t, data, 0) - }) - - t.Run("XOR with salt same data size", func(t *testing.T) { - xorWithSalt(t, data, dl) - }) - - t.Run("XOR with salt shorter than data aliquot", func(t *testing.T) { - xorWithSalt(t, data, dl/2) - }) - - t.Run("XOR with salt shorter than data aliquant", func(t *testing.T) { - xorWithSalt(t, data, dl/3/+1) - }) - - t.Run("XOR with salt longer than data aliquot", func(t *testing.T) { - xorWithSalt(t, data, dl*2) - }) - - t.Run("XOR with salt longer than data aliquant", func(t *testing.T) { - xorWithSalt(t, data, dl*2-1) - }) -} - -func xorWithSalt(t *testing.T, data []byte, saltSize int) { - var ( - direct, reverse []byte - salt = make([]byte, saltSize) - ) - - _, err := rand.Read(salt) - require.NoError(t, err) - - direct = SaltXOR(data, salt) - require.Len(t, direct, len(data)) - - reverse = SaltXOR(direct, salt) - require.Len(t, reverse, len(data)) - - require.Equal(t, reverse, data) -} - -func splitData(buf []byte, lim int) [][]byte { - var piece []byte - pieces := make([][]byte, 0, len(buf)/lim+1) - for len(buf) >= lim { - piece, buf = buf[:lim], buf[lim:] - pieces = append(pieces, piece) - } - if len(buf) > 0 { - pieces = append(pieces, buf) - } - return pieces -} - -func dataHashes(data []byte, count int) ([]Hash, error) { - var ( - ln = len(data) - mis = ln / count - off = (count - 1) * mis - hashes = make([]Hash, 0, count) - ) - if mis == 0 { - return nil, errors.Errorf("could not split %d bytes to %d pieces", ln, count) - } - - pieces := splitData(data[:off], mis) - pieces = append(pieces, data[off:]) - for i := 0; i < count; i++ { - hashes = append(hashes, Sum(pieces[i])) - } - return hashes, nil -} diff --git a/hash/hashesslice.go b/hash/hashesslice.go deleted file mode 100644 index 83bf4c5..0000000 --- a/hash/hashesslice.go +++ /dev/null @@ -1,20 +0,0 @@ -package hash - -import ( - "bytes" -) - -// HashesSlice is a collection that satisfies sort.Interface and can be -// sorted by the routines in sort package. -type HashesSlice []Hash - -// -- HashesSlice -- an inner type to sort Objects -// Len is the number of elements in the collection. -func (hs HashesSlice) Len() int { return len(hs) } - -// Less reports whether the element with -// index i should be sorted before the element with index j. -func (hs HashesSlice) Less(i, j int) bool { return bytes.Compare(hs[i].Bytes(), hs[j].Bytes()) == -1 } - -// Swap swaps the elements with indexes i and j. -func (hs HashesSlice) Swap(i, j int) { hs[i], hs[j] = hs[j], hs[i] } diff --git a/hash/salt.go b/hash/salt.go deleted file mode 100644 index 5b6eeb0..0000000 --- a/hash/salt.go +++ /dev/null @@ -1,17 +0,0 @@ -package hash - -// SaltXOR xors bits of data with salt -// repeating salt if necessary. -func SaltXOR(data, salt []byte) (result []byte) { - result = make([]byte, len(data)) - ls := len(salt) - if ls == 0 { - copy(result, data) - return - } - - for i := range result { - result[i] = data[i] ^ salt[i%ls] - } - return -} diff --git a/internal/error.go b/internal/error.go deleted file mode 100644 index 7df1603..0000000 --- a/internal/error.go +++ /dev/null @@ -1,7 +0,0 @@ -package internal - -// Error is a custom error. -type Error string - -// Error is an implementation of error interface. -func (e Error) Error() string { return string(e) } diff --git a/internal/proto.go b/internal/proto.go deleted file mode 100644 index 9a924b5..0000000 --- a/internal/proto.go +++ /dev/null @@ -1,19 +0,0 @@ -package internal - -import "github.com/gogo/protobuf/proto" - -// Custom contains methods to satisfy proto.Message -// including custom methods to satisfy protobuf for -// non-proto defined types. -type Custom interface { - Size() int - Empty() bool - Bytes() []byte - Marshal() ([]byte, error) - MarshalTo(data []byte) (int, error) - Unmarshal(data []byte) error - proto.Message - - // Should contains for proto.Clone - proto.Merger -} diff --git a/object/doc.go b/object/doc.go deleted file mode 100644 index d81495b..0000000 --- a/object/doc.go +++ /dev/null @@ -1,143 +0,0 @@ -/* -Package object manages main storage structure in the system. All storage -operations are performed with the objects. During lifetime object might be -transformed into another object by cutting its payload or adding meta -information. All transformation may be reversed, therefore source object -will be able to restore. - -Object structure - -Object consists of Payload and Header. Payload is unlimited but storage nodes -may have a policy to store objects with a limited payload. In this case object -with large payload will be transformed into the chain of objects with small -payload. - -Headers are simple key-value fields that divided into two groups: system -headers and extended headers. System headers contain information about -protocol version, object id, payload length in bytes, owner id, container id -and object creation timestamp (both in epochs and unix time). All these fields -must be set up in the correct object. - - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - | System Headers | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - | Version : 1 | - | Payload Length : 21673465 | - | Object ID : 465208e2-ba4f-4f99-ad47-82a59f4192d4 | - | Owner ID : AShvoCbSZ7VfRiPkVb1tEcBLiJrcbts1tt | - | Container ID : FGobtRZA6sBZv2i9k4L7TiTtnuP6E788qa278xfj3Fxj | - | Created At : Epoch#10, 1573033162 | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - | Extended Headers | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - | User Header : , | - | Verification Header : , | - | Homomorphic Hash : 0x23d35a56ae... | - | Payload Checksum : 0x1bd34abs75... | - | Integrity Header :

, | - | Transformation : Payload Split | - | Link-parent : cae08935-b4ba-499a-bf6c-98276c1e6c0b | - | Link-next : c3b40fbf-3798-4b61-a189-2992b5fb5070 | - | Payload Checksum : 0x1f387a5c36... | - | Integrity Header :
, | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - | Payload | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - | 0xd1581963a342d231... | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - -There are different kinds of extended headers. A correct object must contain -verification header, homomorphic hash header, payload checksum and -integrity header. The order of headers is matter. Let's look through all -these headers. - -Link header points to the connected objects. During object transformation, large -object might be transformed into the chain of smaller objects. One of these -objects drops payload and has several "Child" links. We call this object as -zero-object. Others will have "Parent" link to the zero-object, "Previous" -and "Next" links in the payload chain. - - [ Object ID:1 ] = > transformed - `- [ Zero-Object ID:1 ] - `- Link-child ID:2 - `- Link-child ID:3 - `- Link-child ID:4 - `- Payload [null] - `- [ Object ID:2 ] - `- Link-parent ID:1 - `- Link-next ID:3 - `- Payload [ 0x13ba... ] - `- [ Object ID:3 ] - `- Link-parent ID:1 - `- Link-previous ID:2 - `- Link-next ID:4 - `- Payload [ 0xcd34... ] - `- [ Object ID:4 ] - `- Link-parent ID:1 - `- Link-previous ID:3 - `- Payload [ 0xef86... ] - -Storage groups are also objects. They have "Storage Group" links to all -objects in the group. Links are set by nodes during transformations and, -in general, they should not be set by user manually. - -Redirect headers are not used yet, they will be implemented and described -later. - -User header is a key-value pair of string that can be defined by user. User -can use these headers as search attribute. You can store any meta information -about object there, e.g. object's nicename. - -Transformation header notifies that object was transformed by some pre-defined -way. This header sets up before object is transformed and all headers after -transformation must be located after transformation header. During reverse -transformation, all headers under transformation header will be cut out. - - +-+-+-+-+-+-+-+-+-+- +-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+ - | Payload checksum | | Payload checksum | | Payload checksum | - | Integrity header | => | Integrity header | + | Integrity header | - +-+-+-+-+-+-+-+-+-+- | Transformation | | Transformation | - | Large payload | | New Checksum | | New Checksum | - +-+-+-+-+-+-+-+-+-+- | New Integrity | | New Integrity | - +-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+ - | Small payload | | Small payload | - +-+-+-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+-+-+ - -For now, we use only one type of transformation: payload split transformation. -This header set up by node automatically. - -Tombstone header notifies that this object was deleted by user. Objects with -tombstone header do not have payload, but they still contain meta information -in the headers. This way we implement two-phase commit for object removal. -Storage nodes will eventually delete all tombstone objects. If you want to -delete object, you must create new object with the same object id, with -tombstone header, correct signatures and without payload. - -Verification header contains session information. To put the object in -the system user must create session. It is required because objects might -be transformed and therefore must be re-signed. To do that node creates -a pair of session public and private keys. Object owner delegates permission to -re-sign objects by signing session public key. This header contains session -public key and owner's signature of this key. You must specify this header -manually. - -Homomorphic hash header contains homomorphic hash of the source object. -Transformations do not affect this header. This header used by data audit and -set by node automatically. - -Payload checksum contains checksum of the actual object payload. All payload -transformation must set new payload checksum headers. This header set by node -automatically. - -Integrity header contains checksum of the header and signature of the -session key. This header must be last in the list of extended headers. -Checksum is calculated by marshaling all above headers, including system -headers. This header set by node automatically. - -Storage group header is presented in storage group objects. It contains -information for data audit: size of validated data, homomorphic has of this -data, storage group expiration time in epochs or unix time. - - -*/ -package object diff --git a/object/extensions.go b/object/extensions.go deleted file mode 100644 index be755c6..0000000 --- a/object/extensions.go +++ /dev/null @@ -1,64 +0,0 @@ -package object - -// todo: all extensions must be transferred to the separate util library - -import "github.com/nspcc-dev/neofs-api-go/storagegroup" - -// IsLinking checks if object has children links to another objects. -// We have to check payload size because zero-object must have zero -// payload and non-zero payload length field in system header. -func (m Object) IsLinking() bool { - for i := range m.Headers { - switch v := m.Headers[i].Value.(type) { - case *Header_Link: - if v.Link.GetType() == Link_Child { - return m.SystemHeader.PayloadLength > 0 && len(m.Payload) == 0 - } - } - } - return false -} - -// Links returns slice of ids of specified link type -func (m *Object) Links(t Link_Type) []ID { - var res []ID - for i := range m.Headers { - switch v := m.Headers[i].Value.(type) { - case *Header_Link: - if v.Link.GetType() == t { - res = append(res, v.Link.ID) - } - } - } - return res -} - -// Tombstone returns tombstone header if it is presented in extended headers. -func (m Object) Tombstone() *Tombstone { - _, h := m.LastHeader(HeaderType(TombstoneHdr)) - if h != nil { - return h.Value.(*Header_Tombstone).Tombstone - } - return nil -} - -// IsTombstone checks if object has tombstone header. -func (m Object) IsTombstone() bool { - n, _ := m.LastHeader(HeaderType(TombstoneHdr)) - return n != -1 -} - -// StorageGroup returns storage group structure if it is presented in extended headers. -func (m Object) StorageGroup() (*storagegroup.StorageGroup, error) { - _, sgHdr := m.LastHeader(HeaderType(StorageGroupHdr)) - if sgHdr == nil { - return nil, ErrHeaderNotFound - } - return sgHdr.Value.(*Header_StorageGroup).StorageGroup, nil -} - -// SetStorageGroup sets storage group header in the object. -// It will replace existing storage group header or add a new one. -func (m *Object) SetStorageGroup(group *storagegroup.StorageGroup) { - m.SetHeader(&Header{Value: &Header_StorageGroup{StorageGroup: group}}) -} diff --git a/object/service.go b/object/service.go deleted file mode 100644 index 0e38d70..0000000 --- a/object/service.go +++ /dev/null @@ -1,196 +0,0 @@ -package object - -import ( - "github.com/nspcc-dev/neofs-api-go/hash" - "github.com/nspcc-dev/neofs-api-go/internal" - "github.com/nspcc-dev/neofs-api-go/refs" - "github.com/nspcc-dev/neofs-api-go/service" - "github.com/nspcc-dev/neofs-api-go/session" -) - -type ( - // ID is a type alias of object id. - ID = refs.ObjectID - - // CID is a type alias of container id. - CID = refs.CID - - // SGID is a type alias of storage group id. - SGID = refs.SGID - - // OwnerID is a type alias of owner id. - OwnerID = refs.OwnerID - - // Hash is a type alias of Homomorphic hash. - Hash = hash.Hash - - // Token is a type alias of session token. - Token = session.Token - - // Request defines object rpc requests. - // All object operations must have TTL, Epoch, Type, Container ID and - // permission of usage previous network map. - Request interface { - service.SeizedRequestMetaContainer - - CID() CID - Type() RequestType - AllowPreviousNetMap() bool - } -) - -const ( - // starts enum for amount of bytes. - _ int64 = 1 << (10 * iota) - - // UnitsKB defines amount of bytes in one kilobyte. - UnitsKB - - // UnitsMB defines amount of bytes in one megabyte. - UnitsMB - - // UnitsGB defines amount of bytes in one gigabyte. - UnitsGB - - // UnitsTB defines amount of bytes in one terabyte. - UnitsTB -) - -const ( - // ErrNotFound is raised when object is not found in the system. - ErrNotFound = internal.Error("could not find object") - - // ErrHeaderExpected is raised when first message in protobuf stream does not contain user header. - ErrHeaderExpected = internal.Error("expected header as a first message in stream") - - // KeyStorageGroup is a key for a search object by storage group id. - KeyStorageGroup = "STORAGE_GROUP" - - // KeyNoChildren is a key for searching object that have no children links. - KeyNoChildren = "LEAF" - - // KeyParent is a key for searching object by id of parent object. - KeyParent = "PARENT" - - // KeyHasParent is a key for searching object that have parent link. - KeyHasParent = "HAS_PAR" - - // KeyTombstone is a key for searching object that have tombstone header. - KeyTombstone = "TOMBSTONE" - - // KeyChild is a key for searching object by id of child link. - KeyChild = "CHILD" - - // KeyPrev is a key for searching object by id of previous link. - KeyPrev = "PREV" - - // KeyNext is a key for searching object by id of next link. - KeyNext = "NEXT" - - // KeyID is a key for searching object by object id. - KeyID = "ID" - - // KeyCID is a key for searching object by container id. - KeyCID = "CID" - - // KeyOwnerID is a key for searching object by owner id. - KeyOwnerID = "OWNERID" - - // KeyRootObject is a key for searching object that are zero-object or do - // not have any children. - KeyRootObject = "ROOT_OBJECT" -) - -func checkIsNotFull(v interface{}) bool { - var obj *Object - - switch t := v.(type) { - case *GetResponse: - obj = t.GetObject() - case *PutRequest: - if h := t.GetHeader(); h != nil { - obj = h.Object - } - default: - panic("unknown type") - } - - return obj == nil || obj.SystemHeader.PayloadLength != uint64(len(obj.Payload)) && !obj.IsLinking() -} - -// NotFull checks if protobuf stream provided whole object for get operation. -func (m *GetResponse) NotFull() bool { return checkIsNotFull(m) } - -// NotFull checks if protobuf stream provided whole object for put operation. -func (m *PutRequest) NotFull() bool { return checkIsNotFull(m) } - -// CID returns container id value from object put request. -func (m *PutRequest) CID() (cid CID) { - if header := m.GetHeader(); header == nil { - return - } else if obj := header.GetObject(); obj == nil { - return - } else { - return obj.SystemHeader.CID - } -} - -// CID returns container id value from object get request. -func (m *GetRequest) CID() CID { return m.Address.CID } - -// CID returns container id value from object head request. -func (m *HeadRequest) CID() CID { return m.Address.CID } - -// CID returns container id value from object search request. -func (m *SearchRequest) CID() CID { return m.ContainerID } - -// CID returns container id value from object delete request. -func (m *DeleteRequest) CID() CID { return m.Address.CID } - -// CID returns container id value from object get range request. -func (m *GetRangeRequest) CID() CID { return m.Address.CID } - -// CID returns container id value from object get range hash request. -func (m *GetRangeHashRequest) CID() CID { return m.Address.CID } - -// AllowPreviousNetMap returns permission to use previous network map in object put request. -func (m *PutRequest) AllowPreviousNetMap() bool { return false } - -// AllowPreviousNetMap returns permission to use previous network map in object get request. -func (m *GetRequest) AllowPreviousNetMap() bool { return true } - -// AllowPreviousNetMap returns permission to use previous network map in object head request. -func (m *HeadRequest) AllowPreviousNetMap() bool { return true } - -// AllowPreviousNetMap returns permission to use previous network map in object search request. -func (m *SearchRequest) AllowPreviousNetMap() bool { return true } - -// AllowPreviousNetMap returns permission to use previous network map in object delete request. -func (m *DeleteRequest) AllowPreviousNetMap() bool { return false } - -// AllowPreviousNetMap returns permission to use previous network map in object get range request. -func (m *GetRangeRequest) AllowPreviousNetMap() bool { return false } - -// AllowPreviousNetMap returns permission to use previous network map in object get range hash request. -func (m *GetRangeHashRequest) AllowPreviousNetMap() bool { return false } - -// Type returns type of the object put request. -func (m *PutRequest) Type() RequestType { return RequestPut } - -// Type returns type of the object get request. -func (m *GetRequest) Type() RequestType { return RequestGet } - -// Type returns type of the object head request. -func (m *HeadRequest) Type() RequestType { return RequestHead } - -// Type returns type of the object search request. -func (m *SearchRequest) Type() RequestType { return RequestSearch } - -// Type returns type of the object delete request. -func (m *DeleteRequest) Type() RequestType { return RequestDelete } - -// Type returns type of the object get range request. -func (m *GetRangeRequest) Type() RequestType { return RequestRange } - -// Type returns type of the object get range hash request. -func (m *GetRangeHashRequest) Type() RequestType { return RequestRangeHash } diff --git a/object/service.pb.go b/object/service.pb.go deleted file mode 100644 index f882f5e1cb399150b11220b6daf2ed9852ce990e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128417 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 O$2saF&6%3p-TwdAr)z8g diff --git a/object/service.proto b/object/service.proto deleted file mode 100644 index 91d0b99..0000000 --- a/object/service.proto +++ /dev/null @@ -1,197 +0,0 @@ -syntax = "proto3"; -package object; -option go_package = "github.com/nspcc-dev/neofs-api-go/object"; -option csharp_namespace = "NeoFS.API.Object"; - -import "refs/types.proto"; -import "object/types.proto"; -import "service/meta.proto"; -import "service/verify.proto"; -import "github.com/gogo/protobuf/gogoproto/gogo.proto"; - -option (gogoproto.stable_marshaler_all) = true; - -// Object service provides API for manipulating with the object. -service Service { - - // Get the object from container. Response uses gRPC stream. First response - // message carry object of requested address. Chunk messages are parts of - // the object's payload if it is needed. All messages except first carry - // chunks. Requested object can be restored by concatenation of object - // message payload and all chunks keeping receiving order. - rpc Get(GetRequest) returns (stream GetResponse); - - // Put the object into container. Request uses gRPC stream. First message - // SHOULD BE type of PutHeader. Container id and Owner id of object SHOULD - // BE set. Session token SHOULD BE obtained before put operation (see - // session package). Chunk messages considered by server as part of object - // payload. All messages except first SHOULD BE chunks. Chunk messages - // SHOULD BE sent in direct order of fragmentation. - rpc Put(stream PutRequest) returns (PutResponse); - - // Delete the object from a container - rpc Delete(DeleteRequest) returns (DeleteResponse); - - // Head returns the object without data payload. Object in the - // response has system header only. If full headers flag is set, extended - // headers are also present. - rpc Head(HeadRequest) returns (HeadResponse); - - // Search objects in container. Version of query language format SHOULD BE - // set to 1. Search query represented in serialized format (see query - // package). - rpc Search(SearchRequest) returns (stream SearchResponse); - - // GetRange of data payload. Range is a pair (offset, length). - // Requested range can be restored by concatenation of all chunks - // keeping receiving order. - rpc GetRange(GetRangeRequest) returns (stream GetRangeResponse); - - // GetRangeHash returns homomorphic hash of object payload range after XOR - // operation. Ranges are set of pairs (offset, length). Hashes order in - // response corresponds to ranges order in request. Homomorphic hash is - // calculated for XORed data. - rpc GetRangeHash(GetRangeHashRequest) returns (GetRangeHashResponse); -} - -message GetRequest { - // Address of object (container id + object id) - refs.Address Address = 1 [(gogoproto.nullable) = false]; - // RequestMetaHeader contains information about request meta headers (should be embedded into message) - service.RequestMetaHeader Meta = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; - // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message) - service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} - -message GetResponse { - oneof R { - // Object header and some payload - Object object = 1; - // Chunk of remaining payload - bytes Chunk = 2; - } - - // ResponseMetaHeader contains meta information based on request processing by server (should be embedded into message) - service.ResponseMetaHeader Meta = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} - -message PutRequest { - message PutHeader { - // Object with at least container id and owner id fields - Object Object = 1; - // Number of the object copies to store within the RPC call (zero is processed according to the placement rules) - uint32 CopiesNumber = 2; - } - - oneof R { - // Header should be the first message in the stream - PutHeader Header = 1; - // Chunk should be a remaining message in stream should be chunks - bytes Chunk = 2; - } - - // RequestMetaHeader contains information about request meta headers (should be embedded into message) - service.RequestMetaHeader Meta = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; - // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message) - service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} - -message PutResponse { - // Address of object (container id + object id) - refs.Address Address = 1 [(gogoproto.nullable) = false]; - // ResponseMetaHeader contains meta information based on request processing by server (should be embedded into message) - service.ResponseMetaHeader Meta = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} -message DeleteRequest { - // Address of object (container id + object id) - refs.Address Address = 1 [(gogoproto.nullable) = false]; - // OwnerID is a wallet address - bytes OwnerID = 2 [(gogoproto.nullable) = false, (gogoproto.customtype) = "OwnerID"]; - // RequestMetaHeader contains information about request meta headers (should be embedded into message) - service.RequestMetaHeader Meta = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; - // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message) - service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} - -// DeleteResponse is empty because we cannot guarantee permanent object removal -// in distributed system. -message DeleteResponse { - // ResponseMetaHeader contains meta information based on request processing by server (should be embedded into message) - service.ResponseMetaHeader Meta = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} - -message HeadRequest { - // Address of object (container id + object id) - refs.Address Address = 1 [(gogoproto.nullable) = false, (gogoproto.customtype) = "Address"]; - // FullHeaders can be set true for extended headers in the object - bool FullHeaders = 2; - // RequestMetaHeader contains information about request meta headers (should be embedded into message) - service.RequestMetaHeader Meta = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; - // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message) - service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} -message HeadResponse { - // Object without payload - Object Object = 1; - // ResponseMetaHeader contains meta information based on request processing by server (should be embedded into message) - service.ResponseMetaHeader Meta = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} - -message SearchRequest { - // ContainerID for searching the object - bytes ContainerID = 1 [(gogoproto.nullable) = false, (gogoproto.customtype) = "CID"]; - // Query in the binary serialized format - bytes Query = 2; - // QueryVersion is a version of search query format - uint32 QueryVersion = 3; - // RequestMetaHeader contains information about request meta headers (should be embedded into message) - service.RequestMetaHeader Meta = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; - // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message) - service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} - -message SearchResponse { - // Addresses of found objects - repeated refs.Address Addresses = 1 [(gogoproto.nullable) = false]; - // ResponseMetaHeader contains meta information based on request processing by server (should be embedded into message) - service.ResponseMetaHeader Meta = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} - -message GetRangeRequest { - // Address of object (container id + object id) - refs.Address Address = 1 [(gogoproto.nullable) = false]; - // Range of object's payload to return - Range Range = 2 [(gogoproto.nullable) = false]; - // RequestMetaHeader contains information about request meta headers (should be embedded into message) - service.RequestMetaHeader Meta = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; - // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message) - service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} - -message GetRangeResponse { - // Fragment of object's payload - bytes Fragment = 1; - // ResponseMetaHeader contains meta information based on request processing by server (should be embedded into message) - service.ResponseMetaHeader Meta = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} - -message GetRangeHashRequest { - // Address of object (container id + object id) - refs.Address Address = 1 [(gogoproto.nullable) = false]; - // Ranges of object's payload to calculate homomorphic hash - repeated Range Ranges = 2 [(gogoproto.nullable) = false]; - // Salt is used to XOR object's payload ranges before hashing, it can be nil - bytes Salt = 3; - // RequestMetaHeader contains information about request meta headers (should be embedded into message) - service.RequestMetaHeader Meta = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; - // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message) - service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} - -message GetRangeHashResponse { - // Hashes is a homomorphic hashes of all ranges - repeated bytes Hashes = 1 [(gogoproto.customtype) = "Hash", (gogoproto.nullable) = false]; - // ResponseMetaHeader contains meta information based on request processing by server (should be embedded into message) - service.ResponseMetaHeader Meta = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} - diff --git a/object/service_test.go b/object/service_test.go deleted file mode 100644 index 5b7a358..0000000 --- a/object/service_test.go +++ /dev/null @@ -1,43 +0,0 @@ -package object - -import ( - "fmt" - "testing" - - "github.com/stretchr/testify/require" -) - -func TestRequest(t *testing.T) { - cases := []Request{ - &PutRequest{}, - &GetRequest{}, - &HeadRequest{}, - &SearchRequest{}, - &DeleteRequest{}, - &GetRangeRequest{}, - &GetRangeHashRequest{}, - MakePutRequestHeader(nil), - MakePutRequestHeader(&Object{}), - } - - types := []RequestType{ - RequestPut, - RequestGet, - RequestHead, - RequestSearch, - RequestDelete, - RequestRange, - RequestRangeHash, - RequestPut, - RequestPut, - } - - for i := range cases { - v := cases[i] - - t.Run(fmt.Sprintf("%T_%d", v, i), func(t *testing.T) { - require.NotPanics(t, func() { v.CID() }) - require.Equal(t, types[i], v.Type()) - }) - } -} diff --git a/object/sg.go b/object/sg.go deleted file mode 100644 index a75b950..0000000 --- a/object/sg.go +++ /dev/null @@ -1,43 +0,0 @@ -package object - -import ( - "sort" - - "github.com/nspcc-dev/neofs-api-go/refs" - "github.com/nspcc-dev/neofs-api-go/storagegroup" -) - -// Here are defined getter functions for objects that contain storage group -// information. - -var _ storagegroup.Provider = (*Object)(nil) - -// Group returns slice of object ids that are part of a storage group. -func (m *Object) Group() []refs.ObjectID { - sgLinks := m.Links(Link_StorageGroup) - sort.Sort(storagegroup.IDList(sgLinks)) - return sgLinks -} - -// Zones returns validation zones of storage group. -func (m *Object) Zones() []storagegroup.ZoneInfo { - sgInfo, err := m.StorageGroup() - if err != nil { - return nil - } - return []storagegroup.ZoneInfo{ - { - Hash: sgInfo.ValidationHash, - Size: sgInfo.ValidationDataSize, - }, - } -} - -// IDInfo returns meta information about storage group. -func (m *Object) IDInfo() *storagegroup.IdentificationInfo { - return &storagegroup.IdentificationInfo{ - SGID: m.SystemHeader.ID, - CID: m.SystemHeader.CID, - OwnerID: m.SystemHeader.OwnerID, - } -} diff --git a/object/sg_test.go b/object/sg_test.go deleted file mode 100644 index 716e916..0000000 --- a/object/sg_test.go +++ /dev/null @@ -1,88 +0,0 @@ -package object - -import ( - "math/rand" - "sort" - "testing" - - "github.com/nspcc-dev/neofs-api-go/hash" - "github.com/nspcc-dev/neofs-api-go/storagegroup" - "github.com/stretchr/testify/require" -) - -func TestObject_StorageGroup(t *testing.T) { - t.Run("group method", func(t *testing.T) { - var linkCount byte = 100 - - obj := &Object{Headers: make([]Header, 0, linkCount)} - require.Empty(t, obj.Group()) - - idList := make([]ID, linkCount) - for i := byte(0); i < linkCount; i++ { - idList[i] = ID{i} - obj.Headers = append(obj.Headers, Header{ - Value: &Header_Link{Link: &Link{ - Type: Link_StorageGroup, - ID: idList[i], - }}, - }) - } - - rand.Shuffle(len(obj.Headers), func(i, j int) { obj.Headers[i], obj.Headers[j] = obj.Headers[j], obj.Headers[i] }) - sort.Sort(storagegroup.IDList(idList)) - require.Equal(t, idList, obj.Group()) - }) - t.Run("identification method", func(t *testing.T) { - oid, cid, owner := ID{1}, CID{2}, OwnerID{3} - obj := &Object{ - SystemHeader: SystemHeader{ - ID: oid, - OwnerID: owner, - CID: cid, - }, - } - - idInfo := obj.IDInfo() - require.Equal(t, oid, idInfo.SGID) - require.Equal(t, cid, idInfo.CID) - require.Equal(t, owner, idInfo.OwnerID) - }) - t.Run("zones method", func(t *testing.T) { - sgSize := uint64(100) - - d := make([]byte, sgSize) - _, err := rand.Read(d) - require.NoError(t, err) - sgHash := hash.Sum(d) - - obj := &Object{ - Headers: []Header{ - { - Value: &Header_StorageGroup{ - StorageGroup: &storagegroup.StorageGroup{ - ValidationDataSize: sgSize, - ValidationHash: sgHash, - }, - }, - }, - }, - } - - var ( - sumSize uint64 - zones = obj.Zones() - hashes = make([]Hash, len(zones)) - ) - - for i := range zones { - sumSize += zones[i].Size - hashes[i] = zones[i].Hash - } - - sumHash, err := hash.Concat(hashes) - require.NoError(t, err) - - require.Equal(t, sgSize, sumSize) - require.Equal(t, sgHash, sumHash) - }) -} diff --git a/object/sign.go b/object/sign.go deleted file mode 100644 index 3cdf94f..0000000 --- a/object/sign.go +++ /dev/null @@ -1,272 +0,0 @@ -package object - -import ( - "crypto/ecdsa" - "encoding/binary" - "io" - - "github.com/nspcc-dev/neofs-api-go/service" -) - -// SignedData returns payload bytes of the request. -// -// If payload is nil, ErrHeaderNotFound returns. -func (m PutRequest) SignedData() ([]byte, error) { - return service.SignedDataFromReader(m) -} - -// ReadSignedData copies payload bytes to passed buffer. -// -// If the buffer size is insufficient, io.ErrUnexpectedEOF returns. -func (m PutRequest) ReadSignedData(p []byte) (int, error) { - r := m.GetR() - if r == nil { - return 0, ErrHeaderNotFound - } - - return r.MarshalTo(p) -} - -// SignedDataSize returns the size of payload of the Put request. -// -// If payload is nil, -1 returns. -func (m PutRequest) SignedDataSize() int { - r := m.GetR() - if r == nil { - return -1 - } - - return r.Size() -} - -// SignedData returns payload bytes of the request. -func (m GetRequest) SignedData() ([]byte, error) { - return service.SignedDataFromReader(m) -} - -// ReadSignedData copies payload bytes to passed buffer. -// -// If the buffer size is insufficient, io.ErrUnexpectedEOF returns. -func (m GetRequest) ReadSignedData(p []byte) (int, error) { - addr := m.GetAddress() - - if len(p) < m.SignedDataSize() { - return 0, io.ErrUnexpectedEOF - } - - var off int - - off += copy(p[off:], addr.CID.Bytes()) - - off += copy(p[off:], addr.ObjectID.Bytes()) - - return off, nil -} - -// SignedDataSize returns payload size of the request. -func (m GetRequest) SignedDataSize() int { - return addressSize(m.GetAddress()) -} - -// SignedData returns payload bytes of the request. -func (m HeadRequest) SignedData() ([]byte, error) { - return service.SignedDataFromReader(m) -} - -// ReadSignedData copies payload bytes to passed buffer. -// -// If the buffer size is insufficient, io.ErrUnexpectedEOF returns. -func (m HeadRequest) ReadSignedData(p []byte) (int, error) { - if len(p) < m.SignedDataSize() { - return 0, io.ErrUnexpectedEOF - } - - if m.GetFullHeaders() { - p[0] = 1 - } else { - p[0] = 0 - } - - off := 1 - - off += copy(p[off:], m.Address.CID.Bytes()) - - off += copy(p[off:], m.Address.ObjectID.Bytes()) - - return off, nil -} - -// SignedDataSize returns payload size of the request. -func (m HeadRequest) SignedDataSize() int { - return addressSize(m.Address) + 1 -} - -// SignedData returns payload bytes of the request. -func (m DeleteRequest) SignedData() ([]byte, error) { - return service.SignedDataFromReader(m) -} - -// ReadSignedData copies payload bytes to passed buffer. -// -// If the buffer size is insufficient, io.ErrUnexpectedEOF returns. -func (m DeleteRequest) ReadSignedData(p []byte) (int, error) { - if len(p) < m.SignedDataSize() { - return 0, io.ErrUnexpectedEOF - } - - var off int - - off += copy(p[off:], m.OwnerID.Bytes()) - - off += copy(p[off:], addressBytes(m.Address)) - - return off, nil -} - -// SignedDataSize returns payload size of the request. -func (m DeleteRequest) SignedDataSize() int { - return m.OwnerID.Size() + addressSize(m.Address) -} - -// SignedData returns payload bytes of the request. -func (m GetRangeRequest) SignedData() ([]byte, error) { - return service.SignedDataFromReader(m) -} - -// ReadSignedData copies payload bytes to passed buffer. -// -// If the buffer size is insufficient, io.ErrUnexpectedEOF returns. -func (m GetRangeRequest) ReadSignedData(p []byte) (int, error) { - if len(p) < m.SignedDataSize() { - return 0, io.ErrUnexpectedEOF - } - - n, err := (&m.Range).MarshalTo(p) - if err != nil { - return 0, err - } - - n += copy(p[n:], addressBytes(m.GetAddress())) - - return n, nil -} - -// SignedDataSize returns payload size of the request. -func (m GetRangeRequest) SignedDataSize() int { - return (&m.Range).Size() + addressSize(m.GetAddress()) -} - -// SignedData returns payload bytes of the request. -func (m GetRangeHashRequest) SignedData() ([]byte, error) { - return service.SignedDataFromReader(m) -} - -// ReadSignedData copies payload bytes to passed buffer. -// -// If the buffer size is insufficient, io.ErrUnexpectedEOF returns. -func (m GetRangeHashRequest) ReadSignedData(p []byte) (int, error) { - if len(p) < m.SignedDataSize() { - return 0, io.ErrUnexpectedEOF - } - - var off int - - off += copy(p[off:], addressBytes(m.GetAddress())) - - off += copy(p[off:], rangeSetBytes(m.GetRanges())) - - off += copy(p[off:], m.GetSalt()) - - return off, nil -} - -// SignedDataSize returns payload size of the request. -func (m GetRangeHashRequest) SignedDataSize() int { - var sz int - - sz += addressSize(m.GetAddress()) - - sz += rangeSetSize(m.GetRanges()) - - sz += len(m.GetSalt()) - - return sz -} - -// SignedData returns payload bytes of the request. -func (m SearchRequest) SignedData() ([]byte, error) { - return service.SignedDataFromReader(m) -} - -// ReadSignedData copies payload bytes to passed buffer. -// -// If the buffer size is insufficient, io.ErrUnexpectedEOF returns. -func (m SearchRequest) ReadSignedData(p []byte) (int, error) { - if len(p) < m.SignedDataSize() { - return 0, io.ErrUnexpectedEOF - } - - var off int - - off += copy(p[off:], m.CID().Bytes()) - - binary.BigEndian.PutUint32(p[off:], m.GetQueryVersion()) - off += 4 - - off += copy(p[off:], m.GetQuery()) - - return off, nil -} - -// SignedDataSize returns payload size of the request. -func (m SearchRequest) SignedDataSize() int { - var sz int - - sz += m.CID().Size() - - sz += 4 // uint32 Version - - sz += len(m.GetQuery()) - - return sz -} - -func rangeSetSize(rs []Range) int { - return 4 + len(rs)*16 // two uint64 fields -} - -func rangeSetBytes(rs []Range) []byte { - data := make([]byte, rangeSetSize(rs)) - - binary.BigEndian.PutUint32(data, uint32(len(rs))) - - off := 4 - - for i := range rs { - binary.BigEndian.PutUint64(data[off:], rs[i].Offset) - off += 8 - - binary.BigEndian.PutUint64(data[off:], rs[i].Length) - off += 8 - } - - return data -} - -func addressSize(addr Address) int { - return addr.CID.Size() + addr.ObjectID.Size() -} - -func addressBytes(addr Address) []byte { - return append(addr.CID.Bytes(), addr.ObjectID.Bytes()...) -} - -// SignedData returns the result of the ChecksumSignature field getter. -func (m IntegrityHeader) SignedData() ([]byte, error) { - return m.GetHeadersChecksum(), nil -} - -// AddSignKey calls the ChecksumSignature field setter with signature argument. -func (m *IntegrityHeader) AddSignKey(sign []byte, _ *ecdsa.PublicKey) { - m.SetSignature(sign) -} diff --git a/object/sign_test.go b/object/sign_test.go deleted file mode 100644 index dcfbd7e..0000000 --- a/object/sign_test.go +++ /dev/null @@ -1,239 +0,0 @@ -package object - -import ( - "crypto/rand" - "testing" - - "github.com/nspcc-dev/neofs-api-go/service" - "github.com/nspcc-dev/neofs-crypto/test" - "github.com/stretchr/testify/require" -) - -func TestSignVerifyRequests(t *testing.T) { - sk := test.DecodeKey(0) - - type sigType interface { - service.RequestData - service.SignKeyPairAccumulator - service.SignKeyPairSource - SetToken(*Token) - } - - items := []struct { - constructor func() sigType - payloadCorrupt []func(sigType) - }{ - { // PutRequest.PutHeader - constructor: func() sigType { - return MakePutRequestHeader(new(Object)) - }, - payloadCorrupt: []func(sigType){ - func(s sigType) { - obj := s.(*PutRequest).GetR().(*PutRequest_Header).Header.GetObject() - obj.SystemHeader.PayloadLength++ - }, - }, - }, - { // PutRequest.Chunk - constructor: func() sigType { - return MakePutRequestChunk(make([]byte, 10)) - }, - payloadCorrupt: []func(sigType){ - func(s sigType) { - h := s.(*PutRequest).GetR().(*PutRequest_Chunk) - h.Chunk[0]++ - }, - }, - }, - { // GetRequest - constructor: func() sigType { - return new(GetRequest) - }, - payloadCorrupt: []func(sigType){ - func(s sigType) { - s.(*GetRequest).Address.CID[0]++ - }, - func(s sigType) { - s.(*GetRequest).Address.ObjectID[0]++ - }, - }, - }, - { // HeadRequest - constructor: func() sigType { - return new(HeadRequest) - }, - payloadCorrupt: []func(sigType){ - func(s sigType) { - s.(*HeadRequest).Address.CID[0]++ - }, - func(s sigType) { - s.(*HeadRequest).Address.ObjectID[0]++ - }, - func(s sigType) { - s.(*HeadRequest).FullHeaders = true - }, - }, - }, - { // DeleteRequest - constructor: func() sigType { - return new(DeleteRequest) - }, - payloadCorrupt: []func(sigType){ - func(s sigType) { - s.(*DeleteRequest).OwnerID[0]++ - }, - func(s sigType) { - s.(*DeleteRequest).Address.CID[0]++ - }, - func(s sigType) { - s.(*DeleteRequest).Address.ObjectID[0]++ - }, - }, - }, - { // GetRangeRequest - constructor: func() sigType { - return new(GetRangeRequest) - }, - payloadCorrupt: []func(sigType){ - func(s sigType) { - s.(*GetRangeRequest).Range.Length++ - }, - func(s sigType) { - s.(*GetRangeRequest).Range.Offset++ - }, - func(s sigType) { - s.(*GetRangeRequest).Address.CID[0]++ - }, - func(s sigType) { - s.(*GetRangeRequest).Address.ObjectID[0]++ - }, - }, - }, - { // GetRangeHashRequest - constructor: func() sigType { - return &GetRangeHashRequest{ - Ranges: []Range{{}}, - Salt: []byte{1, 2, 3}, - } - }, - payloadCorrupt: []func(sigType){ - func(s sigType) { - s.(*GetRangeHashRequest).Address.CID[0]++ - }, - func(s sigType) { - s.(*GetRangeHashRequest).Address.ObjectID[0]++ - }, - func(s sigType) { - s.(*GetRangeHashRequest).Salt[0]++ - }, - func(s sigType) { - s.(*GetRangeHashRequest).Ranges[0].Length++ - }, - func(s sigType) { - s.(*GetRangeHashRequest).Ranges[0].Offset++ - }, - func(s sigType) { - s.(*GetRangeHashRequest).Ranges = nil - }, - }, - }, - { // GetRangeHashRequest - constructor: func() sigType { - return &SearchRequest{ - Query: []byte{1, 2, 3}, - } - }, - payloadCorrupt: []func(sigType){ - func(s sigType) { - s.(*SearchRequest).ContainerID[0]++ - }, - func(s sigType) { - s.(*SearchRequest).Query[0]++ - }, - func(s sigType) { - s.(*SearchRequest).QueryVersion++ - }, - }, - }, - } - - for _, item := range items { - { // token corruptions - v := item.constructor() - - token := new(Token) - v.SetToken(token) - - require.NoError(t, service.SignRequestData(sk, v)) - - require.NoError(t, service.VerifyRequestData(v)) - - token.SetSessionKey(append(token.GetSessionKey(), 1)) - - require.Error(t, service.VerifyRequestData(v)) - } - - { // payload corruptions - for _, corruption := range item.payloadCorrupt { - v := item.constructor() - - require.NoError(t, service.SignRequestData(sk, v)) - - require.NoError(t, service.VerifyRequestData(v)) - - corruption(v) - - require.Error(t, service.VerifyRequestData(v)) - } - } - } -} - -func TestHeadRequest_ReadSignedData(t *testing.T) { - t.Run("full headers", func(t *testing.T) { - req := new(HeadRequest) - - // unset FullHeaders flag - req.SetFullHeaders(false) - - // allocate two different buffers for reading - buf1 := testData(t, req.SignedDataSize()) - buf2 := testData(t, req.SignedDataSize()) - - // read to both buffers - n1, err := req.ReadSignedData(buf1) - require.NoError(t, err) - - n2, err := req.ReadSignedData(buf2) - require.NoError(t, err) - - require.Equal(t, buf1[:n1], buf2[:n2]) - }) -} - -func testData(t *testing.T, sz int) []byte { - data := make([]byte, sz) - - _, err := rand.Read(data) - require.NoError(t, err) - - return data -} - -func TestIntegrityHeaderSignMethods(t *testing.T) { - // create new IntegrityHeader - s := new(IntegrityHeader) - - // set test headers checksum - s.SetHeadersChecksum([]byte{1, 2, 3}) - - data, err := s.SignedData() - require.NoError(t, err) - require.Equal(t, data, s.GetHeadersChecksum()) - - // add signature - sig := []byte{4, 5, 6} - s.AddSignKey(sig, nil) - - require.Equal(t, sig, s.GetSignature()) -} diff --git a/object/types.go b/object/types.go deleted file mode 100644 index 392e624..0000000 --- a/object/types.go +++ /dev/null @@ -1,422 +0,0 @@ -package object - -import ( - "bytes" - "context" - "fmt" - "io" - "reflect" - - "github.com/gogo/protobuf/proto" - "github.com/nspcc-dev/neofs-api-go/internal" - "github.com/nspcc-dev/neofs-api-go/refs" - "github.com/pkg/errors" -) - -type ( - // Pred defines a predicate function that can check if passed header - // satisfies predicate condition. It is used to find headers of - // specific type. - Pred = func(*Header) bool - - // Address is a type alias of object Address. - Address = refs.Address - - // PositionReader defines object reader that returns slice of bytes - // for specified object and data range. - PositionReader interface { - PRead(ctx context.Context, addr refs.Address, rng Range) ([]byte, error) - } - - // RequestType of the object service requests. - RequestType int - - headerType int -) - -const ( - // ErrVerifyPayload is raised when payload checksum cannot be verified. - ErrVerifyPayload = internal.Error("can't verify payload") - - // ErrVerifyHeader is raised when object integrity cannot be verified. - ErrVerifyHeader = internal.Error("can't verify header") - - // ErrHeaderNotFound is raised when requested header not found. - ErrHeaderNotFound = internal.Error("header not found") - - // ErrVerifySignature is raised when signature cannot be verified. - ErrVerifySignature = internal.Error("can't verify signature") -) - -const ( - _ headerType = iota - // LinkHdr is a link header type. - LinkHdr - // RedirectHdr is a redirect header type. - RedirectHdr - // UserHdr is a user defined header type. - UserHdr - // TransformHdr is a transformation header type. - TransformHdr - // TombstoneHdr is a tombstone header type. - TombstoneHdr - // TokenHdr is a token header type. - TokenHdr - // HomoHashHdr is a homomorphic hash header type. - HomoHashHdr - // PayloadChecksumHdr is a payload checksum header type. - PayloadChecksumHdr - // IntegrityHdr is a integrity header type. - IntegrityHdr - // StorageGroupHdr is a storage group header type. - StorageGroupHdr - // PublicKeyHdr is a public key header type. - PublicKeyHdr -) - -const ( - _ RequestType = iota - // RequestPut is a type for object put request. - RequestPut - // RequestGet is a type for object get request. - RequestGet - // RequestHead is a type for object head request. - RequestHead - // RequestSearch is a type for object search request. - RequestSearch - // RequestRange is a type for object range request. - RequestRange - // RequestRangeHash is a type for object hash range request. - RequestRangeHash - // RequestDelete is a type for object delete request. - RequestDelete -) - -var ( - _ internal.Custom = (*Object)(nil) - - emptyObject = new(Object).Bytes() -) - -// String returns printable name of the request type. -func (s RequestType) String() string { - switch s { - case RequestPut: - return "PUT" - case RequestGet: - return "GET" - case RequestHead: - return "HEAD" - case RequestSearch: - return "SEARCH" - case RequestRange: - return "RANGE" - case RequestRangeHash: - return "RANGE_HASH" - case RequestDelete: - return "DELETE" - default: - return "UNKNOWN" - } -} - -// Bytes returns marshaled object in a binary format. -func (m Object) Bytes() []byte { data, _ := m.Marshal(); return data } - -// Empty checks if object does not contain any information. -func (m Object) Empty() bool { return bytes.Equal(m.Bytes(), emptyObject) } - -// LastHeader returns last header of the specified type. Type must be -// specified as a Pred function. -func (m Object) LastHeader(f Pred) (int, *Header) { - for i := len(m.Headers) - 1; i >= 0; i-- { - if f != nil && f(&m.Headers[i]) { - return i, &m.Headers[i] - } - } - return -1, nil -} - -// AddHeader adds passed header to the end of extended header list. -func (m *Object) AddHeader(h *Header) { - m.Headers = append(m.Headers, *h) -} - -// SetPayload sets payload field and payload length in the system header. -func (m *Object) SetPayload(payload []byte) { - m.Payload = payload - m.SystemHeader.PayloadLength = uint64(len(payload)) -} - -// SetHeader replaces existing extended header or adds new one to the end of -// extended header list. -func (m *Object) SetHeader(h *Header) { - // looking for the header of that type - for i := range m.Headers { - if m.Headers[i].typeOf(h.Value) { - // if we found one - set it with new value and return - m.Headers[i] = *h - return - } - } - // if we did not find one - add this header - m.AddHeader(h) -} - -// Merge used by proto.Clone -func (m *Object) Merge(src proto.Message) { - if tmp, ok := src.(*Object); ok { - tmp.CopyTo(m) - } -} - -func (m Header) typeOf(t isHeader_Value) (ok bool) { - switch t.(type) { - case *Header_Link: - _, ok = m.Value.(*Header_Link) - case *Header_Redirect: - _, ok = m.Value.(*Header_Redirect) - case *Header_UserHeader: - _, ok = m.Value.(*Header_UserHeader) - case *Header_Transform: - _, ok = m.Value.(*Header_Transform) - case *Header_Tombstone: - _, ok = m.Value.(*Header_Tombstone) - case *Header_Token: - _, ok = m.Value.(*Header_Token) - case *Header_HomoHash: - _, ok = m.Value.(*Header_HomoHash) - case *Header_PayloadChecksum: - _, ok = m.Value.(*Header_PayloadChecksum) - case *Header_Integrity: - _, ok = m.Value.(*Header_Integrity) - case *Header_StorageGroup: - _, ok = m.Value.(*Header_StorageGroup) - case *Header_PublicKey: - _, ok = m.Value.(*Header_PublicKey) - } - return -} - -// HeaderType returns predicate that check if extended header is a header -// of specified type. -func HeaderType(t headerType) Pred { - switch t { - case LinkHdr: - return func(h *Header) bool { _, ok := h.Value.(*Header_Link); return ok } - case RedirectHdr: - return func(h *Header) bool { _, ok := h.Value.(*Header_Redirect); return ok } - case UserHdr: - return func(h *Header) bool { _, ok := h.Value.(*Header_UserHeader); return ok } - case TransformHdr: - return func(h *Header) bool { _, ok := h.Value.(*Header_Transform); return ok } - case TombstoneHdr: - return func(h *Header) bool { _, ok := h.Value.(*Header_Tombstone); return ok } - case TokenHdr: - return func(h *Header) bool { _, ok := h.Value.(*Header_Token); return ok } - case HomoHashHdr: - return func(h *Header) bool { _, ok := h.Value.(*Header_HomoHash); return ok } - case PayloadChecksumHdr: - return func(h *Header) bool { _, ok := h.Value.(*Header_PayloadChecksum); return ok } - case IntegrityHdr: - return func(h *Header) bool { _, ok := h.Value.(*Header_Integrity); return ok } - case StorageGroupHdr: - return func(h *Header) bool { _, ok := h.Value.(*Header_StorageGroup); return ok } - case PublicKeyHdr: - return func(h *Header) bool { _, ok := h.Value.(*Header_PublicKey); return ok } - default: - return nil - } -} - -// Copy creates full copy of the object. -func (m *Object) Copy() (obj *Object) { - obj = new(Object) - m.CopyTo(obj) - return -} - -// CopyTo creates fills passed object with the data from the current object. -// This function creates copies on every available data slice. -func (m *Object) CopyTo(o *Object) { - o.SystemHeader = m.SystemHeader - - if m.Headers != nil { - o.Headers = make([]Header, len(m.Headers)) - } - - if m.Payload != nil { - o.Payload = make([]byte, len(m.Payload)) - copy(o.Payload, m.Payload) - } - - for i := range m.Headers { - switch v := m.Headers[i].Value.(type) { - case *Header_Link: - link := *v.Link - o.Headers[i] = Header{ - Value: &Header_Link{ - Link: &link, - }, - } - case *Header_HomoHash: - hash := proto.Clone(&v.HomoHash).(*Hash) - o.Headers[i] = Header{ - Value: &Header_HomoHash{ - HomoHash: *hash, - }, - } - case *Header_Token: - token := *v.Token - o.Headers[i] = Header{ - Value: &Header_Token{ - Token: &token, - }, - } - default: - o.Headers[i] = *proto.Clone(&m.Headers[i]).(*Header) - } - } -} - -// Address returns object's address. -func (m Object) Address() *refs.Address { - return &refs.Address{ - ObjectID: m.SystemHeader.ID, - CID: m.SystemHeader.CID, - } -} - -func (m CreationPoint) String() string { - return fmt.Sprintf(`{UnixTime=%d Epoch=%d}`, m.UnixTime, m.Epoch) -} - -// Stringify converts object into string format. -func Stringify(dst io.Writer, obj *Object) error { - // put empty line - if _, err := fmt.Fprintln(dst); err != nil { - return err - } - - // put object line - if _, err := fmt.Fprintln(dst, "Object:"); err != nil { - return err - } - - // put system headers - if _, err := fmt.Fprintln(dst, "\tSystemHeader:"); err != nil { - return err - } - - sysHeaders := []string{"ID", "CID", "OwnerID", "Version", "PayloadLength", "CreatedAt"} - v := reflect.ValueOf(obj.SystemHeader) - for _, key := range sysHeaders { - if !v.FieldByName(key).IsValid() { - return errors.Errorf("invalid system header key: %q", key) - } - - val := v.FieldByName(key).Interface() - if _, err := fmt.Fprintf(dst, "\t\t- %s=%v\n", key, val); err != nil { - return err - } - } - - // put user headers - if _, err := fmt.Fprintln(dst, "\tUserHeaders:"); err != nil { - return err - } - - for _, header := range obj.Headers { - var ( - typ = reflect.ValueOf(header.Value) - key string - val interface{} - ) - - switch t := typ.Interface().(type) { - case *Header_Link: - key = "Link" - val = fmt.Sprintf(`{Type=%s ID=%s}`, t.Link.Type, t.Link.ID) - case *Header_Redirect: - key = "Redirect" - val = fmt.Sprintf(`{CID=%s OID=%s}`, t.Redirect.CID, t.Redirect.ObjectID) - case *Header_UserHeader: - key = "UserHeader" - val = fmt.Sprintf(`{Key=%s Val=%s}`, t.UserHeader.Key, t.UserHeader.Value) - case *Header_Transform: - key = "Transform" - val = t.Transform.Type.String() - case *Header_Tombstone: - key = "Tombstone" - val = "MARKED" - case *Header_Token: - key = "Token" - val = fmt.Sprintf("{"+ - "ID=%s OwnerID=%s Verb=%s Address=%s Created=%d ValidUntil=%d SessionKey=%02x Signature=%02x"+ - "}", - t.Token.GetID(), - t.Token.GetOwnerID(), - t.Token.GetVerb(), - t.Token.GetAddress(), - t.Token.CreationEpoch(), - t.Token.ExpirationEpoch(), - t.Token.GetSessionKey(), - t.Token.GetSignature()) - case *Header_HomoHash: - key = "HomoHash" - val = t.HomoHash - case *Header_PayloadChecksum: - key = "PayloadChecksum" - val = t.PayloadChecksum - case *Header_Integrity: - key = "Integrity" - val = fmt.Sprintf(`{Checksum=%02x Signature=%02x}`, - t.Integrity.HeadersChecksum, - t.Integrity.ChecksumSignature) - case *Header_StorageGroup: - key = "StorageGroup" - val = fmt.Sprintf(`{DataSize=%d Hash=%02x Lifetime={Unit=%s Value=%d}}`, - t.StorageGroup.ValidationDataSize, - t.StorageGroup.ValidationHash, - t.StorageGroup.Lifetime.Unit, - t.StorageGroup.Lifetime.Value) - case *Header_PublicKey: - key = "PublicKey" - val = t.PublicKey.Value - default: - key = "Unknown" - val = t - } - - if _, err := fmt.Fprintf(dst, "\t\t- Type=%s\n\t\t Value=%v\n", key, val); err != nil { - return err - } - } - - // put payload - if _, err := fmt.Fprintf(dst, "\tPayload: %#v\n", obj.Payload); err != nil { - return err - } - - return nil -} - -// SetFullHeaders is a FullHeaders field setter. -func (m *HeadRequest) SetFullHeaders(v bool) { - m.FullHeaders = v -} - -// GetSignature is a ChecksumSignature field getter. -func (m IntegrityHeader) GetSignature() []byte { - return m.ChecksumSignature -} - -// SetSignature is a ChecksumSignature field setter. -func (m *IntegrityHeader) SetSignature(v []byte) { - m.ChecksumSignature = v -} - -// SetHeadersChecksum is a HeadersChecksum field setter. -func (m *IntegrityHeader) SetHeadersChecksum(v []byte) { - m.HeadersChecksum = v -} diff --git a/object/types.pb.go b/object/types.pb.go deleted file mode 100644 index 97106c7bde6493f1526fbbcc1f09c27946b60cdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85256 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 jL@>Mz6BTPat9z;BV|g#vmhCDe>f*kVtCgv UnitsTB: - unit = "TB" - dec = UnitsTB - case num > UnitsGB: - unit = "GB" - dec = UnitsGB - case num > UnitsMB: - unit = "MB" - dec = UnitsMB - case num > UnitsKB: - unit = "KB" - dec = UnitsKB - default: - dec = 1 - } - - return strconv.FormatFloat(float64(num)/float64(dec), 'g', 6, 64) + unit -} - -// MakePutRequestHeader combines object and session token value -// into header of object put request. -func MakePutRequestHeader(obj *Object) *PutRequest { - return &PutRequest{ - R: &PutRequest_Header{Header: &PutRequest_PutHeader{ - Object: obj, - }}, - } -} - -// MakePutRequestChunk splits data into chunks that will be transferred -// in the protobuf stream. -func MakePutRequestChunk(chunk []byte) *PutRequest { - return &PutRequest{R: &PutRequest_Chunk{Chunk: chunk}} -} - -func errMaxSizeExceeded(size uint64) error { - return errors.Errorf("object payload size exceed: %s", ByteSize(size).String()) -} - -// ReceiveGetResponse receives object by chunks from the protobuf stream -// and combine it into single get response structure. -func ReceiveGetResponse(c Service_GetClient, maxSize uint64) (*GetResponse, error) { - res, err := c.Recv() - if err == io.EOF { - return res, err - } else if err != nil { - return nil, err - } - - obj := res.GetObject() - if obj == nil { - return nil, ErrHeaderExpected - } - - if obj.SystemHeader.PayloadLength > maxSize { - return nil, errMaxSizeExceeded(maxSize) - } - - if res.NotFull() { - payload := make([]byte, obj.SystemHeader.PayloadLength) - offset := copy(payload, obj.Payload) - - var r *GetResponse - for r, err = c.Recv(); err == nil; r, err = c.Recv() { - offset += copy(payload[offset:], r.GetChunk()) - } - if err != io.EOF { - return nil, err - } - obj.Payload = payload - } - - return res, nil -} diff --git a/object/utils_test.go b/object/utils_test.go deleted file mode 100644 index d4d7fe2..0000000 --- a/object/utils_test.go +++ /dev/null @@ -1,53 +0,0 @@ -package object - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestByteSize_String(t *testing.T) { - cases := []struct { - name string - expect string - actual ByteSize - }{ - { - name: "0 bytes", - expect: "0", - actual: ByteSize(0), - }, - { - name: "101 bytes", - expect: "101", - actual: ByteSize(101), - }, - { - name: "112.84KB", - expect: "112.84KB", - actual: ByteSize(115548), - }, - { - name: "80.44MB", - expect: "80.44MB", - actual: ByteSize(84347453), - }, - { - name: "905.144GB", - expect: "905.144GB", - actual: ByteSize(971891061884), - }, - { - name: "1.857TB", - expect: "1.857TB", - actual: ByteSize(2041793092780), - }, - } - - for i := range cases { - tt := cases[i] - t.Run(tt.name, func(t *testing.T) { - require.Equal(t, tt.expect, tt.actual.String()) - }) - } -} diff --git a/object/verification.go b/object/verification.go deleted file mode 100644 index 0bcbc7c..0000000 --- a/object/verification.go +++ /dev/null @@ -1,149 +0,0 @@ -package object - -import ( - "bytes" - "crypto/ecdsa" - "crypto/sha256" - - crypto "github.com/nspcc-dev/neofs-crypto" - "github.com/pkg/errors" -) - -func (m Object) headersData(check bool) ([]byte, error) { - var bytebuf = new(bytes.Buffer) - - // fixme: we must marshal fields one by one without protobuf marshaling - // protobuf marshaling does not guarantee the same result - - if sysheader, err := m.SystemHeader.Marshal(); err != nil { - return nil, err - } else if _, err := bytebuf.Write(sysheader); err != nil { - return nil, err - } - - n, _ := m.LastHeader(HeaderType(IntegrityHdr)) - for i := range m.Headers { - if check && i == n { - // ignore last integrity header in order to check headers data - continue - } - - if header, err := m.Headers[i].Marshal(); err != nil { - return nil, err - } else if _, err := bytebuf.Write(header); err != nil { - return nil, err - } - } - return bytebuf.Bytes(), nil -} - -func (m Object) headersChecksum(check bool) ([]byte, error) { - data, err := m.headersData(check) - if err != nil { - return nil, err - } - checksum := sha256.Sum256(data) - return checksum[:], nil -} - -// PayloadChecksum calculates sha256 checksum of object payload. -func (m Object) PayloadChecksum() []byte { - checksum := sha256.Sum256(m.Payload) - return checksum[:] -} - -func (m Object) verifySignature(key []byte, ih *IntegrityHeader) error { - pk := crypto.UnmarshalPublicKey(key) - if crypto.Verify(pk, ih.HeadersChecksum, ih.ChecksumSignature) == nil { - return nil - } - return ErrVerifySignature -} - -// Verify performs local integrity check by finding verification header and -// integrity header. If header integrity is passed, function verifies -// checksum of the object payload. -// todo: move this verification logic into separate library -func (m Object) Verify() error { - var ( - err error - checksum []byte - pubkey []byte - ) - ind, ih := m.LastHeader(HeaderType(IntegrityHdr)) - if ih == nil || ind != len(m.Headers)-1 { - return ErrHeaderNotFound - } - integrity := ih.Value.(*Header_Integrity).Integrity - - // Prepare structures - _, vh := m.LastHeader(HeaderType(TokenHdr)) - if vh == nil { - _, pkh := m.LastHeader(HeaderType(PublicKeyHdr)) - if pkh == nil { - return ErrHeaderNotFound - } - pubkey = pkh.Value.(*Header_PublicKey).PublicKey.Value - } else { - pubkey = vh.Value.(*Header_Token).Token.GetSessionKey() - } - - // Verify signature - err = m.verifySignature(pubkey, integrity) - if err != nil { - return errors.Wrapf(err, "public key: %x", pubkey) - } - - // Verify checksum of header - checksum, err = m.headersChecksum(true) - if err != nil { - return err - } - if !bytes.Equal(integrity.HeadersChecksum, checksum) { - return ErrVerifyHeader - } - - // Verify checksum of payload - if m.SystemHeader.PayloadLength > 0 && !m.IsLinking() { - checksum = m.PayloadChecksum() - - _, ph := m.LastHeader(HeaderType(PayloadChecksumHdr)) - if ph == nil { - return ErrHeaderNotFound - } - if !bytes.Equal(ph.Value.(*Header_PayloadChecksum).PayloadChecksum, checksum) { - return ErrVerifyPayload - } - } - return nil -} - -// CreateIntegrityHeader returns signed integrity header for the object -func CreateIntegrityHeader(obj *Object, key *ecdsa.PrivateKey) (*Header, error) { - headerChecksum, err := obj.headersChecksum(false) - if err != nil { - return nil, err - } - headerChecksumSignature, err := crypto.Sign(key, headerChecksum) - if err != nil { - return nil, err - } - - return &Header{Value: &Header_Integrity{ - Integrity: &IntegrityHeader{ - HeadersChecksum: headerChecksum, - ChecksumSignature: headerChecksumSignature, - }, - }}, nil -} - -// Sign creates new integrity header and adds it to the end of the list of -// extended headers. -func (m *Object) Sign(key *ecdsa.PrivateKey) error { - ih, err := CreateIntegrityHeader(m, key) - if err != nil { - return err - } - m.AddHeader(ih) - return nil -} diff --git a/object/verification_test.go b/object/verification_test.go deleted file mode 100644 index 95a6d32..0000000 --- a/object/verification_test.go +++ /dev/null @@ -1,144 +0,0 @@ -package object - -import ( - "testing" - - "github.com/google/uuid" - "github.com/nspcc-dev/neofs-api-go/container" - "github.com/nspcc-dev/neofs-api-go/refs" - crypto "github.com/nspcc-dev/neofs-crypto" - "github.com/nspcc-dev/neofs-crypto/test" - "github.com/stretchr/testify/require" -) - -func TestObject_Verify(t *testing.T) { - key := test.DecodeKey(0) - sessionkey := test.DecodeKey(1) - - payload := make([]byte, 1024*1024) - - cnr, err := container.NewTestContainer() - require.NoError(t, err) - - cid, err := cnr.ID() - require.NoError(t, err) - - id, err := uuid.NewRandom() - uid := refs.UUID(id) - require.NoError(t, err) - - obj := &Object{ - SystemHeader: SystemHeader{ - ID: uid, - CID: cid, - OwnerID: refs.OwnerID([refs.OwnerIDSize]byte{}), - }, - Headers: []Header{ - { - Value: &Header_UserHeader{ - UserHeader: &UserHeader{ - Key: "Profession", - Value: "Developer", - }, - }, - }, - { - Value: &Header_UserHeader{ - UserHeader: &UserHeader{ - Key: "Language", - Value: "GO", - }, - }, - }, - }, - } - obj.SetPayload(payload) - obj.SetHeader(&Header{Value: &Header_PayloadChecksum{[]byte("incorrect checksum")}}) - - t.Run("error no integrity header and pubkey", func(t *testing.T) { - err = obj.Verify() - require.EqualError(t, err, ErrHeaderNotFound.Error()) - }) - - badHeaderChecksum := []byte("incorrect checksum") - signature, err := crypto.Sign(sessionkey, badHeaderChecksum) - require.NoError(t, err) - ih := &IntegrityHeader{ - HeadersChecksum: badHeaderChecksum, - ChecksumSignature: signature, - } - obj.SetHeader(&Header{Value: &Header_Integrity{ih}}) - - t.Run("error no validation header", func(t *testing.T) { - err = obj.Verify() - require.EqualError(t, err, ErrHeaderNotFound.Error()) - }) - - dataPK := crypto.MarshalPublicKey(&sessionkey.PublicKey) - signature, err = crypto.Sign(key, dataPK) - tok := new(Token) - tok.SetSignature(signature) - tok.SetSessionKey(dataPK) - obj.AddHeader(&Header{Value: &Header_Token{Token: tok}}) - - // validation header is not last - t.Run("error validation header is not last", func(t *testing.T) { - err = obj.Verify() - require.EqualError(t, err, ErrHeaderNotFound.Error()) - }) - - obj.Headers = obj.Headers[:len(obj.Headers)-2] - obj.AddHeader(&Header{Value: &Header_Token{Token: tok}}) - obj.SetHeader(&Header{Value: &Header_Integrity{ih}}) - - t.Run("error invalid header checksum", func(t *testing.T) { - err = obj.Verify() - require.EqualError(t, err, ErrVerifyHeader.Error()) - }) - - obj.Headers = obj.Headers[:len(obj.Headers)-1] - genIH, err := CreateIntegrityHeader(obj, sessionkey) - require.NoError(t, err) - obj.SetHeader(genIH) - - t.Run("error invalid payload checksum", func(t *testing.T) { - err = obj.Verify() - require.EqualError(t, err, ErrVerifyPayload.Error()) - }) - - obj.SetHeader(&Header{Value: &Header_PayloadChecksum{obj.PayloadChecksum()}}) - - obj.Headers = obj.Headers[:len(obj.Headers)-1] - genIH, err = CreateIntegrityHeader(obj, sessionkey) - require.NoError(t, err) - obj.SetHeader(genIH) - - t.Run("correct with tok", func(t *testing.T) { - err = obj.Verify() - require.NoError(t, err) - }) - - pkh := Header{Value: &Header_PublicKey{&PublicKey{ - Value: crypto.MarshalPublicKey(&key.PublicKey), - }}} - // replace tok with pkh - obj.Headers[len(obj.Headers)-2] = pkh - // re-sign object - obj.Sign(sessionkey) - - t.Run("incorrect with bad public key", func(t *testing.T) { - err = obj.Verify() - require.Error(t, err) - }) - - obj.SetHeader(&Header{Value: &Header_PublicKey{&PublicKey{ - Value: dataPK, - }}}) - obj.Sign(sessionkey) - - t.Run("correct with good public key", func(t *testing.T) { - err = obj.Verify() - require.NoError(t, err) - }) - -} diff --git a/query/types.go b/query/types.go deleted file mode 100644 index 15a54f6..0000000 --- a/query/types.go +++ /dev/null @@ -1,43 +0,0 @@ -package query - -import ( - "strings" - - "github.com/gogo/protobuf/proto" -) - -var ( - _ proto.Message = (*Query)(nil) - _ proto.Message = (*Filter)(nil) -) - -// String returns string representation of Filter. -func (m Filter) String() string { - b := new(strings.Builder) - b.WriteString("") - return b.String() -} - -// String returns string representation of Query. -func (m Query) String() string { - b := new(strings.Builder) - b.WriteString("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 C!1NLT diff --git a/query/types.proto b/query/types.proto deleted file mode 100644 index ebc0d64..0000000 --- a/query/types.proto +++ /dev/null @@ -1,33 +0,0 @@ -syntax = "proto3"; -package query; -option go_package = "github.com/nspcc-dev/neofs-api-go/query"; -option csharp_namespace = "NeoFS.API.Query"; - -import "github.com/gogo/protobuf/gogoproto/gogo.proto"; - -option (gogoproto.stable_marshaler_all) = true; - -message Filter { - option (gogoproto.goproto_stringer) = false; - - enum Type { - // Exact sets when value of filter should be equal to the header value - Exact = 0; - // Regex sets when value of filter should match the header value by the regular expression - Regex = 1; - } - - // Type of filter - Type type = 1 [(gogoproto.customname) = "Type"]; - // Name of field that should be filtered - string Name = 2; - // Value that should be used for filter - string Value = 3; -} - -message Query { - option (gogoproto.goproto_stringer) = false; - - // Filters is set of filters, should not be empty - repeated Filter Filters = 1 [(gogoproto.nullable) = false]; -} diff --git a/refs/address.go b/refs/address.go deleted file mode 100644 index ad5f420..0000000 --- a/refs/address.go +++ /dev/null @@ -1,80 +0,0 @@ -package refs - -import ( - "crypto/sha256" - "strings" - - "github.com/gogo/protobuf/proto" - "github.com/nspcc-dev/neofs-api-go/internal" -) - -const ( - joinSeparator = "/" - - // ErrWrongAddress is raised when wrong address is passed to Address.Parse ParseAddress. - ErrWrongAddress = internal.Error("wrong address") - - // ErrEmptyAddress is raised when empty address is passed to Address.Parse ParseAddress. - ErrEmptyAddress = internal.Error("empty address") -) - -// ParseAddress parses address from string representation into new Address. -func ParseAddress(str string) (*Address, error) { - var addr Address - return &addr, addr.Parse(str) -} - -// Parse parses address from string representation into current Address. -func (m *Address) Parse(addr string) error { - if m == nil { - return ErrEmptyAddress - } - - items := strings.Split(addr, joinSeparator) - if len(items) != 2 { - return ErrWrongAddress - } - - if err := m.CID.Parse(items[0]); err != nil { - return err - } else if err := m.ObjectID.Parse(items[1]); err != nil { - return err - } - - return nil -} - -// String returns string representation of Address. -func (m Address) String() string { - return strings.Join([]string{m.CID.String(), m.ObjectID.String()}, joinSeparator) -} - -// IsFull checks that ContainerID and ObjectID is not empty. -func (m Address) IsFull() bool { - return !m.CID.Empty() && !m.ObjectID.Empty() -} - -// Equal checks that current Address is equal to passed Address. -func (m Address) Equal(a2 *Address) bool { - return m.CID.Equal(a2.CID) && m.ObjectID.Equal(a2.ObjectID) -} - -// Hash returns []byte that used as a key for storage bucket. -func (m Address) Hash() ([]byte, error) { - if !m.IsFull() { - return nil, ErrEmptyAddress - } - h := sha256.Sum256(append(m.ObjectID.Bytes(), m.CID.Bytes()...)) - return h[:], nil -} - -// Merge used by proto.Clone -func (m *Address) Merge(src proto.Message) { - if addr, ok := src.(*Address); ok { - cid := proto.Clone(&addr.CID).(*CID) - oid := proto.Clone(&addr.ObjectID).(*ObjectID) - - m.CID = *cid - m.ObjectID = *oid - } -} diff --git a/refs/cid.go b/refs/cid.go deleted file mode 100644 index 83450a9..0000000 --- a/refs/cid.go +++ /dev/null @@ -1,104 +0,0 @@ -package refs - -import ( - "bytes" - "crypto/sha256" - - "github.com/gogo/protobuf/proto" - "github.com/mr-tron/base58" - "github.com/pkg/errors" -) - -// CIDForBytes creates CID for passed bytes. -func CIDForBytes(data []byte) CID { return sha256.Sum256(data) } - -// CIDFromBytes parses CID from passed bytes. -func CIDFromBytes(data []byte) (cid CID, err error) { - if ln := len(data); ln != CIDSize { - return CID{}, errors.Wrapf(ErrWrongDataSize, "expect=%d, actual=%d", CIDSize, ln) - } - - copy(cid[:], data) - return -} - -// CIDFromString parses CID from string representation of CID. -func CIDFromString(c string) (CID, error) { - var cid CID - decoded, err := base58.Decode(c) - if err != nil { - return cid, err - } - return CIDFromBytes(decoded) -} - -// Size returns size of CID (CIDSize). -func (c CID) Size() int { return CIDSize } - -// Parse tries to parse CID from string representation. -func (c *CID) Parse(cid string) error { - var err error - if *c, err = CIDFromString(cid); err != nil { - return err - } - return nil -} - -// Empty checks that current CID is empty. -func (c CID) Empty() bool { return bytes.Equal(c.Bytes(), emptyCID) } - -// Equal checks that current CID is equal to passed CID. -func (c CID) Equal(cid CID) bool { return bytes.Equal(c.Bytes(), cid.Bytes()) } - -// Marshal returns CID bytes representation. -func (c CID) Marshal() ([]byte, error) { return c.Bytes(), nil } - -// MarshalBinary returns CID bytes representation. -func (c CID) MarshalBinary() ([]byte, error) { return c.Bytes(), nil } - -// MarshalTo marshal CID to bytes representation into passed bytes. -func (c *CID) MarshalTo(data []byte) (int, error) { return copy(data, c.Bytes()), nil } - -// ProtoMessage method to satisfy proto.Message interface. -func (c CID) ProtoMessage() {} - -// String returns string representation of CID. -func (c CID) String() string { return base58.Encode(c[:]) } - -// Reset resets current CID to zero value. -func (c *CID) Reset() { *c = CID{} } - -// Bytes returns CID bytes representation. -func (c CID) Bytes() []byte { - buf := make([]byte, CIDSize) - copy(buf, c[:]) - return buf -} - -// UnmarshalBinary tries to parse bytes representation of CID. -func (c *CID) UnmarshalBinary(data []byte) error { return c.Unmarshal(data) } - -// Unmarshal tries to parse bytes representation of CID. -func (c *CID) Unmarshal(data []byte) error { - if ln := len(data); ln != CIDSize { - return errors.Wrapf(ErrWrongDataSize, "expect=%d, actual=%d", CIDSize, ln) - } - - copy((*c)[:], data) - return nil -} - -// Verify validates that current CID is generated for passed bytes data. -func (c CID) Verify(data []byte) error { - if id := CIDForBytes(data); !bytes.Equal(c[:], id[:]) { - return errors.New("wrong hash for data") - } - return nil -} - -// Merge used by proto.Clone -func (c *CID) Merge(src proto.Message) { - if cid, ok := src.(*CID); ok { - *c = *cid - } -} diff --git a/refs/owner.go b/refs/owner.go deleted file mode 100644 index 0e599e9..0000000 --- a/refs/owner.go +++ /dev/null @@ -1,77 +0,0 @@ -package refs - -import ( - "bytes" - "crypto/ecdsa" - - "github.com/gogo/protobuf/proto" - "github.com/mr-tron/base58" - "github.com/nspcc-dev/neofs-api-go/chain" - "github.com/pkg/errors" -) - -// NewOwnerID returns generated OwnerID from passed public key. -func NewOwnerID(key *ecdsa.PublicKey) (owner OwnerID, err error) { - if key == nil { - return - } - - var d []byte - - d, err = base58.Decode(chain.KeyToAddress(key)) - if err != nil { - return - } - - copy(owner[:], d) - - return -} - -// Size returns OwnerID size in bytes (OwnerIDSize). -func (OwnerID) Size() int { return OwnerIDSize } - -// Empty checks that current OwnerID is empty value. -func (o OwnerID) Empty() bool { return bytes.Equal(o.Bytes(), emptyOwner) } - -// Equal checks that current OwnerID is equal to passed OwnerID. -func (o OwnerID) Equal(id OwnerID) bool { return bytes.Equal(o.Bytes(), id.Bytes()) } - -// Reset sets current OwnerID to empty value. -func (o *OwnerID) Reset() { *o = OwnerID{} } - -// ProtoMessage method to satisfy proto.Message interface. -func (OwnerID) ProtoMessage() {} - -// Marshal returns OwnerID bytes representation. -func (o OwnerID) Marshal() ([]byte, error) { return o.Bytes(), nil } - -// MarshalTo copies OwnerID bytes representation into passed slice of bytes. -func (o OwnerID) MarshalTo(data []byte) (int, error) { return copy(data, o.Bytes()), nil } - -// String returns string representation of OwnerID. -func (o OwnerID) String() string { return base58.Encode(o[:]) } - -// Bytes returns OwnerID bytes representation. -func (o OwnerID) Bytes() []byte { - buf := make([]byte, OwnerIDSize) - copy(buf, o[:]) - return buf -} - -// Unmarshal tries to parse OwnerID bytes representation into current OwnerID. -func (o *OwnerID) Unmarshal(data []byte) error { - if ln := len(data); ln != OwnerIDSize { - return errors.Wrapf(ErrWrongDataSize, "expect=%d, actual=%d", OwnerIDSize, ln) - } - - copy((*o)[:], data) - return nil -} - -// Merge used by proto.Clone -func (o *OwnerID) Merge(src proto.Message) { - if uid, ok := src.(*OwnerID); ok { - *o = *uid - } -} diff --git a/refs/sgid.go b/refs/sgid.go deleted file mode 100644 index d6fcf2d..0000000 --- a/refs/sgid.go +++ /dev/null @@ -1,14 +0,0 @@ -package refs - -import ( - "github.com/pkg/errors" -) - -// SGIDFromBytes parse bytes representation of SGID into new SGID value. -func SGIDFromBytes(data []byte) (sgid SGID, err error) { - if ln := len(data); ln != SGIDSize { - return SGID{}, errors.Wrapf(ErrWrongDataSize, "expect=%d, actual=%d", SGIDSize, ln) - } - copy(sgid[:], data) - return -} diff --git a/refs/types.go b/refs/types.go deleted file mode 100644 index 417eec3..0000000 --- a/refs/types.go +++ /dev/null @@ -1,123 +0,0 @@ -// This package contains basic structures implemented in Go, such as -// -// CID - container id -// OwnerID - owner id -// ObjectID - object id -// SGID - storage group id -// Address - contains object id and container id -// UUID - a 128 bit (16 byte) Universal Unique Identifier as defined in RFC 4122 - -package refs - -import ( - "crypto/sha256" - - "github.com/google/uuid" - "github.com/nspcc-dev/neofs-api-go/chain" - "github.com/nspcc-dev/neofs-api-go/internal" -) - -type ( - // CID is implementation of ContainerID. - CID [CIDSize]byte - - // UUID wrapper over github.com/google/uuid.UUID. - UUID uuid.UUID - - // SGID is type alias of UUID. - SGID = UUID - - // ObjectID is type alias of UUID. - ObjectID = UUID - - // MessageID is type alias of UUID. - MessageID = UUID - - // OwnerID is wrapper over neofs-proto/chain.WalletAddress. - OwnerID chain.WalletAddress -) - -// OwnerIDSource is an interface of the container of an OwnerID value with read access. -type OwnerIDSource interface { - GetOwnerID() OwnerID -} - -// OwnerIDContainer is an interface of the container of an OwnerID value. -type OwnerIDContainer interface { - OwnerIDSource - SetOwnerID(OwnerID) -} - -// AddressContainer is an interface of the container of object address value. -type AddressContainer interface { - GetAddress() Address - SetAddress(Address) -} - -const ( - // UUIDSize contains size of UUID. - UUIDSize = 16 - - // SGIDSize contains size of SGID. - SGIDSize = UUIDSize - - // CIDSize contains size of CID. - CIDSize = sha256.Size - - // OwnerIDSize contains size of OwnerID. - OwnerIDSize = chain.AddressLength - - // ErrWrongDataSize is raised when passed bytes into Unmarshal have wrong size. - ErrWrongDataSize = internal.Error("wrong data size") - - // ErrEmptyOwner is raised when empty OwnerID is passed into container.New. - ErrEmptyOwner = internal.Error("owner cant be empty") - - // ErrEmptyCapacity is raised when empty Capacity is passed container.New. - ErrEmptyCapacity = internal.Error("capacity cant be empty") - - // ErrEmptyContainer is raised when it CID method is called for an empty container. - ErrEmptyContainer = internal.Error("cannot return ID for empty container") -) - -var ( - emptyCID = (CID{}).Bytes() - emptyUUID = (UUID{}).Bytes() - emptyOwner = (OwnerID{}).Bytes() - - _ internal.Custom = (*CID)(nil) - _ internal.Custom = (*SGID)(nil) - _ internal.Custom = (*UUID)(nil) - _ internal.Custom = (*OwnerID)(nil) - _ internal.Custom = (*ObjectID)(nil) - _ internal.Custom = (*MessageID)(nil) - - // NewSGID method alias. - NewSGID = NewUUID - - // NewObjectID method alias. - NewObjectID = NewUUID - - // NewMessageID method alias. - NewMessageID = NewUUID -) - -// NewUUID returns a Random (Version 4) UUID. -// -// The strength of the UUIDs is based on the strength of the crypto/rand -// package. -// -// A note about uniqueness derived from the UUID Wikipedia entry: -// -// Randomly generated UUIDs have 122 random bits. One's annual risk of being -// hit by a meteorite is estimated to be one chance in 17 billion, that -// means the probability is about 0.00000000006 (6 × 10−11), -// equivalent to the odds of creating a few tens of trillions of UUIDs in a -// year and having one duplicate. -func NewUUID() (UUID, error) { - id, err := uuid.NewRandom() - if err != nil { - return UUID{}, err - } - return UUID(id), nil -} diff --git a/refs/types.pb.go b/refs/types.pb.go deleted file mode 100644 index 1b483cdbcbe5b231752adad4cc9f112cf6faa605..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9400 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 diff --git a/service/meta.proto b/service/meta.proto deleted file mode 100644 index 8171980..0000000 --- a/service/meta.proto +++ /dev/null @@ -1,49 +0,0 @@ -syntax = "proto3"; -package service; -option go_package = "github.com/nspcc-dev/neofs-api-go/service"; -option csharp_namespace = "NeoFS.API.Service"; - -import "github.com/gogo/protobuf/gogoproto/gogo.proto"; - -option (gogoproto.stable_marshaler_all) = true; - -// RequestMetaHeader contains information about request meta headers -// (should be embedded into message) -message RequestMetaHeader { - // TTL must be larger than zero, it decreased in every NeoFS Node - uint32 TTL = 1; - // Epoch for user can be empty, because node sets epoch to the actual value - uint64 Epoch = 2; - // Version defines protocol version - // TODO: not used for now, should be implemented in future - uint32 Version = 3; - // Raw determines whether the request is raw or not - bool Raw = 4; - // ExtendedHeader carries extended headers of the request - RequestExtendedHeader ExtendedHeader = 5 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} - -// ResponseMetaHeader contains meta information based on request processing by server -// (should be embedded into message) -message ResponseMetaHeader { - // Current NeoFS epoch on server - uint64 Epoch = 1; - // Version defines protocol version - // TODO: not used for now, should be implemented in future - uint32 Version = 2; -} - -// RequestExtendedHeader contains extended headers of request -message RequestExtendedHeader { - // KV contains string key-value pair - message KV { - // K carries extended header key - string K = 1; - - // V carries extended header value - string V = 2; - } - - // Headers carries list of key-value headers - repeated KV Headers = 1 [(gogoproto.nullable) = false]; -} diff --git a/service/meta_test.go b/service/meta_test.go deleted file mode 100644 index 9e9c012..0000000 --- a/service/meta_test.go +++ /dev/null @@ -1,99 +0,0 @@ -package service - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestCutRestoreMeta(t *testing.T) { - items := []func() SeizedMetaHeaderContainer{ - func() SeizedMetaHeaderContainer { - m := new(RequestMetaHeader) - m.SetEpoch(1) - return m - }, - } - - for _, item := range items { - v1 := item() - m1 := v1.CutMeta() - v1.RestoreMeta(m1) - - require.Equal(t, item(), v1) - } -} - -func TestRequestExtendedHeader_KV_Setters(t *testing.T) { - s := new(RequestExtendedHeader_KV) - - key := "key" - s.SetK(key) - require.Equal(t, key, s.GetK()) - - val := "val" - s.SetV(val) - require.Equal(t, val, s.GetV()) -} - -func TestRequestExtendedHeader_SetHeaders(t *testing.T) { - s := new(RequestExtendedHeader) - - hdr := RequestExtendedHeader_KV{} - hdr.SetK("key") - hdr.SetV("val") - - hdrs := []RequestExtendedHeader_KV{ - hdr, - } - - s.SetHeaders(hdrs) - - require.Equal(t, hdrs, s.GetHeaders()) -} - -func TestExtHdrWrapper(t *testing.T) { - s := wrapExtendedHeaderKV(nil) - require.Empty(t, s.Key()) - require.Empty(t, s.Value()) - - msg := new(RequestExtendedHeader_KV) - s = wrapExtendedHeaderKV(msg) - - key := "key" - msg.SetK(key) - require.Equal(t, key, s.Key()) - - val := "val" - msg.SetV(val) - require.Equal(t, val, s.Value()) -} - -func TestRequestExtendedHeader_ExtendedHeaders(t *testing.T) { - var ( - k1, v1 = "key1", "value1" - k2, v2 = "key2", "value2" - h1 = new(RequestExtendedHeader_KV) - h2 = new(RequestExtendedHeader_KV) - ) - - h1.SetK(k1) - h1.SetV(v1) - - h2.SetK(k2) - h2.SetV(v2) - - s := new(RequestExtendedHeader) - s.SetHeaders([]RequestExtendedHeader_KV{ - *h1, *h2, - }) - - xHdrs := s.ExtendedHeaders() - require.Len(t, xHdrs, 2) - - require.Equal(t, k1, xHdrs[0].Key()) - require.Equal(t, v1, xHdrs[0].Value()) - - require.Equal(t, k2, xHdrs[1].Key()) - require.Equal(t, v2, xHdrs[1].Value()) -} diff --git a/service/raw.go b/service/raw.go deleted file mode 100644 index 0bb4b27..0000000 --- a/service/raw.go +++ /dev/null @@ -1,6 +0,0 @@ -package service - -// SetRaw is a Raw field setter. -func (m *RequestMetaHeader) SetRaw(raw bool) { - m.Raw = raw -} diff --git a/service/raw_test.go b/service/raw_test.go deleted file mode 100644 index ad595ed..0000000 --- a/service/raw_test.go +++ /dev/null @@ -1,24 +0,0 @@ -package service - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestGetSetRaw(t *testing.T) { - items := []RawContainer{ - new(RequestMetaHeader), - } - - for _, item := range items { - // init with false - item.SetRaw(false) - - item.SetRaw(true) - require.True(t, item.GetRaw()) - - item.SetRaw(false) - require.False(t, item.GetRaw()) - } -} diff --git a/service/role.go b/service/role.go deleted file mode 100644 index 64a0074..0000000 --- a/service/role.go +++ /dev/null @@ -1,37 +0,0 @@ -package service - -import "encoding/binary" - -const ( - _ NodeRole = iota - // InnerRingNode that work like IR node. - InnerRingNode - // StorageNode that work like a storage node. - StorageNode -) - -// String is method, that represent NodeRole as string. -func (nt NodeRole) String() string { - switch nt { - case InnerRingNode: - return "InnerRingNode" - case StorageNode: - return "StorageNode" - default: - return "Unknown" - } -} - -// Size returns the size necessary for a binary representation of the NodeRole. -func (nt NodeRole) Size() int { - return 4 -} - -// Bytes returns a binary representation of the NodeRole. -func (nt NodeRole) Bytes() []byte { - data := make([]byte, nt.Size()) - - binary.BigEndian.PutUint32(data, uint32(nt)) - - return data -} diff --git a/service/role_test.go b/service/role_test.go deleted file mode 100644 index 01dbee2..0000000 --- a/service/role_test.go +++ /dev/null @@ -1,23 +0,0 @@ -package service - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestNodeRole_String(t *testing.T) { - tests := []struct { - nt NodeRole - want string - }{ - {want: "Unknown"}, - {nt: StorageNode, want: "StorageNode"}, - {nt: InnerRingNode, want: "InnerRingNode"}, - } - for _, tt := range tests { - t.Run(tt.want, func(t *testing.T) { - require.Equal(t, tt.want, tt.nt.String()) - }) - } -} diff --git a/service/sign.go b/service/sign.go deleted file mode 100644 index 796a4cd..0000000 --- a/service/sign.go +++ /dev/null @@ -1,404 +0,0 @@ -package service - -import ( - "crypto/ecdsa" - "io" - "sync" - - crypto "github.com/nspcc-dev/neofs-crypto" - "github.com/pkg/errors" -) - -type keySign struct { - key *ecdsa.PublicKey - sign []byte -} - -type signSourceGroup struct { - SignKeyPairSource - SignKeyPairAccumulator - - sources []SignedDataSource -} - -type signReadersGroup struct { - SignKeyPairSource - SignKeyPairAccumulator - - readers []SignedDataReader -} - -var bytesPool = sync.Pool{ - New: func() interface{} { - return make([]byte, 5<<20) - }, -} - -// GetSignature is a sign field getter. -func (s keySign) GetSignature() []byte { - return s.sign -} - -// GetPublicKey is a key field getter, -func (s keySign) GetPublicKey() *ecdsa.PublicKey { - return s.key -} - -// Unites passed key with signature and returns SignKeyPair interface. -func newSignatureKeyPair(key *ecdsa.PublicKey, sign []byte) SignKeyPair { - return &keySign{ - key: key, - sign: sign, - } -} - -// Returns data from DataSignatureAccumulator for signature creation/verification. -// -// If passed DataSignatureAccumulator provides a SignedDataReader interface, data for signature is obtained -// using this interface for optimization. In this case, it is understood that reading into the slice D -// that the method DataForSignature returns does not change D. -// -// If returned length of data is negative, ErrNegativeLength returns. -func dataForSignature(src SignedDataSource) ([]byte, error) { - if src == nil { - return nil, ErrNilSignedDataSource - } - - r, ok := src.(SignedDataReader) - if !ok { - return src.SignedData() - } - - buf := bytesPool.Get().([]byte) - - if size := r.SignedDataSize(); size < 0 { - return nil, ErrNegativeLength - } else if size <= cap(buf) { - buf = buf[:size] - } else { - buf = make([]byte, size) - } - - n, err := r.ReadSignedData(buf) - if err != nil { - return nil, err - } - - return buf[:n], nil - -} - -// DataSignature returns the signature of data obtained using the private key. -// -// If passed data container is nil, ErrNilSignedDataSource returns. -// If passed private key is nil, crypto.ErrEmptyPrivateKey returns. -// If the data container or the signature function returns an error, it is returned directly. -func DataSignature(key *ecdsa.PrivateKey, src SignedDataSource) ([]byte, error) { - if key == nil { - return nil, crypto.ErrEmptyPrivateKey - } - - data, err := dataForSignature(src) - if err != nil { - return nil, err - } - defer bytesPool.Put(data) - - return crypto.Sign(key, data) -} - -// AddSignatureWithKey calculates the data signature and adds it to accumulator with public key. -// -// Any change of data provoke signature breakdown. -// -// Returns signing errors only. -func AddSignatureWithKey(key *ecdsa.PrivateKey, v DataWithSignKeyAccumulator) error { - sign, err := DataSignature(key, v) - if err != nil { - return err - } - - v.AddSignKey(sign, &key.PublicKey) - - return nil -} - -// Checks passed key-signature pairs for data from the passed container. -// -// If passed key-signatures pair set is empty, nil returns immediately. -func verifySignatures(src SignedDataSource, items ...SignKeyPair) error { - if len(items) <= 0 { - return nil - } - - data, err := dataForSignature(src) - if err != nil { - return err - } - defer bytesPool.Put(data) - - for i := range items { - if i > 0 { - // add previous key bytes to the signed message - - signKeyDataSrc := SignKeyPairsSignedData(items[i-1]) - - signKeyData, err := signKeyDataSrc.SignedData() - if err != nil { - return errors.Wrapf(err, "could not get signed data of key-signature #%d", i) - } - - data = append(data, signKeyData...) - } - - if err := crypto.Verify( - items[i].GetPublicKey(), - data, - items[i].GetSignature(), - ); err != nil { - return err - } - } - - return nil -} - -// VerifySignatures checks passed key-signature pairs for data from the passed container. -// -// If passed data source is nil, ErrNilSignedDataSource returns. -// If check data is not ready, corresponding error returns. -// If at least one of the pairs is invalid, an error returns. -func VerifySignatures(src SignedDataSource, items ...SignKeyPair) error { - return verifySignatures(src, items...) -} - -// VerifyAccumulatedSignatures checks if accumulated key-signature pairs are valid. -// -// Behaves like VerifySignatures. -// If passed key-signature source is empty, ErrNilSignatureKeySource returns. -func VerifyAccumulatedSignatures(src DataWithSignKeySource) error { - if src == nil { - return ErrNilSignatureKeySource - } - - return verifySignatures(src, src.GetSignKeyPairs()...) -} - -// VerifySignatureWithKey checks data signature from the passed container with passed key. -// -// If passed data with signature is nil, ErrEmptyDataWithSignature returns. -// If passed key is nil, crypto.ErrEmptyPublicKey returns. -// A non-nil error returns if and only if the signature does not pass verification. -func VerifySignatureWithKey(key *ecdsa.PublicKey, src DataWithSignature) error { - if src == nil { - return ErrEmptyDataWithSignature - } else if key == nil { - return crypto.ErrEmptyPublicKey - } - - return verifySignatures( - src, - newSignatureKeyPair( - key, - src.GetSignature(), - ), - ) -} - -// SignRequestData calculates request data signature and adds it to accumulator. -// -// Any change of request data provoke signature breakdown. -// -// If passed private key is nil, crypto.ErrEmptyPrivateKey returns. -// If passed RequestSignedData is nil, ErrNilRequestSignedData returns. -func SignRequestData(key *ecdsa.PrivateKey, src RequestSignedData) error { - if src == nil { - return ErrNilRequestSignedData - } - - sigSrc, err := GroupSignedPayloads( - src, - src, - NewSignedSessionToken( - src.GetSessionToken(), - ), - NewSignedBearerToken( - src.GetBearerToken(), - ), - ExtendedHeadersSignedData(src), - SignKeyPairsSignedData(src.GetSignKeyPairs()...), - ) - if err != nil { - return err - } - - return AddSignatureWithKey(key, sigSrc) -} - -// VerifyRequestData checks if accumulated key-signature pairs of data with token are valid. -// -// If passed RequestVerifyData is nil, ErrNilRequestVerifyData returns. -func VerifyRequestData(src RequestVerifyData) error { - if src == nil { - return ErrNilRequestVerifyData - } - - verSrc, err := GroupVerifyPayloads( - src, - src, - NewVerifiedSessionToken( - src.GetSessionToken(), - ), - NewVerifiedBearerToken( - src.GetBearerToken(), - ), - ExtendedHeadersSignedData(src), - ) - if err != nil { - return err - } - - return VerifyAccumulatedSignatures(verSrc) -} - -// SignedData returns payload bytes concatenation from all sources keeping order. -func (s signSourceGroup) SignedData() ([]byte, error) { - chunks := make([][]byte, 0, len(s.sources)) - sz := 0 - - for i := range s.sources { - data, err := s.sources[i].SignedData() - if err != nil { - return nil, errors.Wrapf(err, "could not get signed payload of element #%d", i) - } - - chunks = append(chunks, data) - - sz += len(data) - } - - res := make([]byte, sz) - off := 0 - - for i := range chunks { - off += copy(res[off:], chunks[i]) - } - - return res, nil -} - -// SignedData returns payload bytes concatenation from all readers. -func (s signReadersGroup) SignedData() ([]byte, error) { - return SignedDataFromReader(s) -} - -// SignedDataSize returns the sum of sizes of all readers. -func (s signReadersGroup) SignedDataSize() (sz int) { - for i := range s.readers { - sz += s.readers[i].SignedDataSize() - } - - return -} - -// ReadSignedData reads data from all readers to passed buffer keeping order. -// -// If the buffer size is insufficient, io.ErrUnexpectedEOF returns. -func (s signReadersGroup) ReadSignedData(p []byte) (int, error) { - sz := s.SignedDataSize() - if len(p) < sz { - return 0, io.ErrUnexpectedEOF - } - - off := 0 - - for i := range s.readers { - n, err := s.readers[i].ReadSignedData(p[off:]) - off += n - if err != nil { - return off, errors.Wrapf(err, "could not read signed payload of element #%d", i) - } - } - - return off, nil -} - -// GroupSignedPayloads groups SignKeyPairAccumulator and SignedDataSource list to DataWithSignKeyAccumulator. -// -// If passed SignKeyPairAccumulator is nil, ErrNilSignKeyPairAccumulator returns. -// -// Signed payload of the result is a concatenation of payloads of list elements keeping order. -// Nil elements in list are ignored. -// -// If all elements implement SignedDataReader, result implements it too. -func GroupSignedPayloads(acc SignKeyPairAccumulator, sources ...SignedDataSource) (DataWithSignKeyAccumulator, error) { - if acc == nil { - return nil, ErrNilSignKeyPairAccumulator - } - - return groupPayloads(acc, nil, sources...), nil -} - -// GroupVerifyPayloads groups SignKeyPairSource and SignedDataSource list to DataWithSignKeySource. -// -// If passed SignKeyPairSource is nil, ErrNilSignatureKeySource returns. -// -// Signed payload of the result is a concatenation of payloads of list elements keeping order. -// Nil elements in list are ignored. -// -// If all elements implement SignedDataReader, result implements it too. -func GroupVerifyPayloads(src SignKeyPairSource, sources ...SignedDataSource) (DataWithSignKeySource, error) { - if src == nil { - return nil, ErrNilSignatureKeySource - } - - return groupPayloads(nil, src, sources...), nil -} - -func groupPayloads(acc SignKeyPairAccumulator, src SignKeyPairSource, sources ...SignedDataSource) interface { - SignedDataSource - SignKeyPairSource - SignKeyPairAccumulator -} { - var allReaders bool - - for i := range sources { - if sources[i] == nil { - continue - } else if _, allReaders = sources[i].(SignedDataReader); !allReaders { - break - } - } - - if !allReaders { - res := &signSourceGroup{ - SignKeyPairSource: src, - SignKeyPairAccumulator: acc, - - sources: make([]SignedDataSource, 0, len(sources)), - } - - for i := range sources { - if sources[i] != nil { - res.sources = append(res.sources, sources[i]) - } - } - - return res - } - - res := &signReadersGroup{ - SignKeyPairSource: src, - SignKeyPairAccumulator: acc, - - readers: make([]SignedDataReader, 0, len(sources)), - } - - for i := range sources { - if sources[i] != nil { - res.readers = append(res.readers, sources[i].(SignedDataReader)) - } - } - - return res -} diff --git a/service/sign_test.go b/service/sign_test.go deleted file mode 100644 index 3c54e8c..0000000 --- a/service/sign_test.go +++ /dev/null @@ -1,400 +0,0 @@ -package service - -import ( - "crypto/ecdsa" - "crypto/rand" - "errors" - "io" - "testing" - - crypto "github.com/nspcc-dev/neofs-crypto" - "github.com/nspcc-dev/neofs-crypto/test" - "github.com/stretchr/testify/require" -) - -type testSignedDataSrc struct { - err error - data []byte - token SessionToken - - bearer BearerToken - - extHdrs []ExtendedHeader - - signKeys []SignKeyPair -} - -type testSignedDataReader struct { - *testSignedDataSrc -} - -func (s testSignedDataSrc) GetSignature() []byte { - if len(s.signKeys) > 0 { - return s.signKeys[0].GetSignature() - } - - return nil -} - -func (s testSignedDataSrc) GetSignKeyPairs() []SignKeyPair { - return s.signKeys -} - -func (s testSignedDataSrc) SignedData() ([]byte, error) { - return s.data, s.err -} - -func (s *testSignedDataSrc) AddSignKey(sig []byte, key *ecdsa.PublicKey) { - s.signKeys = append(s.signKeys, - newSignatureKeyPair(key, sig), - ) -} - -func testData(t *testing.T, sz int) []byte { - d := make([]byte, sz) - _, err := rand.Read(d) - require.NoError(t, err) - return d -} - -func (s testSignedDataSrc) GetSessionToken() SessionToken { - return s.token -} - -func (s testSignedDataSrc) GetBearerToken() BearerToken { - return s.bearer -} - -func (s testSignedDataSrc) ExtendedHeaders() []ExtendedHeader { - return s.extHdrs -} - -func (s testSignedDataReader) SignedDataSize() int { - return len(s.data) -} - -func (s testSignedDataReader) ReadSignedData(buf []byte) (int, error) { - if s.err != nil { - return 0, s.err - } - - var err error - if len(buf) < len(s.data) { - err = io.ErrUnexpectedEOF - } - return copy(buf, s.data), err -} - -func TestDataSignature(t *testing.T) { - var err error - - // nil private key - _, err = DataSignature(nil, nil) - require.EqualError(t, err, crypto.ErrEmptyPrivateKey.Error()) - - // create test private key - sk := test.DecodeKey(0) - - // nil private key - _, err = DataSignature(sk, nil) - require.EqualError(t, err, ErrNilSignedDataSource.Error()) - - t.Run("common signed data source", func(t *testing.T) { - // create test data source - src := &testSignedDataSrc{ - data: testData(t, 10), - } - - // create custom error for data source - src.err = errors.New("test error for data source") - - _, err = DataSignature(sk, src) - require.EqualError(t, err, src.err.Error()) - - // reset error to nil - src.err = nil - - // calculate data signature - sig, err := DataSignature(sk, src) - require.NoError(t, err) - - // ascertain that the signature passes verification - require.NoError(t, crypto.Verify(&sk.PublicKey, src.data, sig)) - }) - - t.Run("signed data reader", func(t *testing.T) { - // create test signed data reader - src := &testSignedDataSrc{ - data: testData(t, 10), - } - - // create custom error for signed data reader - src.err = errors.New("test error for signed data reader") - - sig, err := DataSignature(sk, src) - require.EqualError(t, err, src.err.Error()) - - // reset error to nil - src.err = nil - - // calculate data signature - sig, err = DataSignature(sk, src) - require.NoError(t, err) - - // ascertain that the signature passes verification - require.NoError(t, crypto.Verify(&sk.PublicKey, src.data, sig)) - }) -} - -func TestAddSignatureWithKey(t *testing.T) { - require.NoError(t, - AddSignatureWithKey( - test.DecodeKey(0), - &testSignedDataSrc{ - data: testData(t, 10), - }, - ), - ) -} - -func TestVerifySignatures(t *testing.T) { - // empty signatures - require.NoError(t, VerifySignatures(nil)) - - // create test signature source - src := &testSignedDataSrc{ - data: testData(t, 10), - } - - // create private key for test - sk := test.DecodeKey(0) - - // calculate a signature of the data - sig, err := crypto.Sign(sk, src.data) - require.NoError(t, err) - - // ascertain that verification is passed - require.NoError(t, - VerifySignatures( - src, - newSignatureKeyPair(&sk.PublicKey, sig), - ), - ) - - // break the signature - sig[0]++ - - require.Error(t, - VerifySignatures( - src, - newSignatureKeyPair(&sk.PublicKey, sig), - ), - ) - - // restore the signature - sig[0]-- - - // empty data source - require.EqualError(t, - VerifySignatures(nil, nil), - ErrNilSignedDataSource.Error(), - ) - -} - -func TestVerifyAccumulatedSignatures(t *testing.T) { - // nil signature source - require.EqualError(t, - VerifyAccumulatedSignatures(nil), - ErrNilSignatureKeySource.Error(), - ) - - // create test private key - sk := test.DecodeKey(0) - - signKey := new(RequestVerificationHeader_Signature) - signKey.Peer = crypto.MarshalPublicKey(&sk.PublicKey) - - // create signature source - src := &testSignedDataSrc{ - data: testData(t, 10), - - signKeys: []SignKeyPair{signKey}, - } - - var err error - - // calculate a signature - signKey.Sign, err = crypto.Sign(sk, src.data) - require.NoError(t, err) - - // ascertain that verification is passed - require.NoError(t, VerifyAccumulatedSignatures(src)) - - // break the signature - signKey.Sign[0]++ - - // ascertain that verification is failed - require.Error(t, VerifyAccumulatedSignatures(src)) -} - -func TestVerifySignatureWithKey(t *testing.T) { - // nil signature source - require.EqualError(t, - VerifySignatureWithKey(nil, nil), - ErrEmptyDataWithSignature.Error(), - ) - - signKey := new(RequestVerificationHeader_Signature) - - // create test signature source - src := &testSignedDataSrc{ - data: testData(t, 10), - - signKeys: []SignKeyPair{signKey}, - } - - // nil public key - require.EqualError(t, - VerifySignatureWithKey(nil, src), - crypto.ErrEmptyPublicKey.Error(), - ) - - // create test private key - sk := test.DecodeKey(0) - - var err error - - // calculate a signature - signKey.Sign, err = crypto.Sign(sk, src.data) - require.NoError(t, err) - - // ascertain that verification is passed - require.NoError(t, VerifySignatureWithKey(&sk.PublicKey, src)) - - // break the signature - signKey.Sign[0]++ - - // ascertain that verification is failed - require.Error(t, VerifySignatureWithKey(&sk.PublicKey, src)) -} - -func TestSignVerifyRequestData(t *testing.T) { - // sign with empty RequestSignedData - require.EqualError(t, - SignRequestData(nil, nil), - ErrNilRequestSignedData.Error(), - ) - - // verify with empty RequestVerifyData - require.EqualError(t, - VerifyRequestData(nil), - ErrNilRequestVerifyData.Error(), - ) - - // create test session token - var ( - token = new(Token) - initVerb = Token_Info_Verb(1) - - bearer = new(BearerTokenMsg) - bearerEpoch = uint64(8) - - extHdrKey = "key" - extHdr = new(RequestExtendedHeader_KV) - ) - - token.SetVerb(initVerb) - - bearer.SetExpirationEpoch(bearerEpoch) - - extHdr.SetK(extHdrKey) - - // create test data with token - src := &testSignedDataSrc{ - data: testData(t, 10), - token: token, - - bearer: bearer, - - extHdrs: []ExtendedHeader{ - wrapExtendedHeaderKV(extHdr), - }, - } - - // create test private key - sk := test.DecodeKey(0) - - // sign with private key - require.NoError(t, SignRequestData(sk, src)) - - // ascertain that verification is passed - require.NoError(t, VerifyRequestData(src)) - - // break the data - src.data[0]++ - - // ascertain that verification is failed - require.Error(t, VerifyRequestData(src)) - - // restore the data - src.data[0]-- - - // break the token - token.SetVerb(initVerb + 1) - - // ascertain that verification is failed - require.Error(t, VerifyRequestData(src)) - - // restore the token - token.SetVerb(initVerb) - - // ascertain that verification is passed - require.NoError(t, VerifyRequestData(src)) - - // break the Bearer token - bearer.SetExpirationEpoch(bearerEpoch + 1) - - // ascertain that verification is failed - require.Error(t, VerifyRequestData(src)) - - // restore the Bearer token - bearer.SetExpirationEpoch(bearerEpoch) - - // ascertain that verification is passed - require.NoError(t, VerifyRequestData(src)) - - // break the extended header - extHdr.SetK(extHdrKey + "1") - - // ascertain that verification is failed - require.Error(t, VerifyRequestData(src)) - - // restore the extended header - extHdr.SetK(extHdrKey) - - // ascertain that verification is passed - require.NoError(t, VerifyRequestData(src)) - - // wrap to data reader - rdr := &testSignedDataReader{ - testSignedDataSrc: src, - } - - // sign with private key - require.NoError(t, SignRequestData(sk, rdr)) - - // ascertain that verification is passed - require.NoError(t, VerifyRequestData(rdr)) - - if len(rdr.GetSignKeyPairs()) < 2 { - // add one more signature - require.NoError(t, SignRequestData(test.DecodeKey(1), rdr)) - } - - // change key-signature order - rdr.signKeys[0], rdr.signKeys[1] = rdr.signKeys[1], rdr.signKeys[0] - - // ascertain that verification is failed - require.Error(t, VerifyRequestData(src)) -} diff --git a/service/token.go b/service/token.go deleted file mode 100644 index 638539f..0000000 --- a/service/token.go +++ /dev/null @@ -1,265 +0,0 @@ -package service - -import ( - "crypto/ecdsa" - "encoding/binary" - "io" - - "github.com/nspcc-dev/neofs-api-go/refs" - crypto "github.com/nspcc-dev/neofs-crypto" -) - -type signAccumWithToken struct { - SignedDataSource - SignKeyPairAccumulator - SignKeyPairSource - - token SessionToken -} - -type signDataReaderWithToken struct { - SignedDataSource - SignKeyPairAccumulator - SignKeyPairSource - - rdr SignedDataReader - - token SessionToken -} - -type signedSessionToken struct { - SessionToken -} - -const verbSize = 4 - -const fixedTokenDataSize = 0 + - refs.UUIDSize + - refs.OwnerIDSize + - verbSize + - refs.UUIDSize + - refs.CIDSize + - 8 + - 8 - -var tokenEndianness = binary.BigEndian - -// GetID is an ID field getter. -func (m Token_Info) GetID() TokenID { - return m.ID -} - -// SetID is an ID field setter. -func (m *Token_Info) SetID(id TokenID) { - m.ID = id -} - -// GetOwnerID is an OwnerID field getter. -func (m Token_Info) GetOwnerID() OwnerID { - return m.OwnerID -} - -// SetOwnerID is an OwnerID field setter. -func (m *Token_Info) SetOwnerID(id OwnerID) { - m.OwnerID = id -} - -// SetVerb is a Verb field setter. -func (m *Token_Info) SetVerb(verb Token_Info_Verb) { - m.Verb = verb -} - -// GetAddress is an Address field getter. -func (m Token_Info) GetAddress() Address { - return m.Address -} - -// SetAddress is an Address field setter. -func (m *Token_Info) SetAddress(addr Address) { - m.Address = addr -} - -// CreationEpoch is a Created field getter. -func (m TokenLifetime) CreationEpoch() uint64 { - return m.Created -} - -// SetCreationEpoch is a Created field setter. -func (m *TokenLifetime) SetCreationEpoch(e uint64) { - m.Created = e -} - -// ExpirationEpoch is a ValidUntil field getter. -func (m TokenLifetime) ExpirationEpoch() uint64 { - return m.ValidUntil -} - -// SetExpirationEpoch is a ValidUntil field setter. -func (m *TokenLifetime) SetExpirationEpoch(e uint64) { - m.ValidUntil = e -} - -// SetSessionKey is a SessionKey field setter. -func (m *Token_Info) SetSessionKey(key []byte) { - m.SessionKey = key -} - -// SetOwnerKey is an OwnerKey field setter. -func (m *Token_Info) SetOwnerKey(key []byte) { - m.OwnerKey = key -} - -// SetSignature is a Signature field setter. -func (m *Token) SetSignature(sig []byte) { - m.Signature = sig -} - -// Size returns the size of a binary representation of the verb. -func (x Token_Info_Verb) Size() int { - return verbSize -} - -// Bytes returns a binary representation of the verb. -func (x Token_Info_Verb) Bytes() []byte { - data := make([]byte, verbSize) - tokenEndianness.PutUint32(data, uint32(x)) - return data -} - -// AddSignKey calls a Signature field setter and an OwnerKey field setter with corresponding arguments. -func (s signedSessionToken) AddSignKey(sig []byte, key *ecdsa.PublicKey) { - if s.SessionToken != nil { - s.SessionToken.SetSignature(sig) - - s.SessionToken.SetOwnerKey( - crypto.MarshalPublicKey(key), - ) - } -} - -// SignedData returns token information in a binary representation. -func (s signedSessionToken) SignedData() ([]byte, error) { - return SignedDataFromReader(s) -} - -// SignedDataSize returns the length of signed token information slice. -func (s signedSessionToken) SignedDataSize() int { - return tokenInfoSize(s.SessionToken) -} - -// ReadSignedData copies a binary representation of the token information to passed buffer. -// -// If buffer length is less than required, io.ErrUnexpectedEOF returns. -func (s signedSessionToken) ReadSignedData(p []byte) (int, error) { - sz := s.SignedDataSize() - if len(p) < sz { - return 0, io.ErrUnexpectedEOF - } - - copyTokenSignedData(p, s.SessionToken) - - return sz, nil -} - -// NewSignedSessionToken wraps passed SessionToken in a component suitable for signing. -// -// Result can be used in AddSignatureWithKey function. -func NewSignedSessionToken(token SessionToken) DataWithSignKeyAccumulator { - return &signedSessionToken{ - SessionToken: token, - } -} - -// NewVerifiedSessionToken wraps passed SessionToken in a component suitable for signature verification. -// -// Result can be used in VerifySignatureWithKey function. -func NewVerifiedSessionToken(token SessionToken) DataWithSignature { - return &signedSessionToken{ - SessionToken: token, - } -} - -func tokenInfoSize(v SessionKeySource) int { - if v == nil { - return 0 - } - return fixedTokenDataSize + len(v.GetSessionKey()) -} - -// Fills passed buffer with signing token information bytes. -// Does not check buffer length, it is understood that enough space is allocated in it. -// -// If passed SessionTokenInfo, buffer remains unchanged. -func copyTokenSignedData(buf []byte, token SessionTokenInfo) { - if token == nil { - return - } - - var off int - - off += copy(buf[off:], token.GetID().Bytes()) - - off += copy(buf[off:], token.GetOwnerID().Bytes()) - - off += copy(buf[off:], token.GetVerb().Bytes()) - - addr := token.GetAddress() - off += copy(buf[off:], addr.CID.Bytes()) - off += copy(buf[off:], addr.ObjectID.Bytes()) - - tokenEndianness.PutUint64(buf[off:], token.CreationEpoch()) - off += 8 - - tokenEndianness.PutUint64(buf[off:], token.ExpirationEpoch()) - off += 8 - - copy(buf[off:], token.GetSessionKey()) -} - -// SignedData concatenates signed data with session token information. Returns concatenation result. -// -// Token bytes are added if and only if token is not nil. -func (s signAccumWithToken) SignedData() ([]byte, error) { - data, err := s.SignedDataSource.SignedData() - if err != nil { - return nil, err - } - - tokenData := make([]byte, tokenInfoSize(s.token)) - - copyTokenSignedData(tokenData, s.token) - - return append(data, tokenData...), nil -} - -func (s signDataReaderWithToken) SignedDataSize() int { - sz := s.rdr.SignedDataSize() - if sz < 0 { - return -1 - } - - sz += tokenInfoSize(s.token) - - return sz -} - -func (s signDataReaderWithToken) ReadSignedData(p []byte) (int, error) { - dataSize := s.rdr.SignedDataSize() - if dataSize < 0 { - return 0, ErrNegativeLength - } - - sumSize := dataSize + tokenInfoSize(s.token) - - if len(p) < sumSize { - return 0, io.ErrUnexpectedEOF - } - - if n, err := s.rdr.ReadSignedData(p); err != nil { - return n, err - } - - copyTokenSignedData(p[dataSize:], s.token) - - return sumSize, nil -} diff --git a/service/token_test.go b/service/token_test.go deleted file mode 100644 index 4fb430a..0000000 --- a/service/token_test.go +++ /dev/null @@ -1,248 +0,0 @@ -package service - -import ( - "crypto/rand" - "testing" - - "github.com/nspcc-dev/neofs-api-go/refs" - crypto "github.com/nspcc-dev/neofs-crypto" - "github.com/nspcc-dev/neofs-crypto/test" - "github.com/stretchr/testify/require" -) - -func TestTokenGettersSetters(t *testing.T) { - var tok SessionToken = new(Token) - - { // ID - id, err := refs.NewUUID() - require.NoError(t, err) - - tok.SetID(id) - - require.Equal(t, id, tok.GetID()) - } - - { // OwnerID - ownerID := OwnerID{} - _, err := rand.Read(ownerID[:]) - require.NoError(t, err) - - tok.SetOwnerID(ownerID) - - require.Equal(t, ownerID, tok.GetOwnerID()) - } - - { // Verb - verb := Token_Info_Verb(3) - - tok.SetVerb(verb) - - require.Equal(t, verb, tok.GetVerb()) - } - - { // Address - addr := Address{} - _, err := rand.Read(addr.CID[:]) - require.NoError(t, err) - _, err = rand.Read(addr.ObjectID[:]) - require.NoError(t, err) - - tok.SetAddress(addr) - - require.Equal(t, addr, tok.GetAddress()) - } - - { // Created - e := uint64(5) - - tok.SetCreationEpoch(e) - - require.Equal(t, e, tok.CreationEpoch()) - } - - { // ValidUntil - e := uint64(5) - - tok.SetExpirationEpoch(e) - - require.Equal(t, e, tok.ExpirationEpoch()) - } - - { // SessionKey - key := make([]byte, 10) - _, err := rand.Read(key) - require.NoError(t, err) - - tok.SetSessionKey(key) - - require.Equal(t, key, tok.GetSessionKey()) - } - - { // Signature - sig := make([]byte, 10) - _, err := rand.Read(sig) - require.NoError(t, err) - - tok.SetSignature(sig) - - require.Equal(t, sig, tok.GetSignature()) - } -} - -func TestSignToken(t *testing.T) { - var token SessionToken = new(Token) - - // create private key for signing - sk := test.DecodeKey(0) - pk := &sk.PublicKey - - id := TokenID{} - _, err := rand.Read(id[:]) - require.NoError(t, err) - token.SetID(id) - - ownerID := OwnerID{} - _, err = rand.Read(ownerID[:]) - require.NoError(t, err) - token.SetOwnerID(ownerID) - - verb := Token_Info_Verb(1) - token.SetVerb(verb) - - addr := Address{} - _, err = rand.Read(addr.ObjectID[:]) - require.NoError(t, err) - _, err = rand.Read(addr.CID[:]) - require.NoError(t, err) - token.SetAddress(addr) - - cEpoch := uint64(1) - token.SetCreationEpoch(cEpoch) - - fEpoch := uint64(2) - token.SetExpirationEpoch(fEpoch) - - sessionKey := make([]byte, 10) - _, err = rand.Read(sessionKey[:]) - require.NoError(t, err) - token.SetSessionKey(sessionKey) - - signedToken := NewSignedSessionToken(token) - verifiedToken := NewVerifiedSessionToken(token) - - // sign and verify token - require.NoError(t, AddSignatureWithKey(sk, signedToken)) - require.NoError(t, VerifySignatureWithKey(pk, verifiedToken)) - - items := []struct { - corrupt func() - restore func() - }{ - { // ID - corrupt: func() { - id[0]++ - token.SetID(id) - }, - restore: func() { - id[0]-- - token.SetID(id) - }, - }, - { // Owner ID - corrupt: func() { - ownerID[0]++ - token.SetOwnerID(ownerID) - }, - restore: func() { - ownerID[0]-- - token.SetOwnerID(ownerID) - }, - }, - { // Verb - corrupt: func() { - token.SetVerb(verb + 1) - }, - restore: func() { - token.SetVerb(verb) - }, - }, - { // ObjectID - corrupt: func() { - addr.ObjectID[0]++ - token.SetAddress(addr) - }, - restore: func() { - addr.ObjectID[0]-- - token.SetAddress(addr) - }, - }, - { // CID - corrupt: func() { - addr.CID[0]++ - token.SetAddress(addr) - }, - restore: func() { - addr.CID[0]-- - token.SetAddress(addr) - }, - }, - { // Creation epoch - corrupt: func() { - token.SetCreationEpoch(cEpoch + 1) - }, - restore: func() { - token.SetCreationEpoch(cEpoch) - }, - }, - { // Expiration epoch - corrupt: func() { - token.SetExpirationEpoch(fEpoch + 1) - }, - restore: func() { - token.SetExpirationEpoch(fEpoch) - }, - }, - { // Session key - corrupt: func() { - sessionKey[0]++ - token.SetSessionKey(sessionKey) - }, - restore: func() { - sessionKey[0]-- - token.SetSessionKey(sessionKey) - }, - }, - } - - for _, v := range items { - v.corrupt() - require.Error(t, VerifySignatureWithKey(pk, verifiedToken)) - v.restore() - require.NoError(t, VerifySignatureWithKey(pk, verifiedToken)) - } -} - -func TestSignedSessionToken_AddSignKey(t *testing.T) { - // nil SessionToken - s := new(signedSessionToken) - - require.NotPanics(t, func() { - s.AddSignKey(nil, nil) - }) - - // create test public key and signature - pk := &test.DecodeKey(0).PublicKey - sig := []byte{1, 2, 3} - - s.SessionToken = new(Token) - - // add key-signature pair to SessionToken - s.AddSignKey(sig, pk) - - require.Equal(t, sig, s.GetSignature()) - - require.Equal(t, - crypto.MarshalPublicKey(pk), - s.GetOwnerKey(), - ) -} diff --git a/service/ttl.go b/service/ttl.go deleted file mode 100644 index 28a5092..0000000 --- a/service/ttl.go +++ /dev/null @@ -1,63 +0,0 @@ -package service - -import ( - "github.com/pkg/errors" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" -) - -// TTL constants. -const ( - // ZeroTTL is an upper bound of invalid TTL values. - ZeroTTL = iota - - // NonForwardingTTL is a TTL value that does not imply a request forwarding. - NonForwardingTTL - - // SingleForwardingTTL is a TTL value that imply potential forwarding with NonForwardingTTL. - SingleForwardingTTL -) - -// SetTTL is a TTL field setter. -func (m *RequestMetaHeader) SetTTL(v uint32) { - m.TTL = v -} - -// IRNonForwarding condition that allows NonForwardingTTL only for IR. -func IRNonForwarding(role NodeRole) TTLCondition { - return func(ttl uint32) error { - if ttl == NonForwardingTTL && role != InnerRingNode { - return ErrInvalidTTL - } - - return nil - } -} - -// ProcessRequestTTL validates and updates requests with TTL. -func ProcessRequestTTL(req TTLContainer, cond ...TTLCondition) error { - ttl := req.GetTTL() - - if ttl == ZeroTTL { - return status.New(codes.InvalidArgument, ErrInvalidTTL.Error()).Err() - } - - for i := range cond { - if cond[i] == nil { - continue - } - - // check specific condition: - if err := cond[i](ttl); err != nil { - if st, ok := status.FromError(errors.Cause(err)); ok { - return st.Err() - } - - return status.New(codes.InvalidArgument, err.Error()).Err() - } - } - - req.SetTTL(ttl - 1) - - return nil -} diff --git a/service/ttl_test.go b/service/ttl_test.go deleted file mode 100644 index 1c982f5..0000000 --- a/service/ttl_test.go +++ /dev/null @@ -1,99 +0,0 @@ -package service - -import ( - "testing" - - "github.com/pkg/errors" - "github.com/stretchr/testify/require" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" -) - -type mockedRequest struct { - msg string - name string - code codes.Code - handler TTLCondition - RequestMetaHeader -} - -func TestMetaRequest(t *testing.T) { - tests := []mockedRequest{ - { - name: "direct to ir node", - handler: IRNonForwarding(InnerRingNode), - RequestMetaHeader: RequestMetaHeader{TTL: NonForwardingTTL}, - }, - { - code: codes.InvalidArgument, - msg: ErrInvalidTTL.Error(), - name: "direct to storage node", - handler: IRNonForwarding(StorageNode), - RequestMetaHeader: RequestMetaHeader{TTL: NonForwardingTTL}, - }, - { - msg: ErrInvalidTTL.Error(), - code: codes.InvalidArgument, - name: "zero ttl", - handler: IRNonForwarding(StorageNode), - RequestMetaHeader: RequestMetaHeader{TTL: ZeroTTL}, - }, - { - name: "default to ir node", - handler: IRNonForwarding(InnerRingNode), - RequestMetaHeader: RequestMetaHeader{TTL: SingleForwardingTTL}, - }, - { - name: "default to storage node", - handler: IRNonForwarding(StorageNode), - RequestMetaHeader: RequestMetaHeader{TTL: SingleForwardingTTL}, - }, - { - msg: "not found", - code: codes.NotFound, - name: "custom status error", - RequestMetaHeader: RequestMetaHeader{TTL: SingleForwardingTTL}, - handler: func(_ uint32) error { return status.Error(codes.NotFound, "not found") }, - }, - { - msg: "not found", - code: codes.NotFound, - name: "custom wrapped status error", - RequestMetaHeader: RequestMetaHeader{TTL: SingleForwardingTTL}, - handler: func(_ uint32) error { - err := status.Error(codes.NotFound, "not found") - err = errors.Wrap(err, "some error context") - err = errors.Wrap(err, "another error context") - return err - }, - }, - } - - for i := range tests { - tt := tests[i] - t.Run(tt.name, func(t *testing.T) { - before := tt.GetTTL() - err := ProcessRequestTTL(&tt, tt.handler) - if tt.msg != "" { - require.Errorf(t, err, tt.msg) - - state, ok := status.FromError(err) - require.True(t, ok) - require.Equal(t, tt.code, state.Code()) - require.Equal(t, tt.msg, state.Message()) - } else { - require.NoError(t, err) - require.NotEqualf(t, before, tt.GetTTL(), "ttl should be changed: %d vs %d", before, tt.GetTTL()) - } - }) - } -} - -func TestRequestMetaHeader_SetTTL(t *testing.T) { - m := new(RequestMetaHeader) - ttl := uint32(3) - - m.SetTTL(ttl) - - require.Equal(t, ttl, m.GetTTL()) -} diff --git a/service/types.go b/service/types.go deleted file mode 100644 index 785a30a..0000000 --- a/service/types.go +++ /dev/null @@ -1,317 +0,0 @@ -package service - -import ( - "crypto/ecdsa" -) - -// NodeRole to identify in Bootstrap service. -type NodeRole int32 - -// TTLCondition is a function type that used to verify that TTL values match a specific criterion. -// Nil error indicates compliance with the criterion. -type TTLCondition func(uint32) error - -// RawSource is an interface of the container of a boolean Raw value with read access. -type RawSource interface { - GetRaw() bool -} - -// RawContainer is an interface of the container of a boolean Raw value. -type RawContainer interface { - RawSource - SetRaw(bool) -} - -// VersionSource is an interface of the container of a numerical Version value with read access. -type VersionSource interface { - GetVersion() uint32 -} - -// VersionContainer is an interface of the container of a numerical Version value. -type VersionContainer interface { - VersionSource - SetVersion(uint32) -} - -// EpochSource is an interface of the container of a NeoFS epoch number with read access. -type EpochSource interface { - GetEpoch() uint64 -} - -// EpochContainer is an interface of the container of a NeoFS epoch number. -type EpochContainer interface { - EpochSource - SetEpoch(uint64) -} - -// TTLSource is an interface of the container of a numerical TTL value with read access. -type TTLSource interface { - GetTTL() uint32 -} - -// TTLContainer is an interface of the container of a numerical TTL value. -type TTLContainer interface { - TTLSource - SetTTL(uint32) -} - -// SeizedMetaHeaderContainer is an interface of container of RequestMetaHeader that can be cut and restored. -type SeizedMetaHeaderContainer interface { - CutMeta() RequestMetaHeader - RestoreMeta(RequestMetaHeader) -} - -// RequestMetaContainer is an interface of a fixed set of request meta value containers. -// Contains: -// - TTL value; -// - NeoFS epoch number; -// - Protocol version; -// - Raw toggle option. -type RequestMetaContainer interface { - TTLContainer - EpochContainer - VersionContainer - RawContainer -} - -// SeizedRequestMetaContainer is a RequestMetaContainer with seized meta. -type SeizedRequestMetaContainer interface { - RequestMetaContainer - SeizedMetaHeaderContainer -} - -// VerbSource is an interface of the container of a token verb value with read access. -type VerbSource interface { - GetVerb() Token_Info_Verb -} - -// VerbContainer is an interface of the container of a token verb value. -type VerbContainer interface { - VerbSource - SetVerb(Token_Info_Verb) -} - -// TokenIDSource is an interface of the container of a token ID value with read access. -type TokenIDSource interface { - GetID() TokenID -} - -// TokenIDContainer is an interface of the container of a token ID value. -type TokenIDContainer interface { - TokenIDSource - SetID(TokenID) -} - -// CreationEpochSource is an interface of the container of a creation epoch number with read access. -type CreationEpochSource interface { - CreationEpoch() uint64 -} - -// CreationEpochContainer is an interface of the container of a creation epoch number. -type CreationEpochContainer interface { - CreationEpochSource - SetCreationEpoch(uint64) -} - -// ExpirationEpochSource is an interface of the container of an expiration epoch number with read access. -type ExpirationEpochSource interface { - ExpirationEpoch() uint64 -} - -// ExpirationEpochContainer is an interface of the container of an expiration epoch number. -type ExpirationEpochContainer interface { - ExpirationEpochSource - SetExpirationEpoch(uint64) -} - -// LifetimeSource is an interface of the container of creation-expiration epoch pair with read access. -type LifetimeSource interface { - CreationEpochSource - ExpirationEpochSource -} - -// LifetimeContainer is an interface of the container of creation-expiration epoch pair. -type LifetimeContainer interface { - CreationEpochContainer - ExpirationEpochContainer -} - -// SessionKeySource is an interface of the container of session key bytes with read access. -type SessionKeySource interface { - GetSessionKey() []byte -} - -// SessionKeyContainer is an interface of the container of public session key bytes. -type SessionKeyContainer interface { - SessionKeySource - SetSessionKey([]byte) -} - -// SignatureSource is an interface of the container of signature bytes with read access. -type SignatureSource interface { - GetSignature() []byte -} - -// SignatureContainer is an interface of the container of signature bytes. -type SignatureContainer interface { - SignatureSource - SetSignature([]byte) -} - -// OwnerKeySource is an interface of the container of owner key bytes with read access. -type OwnerKeySource interface { - GetOwnerKey() []byte -} - -// OwnerKeyContainer is an interface of the container of owner key bytes. -type OwnerKeyContainer interface { - OwnerKeySource - SetOwnerKey([]byte) -} - -// SessionTokenSource is an interface of the container of a SessionToken with read access. -type SessionTokenSource interface { - GetSessionToken() SessionToken -} - -// SessionTokenInfo is an interface of a fixed set of token information value containers. -// Contains: -// - ID of the token; -// - ID of the token's owner; -// - verb of the session; -// - address of the session object; -// - token lifetime; -// - public session key bytes; -// - owner's public key bytes. -type SessionTokenInfo interface { - TokenIDContainer - OwnerIDContainer - VerbContainer - AddressContainer - LifetimeContainer - SessionKeyContainer - OwnerKeyContainer -} - -// SessionToken is an interface of token information and signature pair. -type SessionToken interface { - SessionTokenInfo - SignatureContainer -} - -// SignedDataSource is an interface of the container of a data for signing. -type SignedDataSource interface { - // Must return the required for signature byte slice. - // A non-nil error indicates that the data is not ready for signature. - SignedData() ([]byte, error) -} - -// SignedDataReader is an interface of signed data reader. -type SignedDataReader interface { - // Must return the minimum length of the slice for full reading. - // Must return a negative value if the length cannot be calculated. - SignedDataSize() int - - // Must behave like Read method of io.Reader and differ only in the reading of the signed data. - ReadSignedData([]byte) (int, error) -} - -// SignKeyPairAccumulator is an interface of a set of key-signature pairs with append access. -type SignKeyPairAccumulator interface { - AddSignKey([]byte, *ecdsa.PublicKey) -} - -// SignKeyPairSource is an interface of a set of key-signature pairs with read access. -type SignKeyPairSource interface { - GetSignKeyPairs() []SignKeyPair -} - -// SignKeyPair is an interface of key-signature pair with read access. -type SignKeyPair interface { - SignatureSource - GetPublicKey() *ecdsa.PublicKey -} - -// DataWithSignature is an interface of data-signature pair with read access. -type DataWithSignature interface { - SignedDataSource - SignatureSource -} - -// DataWithSignKeyAccumulator is an interface of data and key-signature accumulator pair. -type DataWithSignKeyAccumulator interface { - SignedDataSource - SignKeyPairAccumulator -} - -// DataWithSignKeySource is an interface of data and key-signature source pair. -type DataWithSignKeySource interface { - SignedDataSource - SignKeyPairSource -} - -// RequestData is an interface of the request information with read access. -type RequestData interface { - SignedDataSource - SessionTokenSource - BearerTokenSource - ExtendedHeadersSource -} - -// RequestSignedData is an interface of request information with signature write access. -type RequestSignedData interface { - RequestData - SignKeyPairAccumulator - SignKeyPairSource -} - -// RequestVerifyData is an interface of request information with signature read access. -type RequestVerifyData interface { - RequestData - SignKeyPairSource -} - -// ACLRulesSource is an interface of the container of binary extended ACL rules with read access. -type ACLRulesSource interface { - GetACLRules() []byte -} - -// ACLRulesContainer is an interface of the container of binary extended ACL rules. -type ACLRulesContainer interface { - ACLRulesSource - SetACLRules([]byte) -} - -// BearerTokenInfo is an interface of a fixed set of Bearer token information value containers. -// Contains: -// - binary extended ACL rules; -// - expiration epoch number; -// - ID of the token's owner. -type BearerTokenInfo interface { - ACLRulesContainer - ExpirationEpochContainer - OwnerIDContainer -} - -// BearerToken is an interface of Bearer token information and key-signature pair. -type BearerToken interface { - BearerTokenInfo - OwnerKeyContainer - SignatureContainer -} - -// BearerTokenSource is an interface of the container of a BearerToken with read access. -type BearerTokenSource interface { - GetBearerToken() BearerToken -} - -// ExtendedHeader is an interface of string key-value pair with read access. -type ExtendedHeader interface { - Key() string - Value() string -} - -// ExtendedHeadersSource is an interface of ExtendedHeader list with read access. -type ExtendedHeadersSource interface { - ExtendedHeaders() []ExtendedHeader -} diff --git a/service/utils.go b/service/utils.go deleted file mode 100644 index 17b23bb..0000000 --- a/service/utils.go +++ /dev/null @@ -1,18 +0,0 @@ -package service - -// SignedDataFromReader allocates buffer and reads bytes from passed reader to it. -// -// If passed SignedDataReader is nil, ErrNilSignedDataReader returns. -func SignedDataFromReader(r SignedDataReader) ([]byte, error) { - if r == nil { - return nil, ErrNilSignedDataReader - } - - data := make([]byte, r.SignedDataSize()) - - if _, err := r.ReadSignedData(data); err != nil { - return nil, err - } - - return data, nil -} diff --git a/service/utils_test.go b/service/utils_test.go deleted file mode 100644 index 60a2352..0000000 --- a/service/utils_test.go +++ /dev/null @@ -1,34 +0,0 @@ -package service - -import ( - "testing" - - "github.com/pkg/errors" - "github.com/stretchr/testify/require" -) - -func TestSignedDataFromReader(t *testing.T) { - // nil SignedDataReader - _, err := SignedDataFromReader(nil) - require.EqualError(t, err, ErrNilSignedDataReader.Error()) - - rdr := &testSignedDataReader{ - testSignedDataSrc: new(testSignedDataSrc), - } - - // make reader to return an error - rdr.err = errors.New("test error") - - _, err = SignedDataFromReader(rdr) - require.EqualError(t, err, rdr.err.Error()) - - // remove the error - rdr.err = nil - - // fill the data - rdr.data = testData(t, 10) - - res, err := SignedDataFromReader(rdr) - require.NoError(t, err) - require.Equal(t, rdr.data, res) -} diff --git a/service/verify.go b/service/verify.go deleted file mode 100644 index 2aca7cb..0000000 --- a/service/verify.go +++ /dev/null @@ -1,174 +0,0 @@ -package service - -import ( - "crypto/ecdsa" - "io" - - "github.com/gogo/protobuf/proto" - "github.com/nspcc-dev/neofs-api-go/internal" - crypto "github.com/nspcc-dev/neofs-crypto" -) - -type signKeyPairsWrapper struct { - items []SignKeyPair -} - -// GetSessionToken returns SessionToken interface of Token field. -// -// If token field value is nil, nil returns. -func (m RequestVerificationHeader) GetSessionToken() SessionToken { - if t := m.GetToken(); t != nil { - return t - } - - return nil -} - -// AddSignKey adds new element to Signatures field. -// -// Sets Sign field to passed sign. Set Peer field to marshaled passed key. -func (m *RequestVerificationHeader) AddSignKey(sign []byte, key *ecdsa.PublicKey) { - m.SetSignatures( - append( - m.GetSignatures(), - &RequestVerificationHeader_Signature{ - Sign: sign, - Peer: crypto.MarshalPublicKey(key), - }, - ), - ) -} - -// GetSignKeyPairs returns the elements of Signatures field as SignKeyPair slice. -func (m RequestVerificationHeader) GetSignKeyPairs() []SignKeyPair { - var ( - signs = m.GetSignatures() - res = make([]SignKeyPair, len(signs)) - ) - - for i := range signs { - res[i] = signs[i] - } - - return res -} - -// GetSignature returns the result of a Sign field getter. -func (m RequestVerificationHeader_Signature) GetSignature() []byte { - return m.GetSign() -} - -// GetPublicKey unmarshals and returns the result of a Peer field getter. -func (m RequestVerificationHeader_Signature) GetPublicKey() *ecdsa.PublicKey { - return crypto.UnmarshalPublicKey(m.GetPeer()) -} - -// SetSignatures replaces signatures stored in RequestVerificationHeader. -func (m *RequestVerificationHeader) SetSignatures(signatures []*RequestVerificationHeader_Signature) { - m.Signatures = signatures -} - -// SetToken is a Token field setter. -func (m *RequestVerificationHeader) SetToken(token *Token) { - m.Token = token -} - -// SetBearer is a Bearer field setter. -func (m *RequestVerificationHeader) SetBearer(v *BearerTokenMsg) { - m.Bearer = v -} - -// testCustomField for test usage only. -type testCustomField [8]uint32 - -var _ internal.Custom = (*testCustomField)(nil) - -// Reset skip, it's for test usage only. -func (t testCustomField) Reset() {} - -// ProtoMessage skip, it's for test usage only. -func (t testCustomField) ProtoMessage() {} - -// Size skip, it's for test usage only. -func (t testCustomField) Size() int { return 32 } - -// String skip, it's for test usage only. -func (t testCustomField) String() string { return "" } - -// Bytes skip, it's for test usage only. -func (t testCustomField) Bytes() []byte { return nil } - -// Unmarshal skip, it's for test usage only. -func (t testCustomField) Unmarshal(data []byte) error { return nil } - -// Empty skip, it's for test usage only. -func (t testCustomField) Empty() bool { return false } - -// UnmarshalTo skip, it's for test usage only. -func (t testCustomField) MarshalTo(data []byte) (int, error) { return 0, nil } - -// Marshal skip, it's for test usage only. -func (t testCustomField) Marshal() ([]byte, error) { return nil, nil } - -// Merge used by proto.Clone -func (t *testCustomField) Merge(src proto.Message) { - if tmp, ok := src.(*testCustomField); ok { - *t = *tmp - } -} - -// GetBearerToken wraps Bearer field and return BearerToken interface. -// -// If Bearer field value is nil, nil returns. -func (m RequestVerificationHeader) GetBearerToken() BearerToken { - if t := m.GetBearer(); t != nil { - return t - } - - return nil -} - -// SignKeyPairsSignedData wraps passed SignKeyPair slice and returns SignedDataSource interface. -func SignKeyPairsSignedData(v ...SignKeyPair) SignedDataSource { - return &signKeyPairsWrapper{ - items: v, - } -} - -// SignedData returns signed SignKeyPair slice in a binary representation. -func (s signKeyPairsWrapper) SignedData() ([]byte, error) { - return SignedDataFromReader(s) -} - -// SignedDataSize returns the length of signed SignKeyPair slice. -func (s signKeyPairsWrapper) SignedDataSize() (sz int) { - for i := range s.items { - // add key length - sz += len( - crypto.MarshalPublicKey(s.items[i].GetPublicKey()), - ) - } - - return -} - -// ReadSignedData copies a binary representation of the signed SignKeyPair slice to passed buffer. -// -// If buffer length is less than required, io.ErrUnexpectedEOF returns. -func (s signKeyPairsWrapper) ReadSignedData(p []byte) (int, error) { - sz := s.SignedDataSize() - if len(p) < sz { - return 0, io.ErrUnexpectedEOF - } - - off := 0 - - for i := range s.items { - // copy public key bytes - off += copy(p[off:], crypto.MarshalPublicKey( - s.items[i].GetPublicKey(), - )) - } - - return off, nil -} diff --git a/service/verify.pb.go b/service/verify.pb.go deleted file mode 100644 index 02f3f39c2ef444cc1361ae9ac0ba34ff0b1d7ba6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55921 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 diff --git a/session/service.proto b/session/service.proto deleted file mode 100644 index b7eb0df..0000000 --- a/session/service.proto +++ /dev/null @@ -1,39 +0,0 @@ -syntax = "proto3"; -package session; -option go_package = "github.com/nspcc-dev/neofs-api-go/session"; -option csharp_namespace = "NeoFS.API.Session"; - -import "service/meta.proto"; -import "service/verify.proto"; -import "github.com/gogo/protobuf/gogoproto/gogo.proto"; - -option (gogoproto.stable_marshaler_all) = true; - - -service Session { - // Create opens new session between the client and the server - rpc Create (CreateRequest) returns (CreateResponse); -} - -// CreateRequest carries an information necessary for opening a session -message CreateRequest { - // OwnerID carries an identifier of a session initiator - bytes OwnerID = 1 [(gogoproto.nullable) = false, (gogoproto.customtype) = "OwnerID"]; - - // Lifetime carries a lifetime of the session - service.TokenLifetime Lifetime = 2 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; - - // RequestMetaHeader contains information about request meta headers (should be embedded into message) - service.RequestMetaHeader Meta = 98 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; - // RequestVerificationHeader is a set of signatures of every NeoFS Node that processed request (should be embedded into message) - service.RequestVerificationHeader Verify = 99 [(gogoproto.embed) = true, (gogoproto.nullable) = false]; -} - -// CreateResponse carries an information about the opened session -message CreateResponse { - // ID carries an identifier of session token - bytes ID = 1 [(gogoproto.customtype) = "TokenID", (gogoproto.nullable) = false]; - - // SessionKey carries a session public key - bytes SessionKey = 2; -} diff --git a/session/store.go b/session/store.go deleted file mode 100644 index fa33b7e..0000000 --- a/session/store.go +++ /dev/null @@ -1,64 +0,0 @@ -package session - -import ( - "sync" -) - -type mapTokenStore struct { - *sync.RWMutex - - tokens map[PrivateTokenKey]PrivateToken -} - -// NewMapTokenStore creates new PrivateTokenStore instance. -// -// The elements of the instance are stored in the map. -func NewMapTokenStore() PrivateTokenStore { - return &mapTokenStore{ - RWMutex: new(sync.RWMutex), - tokens: make(map[PrivateTokenKey]PrivateToken), - } -} - -// Store adds passed token to the map. -// -// Resulting error is always nil. -func (s *mapTokenStore) Store(key PrivateTokenKey, token PrivateToken) error { - s.Lock() - s.tokens[key] = token - s.Unlock() - - return nil -} - -// Fetch returns the map element corresponding to the given key. -// -// Returns ErrPrivateTokenNotFound is there is no element in map. -func (s *mapTokenStore) Fetch(key PrivateTokenKey) (PrivateToken, error) { - s.RLock() - defer s.RUnlock() - - t, ok := s.tokens[key] - if !ok { - return nil, ErrPrivateTokenNotFound - } - - return t, nil -} - -// RemoveExpired removes all the map elements that are expired in the passed epoch. -// -// Resulting error is always nil. -func (s *mapTokenStore) RemoveExpired(epoch uint64) error { - s.Lock() - - for key, token := range s.tokens { - if token.Expired(epoch) { - delete(s.tokens, key) - } - } - - s.Unlock() - - return nil -} diff --git a/session/store_test.go b/session/store_test.go deleted file mode 100644 index 74e0023..0000000 --- a/session/store_test.go +++ /dev/null @@ -1,111 +0,0 @@ -package session - -import ( - "testing" - - "github.com/nspcc-dev/neofs-api-go/refs" - "github.com/stretchr/testify/require" -) - -func TestMapTokenStore(t *testing.T) { - // create new private token - pToken, err := NewPrivateToken(0) - require.NoError(t, err) - - // create map token store - s := NewMapTokenStore() - - // create test TokenID - tid, err := refs.NewUUID() - require.NoError(t, err) - - // create test OwnerID - ownerID := OwnerID{1, 2, 3} - - key := PrivateTokenKey{} - key.SetOwnerID(ownerID) - key.SetTokenID(tid) - - // ascertain that there is no record for the key - _, err = s.Fetch(key) - require.EqualError(t, err, ErrPrivateTokenNotFound.Error()) - - // save private token record - require.NoError(t, s.Store(key, pToken)) - - // fetch private token by the key - res, err := s.Fetch(key) - require.NoError(t, err) - - // ascertain that returned token equals to initial - require.Equal(t, pToken, res) -} - -func TestMapTokenStore_RemoveExpired(t *testing.T) { - // create some epoch number - e1 := uint64(1) - - // create private token that expires after e1 - tok1, err := NewPrivateToken(e1) - require.NoError(t, err) - - // create some greater than e1 epoch number - e2 := e1 + 1 - - // create private token that expires after e2 - tok2, err := NewPrivateToken(e2) - require.NoError(t, err) - - // create token store instance - s := NewMapTokenStore() - - // create test PrivateTokenKey - key := PrivateTokenKey{} - key.SetOwnerID(OwnerID{1, 2, 3}) - - // create IDs for tokens - id1, err := refs.NewUUID() - require.NoError(t, err) - id2, err := refs.NewUUID() - require.NoError(t, err) - - assertPresence := func(ids ...TokenID) { - for i := range ids { - key.SetTokenID(ids[i]) - _, err = s.Fetch(key) - require.NoError(t, err) - } - } - - assertAbsence := func(ids ...TokenID) { - for i := range ids { - key.SetTokenID(ids[i]) - _, err = s.Fetch(key) - require.EqualError(t, err, ErrPrivateTokenNotFound.Error()) - } - } - - // store both tokens - key.SetTokenID(id1) - require.NoError(t, s.Store(key, tok1)) - key.SetTokenID(id2) - require.NoError(t, s.Store(key, tok2)) - - // ascertain that both tokens are available - assertPresence(id1, id2) - - // perform cleaning for epoch in which both tokens are not expired - require.NoError(t, s.RemoveExpired(e1)) - - // ascertain that both tokens are still available - assertPresence(id1, id2) - - // perform cleaning for epoch greater than e1 and not greater than e2 - require.NoError(t, s.RemoveExpired(e1+1)) - - // ascertain that tok1 was removed - assertAbsence(id1) - - // ascertain that tok2 was not removed - assertPresence(id2) -} diff --git a/session/types.go b/session/types.go deleted file mode 100644 index 95a0065..0000000 --- a/session/types.go +++ /dev/null @@ -1,80 +0,0 @@ -package session - -import ( - "context" - "crypto/ecdsa" - - "github.com/nspcc-dev/neofs-api-go/refs" - "github.com/nspcc-dev/neofs-api-go/service" -) - -// PrivateToken is an interface of session private part. -type PrivateToken interface { - // PrivateKey must return session private key. - PrivateKey() *ecdsa.PrivateKey - - // Expired must return true if and only if private token is expired in the given epoch number. - Expired(uint64) bool -} - -// PrivateTokenKey is a structure of private token storage key. -type PrivateTokenKey struct { - owner OwnerID - token TokenID -} - -// PrivateTokenSource is an interface of private token storage with read access. -type PrivateTokenSource interface { - // Fetch must return the storage record corresponding to the passed key. - // - // Resulting error must be ErrPrivateTokenNotFound if there is no corresponding record. - Fetch(PrivateTokenKey) (PrivateToken, error) -} - -// EpochLifetimeStore is an interface of the storage of elements that lifetime is limited by NeoFS epoch. -type EpochLifetimeStore interface { - // RemoveExpired must remove all elements that are expired in the given epoch. - RemoveExpired(uint64) error -} - -// PrivateTokenStore is an interface of the storage of private tokens addressable by TokenID. -type PrivateTokenStore interface { - PrivateTokenSource - EpochLifetimeStore - - // Store must save passed private token in the storage under the given key. - // - // Resulting error must be nil if private token was stored successfully. - Store(PrivateTokenKey, PrivateToken) error -} - -// KeyStore is an interface of the storage of public keys addressable by OwnerID, -type KeyStore interface { - // Get must return the storage record corresponding to the passed key. - // - // Resulting error must be ErrKeyNotFound if there is no corresponding record. - Get(context.Context, OwnerID) ([]*ecdsa.PublicKey, error) -} - -// CreateParamsSource is an interface of the container of session parameters with read access. -type CreateParamsSource interface { - refs.OwnerIDSource - service.LifetimeSource -} - -// CreateParamsContainer is an interface of the container of session parameters. -type CreateParamsContainer interface { - refs.OwnerIDContainer - service.LifetimeContainer -} - -// CreateResult is an interface of the container of an opened session info with read access. -type CreateResult interface { - service.TokenIDSource - service.SessionKeySource -} - -// Creator is an interface of the tool for a session opening. -type Creator interface { - Create(context.Context, CreateParamsSource) (CreateResult, error) -} diff --git a/state/service.go b/state/service.go deleted file mode 100644 index 577046c..0000000 --- a/state/service.go +++ /dev/null @@ -1,88 +0,0 @@ -package state - -import ( - "bytes" - "encoding/json" - "expvar" - "fmt" - - "github.com/golang/protobuf/proto" - "github.com/prometheus/client_golang/prometheus" - dto "github.com/prometheus/client_model/go" - "github.com/spf13/viper" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" -) - -// MetricFamily is type alias for proto.Message generated -// from github.com/prometheus/client_model/metrics.proto. -type MetricFamily = dto.MetricFamily - -// EncodeMetrics encodes metrics from gatherer into MetricsResponse message, -// if something went wrong returns gRPC Status error (can be returned from service). -func EncodeMetrics(g prometheus.Gatherer) (*MetricsResponse, error) { - metrics, err := g.Gather() - if err != nil { - return nil, status.New(codes.Internal, err.Error()).Err() - } - - results := make([][]byte, 0, len(metrics)) - for _, mf := range metrics { - item, err := proto.Marshal(mf) - if err != nil { - return nil, status.New(codes.Internal, err.Error()).Err() - } - - results = append(results, item) - } - - return &MetricsResponse{Metrics: results}, nil -} - -// DecodeMetrics decodes metrics from MetricsResponse to []MetricFamily, -// if something went wrong returns error. -func DecodeMetrics(r *MetricsResponse) ([]*MetricFamily, error) { - metrics := make([]*dto.MetricFamily, 0, len(r.Metrics)) - for i := range r.Metrics { - mf := new(MetricFamily) - if err := proto.Unmarshal(r.Metrics[i], mf); err != nil { - return nil, err - } - metrics = append(metrics, mf) - } - - return metrics, nil -} - -// EncodeConfig encodes viper settings into DumpConfig message, -// if something went wrong returns gRPC Status error (can be returned from service). -func EncodeConfig(v *viper.Viper) (*DumpResponse, error) { - data, err := json.Marshal(v.AllSettings()) - if err != nil { - return nil, status.Error(codes.Internal, err.Error()) - } - - return &DumpResponse{Config: data}, nil -} - -// EncodeVariables encodes debug variables into DumpVarsResponse message. -// Variables encoded into JSON and stored as slice of bytes. -func EncodeVariables() *DumpVarsResponse { - buf := new(bytes.Buffer) - buf.WriteString("{\n") - first := true - - expvar.Do(func(kv expvar.KeyValue) { - if !first { - buf.WriteString(",\n") - } - - first = false - - _, _ = fmt.Fprintf(buf, "%q: %s", kv.Key, kv.Value) - }) - - buf.WriteString("\n}\n") - - return &DumpVarsResponse{Variables: buf.Bytes()} -} diff --git a/state/service.pb.go b/state/service.pb.go deleted file mode 100644 index 187949bb3d221ca977353c12963e8d9f5680dc54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75369 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 k;>&m(B-gw!%Cs}1KdalBX7@$~a)naT') - return b.String() -} - -// Empty checks if storage group has some data for validation. -func (m StorageGroup) Empty() bool { - return m.ValidationDataSize == 0 && m.ValidationHash.Equal(hash.Hash{}) -} - -// Len returns amount of object ids in IDList. -func (s IDList) Len() int { return len(s) } - -// Less returns byte comparision between IDList[i] and IDList[j]. -func (s IDList) Less(i, j int) bool { return bytes.Compare(s[i].Bytes(), s[j].Bytes()) == -1 } - -// Swap swaps element with i and j index in IDList. -func (s IDList) Swap(i, j int) { s[i], s[j] = s[j], s[i] } - -// CalculateSize combines length of all zones in storage group. -func CalculateSize(sg Provider) (size uint64) { - zoneList := sg.Zones() - for i := range zoneList { - size += zoneList[i].Size - } - return -} - -// CalculateHash returns homomorphic sum of hashes -// fromm all zones in storage group. -func CalculateHash(sg Provider) (hash.Hash, error) { - var ( - zones = sg.Zones() - hashes = make([]hash.Hash, len(zones)) - ) - for i := range zones { - hashes[i] = zones[i].Hash - } - return hash.Concat(hashes) -} diff --git a/storagegroup/types.pb.go b/storagegroup/types.pb.go deleted file mode 100644 index fa4b24867f7eaa0d0e99e956f214868f05e06b5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17704 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 bdye9;G}^JA$z}OCg^w2SlkMVpLa+UQEsxyL diff --git a/storagegroup/types.proto b/storagegroup/types.proto deleted file mode 100644 index fde33aa..0000000 --- a/storagegroup/types.proto +++ /dev/null @@ -1,36 +0,0 @@ -syntax = "proto3"; -package storagegroup; -option go_package = "github.com/nspcc-dev/neofs-api-go/storagegroup"; -option csharp_namespace = "NeoFS.API.StorageGroup"; - -import "github.com/gogo/protobuf/gogoproto/gogo.proto"; - -option (gogoproto.stable_marshaler_all) = true; - -message StorageGroup { - option (gogoproto.goproto_stringer) = false; - - // ValidationDataSize is size of the all object's payloads included into storage group - uint64 ValidationDataSize = 1; - // ValidationHash is homomorphic hash of all object's payloads included into storage group - bytes ValidationHash = 2 [(gogoproto.customtype) = "Hash", (gogoproto.nullable) = false]; - - message Lifetime { - enum Unit { - // Unlimited set if storage group always valid - Unlimited = 0; - // NeoFSEpoch set if storage group is valid until lifetime NeoFS epoch - NeoFSEpoch = 1; - // UnixTime set if storage group is valid until lifetime unix timestamp - UnixTime = 2; - } - - // Unit is lifetime type - Unit unit = 1 [(gogoproto.customname) = "Unit"]; - // Value for lifetime - int64 Value = 2; - } - - // Lifetime is time until storage group is valid - Lifetime lifetime = 3 [(gogoproto.customname) = "Lifetime"]; -}