1use super::{DelegatedRoleGrant, DelegationAudience};
5use crate::Principal;
6use serde::{Deserialize, Serialize};
7
8#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
13pub enum RootProof {
14 IcChainKeyBatchSignatureV1(IcChainKeyBatchSignatureProofV1),
15}
16
17#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
22pub struct IcCanisterSignatureProofV1 {
23 pub signature_cbor: Vec<u8>,
24 pub public_key_der: Vec<u8>,
25}
26
27#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
32pub enum ChainKeyAlgorithm {
33 EcdsaSecp256k1,
34}
35
36#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
41pub struct ChainKeyKeyId {
42 pub name: String,
43}
44
45#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
50pub struct IcChainKeyBatchSignatureProofV1 {
51 pub header: ChainKeyBatchHeaderV1,
52 pub delegation_cert: ChainKeyDelegationCertV1,
53 pub issuer_witness: ChainKeyBatchWitnessV1,
54 pub signature: ChainKeyRootSignatureV1,
55}
56
57#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
62pub struct ChainKeyBatchHeaderV1 {
63 pub schema_version: u16,
64 pub root_canister_id: Principal,
65 pub batch_id: [u8; 32],
66 pub proof_epoch: u64,
67 pub registry_epoch: u64,
68 pub registry_hash: [u8; 32],
69 pub tree_root: [u8; 32],
70 pub not_before_ns: u64,
71 pub expires_at_ns: u64,
72 pub algorithm: ChainKeyAlgorithm,
73 pub key_id: ChainKeyKeyId,
74 pub derivation_path_hash: [u8; 32],
75 pub key_version: u64,
76}
77
78#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
83pub struct ChainKeyDelegationCertV1 {
84 pub root_canister_id: Principal,
85 pub issuer_canister_id: Principal,
86 pub proof_epoch: u64,
87 pub issuer_proof_algorithm: IssuerProofAlgorithm,
88 pub issuer_proof_binding_hash: [u8; 32],
89 pub issuer_proof_binding: IssuerProofBinding,
90 pub max_token_ttl_ns: u64,
91 pub audience: DelegationAudience,
92 pub grants: Vec<DelegatedRoleGrant>,
93 pub not_before_ns: u64,
94 pub expires_at_ns: u64,
95 pub registry_epoch: u64,
96 pub registry_hash: [u8; 32],
97}
98
99#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
104pub struct ChainKeyRootSignatureV1 {
105 pub algorithm: ChainKeyAlgorithm,
106 pub key_id: ChainKeyKeyId,
107 pub derivation_path: Vec<Vec<u8>>,
108 pub public_key: Vec<u8>,
109 pub signature: Vec<u8>,
110}
111
112#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
117pub struct ChainKeyBatchWitnessV1 {
118 pub steps: Vec<ChainKeyBatchWitnessStepV1>,
119}
120
121#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
126pub enum ChainKeyBatchWitnessStepV1 {
127 LeftSibling([u8; 32]),
128 RightSibling([u8; 32]),
129}
130
131#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
136pub enum IssuerProofAlgorithm {
137 IcCanisterSignatureV1,
138}
139
140#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
145pub enum IssuerProofBinding {
146 IcCanisterSignatureV1 { seed_hash: [u8; 32] },
147}
148
149#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
154pub struct DelegationCert {
155 pub root_pid: Principal,
156 pub issuer_pid: Principal,
157 pub issuer_proof_alg: IssuerProofAlgorithm,
158 pub issuer_proof_binding_hash: [u8; 32],
159 pub issuer_proof_binding: IssuerProofBinding,
160 pub issued_at_ns: u64,
161 pub not_before_ns: u64,
162 pub expires_at_ns: u64,
163 pub max_token_ttl_ns: u64,
164 pub aud: DelegationAudience,
165 pub grants: Vec<DelegatedRoleGrant>,
166}
167
168#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
173pub struct DelegationProof {
174 pub cert: DelegationCert,
175 pub root_proof: RootProof,
176}