Skip to content

Hybrid Post-Quantum Cryptography Implementation Status #21

@apierr

Description

@apierr

📋 Project Goal

Enable Hyperledger Fabric to create and verify signatures using a hybrid cryptographic scheme combining:

  • Classical: ECDSA (Elliptic Curve Digital Signature Algorithm)
  • Post-Quantum: Dilithium or Falcon (NIST PQC standards)

This allows measuring performance impact of PQC on blockchain transactions.


✅ What Has Been Completed

1. Infrastructure Setup

A. HYBRID BCCSP Provider (bccsp/hybrid/hybrid.go)

  • Status: ✅ Complete stub implementation
  • What it does:
    • Implements all 10 methods required by Fabric's BCCSP interface
    • Currently delegates all operations to SW provider (ECDSA)
    • Serves as foundation for future PQC integration
  • Key methods:
    KeyGen()    // Generate cryptographic keys
    Sign()      // Sign message digests
    Verify()    // Verify signatures
    Hash()      // Hash operations
    Encrypt()   // Encryption (delegated)
    Decrypt()   // Decryption (delegated)

B. HYBRID Factory (docker/compose/hybridfactory.go)

  • Status: ✅ Implemented
  • What it does:
    • Registers HYBRID as a valid BCCSP provider type
    • Follows Fabric's factory pattern (similar to SWFactory)
    • Initializes keystores and creates HYBRID BCCSP instances

C. Factory System Integration

  • Status: ✅ Integrated
  • Modified file: bccsp/factory/nopkcs11.go (during Docker build)
  • Changes:
    // In initFactories()
    case "HYBRID":
      f := &HYBRIDFactory{}
      defaultBCCSP, err = initBCCSP(f, config)
    
    // In GetBCCSPFromOpts()
    case "HYBRID":
      f = &HYBRIDFactory{}

D. Custom Peer Docker Image

  • Status: ✅ Built successfully
  • Image: custom-fabric-peer:2.5
  • Build process:
    1. Clone Fabric 2.5 sources
    2. Inject HYBRID provider code
    3. Modify factory system with sed
    4. Compile peer binary
    5. Package in runtime image
  • Size: ~2.5GB (includes build environment)

E. Docker Compose Configuration

  • Status: ✅ Configured and tested
  • File: docker/compose/fabric-baseline-hybrid.yaml
  • Key settings:
    environment:
      - CORE_PEER_BCCSP_DEFAULT=HYBRID
      - FABRIC_LOGGING_SPEC=INFO:bccsp=DEBUG
  • Validation: Peer starts successfully with log: default: HYBRID

⏳ What Remains To Be Done

Phase 1: Post-Quantum Algorithm Integration (2-3 days)

A. Add liboqs Library

# Add dependency in go.mod
go get github.com/open-quantum-safe/liboqs-go/oqs

B. Implement PQC Key Generation

File: bccsp/hybrid/hybrid.go

import "github.com/open-quantum-safe/liboqs-go/oqs"

type HybridBCCSP struct {
    sw  bccsp.BCCSP
    pqc *oqs.Signature  // Add PQC signer
}

func (h *HybridBCCSP) KeyGen(opts bccsp.KeyGenOpts) (bccsp.Key, error) {
    // 1. Generate ECDSA key (existing)
    ecdsaKey, err := h.sw.KeyGen(opts)
    
    // 2. Generate Dilithium key (NEW)
    h.pqc.Init("Dilithium3", nil)
    pqcPublic := h.pqc.GenerateKeypair()
    
    // 3. Wrap both keys in HybridKey struct
    return &HybridKey{ecdsa: ecdsaKey, pqc: pqcPublic}, nil
}

C. Implement Hybrid Signing

func (h *HybridBCCSP) Sign(k bccsp.Key, digest []byte, opts bccsp.SignerOpts) ([]byte, error) {
    // 1. Sign with ECDSA
    ecdsaSig, err := h.sw.Sign(k.ECDSAKey(), digest, opts)
    
    // 2. Sign with Dilithium
    pqcSig, err := h.pqc.Sign(digest)
    
    // 3. Combine signatures
    hybridSig := CombineSignatures(ecdsaSig, pqcSig)
    
    return hybridSig, nil
}

Signature format (example):

[4 bytes: ECDSA length] [ECDSA signature] [PQC signature]

D. Implement Hybrid Verification

func (h *HybridBCCSP) Verify(k bccsp.Key, signature, digest []byte, opts bccsp.SignerOpts) (bool, error) {
    // 1. Parse combined signature
    ecdsaSig, pqcSig := ParseHybridSignature(signature)
    
    // 2. Verify ECDSA
    validECDSA, _ := h.sw.Verify(k.ECDSAKey(), ecdsaSig, digest, opts)
    
    // 3. Verify PQC
    validPQC := h.pqc.Verify(digest, pqcSig, k.PQCKey())
    
    // 4. Both must be valid
    return validECDSA && validPQC, nil
}

Phase 2: Key Management (1-2 days)

A. Extend MSP Certificate Structure

Problem: Current MSP certificates contain only ECDSA keys

Solution:

Current MSP:
  msp/
    keystore/
      priv_sk  ← ECDSA private key

Hybrid MSP:
  msp/
    keystore/
      ecdsa_priv_sk     ← ECDSA key
      dilithium_priv_sk ← PQC key
    signcerts/
      cert.pem          ← Contains both public keys

B. Modify Certificate Generation

File: docker/compose/generate-hybrid-certs.sh (to create)

#!/bin/bash
# Generate ECDSA key (existing)
cryptogen generate --config=crypto-config.yaml

# Generate Dilithium keys (NEW)
for org in org1 orderer; do
  liboqs-keygen --alg Dilithium3 \
    --out configs/${org}/msp/keystore/dilithium_priv_sk
done

C. Custom Key Type

// bccsp/hybrid/keys.go
type HybridKey struct {
    ecdsaKey bccsp.Key
    pqcPubKey []byte
    pqcPrivKey []byte
}

func (k *HybridKey) Bytes() []byte {
    // Serialize both keys
}

func (k *HybridKey) SKI() []byte {
    // Combined Subject Key Identifier
}

Phase 3: Protocol Integration (3-5 days)

A. Transaction Signature Updates

Files to modify:

  • core/endorser/endorser.go - Endorsement signatures
  • core/committer/txvalidator/validator.go - Signature verification

Changes:

// Before: Single ECDSA signature
signature := signer.Sign(proposal)

// After: Hybrid signature (transparent)
signature := hybridSigner.Sign(proposal)  // Returns combined sig

B. Block Signature Updates

File: orderer/common/blockcutter/blockcutter.go

// Ensure block metadata includes hybrid signatures
block.Metadata.Signatures = hybridSignatures

C. Configuration Updates

File: core/ledger/kvledger/txmgmt/validation/validator.go

// Add hybrid signature validation logic
func (v *Validator) ValidateAndPrepareBatch(...) {
    for _, tx := range block.Transactions {
        // Validate hybrid signature
        valid := hybridBCCSP.Verify(tx.Signature, tx.Payload)
    }
}

Phase 4: Testing & Validation (2-3 days)

A. Unit Tests

// bccsp/hybrid/hybrid_test.go
func TestHybridSign(t *testing.T) {
    hybrid := NewHybridBCCSP(...)
    key, _ := hybrid.KeyGen(...)
    
    sig, err := hybrid.Sign(key, digest, nil)
    assert.NoError(t, err)
    assert.True(t, len(sig) > 70) // ECDSA (~70) + Dilithium (~2420)
}

func TestHybridVerify(t *testing.T) {
    // Test signature verification
}

B. Integration Tests

# Test end-to-end transaction flow
cd tests/integration
./test_hybrid_transaction.sh

Test scenarios:

  1. Create channel with hybrid signatures
  2. Deploy chaincode with hybrid endorsement
  3. Invoke transaction and verify hybrid signatures in block
  4. Query ledger and validate all signatures

C. Performance Benchmarking

# Run Caliper benchmark comparing:
# 1. ECDSA baseline
# 2. HYBRID (ECDSA + Dilithium)
# 3. PQC-only (future)

cd simulations
./benchmark_hybrid.sh

Metrics to collect:

  • Transaction latency (ms)
  • Throughput (tx/sec)
  • Signature size (bytes)
  • CPU usage (%)
  • Memory consumption (MB)

📊 Implementation Timeline

Phase Task Estimated Time Complexity
1A Add liboqs dependency 2 hours Low
1B Implement PQC KeyGen 4 hours Medium
1C Implement hybrid Sign 6 hours Medium
1D Implement hybrid Verify 4 hours Medium
2A Extend MSP structure 4 hours Medium
2B Modify cert generation 6 hours High
2C Create HybridKey type 3 hours Low
3A Update transaction flow 8 hours High
3B Update block signatures 4 hours Medium
3C Update validation logic 6 hours High
4A Write unit tests 6 hours Medium
4B Integration tests 8 hours High
4C Performance benchmarks 6 hours Medium
TOTAL 67 hours (~8-10 days)

🎯 Current System Capability

What Works Now

✅ Peer starts with HYBRID provider
✅ Provider is registered in factory system
✅ All BCCSP methods are implemented (delegating to ECDSA)
✅ Docker build system is operational
✅ Network configuration is correct

What Doesn't Work Yet

❌ No actual PQC signatures (still using ECDSA only)
❌ No Dilithium/Falcon key generation
❌ No hybrid signature format defined
❌ Certificates contain only ECDSA keys
❌ No performance benchmarks available


🚀 Next Immediate Step

Start with Phase 1A: Integrate liboqs library

# 1. Update bccsp/hybrid/hybrid.go to import liboqs
# 2. Update Dockerfile to install liboqs system library
# 3. Test basic Dilithium key generation
# 4. Implement hybrid Sign() method
# 5. Test with simple unit test

Expected outcome: Peer can generate and verify hybrid signatures locally, ready for full protocol integration.


📚 References


Document Version: 1.0
Last Updated: December 27, 2024
Status: Infrastructure Complete, PQC Integration Pending

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions