# Synor Crypto WASM

WASM-compatible cryptography library for the Synor web wallet.

## Current Features

- **Ed25519 Signatures**: Full support via `ed25519-dalek` (pure Rust)
- **Dilithium3 (ML-DSA-65)**: Post-quantum signatures via `pqc_dilithium` (pure Rust)
- **BIP-39 Mnemonics**: 12-24 word phrases for key generation
- **Bech32m Addresses**: Synor address encoding/decoding
- **BLAKE3/SHA3 Hashing**: Cryptographic hash functions
- **HKDF Key Derivation**: Secure key derivation

## Building

```bash
# Build for web (requires wasm-pack)
wasm-pack build --target web --out-dir pkg

# Build for Node.js
wasm-pack build --target nodejs --out-dir pkg-node
```

## Usage in JavaScript

```javascript
import init, { Keypair, Mnemonic, DilithiumSigningKey } from 'synor-crypto-wasm';

await init();

// Generate mnemonic
const mnemonic = new Mnemonic(24);
console.log(mnemonic.phrase());

// Create Ed25519 keypair
const keypair = Keypair.fromMnemonic(mnemonic.phrase(), "");
console.log(keypair.address("mainnet"));

// Sign message with Ed25519
const message = new TextEncoder().encode("Hello Synor!");
const signature = keypair.sign(message);
const valid = keypair.verify(message, signature);

// Post-quantum signatures with Dilithium3
const pqKey = new DilithiumSigningKey();
const pqSig = pqKey.sign(message);
const pqValid = pqKey.verify(message, pqSig);
console.log("Post-quantum signature valid:", pqValid);
```

## Dilithium3 Post-Quantum Support

### Current Status: Implemented

Post-quantum signatures are now available via the `pqc_dilithium` crate, a pure
Rust implementation that compiles to WASM. This provides Dilithium3 (equivalent
to NIST's ML-DSA-65 at Security Category 3).

**Key Sizes (Dilithium3 / ML-DSA-65):**

- Public Key: 1,952 bytes
- Secret Key: ~4,000 bytes
- Signature: 3,293 bytes

### Roadmap

1. [x] Ed25519 basic support
2. [x] BIP-39 mnemonic generation
3. [x] Address encoding
4. [x] Dilithium3 signatures (WASM-compatible)
5. [ ] Hybrid Ed25519 + Dilithium verification
6. [ ] Kyber key encapsulation (post-quantum key exchange)

### Hybrid Signatures (Recommended)

For maximum security, use both Ed25519 and Dilithium3:

```javascript
// Sign with both algorithms
const ed25519Sig = keypair.sign(message);
const dilithiumSig = pqKey.sign(message);

// Verify both must pass
const valid = keypair.verify(message, ed25519Sig) &&
              pqKey.verify(message, dilithiumSig);
```

This provides classical security now and quantum resistance for the future.

## Security Notes

- Keys are zeroized on drop
- Uses `getrandom` with `js` feature for secure randomness in browsers
- No side-channel resistance in signature timing (use constant-time ops for production)

## Testing

```bash
# Run Rust tests
cargo test

# Run WASM tests in browser
wasm-pack test --headless --chrome
```
