Skip to content

Commit f8efaa4

Browse files
tarrencevclaude
andcommitted
fix(tee): address review feedback and simplify TEE implementation
- Remove mock provider from CLI (keep only for tests) - Simplify TeeProviderType enum to only include SevSnp - Replace panic! with proper anyhow::bail! error handling - Remove unused uuid dependency from workspace - Add PartialEq, Eq derives to TeeQuoteResponse for testability - Make tracing dependency optional (only with snp feature) - Consolidate tee feature flags (tee now enables tee-snp automatically) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent edd7a1c commit f8efaa4

File tree

10 files changed

+43
-122
lines changed

10 files changed

+43
-122
lines changed

Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,6 @@ tokio = { version = "1.39.2", features = [ "full" ] }
170170
tokio-util = "0.7.12"
171171
toml = "0.8"
172172
url = { version = "2.4.0", features = [ "serde" ] }
173-
uuid = { version = "1.0", features = [ "v4" ] }
174173

175174
# serde
176175
serde = { version = "1.0", features = [ "derive" ] }

crates/cli/Cargo.toml

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,8 @@ cartridge = [
4242
"katana-node/cartridge",
4343
"katana-rpc-server/cartridge",
4444
]
45-
default = [ "cartridge", "server" ]
46-
explorer = [ "katana-node/explorer", "katana-utils/explorer" ]
47-
native = [ "katana-node/native" ]
48-
server = [ ]
49-
tee = [ "dep:katana-tee", "katana-node/tee" ]
50-
tee-mock = [ "tee", "katana-node/tee-mock", "katana-tee/mock" ]
51-
tee-snp = [ "tee", "katana-node/tee-snp", "katana-tee/snp" ]
45+
default = ["cartridge", "server"]
46+
explorer = ["katana-node/explorer", "katana-utils/explorer"]
47+
native = ["katana-node/native"]
48+
server = []
49+
tee = ["dep:katana-tee", "katana-node/tee", "katana-node/tee-snp", "katana-tee/snp"]

crates/cli/src/args.rs

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -451,31 +451,7 @@ impl SequencerNodeArgs {
451451

452452
#[cfg(feature = "tee")]
453453
fn tee_config(&self) -> Option<TeeConfig> {
454-
use katana_tee::TeeProviderType;
455-
456-
use crate::options::TeeProviderType as CliTeeProviderType;
457-
458-
self.tee.tee_provider.map(|provider| {
459-
let provider_type = match provider {
460-
CliTeeProviderType::SevSnp => {
461-
#[cfg(feature = "tee-snp")]
462-
{
463-
TeeProviderType::SevSnp
464-
}
465-
#[cfg(not(feature = "tee-snp"))]
466-
{
467-
panic!("SEV-SNP TEE provider requires the 'tee-snp' feature to be enabled")
468-
}
469-
}
470-
#[cfg(feature = "tee-mock")]
471-
CliTeeProviderType::Mock => TeeProviderType::Mock,
472-
#[cfg(not(feature = "tee-mock"))]
473-
CliTeeProviderType::Mock => {
474-
panic!("Mock TEE provider requires the 'tee-mock' feature to be enabled")
475-
}
476-
};
477-
TeeConfig { provider_type }
478-
})
454+
self.tee.tee_provider.map(|provider_type| TeeConfig { provider_type })
479455
}
480456

481457
/// Parse the node config from the command line arguments and the config file,

crates/cli/src/options.rs

Lines changed: 10 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -761,58 +761,24 @@ fn parse_pruning_mode(s: &str) -> Result<PruningMode, String> {
761761
}
762762
}
763763

764-
/// TEE provider types available for attestation.
765-
#[cfg(feature = "tee")]
766-
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
767-
#[serde(rename_all = "lowercase")]
768-
pub enum TeeProviderType {
769-
/// AMD SEV-SNP (Secure Encrypted Virtualization - Secure Nested Paging).
770-
SevSnp,
771-
/// Mock provider for testing (requires mock feature in katana-tee).
772-
Mock,
773-
}
774-
775-
#[cfg(feature = "tee")]
776-
impl std::fmt::Display for TeeProviderType {
777-
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
778-
match self {
779-
Self::SevSnp => write!(f, "sev-snp"),
780-
Self::Mock => write!(f, "mock"),
781-
}
782-
}
783-
}
784-
785-
#[cfg(feature = "tee")]
786-
impl std::str::FromStr for TeeProviderType {
787-
type Err = String;
788-
789-
fn from_str(s: &str) -> Result<Self, Self::Err> {
790-
match s.to_lowercase().as_str() {
791-
"sev-snp" | "snp" => Ok(Self::SevSnp),
792-
"mock" => Ok(Self::Mock),
793-
other => {
794-
Err(format!("Unknown TEE provider: {}. Valid options are: sev-snp, mock", other))
795-
}
796-
}
797-
}
798-
}
799-
800764
#[cfg(feature = "tee")]
801765
#[derive(Debug, Args, Clone, Serialize, Deserialize, Default, PartialEq)]
802766
#[command(next_help_heading = "TEE options")]
803767
pub struct TeeOptions {
804-
/// Enable TEE attestation support with the specified provider.
768+
/// Enable TEE attestation support with AMD SEV-SNP.
805769
///
806770
/// When enabled, the TEE RPC API becomes available for generating
807-
/// hardware-backed attestation quotes. The provider type determines
808-
/// which TEE backend to use for quote generation.
809-
///
810-
/// Available providers:
811-
/// - sev-snp: AMD SEV-SNP (Secure Encrypted Virtualization) - requires SEV-SNP VM
812-
/// - mock: Mock provider for testing (does not require TEE hardware)
771+
/// hardware-backed attestation quotes. Requires running in an SEV-SNP VM
772+
/// with /dev/sev-guest available.
813773
#[arg(long = "tee.provider", value_name = "PROVIDER")]
774+
#[arg(value_parser = parse_tee_provider)]
814775
#[serde(default)]
815-
pub tee_provider: Option<TeeProviderType>,
776+
pub tee_provider: Option<katana_tee::TeeProviderType>,
777+
}
778+
779+
#[cfg(feature = "tee")]
780+
fn parse_tee_provider(s: &str) -> Result<katana_tee::TeeProviderType, String> {
781+
s.parse()
816782
}
817783

818784
#[cfg(feature = "tee")]

crates/node/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,5 +50,4 @@ cartridge = ["katana-rpc-api/cartridge", "katana-rpc-server/cartridge"]
5050
explorer = ["katana-rpc-server/explorer"]
5151
native = ["katana-executor/native"]
5252
tee = ["dep:katana-tee", "katana-rpc-api/tee", "katana-rpc-server/tee"]
53-
tee-mock = ["tee", "katana-tee/mock"]
5453
tee-snp = ["tee", "katana-tee/snp"]

crates/node/src/lib.rs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -280,13 +280,21 @@ where
280280
use katana_tee::{TeeProvider, TeeProviderType};
281281

282282
let tee_provider: Arc<dyn TeeProvider> = match tee_config.provider_type {
283-
#[cfg(feature = "tee-snp")]
284-
TeeProviderType::SevSnp => Arc::new(
285-
katana_tee::SevSnpProvider::new()
286-
.context("Failed to initialize SEV-SNP provider")?,
287-
),
288-
#[cfg(feature = "tee-mock")]
289-
TeeProviderType::Mock => Arc::new(katana_tee::MockProvider::new()),
283+
TeeProviderType::SevSnp => {
284+
#[cfg(feature = "tee-snp")]
285+
{
286+
Arc::new(
287+
katana_tee::SevSnpProvider::new()
288+
.context("Failed to initialize SEV-SNP provider")?,
289+
)
290+
}
291+
#[cfg(not(feature = "tee-snp"))]
292+
{
293+
anyhow::bail!(
294+
"SEV-SNP TEE provider requires the 'tee-snp' feature to be enabled"
295+
);
296+
}
297+
}
290298
};
291299

292300
let api = TeeApi::new(provider.clone(), tee_provider);

crates/rpc/rpc-api/src/tee.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use katana_primitives::Felt;
55
use serde::{Deserialize, Serialize};
66

77
/// Response type for TEE quote generation.
8-
#[derive(Debug, Clone, Serialize, Deserialize)]
8+
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
99
#[serde(rename_all = "camelCase")]
1010
pub struct TeeQuoteResponse {
1111
/// The raw attestation quote bytes (hex-encoded).

crates/tee/Cargo.toml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ version.workspace = true
66

77
[dependencies]
88
thiserror.workspace = true
9-
tracing.workspace = true
9+
tracing = { workspace = true, optional = true }
1010
bincode = { workspace = true, optional = true }
1111
sev-snp = { workspace = true, optional = true }
1212

@@ -16,5 +16,4 @@ tempfile.workspace = true
1616

1717
[features]
1818
default = []
19-
mock = []
20-
snp = ["dep:sev-snp", "dep:bincode"]
19+
snp = ["dep:sev-snp", "dep:bincode", "dep:tracing"]

crates/tee/src/lib.rs

Lines changed: 9 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
//!
88
//! - **SEV-SNP (AMD Secure Encrypted Virtualization)**: Via Automata Network SDK (requires `snp`
99
//! feature)
10-
//! - **Mock**: For testing on non-TEE hardware (requires `mock` feature)
1110
//!
1211
//! # Example
1312
//!
@@ -24,50 +23,32 @@
2423
mod error;
2524
mod provider;
2625

27-
#[cfg(any(test, feature = "mock"))]
26+
#[cfg(test)]
2827
mod mock;
2928

3029
#[cfg(feature = "snp")]
3130
mod snp;
3231

3332
pub use error::TeeError;
34-
#[cfg(any(test, feature = "mock"))]
33+
#[cfg(test)]
3534
pub use mock::MockProvider;
3635
pub use provider::TeeProvider;
3736
#[cfg(feature = "snp")]
3837
pub use snp::SevSnpProvider;
3938

40-
/// TEE provider type enumeration for CLI parsing.
39+
/// TEE provider type enumeration.
40+
///
41+
/// Currently only SEV-SNP is supported for production use.
4142
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
4243
pub enum TeeProviderType {
43-
/// AMD SEV-SNP provider (only available with snp feature).
44-
#[cfg(feature = "snp")]
44+
/// AMD SEV-SNP provider.
4545
SevSnp,
46-
/// Mock provider for testing (only available with mock feature).
47-
#[cfg(any(test, feature = "mock"))]
48-
Mock,
49-
}
50-
51-
impl Default for TeeProviderType {
52-
fn default() -> Self {
53-
#[cfg(feature = "snp")]
54-
{
55-
Self::SevSnp
56-
}
57-
#[cfg(not(feature = "snp"))]
58-
{
59-
Self::Mock
60-
}
61-
}
6246
}
6347

6448
impl std::fmt::Display for TeeProviderType {
6549
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6650
match self {
67-
#[cfg(feature = "snp")]
6851
Self::SevSnp => write!(f, "sev-snp"),
69-
#[cfg(any(test, feature = "mock"))]
70-
Self::Mock => write!(f, "mock"),
7152
}
7253
}
7354
}
@@ -77,11 +58,10 @@ impl std::str::FromStr for TeeProviderType {
7758

7859
fn from_str(s: &str) -> Result<Self, Self::Err> {
7960
match s.to_lowercase().as_str() {
80-
#[cfg(feature = "snp")]
8161
"sev-snp" | "snp" => Ok(Self::SevSnp),
82-
#[cfg(any(test, feature = "mock"))]
83-
"mock" => Ok(Self::Mock),
84-
other => Err(format!("Unknown TEE provider type: {}", other)),
62+
other => {
63+
Err(format!("Unknown TEE provider: '{}'. Available providers: sev-snp", other))
64+
}
8565
}
8666
}
8767
}

crates/tee/src/mock.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use tracing::debug;
2-
31
use crate::error::TeeError;
42
use crate::provider::TeeProvider;
53

@@ -27,8 +25,6 @@ impl MockProvider {
2725

2826
impl TeeProvider for MockProvider {
2927
fn generate_quote(&self, user_data: &[u8; 64]) -> Result<Vec<u8>, TeeError> {
30-
debug!(target: "tee::mock", "Generating mock attestation quote");
31-
3228
// Mock quote format:
3329
// [4 bytes: magic] [prefix] [64 bytes: user_data] [4 bytes: checksum]
3430
let magic = b"MOCK";

0 commit comments

Comments
 (0)