Step 19: Encryption CLI, slot management, proto updates.

CLI: sgard encrypt init [--fido2], add-fido2 [--label], remove-slot,
list-slots, change-passphrase. sgard add --encrypt flag with
passphrase prompt for DEK unlock.

Garden: RemoveSlot (refuses last slot), ListSlots, ChangePassphrase
(re-wraps DEK with new passphrase, fresh salt).

Proto: ManifestEntry gains encrypted + plaintext_hash fields. New
KekSlot and Encryption messages. Manifest gains encryption field.

server/convert.go: full round-trip conversion for encryption section
including KekSlot map.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-24 09:25:20 -07:00
parent 5bb65795c8
commit 76a53320c1
8 changed files with 661 additions and 125 deletions

View File

@@ -7,7 +7,7 @@ ARCHITECTURE.md for design details.
## Current Status ## Current Status
**Phase:** Phase 3 in progress. Steps 1718 complete, ready for Step 19. **Phase:** Phase 3 in progress. Steps 1719 complete, ready for Step 20.
**Last updated:** 2026-03-24 **Last updated:** 2026-03-24
@@ -42,7 +42,7 @@ ARCHITECTURE.md for design details.
## Up Next ## Up Next
Step 19: Encryption CLI + Slot Management. Step 20: Encryption Polish + Release.
## Known Issues / Decisions Deferred ## Known Issues / Decisions Deferred
@@ -80,3 +80,4 @@ Step 19: Encryption CLI + Slot Management.
| 2026-03-24 | — | Phase 3 encryption design: selective per-file encryption, KEK slots (passphrase + fido2/label), manifest-embedded config. | | 2026-03-24 | — | Phase 3 encryption design: selective per-file encryption, KEK slots (passphrase + fido2/label), manifest-embedded config. |
| 2026-03-24 | 17 | Encryption core: Argon2id KEK, XChaCha20 DEK wrap/unwrap, selective per-file encrypt in Add/Checkpoint/Restore/Diff/Status. 10 tests. | | 2026-03-24 | 17 | Encryption core: Argon2id KEK, XChaCha20 DEK wrap/unwrap, selective per-file encrypt in Add/Checkpoint/Restore/Diff/Status. 10 tests. |
| 2026-03-24 | 18 | FIDO2: FIDO2Device interface, AddFIDO2Slot, unlock resolution (fido2 first → passphrase fallback), mock device, 6 tests. | | 2026-03-24 | 18 | FIDO2: FIDO2Device interface, AddFIDO2Slot, unlock resolution (fido2 first → passphrase fallback), mock device, 6 tests. |
| 2026-03-24 | 19 | Encryption CLI: encrypt init/add-fido2/remove-slot/list-slots/change-passphrase, --encrypt on add, proto + convert updates. |

View File

@@ -206,15 +206,12 @@ Depends on Step 17.
Depends on Steps 17, 18. Depends on Steps 17, 18.
- [ ] `cmd/sgard/encrypt.go`: `sgard encrypt init [--fido2]` — creates DEK + passphrase slot (+ FIDO2 slot if --fido2) - [x] `cmd/sgard/encrypt.go`: `sgard encrypt init [--fido2]`, `add-fido2 [--label]`, `remove-slot`, `list-slots`, `change-passphrase`
- [ ] `cmd/sgard/encrypt.go`: `sgard encrypt add-fido2 [--label]` — adds FIDO2 slot - [x] `garden/encrypt.go`: `RemoveSlot`, `ListSlots`, `ChangePassphrase` methods
- [ ] `cmd/sgard/encrypt.go`: `sgard encrypt remove-slot <name>` — removes a slot (refuse if it's the last one) - [x] `cmd/sgard/add.go`: add `--encrypt` flag with passphrase prompt
- [ ] `cmd/sgard/encrypt.go`: `sgard encrypt list-slots` — print slot names and types - [x] Update proto: add `encrypted`, `plaintext_hash` to ManifestEntry; add KekSlot, Encryption messages, encryption field on Manifest
- [ ] `cmd/sgard/encrypt.go`: `sgard encrypt change-passphrase` — re-wrap DEK with new passphrase - [x] Update `server/convert.go`: full encryption section conversion (Encryption, KekSlot)
- [ ] `cmd/sgard/add.go`: add `--encrypt` flag - [x] Verify: both binaries compile, `go test ./...`, lint clean
- [ ] Update proto: add `encrypted`, `plaintext_hash` to ManifestEntry; add encryption section to Manifest message
- [ ] Update `server/convert.go`: handle new fields in proto conversion
- [ ] Verify: both binaries compile, `go test ./...`
### Step 20: Encryption Polish + Release ### Step 20: Encryption Polish + Release

View File

@@ -1,12 +1,17 @@
package main package main
import ( import (
"bufio"
"fmt" "fmt"
"os"
"strings"
"github.com/kisom/sgard/garden" "github.com/kisom/sgard/garden"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
var encryptFlag bool
var addCmd = &cobra.Command{ var addCmd = &cobra.Command{
Use: "add <path>...", Use: "add <path>...",
Short: "Track files, directories, or symlinks", Short: "Track files, directories, or symlinks",
@@ -17,7 +22,16 @@ var addCmd = &cobra.Command{
return err return err
} }
if err := g.Add(args); err != nil { if encryptFlag {
if !g.HasEncryption() {
return fmt.Errorf("encryption not initialized; run sgard encrypt init first")
}
if err := g.UnlockDEK(promptPassphrase); err != nil {
return err
}
}
if err := g.Add(args, encryptFlag); err != nil {
return err return err
} }
@@ -26,6 +40,16 @@ var addCmd = &cobra.Command{
}, },
} }
func promptPassphrase() (string, error) {
fmt.Fprint(os.Stderr, "Passphrase: ")
scanner := bufio.NewScanner(os.Stdin)
if scanner.Scan() {
return strings.TrimSpace(scanner.Text()), nil
}
return "", fmt.Errorf("no passphrase provided")
}
func init() { func init() {
addCmd.Flags().BoolVar(&encryptFlag, "encrypt", false, "encrypt file contents before storing")
rootCmd.AddCommand(addCmd) rootCmd.AddCommand(addCmd)
} }

166
cmd/sgard/encrypt.go Normal file
View File

@@ -0,0 +1,166 @@
package main
import (
"fmt"
"sort"
"github.com/kisom/sgard/garden"
"github.com/spf13/cobra"
)
var encryptCmd = &cobra.Command{
Use: "encrypt",
Short: "Manage encryption keys and slots",
}
var fido2InitFlag bool
var encryptInitCmd = &cobra.Command{
Use: "init",
Short: "Initialize encryption (creates DEK and passphrase slot)",
RunE: func(cmd *cobra.Command, args []string) error {
g, err := garden.Open(repoFlag)
if err != nil {
return err
}
passphrase, err := promptPassphrase()
if err != nil {
return err
}
if err := g.EncryptInit(passphrase); err != nil {
return err
}
fmt.Println("Encryption initialized with passphrase slot.")
if fido2InitFlag {
fmt.Println("FIDO2 support requires a hardware device implementation.")
fmt.Println("Run 'sgard encrypt add-fido2' when a FIDO2 device is available.")
}
return nil
},
}
var fido2LabelFlag string
var addFido2Cmd = &cobra.Command{
Use: "add-fido2",
Short: "Add a FIDO2 KEK slot",
RunE: func(cmd *cobra.Command, args []string) error {
g, err := garden.Open(repoFlag)
if err != nil {
return err
}
if !g.HasEncryption() {
return fmt.Errorf("encryption not initialized; run sgard encrypt init first")
}
if err := g.UnlockDEK(promptPassphrase); err != nil {
return err
}
// Real FIDO2 device implementation would go here.
// For now, this is a placeholder that explains the requirement.
return fmt.Errorf("FIDO2 hardware support not yet implemented; requires libfido2 binding")
},
}
var removeSlotCmd = &cobra.Command{
Use: "remove-slot <name>",
Short: "Remove a KEK slot",
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
g, err := garden.Open(repoFlag)
if err != nil {
return err
}
if err := g.RemoveSlot(args[0]); err != nil {
return err
}
fmt.Printf("Removed slot %q.\n", args[0])
return nil
},
}
var listSlotsCmd = &cobra.Command{
Use: "list-slots",
Short: "List all KEK slots",
RunE: func(cmd *cobra.Command, args []string) error {
g, err := garden.Open(repoFlag)
if err != nil {
return err
}
slots := g.ListSlots()
if len(slots) == 0 {
fmt.Println("No encryption configured.")
return nil
}
// Sort for consistent output.
names := make([]string, 0, len(slots))
for name := range slots {
names = append(names, name)
}
sort.Strings(names)
for _, name := range names {
fmt.Printf("%-30s %s\n", name, slots[name])
}
return nil
},
}
var changePassphraseCmd = &cobra.Command{
Use: "change-passphrase",
Short: "Change the passphrase for the passphrase KEK slot",
RunE: func(cmd *cobra.Command, args []string) error {
g, err := garden.Open(repoFlag)
if err != nil {
return err
}
if !g.HasEncryption() {
return fmt.Errorf("encryption not initialized")
}
// Unlock with current passphrase.
fmt.Println("Enter current passphrase:")
if err := g.UnlockDEK(promptPassphrase); err != nil {
return err
}
// Get new passphrase.
fmt.Println("Enter new passphrase:")
newPassphrase, err := promptPassphrase()
if err != nil {
return err
}
if err := g.ChangePassphrase(newPassphrase); err != nil {
return err
}
fmt.Println("Passphrase changed.")
return nil
},
}
func init() {
encryptInitCmd.Flags().BoolVar(&fido2InitFlag, "fido2", false, "also set up FIDO2 (placeholder)")
addFido2Cmd.Flags().StringVar(&fido2LabelFlag, "label", "", "slot label (default: fido2/<hostname>)")
encryptCmd.AddCommand(encryptInitCmd)
encryptCmd.AddCommand(addFido2Cmd)
encryptCmd.AddCommand(removeSlotCmd)
encryptCmd.AddCommand(listSlotsCmd)
encryptCmd.AddCommand(changePassphraseCmd)
rootCmd.AddCommand(encryptCmd)
}

View File

@@ -135,6 +135,84 @@ func (g *Garden) HasEncryption() bool {
return g.manifest.Encryption != nil return g.manifest.Encryption != nil
} }
// RemoveSlot removes a KEK slot by name. Refuses to remove the last slot.
func (g *Garden) RemoveSlot(name string) error {
enc := g.manifest.Encryption
if enc == nil {
return fmt.Errorf("encryption not initialized")
}
if _, ok := enc.KekSlots[name]; !ok {
return fmt.Errorf("slot %q not found", name)
}
if len(enc.KekSlots) <= 1 {
return fmt.Errorf("cannot remove the last KEK slot")
}
delete(enc.KekSlots, name)
if err := g.manifest.Save(g.manifestPath); err != nil {
return fmt.Errorf("saving manifest: %w", err)
}
return nil
}
// ListSlots returns the slot names and types.
func (g *Garden) ListSlots() map[string]string {
enc := g.manifest.Encryption
if enc == nil {
return nil
}
result := make(map[string]string, len(enc.KekSlots))
for name, slot := range enc.KekSlots {
result[name] = slot.Type
}
return result
}
// ChangePassphrase re-wraps the DEK with a new passphrase. The DEK must
// already be unlocked.
func (g *Garden) ChangePassphrase(newPassphrase string) error {
if g.dek == nil {
return fmt.Errorf("DEK not unlocked")
}
enc := g.manifest.Encryption
if enc == nil {
return fmt.Errorf("encryption not initialized")
}
slot, ok := enc.KekSlots["passphrase"]
if !ok {
return fmt.Errorf("no passphrase slot to change")
}
// Generate new salt.
salt := make([]byte, saltSize)
if _, err := rand.Read(salt); err != nil {
return fmt.Errorf("generating salt: %w", err)
}
kek := derivePassphraseKEK(newPassphrase, salt, slot.Argon2Time, slot.Argon2Memory, slot.Argon2Threads)
wrappedDEK, err := wrapDEK(g.dek, kek)
if err != nil {
return fmt.Errorf("wrapping DEK: %w", err)
}
slot.Salt = base64.StdEncoding.EncodeToString(salt)
slot.WrappedDEK = base64.StdEncoding.EncodeToString(wrappedDEK)
if err := g.manifest.Save(g.manifestPath); err != nil {
return fmt.Errorf("saving manifest: %w", err)
}
return nil
}
// NeedsDEK reports whether any of the given entries are encrypted. // NeedsDEK reports whether any of the given entries are encrypted.
func (g *Garden) NeedsDEK(entries []manifest.Entry) bool { func (g *Garden) NeedsDEK(entries []manifest.Entry) bool {
for _, e := range entries { for _, e := range entries {

View File

@@ -14,6 +14,25 @@ message ManifestEntry {
string mode = 4; string mode = 4;
string target = 5; string target = 5;
google.protobuf.Timestamp updated = 6; google.protobuf.Timestamp updated = 6;
string plaintext_hash = 7; // SHA-256 of plaintext (encrypted entries only)
bool encrypted = 8;
}
// KekSlot describes a single KEK source for unwrapping the DEK.
message KekSlot {
string type = 1; // "passphrase" or "fido2"
int32 argon2_time = 2;
int32 argon2_memory = 3; // KiB
int32 argon2_threads = 4;
string credential_id = 5; // base64, fido2 only
string salt = 6; // base64
string wrapped_dek = 7; // base64
}
// Encryption holds the encryption configuration.
message Encryption {
string algorithm = 1;
map<string, KekSlot> kek_slots = 2;
} }
// Manifest mirrors the top-level manifest.Manifest. // Manifest mirrors the top-level manifest.Manifest.
@@ -23,6 +42,7 @@ message Manifest {
google.protobuf.Timestamp updated = 3; google.protobuf.Timestamp updated = 3;
string message = 4; string message = 4;
repeated ManifestEntry files = 5; repeated ManifestEntry files = 5;
Encryption encryption = 6;
} }
// BlobChunk is one piece of a streamed blob. The first chunk for a given // BlobChunk is one piece of a streamed blob. The first chunk for a given

View File

@@ -12,13 +12,17 @@ func ManifestToProto(m *manifest.Manifest) *sgardpb.Manifest {
for i, e := range m.Files { for i, e := range m.Files {
files[i] = EntryToProto(e) files[i] = EntryToProto(e)
} }
return &sgardpb.Manifest{ pb := &sgardpb.Manifest{
Version: int32(m.Version), Version: int32(m.Version),
Created: timestamppb.New(m.Created), Created: timestamppb.New(m.Created),
Updated: timestamppb.New(m.Updated), Updated: timestamppb.New(m.Updated),
Message: m.Message, Message: m.Message,
Files: files, Files: files,
} }
if m.Encryption != nil {
pb.Encryption = EncryptionToProto(m.Encryption)
}
return pb
} }
// ProtoToManifest converts a protobuf Manifest to a manifest.Manifest. // ProtoToManifest converts a protobuf Manifest to a manifest.Manifest.
@@ -28,13 +32,17 @@ func ProtoToManifest(p *sgardpb.Manifest) *manifest.Manifest {
for i, e := range pFiles { for i, e := range pFiles {
files[i] = ProtoToEntry(e) files[i] = ProtoToEntry(e)
} }
return &manifest.Manifest{ m := &manifest.Manifest{
Version: int(p.GetVersion()), Version: int(p.GetVersion()),
Created: p.GetCreated().AsTime(), Created: p.GetCreated().AsTime(),
Updated: p.GetUpdated().AsTime(), Updated: p.GetUpdated().AsTime(),
Message: p.GetMessage(), Message: p.GetMessage(),
Files: files, Files: files,
} }
if p.GetEncryption() != nil {
m.Encryption = ProtoToEncryption(p.GetEncryption())
}
return m
} }
// EntryToProto converts a manifest.Entry to its protobuf representation. // EntryToProto converts a manifest.Entry to its protobuf representation.
@@ -46,6 +54,8 @@ func EntryToProto(e manifest.Entry) *sgardpb.ManifestEntry {
Mode: e.Mode, Mode: e.Mode,
Target: e.Target, Target: e.Target,
Updated: timestamppb.New(e.Updated), Updated: timestamppb.New(e.Updated),
PlaintextHash: e.PlaintextHash,
Encrypted: e.Encrypted,
} }
} }
@@ -58,5 +68,47 @@ func ProtoToEntry(p *sgardpb.ManifestEntry) manifest.Entry {
Mode: p.GetMode(), Mode: p.GetMode(),
Target: p.GetTarget(), Target: p.GetTarget(),
Updated: p.GetUpdated().AsTime(), Updated: p.GetUpdated().AsTime(),
PlaintextHash: p.GetPlaintextHash(),
Encrypted: p.GetEncrypted(),
}
}
// EncryptionToProto converts a manifest.Encryption to its protobuf representation.
func EncryptionToProto(e *manifest.Encryption) *sgardpb.Encryption {
slots := make(map[string]*sgardpb.KekSlot, len(e.KekSlots))
for name, slot := range e.KekSlots {
slots[name] = &sgardpb.KekSlot{
Type: slot.Type,
Argon2Time: int32(slot.Argon2Time),
Argon2Memory: int32(slot.Argon2Memory),
Argon2Threads: int32(slot.Argon2Threads),
CredentialId: slot.CredentialID,
Salt: slot.Salt,
WrappedDek: slot.WrappedDEK,
}
}
return &sgardpb.Encryption{
Algorithm: e.Algorithm,
KekSlots: slots,
}
}
// ProtoToEncryption converts a protobuf Encryption to a manifest.Encryption.
func ProtoToEncryption(p *sgardpb.Encryption) *manifest.Encryption {
slots := make(map[string]*manifest.KekSlot, len(p.GetKekSlots()))
for name, slot := range p.GetKekSlots() {
slots[name] = &manifest.KekSlot{
Type: slot.GetType(),
Argon2Time: int(slot.GetArgon2Time()),
Argon2Memory: int(slot.GetArgon2Memory()),
Argon2Threads: int(slot.GetArgon2Threads()),
CredentialID: slot.GetCredentialId(),
Salt: slot.GetSalt(),
WrappedDEK: slot.GetWrappedDek(),
}
}
return &manifest.Encryption{
Algorithm: p.GetAlgorithm(),
KekSlots: slots,
} }
} }

View File

@@ -71,7 +71,7 @@ func (x PushManifestResponse_Decision) Number() protoreflect.EnumNumber {
// Deprecated: Use PushManifestResponse_Decision.Descriptor instead. // Deprecated: Use PushManifestResponse_Decision.Descriptor instead.
func (PushManifestResponse_Decision) EnumDescriptor() ([]byte, []int) { func (PushManifestResponse_Decision) EnumDescriptor() ([]byte, []int) {
return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{4, 0} return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{6, 0}
} }
// ManifestEntry mirrors manifest.Entry from the YAML model. // ManifestEntry mirrors manifest.Entry from the YAML model.
@@ -83,6 +83,8 @@ type ManifestEntry struct {
Mode string `protobuf:"bytes,4,opt,name=mode,proto3" json:"mode,omitempty"` Mode string `protobuf:"bytes,4,opt,name=mode,proto3" json:"mode,omitempty"`
Target string `protobuf:"bytes,5,opt,name=target,proto3" json:"target,omitempty"` Target string `protobuf:"bytes,5,opt,name=target,proto3" json:"target,omitempty"`
Updated *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=updated,proto3" json:"updated,omitempty"` Updated *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=updated,proto3" json:"updated,omitempty"`
PlaintextHash string `protobuf:"bytes,7,opt,name=plaintext_hash,json=plaintextHash,proto3" json:"plaintext_hash,omitempty"` // SHA-256 of plaintext (encrypted entries only)
Encrypted bool `protobuf:"varint,8,opt,name=encrypted,proto3" json:"encrypted,omitempty"`
unknownFields protoimpl.UnknownFields unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
} }
@@ -159,6 +161,166 @@ func (x *ManifestEntry) GetUpdated() *timestamppb.Timestamp {
return nil return nil
} }
func (x *ManifestEntry) GetPlaintextHash() string {
if x != nil {
return x.PlaintextHash
}
return ""
}
func (x *ManifestEntry) GetEncrypted() bool {
if x != nil {
return x.Encrypted
}
return false
}
// KekSlot describes a single KEK source for unwrapping the DEK.
type KekSlot struct {
state protoimpl.MessageState `protogen:"open.v1"`
Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` // "passphrase" or "fido2"
Argon2Time int32 `protobuf:"varint,2,opt,name=argon2_time,json=argon2Time,proto3" json:"argon2_time,omitempty"`
Argon2Memory int32 `protobuf:"varint,3,opt,name=argon2_memory,json=argon2Memory,proto3" json:"argon2_memory,omitempty"` // KiB
Argon2Threads int32 `protobuf:"varint,4,opt,name=argon2_threads,json=argon2Threads,proto3" json:"argon2_threads,omitempty"`
CredentialId string `protobuf:"bytes,5,opt,name=credential_id,json=credentialId,proto3" json:"credential_id,omitempty"` // base64, fido2 only
Salt string `protobuf:"bytes,6,opt,name=salt,proto3" json:"salt,omitempty"` // base64
WrappedDek string `protobuf:"bytes,7,opt,name=wrapped_dek,json=wrappedDek,proto3" json:"wrapped_dek,omitempty"` // base64
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *KekSlot) Reset() {
*x = KekSlot{}
mi := &file_sgard_v1_sgard_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *KekSlot) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*KekSlot) ProtoMessage() {}
func (x *KekSlot) ProtoReflect() protoreflect.Message {
mi := &file_sgard_v1_sgard_proto_msgTypes[1]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use KekSlot.ProtoReflect.Descriptor instead.
func (*KekSlot) Descriptor() ([]byte, []int) {
return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{1}
}
func (x *KekSlot) GetType() string {
if x != nil {
return x.Type
}
return ""
}
func (x *KekSlot) GetArgon2Time() int32 {
if x != nil {
return x.Argon2Time
}
return 0
}
func (x *KekSlot) GetArgon2Memory() int32 {
if x != nil {
return x.Argon2Memory
}
return 0
}
func (x *KekSlot) GetArgon2Threads() int32 {
if x != nil {
return x.Argon2Threads
}
return 0
}
func (x *KekSlot) GetCredentialId() string {
if x != nil {
return x.CredentialId
}
return ""
}
func (x *KekSlot) GetSalt() string {
if x != nil {
return x.Salt
}
return ""
}
func (x *KekSlot) GetWrappedDek() string {
if x != nil {
return x.WrappedDek
}
return ""
}
// Encryption holds the encryption configuration.
type Encryption struct {
state protoimpl.MessageState `protogen:"open.v1"`
Algorithm string `protobuf:"bytes,1,opt,name=algorithm,proto3" json:"algorithm,omitempty"`
KekSlots map[string]*KekSlot `protobuf:"bytes,2,rep,name=kek_slots,json=kekSlots,proto3" json:"kek_slots,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *Encryption) Reset() {
*x = Encryption{}
mi := &file_sgard_v1_sgard_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *Encryption) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Encryption) ProtoMessage() {}
func (x *Encryption) ProtoReflect() protoreflect.Message {
mi := &file_sgard_v1_sgard_proto_msgTypes[2]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use Encryption.ProtoReflect.Descriptor instead.
func (*Encryption) Descriptor() ([]byte, []int) {
return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{2}
}
func (x *Encryption) GetAlgorithm() string {
if x != nil {
return x.Algorithm
}
return ""
}
func (x *Encryption) GetKekSlots() map[string]*KekSlot {
if x != nil {
return x.KekSlots
}
return nil
}
// Manifest mirrors the top-level manifest.Manifest. // Manifest mirrors the top-level manifest.Manifest.
type Manifest struct { type Manifest struct {
state protoimpl.MessageState `protogen:"open.v1"` state protoimpl.MessageState `protogen:"open.v1"`
@@ -167,13 +329,14 @@ type Manifest struct {
Updated *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=updated,proto3" json:"updated,omitempty"` Updated *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=updated,proto3" json:"updated,omitempty"`
Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"`
Files []*ManifestEntry `protobuf:"bytes,5,rep,name=files,proto3" json:"files,omitempty"` Files []*ManifestEntry `protobuf:"bytes,5,rep,name=files,proto3" json:"files,omitempty"`
Encryption *Encryption `protobuf:"bytes,6,opt,name=encryption,proto3" json:"encryption,omitempty"`
unknownFields protoimpl.UnknownFields unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
} }
func (x *Manifest) Reset() { func (x *Manifest) Reset() {
*x = Manifest{} *x = Manifest{}
mi := &file_sgard_v1_sgard_proto_msgTypes[1] mi := &file_sgard_v1_sgard_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@@ -185,7 +348,7 @@ func (x *Manifest) String() string {
func (*Manifest) ProtoMessage() {} func (*Manifest) ProtoMessage() {}
func (x *Manifest) ProtoReflect() protoreflect.Message { func (x *Manifest) ProtoReflect() protoreflect.Message {
mi := &file_sgard_v1_sgard_proto_msgTypes[1] mi := &file_sgard_v1_sgard_proto_msgTypes[3]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@@ -198,7 +361,7 @@ func (x *Manifest) ProtoReflect() protoreflect.Message {
// Deprecated: Use Manifest.ProtoReflect.Descriptor instead. // Deprecated: Use Manifest.ProtoReflect.Descriptor instead.
func (*Manifest) Descriptor() ([]byte, []int) { func (*Manifest) Descriptor() ([]byte, []int) {
return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{1} return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{3}
} }
func (x *Manifest) GetVersion() int32 { func (x *Manifest) GetVersion() int32 {
@@ -236,6 +399,13 @@ func (x *Manifest) GetFiles() []*ManifestEntry {
return nil return nil
} }
func (x *Manifest) GetEncryption() *Encryption {
if x != nil {
return x.Encryption
}
return nil
}
// BlobChunk is one piece of a streamed blob. The first chunk for a given // BlobChunk is one piece of a streamed blob. The first chunk for a given
// hash carries the hash field; subsequent chunks omit it. // hash carries the hash field; subsequent chunks omit it.
type BlobChunk struct { type BlobChunk struct {
@@ -248,7 +418,7 @@ type BlobChunk struct {
func (x *BlobChunk) Reset() { func (x *BlobChunk) Reset() {
*x = BlobChunk{} *x = BlobChunk{}
mi := &file_sgard_v1_sgard_proto_msgTypes[2] mi := &file_sgard_v1_sgard_proto_msgTypes[4]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@@ -260,7 +430,7 @@ func (x *BlobChunk) String() string {
func (*BlobChunk) ProtoMessage() {} func (*BlobChunk) ProtoMessage() {}
func (x *BlobChunk) ProtoReflect() protoreflect.Message { func (x *BlobChunk) ProtoReflect() protoreflect.Message {
mi := &file_sgard_v1_sgard_proto_msgTypes[2] mi := &file_sgard_v1_sgard_proto_msgTypes[4]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@@ -273,7 +443,7 @@ func (x *BlobChunk) ProtoReflect() protoreflect.Message {
// Deprecated: Use BlobChunk.ProtoReflect.Descriptor instead. // Deprecated: Use BlobChunk.ProtoReflect.Descriptor instead.
func (*BlobChunk) Descriptor() ([]byte, []int) { func (*BlobChunk) Descriptor() ([]byte, []int) {
return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{2} return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{4}
} }
func (x *BlobChunk) GetHash() string { func (x *BlobChunk) GetHash() string {
@@ -299,7 +469,7 @@ type PushManifestRequest struct {
func (x *PushManifestRequest) Reset() { func (x *PushManifestRequest) Reset() {
*x = PushManifestRequest{} *x = PushManifestRequest{}
mi := &file_sgard_v1_sgard_proto_msgTypes[3] mi := &file_sgard_v1_sgard_proto_msgTypes[5]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@@ -311,7 +481,7 @@ func (x *PushManifestRequest) String() string {
func (*PushManifestRequest) ProtoMessage() {} func (*PushManifestRequest) ProtoMessage() {}
func (x *PushManifestRequest) ProtoReflect() protoreflect.Message { func (x *PushManifestRequest) ProtoReflect() protoreflect.Message {
mi := &file_sgard_v1_sgard_proto_msgTypes[3] mi := &file_sgard_v1_sgard_proto_msgTypes[5]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@@ -324,7 +494,7 @@ func (x *PushManifestRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use PushManifestRequest.ProtoReflect.Descriptor instead. // Deprecated: Use PushManifestRequest.ProtoReflect.Descriptor instead.
func (*PushManifestRequest) Descriptor() ([]byte, []int) { func (*PushManifestRequest) Descriptor() ([]byte, []int) {
return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{3} return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{5}
} }
func (x *PushManifestRequest) GetManifest() *Manifest { func (x *PushManifestRequest) GetManifest() *Manifest {
@@ -345,7 +515,7 @@ type PushManifestResponse struct {
func (x *PushManifestResponse) Reset() { func (x *PushManifestResponse) Reset() {
*x = PushManifestResponse{} *x = PushManifestResponse{}
mi := &file_sgard_v1_sgard_proto_msgTypes[4] mi := &file_sgard_v1_sgard_proto_msgTypes[6]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@@ -357,7 +527,7 @@ func (x *PushManifestResponse) String() string {
func (*PushManifestResponse) ProtoMessage() {} func (*PushManifestResponse) ProtoMessage() {}
func (x *PushManifestResponse) ProtoReflect() protoreflect.Message { func (x *PushManifestResponse) ProtoReflect() protoreflect.Message {
mi := &file_sgard_v1_sgard_proto_msgTypes[4] mi := &file_sgard_v1_sgard_proto_msgTypes[6]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@@ -370,7 +540,7 @@ func (x *PushManifestResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use PushManifestResponse.ProtoReflect.Descriptor instead. // Deprecated: Use PushManifestResponse.ProtoReflect.Descriptor instead.
func (*PushManifestResponse) Descriptor() ([]byte, []int) { func (*PushManifestResponse) Descriptor() ([]byte, []int) {
return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{4} return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{6}
} }
func (x *PushManifestResponse) GetDecision() PushManifestResponse_Decision { func (x *PushManifestResponse) GetDecision() PushManifestResponse_Decision {
@@ -403,7 +573,7 @@ type PushBlobsRequest struct {
func (x *PushBlobsRequest) Reset() { func (x *PushBlobsRequest) Reset() {
*x = PushBlobsRequest{} *x = PushBlobsRequest{}
mi := &file_sgard_v1_sgard_proto_msgTypes[5] mi := &file_sgard_v1_sgard_proto_msgTypes[7]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@@ -415,7 +585,7 @@ func (x *PushBlobsRequest) String() string {
func (*PushBlobsRequest) ProtoMessage() {} func (*PushBlobsRequest) ProtoMessage() {}
func (x *PushBlobsRequest) ProtoReflect() protoreflect.Message { func (x *PushBlobsRequest) ProtoReflect() protoreflect.Message {
mi := &file_sgard_v1_sgard_proto_msgTypes[5] mi := &file_sgard_v1_sgard_proto_msgTypes[7]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@@ -428,7 +598,7 @@ func (x *PushBlobsRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use PushBlobsRequest.ProtoReflect.Descriptor instead. // Deprecated: Use PushBlobsRequest.ProtoReflect.Descriptor instead.
func (*PushBlobsRequest) Descriptor() ([]byte, []int) { func (*PushBlobsRequest) Descriptor() ([]byte, []int) {
return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{5} return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{7}
} }
func (x *PushBlobsRequest) GetChunk() *BlobChunk { func (x *PushBlobsRequest) GetChunk() *BlobChunk {
@@ -447,7 +617,7 @@ type PushBlobsResponse struct {
func (x *PushBlobsResponse) Reset() { func (x *PushBlobsResponse) Reset() {
*x = PushBlobsResponse{} *x = PushBlobsResponse{}
mi := &file_sgard_v1_sgard_proto_msgTypes[6] mi := &file_sgard_v1_sgard_proto_msgTypes[8]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@@ -459,7 +629,7 @@ func (x *PushBlobsResponse) String() string {
func (*PushBlobsResponse) ProtoMessage() {} func (*PushBlobsResponse) ProtoMessage() {}
func (x *PushBlobsResponse) ProtoReflect() protoreflect.Message { func (x *PushBlobsResponse) ProtoReflect() protoreflect.Message {
mi := &file_sgard_v1_sgard_proto_msgTypes[6] mi := &file_sgard_v1_sgard_proto_msgTypes[8]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@@ -472,7 +642,7 @@ func (x *PushBlobsResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use PushBlobsResponse.ProtoReflect.Descriptor instead. // Deprecated: Use PushBlobsResponse.ProtoReflect.Descriptor instead.
func (*PushBlobsResponse) Descriptor() ([]byte, []int) { func (*PushBlobsResponse) Descriptor() ([]byte, []int) {
return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{6} return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{8}
} }
func (x *PushBlobsResponse) GetBlobsReceived() int32 { func (x *PushBlobsResponse) GetBlobsReceived() int32 {
@@ -490,7 +660,7 @@ type PullManifestRequest struct {
func (x *PullManifestRequest) Reset() { func (x *PullManifestRequest) Reset() {
*x = PullManifestRequest{} *x = PullManifestRequest{}
mi := &file_sgard_v1_sgard_proto_msgTypes[7] mi := &file_sgard_v1_sgard_proto_msgTypes[9]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@@ -502,7 +672,7 @@ func (x *PullManifestRequest) String() string {
func (*PullManifestRequest) ProtoMessage() {} func (*PullManifestRequest) ProtoMessage() {}
func (x *PullManifestRequest) ProtoReflect() protoreflect.Message { func (x *PullManifestRequest) ProtoReflect() protoreflect.Message {
mi := &file_sgard_v1_sgard_proto_msgTypes[7] mi := &file_sgard_v1_sgard_proto_msgTypes[9]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@@ -515,7 +685,7 @@ func (x *PullManifestRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use PullManifestRequest.ProtoReflect.Descriptor instead. // Deprecated: Use PullManifestRequest.ProtoReflect.Descriptor instead.
func (*PullManifestRequest) Descriptor() ([]byte, []int) { func (*PullManifestRequest) Descriptor() ([]byte, []int) {
return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{7} return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{9}
} }
type PullManifestResponse struct { type PullManifestResponse struct {
@@ -527,7 +697,7 @@ type PullManifestResponse struct {
func (x *PullManifestResponse) Reset() { func (x *PullManifestResponse) Reset() {
*x = PullManifestResponse{} *x = PullManifestResponse{}
mi := &file_sgard_v1_sgard_proto_msgTypes[8] mi := &file_sgard_v1_sgard_proto_msgTypes[10]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@@ -539,7 +709,7 @@ func (x *PullManifestResponse) String() string {
func (*PullManifestResponse) ProtoMessage() {} func (*PullManifestResponse) ProtoMessage() {}
func (x *PullManifestResponse) ProtoReflect() protoreflect.Message { func (x *PullManifestResponse) ProtoReflect() protoreflect.Message {
mi := &file_sgard_v1_sgard_proto_msgTypes[8] mi := &file_sgard_v1_sgard_proto_msgTypes[10]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@@ -552,7 +722,7 @@ func (x *PullManifestResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use PullManifestResponse.ProtoReflect.Descriptor instead. // Deprecated: Use PullManifestResponse.ProtoReflect.Descriptor instead.
func (*PullManifestResponse) Descriptor() ([]byte, []int) { func (*PullManifestResponse) Descriptor() ([]byte, []int) {
return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{8} return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{10}
} }
func (x *PullManifestResponse) GetManifest() *Manifest { func (x *PullManifestResponse) GetManifest() *Manifest {
@@ -571,7 +741,7 @@ type PullBlobsRequest struct {
func (x *PullBlobsRequest) Reset() { func (x *PullBlobsRequest) Reset() {
*x = PullBlobsRequest{} *x = PullBlobsRequest{}
mi := &file_sgard_v1_sgard_proto_msgTypes[9] mi := &file_sgard_v1_sgard_proto_msgTypes[11]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@@ -583,7 +753,7 @@ func (x *PullBlobsRequest) String() string {
func (*PullBlobsRequest) ProtoMessage() {} func (*PullBlobsRequest) ProtoMessage() {}
func (x *PullBlobsRequest) ProtoReflect() protoreflect.Message { func (x *PullBlobsRequest) ProtoReflect() protoreflect.Message {
mi := &file_sgard_v1_sgard_proto_msgTypes[9] mi := &file_sgard_v1_sgard_proto_msgTypes[11]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@@ -596,7 +766,7 @@ func (x *PullBlobsRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use PullBlobsRequest.ProtoReflect.Descriptor instead. // Deprecated: Use PullBlobsRequest.ProtoReflect.Descriptor instead.
func (*PullBlobsRequest) Descriptor() ([]byte, []int) { func (*PullBlobsRequest) Descriptor() ([]byte, []int) {
return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{9} return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{11}
} }
func (x *PullBlobsRequest) GetHashes() []string { func (x *PullBlobsRequest) GetHashes() []string {
@@ -615,7 +785,7 @@ type PullBlobsResponse struct {
func (x *PullBlobsResponse) Reset() { func (x *PullBlobsResponse) Reset() {
*x = PullBlobsResponse{} *x = PullBlobsResponse{}
mi := &file_sgard_v1_sgard_proto_msgTypes[10] mi := &file_sgard_v1_sgard_proto_msgTypes[12]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@@ -627,7 +797,7 @@ func (x *PullBlobsResponse) String() string {
func (*PullBlobsResponse) ProtoMessage() {} func (*PullBlobsResponse) ProtoMessage() {}
func (x *PullBlobsResponse) ProtoReflect() protoreflect.Message { func (x *PullBlobsResponse) ProtoReflect() protoreflect.Message {
mi := &file_sgard_v1_sgard_proto_msgTypes[10] mi := &file_sgard_v1_sgard_proto_msgTypes[12]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@@ -640,7 +810,7 @@ func (x *PullBlobsResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use PullBlobsResponse.ProtoReflect.Descriptor instead. // Deprecated: Use PullBlobsResponse.ProtoReflect.Descriptor instead.
func (*PullBlobsResponse) Descriptor() ([]byte, []int) { func (*PullBlobsResponse) Descriptor() ([]byte, []int) {
return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{10} return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{12}
} }
func (x *PullBlobsResponse) GetChunk() *BlobChunk { func (x *PullBlobsResponse) GetChunk() *BlobChunk {
@@ -658,7 +828,7 @@ type PruneRequest struct {
func (x *PruneRequest) Reset() { func (x *PruneRequest) Reset() {
*x = PruneRequest{} *x = PruneRequest{}
mi := &file_sgard_v1_sgard_proto_msgTypes[11] mi := &file_sgard_v1_sgard_proto_msgTypes[13]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@@ -670,7 +840,7 @@ func (x *PruneRequest) String() string {
func (*PruneRequest) ProtoMessage() {} func (*PruneRequest) ProtoMessage() {}
func (x *PruneRequest) ProtoReflect() protoreflect.Message { func (x *PruneRequest) ProtoReflect() protoreflect.Message {
mi := &file_sgard_v1_sgard_proto_msgTypes[11] mi := &file_sgard_v1_sgard_proto_msgTypes[13]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@@ -683,7 +853,7 @@ func (x *PruneRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use PruneRequest.ProtoReflect.Descriptor instead. // Deprecated: Use PruneRequest.ProtoReflect.Descriptor instead.
func (*PruneRequest) Descriptor() ([]byte, []int) { func (*PruneRequest) Descriptor() ([]byte, []int) {
return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{11} return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{13}
} }
type PruneResponse struct { type PruneResponse struct {
@@ -695,7 +865,7 @@ type PruneResponse struct {
func (x *PruneResponse) Reset() { func (x *PruneResponse) Reset() {
*x = PruneResponse{} *x = PruneResponse{}
mi := &file_sgard_v1_sgard_proto_msgTypes[12] mi := &file_sgard_v1_sgard_proto_msgTypes[14]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@@ -707,7 +877,7 @@ func (x *PruneResponse) String() string {
func (*PruneResponse) ProtoMessage() {} func (*PruneResponse) ProtoMessage() {}
func (x *PruneResponse) ProtoReflect() protoreflect.Message { func (x *PruneResponse) ProtoReflect() protoreflect.Message {
mi := &file_sgard_v1_sgard_proto_msgTypes[12] mi := &file_sgard_v1_sgard_proto_msgTypes[14]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@@ -720,7 +890,7 @@ func (x *PruneResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use PruneResponse.ProtoReflect.Descriptor instead. // Deprecated: Use PruneResponse.ProtoReflect.Descriptor instead.
func (*PruneResponse) Descriptor() ([]byte, []int) { func (*PruneResponse) Descriptor() ([]byte, []int) {
return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{12} return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{14}
} }
func (x *PruneResponse) GetBlobsRemoved() int32 { func (x *PruneResponse) GetBlobsRemoved() int32 {
@@ -742,7 +912,7 @@ type AuthenticateRequest struct {
func (x *AuthenticateRequest) Reset() { func (x *AuthenticateRequest) Reset() {
*x = AuthenticateRequest{} *x = AuthenticateRequest{}
mi := &file_sgard_v1_sgard_proto_msgTypes[13] mi := &file_sgard_v1_sgard_proto_msgTypes[15]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@@ -754,7 +924,7 @@ func (x *AuthenticateRequest) String() string {
func (*AuthenticateRequest) ProtoMessage() {} func (*AuthenticateRequest) ProtoMessage() {}
func (x *AuthenticateRequest) ProtoReflect() protoreflect.Message { func (x *AuthenticateRequest) ProtoReflect() protoreflect.Message {
mi := &file_sgard_v1_sgard_proto_msgTypes[13] mi := &file_sgard_v1_sgard_proto_msgTypes[15]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@@ -767,7 +937,7 @@ func (x *AuthenticateRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use AuthenticateRequest.ProtoReflect.Descriptor instead. // Deprecated: Use AuthenticateRequest.ProtoReflect.Descriptor instead.
func (*AuthenticateRequest) Descriptor() ([]byte, []int) { func (*AuthenticateRequest) Descriptor() ([]byte, []int) {
return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{13} return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{15}
} }
func (x *AuthenticateRequest) GetNonce() []byte { func (x *AuthenticateRequest) GetNonce() []byte {
@@ -807,7 +977,7 @@ type AuthenticateResponse struct {
func (x *AuthenticateResponse) Reset() { func (x *AuthenticateResponse) Reset() {
*x = AuthenticateResponse{} *x = AuthenticateResponse{}
mi := &file_sgard_v1_sgard_proto_msgTypes[14] mi := &file_sgard_v1_sgard_proto_msgTypes[16]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@@ -819,7 +989,7 @@ func (x *AuthenticateResponse) String() string {
func (*AuthenticateResponse) ProtoMessage() {} func (*AuthenticateResponse) ProtoMessage() {}
func (x *AuthenticateResponse) ProtoReflect() protoreflect.Message { func (x *AuthenticateResponse) ProtoReflect() protoreflect.Message {
mi := &file_sgard_v1_sgard_proto_msgTypes[14] mi := &file_sgard_v1_sgard_proto_msgTypes[16]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@@ -832,7 +1002,7 @@ func (x *AuthenticateResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use AuthenticateResponse.ProtoReflect.Descriptor instead. // Deprecated: Use AuthenticateResponse.ProtoReflect.Descriptor instead.
func (*AuthenticateResponse) Descriptor() ([]byte, []int) { func (*AuthenticateResponse) Descriptor() ([]byte, []int) {
return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{14} return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{16}
} }
func (x *AuthenticateResponse) GetToken() string { func (x *AuthenticateResponse) GetToken() string {
@@ -855,7 +1025,7 @@ type ReauthChallenge struct {
func (x *ReauthChallenge) Reset() { func (x *ReauthChallenge) Reset() {
*x = ReauthChallenge{} *x = ReauthChallenge{}
mi := &file_sgard_v1_sgard_proto_msgTypes[15] mi := &file_sgard_v1_sgard_proto_msgTypes[17]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@@ -867,7 +1037,7 @@ func (x *ReauthChallenge) String() string {
func (*ReauthChallenge) ProtoMessage() {} func (*ReauthChallenge) ProtoMessage() {}
func (x *ReauthChallenge) ProtoReflect() protoreflect.Message { func (x *ReauthChallenge) ProtoReflect() protoreflect.Message {
mi := &file_sgard_v1_sgard_proto_msgTypes[15] mi := &file_sgard_v1_sgard_proto_msgTypes[17]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@@ -880,7 +1050,7 @@ func (x *ReauthChallenge) ProtoReflect() protoreflect.Message {
// Deprecated: Use ReauthChallenge.ProtoReflect.Descriptor instead. // Deprecated: Use ReauthChallenge.ProtoReflect.Descriptor instead.
func (*ReauthChallenge) Descriptor() ([]byte, []int) { func (*ReauthChallenge) Descriptor() ([]byte, []int) {
return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{15} return file_sgard_v1_sgard_proto_rawDescGZIP(), []int{17}
} }
func (x *ReauthChallenge) GetNonce() []byte { func (x *ReauthChallenge) GetNonce() []byte {
@@ -901,20 +1071,42 @@ var File_sgard_v1_sgard_proto protoreflect.FileDescriptor
const file_sgard_v1_sgard_proto_rawDesc = "" + const file_sgard_v1_sgard_proto_rawDesc = "" +
"\n" + "\n" +
"\x14sgard/v1/sgard.proto\x12\bsgard.v1\x1a\x1fgoogle/protobuf/timestamp.proto\"\xad\x01\n" + "\x14sgard/v1/sgard.proto\x12\bsgard.v1\x1a\x1fgoogle/protobuf/timestamp.proto\"\xf2\x01\n" +
"\rManifestEntry\x12\x12\n" + "\rManifestEntry\x12\x12\n" +
"\x04path\x18\x01 \x01(\tR\x04path\x12\x12\n" + "\x04path\x18\x01 \x01(\tR\x04path\x12\x12\n" +
"\x04hash\x18\x02 \x01(\tR\x04hash\x12\x12\n" + "\x04hash\x18\x02 \x01(\tR\x04hash\x12\x12\n" +
"\x04type\x18\x03 \x01(\tR\x04type\x12\x12\n" + "\x04type\x18\x03 \x01(\tR\x04type\x12\x12\n" +
"\x04mode\x18\x04 \x01(\tR\x04mode\x12\x16\n" + "\x04mode\x18\x04 \x01(\tR\x04mode\x12\x16\n" +
"\x06target\x18\x05 \x01(\tR\x06target\x124\n" + "\x06target\x18\x05 \x01(\tR\x06target\x124\n" +
"\aupdated\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\aupdated\"\xd9\x01\n" + "\aupdated\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\aupdated\x12%\n" +
"\x0eplaintext_hash\x18\a \x01(\tR\rplaintextHash\x12\x1c\n" +
"\tencrypted\x18\b \x01(\bR\tencrypted\"\xe4\x01\n" +
"\aKekSlot\x12\x12\n" +
"\x04type\x18\x01 \x01(\tR\x04type\x12\x1f\n" +
"\vargon2_time\x18\x02 \x01(\x05R\n" +
"argon2Time\x12#\n" +
"\rargon2_memory\x18\x03 \x01(\x05R\fargon2Memory\x12%\n" +
"\x0eargon2_threads\x18\x04 \x01(\x05R\rargon2Threads\x12#\n" +
"\rcredential_id\x18\x05 \x01(\tR\fcredentialId\x12\x12\n" +
"\x04salt\x18\x06 \x01(\tR\x04salt\x12\x1f\n" +
"\vwrapped_dek\x18\a \x01(\tR\n" +
"wrappedDek\"\xbb\x01\n" +
"\n" +
"Encryption\x12\x1c\n" +
"\talgorithm\x18\x01 \x01(\tR\talgorithm\x12?\n" +
"\tkek_slots\x18\x02 \x03(\v2\".sgard.v1.Encryption.KekSlotsEntryR\bkekSlots\x1aN\n" +
"\rKekSlotsEntry\x12\x10\n" +
"\x03key\x18\x01 \x01(\tR\x03key\x12'\n" +
"\x05value\x18\x02 \x01(\v2\x11.sgard.v1.KekSlotR\x05value:\x028\x01\"\x8f\x02\n" +
"\bManifest\x12\x18\n" + "\bManifest\x12\x18\n" +
"\aversion\x18\x01 \x01(\x05R\aversion\x124\n" + "\aversion\x18\x01 \x01(\x05R\aversion\x124\n" +
"\acreated\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\acreated\x124\n" + "\acreated\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\acreated\x124\n" +
"\aupdated\x18\x03 \x01(\v2\x1a.google.protobuf.TimestampR\aupdated\x12\x18\n" + "\aupdated\x18\x03 \x01(\v2\x1a.google.protobuf.TimestampR\aupdated\x12\x18\n" +
"\amessage\x18\x04 \x01(\tR\amessage\x12-\n" + "\amessage\x18\x04 \x01(\tR\amessage\x12-\n" +
"\x05files\x18\x05 \x03(\v2\x17.sgard.v1.ManifestEntryR\x05files\"3\n" + "\x05files\x18\x05 \x03(\v2\x17.sgard.v1.ManifestEntryR\x05files\x124\n" +
"\n" +
"encryption\x18\x06 \x01(\v2\x14.sgard.v1.EncryptionR\n" +
"encryption\"3\n" +
"\tBlobChunk\x12\x12\n" + "\tBlobChunk\x12\x12\n" +
"\x04hash\x18\x01 \x01(\tR\x04hash\x12\x12\n" + "\x04hash\x18\x01 \x01(\tR\x04hash\x12\x12\n" +
"\x04data\x18\x02 \x01(\fR\x04data\"E\n" + "\x04data\x18\x02 \x01(\fR\x04data\"E\n" +
@@ -977,55 +1169,61 @@ func file_sgard_v1_sgard_proto_rawDescGZIP() []byte {
} }
var file_sgard_v1_sgard_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_sgard_v1_sgard_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_sgard_v1_sgard_proto_msgTypes = make([]protoimpl.MessageInfo, 16) var file_sgard_v1_sgard_proto_msgTypes = make([]protoimpl.MessageInfo, 19)
var file_sgard_v1_sgard_proto_goTypes = []any{ var file_sgard_v1_sgard_proto_goTypes = []any{
(PushManifestResponse_Decision)(0), // 0: sgard.v1.PushManifestResponse.Decision (PushManifestResponse_Decision)(0), // 0: sgard.v1.PushManifestResponse.Decision
(*ManifestEntry)(nil), // 1: sgard.v1.ManifestEntry (*ManifestEntry)(nil), // 1: sgard.v1.ManifestEntry
(*Manifest)(nil), // 2: sgard.v1.Manifest (*KekSlot)(nil), // 2: sgard.v1.KekSlot
(*BlobChunk)(nil), // 3: sgard.v1.BlobChunk (*Encryption)(nil), // 3: sgard.v1.Encryption
(*PushManifestRequest)(nil), // 4: sgard.v1.PushManifestRequest (*Manifest)(nil), // 4: sgard.v1.Manifest
(*PushManifestResponse)(nil), // 5: sgard.v1.PushManifestResponse (*BlobChunk)(nil), // 5: sgard.v1.BlobChunk
(*PushBlobsRequest)(nil), // 6: sgard.v1.PushBlobsRequest (*PushManifestRequest)(nil), // 6: sgard.v1.PushManifestRequest
(*PushBlobsResponse)(nil), // 7: sgard.v1.PushBlobsResponse (*PushManifestResponse)(nil), // 7: sgard.v1.PushManifestResponse
(*PullManifestRequest)(nil), // 8: sgard.v1.PullManifestRequest (*PushBlobsRequest)(nil), // 8: sgard.v1.PushBlobsRequest
(*PullManifestResponse)(nil), // 9: sgard.v1.PullManifestResponse (*PushBlobsResponse)(nil), // 9: sgard.v1.PushBlobsResponse
(*PullBlobsRequest)(nil), // 10: sgard.v1.PullBlobsRequest (*PullManifestRequest)(nil), // 10: sgard.v1.PullManifestRequest
(*PullBlobsResponse)(nil), // 11: sgard.v1.PullBlobsResponse (*PullManifestResponse)(nil), // 11: sgard.v1.PullManifestResponse
(*PruneRequest)(nil), // 12: sgard.v1.PruneRequest (*PullBlobsRequest)(nil), // 12: sgard.v1.PullBlobsRequest
(*PruneResponse)(nil), // 13: sgard.v1.PruneResponse (*PullBlobsResponse)(nil), // 13: sgard.v1.PullBlobsResponse
(*AuthenticateRequest)(nil), // 14: sgard.v1.AuthenticateRequest (*PruneRequest)(nil), // 14: sgard.v1.PruneRequest
(*AuthenticateResponse)(nil), // 15: sgard.v1.AuthenticateResponse (*PruneResponse)(nil), // 15: sgard.v1.PruneResponse
(*ReauthChallenge)(nil), // 16: sgard.v1.ReauthChallenge (*AuthenticateRequest)(nil), // 16: sgard.v1.AuthenticateRequest
(*timestamppb.Timestamp)(nil), // 17: google.protobuf.Timestamp (*AuthenticateResponse)(nil), // 17: sgard.v1.AuthenticateResponse
(*ReauthChallenge)(nil), // 18: sgard.v1.ReauthChallenge
nil, // 19: sgard.v1.Encryption.KekSlotsEntry
(*timestamppb.Timestamp)(nil), // 20: google.protobuf.Timestamp
} }
var file_sgard_v1_sgard_proto_depIdxs = []int32{ var file_sgard_v1_sgard_proto_depIdxs = []int32{
17, // 0: sgard.v1.ManifestEntry.updated:type_name -> google.protobuf.Timestamp 20, // 0: sgard.v1.ManifestEntry.updated:type_name -> google.protobuf.Timestamp
17, // 1: sgard.v1.Manifest.created:type_name -> google.protobuf.Timestamp 19, // 1: sgard.v1.Encryption.kek_slots:type_name -> sgard.v1.Encryption.KekSlotsEntry
17, // 2: sgard.v1.Manifest.updated:type_name -> google.protobuf.Timestamp 20, // 2: sgard.v1.Manifest.created:type_name -> google.protobuf.Timestamp
1, // 3: sgard.v1.Manifest.files:type_name -> sgard.v1.ManifestEntry 20, // 3: sgard.v1.Manifest.updated:type_name -> google.protobuf.Timestamp
2, // 4: sgard.v1.PushManifestRequest.manifest:type_name -> sgard.v1.Manifest 1, // 4: sgard.v1.Manifest.files:type_name -> sgard.v1.ManifestEntry
0, // 5: sgard.v1.PushManifestResponse.decision:type_name -> sgard.v1.PushManifestResponse.Decision 3, // 5: sgard.v1.Manifest.encryption:type_name -> sgard.v1.Encryption
17, // 6: sgard.v1.PushManifestResponse.server_updated:type_name -> google.protobuf.Timestamp 4, // 6: sgard.v1.PushManifestRequest.manifest:type_name -> sgard.v1.Manifest
3, // 7: sgard.v1.PushBlobsRequest.chunk:type_name -> sgard.v1.BlobChunk 0, // 7: sgard.v1.PushManifestResponse.decision:type_name -> sgard.v1.PushManifestResponse.Decision
2, // 8: sgard.v1.PullManifestResponse.manifest:type_name -> sgard.v1.Manifest 20, // 8: sgard.v1.PushManifestResponse.server_updated:type_name -> google.protobuf.Timestamp
3, // 9: sgard.v1.PullBlobsResponse.chunk:type_name -> sgard.v1.BlobChunk 5, // 9: sgard.v1.PushBlobsRequest.chunk:type_name -> sgard.v1.BlobChunk
14, // 10: sgard.v1.GardenSync.Authenticate:input_type -> sgard.v1.AuthenticateRequest 4, // 10: sgard.v1.PullManifestResponse.manifest:type_name -> sgard.v1.Manifest
4, // 11: sgard.v1.GardenSync.PushManifest:input_type -> sgard.v1.PushManifestRequest 5, // 11: sgard.v1.PullBlobsResponse.chunk:type_name -> sgard.v1.BlobChunk
6, // 12: sgard.v1.GardenSync.PushBlobs:input_type -> sgard.v1.PushBlobsRequest 2, // 12: sgard.v1.Encryption.KekSlotsEntry.value:type_name -> sgard.v1.KekSlot
8, // 13: sgard.v1.GardenSync.PullManifest:input_type -> sgard.v1.PullManifestRequest 16, // 13: sgard.v1.GardenSync.Authenticate:input_type -> sgard.v1.AuthenticateRequest
10, // 14: sgard.v1.GardenSync.PullBlobs:input_type -> sgard.v1.PullBlobsRequest 6, // 14: sgard.v1.GardenSync.PushManifest:input_type -> sgard.v1.PushManifestRequest
12, // 15: sgard.v1.GardenSync.Prune:input_type -> sgard.v1.PruneRequest 8, // 15: sgard.v1.GardenSync.PushBlobs:input_type -> sgard.v1.PushBlobsRequest
15, // 16: sgard.v1.GardenSync.Authenticate:output_type -> sgard.v1.AuthenticateResponse 10, // 16: sgard.v1.GardenSync.PullManifest:input_type -> sgard.v1.PullManifestRequest
5, // 17: sgard.v1.GardenSync.PushManifest:output_type -> sgard.v1.PushManifestResponse 12, // 17: sgard.v1.GardenSync.PullBlobs:input_type -> sgard.v1.PullBlobsRequest
7, // 18: sgard.v1.GardenSync.PushBlobs:output_type -> sgard.v1.PushBlobsResponse 14, // 18: sgard.v1.GardenSync.Prune:input_type -> sgard.v1.PruneRequest
9, // 19: sgard.v1.GardenSync.PullManifest:output_type -> sgard.v1.PullManifestResponse 17, // 19: sgard.v1.GardenSync.Authenticate:output_type -> sgard.v1.AuthenticateResponse
11, // 20: sgard.v1.GardenSync.PullBlobs:output_type -> sgard.v1.PullBlobsResponse 7, // 20: sgard.v1.GardenSync.PushManifest:output_type -> sgard.v1.PushManifestResponse
13, // 21: sgard.v1.GardenSync.Prune:output_type -> sgard.v1.PruneResponse 9, // 21: sgard.v1.GardenSync.PushBlobs:output_type -> sgard.v1.PushBlobsResponse
16, // [16:22] is the sub-list for method output_type 11, // 22: sgard.v1.GardenSync.PullManifest:output_type -> sgard.v1.PullManifestResponse
10, // [10:16] is the sub-list for method input_type 13, // 23: sgard.v1.GardenSync.PullBlobs:output_type -> sgard.v1.PullBlobsResponse
10, // [10:10] is the sub-list for extension type_name 15, // 24: sgard.v1.GardenSync.Prune:output_type -> sgard.v1.PruneResponse
10, // [10:10] is the sub-list for extension extendee 19, // [19:25] is the sub-list for method output_type
0, // [0:10] is the sub-list for field type_name 13, // [13:19] is the sub-list for method input_type
13, // [13:13] is the sub-list for extension type_name
13, // [13:13] is the sub-list for extension extendee
0, // [0:13] is the sub-list for field type_name
} }
func init() { file_sgard_v1_sgard_proto_init() } func init() { file_sgard_v1_sgard_proto_init() }
@@ -1039,7 +1237,7 @@ func file_sgard_v1_sgard_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(), GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: unsafe.Slice(unsafe.StringData(file_sgard_v1_sgard_proto_rawDesc), len(file_sgard_v1_sgard_proto_rawDesc)), RawDescriptor: unsafe.Slice(unsafe.StringData(file_sgard_v1_sgard_proto_rawDesc), len(file_sgard_v1_sgard_proto_rawDesc)),
NumEnums: 1, NumEnums: 1,
NumMessages: 16, NumMessages: 19,
NumExtensions: 0, NumExtensions: 0,
NumServices: 1, NumServices: 1,
}, },