Skip to content

Commit 6584db7

Browse files
authored
Merge pull request #98 from datachainlab/misbehaviour
Light Client Misbehaviour support Signed-off-by: Jun Kimura <jun.kimura@datachain.jp>
2 parents 7a0f269 + c448ad6 commit 6584db7

File tree

49 files changed

+1861
-1113
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+1861
-1113
lines changed

Cargo.lock

Lines changed: 184 additions & 53 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

enclave-modules/ecall-handler/src/enclave_manage/attestation.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::enclave_manage::errors::Error;
22
use crate::prelude::*;
33
use attestation_report::verify_report;
44
use crypto::{EnclaveKey, SealingKey};
5-
use ecall_commands::{CommandContext, IASRemoteAttestationInput, IASRemoteAttestationResult};
5+
use ecall_commands::{CommandContext, IASRemoteAttestationInput, IASRemoteAttestationResponse};
66
use enclave_remote_attestation::{
77
attestation::create_attestation_report, report::validate_quote_status,
88
};
@@ -11,7 +11,7 @@ use sgx_types::{sgx_quote_sign_type_t, sgx_spid_t};
1111
pub(crate) fn ias_remote_attestation(
1212
cctx: CommandContext,
1313
input: IASRemoteAttestationInput,
14-
) -> Result<IASRemoteAttestationResult, Error> {
14+
) -> Result<IASRemoteAttestationResponse, Error> {
1515
input.validate()?;
1616
let pub_key =
1717
EnclaveKey::unseal(&cctx.sealed_ek.ok_or(Error::enclave_key_not_found())?)?.get_pubkey();
@@ -27,14 +27,14 @@ pub(crate) fn ias_remote_attestation(
2727
report
2828
};
2929
validate_quote_status(cctx.current_timestamp, &report.get_avr()?)?;
30-
Ok(IASRemoteAttestationResult { report })
30+
Ok(IASRemoteAttestationResponse { report })
3131
}
3232

3333
#[cfg(feature = "sgx-sw")]
3434
pub(crate) fn simulate_remote_attestation(
3535
cctx: CommandContext,
3636
input: ecall_commands::SimulateRemoteAttestationInput,
37-
) -> Result<ecall_commands::SimulateRemoteAttestationResult, Error> {
37+
) -> Result<ecall_commands::SimulateRemoteAttestationResponse, Error> {
3838
input.validate()?;
3939
let pub_key =
4040
EnclaveKey::unseal(&cctx.sealed_ek.ok_or(Error::enclave_key_not_found())?)?.get_pubkey();
@@ -45,7 +45,7 @@ pub(crate) fn simulate_remote_attestation(
4545
input.isv_enclave_quote_status,
4646
)?;
4747
validate_quote_status(cctx.current_timestamp, &avr)?;
48-
Ok(ecall_commands::SimulateRemoteAttestationResult { avr })
48+
Ok(ecall_commands::SimulateRemoteAttestationResponse { avr })
4949
}
5050

5151
// CONTRACT: `hex` length must be 32

enclave-modules/ecall-handler/src/enclave_manage/enclave.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
use crate::enclave_manage::Error;
22
use crate::prelude::*;
33
use crypto::{EnclaveKey, SealingKey};
4-
use ecall_commands::{GenerateEnclaveKeyInput, GenerateEnclaveKeyResult};
4+
use ecall_commands::{GenerateEnclaveKeyInput, GenerateEnclaveKeyResponse};
55

66
pub(crate) fn generate_enclave_key(
77
_: GenerateEnclaveKeyInput,
8-
) -> Result<GenerateEnclaveKeyResult, Error> {
8+
) -> Result<GenerateEnclaveKeyResponse, Error> {
99
let ek = EnclaveKey::new()?;
1010
let sealed_ek = ek.seal()?;
11-
Ok(GenerateEnclaveKeyResult {
11+
Ok(GenerateEnclaveKeyResponse {
1212
pub_key: ek.get_pubkey(),
1313
sealed_ek,
1414
})

enclave-modules/ecall-handler/src/enclave_manage/router.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,26 @@ use crate::enclave_manage::{
22
attestation::ias_remote_attestation, enclave::generate_enclave_key, Error,
33
};
44
use crate::prelude::*;
5-
use ecall_commands::{CommandContext, CommandResult, EnclaveManageCommand, EnclaveManageResult};
5+
use ecall_commands::{
6+
CommandContext, CommandResponse, EnclaveManageCommand, EnclaveManageResponse,
7+
};
68

79
pub fn dispatch(
810
cctx: CommandContext,
911
command: EnclaveManageCommand,
10-
) -> Result<CommandResult, Error> {
12+
) -> Result<CommandResponse, Error> {
1113
use EnclaveManageCommand::*;
1214

1315
let res = match command {
14-
GenerateEnclaveKey(input) => CommandResult::EnclaveManage(
15-
EnclaveManageResult::GenerateEnclaveKey(generate_enclave_key(input)?),
16+
GenerateEnclaveKey(input) => CommandResponse::EnclaveManage(
17+
EnclaveManageResponse::GenerateEnclaveKey(generate_enclave_key(input)?),
1618
),
17-
IASRemoteAttestation(input) => CommandResult::EnclaveManage(
18-
EnclaveManageResult::IASRemoteAttestation(ias_remote_attestation(cctx, input)?),
19+
IASRemoteAttestation(input) => CommandResponse::EnclaveManage(
20+
EnclaveManageResponse::IASRemoteAttestation(ias_remote_attestation(cctx, input)?),
1921
),
2022
#[cfg(feature = "sgx-sw")]
2123
SimulateRemoteAttestation(input) => {
22-
CommandResult::EnclaveManage(EnclaveManageResult::SimulateRemoteAttestation(
24+
CommandResponse::EnclaveManage(EnclaveManageResponse::SimulateRemoteAttestation(
2325
crate::enclave_manage::attestation::simulate_remote_attestation(cctx, input)?,
2426
))
2527
}

enclave-modules/ecall-handler/src/light_client/aggregate_messages.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@ use crate::light_client::Error;
22
use crate::prelude::*;
33
use context::Context;
44
use crypto::{EnclavePublicKey, Signer, Verifier};
5-
use ecall_commands::{AggregateMessagesInput, AggregateMessagesResult, LightClientResult};
5+
use ecall_commands::{AggregateMessagesInput, AggregateMessagesResponse, LightClientResponse};
66
use light_client::{
7-
commitments::{self, prove_commitment, Message, UpdateClientMessage},
7+
commitments::{self, prove_commitment, ProxyMessage, UpdateStateProxyMessage},
88
HostContext, LightClientResolver,
99
};
1010
use store::KVStore;
1111

1212
pub fn aggregate_messages<R: LightClientResolver, S: KVStore, K: Signer>(
1313
ctx: &mut Context<R, S, K>,
1414
input: AggregateMessagesInput,
15-
) -> Result<LightClientResult, Error> {
15+
) -> Result<LightClientResponse, Error> {
1616
ctx.set_timestamp(input.current_timestamp);
1717

1818
if input.messages.len() < 2 {
@@ -32,31 +32,31 @@ pub fn aggregate_messages<R: LightClientResolver, S: KVStore, K: Signer>(
3232
let messages = input
3333
.messages
3434
.into_iter()
35-
.map(|c| Message::from_bytes(&c)?.try_into())
35+
.map(|m| ProxyMessage::from_bytes(&m)?.try_into())
3636
.collect::<Result<Vec<_>, _>>()?
3737
.into_iter()
3838
.zip(input.signatures.iter())
39-
.map(|(c, s)| -> Result<_, Error> {
40-
verify_commitment(&pk, &c, s)?;
41-
c.context.validate(ctx.host_timestamp())?;
42-
Ok(c)
39+
.map(|(m, s)| -> Result<_, Error> {
40+
verify_message(&pk, &m, s)?;
41+
m.context.validate(ctx.host_timestamp())?;
42+
Ok(m)
4343
})
4444
.collect::<Result<Vec<_>, _>>()?;
4545

46-
let message = Message::from(commitments::aggregate_messages(messages)?);
46+
let message = ProxyMessage::from(commitments::aggregate_messages(messages)?);
4747
let proof = prove_commitment(ek, input.signer, message)?;
4848

49-
Ok(LightClientResult::AggregateMessages(
50-
AggregateMessagesResult(proof),
49+
Ok(LightClientResponse::AggregateMessages(
50+
AggregateMessagesResponse(proof),
5151
))
5252
}
5353

54-
fn verify_commitment(
54+
fn verify_message(
5555
verifier: &EnclavePublicKey,
56-
commitment: &UpdateClientMessage,
56+
message: &UpdateStateProxyMessage,
5757
signature: &[u8],
5858
) -> Result<(), Error> {
59-
let message_bytes = Message::UpdateClient(commitment.clone()).to_bytes();
59+
let message_bytes = ProxyMessage::UpdateState(message.clone()).to_bytes();
6060
verifier
6161
.verify(&message_bytes, signature)
6262
.map_err(Error::crypto)?;

enclave-modules/ecall-handler/src/light_client/init_client.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::prelude::*;
33
use context::Context;
44
use core::str::FromStr;
55
use crypto::Signer;
6-
use ecall_commands::{InitClientInput, InitClientResult, LightClientResult};
6+
use ecall_commands::{InitClientInput, InitClientResponse, LightClientResponse};
77
use lcp_types::{Any, ClientId};
88
use light_client::commitments::{prove_commitment, CommitmentProof};
99
use light_client::{ClientKeeper, ClientReader, LightClientResolver};
@@ -12,7 +12,7 @@ use store::KVStore;
1212
pub fn init_client<R: LightClientResolver, S: KVStore, K: Signer>(
1313
ctx: &mut Context<R, S, K>,
1414
input: InitClientInput,
15-
) -> Result<LightClientResult, Error> {
15+
) -> Result<LightClientResponse, Error> {
1616
ctx.set_timestamp(input.current_timestamp);
1717

1818
let any_client_state: Any = input.any_client_state.into();
@@ -33,7 +33,7 @@ pub fn init_client<R: LightClientResolver, S: KVStore, K: Signer>(
3333
} else {
3434
CommitmentProof::new_with_no_signature(res.message.to_bytes())
3535
};
36-
Ok(LightClientResult::InitClient(InitClientResult {
36+
Ok(LightClientResponse::InitClient(InitClientResponse {
3737
client_id,
3838
proof,
3939
}))

enclave-modules/ecall-handler/src/light_client/query.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,20 @@ use super::registry::get_light_client_by_client_id;
22
use crate::light_client::Error;
33
use context::Context;
44
use crypto::Signer;
5-
use ecall_commands::{LightClientResult, QueryClientInput, QueryClientResult};
5+
use ecall_commands::{LightClientResponse, QueryClientInput, QueryClientResponse};
66
use light_client::{ClientReader, LightClientResolver};
77
use store::KVStore;
88

99
pub fn query_client<R: LightClientResolver, S: KVStore, K: Signer>(
1010
ctx: &mut Context<R, S, K>,
1111
input: QueryClientInput,
12-
) -> Result<LightClientResult, Error> {
12+
) -> Result<LightClientResponse, Error> {
1313
let lc = get_light_client_by_client_id(ctx, &input.client_id)?;
1414
let any_client_state = ctx.client_state(&input.client_id)?;
1515
let any_consensus_state =
1616
ctx.consensus_state(&input.client_id, &lc.latest_height(ctx, &input.client_id)?)?;
1717

18-
Ok(LightClientResult::QueryClient(QueryClientResult {
18+
Ok(LightClientResponse::QueryClient(QueryClientResponse {
1919
any_client_state,
2020
any_consensus_state,
2121
}))

enclave-modules/ecall-handler/src/light_client/router.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::light_client::{
55
use context::Context;
66
use crypto::NopSigner;
77
use ecall_commands::{
8-
CommandContext, CommandResult, LightClientCommand, LightClientExecuteCommand,
8+
CommandContext, CommandResponse, LightClientCommand, LightClientExecuteCommand,
99
LightClientQueryCommand,
1010
};
1111
use enclave_environment::Env;
@@ -14,7 +14,7 @@ pub fn dispatch<E: Env>(
1414
env: E,
1515
cctx: CommandContext,
1616
command: LightClientCommand,
17-
) -> Result<CommandResult, Error> {
17+
) -> Result<CommandResponse, Error> {
1818
let res = match command {
1919
LightClientCommand::Execute(cmd) => {
2020
use LightClientExecuteCommand::*;
@@ -40,5 +40,5 @@ pub fn dispatch<E: Env>(
4040
}
4141
}
4242
};
43-
Ok(CommandResult::LightClient(res))
43+
Ok(CommandResponse::LightClient(res))
4444
}

enclave-modules/ecall-handler/src/light_client/update_client.rs

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,38 +3,52 @@ use crate::light_client::Error;
33
use crate::prelude::*;
44
use context::Context;
55
use crypto::Signer;
6-
use ecall_commands::{LightClientResult, UpdateClientInput, UpdateClientResult};
7-
use light_client::commitments::{
8-
prove_commitment, CommitmentProof, EmittedState, Message, UpdateClientMessage,
9-
};
10-
use light_client::{ClientKeeper, LightClientResolver};
6+
use ecall_commands::{LightClientResponse, UpdateClientInput, UpdateClientResponse};
7+
use light_client::commitments::{prove_commitment, CommitmentProof, EmittedState, ProxyMessage};
8+
use light_client::{ClientKeeper, LightClientResolver, UpdateClientResult};
119
use store::KVStore;
1210

1311
pub fn update_client<R: LightClientResolver, S: KVStore, K: Signer>(
1412
ctx: &mut Context<R, S, K>,
1513
input: UpdateClientInput,
16-
) -> Result<LightClientResult, Error> {
14+
) -> Result<LightClientResponse, Error> {
1715
ctx.set_timestamp(input.current_timestamp);
1816

1917
let lc = get_light_client_by_client_id(ctx, &input.client_id)?;
2018
let ek = ctx.get_enclave_key();
21-
let res = lc.update_client(ctx, input.client_id.clone(), input.any_header.into())?;
19+
match lc.update_client(ctx, input.client_id.clone(), input.any_header.into())? {
20+
UpdateClientResult::UpdateState(mut data) => {
21+
let message: ProxyMessage = {
22+
if input.include_state && data.message.emitted_states.is_empty() {
23+
data.message.emitted_states =
24+
vec![EmittedState(data.height, data.new_any_client_state.clone())];
25+
}
26+
data.message.into()
27+
};
2228

23-
let message: Message = {
24-
let mut msg = UpdateClientMessage::try_from(res.message)?;
25-
if input.include_state && msg.emitted_states.is_empty() {
26-
msg.emitted_states = vec![EmittedState(res.height, res.new_any_client_state.clone())];
27-
}
28-
msg.into()
29-
};
29+
ctx.store_any_client_state(input.client_id.clone(), data.new_any_client_state)?;
30+
ctx.store_any_consensus_state(
31+
input.client_id,
32+
data.height,
33+
data.new_any_consensus_state,
34+
)?;
3035

31-
ctx.store_any_client_state(input.client_id.clone(), res.new_any_client_state)?;
32-
ctx.store_any_consensus_state(input.client_id, res.height, res.new_any_consensus_state)?;
36+
let proof = if data.prove {
37+
prove_commitment(ek, input.signer, message)?
38+
} else {
39+
CommitmentProof::new_with_no_signature(message.to_bytes())
40+
};
41+
Ok(LightClientResponse::UpdateClient(UpdateClientResponse(
42+
proof,
43+
)))
44+
}
45+
UpdateClientResult::Misbehaviour(data) => {
46+
ctx.store_any_client_state(input.client_id, data.new_any_client_state)?;
3347

34-
let proof = if res.prove {
35-
prove_commitment(ek, input.signer, message)?
36-
} else {
37-
CommitmentProof::new_with_no_signature(message.to_bytes())
38-
};
39-
Ok(LightClientResult::UpdateClient(UpdateClientResult(proof)))
48+
let proof = prove_commitment(ek, input.signer, data.message.into())?;
49+
Ok(LightClientResponse::UpdateClient(UpdateClientResponse(
50+
proof,
51+
)))
52+
}
53+
}
4054
}

enclave-modules/ecall-handler/src/light_client/verify_state.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ use crate::light_client::Error;
33
use context::Context;
44
use crypto::Signer;
55
use ecall_commands::{
6-
LightClientResult, VerifyMembershipInput, VerifyMembershipResult, VerifyNonMembershipInput,
7-
VerifyNonMembershipResult,
6+
LightClientResponse, VerifyMembershipInput, VerifyMembershipResponse, VerifyNonMembershipInput,
7+
VerifyNonMembershipResponse,
88
};
99
use light_client::commitments::prove_commitment;
1010
use light_client::LightClientResolver;
@@ -13,7 +13,7 @@ use store::KVStore;
1313
pub fn verify_membership<R: LightClientResolver, S: KVStore, K: Signer>(
1414
ctx: &mut Context<R, S, K>,
1515
input: VerifyMembershipInput,
16-
) -> Result<LightClientResult, Error> {
16+
) -> Result<LightClientResponse, Error> {
1717
let ek = ctx.get_enclave_key();
1818
let lc = get_light_client_by_client_id(ctx, &input.client_id)?;
1919

@@ -27,15 +27,15 @@ pub fn verify_membership<R: LightClientResolver, S: KVStore, K: Signer>(
2727
input.proof.1,
2828
)?;
2929

30-
Ok(LightClientResult::VerifyMembership(VerifyMembershipResult(
31-
prove_commitment(ek, input.signer, res.message)?,
32-
)))
30+
Ok(LightClientResponse::VerifyMembership(
31+
VerifyMembershipResponse(prove_commitment(ek, input.signer, res.message.into())?),
32+
))
3333
}
3434

3535
pub fn verify_non_membership<R: LightClientResolver, S: KVStore, K: Signer>(
3636
ctx: &mut Context<R, S, K>,
3737
input: VerifyNonMembershipInput,
38-
) -> Result<LightClientResult, Error> {
38+
) -> Result<LightClientResponse, Error> {
3939
let ek = ctx.get_enclave_key();
4040
let lc = get_light_client_by_client_id(ctx, &input.client_id)?;
4141

@@ -48,7 +48,7 @@ pub fn verify_non_membership<R: LightClientResolver, S: KVStore, K: Signer>(
4848
input.proof.1,
4949
)?;
5050

51-
Ok(LightClientResult::VerifyNonMembership(
52-
VerifyNonMembershipResult(prove_commitment(ek, input.signer, res.message)?),
51+
Ok(LightClientResponse::VerifyNonMembership(
52+
VerifyNonMembershipResponse(prove_commitment(ek, input.signer, res.message.into())?),
5353
))
5454
}

0 commit comments

Comments
 (0)