diff --git a/signet.go b/signet.go index 4913f19..367abf4 100644 --- a/signet.go +++ b/signet.go @@ -7,9 +7,11 @@ import ( "io" "time" + "github.com/mr-tron/base58" uuid "github.com/satori/go.uuid" "github.com/safing/jess/tools" + "github.com/safing/portbase/formats/dsd" ) // Special signet types. @@ -249,3 +251,60 @@ func (signet *Signet) AssignUUID() error { signet.ID = u.String() return nil } + +// ToBytes serializes the Signet to a byte slice. +func (signet *Signet) ToBytes() ([]byte, error) { + // Make sure the key is stored in the serializable format. + if err := signet.StoreKey(); err != nil { + return nil, fmt.Errorf("failed to serialize the key: %w", err) + } + + // Serialize Signet. + data, err := dsd.Dump(signet, dsd.CBOR) + if err != nil { + return nil, fmt.Errorf("failed to serialize the signet: %w", err) + } + + return data, nil +} + +// SignetFromBytes parses and loads a serialized signet. +func SignetFromBytes(data []byte) (*Signet, error) { + signet := &Signet{} + + // Parse Signet from data. + if _, err := dsd.Load(data, signet); err != nil { + return nil, fmt.Errorf("failed to parse data format: %w", err) + } + + // Load the key. + if err := signet.LoadKey(); err != nil { + return nil, fmt.Errorf("failed to parse key: %w", err) + } + + return signet, nil +} + +// ToBase58 serializes the signet and encodes it with base58. +func (signet *Signet) ToBase58() (string, error) { + // Serialize Signet. + data, err := signet.ToBytes() + if err != nil { + return "", err + } + + // Encode and return. + return base58.Encode(data), nil +} + +// SignetFromBase58 parses and loads a base58 encoded serialized signet. +func SignetFromBase58(base58Encoded string) (*Signet, error) { + // Decode string. + data, err := base58.Decode(base58Encoded) + if err != nil { + return nil, fmt.Errorf("failed to decode base58: %w", err) + } + + // Parse and return. + return SignetFromBytes(data) +}