Skip to content

Commit 6faf57b

Browse files
committed
add a new rpc method QueryEnclaveInfoResponse that returns mrenclave and debug info of the enclave
Signed-off-by: Jun Kimura <jun.kimura@datachain.jp>
1 parent 589611c commit 6faf57b

File tree

5 files changed

+108
-1
lines changed

5 files changed

+108
-1
lines changed

modules/enclave-api/src/enclave.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ pub trait EnclaveInfo: Sync + Send {
5555
fn get_eid(&self) -> sgx_enclave_id_t;
5656
/// `metadata` returns the metadata of the enclave
5757
fn metadata(&self) -> SgxResult<metadata_t>;
58+
/// `is_debug` returns true if the enclave is in debug mode
59+
fn is_debug(&self) -> bool;
5860
/// `get_key_manager` returns a key manager for Enclave Keys
5961
fn get_key_manager(&self) -> &EnclaveKeyManager;
6062
}
@@ -68,6 +70,10 @@ impl<S: CommitStore> EnclaveInfo for Enclave<S> {
6870
fn metadata(&self) -> SgxResult<metadata_t> {
6971
host::sgx_get_metadata(&self.path)
7072
}
73+
/// `is_debug` returns true if the enclave is in debug mode
74+
fn is_debug(&self) -> bool {
75+
self.sgx_enclave.is_debug()
76+
}
7177
/// `get_keymanager` returns a key manager for Enclave Keys
7278
fn get_key_manager(&self) -> &EnclaveKeyManager {
7379
&self.key_manager

modules/service/src/enclave.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ use crypto::Address;
44
use enclave_api::EnclaveProtoAPI;
55
use lcp_proto::lcp::service::enclave::v1::{
66
query_server::Query, EnclaveKeyInfo, QueryAvailableEnclaveKeysRequest,
7-
QueryAvailableEnclaveKeysResponse, QueryEnclaveKeyRequest, QueryEnclaveKeyResponse,
7+
QueryAvailableEnclaveKeysResponse, QueryEnclaveInfoRequest, QueryEnclaveInfoResponse,
8+
QueryEnclaveKeyRequest, QueryEnclaveKeyResponse,
89
};
910
use lcp_types::Mrenclave;
1011
use store::transaction::CommitStore;
@@ -16,6 +17,22 @@ where
1617
S: CommitStore + 'static,
1718
E: EnclaveProtoAPI<S> + 'static,
1819
{
20+
async fn enclave_info(
21+
&self,
22+
_req: Request<QueryEnclaveInfoRequest>,
23+
) -> Result<Response<QueryEnclaveInfoResponse>, Status> {
24+
self.enclave
25+
.metadata()
26+
.map(|metadata| {
27+
let res = QueryEnclaveInfoResponse {
28+
mrenclave: metadata.enclave_css.body.enclave_hash.m.to_vec(),
29+
enclave_debug: self.enclave.is_debug(),
30+
};
31+
Response::new(res)
32+
})
33+
.map_err(|e| Status::aborted(e.to_string()))
34+
}
35+
1936
async fn available_enclave_keys(
2037
&self,
2138
req: Request<QueryAvailableEnclaveKeysRequest>,

proto/definitions/lcp/service/enclave/v1/query.proto

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,18 @@ option go_package = "github.com/datachainlab/lcp/go/relay/enclave";
77
option (gogoproto.goproto_getters_all) = false;
88

99
service Query {
10+
rpc EnclaveInfo(QueryEnclaveInfoRequest) returns (QueryEnclaveInfoResponse);
1011
rpc AvailableEnclaveKeys(QueryAvailableEnclaveKeysRequest) returns (QueryAvailableEnclaveKeysResponse);
1112
rpc EnclaveKey(QueryEnclaveKeyRequest) returns (QueryEnclaveKeyResponse);
1213
}
1314

15+
message QueryEnclaveInfoRequest {}
16+
17+
message QueryEnclaveInfoResponse {
18+
bytes mrenclave = 1;
19+
bool enclave_debug = 2;
20+
}
21+
1422
message QueryAvailableEnclaveKeysRequest {
1523
bytes mrenclave = 1;
1624
bool enclave_debug = 2;

proto/src/descriptor.bin

448 Bytes
Binary file not shown.

proto/src/prost/lcp.service.enclave.v1.rs

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
11
#[derive(::serde::Serialize, ::serde::Deserialize)]
22
#[allow(clippy::derive_partial_eq_without_eq)]
33
#[derive(Clone, PartialEq, ::prost::Message)]
4+
pub struct QueryEnclaveInfoRequest {}
5+
#[derive(::serde::Serialize, ::serde::Deserialize)]
6+
#[allow(clippy::derive_partial_eq_without_eq)]
7+
#[derive(Clone, PartialEq, ::prost::Message)]
8+
pub struct QueryEnclaveInfoResponse {
9+
#[prost(bytes = "vec", tag = "1")]
10+
pub mrenclave: ::prost::alloc::vec::Vec<u8>,
11+
#[prost(bool, tag = "2")]
12+
pub enclave_debug: bool,
13+
}
14+
#[derive(::serde::Serialize, ::serde::Deserialize)]
15+
#[allow(clippy::derive_partial_eq_without_eq)]
16+
#[derive(Clone, PartialEq, ::prost::Message)]
417
pub struct QueryAvailableEnclaveKeysRequest {
518
#[prost(bytes = "vec", tag = "1")]
619
pub mrenclave: ::prost::alloc::vec::Vec<u8>,
@@ -209,6 +222,25 @@ pub mod query_client {
209222
self.inner = self.inner.accept_compressed(encoding);
210223
self
211224
}
225+
pub async fn enclave_info(
226+
&mut self,
227+
request: impl tonic::IntoRequest<super::QueryEnclaveInfoRequest>,
228+
) -> Result<tonic::Response<super::QueryEnclaveInfoResponse>, tonic::Status> {
229+
self.inner
230+
.ready()
231+
.await
232+
.map_err(|e| {
233+
tonic::Status::new(
234+
tonic::Code::Unknown,
235+
format!("Service was not ready: {}", e.into()),
236+
)
237+
})?;
238+
let codec = tonic::codec::ProstCodec::default();
239+
let path = http::uri::PathAndQuery::from_static(
240+
"/lcp.service.enclave.v1.Query/EnclaveInfo",
241+
);
242+
self.inner.unary(request.into_request(), path, codec).await
243+
}
212244
pub async fn available_enclave_keys(
213245
&mut self,
214246
request: impl tonic::IntoRequest<super::QueryAvailableEnclaveKeysRequest>,
@@ -260,6 +292,10 @@ pub mod query_server {
260292
/// Generated trait containing gRPC methods that should be implemented for use with QueryServer.
261293
#[async_trait]
262294
pub trait Query: Send + Sync + 'static {
295+
async fn enclave_info(
296+
&self,
297+
request: tonic::Request<super::QueryEnclaveInfoRequest>,
298+
) -> Result<tonic::Response<super::QueryEnclaveInfoResponse>, tonic::Status>;
263299
async fn available_enclave_keys(
264300
&self,
265301
request: tonic::Request<super::QueryAvailableEnclaveKeysRequest>,
@@ -331,6 +367,46 @@ pub mod query_server {
331367
fn call(&mut self, req: http::Request<B>) -> Self::Future {
332368
let inner = self.inner.clone();
333369
match req.uri().path() {
370+
"/lcp.service.enclave.v1.Query/EnclaveInfo" => {
371+
#[allow(non_camel_case_types)]
372+
struct EnclaveInfoSvc<T: Query>(pub Arc<T>);
373+
impl<
374+
T: Query,
375+
> tonic::server::UnaryService<super::QueryEnclaveInfoRequest>
376+
for EnclaveInfoSvc<T> {
377+
type Response = super::QueryEnclaveInfoResponse;
378+
type Future = BoxFuture<
379+
tonic::Response<Self::Response>,
380+
tonic::Status,
381+
>;
382+
fn call(
383+
&mut self,
384+
request: tonic::Request<super::QueryEnclaveInfoRequest>,
385+
) -> Self::Future {
386+
let inner = self.0.clone();
387+
let fut = async move {
388+
(*inner).enclave_info(request).await
389+
};
390+
Box::pin(fut)
391+
}
392+
}
393+
let accept_compression_encodings = self.accept_compression_encodings;
394+
let send_compression_encodings = self.send_compression_encodings;
395+
let inner = self.inner.clone();
396+
let fut = async move {
397+
let inner = inner.0;
398+
let method = EnclaveInfoSvc(inner);
399+
let codec = tonic::codec::ProstCodec::default();
400+
let mut grpc = tonic::server::Grpc::new(codec)
401+
.apply_compression_config(
402+
accept_compression_encodings,
403+
send_compression_encodings,
404+
);
405+
let res = grpc.unary(method, req).await;
406+
Ok(res)
407+
};
408+
Box::pin(fut)
409+
}
334410
"/lcp.service.enclave.v1.Query/AvailableEnclaveKeys" => {
335411
#[allow(non_camel_case_types)]
336412
struct AvailableEnclaveKeysSvc<T: Query>(pub Arc<T>);

0 commit comments

Comments
 (0)