mirror of
				https://github.com/tailscale/tailscale.git
				synced 2025-11-04 02:01:14 +01:00 
			
		
		
		
	These RPCs will be used to power the future 'tailscale lock remove' default behavior of resigning signatures for which trust is about to be removed. Signed-off-by: Tom DNetto <tom@tailscale.com>
		
			
				
	
	
		
			265 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			265 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Copyright (c) Tailscale Inc & AUTHORS
 | 
						|
// SPDX-License-Identifier: BSD-3-Clause
 | 
						|
 | 
						|
package tailcfg
 | 
						|
 | 
						|
import (
 | 
						|
	"tailscale.com/types/key"
 | 
						|
	"tailscale.com/types/tkatype"
 | 
						|
)
 | 
						|
 | 
						|
// TKAInitBeginRequest submits a genesis AUM to seed the creation of the
 | 
						|
// tailnet's key authority.
 | 
						|
type TKAInitBeginRequest struct {
 | 
						|
	// Version is the client's capabilities.
 | 
						|
	Version CapabilityVersion
 | 
						|
 | 
						|
	// NodeKey is the client's current node key.
 | 
						|
	NodeKey key.NodePublic
 | 
						|
 | 
						|
	// GenesisAUM is the initial (genesis) AUM that the node generated
 | 
						|
	// to bootstrap tailnet key authority state.
 | 
						|
	GenesisAUM tkatype.MarshaledAUM
 | 
						|
}
 | 
						|
 | 
						|
// TKASignInfo describes information about an existing node that needs
 | 
						|
// to be signed into a node-key signature.
 | 
						|
type TKASignInfo struct {
 | 
						|
	// NodeID is the ID of the node which needs a signature. It must
 | 
						|
	// correspond to NodePublic.
 | 
						|
	NodeID NodeID
 | 
						|
	// NodePublic is the node (Wireguard) public key which is being
 | 
						|
	// signed.
 | 
						|
	NodePublic key.NodePublic
 | 
						|
 | 
						|
	// RotationPubkey specifies the public key which may sign
 | 
						|
	// a NodeKeySignature (NKS), which rotates the node key.
 | 
						|
	//
 | 
						|
	// This is necessary so the node can rotate its node-key without
 | 
						|
	// talking to a node which holds a trusted network-lock key.
 | 
						|
	// It does this by nesting the original NKS in a 'rotation' NKS,
 | 
						|
	// which it then signs with the key corresponding to RotationPubkey.
 | 
						|
	//
 | 
						|
	// This field expects a raw ed25519 public key.
 | 
						|
	RotationPubkey []byte
 | 
						|
}
 | 
						|
 | 
						|
// TKAInitBeginResponse is the JSON response from a /tka/init/begin RPC.
 | 
						|
// This structure describes node information which must be signed to
 | 
						|
// complete initialization of the tailnets' key authority.
 | 
						|
type TKAInitBeginResponse struct {
 | 
						|
	// NeedSignatures specify information about the nodes in your tailnet
 | 
						|
	// which need initial signatures to function once the tailnet key
 | 
						|
	// authority is in use. The generated signatures should then be
 | 
						|
	// submitted in a /tka/init/finish RPC.
 | 
						|
	NeedSignatures []TKASignInfo
 | 
						|
}
 | 
						|
 | 
						|
// TKAInitFinishRequest is the JSON request of a /tka/init/finish RPC.
 | 
						|
// This RPC finalizes initialization of the tailnet key authority
 | 
						|
// by submitting node-key signatures for all existing nodes.
 | 
						|
type TKAInitFinishRequest struct {
 | 
						|
	// Version is the client's capabilities.
 | 
						|
	Version CapabilityVersion
 | 
						|
 | 
						|
	// NodeKey is the client's current node key.
 | 
						|
	NodeKey key.NodePublic
 | 
						|
 | 
						|
	// Signatures are serialized tka.NodeKeySignatures for all nodes
 | 
						|
	// in the tailnet.
 | 
						|
	Signatures map[NodeID]tkatype.MarshaledSignature
 | 
						|
 | 
						|
	// SupportDisablement is a disablement secret for Tailscale support.
 | 
						|
	// This is only generated if --gen-disablement-for-support is specified
 | 
						|
	// in an invocation to 'tailscale lock init'.
 | 
						|
	SupportDisablement []byte `json:",omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
// TKAInitFinishResponse is the JSON response from a /tka/init/finish RPC.
 | 
						|
// This schema describes the successful enablement of the tailnet's
 | 
						|
// key authority.
 | 
						|
type TKAInitFinishResponse struct {
 | 
						|
	// Nothing. (yet?)
 | 
						|
}
 | 
						|
 | 
						|
// TKAInfo encodes the control plane's view of tailnet key authority (TKA)
 | 
						|
// state. This information is transmitted as part of the MapResponse.
 | 
						|
type TKAInfo struct {
 | 
						|
	// Head describes the hash of the latest AUM applied to the authority.
 | 
						|
	// Head is encoded as tka.AUMHash.MarshalText.
 | 
						|
	//
 | 
						|
	// If the Head state differs to that known locally, the node should perform
 | 
						|
	// synchronization via a separate RPC.
 | 
						|
	Head string `json:",omitempty"`
 | 
						|
 | 
						|
	// Disabled indicates the control plane believes TKA should be disabled,
 | 
						|
	// and the node should reach out to fetch a disablement
 | 
						|
	// secret. If the disablement secret verifies, then the node should then
 | 
						|
	// disable TKA locally.
 | 
						|
	// This field exists to disambiguate a nil TKAInfo in a delta mapresponse
 | 
						|
	// from a nil TKAInfo indicating TKA should be disabled.
 | 
						|
	Disabled bool `json:",omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
// TKABootstrapRequest is sent by a node to get information necessary for
 | 
						|
// enabling or disabling the tailnet key authority.
 | 
						|
type TKABootstrapRequest struct {
 | 
						|
	// Version is the client's capabilities.
 | 
						|
	Version CapabilityVersion
 | 
						|
 | 
						|
	// NodeKey is the client's current node key.
 | 
						|
	NodeKey key.NodePublic
 | 
						|
 | 
						|
	// Head represents the node's head AUMHash (tka.Authority.Head), if
 | 
						|
	// network lock is enabled.
 | 
						|
	Head string
 | 
						|
}
 | 
						|
 | 
						|
// TKABootstrapResponse encodes values necessary to enable or disable
 | 
						|
// the tailnet key authority (TKA).
 | 
						|
type TKABootstrapResponse struct {
 | 
						|
	// GenesisAUM returns the initial AUM necessary to initialize TKA.
 | 
						|
	GenesisAUM tkatype.MarshaledAUM `json:",omitempty"`
 | 
						|
 | 
						|
	// DisablementSecret encodes a secret necessary to disable TKA.
 | 
						|
	DisablementSecret []byte `json:",omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
// TKASyncOfferRequest encodes a request to synchronize tailnet key authority
 | 
						|
// state (TKA). Values of type tka.AUMHash are encoded as strings in their
 | 
						|
// MarshalText form.
 | 
						|
type TKASyncOfferRequest struct {
 | 
						|
	// Version is the client's capabilities.
 | 
						|
	Version CapabilityVersion
 | 
						|
 | 
						|
	// NodeKey is the client's current node key.
 | 
						|
	NodeKey key.NodePublic
 | 
						|
 | 
						|
	// Head represents the node's head AUMHash (tka.Authority.Head). This
 | 
						|
	// corresponds to tka.SyncOffer.Head.
 | 
						|
	Head string
 | 
						|
	// Ancestors represents a selection of ancestor AUMHash values ascending
 | 
						|
	// from the current head. This corresponds to tka.SyncOffer.Ancestors.
 | 
						|
	Ancestors []string
 | 
						|
}
 | 
						|
 | 
						|
// TKASyncOfferResponse encodes a response in synchronizing a node's
 | 
						|
// tailnet key authority state. Values of type tka.AUMHash are encoded as
 | 
						|
// strings in their MarshalText form.
 | 
						|
type TKASyncOfferResponse struct {
 | 
						|
	// Head represents the control plane's head AUMHash (tka.Authority.Head).
 | 
						|
	// This corresponds to tka.SyncOffer.Head.
 | 
						|
	Head string
 | 
						|
	// Ancestors represents a selection of ancestor AUMHash values ascending
 | 
						|
	// from the control plane's head. This corresponds to
 | 
						|
	// tka.SyncOffer.Ancestors.
 | 
						|
	Ancestors []string
 | 
						|
	// MissingAUMs encodes AUMs that the control plane believes the node
 | 
						|
	// is missing.
 | 
						|
	MissingAUMs []tkatype.MarshaledAUM
 | 
						|
}
 | 
						|
 | 
						|
// TKASyncSendRequest encodes AUMs that a node believes the control plane
 | 
						|
// is missing, and notifies control of its local TKA state (specifically
 | 
						|
// the head hash).
 | 
						|
type TKASyncSendRequest struct {
 | 
						|
	// Version is the client's capabilities.
 | 
						|
	Version CapabilityVersion
 | 
						|
 | 
						|
	// NodeKey is the client's current node key.
 | 
						|
	NodeKey key.NodePublic
 | 
						|
 | 
						|
	// Head represents the node's head AUMHash (tka.Authority.Head) after
 | 
						|
	// applying any AUMs from the sync-offer response.
 | 
						|
	// It is encoded as tka.AUMHash.MarshalText.
 | 
						|
	Head string
 | 
						|
 | 
						|
	// MissingAUMs encodes AUMs that the node believes the control plane
 | 
						|
	// is missing.
 | 
						|
	MissingAUMs []tkatype.MarshaledAUM
 | 
						|
 | 
						|
	// Interactive is true if additional error checking should be performed as
 | 
						|
	// the request is on behalf of an interactive operation (e.g., an
 | 
						|
	// administrator publishing new changes) as opposed to an automatic
 | 
						|
	// synchronization that may be reporting lost data.
 | 
						|
	Interactive bool
 | 
						|
}
 | 
						|
 | 
						|
// TKASyncSendResponse encodes the control plane's response to a node
 | 
						|
// submitting AUMs during AUM synchronization.
 | 
						|
type TKASyncSendResponse struct {
 | 
						|
	// Head represents the control plane's head AUMHash (tka.Authority.Head),
 | 
						|
	// after applying the missing AUMs.
 | 
						|
	Head string
 | 
						|
}
 | 
						|
 | 
						|
// TKADisableRequest disables network-lock across the tailnet using the
 | 
						|
// provided disablement secret.
 | 
						|
//
 | 
						|
// This is the request schema for a /tka/disable noise RPC.
 | 
						|
type TKADisableRequest struct {
 | 
						|
	// Version is the client's capabilities.
 | 
						|
	Version CapabilityVersion
 | 
						|
 | 
						|
	// NodeKey is the client's current node key.
 | 
						|
	NodeKey key.NodePublic
 | 
						|
 | 
						|
	// Head represents the node's head AUMHash (tka.Authority.Head).
 | 
						|
	// It is encoded as tka.AUMHash.MarshalText.
 | 
						|
	Head string
 | 
						|
 | 
						|
	// DisablementSecret encodes the secret necessary to disable TKA.
 | 
						|
	DisablementSecret []byte
 | 
						|
}
 | 
						|
 | 
						|
// TKADisableResponse is the JSON response from a /tka/disable RPC.
 | 
						|
// This schema describes the successful disablement of the tailnet's
 | 
						|
// key authority.
 | 
						|
type TKADisableResponse struct {
 | 
						|
	// Nothing. (yet?)
 | 
						|
}
 | 
						|
 | 
						|
// TKASubmitSignatureRequest transmits a node-key signature to the control plane.
 | 
						|
//
 | 
						|
// This is the request schema for a /tka/sign noise RPC.
 | 
						|
type TKASubmitSignatureRequest struct {
 | 
						|
	// Version is the client's capabilities.
 | 
						|
	Version CapabilityVersion
 | 
						|
 | 
						|
	// NodeKey is the client's current node key. The node-key which
 | 
						|
	// is being signed is embedded in Signature.
 | 
						|
	NodeKey key.NodePublic
 | 
						|
 | 
						|
	// Signature encodes the node-key signature being submitted.
 | 
						|
	Signature tkatype.MarshaledSignature
 | 
						|
}
 | 
						|
 | 
						|
// TKASubmitSignatureResponse is the JSON response from a /tka/sign RPC.
 | 
						|
type TKASubmitSignatureResponse struct {
 | 
						|
	// Nothing. (yet?)
 | 
						|
}
 | 
						|
 | 
						|
// TKASignaturesUsingKeyRequest asks the control plane for
 | 
						|
// all signatures which are signed by the provided keyID.
 | 
						|
//
 | 
						|
// This is the request schema for a /tka/affected-sigs RPC.
 | 
						|
type TKASignaturesUsingKeyRequest struct {
 | 
						|
	// Version is the client's capabilities.
 | 
						|
	Version CapabilityVersion
 | 
						|
 | 
						|
	// NodeKey is the client's current node key.
 | 
						|
	NodeKey key.NodePublic
 | 
						|
 | 
						|
	// KeyID is the key we are querying using.
 | 
						|
	KeyID tkatype.KeyID
 | 
						|
}
 | 
						|
 | 
						|
// TKASignaturesUsingKeyResponse is the JSON response to
 | 
						|
// a /tka/affected-sigs RPC.
 | 
						|
//
 | 
						|
// It enumerates all signatures which are signed by the
 | 
						|
// queried keyID.
 | 
						|
type TKASignaturesUsingKeyResponse struct {
 | 
						|
	Signatures []tkatype.MarshaledSignature
 | 
						|
}
 |