anon-identity
Version:
Decentralized identity framework with DIDs, Verifiable Credentials, and privacy-preserving selective disclosure
305 lines (230 loc) • 9.4 kB
Markdown
[](https://github.com/Dizzident/anon-identity/actions/workflows/ci.yml)
[](https://nodejs.org)
[](https://opensource.org/licenses/MIT)
A TypeScript implementation of a decentralized identity framework using DIDs (Decentralized Identifiers) and VCs (Verifiable Credentials), with preparation for future ZKP (Zero-Knowledge Proof) integration.
## Features
- 🔐 **Decentralized Identity (DID)**: Create and manage DID:key identifiers
- 📜 **W3C VC 2.0 Support**: Full Verifiable Credentials 2.0 specification compliance
- 🎭 **Enhanced Privacy**: BBS+ signatures for zero-knowledge selective disclosure
- 🔑 **Secure Key Management**: Ed25519 key generation and encrypted storage
- 📝 **JSON-LD Processing**: Full validation, expansion, and canonicalization
- 🖊️ **Linked Data Proofs**: Extensible signature suites (Ed25519, BBS+)
- 📊 **Credential Status**: StatusList2021 and RevocationList2020 support
- 🔒 **Multiple Proofs**: Multi-party attestations and endorsements
- 💼 **Enterprise Ready**: Session management, batch operations, error handling
- 🌐 **Multi-Storage**: Memory, File, IPFS, and Blockchain backends
- 🎯 **TypeScript First**: Full type safety and IntelliSense support
## Installation
```bash
npm install anon-identity
```
### Browser Support 🌐
The library now supports browser environments! Use the browser-specific entry point for web applications:
```typescript
// For browsers (React, Vue, Angular, etc.)
import { CryptoService, DIDService } from 'anon-identity/browser';
// For Node.js (full features)
import { CryptoService, DIDService } from 'anon-identity/node';
```
See [BROWSER_USAGE.md](./BROWSER_USAGE.md) for detailed browser usage instructions.
```typescript
import { IdentityProvider, UserWallet, ServiceProvider } from './src';
// Create an Identity Provider
const idp = await IdentityProvider.create();
// Create a User Wallet
const userWallet = await UserWallet.create();
// Issue a Verifiable Credential
const credential = await idp.issueVerifiableCredential(
userWallet.getDID(),
{
givenName: 'Alice',
dateOfBirth: '1990-01-15'
}
);
// Store credential in wallet
userWallet.storeCredential(credential);
// Create a Verifiable Presentation
const presentation = await userWallet.createVerifiablePresentation([credential.id]);
// Verify the presentation
const sp = new ServiceProvider('My Service', [idp.getDID()]);
const result = await sp.verifyPresentation(presentation);
```
```typescript
import { IdentityProvider, UserWallet, ServiceProvider } from 'anon-identity';
// See examples directory for complete usage examples
```
```typescript
import { AgentIdentityManager, DelegationManager } from 'anon-identity';
// Create agent manager
const agentManager = new AgentIdentityManager();
// Create primary agent
const primaryAgent = await agentManager.createAgent(userDID, {
name: 'Assistant Agent',
description: 'Main AI assistant',
canDelegate: true,
maxDelegationDepth: 3
});
// Create specialized sub-agent
const calendarAgent = await agentManager.createSubAgent(primaryAgent.did, {
name: 'Calendar Agent',
description: 'Calendar management specialist',
parentAgentDID: primaryAgent.did,
requestedScopes: ['read:calendar', 'write:calendar']
});
```
```typescript
// Create a presentation revealing only specific attributes
const disclosureRequest: SelectiveDisclosureRequest = {
credentialId: credential.id,
attributesToDisclose: ['isOver18'] // Only reveal age verification, not birth date
};
const presentation = await userWallet.createSelectiveDisclosurePresentation([disclosureRequest]);
```
```typescript
// Revoke a credential
idp.revokeCredential(credential.id);
const revocationUrl = await idp.publishRevocationList();
// Service provider automatically checks revocation during verification
const result = await sp.verifyPresentation(presentation);
// Result will be invalid if credential is revoked
```
```typescript
import { IdentityProviderV2, ServiceProviderV2 } from 'anon-identity';
// Issue VC 2.0 credential with advanced features
const credential = await idp.issueVerifiableCredentialV2(userDID, attributes, {
credentialStatus: { type: 'StatusList2021', statusListIndex: 42 },
termsOfUse: { type: 'IssuerPolicy', prohibition: [...] },
evidence: { type: 'DocumentVerification', verifier: 'did:example:123' }
});
```
```typescript
import { BbsSelectiveDisclosure } from 'anon-identity';
// Create privacy-preserving derived credential
const bbsDisclosure = new BbsSelectiveDisclosure();
const result = await bbsDisclosure.deriveCredential(credential, {
attributesToReveal: ['name', 'age'], // Only reveal selected attributes
nonce: 'unique-nonce'
});
```
```typescript
import { CascadingRevocationManager, CommunicationManager } from 'anon-identity';
// Inter-agent communication
const commManager = new CommunicationManager(agentIdentity, agentManager, delegationManager);
await commManager.requestDelegation(targetAgentDID, ['read:data'], { purpose: 'Data analysis' });
// Cascading revocation
const revocationManager = new CascadingRevocationManager(agentManager, chainValidator, commManager);
await revocationManager.revokeAgent({
targetAgentDID: compromisedAgent.did,
reason: 'Security breach',
cascading: true // Revoke all sub-agents
});
```
```typescript
import { JsonLdProcessor } from 'anon-identity';
// Validate and process credentials
const processor = new JsonLdProcessor();
const validation = await processor.validateCredential(credential);
const canonical = await processor.canonicalize(credential);
```
```bash
npm run build
```
```bash
npm run test
```
```bash
npm run test:watch
```
The framework is organized into four main modules:
1. **Core**: Cryptographic operations, DID management, and secure storage
2. **Identity Provider (IDP)**: Issues and signs verifiable credentials
3. **User Wallet**: Manages credentials and creates presentations
4. **Service Provider (SP)**: Verifies presentations and credentials
## Architecture Overview
### Phase 1: Core Identity Framework ✓
- DID generation and management (did:key)
- Verifiable Credential issuance and storage
- Verifiable Presentation creation and verification
- Secure encrypted key storage
### Phase 2: Basic Zero-Knowledge Proofs ✓
- Selective disclosure of credential attributes
- Privacy-preserving age verification (prove over 18 without revealing birth date)
- Cryptographic commitments for future ZKP enhancements
### Phase 3: Basic Revocation ✓
- Credential revocation by issuers
- Signed revocation lists
- Automatic revocation checking during verification
- Mock revocation registry for testing
### Phase 4: Storage Abstraction ✓
- Abstract storage interface for all identity data
- Memory storage provider (default)
- File storage provider with encryption
- Prepared for blockchain and IPFS integration
- Persistent credential and DID storage
### Phase 5: Smart Contract Infrastructure ✓
- DID Registry contract for on-chain DID management
- Revocation Registry contract for credential revocation
- Schema Registry contract for credential schemas
- Comprehensive TypeScript integration library
- 71 passing smart contract tests
- Local deployment and testing environment
## Future Enhancements
- Advanced Zero-Knowledge Proofs (Circom/SnarkJS integration)
- Support for additional DID methods (did:ethr, did:ion)
- Persistent storage backends
- Credential revocation
- Advanced credential schemas
- Homomorphic encryption for computation on encrypted data
## Demo Application
For a complete demo application with UI, see [anon-identity-demo](https://github.com/Dizzident/anon-identity-demo).
## Publishing
This package is automatically published to npm when a new release is created on GitHub.
### Setup (One-time)
1. Create an npm account at https://www.npmjs.com
2. Generate an npm access token:
- Go to https://www.npmjs.com/settings/YOUR_USERNAME/tokens
- Click "Generate New Token" → "Classic Token"
- Select "Automation" type
- Copy the token
3. Add the token to GitHub:
- Go to https://github.com/Dizzident/anon-identity/settings/secrets/actions
- Click "New repository secret"
- Name: `NPM_TOKEN`
- Value: Your npm token
### Publishing a New Version
1. Update version in package.json:
```bash
npm version patch # or minor/major
```
2. Push the tag:
```bash
git push origin main --tags
```
3. Create a GitHub release:
- Go to https://github.com/Dizzident/anon-identity/releases
- Click "Draft a new release"
- Choose the tag you just created
- Add release notes
- Click "Publish release"
4. The package will automatically be published to npm!
## Contributing
See [CONTRIBUTING.md](CONTRIBUTING.md) for details.
## License
MIT