dcap-qvl


Namedcap-qvl JSON
Version 0.3.0 PyPI version JSON
download
home_pageNone
SummaryPython bindings for DCAP (Data Center Attestation Primitives) quote verification library
upload_time2025-07-31 06:26:14
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseMIT
keywords sgx tdx dcap attestation verification cryptography
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Python Bindings for DCAP-QVL

This package provides Python bindings for the DCAP (Data Center Attestation Primitives) quote verification library implemented in Rust.

## Quick Start

```bash
# Install from PyPI
pip install dcap-qvl

# Basic usage
python -c "
import dcap_qvl
print('DCAP-QVL Python bindings successfully installed!')
print(f'Available functions: {dcap_qvl.__all__}')
"
```

## Features

- Verify SGX and TDX quotes
- Handle quote collateral data
- Parse verification results
- Pure Rust implementation with Python bindings
- Cross-platform compatibility (Linux, macOS, Windows)
- Synchronous collateral fetching from PCCS/PCS
- Compatible with Python 3.8+

## Installation

### From PyPI (recommended)

```bash
pip install dcap-qvl
```

### Using uv

```bash
uv add dcap-qvl
```

## Usage

### Basic Quote Verification

```python
import dcap_qvl
import json
import time

# Load quote data (binary)
with open("path/to/quote", "rb") as f:
    quote_data = f.read()

# Load collateral data (JSON)
with open("path/to/collateral.json", "r") as f:
    collateral_json = json.load(f)

# Create collateral object
collateral = dcap_qvl.QuoteCollateralV3.from_json(json.dumps(collateral_json))

# Verify the quote
now = int(time.time())
try:
    result = dcap_qvl.verify(quote_data, collateral, now)
    print(f"Verification successful! Status: {result.status}")
    print(f"Advisory IDs: {result.advisory_ids}")
except ValueError as e:
    print(f"Verification failed: {e}")
```

### Working with Collateral Data

```python
# Create collateral manually
collateral = dcap_qvl.QuoteCollateralV3(
    pck_crl_issuer_chain="...",
    root_ca_crl=b"...",  # bytes
    pck_crl=b"...",      # bytes
    tcb_info_issuer_chain="...",
    tcb_info="...",      # JSON string
    tcb_info_signature=b"...",  # bytes
    qe_identity_issuer_chain="...",
    qe_identity="...",   # JSON string
    qe_identity_signature=b"...",  # bytes
)

# Serialize to JSON
json_str = collateral.to_json()

# Deserialize from JSON
collateral = dcap_qvl.QuoteCollateralV3.from_json(json_str)
```

## API Reference

### Collateral Functions

#### `get_collateral(pccs_url: str, raw_quote: bytes) -> QuoteCollateralV3`

Get collateral from a custom PCCS URL.

**Parameters:**
- `pccs_url`: PCCS URL (e.g., "https://api.trustedservices.intel.com")
- `raw_quote`: Raw quote data as bytes

**Returns:**
- `QuoteCollateralV3`: Quote collateral data

**Raises:**
- `ValueError`: If quote is invalid or FMSPC cannot be extracted
- `RuntimeError`: If network request fails
- `ImportError`: If requests library is not available

**Example:**
```python
import dcap_qvl

pccs_url = "https://api.trustedservices.intel.com"
quote_data = open("quote.bin", "rb").read()
collateral = dcap_qvl.get_collateral(pccs_url, quote_data)
print(f"Got collateral: {len(collateral.tcb_info)} chars")
```

#### `get_collateral_from_pcs(raw_quote: bytes) -> QuoteCollateralV3`

Get collateral from Intel's PCS (default).

**Parameters:**
- `raw_quote`: Raw quote data as bytes

**Returns:**
- `QuoteCollateralV3`: Quote collateral data

**Raises:**
- `ValueError`: If quote is invalid or FMSPC cannot be extracted
- `RuntimeError`: If network request fails
- `ImportError`: If requests library is not available

#### `get_collateral_and_verify(raw_quote: bytes, pccs_url: Optional[str] = None) -> VerifiedReport`

Get collateral and verify quote in one step.

**Parameters:**
- `raw_quote`: Raw quote data as bytes
- `pccs_url`: Optional PCCS URL (uses Intel PCS if None)

**Returns:**
- `VerifiedReport`: Verification results

**Raises:**
- `ValueError`: If quote is invalid or verification fails
- `RuntimeError`: If network request fails
- `ImportError`: If requests library is not available

**Example:**
```python
import dcap_qvl

quote_data = open("quote.bin", "rb").read()
result = dcap_qvl.get_collateral_and_verify(quote_data)
print(f"Status: {result.status}")
print(f"Advisory IDs: {result.advisory_ids}")
```

### Classes

#### `QuoteCollateralV3`

Represents quote collateral data required for verification.

**Constructor:**
```python
QuoteCollateralV3(
    pck_crl_issuer_chain: str,
    root_ca_crl: bytes,
    pck_crl: bytes,
    tcb_info_issuer_chain: str,
    tcb_info: str,
    tcb_info_signature: bytes,
    qe_identity_issuer_chain: str,
    qe_identity: str,
    qe_identity_signature: bytes,
)
```

**Methods:**
- `to_json() -> str`: Serialize to JSON string
- `from_json(json_str: str) -> QuoteCollateralV3`: Create from JSON string (static method)

**Properties:**
- `pck_crl_issuer_chain: str`
- `root_ca_crl: bytes`
- `pck_crl: bytes`
- `tcb_info_issuer_chain: str`
- `tcb_info: str`
- `tcb_info_signature: bytes`
- `qe_identity_issuer_chain: str`
- `qe_identity: str`
- `qe_identity_signature: bytes`

#### `VerifiedReport`

Contains the results of quote verification.

**Properties:**
- `status: str`: Verification status
- `advisory_ids: List[str]`: List of advisory IDs

**Methods:**
- `to_json() -> str`: Serialize to JSON string

### Functions

#### `verify(raw_quote: bytes, collateral: QuoteCollateralV3, now_secs: int) -> VerifiedReport`

Verify a quote with the provided collateral data.

**Parameters:**
- `raw_quote`: Raw quote data as bytes
- `collateral`: Quote collateral data
- `now_secs`: Current timestamp in seconds since Unix epoch

**Returns:**
- `VerifiedReport`: Verification results

**Raises:**
- `ValueError`: If verification fails

## Development

### Building from Source

If you want to build from source or contribute to development:

```bash
# Clone the repository
git clone https://github.com/Phala-Network/dcap-qvl.git
cd dcap-qvl/python-bindings

# Install development dependencies (including maturin)
uv sync

# Build and install the Python extension in development mode
uv run maturin develop --features python

# Run tests
uv run python -m pytest tests/test_python_bindings.py
```

**Note:** maturin is only required for building from source. Regular users installing from PyPI don't need maturin.

### Running Examples

After installing the package, you can run the examples:

```bash
# Download the examples from the repository
git clone https://github.com/Phala-Network/dcap-qvl.git
cd dcap-qvl/python-bindings

# Basic functionality test
python examples/basic_test.py

# Full example (requires sample data files)
python examples/python_example.py
```

Or if you're using uv for development:

```bash
# Basic functionality test
uv run python examples/basic_test.py

# Full example (requires sample data files)
uv run python examples/python_example.py
```

### Testing Across Python Versions

The project includes comprehensive testing across all supported Python versions:

```bash
# Quick test across all Python versions
make test_python_versions

# Test current Python version only
make test_python
```

See [PYTHON_TESTING.md](PYTHON_TESTING.md) for detailed information about Python version compatibility testing.

## Requirements

### For regular usage (installing from PyPI):
- Python 3.8+

### For development (building from source):
- Python 3.8+
- Rust toolchain (rustc, cargo)
- maturin (automatically installed with `uv sync`)

## License

MIT License - see [LICENSE](LICENSE) for details.

## Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "dcap-qvl",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "sgx, tdx, dcap, attestation, verification, cryptography",
    "author": null,
    "author_email": "Kevin Wang <wy721@qq.com>",
    "download_url": "https://files.pythonhosted.org/packages/83/78/c785b359b2de4277acb8fdc271c10361a4f140c88dd8e1ee633f5807c977/dcap_qvl-0.3.0.tar.gz",
    "platform": null,
    "description": "# Python Bindings for DCAP-QVL\n\nThis package provides Python bindings for the DCAP (Data Center Attestation Primitives) quote verification library implemented in Rust.\n\n## Quick Start\n\n```bash\n# Install from PyPI\npip install dcap-qvl\n\n# Basic usage\npython -c \"\nimport dcap_qvl\nprint('DCAP-QVL Python bindings successfully installed!')\nprint(f'Available functions: {dcap_qvl.__all__}')\n\"\n```\n\n## Features\n\n- Verify SGX and TDX quotes\n- Handle quote collateral data\n- Parse verification results\n- Pure Rust implementation with Python bindings\n- Cross-platform compatibility (Linux, macOS, Windows)\n- Synchronous collateral fetching from PCCS/PCS\n- Compatible with Python 3.8+\n\n## Installation\n\n### From PyPI (recommended)\n\n```bash\npip install dcap-qvl\n```\n\n### Using uv\n\n```bash\nuv add dcap-qvl\n```\n\n## Usage\n\n### Basic Quote Verification\n\n```python\nimport dcap_qvl\nimport json\nimport time\n\n# Load quote data (binary)\nwith open(\"path/to/quote\", \"rb\") as f:\n    quote_data = f.read()\n\n# Load collateral data (JSON)\nwith open(\"path/to/collateral.json\", \"r\") as f:\n    collateral_json = json.load(f)\n\n# Create collateral object\ncollateral = dcap_qvl.QuoteCollateralV3.from_json(json.dumps(collateral_json))\n\n# Verify the quote\nnow = int(time.time())\ntry:\n    result = dcap_qvl.verify(quote_data, collateral, now)\n    print(f\"Verification successful! Status: {result.status}\")\n    print(f\"Advisory IDs: {result.advisory_ids}\")\nexcept ValueError as e:\n    print(f\"Verification failed: {e}\")\n```\n\n### Working with Collateral Data\n\n```python\n# Create collateral manually\ncollateral = dcap_qvl.QuoteCollateralV3(\n    pck_crl_issuer_chain=\"...\",\n    root_ca_crl=b\"...\",  # bytes\n    pck_crl=b\"...\",      # bytes\n    tcb_info_issuer_chain=\"...\",\n    tcb_info=\"...\",      # JSON string\n    tcb_info_signature=b\"...\",  # bytes\n    qe_identity_issuer_chain=\"...\",\n    qe_identity=\"...\",   # JSON string\n    qe_identity_signature=b\"...\",  # bytes\n)\n\n# Serialize to JSON\njson_str = collateral.to_json()\n\n# Deserialize from JSON\ncollateral = dcap_qvl.QuoteCollateralV3.from_json(json_str)\n```\n\n## API Reference\n\n### Collateral Functions\n\n#### `get_collateral(pccs_url: str, raw_quote: bytes) -> QuoteCollateralV3`\n\nGet collateral from a custom PCCS URL.\n\n**Parameters:**\n- `pccs_url`: PCCS URL (e.g., \"https://api.trustedservices.intel.com\")\n- `raw_quote`: Raw quote data as bytes\n\n**Returns:**\n- `QuoteCollateralV3`: Quote collateral data\n\n**Raises:**\n- `ValueError`: If quote is invalid or FMSPC cannot be extracted\n- `RuntimeError`: If network request fails\n- `ImportError`: If requests library is not available\n\n**Example:**\n```python\nimport dcap_qvl\n\npccs_url = \"https://api.trustedservices.intel.com\"\nquote_data = open(\"quote.bin\", \"rb\").read()\ncollateral = dcap_qvl.get_collateral(pccs_url, quote_data)\nprint(f\"Got collateral: {len(collateral.tcb_info)} chars\")\n```\n\n#### `get_collateral_from_pcs(raw_quote: bytes) -> QuoteCollateralV3`\n\nGet collateral from Intel's PCS (default).\n\n**Parameters:**\n- `raw_quote`: Raw quote data as bytes\n\n**Returns:**\n- `QuoteCollateralV3`: Quote collateral data\n\n**Raises:**\n- `ValueError`: If quote is invalid or FMSPC cannot be extracted\n- `RuntimeError`: If network request fails\n- `ImportError`: If requests library is not available\n\n#### `get_collateral_and_verify(raw_quote: bytes, pccs_url: Optional[str] = None) -> VerifiedReport`\n\nGet collateral and verify quote in one step.\n\n**Parameters:**\n- `raw_quote`: Raw quote data as bytes\n- `pccs_url`: Optional PCCS URL (uses Intel PCS if None)\n\n**Returns:**\n- `VerifiedReport`: Verification results\n\n**Raises:**\n- `ValueError`: If quote is invalid or verification fails\n- `RuntimeError`: If network request fails\n- `ImportError`: If requests library is not available\n\n**Example:**\n```python\nimport dcap_qvl\n\nquote_data = open(\"quote.bin\", \"rb\").read()\nresult = dcap_qvl.get_collateral_and_verify(quote_data)\nprint(f\"Status: {result.status}\")\nprint(f\"Advisory IDs: {result.advisory_ids}\")\n```\n\n### Classes\n\n#### `QuoteCollateralV3`\n\nRepresents quote collateral data required for verification.\n\n**Constructor:**\n```python\nQuoteCollateralV3(\n    pck_crl_issuer_chain: str,\n    root_ca_crl: bytes,\n    pck_crl: bytes,\n    tcb_info_issuer_chain: str,\n    tcb_info: str,\n    tcb_info_signature: bytes,\n    qe_identity_issuer_chain: str,\n    qe_identity: str,\n    qe_identity_signature: bytes,\n)\n```\n\n**Methods:**\n- `to_json() -> str`: Serialize to JSON string\n- `from_json(json_str: str) -> QuoteCollateralV3`: Create from JSON string (static method)\n\n**Properties:**\n- `pck_crl_issuer_chain: str`\n- `root_ca_crl: bytes`\n- `pck_crl: bytes`\n- `tcb_info_issuer_chain: str`\n- `tcb_info: str`\n- `tcb_info_signature: bytes`\n- `qe_identity_issuer_chain: str`\n- `qe_identity: str`\n- `qe_identity_signature: bytes`\n\n#### `VerifiedReport`\n\nContains the results of quote verification.\n\n**Properties:**\n- `status: str`: Verification status\n- `advisory_ids: List[str]`: List of advisory IDs\n\n**Methods:**\n- `to_json() -> str`: Serialize to JSON string\n\n### Functions\n\n#### `verify(raw_quote: bytes, collateral: QuoteCollateralV3, now_secs: int) -> VerifiedReport`\n\nVerify a quote with the provided collateral data.\n\n**Parameters:**\n- `raw_quote`: Raw quote data as bytes\n- `collateral`: Quote collateral data\n- `now_secs`: Current timestamp in seconds since Unix epoch\n\n**Returns:**\n- `VerifiedReport`: Verification results\n\n**Raises:**\n- `ValueError`: If verification fails\n\n## Development\n\n### Building from Source\n\nIf you want to build from source or contribute to development:\n\n```bash\n# Clone the repository\ngit clone https://github.com/Phala-Network/dcap-qvl.git\ncd dcap-qvl/python-bindings\n\n# Install development dependencies (including maturin)\nuv sync\n\n# Build and install the Python extension in development mode\nuv run maturin develop --features python\n\n# Run tests\nuv run python -m pytest tests/test_python_bindings.py\n```\n\n**Note:** maturin is only required for building from source. Regular users installing from PyPI don't need maturin.\n\n### Running Examples\n\nAfter installing the package, you can run the examples:\n\n```bash\n# Download the examples from the repository\ngit clone https://github.com/Phala-Network/dcap-qvl.git\ncd dcap-qvl/python-bindings\n\n# Basic functionality test\npython examples/basic_test.py\n\n# Full example (requires sample data files)\npython examples/python_example.py\n```\n\nOr if you're using uv for development:\n\n```bash\n# Basic functionality test\nuv run python examples/basic_test.py\n\n# Full example (requires sample data files)\nuv run python examples/python_example.py\n```\n\n### Testing Across Python Versions\n\nThe project includes comprehensive testing across all supported Python versions:\n\n```bash\n# Quick test across all Python versions\nmake test_python_versions\n\n# Test current Python version only\nmake test_python\n```\n\nSee [PYTHON_TESTING.md](PYTHON_TESTING.md) for detailed information about Python version compatibility testing.\n\n## Requirements\n\n### For regular usage (installing from PyPI):\n- Python 3.8+\n\n### For development (building from source):\n- Python 3.8+\n- Rust toolchain (rustc, cargo)\n- maturin (automatically installed with `uv sync`)\n\n## License\n\nMIT License - see [LICENSE](LICENSE) for details.\n\n## Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Python bindings for DCAP (Data Center Attestation Primitives) quote verification library",
    "version": "0.3.0",
    "project_urls": {
        "Homepage": "https://github.com/Phala-Network/dcap-qvl",
        "Issues": "https://github.com/Phala-Network/dcap-qvl/issues",
        "Repository": "https://github.com/Phala-Network/dcap-qvl"
    },
    "split_keywords": [
        "sgx",
        " tdx",
        " dcap",
        " attestation",
        " verification",
        " cryptography"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "45b310e4c654a1a46f744286936331a3c5973c29dbbcb5683ee0d7b8167d573b",
                "md5": "1576179e6cb9144b19e0ecd54beb8869",
                "sha256": "b7403ba663912803f9b53bfa8a5f1c678ac6fb7f898d33438849afa308e8835f"
            },
            "downloads": -1,
            "filename": "dcap_qvl-0.3.0-cp37-abi3-macosx_10_12_x86_64.whl",
            "has_sig": false,
            "md5_digest": "1576179e6cb9144b19e0ecd54beb8869",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.8",
            "size": 776109,
            "upload_time": "2025-07-31T06:26:04",
            "upload_time_iso_8601": "2025-07-31T06:26:04.070341Z",
            "url": "https://files.pythonhosted.org/packages/45/b3/10e4c654a1a46f744286936331a3c5973c29dbbcb5683ee0d7b8167d573b/dcap_qvl-0.3.0-cp37-abi3-macosx_10_12_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "1df43cf6c298a0b2e1f80006cb03a8ba536235582a7a3195afa45eea93cc5fe1",
                "md5": "f67704cb0464e7e44c9847aad75aab2f",
                "sha256": "f4666801f1c16ca77388e725e58cc734d3b3c136cbdd0fc39df49ea526f48927"
            },
            "downloads": -1,
            "filename": "dcap_qvl-0.3.0-cp37-abi3-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "f67704cb0464e7e44c9847aad75aab2f",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.8",
            "size": 2142245,
            "upload_time": "2025-07-31T06:26:05",
            "upload_time_iso_8601": "2025-07-31T06:26:05.482645Z",
            "url": "https://files.pythonhosted.org/packages/1d/f4/3cf6c298a0b2e1f80006cb03a8ba536235582a7a3195afa45eea93cc5fe1/dcap_qvl-0.3.0-cp37-abi3-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d935265ce87fe1c25aa5c1c7a04b8e5c0ef80a5f34c394efd3831e765e074606",
                "md5": "9215bcea44f5c583b0a9d0d36bbd320c",
                "sha256": "6d8521daaff2b76db86984654c1eb7521abb8858461f14be70fb3ae3fda66c85"
            },
            "downloads": -1,
            "filename": "dcap_qvl-0.3.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "9215bcea44f5c583b0a9d0d36bbd320c",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.8",
            "size": 709463,
            "upload_time": "2025-07-31T06:26:06",
            "upload_time_iso_8601": "2025-07-31T06:26:06.790943Z",
            "url": "https://files.pythonhosted.org/packages/d9/35/265ce87fe1c25aa5c1c7a04b8e5c0ef80a5f34c394efd3831e765e074606/dcap_qvl-0.3.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a7b04168351cc5d930ad92ab7aa08cc73c5b8000dddd3c35cc21d780460a6cc7",
                "md5": "58dd3ba3b643d7db01457f63b6a32ef1",
                "sha256": "186e1bf2db3a2fa06b83480a2c4b485430803d2032f251f14e3828d085e3509a"
            },
            "downloads": -1,
            "filename": "dcap_qvl-0.3.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "58dd3ba3b643d7db01457f63b6a32ef1",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.8",
            "size": 751527,
            "upload_time": "2025-07-31T06:26:08",
            "upload_time_iso_8601": "2025-07-31T06:26:08.504846Z",
            "url": "https://files.pythonhosted.org/packages/a7/b0/4168351cc5d930ad92ab7aa08cc73c5b8000dddd3c35cc21d780460a6cc7/dcap_qvl-0.3.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b8ff4c267a6d5e7670c324fa1f78563f2a3db34d019872b1babb45e18b8ecfbd",
                "md5": "bf4233b8c4166b845adba5230ce3a935",
                "sha256": "03fe111e0527b36c4cf5a0de39f039f395f0bdedc45fc4edc47ad07091c31487"
            },
            "downloads": -1,
            "filename": "dcap_qvl-0.3.0-cp37-abi3-musllinux_1_1_aarch64.whl",
            "has_sig": false,
            "md5_digest": "bf4233b8c4166b845adba5230ce3a935",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.8",
            "size": 706092,
            "upload_time": "2025-07-31T06:26:10",
            "upload_time_iso_8601": "2025-07-31T06:26:10.175514Z",
            "url": "https://files.pythonhosted.org/packages/b8/ff/4c267a6d5e7670c324fa1f78563f2a3db34d019872b1babb45e18b8ecfbd/dcap_qvl-0.3.0-cp37-abi3-musllinux_1_1_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a8c686b2f3bd1d96c9309391fa13b24082f5817dd3d83812b8c7d1bf5607b842",
                "md5": "cc04dac555fa30d97c8f6baf71cbda0e",
                "sha256": "b6370dafd3e4adfa01df8e5cbff85c3d7620074d02a71c8c8d1e7f621104d3ce"
            },
            "downloads": -1,
            "filename": "dcap_qvl-0.3.0-cp37-abi3-musllinux_1_1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "cc04dac555fa30d97c8f6baf71cbda0e",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.8",
            "size": 750222,
            "upload_time": "2025-07-31T06:26:11",
            "upload_time_iso_8601": "2025-07-31T06:26:11.533848Z",
            "url": "https://files.pythonhosted.org/packages/a8/c6/86b2f3bd1d96c9309391fa13b24082f5817dd3d83812b8c7d1bf5607b842/dcap_qvl-0.3.0-cp37-abi3-musllinux_1_1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "fef6e947330fdfd97d48c87985e9fad9ddc8b06058f76143893e4a51216abaeb",
                "md5": "e1227b2d69eb625445eed65dd2cb843c",
                "sha256": "8c6e623724e32bbdee129dc70f56149bbb04a9312769a469a3d55307c538249d"
            },
            "downloads": -1,
            "filename": "dcap_qvl-0.3.0-cp37-abi3-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "e1227b2d69eb625445eed65dd2cb843c",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=3.8",
            "size": 645766,
            "upload_time": "2025-07-31T06:26:13",
            "upload_time_iso_8601": "2025-07-31T06:26:13.216890Z",
            "url": "https://files.pythonhosted.org/packages/fe/f6/e947330fdfd97d48c87985e9fad9ddc8b06058f76143893e4a51216abaeb/dcap_qvl-0.3.0-cp37-abi3-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8378c785b359b2de4277acb8fdc271c10361a4f140c88dd8e1ee633f5807c977",
                "md5": "944553c4104b949b5ca2edd2f2d41c84",
                "sha256": "ac54196f83984de1dde88dbf68d90d912fc64e352c8a89c360b370d4c5c9ea17"
            },
            "downloads": -1,
            "filename": "dcap_qvl-0.3.0.tar.gz",
            "has_sig": false,
            "md5_digest": "944553c4104b949b5ca2edd2f2d41c84",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 132613,
            "upload_time": "2025-07-31T06:26:14",
            "upload_time_iso_8601": "2025-07-31T06:26:14.554904Z",
            "url": "https://files.pythonhosted.org/packages/83/78/c785b359b2de4277acb8fdc271c10361a4f140c88dd8e1ee633f5807c977/dcap_qvl-0.3.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-31 06:26:14",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "Phala-Network",
    "github_project": "dcap-qvl",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "dcap-qvl"
}
        
Elapsed time: 1.18530s