19 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 | In Progress | Core types, builders, and policies complete. Uses go-ucan v1.1.0 |
| 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)
Status: Core implementation complete using
github.com/ucan-wg/go-ucan v1.1.0. Deprecated JWT-based files deleted. Remaining work is database integration and MPC signing.
Completed Implementation
The following files implement UCAN v1.0.0-rc.1 using the official go-ucan library:
| File | Status | Description |
|---|---|---|
ucan.go |
✅ Complete | Type re-exports, Sonr commands, pre-parsed constants |
policy.go |
✅ Complete | PolicyBuilder fluent API, Sonr-specific policy helpers |
delegation.go |
✅ Complete | DelegationBuilder fluent API, Sonr delegation helpers |
invocation.go |
✅ Complete | InvocationBuilder fluent API, Sonr invocation helpers |
types.go |
✅ Complete | ValidationError, Capability, ExecutionResult, Sonr types |
Dependencies Added
github.com/ucan-wg/go-ucan v1.1.0- Official UCAN librarygithub.com/ipld/go-ipld-prime v0.21.0- IPLD encodinggithub.com/MetaMask/go-did-it v1.0.0-pre1- DID handling (indirect)github.com/ipfs/go-cid v0.5.0- Content addressing (indirect)
Deleted (Deprecated JWT-based)
- Removedjwt.go- Removedcapability.go- Removedverifier.go- Removedsource.go- Entire directory removedinternal/crypto/mpc/spec/
1.1 Core Data Structures
-
Create
internal/crypto/ucan/types.go- v1.0.0-rc.1 types- Re-export
DelegationandInvocationfrom go-ucan Taskstruct (sub, cmd, args, nonce)ReceiptPayloadstruct (iss, ran, out, fx, meta, iat)RevocationPayloadstructValidationErrorwith error codes matching TypeScriptCapabilitystruct (sub, cmd, pol)ExecutionResult[T, E]generic type- Sonr-specific types:
VaultCapability,DIDCapability,DWNCapability
- Re-export
-
Create
internal/crypto/ucan/policy.go- Policy LanguagePolicyBuilderfluent API with all operatorsEqual,NotEqual- equality statementsGreaterThan,LessThan, etc. - inequality statementsLike- glob pattern matchingNot,And,Or- logical connectivesAll,Any- quantifiers- Sonr helpers:
VaultPolicy,DIDPolicy,ChainPolicy,AccountPolicy
-
Create
internal/crypto/ucan/ucan.go- Command typesCommandtype re-exported from go-ucan- Sonr commands:
/vault/*,/did/*,/dwn/*,/ucan/revoke - Pre-parsed command constants:
VaultRead,VaultWrite,DIDUpdate, etc. CommandSubsumes()helper using go-ucan'sCovers()method
1.2 Envelope Format & Encoding
-
Envelope handling via go-ucan library
ToSealed()method produces DAG-CBOR bytes + CIDToDagCbor(),ToDagJson()encoding methods- CID computation handled by go-ucan
-
Varsig support via go-ucan library
- Ed25519, P-256, secp256k1 via
go-did-it/crypto
- Ed25519, P-256, secp256k1 via
1.3 Delegation Operations
- Create
internal/crypto/ucan/delegation.go- Delegation creation/validationDelegationBuilderfluent APINewDelegation,NewRootDelegation,NewPowerlineDelegationre-exportsBuildSealed(privKey)for signing- Sonr helpers:
NewVaultDelegation,NewDIDDelegation,NewDWNDelegation - Temporal options:
ExpiresAt,ExpiresIn,NotBefore,NotBeforeIn
1.4 Invocation Operations
- Create
internal/crypto/ucan/invocation.go- Invocation creation/validationInvocationBuilderfluent APINewInvocationre-exportBuildSealed(privKey)for signing- Proof chain management:
Proof(),Proofs() - Sonr helpers:
VaultReadInvocation,VaultSignInvocation,DIDUpdateInvocation
1.5 Policy Evaluation Engine
Note: go-ucan provides
ExecutionAllowed()on invocations which validates proofs and evaluates policies.
- Policy evaluation via go-ucan's
invocation.ExecutionAllowed(loader) - Create
internal/crypto/ucan/eval.go- Additional evaluation helpers (if needed)- Custom selector resolution for Sonr-specific args
- Caching layer for repeated evaluations
1.6 Proof Chain Validation
Note: go-ucan handles chain validation internally via
ExecutionAllowed().
- Chain validation via go-ucan library
- Create
internal/crypto/ucan/store.go- Delegation store- Implement
delegation.Loaderinterface GetDelegation(cid.Cid) (*delegation.Token, error)- Cache loaded delegations for performance
- Implement
1.7 Revocation
RevocationInvocation()helper ininvocation.go- Create
internal/crypto/ucan/revocation.go- Revocation handling- Revocation store implementation
IsRevoked(cid.Cid) (bool, error)query- Integration with chain validation
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 MPC Signing Integration
- Create
internal/crypto/ucan/signer.go- MPC key integration- Implement
crypto.PrivateKeySigningBytesinterface for MPC - Sign delegations with MPC key shares
- Sign invocations with MPC key shares
- Implement
1.10 Testing
- Unit tests for builders (DelegationBuilder, InvocationBuilder)
- Unit tests for policy helpers
- Unit tests for Sonr-specific invocations
- 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) - ✅ Core Complete
UCAN v1.0.0-rc.1 Migration (Section 1)✅ Core types, builders, policies doneCore data structures (1.1)✅ Using go-ucan v1.1.0Envelope format (1.2)✅ Handled by go-ucanDelegation operations (1.3)✅ DelegationBuilder completeInvocation operations (1.4)✅ InvocationBuilder complete- Database integration (1.8) - Next priority
- MPC signing integration (1.9) - Next priority
-
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)
- UCAN Database Integration (1.8)
-
Medium Priority (Authorization)
- Delegation store (1.6)
- Revocation store (1.7)
- MPC Signing (1.9)
- 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)
Completed Items
UCAN v1.0.0-rc.1 Core (January 2025)
The following was completed using github.com/ucan-wg/go-ucan v1.1.0:
- ✅ Type re-exports from go-ucan (Delegation, Invocation, Command, Policy)
- ✅ Sonr command constants (/vault/, /did/, /dwn/*)
- ✅ DelegationBuilder fluent API with Sonr-specific helpers
- ✅ InvocationBuilder fluent API with Sonr-specific helpers
- ✅ PolicyBuilder fluent API with all operators
- ✅ Sonr policy helpers (VaultPolicy, DIDPolicy, ChainPolicy)
- ✅ ValidationError types matching TypeScript definitions
- ✅ Capability, ExecutionResult, and related types
Deleted (Deprecated JWT-based)
- ✅ Deleted
jwt.go- Old JWT token handling - ✅ Deleted
capability.go- Old Attenuation/Resource/Capability model - ✅ Deleted
verifier.go- Old JWT verification - ✅ Deleted
source.go- Old JWT token creation - ✅ Deleted
internal/crypto/mpc/spec/- Old MPC JWT integration - ✅ Removed
github.com/golang-jwt/jwt/v5dependency
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 go-ucan validationSection 4.2 "Capability Verification" --> Replaced by policy evaluationcan/withformatSection 4.3 "Proof Chain Validation" - JWT proof strings-> Replaced by CID-based chainSection 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