Skip to main content

canic_core/dto/
auth.rs

1use crate::dto::{error::Error, prelude::*, rpc::RootRequestMetadata};
2
3//
4// DelegationAudience
5//
6
7#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
8pub enum DelegationAudience {
9    Any,
10    Roles(Vec<CanisterRole>),
11}
12
13//
14// DelegationCert
15//
16
17#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
18pub struct DelegationCert {
19    pub root_pid: Principal,
20    pub shard_pid: Principal,
21    pub issued_at: u64,
22    pub expires_at: u64,
23    pub scopes: Vec<String>,
24    pub aud: DelegationAudience,
25}
26
27//
28// DelegationProof
29//
30
31#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
32pub struct DelegationProof {
33    pub cert: DelegationCert,
34    pub cert_sig: Vec<u8>,
35}
36
37//
38// DelegationProofInstallIntent
39//
40
41#[derive(CandidType, Clone, Copy, Debug, Deserialize, Eq, PartialEq)]
42pub enum DelegationProofInstallIntent {
43    Provisioning,
44    Prewarm,
45    Repair,
46}
47
48//
49// DelegationProofInstallRequest
50//
51
52#[derive(CandidType, Clone, Debug, Deserialize)]
53pub struct DelegationProofInstallRequest {
54    pub proof: DelegationProof,
55    pub intent: DelegationProofInstallIntent,
56    #[serde(default)]
57    pub root_public_key_sec1: Option<Vec<u8>>,
58    pub shard_public_key_sec1: Vec<u8>,
59}
60
61//
62// DelegatedTokenClaims
63//
64
65#[derive(CandidType, Clone, Debug, Deserialize)]
66pub struct DelegatedTokenClaims {
67    pub sub: Principal,
68    pub shard_pid: Principal,
69    pub scopes: Vec<String>,
70    pub aud: DelegationAudience,
71    pub iat: u64,
72    pub exp: u64,
73    // Optional signed application payload. CANIC preserves this field but does
74    // not interpret it; applications own its schema and authorization meaning.
75    #[serde(default)]
76    pub ext: Option<Vec<u8>>,
77}
78
79//
80// DelegatedToken
81//
82
83#[derive(CandidType, Clone, Debug, Deserialize)]
84pub struct DelegatedToken {
85    pub claims: DelegatedTokenClaims,
86    pub proof: DelegationProof,
87    pub token_sig: Vec<u8>,
88}
89
90//
91// DelegationRequest
92//
93
94#[derive(CandidType, Clone, Debug, Deserialize)]
95pub struct DelegationRequest {
96    pub shard_pid: Principal,
97    pub scopes: Vec<String>,
98    pub aud: DelegationAudience,
99    pub ttl_secs: u64,
100    pub shard_public_key_sec1: Vec<u8>,
101    #[serde(default)]
102    pub metadata: Option<RootRequestMetadata>,
103}
104
105//
106// RoleAttestationRequest
107//
108
109#[derive(CandidType, Clone, Debug, Deserialize)]
110pub struct RoleAttestationRequest {
111    pub subject: Principal,
112    pub role: CanisterRole,
113    #[serde(default)]
114    pub subnet_id: Option<Principal>,
115    #[serde(default)]
116    pub audience: Option<Principal>,
117    pub ttl_secs: u64,
118    pub epoch: u64,
119    #[serde(default)]
120    pub metadata: Option<RootRequestMetadata>,
121}
122
123//
124// RoleAttestation
125//
126
127#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
128pub struct RoleAttestation {
129    pub subject: Principal,
130    pub role: CanisterRole,
131    #[serde(default)]
132    pub subnet_id: Option<Principal>,
133    #[serde(default)]
134    pub audience: Option<Principal>,
135    pub issued_at: u64,
136    pub expires_at: u64,
137    pub epoch: u64,
138}
139
140//
141// SignedRoleAttestation
142//
143
144#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
145pub struct SignedRoleAttestation {
146    pub payload: RoleAttestation,
147    pub signature: Vec<u8>,
148    pub key_id: u32,
149}
150
151//
152// AttestationKeyStatus
153//
154
155#[derive(CandidType, Clone, Copy, Debug, Deserialize, Eq, PartialEq)]
156pub enum AttestationKeyStatus {
157    Current,
158    Previous,
159}
160
161//
162// AttestationKey
163//
164
165#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
166pub struct AttestationKey {
167    pub key_id: u32,
168    pub public_key: Vec<u8>,
169    pub status: AttestationKeyStatus,
170    #[serde(default)]
171    pub valid_from: Option<u64>,
172    #[serde(default)]
173    pub valid_until: Option<u64>,
174}
175
176//
177// AttestationKeySet
178//
179
180#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
181pub struct AttestationKeySet {
182    pub root_pid: Principal,
183    pub generated_at: u64,
184    pub keys: Vec<AttestationKey>,
185}
186
187// admin-only: not part of canonical delegation flow.
188// used for controlled provisioning and tooling flows.
189//
190// DelegationProvisionResponse
191//
192
193#[derive(CandidType, Clone, Debug, Deserialize, Serialize)]
194pub struct DelegationProvisionResponse {
195    pub proof: DelegationProof,
196    pub results: Vec<DelegationProvisionTargetResponse>,
197}
198
199//
200// DelegationVerifierProofPushRequest
201//
202
203#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
204pub struct DelegationVerifierProofPushRequest {
205    pub proof: DelegationProof,
206    pub verifier_targets: Vec<Principal>,
207}
208
209//
210// DelegationVerifierProofPushResponse
211//
212
213#[derive(CandidType, Clone, Debug, Deserialize)]
214pub struct DelegationVerifierProofPushResponse {
215    pub results: Vec<DelegationProvisionTargetResponse>,
216}
217
218//
219// DelegationProofStatus
220//
221
222#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
223pub struct DelegationProofStatus {
224    pub shard_pid: Principal,
225    pub issued_at: u64,
226    pub expires_at: u64,
227}
228
229#[derive(CandidType, Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
230pub enum DelegationProvisionTargetKind {
231    Signer,
232    Verifier,
233}
234
235#[derive(CandidType, Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
236pub enum DelegationProvisionStatus {
237    Ok,
238    Failed,
239}
240
241//
242// DelegationAdminCommand
243//
244
245#[derive(CandidType, Clone, Debug, Deserialize)]
246pub enum DelegationAdminCommand {
247    PrewarmVerifiers(DelegationVerifierProofPushRequest),
248    RepairVerifiers(DelegationVerifierProofPushRequest),
249}
250
251//
252// DelegationAdminResponse
253//
254
255#[derive(CandidType, Clone, Debug, Deserialize)]
256pub enum DelegationAdminResponse {
257    PrewarmedVerifiers {
258        result: DelegationVerifierProofPushResponse,
259    },
260    RepairedVerifiers {
261        result: DelegationVerifierProofPushResponse,
262    },
263}
264
265//
266// DelegationProvisionTargetResponse
267//
268
269#[derive(CandidType, Clone, Debug, Deserialize, Serialize)]
270pub struct DelegationProvisionTargetResponse {
271    pub target: Principal,
272    pub kind: DelegationProvisionTargetKind,
273    pub status: DelegationProvisionStatus,
274    pub error: Option<Error>,
275}