Verify Intel SGX and TDX attestation quotes. dcap-qvl is a small, pure-Rust
library that verifies DCAP (Data Center Attestation Primitives) quotes, with
native bindings for Python, Go, Kotlin, and Swift — plus a standalone
pure-JavaScript implementation for the web.
- Verifies SGX and TDX quotes against Intel's trust chain.
- Gets collateral for you from a PCCS or Intel PCS — or verifies fully offline with collateral you already have.
- Extracts report fields from a quote: measurements, report data, TCB status, and advisory IDs.
- Runs everywhere. The pure-Rust core works on servers, mobile,
WebAssembly, and on-chain (
no_std).
By default it uses Phala Network's PCCS (https://pccs.phala.network) for
better availability and lower rate limits.
| Language | Package | Install | Guide |
|---|---|---|---|
| Rust | dcap-qvl |
cargo add dcap-qvl |
docs.rs |
| Python | dcap-qvl |
pip install dcap-qvl |
python-bindings/ |
| JavaScript (pure JS) | @phala/dcap-qvl |
npm i @phala/dcap-qvl |
dcap-qvl-js/ |
| Go | github.com/Phala-Network/dcap-qvl/golang-bindings |
go get github.com/Phala-Network/dcap-qvl/golang-bindings |
golang-bindings/ |
| Android (Kotlin/Java) | com.phala:dcap-qvl-android |
Gradle | dcap-qvl-mobile/android/ |
| Swift (iOS/macOS) | dcap-qvl-swift |
SwiftPM | dcap-qvl-mobile/ios/ |
The JavaScript package is a standalone pure-JS port that runs in Node and the
browser with no native dependencies. WebAssembly builds of the Rust core are
also published as @phala/dcap-qvl-web
and @phala/dcap-qvl-node.
There's also a command-line tool, dcap-qvl-cli (cargo install dcap-qvl-cli).
To verify a quote you need three things:
- the quote bytes,
- the collateral for it — the certificates, CRLs, and TCB info that prove the quote against Intel's trust chain, served by a PCCS, and
- the current time, to check the collateral hasn't expired.
verify() checks the signature chain and TCB status and returns the report plus
a status string. If you don't already have collateral, the library can fetch it
from a PCCS for you in one step.
use dcap_qvl::collateral::CollateralClient;
use dcap_qvl::verify::verify;
use dcap_qvl::PHALA_PCCS_URL;
let quote = std::fs::read("quote.bin")?;
let collateral = CollateralClient::with_default_http(PHALA_PCCS_URL)?
.fetch("e)
.await?;
let now = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)?
.as_secs();
let report = verify("e, &collateral, now)?;
println!("status = {}", report.status);See the docs.rs page for crypto-backend selection,
feature flags, no_std, and offline verification.
import asyncio, dcap_qvl
async def main():
quote = open("quote.bin", "rb").read()
result = await dcap_qvl.get_collateral_and_verify(quote) # defaults to Phala PCCS
print(result.status)
asyncio.run(main())import { getCollateralAndVerify } from '@phala/dcap-qvl';
const result = await getCollateralAndVerify(quoteBuffer); // defaults to Phala PCCS
console.log(result.status);import com.phala.dcapqvl.*
// collateralJson is the raw PCCS response body — fetch it with OkHttp / Ktor.
val report = verify(rawQuote, collateralJson, nowSecs)
println(report.status)import DcapQvl
let report = try verify(rawQuote: rawQuote, collateralJson: collateralJson, nowSecs: nowSecs)
print(report.status)import dcap "github.com/Phala-Network/dcap-qvl/golang-bindings"
report, _ := dcap.GetCollateralAndVerify(rawQuote, dcap.PhalaPCCSURL)
fmt.Println(report.Status)Each binding's directory (linked in the table above) has full documentation and runnable examples.
Common tasks are in the Makefile:
cargo test # test the Rust core
make build_python # build + test the Python bindings
make test_wasm # test the WASM packages
make build_mobile_android # build the Android AAR
make build_mobile_ios # build the iOS XCFramework (macOS only)A single v<X.Y.Z> tag publishes every ecosystem at one version — crates.io,
PyPI, npm, Maven Central, and the Swift Package Index. See
dcap-qvl-mobile/RELEASING.md.
MIT — see LICENSE.