-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
TSS attestation endpoint #1001
TSS attestation endpoint #1001
Changes from 10 commits
11f4b39
f795f69
5881b0e
5c73ab4
10ee387
3b9d337
3fb58a1
fe60c04
bebc2f8
f9afd5f
1b7309d
e03014e
2f0e2ae
30f67d3
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -70,6 +70,7 @@ sha1 ="0.10.6" | |
sha2 ="0.10.8" | ||
hkdf ="0.12.4" | ||
project-root ={ version="0.2.2", optional=true } | ||
tdx-quote ={ git="https://github.com/entropyxyz/tdx-quote", optional=true, features=["mock"] } | ||
|
||
[dev-dependencies] | ||
serial_test ="3.1.1" | ||
|
@@ -83,6 +84,7 @@ ethers-core ="2.0.14" | |
schnorrkel ={ version="0.11.4", default-features=false, features=["std"] } | ||
schemars ={ version="0.8.21" } | ||
subxt-signer="0.35.3" | ||
tdx-quote ={ git="https://github.com/entropyxyz/tdx-quote", features=["mock"] } | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do we need to have this in both norm deps and dev deps? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. the problem is if we don't, it wont compile in test mode without the |
||
|
||
# Note: We don't specify versions here because otherwise we run into a cyclical dependency between | ||
# `entropy-tss` and `entropy-testing-utils` when we try and publish the `entropy-tss` crate. | ||
|
@@ -102,7 +104,7 @@ vergen={ version="8.3.2", features=["build", "git", "gitcl"] } | |
default =['std'] | ||
std =["sp-core/std"] | ||
test_helpers=["dep:project-root"] | ||
unsafe =[] | ||
unsafe =["dep:tdx-quote"] | ||
alice =[] | ||
bob =[] | ||
# Enable this feature to run the integration tests for the wasm API of entropy-protocol | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -155,7 +155,7 @@ use crate::{ | |
r#unsafe::api::{delete, put, remove_keys, unsafe_get}, | ||
signing_client::{api::*, ListenerState}, | ||
user::api::*, | ||
validator::api::new_reshare, | ||
validator::api::{attest, new_reshare}, | ||
ameba23 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
}; | ||
|
||
#[derive(Clone)] | ||
|
@@ -178,6 +178,7 @@ pub fn app(app_state: AppState) -> Router { | |
.route("/user/sign_tx", post(sign_tx)) | ||
.route("/signer/proactive_refresh", post(proactive_refresh)) | ||
.route("/validator/reshare", post(new_reshare)) | ||
.route("/attest", post(attest)) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this should go lower into the unsafe endpoints There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. i can put it there for now but the idea is this same endpoint will be the real thing when There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. idk we can always change it when we remove the unsafe, it makes sense to me but your call There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. FWIW I think it's fine as is |
||
.route("/healthz", get(healthz)) | ||
.route("/version", get(get_version)) | ||
.route("/hashes", get(hashes)) | ||
|
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -360,3 +360,47 @@ pub async fn prune_old_holders( | |||||
validators_info.clone() | ||||||
}) | ||||||
} | ||||||
|
||||||
#[cfg(not(any(test, feature = "unsafe")))] | ||||||
pub async fn attest( | ||||||
State(_app_state): State<AppState>, | ||||||
_input: Bytes, | ||||||
) -> Result<StatusCode, ValidatorErr> { | ||||||
// Non-mock attestation (the real thing) will go here | ||||||
Err(ValidatorErr::NotImplemented) | ||||||
} | ||||||
|
||||||
#[cfg(any(test, feature = "unsafe"))] | ||||||
pub async fn attest( | ||||||
ameba23 marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
State(app_state): State<AppState>, | ||||||
input: Bytes, | ||||||
) -> Result<(StatusCode, Bytes), ValidatorErr> { | ||||||
// TODO #982 confirm with the chain that an attestation should be happenning | ||||||
ameba23 marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
let nonce = input[..].try_into()?; | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. i went for |
||||||
|
||||||
let rpc = get_rpc(&app_state.configuration.endpoint).await?; | ||||||
|
||||||
let block_number = rpc | ||||||
.chain_get_header(None) | ||||||
.await? | ||||||
.ok_or_else(|| ValidatorErr::OptionUnwrapError("Failed to get block number".to_string()))? | ||||||
.number; | ||||||
|
||||||
// In the real thing this is the hardware key used in the quoting enclave | ||||||
let signing_key = tdx_quote::SigningKey::random(&mut OsRng); | ||||||
|
||||||
let (signer, x25519_secret) = get_signer_and_x25519_secret(&app_state.kv_store).await?; | ||||||
let public_key = x25519_dalek::PublicKey::from(&x25519_secret); | ||||||
|
||||||
let input_data = entropy_shared::QuoteInputData::new( | ||||||
signer.signer().public().into(), | ||||||
*public_key.as_bytes(), | ||||||
nonce, | ||||||
block_number, | ||||||
); | ||||||
|
||||||
let quote = tdx_quote::Quote::mock(signing_key.clone(), input_data.0); | ||||||
// Here we would submit an attest extrinsic to the chain - but for now we just include it in the | ||||||
// response | ||||||
Ok((StatusCode::OK, Bytes::from(quote.as_bytes().to_vec()))) | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Just a small thing for the future - would be nice to have a There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think thats only worth doing if we continue to include the quote in the http response. Initially i am proposing to only have on-chain quote verification, so the response body here will be empty and the quote will be included in an extrinsic instead. I want to keep the dependencies of But if we decide to do quote verification by other TS servers, then we will want this. |
||||||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -255,3 +255,25 @@ async fn test_forbidden_keys() { | |
let should_pass = check_forbidden_key("test"); | ||
assert_eq!(should_pass.unwrap(), ()); | ||
} | ||
|
||
#[tokio::test] | ||
#[serial] | ||
async fn test_attest() { | ||
initialize_test_logger().await; | ||
clean_tests(); | ||
|
||
let _cxt = test_node_process_testing_state(false).await; | ||
let (_validator_ips, _validator_ids) = spawn_testing_validators(false).await; | ||
|
||
let client = reqwest::Client::new(); | ||
let res = client | ||
.post(format!("http://127.0.0.1:3001/attest")) | ||
.body([0; 32].to_vec()) | ||
.send() | ||
.await | ||
.unwrap(); | ||
assert_eq!(res.status(), 200); | ||
let quote = res.bytes().await.unwrap(); | ||
// This verifies the signature in the quote | ||
tdx_quote::Quote::from_bytes("e).unwrap(); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Instead of |
||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is in
entropy-shared
because it will also be used by the chain when verifying quote input