Code Monkey home page Code Monkey logo

rust-spdm's Introduction

CI Deny Format Fuzzing

rust-spdm

This project provides a Rust language implementation of SPDM, IDE_KM and TDISP. These protocols are used to facilitate direct device assignment for Trusted Execution Environment I/O (TEE-I/O) in Confidential Computing.

There are a number of use cases that benefit from including devices and accelerators in the trust boundary of a Confidential Virtual Machine (CVM). In machine learning, for example, these protocols can be used to build a trusted connection between a GPU’s TEE and a CVM to accelerate performance.

Features

Specification

DMTF DSP0274 Security Protocol and Data Model (SPDM) Specification (version 1.2.2)

DMTF DSP0277 Secured Messages using SPDM Specification (version 1.1.1)

PCIe Base Specification Version 6.0.1, 6.1

PCIe DOE 1.0 ECN in PCIe 6.0, DOE 1.1 ECN in PCIe 6.1.

PCIe CMA 1.0 ECN in PCIe 6.0, CMA 1.1 ECN in PCIe TBD.

PCIe IDE ECN in PCIe 6.0.

PCIe TDISP ECN in PCIe 6.1.

SPDM Implemented Requests and Responses

SPDM 1.0: GET_VERSION, GET_CAPABILITIES, NEGOTIATE_ALGORITHMS, GET_DIGESTS, GET_CERTIFICATE, CHALLENGE, and GET_MEASUREMENTS.

SPDM 1.1: KEY_EXCHANGE, FINISH, PSK_EXCHANGE, PSK_FINISH, END_SESSION, HEARTBEAT, KEY_UPDATE messages.

SPDM 1.2: Support 1.0/1.1 messages and new format. New SPDM 1.2 messages are not supported yet.

SPDM 1.3: Not support yet.

SPDM Vendor Defined Message

IDE_KM 1.0 in PCIe 6.0/6.1.

TDISP 1.0 in PCIe 6.1.

SPDM Capability Support

Requester: ENCRYPT_CAP, MAC_CAP, KEY_EX_CAP, PSK_CAP, HBEAT_CAP, KEY_UPD_CAP, HANDSHAKE_IN_THE_CLEAR_CAP.

Responder: CERT_CAP, CHAL_CAP, MEAS_CAP_NO_SIG, MEAS_CAP_SIG, MEAS_FRESH_CAP, ENCRYPT_CAP, MAC_CAP, KEY_EX_CAP, PSK_CAP_WITHOUT_CONTEXT, PSK_CAP_WITH_CONTEXT, HBEAT_CAP, KEY_UPD_CAP, HANDSHAKE_IN_THE_CLEAR_CAP.

SPDM Cryptographic Algorithm Support

It depends on crypto wrapper. Current support algorithms:

  • Hash: SHA2(256/384/512)
  • Signature: RSA-SSA(2048/3072/4096) / RSA-PSS(2048/3072/4096) / ECDSA (P256/P384)
  • KeyExchange: ECDHE(P256/P384)
  • AEAD: AES_GCM(128/256) / ChaCha20Poly1305

Documentation

All documents are put at doc folder.

Build Rust SPDM

Checkout repo

git clone https://github.com/intel/rust-spdm.git
git submodule update --init --recursive

Then patch the ring/webpki.

sh_script/pre-build.sh

Tools

  1. Install RUST

Please use nightly-2023-08-28.

  1. Install NASM

Please make sure nasm can be found in PATH.

  1. Install LLVM

Please make sure clang can be found in PATH.

  1. Install Perl

    1. This is for crate ring
    2. This is for windows

Please make sure perl can be found in PATH.

Unset env (CC and AR):

export CC=
export AR=

Set the following environment variables:

export AR_x86_64_unknown_none=llvm-ar
export CC_x86_64_unknown_none=clang

Build OS application

Enter linux shell or mingw shell (e.g. git bash) in windows.

cargo clippy
cargo fmt
cargo build

Build no_std spdm

pushd spdmlib
cargo build -Z build-std=core,alloc,compiler_builtins --target x86_64-unknown-none --release --no-default-features --features="spdm-ring"

Run Rust SPDM emulator

Run emulator with default feature

Open one command windows and run:

cargo run -p spdm-responder-emu --no-default-features --features "spdm-ring,hashed-transcript-data"

Open another command windows and run:

cargo run -p spdm-requester-emu --no-default-features --features "spdm-ring,hashed-transcript-data"

Run emulator with selected feature

The following list shows the supported combinations for both spdm-requester-emu and spdm-responder-emu

Features CryptoLibrary Hashed transcript data support Notes
spdm-ring ring No use ring as crypto library with hashed-transcript-data disabled
spdm-ring,hashed-transcript-data ring Yes use ring as crypto library with hashed-transcript-data enabled
spdm-mbedtls mbedtls No use mbedtls as crypto library with hashed-transcript-data disabled
spdm-mbedtls,hashed-transcript-data mbedtls Yes use mbedtls as crypto library with hashed-transcript-data

For example, run the emulator with spdm-ring enabled and without hashed-transcript-data enabled.
Open one command windows and run:

cargo run -p spdm-responder-emu --no-default-features --features "spdm-ring"

run the emulator with spdm-mbedtls enabled and with hashed-transcript-data enabled.
Open another command windows and run:

cargo run -p spdm-requester-emu --no-default-features --features "spdm-mbedtls,hashed-transcript-data"

NOTE: In order to run the emu without hashed-transcript-data, please change max_cert_chain_data_size in spdmlib/etc/config.json from 4096 to 3500.

Cross test with spdm_emu

Open one command windows in workspace and run:

git clone https://github.com/DMTF/spdm-emu.git
cd spdm-emu
git submodule update --init --recursive
mkdir build
cd build
cmake -G"NMake Makefiles" -DARCH=<x64|ia32> -DTOOLCHAIN=<toolchain> -DTARGET=<Debug|Release> -DCRYPTO=<mbedtls|openssl> ..
nmake copy_sample_key
nmake

Test rust-spdm as requester:

  1. run libspdm in spdm-emu as responder:
cd bin
spdm_responder_emu.exe --trans PCI_DOE
  1. run rust-spdm-emu as requester:
cargo run -p spdm-requester-emu --no-default-features --features "spdm-ring,hashed-transcript-data"

Test rust-spdm as responder:

  1. run rust-spdm-emu as Test rust-spdm as responder:
cargo run -p spdm-responder-emu --no-default-features --features "spdm-ring,hashed-transcript-data"
  1. run libspdm in spdm-emu as requester:
cd bin
spdm_requester_emu.exe --trans PCI_DOE --exe_conn DIGEST,CERT,CHAL,MEAS --exe_session KEY_EX,PSK,KEY_UPDATE,HEARTBEAT,MEAS,DIGEST,CERT

Run test cases

Setting up enough stack before running tests

export RUST_MIN_STACK=10485760

Test with hashed-transcript-data:

cargo test --no-default-features --features "spdmlib/std,spdmlib/spdm-ring,spdmlib/hashed-transcript-data" -- --test-threads=1

Test without hashed-transcript-data:

cargo test --no-default-features --features "spdmlib/std,spdmlib/spdm-ring" -- --test-threads=1

To run a specific test, use cargo test <test_func_name>

To run test with println!() message, use cargo test -- --nocapture

Known limitation

This package is only the sample code to show the concept. It does not have a full validation such as robustness functional test and fuzzing test. It does not meet the production quality yet. Any codes including the API definition, the libary and the drivers are subject to change.

rust-spdm's People

Contributors

longlongyang avatar xiaoyuxlu avatar jyao1 avatar gaojiaqi7 avatar dependabot[bot] avatar xiaotia3 avatar dcmiddle avatar ctz avatar rdower avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.