carlos / platform Public

Clone
git clone https://amadan.net/carlos/platform

Plain git — no account needed to clone.

Download

Download this file

1package host
2
3import (
4 "context"
5 "crypto/ed25519"
6 "time"
7
8 "github.com/carlosframework/platform/internal/hostbox"
9 "github.com/carlosframework/platform/internal/hostops"
10 "github.com/carlosframework/platform/internal/release"
11)
12
13// WithClaimRetirementEvidence completes Plan6b's real provider bundle. It does
14// not manufacture the local stop inventory, kernel verifier, leases or live view.
15func WithClaimRetirementEvidence(ctx context.Context, providers ClaimProviders, authority hostops.ProductionAuthority, box, enrollment string, private ed25519.PrivateKey) (ClaimProviders, error) {
16 if providers.Stop == nil || providers.Selector == nil || providers.Wake == nil {
17 return ClaimProviders{}, ErrClaimStopUnavailable
18 }
19 if err := ConfigureStopEvidence(ctx, providers.Stop, authority.Directory, box, enrollment, private); err != nil {
20 return ClaimProviders{}, err
21 }
22 var regional hostbox.RegionalWorker
23 switch existing := providers.Regional.(type) {
24 case hostbox.RegionalWorker:
25 regional = existing
26 case *hostbox.RegionalWorker:
27 if existing == nil {
28 return ClaimProviders{}, ErrClaimStopUnavailable
29 }
30 regional = *existing
31 default:
32 return ClaimProviders{}, ErrClaimStopUnavailable
33 }
34 if regional.Evidence == nil {
35 return ClaimProviders{}, ErrClaimStopUnavailable
36 }
37 worker, err := hostops.NewClaimRegionalWorker(regional.Regional, regional.Enrollment, authority, regional.Evidence)
38 if err != nil {
39 return ClaimProviders{}, err
40 }
41 providers.Regional = worker
42 return providers, nil
43}
44
45func (owners ClaimOwnerBindings) claimEvidenceCoordinator(ctx context.Context, store release.Store, mode string, actor hostbox.Actor) (*ClaimStopCoordinator, error) {
46 a := owners.RetirementAuthority
47 controlBucket := actor.ControlBucket
48 if controlBucket == "" {
49 return nil, ErrClaimStopUnavailable
50 }
51 if store == nil || a == nil || a.Store != store || a.Directory.Store != store || a.Now == nil || len(a.Directory.PublicKey) != ed25519.PublicKeySize || a.Directory.Bucket != controlBucket {
52 return nil, ErrClaimStopUnavailable
53 }
54 if mode != "instance-control" && ((mode != "agent" && mode != "adopt") || len(owners.EvidenceKey) != 0) {
55 return nil, ErrClaimStopUnavailable
56 }
57 stop := &ClaimStopCoordinator{Evidence: store, Now: time.Now}
58 if mode == "instance-control" {
59 var err error
60 if owners.cleanupEnrollment != nil {
61 if !hostbox.SameBinding(owners.cleanupEnrollment.actor, actor) {
62 return nil, ErrClaimStopIdentity
63 }
64 err = owners.cleanupEnrollment.configureSigner(ctx, stop, owners.EvidenceKey)
65 } else {
66 err = ConfigureStopEvidence(ctx, stop, a.Directory, actor.Box, actor.Enrollment, owners.EvidenceKey)
67 }
68 if err != nil {
69 return nil, err
70 }
71 }
72 return stop, nil
73}
74