Skip to main content

Python bindings for self-encryption library

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(())
}

Streaming Operations

use self_encryption::{StreamSelfEncryptor, StreamSelfDecryptor};

fn streaming_example() -> Result<()> {
    // Streaming encryption
    let mut encryptor = StreamSelfEncryptor::encrypt_from_file(
        PathBuf::from("input.txt"),
        Some(PathBuf::from("chunks"))
    )?;
    
    let mut all_chunks = Vec::new();
    let mut final_map = None;
    
    while let (chunk, map) = encryptor.next_encryption()? {
        if let Some(chunk) = chunk {
            all_chunks.push(chunk);
        }
        if let Some(map) = map {
            final_map = Some(map);
            break;
        }
    }
    
    // Streaming decryption
    let mut decryptor = StreamSelfDecryptor::decrypt_to_file(
        PathBuf::from("output.txt"),
        &final_map.unwrap()
    )?;
    
    for chunk in all_chunks {
        if decryptor.next_encrypted(chunk)? {
            break;  // Decryption complete
        }
    }
    
    Ok(())
}

Advanced Usage

use self_encryption::{decrypt_range, seek_info};

fn advanced_example() -> Result<()> {
    // Partial decryption (seeking)
    let start_pos = 1024;
    let length = 4096;
    
    let seek = seek_info(file_size, start_pos, length);
    let data = decrypt_range(&data_map, &chunks, seek.relative_pos, length)?;
    
    // Hierarchical data maps
    let store = |hash, data| -> Result<()> {
        // Store chunk
        Ok(())
    };
    
    let shrunk_map = shrink_data_map(large_data_map, store)?;
    
    // Custom error handling
    match encrypt(small_data) {
        Err(Error::Generic(msg)) if msg.contains("Too small") => {
            println!("Data too small for encryption");
        }
        Ok(_) => println!("Encryption successful"),
        Err(e) => return Err(e),
    }
    
    Ok(())
}

Python Usage

Installation

pip install self-encryption

Python Basic Operations

from self_encryption import encrypt_bytes, decrypt_chunks

def basic_example():
    # Create test data (must be at least 3072 bytes)
    data = b"Hello, World!" * 1000
    
    # Encrypt data
    data_map, chunks = encrypt_bytes(data)
    
    # Decrypt data
    decrypted = decrypt_chunks(data_map, chunks)
    assert data == decrypted

Python File Operations

from self_encryption import encrypt_file, decrypt_from_files
import os

def file_example():
    # Encrypt file
    data_map, chunk_names = encrypt_file("input.txt", "chunks")
    
    # Decrypt file
    decrypt_from_files("chunks", data_map, "output.txt")
    
    # Verify content
    with open("input.txt", "rb") as f:
        original = f.read()
    with open("output.txt", "rb") as f:
        decrypted = f.read()
    assert original == decrypted

Python Advanced Features

from self_encryption import (
    shrink_data_map, 
    get_root_data_map,
    StreamSelfEncryptor,
    StreamSelfDecryptor
)

def advanced_example():
    # Hierarchical data maps
    shrunk_map = shrink_data_map(data_map, "chunks")
    root_map = get_root_data_map(shrunk_map, "chunks")
    
    # Streaming encryption
    encryptor = StreamSelfEncryptor("input.txt", "chunks")
    while True:
        chunk, map = encryptor.next_encryption()
        if chunk:
            process_chunk(chunk)
        if map:
            break
    
    # Streaming decryption
    decryptor = StreamSelfDecryptor("output.txt", map)
    for chunk in chunks:
        if decryptor.next_encrypted(chunk):
            break  # Decryption complete

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.

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.30.266.tar.gz (1.1 MB view details)

Uploaded Source

Built Distributions

self_encryption-0.30.266-cp312-none-win_amd64.whl (921.9 kB view details)

Uploaded CPython 3.12 Windows x86-64

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

Uploaded CPython 3.12 macOS 11.0+ ARM64

self_encryption-0.30.266-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.30.266-cp311-none-win_amd64.whl (921.6 kB view details)

Uploaded CPython 3.11 Windows x86-64

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

Uploaded CPython 3.11 macOS 11.0+ ARM64

self_encryption-0.30.266-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.30.266-cp310-none-win_amd64.whl (921.6 kB view details)

Uploaded CPython 3.10 Windows x86-64

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

Uploaded CPython 3.10 macOS 11.0+ ARM64

self_encryption-0.30.266-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.30.266-cp39-none-win_amd64.whl (922.1 kB view details)

Uploaded CPython 3.9 Windows x86-64

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

Uploaded CPython 3.9 macOS 11.0+ ARM64

self_encryption-0.30.266-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.30.266-cp38-none-win_amd64.whl (921.6 kB view details)

Uploaded CPython 3.8 Windows x86-64

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

Uploaded CPython 3.8 macOS 11.0+ ARM64

self_encryption-0.30.266-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.30.266-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.30.266.tar.gz.

File metadata

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

File hashes

Hashes for self_encryption-0.30.266.tar.gz
Algorithm Hash digest
SHA256 2eb329d2a0dc9586d1106ca68ceba3583741c0c3d4d36259bf79141511703b66
MD5 eb955c9c85423f8fad1873c4ecc71faf
BLAKE2b-256 6549a7deabe6278258624e9233952653cb35dce2b23f6678dfb63850cf1b0b50

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.30.266.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.30.266-cp312-none-win_amd64.whl.

File metadata

File hashes

Hashes for self_encryption-0.30.266-cp312-none-win_amd64.whl
Algorithm Hash digest
SHA256 17fed4d0777ca3386ad016913cac8ac01002e277d9eb54054a4f301c5c89dc3b
MD5 1f8c4ebc7db91d4f54618143d4c7750c
BLAKE2b-256 6632c5cf0fd37f0028cbbf4d5caa8fee24b0393c18bada682fb6c2cd60de90c0

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.30.266-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.30.266-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for self_encryption-0.30.266-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5c06acb8bfd3c464ad1df98140695f0c374f31ef320e457e1df61ac973581d93
MD5 ee3e87f2ee35682d146f3cb49e66b071
BLAKE2b-256 9a5ad05abf673bac272512226238696d8ef5ca46a646198a01fa1bf4614bd76e

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.30.266-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.30.266-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for self_encryption-0.30.266-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 5b0ab588228e2cf3d2ae128e4f4bbbb6f14f1b3037afbbccc1e14337e9f85dd9
MD5 3ccb039a9dcc8c0b30442f36618e132e
BLAKE2b-256 a4a6779e0e46f64895509114a5b65d289a1d2785546675f974ce43d8f11ad9c9

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.30.266-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.30.266-cp311-none-win_amd64.whl.

File metadata

File hashes

Hashes for self_encryption-0.30.266-cp311-none-win_amd64.whl
Algorithm Hash digest
SHA256 84db21dd71f924e73d1d3a622c8bc53587b53d3dd10c94204011a6162dd36991
MD5 d06486f783ce833a1071a6912248dfc2
BLAKE2b-256 e35dab45194655ffb6e32f1af101bc7e9590702cc5071626f4d16e358b4adf04

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.30.266-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.30.266-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for self_encryption-0.30.266-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5f19c3b869d919f7e9bf7353eeb3e24002f3c735ffe52fa747a0141a17a19a18
MD5 a41f2435854ec493200a3f0f1f78d7a2
BLAKE2b-256 83e0633c9601b5773843b4d92ad911fcd129109e3e049bd1ad3b4bc005e65606

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.30.266-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.30.266-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for self_encryption-0.30.266-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 91c0012d88e5c1bcd21f7ff5e3fc4652787ef4eb2d4b1ce4feae04c3ebc75234
MD5 b5533d3fa30d49e0b13735e027bcc7b0
BLAKE2b-256 fe453f7261302f0e325313a99c4a7f09ba711841d7331be2e79d359ebb32d078

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.30.266-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.30.266-cp310-none-win_amd64.whl.

File metadata

File hashes

Hashes for self_encryption-0.30.266-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 5dfee63307849bc3402028ed02fcf70a46d385478b006ca046cf50f9f438bd46
MD5 e511f069ef2296b6f1de65822069db52
BLAKE2b-256 c25f1bdcf09bcbf742518e82f40fd382086903f0367e12648bc06f12971a8dce

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.30.266-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.30.266-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for self_encryption-0.30.266-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 da76f6e8134d0bda257a4a92dde4ad02ff446d8632d38e07cbdc064107a4a0c4
MD5 5c60c26b536ec69b21b22c9495c3cba7
BLAKE2b-256 ce7d88dcd7d343747235e852fdb63591f4e6eac7ea5b299a51420d76b5b22493

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.30.266-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.30.266-cp310-cp310-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for self_encryption-0.30.266-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 048f5e32d4e8ddc98a54adeed1214aafe554e5c654344cd26de84f763feefdf0
MD5 5f8cce2d948264540e34a93133cc74d0
BLAKE2b-256 c3d8fd6c221cd6480bcf5aa63d6c13ee38d171d61afb2fbb2147f3128664f49a

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.30.266-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.30.266-cp39-none-win_amd64.whl.

File metadata

File hashes

Hashes for self_encryption-0.30.266-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 a8310b78d07218b7924d9a0fc1ff0c3fe917a5a012488913ac73bcbc0c27b3fc
MD5 951816fb0eb75d2cd12888752ae18bc0
BLAKE2b-256 55f3b676de6a727fab93f42e4b9ac2c8340779648b827f645fbd4a253fd55055

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.30.266-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.30.266-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for self_encryption-0.30.266-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4e8a5a341322d931350d054c6ac08a3251d0b452632790cca5c3542b157238dd
MD5 a4af400ce8540d8f7e8f43ba1da76d93
BLAKE2b-256 7fd0554601e1b1a8616d87ecdb528ba19886a575705661ee4a948b4a6b020d61

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.30.266-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.30.266-cp39-cp39-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for self_encryption-0.30.266-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 2b88e57c66430490912648c406db3c638426ee33ebe4cc6fa9b54ffb78a2bcfc
MD5 4c16da6195819e7f92fa08f363d36deb
BLAKE2b-256 16b9c2938215844949d825ff30aedf5d4b85e02aef26c592bb0881083102f612

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.30.266-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.30.266-cp38-none-win_amd64.whl.

File metadata

File hashes

Hashes for self_encryption-0.30.266-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 0b44edb2f414696db5da4f20cafc2535532c4eeb4795cf56a7cc0fffcb48e267
MD5 7670873508928229e17f981f4347d8f8
BLAKE2b-256 9945516046d2a5438fa55897104dd9e899ef52c1745044fd53d80b39ae498ea9

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.30.266-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.30.266-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for self_encryption-0.30.266-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 77fd43cbf84207bce07017718f6fba4a84a5f33a1c1bc6cd09235f310686a546
MD5 f16d63a5c4065f8632717ee4e056a210
BLAKE2b-256 03208cc77e7187a5488016b97a53e1ce7d56f74429df5e7bb60b13f9adf6cb35

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.30.266-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.30.266-cp38-cp38-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for self_encryption-0.30.266-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 462be2846a006d7d155e6bac6894dbdf3fd8aabd69e28f7dbf8b41b223c3ac98
MD5 500940d106cd872cd171f069c51ff132
BLAKE2b-256 6b647ee4abc2216179081811f755da5560174d9d3ec12aa0dee359ccfa93cf08

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.30.266-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.30.266-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for self_encryption-0.30.266-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bee7061ed0e646f58d2d277ca36e784e6e7eaf6fd51cc9fb6a8679d55439b706
MD5 7d40c384bdf234a0f0d50a8f3e2b819c
BLAKE2b-256 a47d6fd5fbe6e762e3f8af6219d76408b347fa7e4b74797959fde2122e785f40

See more details on using hashes here.

Provenance

The following attestation bundles were made for self_encryption-0.30.266-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