mirror of
https://github.com/anyproto/anytype-heart.git
synced 2025-06-07 21:37:04 +09:00
49 lines
1.1 KiB
Go
49 lines
1.1 KiB
Go
package space
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/anyproto/any-sync/util/crypto"
|
|
|
|
"github.com/anyproto/anytype-heart/pkg/lib/pb/model"
|
|
)
|
|
|
|
const anytypeMetadataPath = "m/SLIP-0021/anytype/account/metadata"
|
|
|
|
var deriveMetadata = DeriveAccountMetadata
|
|
|
|
func DeriveAccountMetadata(acc crypto.PrivKey) (*model.Metadata, crypto.SymKey, error) {
|
|
symKey, err := deriveAccountEncKey(acc)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
symKeyProto, err := symKey.Marshall()
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
return &model.Metadata{
|
|
Payload: &model.MetadataPayloadOfIdentity{
|
|
Identity: &model.MetadataPayloadIdentityPayload{
|
|
ProfileSymKey: symKeyProto,
|
|
},
|
|
},
|
|
}, symKey, nil
|
|
}
|
|
|
|
func deriveAccountEncKey(accKey crypto.PrivKey) (crypto.SymKey, error) {
|
|
raw, err := accKey.Raw()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return crypto.DeriveSymmetricKey(raw, anytypeMetadataPath)
|
|
}
|
|
|
|
func getRepKey(spaceId string) (uint64, error) {
|
|
sepIdx := strings.Index(spaceId, ".")
|
|
if sepIdx == -1 {
|
|
return 0, fmt.Errorf("space id is incorrect")
|
|
}
|
|
return strconv.ParseUint(spaceId[sepIdx+1:], 36, 64)
|
|
}
|