bap-identity
BAP Identity Management
Overview
This skill enables comprehensive management of BAP (Bitcoin Attestation Protocol) identity files using two complementary command-line tools:
- bap-cli: High-level BAP identity operations (create, list, extract member identities)
- bbackup: Low-level encryption/decryption of any JSON backup data
Use this skill when working with encrypted BAP identity backups (.bep files), creating new identities, extracting member identities, encrypting/decrypting JSON files, or generating test fixtures.
Prerequisites
Required Tools
Verify both tools are installed:
bap --version
bbackup --version
Installing bap-cli
git clone https://github.com/b-open-io/bap-cli.git
cd bap-cli
bun install
bun run build
bun link
Installing bbackup
git clone https://github.com/rohenaz/bitcoin-backup.git
cd bitcoin-backup
bun install
bun run build
bun link
Tool Selection Guide
Choose the appropriate tool based on the task:
Use bap-cli when:
- Creating new BAP identities
- Listing identities in a master backup
- Extracting member identities from master backup
- Working specifically with BAP identity structures
- Generating test fixtures for automated tests
Use bbackup when:
- Encrypting arbitrary JSON data to .bep format
- Decrypting .bep files to inspect contents
- Upgrading encryption strength (100k → 600k iterations)
- Working with non-BAP backup formats (WifBackup, OneSatBackup, VaultBackup)
- Need lower-level control over encryption parameters
Use both when:
- Inspecting BAP identities created by bap-cli
- Re-encrypting backups with different passwords
- Migrating between encryption strengths
- Debugging backup file issues
Core Operations with bap-cli
Creating New Identity Backups
When users request a new BAP identity, use the bap new command with appropriate backup type:
Type42 backups (recommended for simplicity):
- Use random root private key
- Simpler key management
- Suitable for most use cases
bap new --type type42 --password <password> --name "<name>" --output <file.bep>
Legacy (BIP32) backups (for hierarchical deterministic wallets):
- Use HD derivation from mnemonic
- Generates BIP32 mnemonic phrase
- Required when mnemonic recovery is needed
bap new --type legacy --password <password> --name "<name>" --output <file.bep>
Important: Always use strong passwords. The password encrypts the backup file and cannot be recovered if lost.
Listing Identities
When users need to see what identities are in a backup file, use bap list:
bap list <backup.bep> --password <password>
This displays:
- All identity keys with their indices
- Backup type (Type42 or Legacy)
- Number of identities in the backup
Use this before extracting member identities to determine the correct index.
Extracting Member Identities
When users need to extract a single identity from a master backup (common for distributing individual identities), use bap member:
bap member <master.bep> --password <password> --index <index> --output <member.bep>
The index is zero-based. To find the correct index:
- First run
bap liston the master backup - Note the index of the desired identity
- Extract using that index
Decrypting and Inspecting Backups
When users need to view the contents of an encrypted backup, use bap export:
bap export <backup.bep> --password <password>
This outputs the decrypted JSON structure. Use this to:
- Debug backup issues
- Verify backup contents
- Inspect identity structure
Optionally save re-encrypted version:
bap export <backup.bep> --password <password> --output <new.bep>
Core Operations with bbackup
Encrypting JSON Files
When users have JSON data that needs encryption:
bbackup enc <input.json> -p <password> [-o <output.bep>]
Use cases:
- Encrypting manually created backup JSON
- Encrypting exported identity data
- Creating custom encrypted payloads
Example:
# Create JSON file
echo '{"wif":"L5EZftvrYa...","label":"My Key"}' > wallet.json
# Encrypt it
bbackup enc wallet.json -p "strongpass" -o wallet.bep
Decrypting to JSON
When users need to inspect encrypted .bep files:
bbackup dec <input.bep> -p <password> [-o <output.json>]
Use cases:
- Inspecting backup contents
- Debugging encrypted files
- Extracting data for processing
Example:
# Decrypt to JSON
bbackup dec identity.bep -p "password" -o identity.json
# View contents
cat identity.json
Upgrading Encryption Strength
When users have older backups with weaker encryption (100k iterations):
bbackup upg <old.bep> -p <password> -o <upgraded.bep>
This upgrades to 600,000 PBKDF2 iterations (NIST recommended).
Use cases:
- Strengthening security of existing backups
- Migrating legacy backups
- Preparing backups for long-term storage
Combined Workflows
Inspect BAP Identity Using bbackup
When users need to examine a BAP identity created by bap-cli:
# Create identity with bap-cli
bap new --type type42 --password pass123 --name "Alice" --output alice.bep
# Decrypt with bbackup to inspect
bbackup dec alice.bep -p pass123 -o alice.json
# View the JSON structure
cat alice.json
# Shows: { "ids": "...", "rootPk": "...", "label": "Alice", "createdAt": "..." }
This is useful for:
- Understanding the internal structure
- Debugging identity issues
- Verifying backup contents
- Extracting specific fields programmatically
Change Password on BAP Identity
When users need to re-encrypt a backup with a different password:
# Decrypt with old password
bbackup dec identity.bep -p "oldpass" -o identity.json
# Re-encrypt with new password
bbackup enc identity.json -p "newpass" -o identity-new.bep
# Clean up temporary file
rm identity.json
Upgrade Security of BAP Backup
When users have older BAP identities that need stronger encryption:
# Upgrade directly (maintains same password)
bbackup upg old-identity.bep -p "password" -o identity-upgraded.bep
# Verify it works with bap-cli
bap list identity-upgraded.bep --password password
Extract and Transform Member Identity
When users need to extract and modify a member identity:
# Extract member with bap-cli
bap member master.bep --password pass --index 0 --output member.bep
# Decrypt to JSON with bbackup
bbackup dec member.bep -p pass -o member.json
# Modify JSON as needed (e.g., change label)
# ... manual editing or script ...
# Re-encrypt modified version
bbackup enc member.json -p pass -o member-modified.bep
Debug Backup Issues
When users encounter problems with backups:
- Try with bap-cli first:
bap list problematic.bep --password password
- If that fails, try bbackup for more details:
bbackup dec problematic.bep -p password -o debug.json
- Inspect the JSON structure:
cat debug.json | jq . # Pretty print if jq is available
Test Fixture Generation (Programmatic)
When users need BAP identities for Playwright or automated testing, use the programmatic API:
import { createType42Backup } from "bap-cli";
// Generate backup with multiple test identities
const backup = await createType42Backup("testpassword123", [
{ name: "Test User 1" },
{ name: "Test User 2" },
]);
// Save to file
await backup.saveTo("/tmp/test-backup.bep");
// Get identity keys for assertions
const keys = await backup.getIdentityKeys();
// Extract member backup for specific identity
const memberBackup = await backup.getMemberBackup(0);
// Clean up temp files when done
await backup.cleanup();
This approach is more efficient than CLI for test automation as it:
- Generates identities programmatically
- Provides direct access to keys for test assertions
- Handles cleanup automatically
- Works with multiple identities in a single operation
File Format Details
All BAP identity files use the .bep extension (Bitcoin Encrypted Payload):
Master backups (from bap-cli):
- Contain root key/xprv and can generate multiple identities
- Structure:
{ ids, rootPk/xprv, label?, createdAt? }
Member backups (from bap-cli):
- Contain single identity (WIF and identity key)
- Structure:
{ wif, id, label?, createdAt? }
Encryption (used by both tools):
- Algorithm: AES-256-GCM
- Key derivation: PBKDF2-SHA256
- Iterations: 600,000 (recommended) or 100,000 (legacy)
- Format: Base64 encoded string
Error Handling
bap-cli Errors
"Error: type must be 'legacy' or 'type42'"
- Use correct --type flag with valid value
"Error: Invalid index"
- Run
bap listfirst to see available indices - Indices are zero-based (first identity is index 0)
Decryption failures
- Verify correct password
- Ensure file is not corrupted
- Check file is actually a .bep backup
"bap: command not found"
- Install bap-cli globally using installation steps above
bbackup Errors
"Decryption failed"
- Wrong password
- Corrupted file
- Try bap-cli commands if file is BAP-specific
"Invalid backup format"
- Input file for
encmust be valid JSON - Check JSON syntax:
cat file.json | jq .
"Password too short"
- Minimum 8 characters required
- Use 12+ characters for high-value secrets
General Troubleshooting
- Verify tools are installed:
which bap bbackup
- Test basic encryption cycle:
echo '{"test":"data"}' > test.json
bbackup enc test.json -p "testpass" -o test.bep
bbackup dec test.bep -p "testpass" -o out.json
diff test.json out.json # Should match
rm test.json test.bep out.json
- Check file format:
file backup.bep # Should show ASCII text (base64)
head -c 50 backup.bep # Should show base64 characters
Reference Documentation
Complete command reference and advanced usage:
-
bap-cli: See
references/bap-cli-reference.mdfor:- Detailed command syntax
- All available options
- Programmatic API documentation
- Complete examples
-
bbackup: See
references/bbackup-reference.mdfor:- Encryption specifications
- Security features
- Integration patterns
- Troubleshooting guide
Common Use Case Patterns
Pattern 1: Create → Inspect → Distribute
# 1. Create master identity
bap new --type type42 --password masterpass --name "Org Master" --output master.bep
# 2. Verify contents
bbackup dec master.bep -p masterpass -o master.json
cat master.json
# 3. Extract member for distribution
bap member master.bep --password masterpass --index 0 --output member-alice.bep
# 4. Distribute member.bep to Alice
Pattern 2: Import → Upgrade → Export
# 1. Receive old backup
# old.bep (using 100k iterations)
# 2. Upgrade encryption
bbackup upg old.bep -p "password" -o new.bep
# 3. Verify with BAP tools
bap list new.bep --password password
Pattern 3: Generate → Test → Cleanup
// In test file
const backup = await createType42Backup("testpass", [
{ name: "Test Identity" }
]);
await backup.saveTo("/tmp/test.bep");
// Run tests using /tmp/test.bep
await backup.cleanup(); // Removes temp files