ZKProof¶
Base class for Zero-Knowledge Proof systems.
This module provides a base class for implementing zero-knowledge proof schemes in the Charm cryptographic library. Zero-knowledge proofs allow a prover to convince a verifier that a statement is true without revealing any additional information beyond the validity of the statement.
- The module defines:
Security definitions for ZK proofs (HVZK, ZK, NIZK, SIM)
Exception classes for error handling
ZKProofBase class for implementing concrete ZK proof schemes
Proof dataclass for storing proof components
- Security Properties:
HVZK: Honest-Verifier Zero-Knowledge - secure against honest verifiers
ZK: Zero-Knowledge - secure against malicious verifiers
NIZK: Non-Interactive Zero-Knowledge - no interaction required
SIM: Simulation Sound - proofs cannot be simulated without witness
- Example:
- class SchnorrProof(ZKProofBase):
- def setup(self, group):
# Initialize with the group …
- def prove(self, statement, witness):
# Generate Schnorr proof …
- def verify(self, statement, proof):
# Verify Schnorr proof …
- class ZKProof.Proof(commitment: Any, challenge: Any, response: Any, proof_type: str, version: int = 1)[source]¶
Bases:
objectDataclass to hold zero-knowledge proof components.
This class encapsulates all components of a zero-knowledge proof, following the standard Sigma protocol structure (commitment, challenge, response).
- Attributes:
- commitment: The prover’s initial commitment value(s). This is the first
message in a Sigma protocol, committing the prover to random values.
- challenge: The challenge value from the verifier (or derived via Fiat-Shamir
for non-interactive proofs). Must be unpredictable to the prover.
- response: The prover’s response computed using the witness and challenge.
This allows the verifier to check the proof without learning the witness.
- proof_type: String identifier for the type of proof (e.g., ‘schnorr’, ‘dleq’,
‘or’, ‘and’). Used for deserialization and validation.
- version: Integer version number for the proof format. Allows for backward
compatibility when proof formats evolve.
- Example:
- proof = Proof(
commitment=g ** r, challenge=hash(commitment, statement), response=r + challenge * secret, proof_type=’schnorr’, version=1
)
- challenge: Any¶
- commitment: Any¶
- proof_type: str¶
- response: Any¶
- version: int = 1¶
- exception ZKProof.ZKParseError[source]¶
Bases:
ZKProofErrorError parsing ZK statements.
Raised when a zero-knowledge statement cannot be parsed, typically due to malformed input or invalid syntax.
- class ZKProof.ZKProofBase[source]¶
Bases:
SchemeBaseBase class for zero-knowledge proof schemes.
This class provides the foundation for implementing zero-knowledge proof systems in Charm. Concrete implementations should extend this class and implement all abstract methods.
- A zero-knowledge proof scheme consists of three core algorithms:
setup: Initialize the proof system with group parameters
prove: Generate a proof that a statement is true given a witness
verify: Verify that a proof is valid for a given statement
Additionally, serialization methods are provided for proof persistence and network transmission.
- Security Properties:
Implementations should specify their security level using setProperty(): - HVZK: Secure against honest verifiers only - ZK: Secure against malicious verifiers (requires simulation) - NIZK: Non-interactive (typically via Fiat-Shamir transform) - SIM: Simulation soundness (proofs unforgeable even with simulated proofs)
- Example:
- class MyZKProof(ZKProofBase):
- def __init__(self):
ZKProofBase.__init__(self) self.setProperty(secDef=’NIZK’, assumption=’DL’, secModel=’ROM’)
- deserialize(data, group)[source]¶
Deserialize bytes to a proof.
Reconstructs a Proof object from its byte representation.
- Args:
data: The serialized proof bytes. group: The algebraic group used in the proof, needed for
deserializing group elements.
- Returns:
Proof: The reconstructed Proof object.
- Raises:
NotImplementedError: Must be implemented by subclasses. ZKParseError: If the data cannot be parsed as a valid proof.
- getProperty()[source]¶
Get the security properties of this ZK proof scheme.
- Returns:
- dict: A dictionary containing all configured security properties,
including scheme type, security definition, assumption, message space, and security model.
- prove(statement, witness)[source]¶
Generate a zero-knowledge proof.
Creates a proof that the prover knows a witness satisfying the given statement, without revealing the witness itself.
- Args:
- statement: The public statement to prove. The format depends
on the specific proof type (e.g., public key for Schnorr).
- witness: The secret witness known only to the prover
(e.g., private key for Schnorr).
- Returns:
Proof: A Proof object containing commitment, challenge, and response.
- Raises:
NotImplementedError: Must be implemented by subclasses. ZKValidationError: If statement or witness validation fails.
- serialize(proof, group)[source]¶
Serialize a proof to bytes.
Converts a Proof object to a byte representation suitable for storage or network transmission.
- Args:
proof: The Proof object to serialize. group: The algebraic group used in the proof, needed for
serializing group elements.
- Returns:
bytes: The serialized proof data.
- Raises:
NotImplementedError: Must be implemented by subclasses. ZKValidationError: If proof format is invalid for serialization.
- setProperty(secDef=None, assumption=None, messageSpace=None, secModel=None, **kwargs)[source]¶
Set security properties for this ZK proof scheme.
Configures the security properties of the proof scheme, including the security definition, hardness assumption, and security model.
- Args:
- secDef: Security definition, must be one of: ‘HVZK’, ‘ZK’, ‘NIZK’, ‘SIM’.
Defines the zero-knowledge security level of the scheme.
- assumption: The computational hardness assumption (e.g., ‘DL’, ‘DDH’).
Should be a string representing the underlying assumption.
- messageSpace: Description of the valid message/statement space.
Can be a type or list of types.
- secModel: Security model, typically ‘SM’ (standard), ‘ROM’ (random oracle),
or ‘CRS’ (common reference string).
**kwargs: Additional scheme-specific properties.
- Returns:
bool: True if properties were set successfully.
- Raises:
AssertionError: If secDef is not a valid security definition.
- setup(group)[source]¶
Initialize the proof system with group parameters.
This method should initialize any scheme-specific parameters needed for proof generation and verification.
- Args:
- group: The algebraic group to use for the proof system.
Typically a pairing group or integer group from Charm.
- Returns:
Implementation-specific setup parameters (e.g., public parameters).
- Raises:
NotImplementedError: Must be implemented by subclasses.
- verify(statement, proof)[source]¶
Verify a zero-knowledge proof.
Checks whether the given proof is valid for the statement, confirming that the prover knows a valid witness.
- Args:
statement: The public statement that was proven. proof: The Proof object to verify.
- Returns:
bool: True if the proof is valid, False otherwise.
- Raises:
NotImplementedError: Must be implemented by subclasses. ZKValidationError: If statement or proof format is invalid. ZKProofVerificationError: If verification fails due to invalid proof.
- exception ZKProof.ZKProofError[source]¶
Bases:
ExceptionBase exception for the ZKP module.
All ZKP-related exceptions inherit from this class, allowing for broad exception catching when needed.
- exception ZKProof.ZKProofVerificationError[source]¶
Bases:
ZKProofErrorProof verification failed.
Raised when a zero-knowledge proof fails verification, indicating either an invalid proof or mismatched statement.
- exception ZKProof.ZKValidationError[source]¶
Bases:
ZKProofErrorError validating inputs.
Raised when inputs to ZKP operations fail validation, such as invalid group elements or malformed witnesses.