@@ -23,7 +23,9 @@ use std::time::{Duration, Instant};
2323
2424use anyhow:: { ensure, Context , Result } ;
2525use bitcoin:: secp256k1:: PublicKey ;
26- use common:: api:: provision:: { Instance , Node , NodeInstanceSeed , SealedSeed } ;
26+ use common:: api:: provision:: {
27+ Instance , Node , NodeInstanceSeed , ProvisionRequest , SealedSeed ,
28+ } ;
2729use common:: api:: runner:: UserPort ;
2830use common:: api:: UserPk ;
2931use common:: attest:: cert:: AttestationCert ;
@@ -34,7 +36,6 @@ use common::root_seed::RootSeed;
3436use common:: { ed25519, hex} ;
3537use http:: { Response , StatusCode } ;
3638use secrecy:: ExposeSecret ;
37- use serde:: { Deserialize , Serialize } ;
3839use thiserror:: Error ;
3940use tokio:: sync:: mpsc;
4041use tokio_rustls:: rustls;
@@ -82,41 +83,6 @@ struct RequestContext {
8283 rng : SysRng ,
8384}
8485
85- /// The client sends this provisioning request to the node.
86- #[ derive( Serialize , Deserialize ) ]
87- struct ProvisionRequest {
88- /// The client's user pk.
89- user_pk : UserPk ,
90- /// The client's node public key, derived from the root seed. The node
91- /// should sanity check by re-deriving the node pk and checking that it
92- /// equals the client's expected value.
93- node_pk : PublicKey ,
94- /// The secret root seed the client wants to provision into the node.
95- root_seed : RootSeed ,
96- }
97-
98- impl ProvisionRequest {
99- fn verify < R : Crng > (
100- self ,
101- rng : & mut R ,
102- expected_user_id : UserPk ,
103- ) -> Result < ( UserPk , PublicKey , ProvisionedSecrets ) > {
104- ensure ! ( self . user_pk == expected_user_id) ;
105-
106- // TODO(phlip9): derive just the node pk without all the extra junk
107- // that gets derived constructing a whole KeysManager
108- let _keys_manager =
109- LexeKeysManager :: init ( rng, & self . node_pk , & self . root_seed ) ?;
110- Ok ( (
111- self . user_pk ,
112- self . node_pk ,
113- ProvisionedSecrets {
114- root_seed : self . root_seed ,
115- } ,
116- ) )
117- }
118- }
119-
12086/// The enclave's provisioned secrets that it will seal and persist using its
12187/// platform enclave keys that are software and version specific.
12288///
@@ -143,13 +109,33 @@ impl ProvisionedSecrets {
143109 }
144110}
145111
112+ fn verify_provision_request < R : Crng > (
113+ rng : & mut R ,
114+ expected_user_id : UserPk ,
115+ req : ProvisionRequest ,
116+ ) -> Result < ( UserPk , PublicKey , ProvisionedSecrets ) > {
117+ ensure ! ( req. user_pk == expected_user_id) ;
118+
119+ // TODO(phlip9): derive just the node pk without all the extra junk
120+ // that gets derived constructing a whole KeysManager
121+ let _keys_manager =
122+ LexeKeysManager :: init ( rng, & req. node_pk , & req. root_seed ) ?;
123+ Ok ( (
124+ req. user_pk ,
125+ req. node_pk ,
126+ ProvisionedSecrets {
127+ root_seed : req. root_seed ,
128+ } ,
129+ ) )
130+ }
131+
146132// # provision service
147133//
148134// POST /provision
149135//
150136// ```json
151137// {
152- // "user_pk": UserPk::from_i64(123) ,
138+ // "user_pk": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" ,
153139// "node_pk": "031355a4419a2b31c9b1ba2de0bcbefdd4a2ef6360f2b018736162a9b3be329fd4".parse().unwrap(),
154140// "root_seed": "86e4478f9f7e810d883f22ea2f0173e193904b488a62bb63764c82ba22b60ca7".parse().unwrap(),
155141// }
@@ -160,9 +146,9 @@ async fn provision_request(
160146) -> Result < impl Reply , ApiError > {
161147 debug ! ( "received provision request" ) ;
162148
163- let ( user_pk, node_pk, provisioned_secrets) = req
164- . verify ( & mut ctx. rng , ctx. expected_user_id )
165- . map_err ( |_| ApiError ) ?;
149+ let ( user_pk, node_pk, provisioned_secrets) =
150+ verify_provision_request ( & mut ctx. rng , ctx. expected_user_id , req )
151+ . map_err ( |_| ApiError ) ?;
166152
167153 let sealed_secrets = provisioned_secrets
168154 . seal ( & mut ctx. rng )
@@ -198,7 +184,7 @@ async fn provision_request(
198184 // Provisioning done. Stop node.
199185 let _ = ctx. shutdown_tx . try_send ( ( ) ) ;
200186
201- Ok ( "OK" )
187+ Ok ( Response :: new ( Body :: empty ( ) ) )
202188}
203189
204190fn provision_routes (
0 commit comments