Skip to main content

Self encrypting files (convergent encryption plus obfuscation)

Project description

self_encryption

Self encrypting files (convergent encryption plus obfuscation)

Crate Documentation
Documentation
MaidSafe website SAFE Dev Forum SAFE Network Forum

Table of Contents

Overview

A version of convergent encryption with an additional obfuscation step. This pattern allows secured data that can also be de-duplicated. This library presents an API that takes a set of bytes and returns a secret key derived from those bytes, and a set of encrypted chunks.

Important Security Note: While this library provides very secure encryption of the data, the returned secret key requires the same secure handling as would be necessary for any secret key.

image of self encryption

Documentation

Features

  • Content-based chunking
  • Convergent encryption
  • Self-validating chunks
  • Hierarchical data maps for handling large files
  • Streaming encryption/decryption
  • Python bindings
  • Flexible storage backend support
  • Custom storage backends via functors

Usage

Rust Usage

Installation

Add this to your Cargo.toml:

[dependencies]
self_encryption = "0.30"
bytes = "1.0"

Basic Operations

use self_encryption::{encrypt, decrypt_full_set};
use bytes::Bytes;

// Basic encryption/decryption
fn basic_example() -> Result<()> {
    let data = Bytes::from("Hello, World!".repeat(1000));  // Must be at least 3072 bytes
    
    // Encrypt data
    let (data_map, encrypted_chunks) = encrypt(data.clone())?;
    
    // Decrypt data
    let decrypted = decrypt_full_set(&data_map, &encrypted_chunks)?;
    assert_eq!(data, decrypted);
    
    Ok(())
}

Storage Backends

use self_encryption::{shrink_data_map, get_root_data_map, decrypt_from_storage};
use std::collections::HashMap;
use std::sync::{Arc, Mutex};

// Memory Storage Example
fn memory_storage_example() -> Result<()> {
    let storage = Arc::new(Mutex::new(HashMap::new()));
    
    // Store function
    let store = |hash, data| {
        storage.lock().unwrap().insert(hash, data);
        Ok(())
    };
    
    // Retrieve function
    let retrieve = |hash| {
        storage.lock().unwrap()
            .get(&hash)
            .cloned()
            .ok_or_else(|| Error::Generic("Chunk not found".into()))
    };
    
    // Use with data map operations
    let shrunk_map = shrink_data_map(data_map, store)?;
    let root_map = get_root_data_map(shrunk_map, retrieve)?;
    
    Ok(())
}

// Disk Storage Example
fn disk_storage_example() -> Result<()> {
    let chunk_dir = PathBuf::from("chunks");
    
    // Store function
    let store = |hash, data| {
        let path = chunk_dir.join(hex::encode(hash));
        std::fs::write(path, data)?;
        Ok(())
    };
    
    // Retrieve function
    let retrieve = |hash| {
        let path = chunk_dir.join(hex::encode(hash));
        Ok(Bytes::from(std::fs::read(path)?))
    };
    
    // Use with data map operations
    let shrunk_map = shrink_data_map(data_map, store)?;
    let root_map = get_root_data_map(shrunk_map, retrieve)?;
    
    Ok(())
}

Python Bindings

Basic Usage

from self_encryption import encrypt, decrypt

# Basic in-memory encryption/decryption
def basic_example():
    # Create test data (must be at least 3072 bytes)
    data = b"Hello, World!" * 1000
    
    # Encrypt data - returns data map and encrypted chunks
    data_map, chunks = encrypt(data)
    print(f"Data encrypted into {len(chunks)} chunks")
    print(f"Data map has child level: {data_map.child()}")
    
    # Decrypt data
    decrypted = decrypt(data_map, chunks)
    assert data == decrypted

File Operations

from pathlib import Path
from self_encryption import encrypt_from_file, decrypt_from_storage

def file_example():
    # Setup paths
    input_path = Path("large_file.dat")
    chunk_dir = Path("chunks")
    output_path = Path("decrypted_file.dat")
    
    # Ensure chunk directory exists
    chunk_dir.mkdir(exist_ok=True)
    
    # Encrypt file - stores chunks to disk
    data_map, chunk_names = encrypt_from_file(str(input_path), str(chunk_dir))
    print(f"File encrypted into {len(chunk_names)} chunks")
    
    # Create chunk retrieval function
    def get_chunk(hash_hex: str) -> bytes:
        chunk_path = chunk_dir / hash_hex
        return chunk_path.read_bytes()
    
    # Decrypt file
    decrypt_from_storage(data_map, str(output_path), get_chunk)

Advanced Features

from self_encryption import shrink_data_map

def advanced_example():
    # Create large data to ensure multiple chunks
    data = b"x" * 10_000_000  # 10MB
    
    # Encrypt data
    data_map, chunks = encrypt(data)
    print(f"Initial encryption: {len(chunks)} chunks")
    
    # Track stored chunks during shrinking
    stored_chunks = {}
    def store_chunk(hash_hex: str, content: bytes):
        stored_chunks[hash_hex] = content
        print(f"Storing chunk: {hash_hex[:8]}...")
    
    # Shrink data map - useful for large files
    shrunk_map, shrink_chunks = shrink_data_map(data_map, store_chunk)
    print(f"Generated {len(shrink_chunks)} additional chunks during shrinking")
    
    # Verify child level is set
    assert shrunk_map.child() is not None
    assert shrunk_map.is_child()
    
    # Collect all chunks for decryption
    all_chunks = chunks + shrink_chunks
    
    # Decrypt using all chunks
    decrypted = decrypt(shrunk_map, all_chunks)
    assert data == decrypted

Streaming Operations

from self_encryption import streaming_decrypt_from_storage
from typing import List

def streaming_example():
    # ... setup code ...
    
    # Create parallel chunk retrieval function
    def get_chunks(hash_hexes: List[str]) -> List[bytes]:
        return [
            chunk_dir.joinpath(hash_hex).read_bytes()
            for hash_hex in hash_hexes
        ]
    
    # Decrypt using streaming - efficient for large files
    streaming_decrypt_from_storage(data_map, str(output_path), get_chunks)

API Reference

Classes

  • DataMap

    • child() -> Optional[int]: Get child level if set
    • is_child() -> bool: Check if this is a child data map
    • len() -> int: Get number of chunks
    • infos() -> List[Tuple[int, bytes, bytes, int]]: Get chunk information
  • EncryptedChunk

    • content() -> bytes: Get chunk content
    • from_bytes(content: bytes) -> EncryptedChunk: Create from bytes

Functions

  • encrypt(data: bytes) -> Tuple[DataMap, List[EncryptedChunk]]

    • Encrypts bytes data in memory
    • Returns data map and encrypted chunks
  • encrypt_from_file(input_path: str, output_dir: str) -> Tuple[DataMap, List[str]]

    • Encrypts a file and stores chunks to disk
    • Returns data map and list of chunk hex names
  • decrypt(data_map: DataMap, chunks: List[EncryptedChunk]) -> bytes

    • Decrypts data using provided chunks
    • Returns original data
  • decrypt_from_storage(data_map: DataMap, output_path: str, get_chunk: Callable[[str], bytes]) -> None

    • Decrypts data using chunks from storage
    • Writes result to output path
  • shrink_data_map(data_map: DataMap, store_chunk: Callable[[str, bytes], None]) -> Tuple[DataMap, List[EncryptedChunk]]

    • Shrinks a data map by recursively encrypting it
    • Returns shrunk map and additional chunks

Implementation Details

Core Process

  • Files are split into chunks of up to 1MB
  • Each chunk is processed in three steps:
    1. Compression (using Brotli)
    2. Encryption (using AES-256-CBC)
    3. XOR obfuscation

Key Generation and Security

  • Each chunk's encryption uses keys derived from the content hashes of three chunks:

    For chunk N:
    - Uses hashes from chunks [N, N+1, N+2]
    - Combined hash = hash(N) || hash(N+1) || hash(N+2)
    - Split into:
      - Pad (first X bytes)
      - Key (next 16 bytes for AES-256)
      - IV  (final 16 bytes)
    
  • This creates a chain of dependencies where each chunk's encryption depends on its neighbors

  • Provides both convergent encryption and additional security through the interdependencies

Encryption Flow

  1. Content Chunking:

    • File is split into chunks of optimal size
    • Each chunk's raw content is hashed (SHA3-256)
    • These hashes become part of the DataMap
  2. Per-Chunk Processing:

    // For each chunk:
    1. Compress data using Brotli
    2. Generate key materials:
       - Combine three consecutive chunk hashes
       - Extract pad, key, and IV
    3. Encrypt compressed data using AES-256-CBC
    4. XOR encrypted data with pad for obfuscation
    
  3. DataMap Creation:

    • Stores both pre-encryption (src) and post-encryption (dst) hashes
    • Maintains chunk ordering and size information
    • Required for both encryption and decryption processes

Decryption Flow

  1. Chunk Retrieval:

    • Use DataMap to identify required chunks
    • Retrieve chunks using dst_hash as identifier
  2. Per-Chunk Processing:

    // For each chunk:
    1. Regenerate key materials using src_hashes from DataMap
    2. Remove XOR obfuscation using pad
    3. Decrypt using AES-256-CBC with key and IV
    4. Decompress using Brotli
    
  3. Chunk Reassembly:

    • Chunks are processed in order specified by DataMap
    • Reassembled into original file

Storage Features

  • Flexible backend support through trait-based design

  • Supports both memory and disk-based storage

  • Streaming operations for memory efficiency

  • Hierarchical data maps for large files:

    // DataMap shrinking for large files
    1. Serialize large DataMap
    2. Encrypt serialized map using same process
    3. Create new DataMap with fewer chunks
    4. Repeat until manageable size reached
    

Security Properties

  • Content-based convergent encryption
  • Additional security through chunk interdependencies
  • Self-validating chunks through hash verification
  • No single point of failure in chunk storage
  • Tamper-evident through hash chains

Performance Optimizations

  • Parallel chunk processing where possible
  • Streaming support for large files
  • Efficient memory usage through chunking
  • Optimized compression settings
  • Configurable chunk sizes

This implementation provides a balance of:

  • Security (through multiple encryption layers)
  • Deduplication (through convergent encryption)
  • Performance (through parallelization and streaming)
  • Flexibility (through modular storage backends)

License

Licensed under the General Public License (GPL), version 3 (LICENSE http://www.gnu.org/licenses/gpl-3.0.en.html).

Linking Exception

self_encryption is licensed under GPLv3 with linking exception. This means you can link to and use the library from any program, proprietary or open source; paid or gratis. However, if you modify self_encryption, you must distribute the source to your modified version under the terms of the GPLv3.

See the LICENSE file for more details.

Contributing

Want to contribute? Great :tada:

There are many ways to give back to the project, whether it be writing new code, fixing bugs, or just reporting errors. All forms of contributions are encouraged!

For instructions on how to contribute, see our Guide to contributing.

Python Bindings

This crate provides comprehensive Python bindings for self-encryption functionality, supporting both in-memory and file-based operations.

Installation

pip install self-encryption

Basic Usage

from self_encryption import py_encrypt, py_decrypt

# Basic in-memory encryption/decryption
def basic_example():
    # Create test data (must be at least 3072 bytes)
    data = b"Hello, World!" * 1000
    
    # Encrypt data - returns data map and encrypted chunks
    data_map, chunks = py_encrypt(data)
    print(f"Data encrypted into {len(chunks)} chunks")
    print(f"Data map has child level: {data_map.child()}")
    
    # Decrypt data
    decrypted = py_decrypt(data_map, chunks)
    assert data == decrypted

File Operations

from pathlib import Path
from self_encryption import py_encrypt_from_file, py_decrypt_from_storage

def file_example():
    # Setup paths
    input_path = Path("large_file.dat")
    chunk_dir = Path("chunks")
    output_path = Path("decrypted_file.dat")
    
    # Ensure chunk directory exists
    chunk_dir.mkdir(exist_ok=True)
    
    # Encrypt file - stores chunks to disk
    data_map, chunk_names = py_encrypt_from_file(str(input_path), str(chunk_dir))
    print(f"File encrypted into {len(chunk_names)} chunks")
    
    # Create chunk retrieval function
    def get_chunk(hash_hex: str) -> bytes:
        chunk_path = chunk_dir / hash_hex
        return chunk_path.read_bytes()
    
    # Decrypt file
    py_decrypt_from_storage(data_map, str(output_path), get_chunk)

Advanced Features

from self_encryption import py_shrink_data_map

def advanced_example():
    # Create large data to ensure multiple chunks
    data = b"x" * 10_000_000  # 10MB
    
    # Encrypt data
    data_map, chunks = py_encrypt(data)
    print(f"Initial encryption: {len(chunks)} chunks")
    
    # Track stored chunks during shrinking
    stored_chunks = {}
    def store_chunk(hash_hex: str, content: bytes):
        stored_chunks[hash_hex] = content
        print(f"Storing chunk: {hash_hex[:8]}...")
    
    # Shrink data map - useful for large files
    shrunk_map, shrink_chunks = py_shrink_data_map(data_map, store_chunk)
    print(f"Generated {len(shrink_chunks)} additional chunks during shrinking")
    
    # Verify child level is set
    assert shrunk_map.child() is not None
    assert shrunk_map.is_child()
    
    # Collect all chunks for decryption
    all_chunks = chunks + shrink_chunks
    
    # Decrypt using all chunks
    decrypted = py_decrypt(shrunk_map, all_chunks)
    assert data == decrypted

API Reference

Classes

  • PyDataMap

    • child() -> Optional[int]: Get child level if set
    • is_child() -> bool: Check if this is a child data map
    • len() -> int: Get number of chunks
    • infos() -> List[Tuple[int, bytes, bytes, int]]: Get chunk information
  • PyEncryptedChunk

    • content() -> bytes: Get chunk content
    • from_bytes(content: bytes) -> PyEncryptedChunk: Create from bytes

Functions

  • py_encrypt(data: bytes) -> Tuple[PyDataMap, List[PyEncryptedChunk]]

    • Encrypts bytes data in memory
    • Returns data map and encrypted chunks
  • py_encrypt_from_file(input_path: str, output_dir: str) -> Tuple[PyDataMap, List[str]]

    • Encrypts a file and stores chunks to disk
    • Returns data map and list of chunk hex names
  • py_decrypt(data_map: PyDataMap, chunks: List[PyEncryptedChunk]) -> bytes

    • Decrypts data using provided chunks
    • Returns original data
  • py_decrypt_from_storage(data_map: PyDataMap, output_path: str, get_chunk: Callable[[str], bytes]) -> None

    • Decrypts data using chunks from storage
    • Writes result to output path
  • py_shrink_data_map(data_map: PyDataMap, store_chunk: Callable[[str, bytes], None]) -> Tuple[PyDataMap, List[PyEncryptedChunk]]

    • Shrinks a data map by recursively encrypting it
    • Returns shrunk map and additional chunks

Notes

  • All encryption methods handle parent/child relationships automatically
  • Chunk storage and retrieval can be customized through callbacks
  • Error handling follows Python conventions with descriptive exceptions
  • Supports both synchronous and parallel chunk processing
  • Memory efficient through streaming operations

Chunk Verification

Rust

use self_encryption::{verify_chunk, EncryptedChunk, XorName};

// Verify a chunk matches its expected hash
fn verify_example() -> Result<()> {
    let chunk_hash = XorName([0; 32]); // 32-byte hash
    let chunk_content = vec![1, 2, 3]; // Raw chunk content
    
    match verify_chunk(chunk_hash, &chunk_content) {
        Ok(chunk) => println!("Chunk verified successfully"),
        Err(e) => println!("Chunk verification failed: {}", e),
    }
    Ok(())
}

The verify_chunk function provides a way to verify chunk integrity:

  • Takes a XorName hash and chunk content as bytes
  • Verifies the content matches the hash
  • Returns a valid EncryptedChunk if verification succeeds
  • Returns an error if verification fails

Python

from self_encryption import verify_chunk

def verify_example():
    # Get a chunk and its expected hash from somewhere
    chunk_hash = bytes.fromhex("0" * 64)  # 32-byte hash as hex
    chunk_content = b"..."  # Raw chunk content
    
    try:
        # Verify and get a usable chunk
        verified_chunk = verify_chunk(chunk_hash, chunk_content)
        print("Chunk verified successfully")
    except ValueError as e:
        print(f"Chunk verification failed: {e}")

The Python verify_chunk function provides similar functionality:

  • Takes a 32-byte hash (as bytes) and the chunk content
  • Verifies the content matches the hash
  • Returns a valid EncryptedChunk if verification succeeds
  • Raises ValueError if verification fails

This functionality is particularly useful for:

  • Verifying chunk integrity after network transfer
  • Validating chunks in storage systems
  • Debugging chunk corruption issues
  • Implementing chunk validation in client applications

XorName Operations

The XorName class provides functionality for working with cryptographic names and hashes:

from self_encryption import XorName

# Create a XorName from content
content = b"Hello, World!"
name = XorName.from_content(content)
print(f"Content hash: {''.join(format(b, '02x') for b in name.as_bytes())}")

# Create a XorName directly from bytes (must be 32 bytes)
hash_bytes = bytes([x % 256 for x in range(32)])  # Example 32-byte array
name = XorName(hash_bytes)

# Get the underlying bytes
raw_bytes = name.as_bytes()

# Common use cases:
# 1. Verify chunk content matches its hash
def verify_chunk_example():
    # Get a chunk and its expected hash
    chunk_content = b"..."  # Raw chunk content
    expected_hash = XorName.from_content(chunk_content)
    
    # Verify the chunk
    verified_chunk = verify_chunk(expected_hash, chunk_content)
    print("Chunk verified successfully")

# 2. Track chunks by their content hash
def track_chunks_example():
    chunks = {}  # Dict to store chunks by hash
    
    # Store a chunk
    content = b"Some chunk content"
    chunk_hash = XorName.from_content(content)
    chunks[chunk_hash.as_bytes().hex()] = content
    
    # Retrieve a chunk
    retrieved = chunks.get(chunk_hash.as_bytes().hex())

The XorName class provides:

  • from_content(bytes) -> XorName: Creates a XorName by hashing the provided content
  • __init__(bytes) -> XorName: Creates a XorName from an existing 32-byte hash
  • as_bytes() -> bytes: Returns the underlying 32-byte array
  • Used for chunk verification and tracking in the self-encryption process

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

self_encryption-0.32.1.tar.gz (158.1 kB view details)

Uploaded Source

Built Distributions

self_encryption-0.32.1-cp312-none-win_amd64.whl (911.4 kB view details)

Uploaded CPython 3.12 Windows x86-64

self_encryption-0.32.1-cp312-cp312-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

self_encryption-0.32.1-cp312-cp312-macosx_10_12_x86_64.whl (1.0 MB view details)

Uploaded CPython 3.12 macOS 10.12+ x86-64

self_encryption-0.32.1-cp311-none-win_amd64.whl (909.5 kB view details)

Uploaded CPython 3.11 Windows x86-64

self_encryption-0.32.1-cp311-cp311-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

self_encryption-0.32.1-cp311-cp311-macosx_10_12_x86_64.whl (1.0 MB view details)

Uploaded CPython 3.11 macOS 10.12+ x86-64

self_encryption-0.32.1-cp310-none-win_amd64.whl (909.5 kB view details)

Uploaded CPython 3.10 Windows x86-64

self_encryption-0.32.1-cp310-cp310-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

self_encryption-0.32.1-cp310-cp310-macosx_10_12_x86_64.whl (1.0 MB view details)

Uploaded CPython 3.10 macOS 10.12+ x86-64

self_encryption-0.32.1-cp39-none-win_amd64.whl (909.8 kB view details)

Uploaded CPython 3.9 Windows x86-64

self_encryption-0.32.1-cp39-cp39-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

self_encryption-0.32.1-cp39-cp39-macosx_10_12_x86_64.whl (1.0 MB view details)

Uploaded CPython 3.9 macOS 10.12+ x86-64

self_encryption-0.32.1-cp38-none-win_amd64.whl (909.9 kB view details)

Uploaded CPython 3.8 Windows x86-64

self_encryption-0.32.1-cp38-cp38-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

self_encryption-0.32.1-cp38-cp38-macosx_10_12_x86_64.whl (1.0 MB view details)

Uploaded CPython 3.8 macOS 10.12+ x86-64

self_encryption-0.32.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

File details

Details for the file self_encryption-0.32.1.tar.gz.

File metadata

  • Download URL: self_encryption-0.32.1.tar.gz
  • Upload date:
  • Size: 158.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for self_encryption-0.32.1.tar.gz
Algorithm Hash digest
SHA256 c2e0377ba9bae57d672892773f14d001b9dcfde4893aa91d66afa41a9b29c693
MD5 f68baa19afd6e2a26129812b6847c425
BLAKE2b-256 45658db5c60ff504d8250cd1489e6bac7b690849474f2b594bc04804624919c4

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.32.1.tar.gz:

Publisher: python-publish.yml on dirvine/self_encryption

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file self_encryption-0.32.1-cp312-none-win_amd64.whl.

File metadata

File hashes

Hashes for self_encryption-0.32.1-cp312-none-win_amd64.whl
Algorithm Hash digest
SHA256 72f379a881e001875ddfb6128132233dc104dd453500e6b11de13c3f8426ba22
MD5 0db677c11e6800e1e8913a7b82497b0a
BLAKE2b-256 fc476f8660c409446dfd0769a36c38c421421d5ec56141719872376223ab412d

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.32.1-cp312-none-win_amd64.whl:

Publisher: python-publish.yml on dirvine/self_encryption

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file self_encryption-0.32.1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for self_encryption-0.32.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 be83925e52bdd3823512d5255bd70c5b30038cf2ba7daff03902424bc0deed66
MD5 8a5fa075369519dfc58e1df68136c55b
BLAKE2b-256 03a70a3a2e1a45d906958466c1329f0c0300a69c6dfcf746c18e3268fbabaa36

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.32.1-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: python-publish.yml on dirvine/self_encryption

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file self_encryption-0.32.1-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for self_encryption-0.32.1-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 0f64ac7f1022cd85a5cdb1527e9aca884c35f21196c15151bcf24728ebd6ffa4
MD5 fe098d0648cf879e159fde60ea05d5fd
BLAKE2b-256 b87fce2ef3051df37ff0f71fa6f118c63905363066c470c43071f58063183b58

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.32.1-cp312-cp312-macosx_10_12_x86_64.whl:

Publisher: python-publish.yml on dirvine/self_encryption

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file self_encryption-0.32.1-cp311-none-win_amd64.whl.

File metadata

File hashes

Hashes for self_encryption-0.32.1-cp311-none-win_amd64.whl
Algorithm Hash digest
SHA256 35685a972918a3ce62d61c5550f3364a1c2c190725ba8175b23fdd0180ccf962
MD5 dac5579146a5c73e9f8f4b4465e410d4
BLAKE2b-256 cffeb6ca230c7a5f01f77e11b3bac7a33321a58a497d44c7ee4fd6cff20e700a

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.32.1-cp311-none-win_amd64.whl:

Publisher: python-publish.yml on dirvine/self_encryption

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file self_encryption-0.32.1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for self_encryption-0.32.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 424fb8a8589659a04db4000b57f1bcab2c5c70af7cc8c818970dfd16b095f062
MD5 faa3fc51b312d51e987d3faf50010965
BLAKE2b-256 a1d653abbe9b3f13eebe92cde3b6a661ceb22f69e9f472f3d9c9eb28bc1f5e6b

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.32.1-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: python-publish.yml on dirvine/self_encryption

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file self_encryption-0.32.1-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for self_encryption-0.32.1-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 22542eb9c66a0cb840ba35964fe22a45b8f0637a43deb0983199dcad6c47694b
MD5 bce8e1fb8e0e46a6e0b259531481a636
BLAKE2b-256 2a86ddd53ea6925c96ae4abb7737d134488568a8bdf9f44cbab0769b9b2382ac

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.32.1-cp311-cp311-macosx_10_12_x86_64.whl:

Publisher: python-publish.yml on dirvine/self_encryption

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file self_encryption-0.32.1-cp310-none-win_amd64.whl.

File metadata

File hashes

Hashes for self_encryption-0.32.1-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 ac69685f6073da7ec303d691217ecffc7d212998cd4a281433f3be6c35f5f6b6
MD5 adb78042068be937a8ba537191783740
BLAKE2b-256 f1906adc25961a9ac526d1c642c4225ff5489b1fd8740f1922c9354580e5a22c

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.32.1-cp310-none-win_amd64.whl:

Publisher: python-publish.yml on dirvine/self_encryption

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file self_encryption-0.32.1-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for self_encryption-0.32.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 37d6913bf1acfa695559841e1b31b9f2b7f82e945f2a5ba0cce1939a12c685d8
MD5 267b54e604b3d7c8d04e42741fe78f43
BLAKE2b-256 b2d2791cf53cd3e844adabfd0829764d3e21876856b1175c19bfd70cfc05fb91

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.32.1-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: python-publish.yml on dirvine/self_encryption

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file self_encryption-0.32.1-cp310-cp310-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for self_encryption-0.32.1-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 f8ea25d24cc8714b539553689ec0d984a74f57bf4a4fd36fecb7f3cd1cb7bf82
MD5 d081dee2997a20014ea478326303e0fa
BLAKE2b-256 85ee7438cb5ad67ffaef7379825d16262dd1c8e0b7238e3936a160cd9c176634

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.32.1-cp310-cp310-macosx_10_12_x86_64.whl:

Publisher: python-publish.yml on dirvine/self_encryption

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file self_encryption-0.32.1-cp39-none-win_amd64.whl.

File metadata

File hashes

Hashes for self_encryption-0.32.1-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 68ad2748c92cd19a4dc37c74101514edb5e2737dd19543584b959fb7befd9078
MD5 2fb881252359b6d4eb5c854d1eb72b69
BLAKE2b-256 7d6c83f478af4eef3290e9ced9ad62e613f987d18a68e1116f26993012305175

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.32.1-cp39-none-win_amd64.whl:

Publisher: python-publish.yml on dirvine/self_encryption

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file self_encryption-0.32.1-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for self_encryption-0.32.1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9fedbdcb0f175c057c8f9a9b01bc2d7289dc4458bd077b63ddb1a99a619c1f39
MD5 7cb5107f749c03fc828fc862d5eb4ecd
BLAKE2b-256 d0755181fbe0f5ec00abda08401b6f18d2fd71577b480a418d577777af429b52

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.32.1-cp39-cp39-macosx_11_0_arm64.whl:

Publisher: python-publish.yml on dirvine/self_encryption

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file self_encryption-0.32.1-cp39-cp39-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for self_encryption-0.32.1-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 dac259c299f92b5b9e92d68609f3ccbd238269164ce6d6013fdaf79874d9eeaa
MD5 c74736f665817feee8c3b9021d36b123
BLAKE2b-256 af01d0994e16cf7fb43c6e4850d1abae273c69e6b4245145dc452a348302944e

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.32.1-cp39-cp39-macosx_10_12_x86_64.whl:

Publisher: python-publish.yml on dirvine/self_encryption

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file self_encryption-0.32.1-cp38-none-win_amd64.whl.

File metadata

File hashes

Hashes for self_encryption-0.32.1-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 e9123924d3e105f6b33e04ce1118e09aa59e5f35ae968978548d86497801718a
MD5 015aceca102490e6330b1f7f2dcc4447
BLAKE2b-256 47981a654f5c889a6a76dcf2b34ecc09c21f62c987c46b18cd27de1d81b6406a

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.32.1-cp38-none-win_amd64.whl:

Publisher: python-publish.yml on dirvine/self_encryption

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file self_encryption-0.32.1-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for self_encryption-0.32.1-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6a1561aa22de9ab192ba962bdc771c969da78c2eca488b495266007d03459926
MD5 bce2c2f3d98eb557cd39a55f5448e0e8
BLAKE2b-256 f9084d898d47e63b65d2de9f651b40a2de5a4581bb2c29278d143064cfb9a9d0

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.32.1-cp38-cp38-macosx_11_0_arm64.whl:

Publisher: python-publish.yml on dirvine/self_encryption

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file self_encryption-0.32.1-cp38-cp38-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for self_encryption-0.32.1-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 5269181d474ae75c896da4fbe5a86b0f5326367865ab490f73a1582ae7e497b1
MD5 812160e2b6f9da53cab5bcb7436198b8
BLAKE2b-256 4682cfb2b5a286e0bc482dd43fb6852aac54a99d80b228f8bd3a20ac2080bbea

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.32.1-cp38-cp38-macosx_10_12_x86_64.whl:

Publisher: python-publish.yml on dirvine/self_encryption

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file self_encryption-0.32.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for self_encryption-0.32.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e41e617e1d804a161131a292880e4874684057ab2de4af5bbf00b023d6b96b54
MD5 f5b0121aeb210f2a6caad9c223a4d877
BLAKE2b-256 379636e0f10c6dfb9e37780b6da02b61b2100cef7c2a7d2eb1196ef2eaedc620

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.32.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: python-publish.yml on dirvine/self_encryption

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page