1
0
Fork 0
mirror of https://github.com/anyproto/any-sync.git synced 2025-06-08 05:57:03 +09:00
any-sync/coordinator/coordinatorproto/deleteconfirm.go

116 lines
3 KiB
Go

package coordinatorproto
import (
"bytes"
"time"
"github.com/anyproto/any-sync/util/crypto"
)
func PrepareDeleteConfirmation(privKey crypto.PrivKey, spaceId, peerId, networkId string) (signed *DeletionConfirmPayloadWithSignature, err error) {
marshalledIdentity, err := privKey.GetPublic().Marshall()
if err != nil {
return
}
deleteConfirm := &DeletionConfirmPayload{
SpaceId: spaceId,
PeerId: peerId,
AccountIdentity: marshalledIdentity,
NetworkId: networkId,
Timestamp: time.Now().Unix(),
}
marshalledDeleteConfirm, err := deleteConfirm.Marshal()
if err != nil {
return
}
signature, err := privKey.Sign(marshalledDeleteConfirm)
if err != nil {
return
}
signed = &DeletionConfirmPayloadWithSignature{
DeletionPayload: marshalledDeleteConfirm,
Signature: signature,
}
return
}
func PrepareAccountDeleteConfirmation(privKey crypto.PrivKey, peerId, networkId string) (signed *DeletionConfirmPayloadWithSignature, err error) {
marshalledIdentity, err := privKey.GetPublic().Marshall()
if err != nil {
return
}
deleteConfirm := &AccountDeletionConfirmPayload{
PeerId: peerId,
AccountIdentity: marshalledIdentity,
NetworkId: networkId,
Timestamp: time.Now().Unix(),
}
marshalledDeleteConfirm, err := deleteConfirm.Marshal()
if err != nil {
return
}
signature, err := privKey.Sign(marshalledDeleteConfirm)
if err != nil {
return
}
signed = &DeletionConfirmPayloadWithSignature{
DeletionPayload: marshalledDeleteConfirm,
Signature: signature,
}
return
}
func ValidateAccountDeleteConfirmation(pubKey crypto.PubKey, spaceId, networkId string, deleteConfirm *DeletionConfirmPayloadWithSignature) (err error) {
res, err := pubKey.Verify(deleteConfirm.GetDeletionPayload(), deleteConfirm.GetSignature())
if err != nil {
return
}
if !res {
return errSignatureIncorrect
}
payload := &AccountDeletionConfirmPayload{}
err = payload.Unmarshal(deleteConfirm.GetDeletionPayload())
if err != nil {
return
}
if payload.NetworkId != networkId {
return errNetworkIsIncorrect
}
accountRaw, err := crypto.UnmarshalEd25519PublicKeyProto(payload.AccountIdentity)
if err != nil {
return
}
if !bytes.Equal(pubKey.Storage(), accountRaw.Storage()) {
return errAccountIncorrect
}
return
}
func ValidateDeleteConfirmation(pubKey crypto.PubKey, spaceId, networkId string, deleteConfirm *DeletionConfirmPayloadWithSignature) (err error) {
res, err := pubKey.Verify(deleteConfirm.GetDeletionPayload(), deleteConfirm.GetSignature())
if err != nil {
return
}
if !res {
return errSignatureIncorrect
}
payload := &DeletionConfirmPayload{}
err = payload.Unmarshal(deleteConfirm.GetDeletionPayload())
if err != nil {
return
}
if payload.SpaceId != spaceId {
return errSpaceIdIncorrect
}
if payload.NetworkId != networkId {
return errNetworkIsIncorrect
}
accountRaw, err := crypto.UnmarshalEd25519PublicKeyProto(payload.AccountIdentity)
if err != nil {
return
}
if !bytes.Equal(pubKey.Storage(), accountRaw.Storage()) {
return errAccountIncorrect
}
return
}