18 KiB
Implementation TODO
Remaining tasks from MIGRATION.md for the Nebula Key Enclave.
Status Summary
| Category | Status | Notes |
|---|---|---|
| Schema (10 tables) | Complete | internal/migrations/schema.sql |
| SQLC Queries | Complete | internal/migrations/query.sql |
| Generated Code | Complete | internal/keybase/*.go |
| Basic Plugin Functions | Complete | generate, load, exec, query, ping |
| Encryption | Not Started | WebAuthn PRF key derivation needed |
| UCAN v1.0.0-rc.1 | CRITICAL | Go implementation uses deprecated JWT format |
| MPC Key Shares | Not Started | Key share management missing |
| Database Serialization | Incomplete | Export dumps comments only |
1. UCAN v1.0.0-rc.1 Migration (CRITICAL PRIORITY)
Breaking Change: Current Go implementation (
internal/crypto/ucan/) uses deprecated JWT-based UCAN format. Must migrate to envelope format per v1.0.0-rc.1 spec.
Current State (DEPRECATED - Must Replace)
The following files use the old JWT-based format and must be rewritten:
| File | Status | Issue |
|---|---|---|
jwt.go |
DEPRECATED | Uses github.com/golang-jwt/jwt/v5, old can+with format |
capability.go |
DEPRECATED | Old Attenuation/Resource/Capability model |
verifier.go |
DEPRECATED | JWT parsing, old proof chain format |
source.go |
DEPRECATED | JWT token creation with MPC |
vault.go |
PARTIAL | VaultCapability needs Policy migration |
Reference Implementation (Already Compliant)
These files are already aligned with v1.0.0-rc.1:
src/ucan.ts- TypeScript types with envelope formatinternal/codec/ucan-schemas.json- JSON Schema definitions
1.1 Core Data Structures
-
Create
internal/crypto/ucan/types.go- v1.0.0-rc.1 typesDelegationPayloadstruct (iss, aud, sub, cmd, pol, nonce, meta, nbf, exp)InvocationPayloadstruct (iss, sub, aud, cmd, args, prf, meta, nonce, exp, iat, cause)Delegationtype as[Signature, DelegationSigPayload]tupleInvocationtype as[Signature, InvocationSigPayload]tupleTaskstruct (sub, cmd, args, nonce)ReceiptPayloadstruct (iss, ran, out, fx, meta, iat)RevocationPayloadstruct
-
Create
internal/crypto/ucan/policy.go- Policy LanguagePolicyStatementunion typeEqualityStatement-["==", selector, value]/["!=", selector, value]InequalityStatement-[">", selector, number]etc.LikeStatement-["like", selector, glob]NotStatement-["not", statement]AndStatement/OrStatement- logical connectivesAllStatement/AnyStatement- quantifiersSelectorparser (jq-inspired:.foo,.bar[0],.items[-1])GlobPatternmatcher
-
Create
internal/crypto/ucan/command.go- Command typesCommandtype with validation (must start with/, lowercase, no trailing slash)- Standard commands:
/crud/*,/msg/*,/ucan/revoke,/wasm/run - Custom Sonr commands:
/vault/*,/did/*,/dwn/*
1.2 Envelope Format & Encoding
-
Create
internal/crypto/ucan/envelope.go- Envelope handlingUCANEnvelope[P]generic type as[Signature, {h: VarsigHeader} & P]- Encode envelope to CBOR (requires
github.com/fxamacker/cbor/v2) - Decode envelope from CBOR
- DAG-JSON encoding for interop
- CID computation (DAG-CBOR codec, SHA-256 multihash, base58btc)
-
Create
internal/crypto/ucan/varsig.go- Varsig v1 headers- Varsig header encoding/decoding
- Algorithm metadata extraction
- Support Ed25519, P-256, secp256k1
1.3 Delegation Operations
- Create
internal/crypto/ucan/delegation.go- Delegation creation/validationNewDelegation(issuer, audience, subject, cmd, policy, exp, meta)builder- Sign delegation with issuer private key
- Validate delegation signature
- Validate delegation payload (temporal, structural)
- Extract
Capabilityfrom delegation (sub + cmd + pol)
1.4 Invocation Operations
- Create
internal/crypto/ucan/invocation.go- Invocation creation/validationNewInvocation(issuer, subject, cmd, args, proofs, exp)builder- Sign invocation with invoker private key
- Validate invocation signature
- Validate proof chain (CID references to delegations)
- Evaluate policies against invocation args
1.5 Policy Evaluation Engine
- Create
internal/crypto/ucan/eval.go- Policy evaluationEvaluatePolicy(policy Policy, args Arguments) (bool, error)- Selector resolution against IPLD data
- Equality comparison (deep IPLD equality)
- Numeric comparisons
- Glob pattern matching for
likeoperator - Logical connectives (
and,or,not) - Quantifiers (
all,any) over collections
1.6 Proof Chain Validation
- Create
internal/crypto/ucan/chain.go- Chain validation- Resolve CID to Delegation (requires delegation store)
- Validate chain continuity (child.iss == parent.aud)
- Validate capability attenuation (child.cmd subsumes parent.cmd)
- Validate policy attenuation (child.pol more restrictive than parent.pol)
- Validate temporal bounds (child.exp <= parent.exp)
- Check revocation status for all chain members
1.7 Revocation
- Create
internal/crypto/ucan/revocation.go- Revocation handlingNewRevocation(revoker, delegation_cid)builder- Validate revoker is in delegation's issuer chain
- Store revocation in database
- Query revocation status by CID
1.8 Database Integration
-
Update
internal/migrations/schema.sqlfor v1.0.0-rc.1ucan_delegationstable (cid, envelope_cbor, iss, aud, sub, cmd, exp, created_at)ucan_invocationstable (cid, envelope_cbor, iss, sub, cmd, exp, created_at)ucan_revocationstable (cid, delegation_cid, revoker, created_at)- Indexes on iss, aud, sub, cmd for efficient queries
-
Update
internal/migrations/query.sqlfor v1.0.0-rc.1InsertDelegation,GetDelegationByCID,ListDelegationsByAudienceInsertInvocation,GetInvocationByCIDInsertRevocation,IsRevoked,GetRevocationsByDelegation
1.9 Migration from Old Format
- Create migration script for existing UCAN data (if any)
- Remove deprecated files after migration complete:
jwt.go- Remove entirelycapability.go- Replace with policy-based capabilitiesverifier.go- Replace with envelope-based verificationsource.go- Replace with envelope-based token creation
1.10 Testing
- Unit tests for policy evaluation
- Unit tests for envelope encoding/decoding
- Unit tests for chain validation
- Interoperability tests against TypeScript implementation
- Test vectors from UCAN spec
2. Encryption Strategy
Reference: MIGRATION.md lines 770-814
2.1 WebAuthn PRF Key Derivation
- Implement
DeriveEncryptionKey(prfOutput []byte) ([]byte, error) - Use HKDF with SHA-256 to derive 256-bit encryption key
- Salt with
"nebula-enclave-v1"as info parameter
2.2 Database Encryption
- Implement application-level AES-GCM encryption for serialized pages
- Add encryption wrapper around
Serialize()output - Add decryption wrapper for
Load()input - Store encryption metadata (IV, auth tag) with serialized data
2.3 Encrypted Database Wrapper
- Create
internal/enclave/enclave.go- Encrypted database wrapper - Create
internal/enclave/crypto.go- WebAuthn PRF key derivation - Integrate with existing
internal/keybasepackage
3. Database Serialization
Current implementation in
conn.go:exportDump()only outputs comments
3.1 Proper Serialization
- Implement full row export with proper SQL INSERT statements
- Handle JSON columns correctly (escape special characters)
- Include table creation order for foreign key constraints
- Add version header for migration compatibility
3.2 Proper Deserialization
- Parse serialized SQL dump in
Load() - Execute INSERT statements to restore data
- Validate data integrity after restore
- Handle schema version mismatches
4. Action Manager Extensions
Reference:
internal/keybase/actions.go
4.1 Key Share Actions
CreateKeyShare(ctx, params) (*KeyShareResult, error)ListKeyShares(ctx) ([]KeyShareResult, error)GetKeyShareByID(ctx, shareID) (*KeyShareResult, error)GetKeyShareByKeyID(ctx, keyID) (*KeyShareResult, error)RotateKeyShare(ctx, shareID) errorArchiveKeyShare(ctx, shareID) errorDeleteKeyShare(ctx, shareID) error
4.2 UCAN Token Actions (v1.0.0-rc.1)
CreateDelegation(ctx, params) (*DelegationResult, error)ListDelegations(ctx) ([]DelegationResult, error)GetDelegationByCID(ctx, cid) (*DelegationResult, error)ListDelegationsByAudience(ctx, audience) ([]DelegationResult, error)CreateInvocation(ctx, params) (*InvocationResult, error)ValidateInvocation(ctx, invocation) (*ValidationResult, error)RevokeUCAN(ctx, cid) errorIsUCANRevoked(ctx, cid) (bool, error)CleanExpiredUCANs(ctx) error
4.3 Verification Method Actions
CreateVerificationMethod(ctx, params) (*VerificationMethodResult, error)ListVerificationMethods(ctx) ([]VerificationMethodResult, error)GetVerificationMethod(ctx, methodID) (*VerificationMethodResult, error)DeleteVerificationMethod(ctx, methodID) error
4.4 Service Actions
CreateService(ctx, params) (*ServiceResult, error)GetServiceByOrigin(ctx, origin) (*ServiceResult, error)GetServiceByID(ctx, serviceID) (*ServiceResult, error)UpdateService(ctx, params) errorListVerifiedServices(ctx) ([]ServiceResult, error)
4.5 Grant Actions (Extend Existing)
CreateGrant(ctx, params) (*GrantResult, error)GetGrantByService(ctx, serviceID) (*GrantResult, error)UpdateGrantScopes(ctx, grantID, scopes, accounts) errorUpdateGrantLastUsed(ctx, grantID) errorSuspendGrant(ctx, grantID) errorReactivateGrant(ctx, grantID) errorCountActiveGrants(ctx) (int64, error)
4.6 Account Actions (Extend Existing)
CreateAccount(ctx, params) (*AccountResult, error)ListAccountsByChain(ctx, chainID) ([]AccountResult, error)GetDefaultAccount(ctx, chainID) (*AccountResult, error)SetDefaultAccount(ctx, accountID, chainID) errorUpdateAccountLabel(ctx, accountID, label) errorDeleteAccount(ctx, accountID) error
4.7 Credential Actions (Extend Existing)
CreateCredential(ctx, params) (*CredentialResult, error)UpdateCredentialCounter(ctx, credentialID, signCount) errorRenameCredential(ctx, credentialID, name) errorDeleteCredential(ctx, credentialID) errorCountCredentialsByDID(ctx) (int64, error)
4.8 Session Actions (Extend Existing)
GetSessionByID(ctx, sessionID) (*SessionResult, error)GetCurrentSession(ctx) (*SessionResult, error)UpdateSessionActivity(ctx, sessionID) errorSetCurrentSession(ctx, sessionID) errorDeleteExpiredSessions(ctx) error
4.9 Sync Checkpoint Actions
GetSyncCheckpoint(ctx, resourceType) (*SyncCheckpointResult, error)UpsertSyncCheckpoint(ctx, params) errorListSyncCheckpoints(ctx) ([]SyncCheckpointResult, error)
5. MPC Key Share Management
Reference: MIGRATION.md lines 823-824
5.1 Key Share Storage
- Parse key share data from MPC protocol
- Encrypt share data before storage
- Store public key and chain code
- Track party index and threshold
5.2 Account Derivation
- Implement BIP44 derivation path parsing
- Derive addresses from public keys
- Support multiple chains (Cosmos 118, Ethereum 60)
- Generate proper address encoding per chain
5.3 Key Rotation
- Implement key rotation workflow
- Archive old shares
- Update status transitions
- Handle rotation failures gracefully
6. Plugin Function Extensions
Reference:
main.go
6.1 Extend exec Resource Handlers
- Add
key_sharesresource handler - Add
delegationsresource handler (v1.0.0-rc.1) - Add
invocationsresource handler (v1.0.0-rc.1) - Add
verification_methodsresource handler - Add
servicesresource handler - Add
sync_checkpointsresource handler
6.2 Extend generate Function
- Parse WebAuthn credential properly (CBOR/COSE format)
- Extract public key from credential
- Create initial verification method
- Create initial credential record
- Generate initial account (if key share provided)
6.3 Signing Function
- Implement
signwasmexport function - Support signing with MPC key shares
- Return signature in appropriate format
- Log signing operations for audit
7. Capability Delegation (v1.0.0-rc.1)
Reference: UCAN Delegation specification
7.1 Delegation Chain Management
- Enforce maximum delegation depth (prevent infinite chains)
- Validate delegator has capability to delegate (sub field)
- Ensure proper capability attenuation (cmd + pol)
- Track parent-child relationships via CID references
7.2 Policy Attenuation
- Child policy must be more restrictive than parent
- Implement policy subsumption checking
- Command hierarchy validation (
/crud/*subsumes/crud/read)
7.3 Delegation Status
- Implement expiration checking
- Handle revocation cascades (revoke chain)
- Update status on expiry
8. DID State Sync
Reference: MIGRATION.md line 827
8.1 Sync Infrastructure
- Create
internal/enclave/sync.go- DID state sync logic - Implement checkpoint tracking
- Store last synced block height
- Track last processed transaction hash
8.2 Sync Operations
- Fetch DID document updates from chain
- Validate on-chain document hash
- Update local state on changes
- Handle reorgs and rollbacks
9. TypeScript SDK
Reference: README.md,
src/directory
9.1 Core SDK
- Implement
createEnclave(wasmPath)factory - Implement
generate(credential)wrapper - Implement
load(database)wrapper - Implement
exec(filter, token?)wrapper - Implement
query(did?)wrapper
9.2 UCAN SDK (v1.0.0-rc.1)
- Delegation builder using
src/ucan.tstypes - Invocation builder
- Policy builder helpers
- Envelope encoding/decoding (DAG-CBOR)
- CID computation
9.3 WebAuthn Integration
- Helper for credential creation
- Helper for PRF extension output
- Proper encoding/decoding utilities
10. Testing
10.1 Unit Tests
- Test all ActionManager methods
- Test serialization/deserialization roundtrip
- Test encryption/decryption
- Test UCAN policy evaluation
- Test UCAN envelope encoding
10.2 Integration Tests
- Test full generate -> load -> exec flow
- Test credential lifecycle
- Test session management
- Test grant management
- Test UCAN delegation chain
10.3 Plugin Tests
- Extend
make test-pluginwith all functions - Add error case testing
- Test with various input formats
10.4 Interoperability Tests
- Go <-> TypeScript UCAN envelope compatibility
- CID computation consistency
- Policy evaluation consistency
11. Security Hardening
11.1 Input Validation
- Validate all JSON inputs against schemas
- Sanitize SQL-sensitive characters in serialization
- Validate DID format on all inputs
- Validate base64 encoding
11.2 Cryptographic Security
- Use constant-time comparison for sensitive data
- Clear sensitive data from memory after use
- Validate key sizes and formats
- Implement proper nonce generation
11.3 Access Control
- Enforce DID ownership on all mutations
- Validate session before sensitive operations
- Check grant scopes before data access
- Log security-relevant operations
Priority Order
-
CRITICAL (Spec Compliance)
- UCAN v1.0.0-rc.1 Migration (Section 1)
- Core data structures (1.1)
- Envelope format (1.2)
- Delegation operations (1.3)
- Policy evaluation (1.5)
-
High Priority (Core Functionality)
- Database Serialization (3.1, 3.2)
- Credential Creation (6.2, 4.7)
- Key Share Actions (4.1)
- Account Actions (4.6)
-
Medium Priority (Authorization)
- Invocation operations (1.4)
- Proof chain validation (1.6)
- Revocation (1.7)
- Encryption Strategy (2.1, 2.2)
-
Lower Priority (Enhancement)
- TypeScript SDK (9.x)
- DID State Sync (8.x)
- Additional exec handlers (6.1)
- Testing (10.x)
- Security Hardening (11.x)
Deprecated Items (Removed)
The following items from the previous TODO have been removed as they reference the deprecated JWT-based UCAN format:
Section 4.1 "Token Validation" - JWT parsing-> Replaced by envelope validation (1.2, 1.3)Section 4.2 "Capability Verification" --> Replaced by policy evaluation (1.5)can/withformatSection 4.3 "Proof Chain Validation" - JWT proof strings-> Replaced by CID-based chain (1.6)Section 3.2 "UCAN Token Actions" - Old format-> Replaced by v1.0.0-rc.1 actions (4.2)Section 3.3 "Delegation Actions" - Old delegation model-> Merged into Section 1 and 4.2
The old capability model (Attenuation, Resource, Capability interfaces) is replaced by:
sub(DID) - Subject of the capabilitycmd(Command) - Action being delegatedpol(Policy) - Constraints on invocation arguments