Introducing the Bloom Credential Playground
The Bloom Credential Playground is the perfect place to start learning about decentralized identity. The Credential Playground is a CLI that demonstrates each component of Bloom’s decentralized identity implementation. Using the CLI, you can initialize DIDs, issue Verifiable Credentials, encrypt credentials for storage in a user controlled Encrypted Data Vault, share credentials with a third party and verify the integrity of a shared credential.
In the CLI all data is stored in a local SQLite table. The production SDKs store account keys locally, while data is stored in a cloud-hosted Encrypted Data Vault.
DID Terms & Definitions
DID (Decentralized Identifier): A unique identifier that does not require a central registry. DIDs contain all of the information needed to identify an entity and challenge the entity to prove ownership of the identifier. Bloom uses Ethereum public/private key pair based DIDs.
VC (Verifiable Credential): An assertion about a DID that contains all of the information needed to prove its validity. Verifiable credentials are often used to connect centralized systems to the decentralized identity ecosystem. For example, a Verifiable Credential can prove a connection between a DID and a passport issued by a government.
Selective Disclosure Merkle Tree: The data structure containing Verifiable Credentials which is issued to a user. Using the Selective Disclosure Merkle Tree, client devices compute Verifiable Credentials at the time when a user wishes to share their information. Selective Disclosure Merkle Trees are more powerful than normal Verifiable Credentials because they only have to be issued once and users have granular control over exactly how much or how little information to share, all while maintaining the integrity of the proof.
Encrypted Data Vault: A service that stores encrypted personal information, keyed for individual users. The host of an encrypted data vault cannot see plaintext data. The data can only be decrypted on users' devices.
Installing the Credential Playground with Git
The Credential Playground is available on Bloom’s Github.
GitHub - hellobloom/bloom-credential-playground
First, install Node if you don't already have it.
Clone the repository and install dependencies.
git clone git@github.com:hellobloom/bloom-credential-playground.git
cd bloom-credential-playground
npm install
Run the interactive CLI. In interactive mode you can take advantage of the autocompletion and suggested argument features.
bin/ts-start.sh interactive
1. Account Creation
First, you will need to use the account
subcommand to create a local account.
bin/ts-start.sh account create --email subject@test.com --name "John Doe"
You can optionally specify the --privateKey
to use your own private key.
Create a second account to play the part of the credential issuer.
bin/ts-start.sh account create --email issuer@test.com --name "Issuer Company"
2. Credential Issuance
Now that you have two accounts, you can issue a credential from account 2 to account 1.
The sample commands in this doc use sample data from SG-Verify.
bin/ts-start.sh issuance create --type ndi --subjectId "subject@test.com" --issuerId "issuer@test.com"
In this example, credentials are extracted from the raw data in src/issuers/default/ndi.ts
and formatted into the Selective Disclosure Merkle Tree format. This format gets stored on the client. Users can compute Verifiable Credentials and Verifiable Presentations when they wish to share the data with a third party.
Specifying a Source File
You can specify raw data from a file path by including the src
field.
bin/ts-start.sh issuance create --type ndi --subjectId "subject@test.com" --issuerId "issuer@test.com" --src "src/issuers/default/ndi-sample.json"
Encrypting the Credential Components
The Selective Disclosure Merkle Tree object is encrypted and stored with the subject. In order to test this, include the --encrypt
flag to encrypt the credential components for the subject using their AES key.
bin/ts-start.sh issuance create --type ndi --subjectId "subject@test.com" --issuerId "issuer@test.com" --encrypt
Inspect the encrypted cyphertext with the inspect
command.
bin/ts-start.sh issuance inspect --id 1 --cyphertext
Decrypt the cyphertext with the --decrypt
flag.
bin/ts-start.sh issuance inspect --id 1 --decrypt
3. Sharing
Verifiable Credentials are computed based on the Selective Disclosure Merkle Tree at the time that a subject chooses to share data with a third party. You can preview what a Verifiable Credential looks like using the share preview
command.
bin/ts-start.sh share preview --id 1 --type income
This command prints the formatted credential, computed from the Selective Disclosure Merkle Tree.
Next, you can format credentials into a Verifiable Presentation for sharing.
bin/ts-start.sh share share --id 1 --type income
Share Kit enables you to request credentials from Bloom users. You can share credentials directly from the CLI with a deployed Share Kit service. Integrate with share-kit request data JSON. In this example we are sending data to the Bloom Starter demo app.
bin/ts-start.sh share share --id 1 --r JSON_COPIED_WHEN_CLICKING_QR
4. Validation
Verify Kit provides utilities to verify the integrity of the shared Verifiable Presentation and perform all of the embedded proofs. The CLI imports Verify Kit and makes it available with the verify
command.
bin/ts-start.sh verify verify --id 1
Run the above command with the verbose flag to see each verification logged.
bin/ts-start.sh verify verify --id 1 --verbose
✔ Presentation context is present
✔ Presentation type is correct
✔ Credential ID is present
✔ Credential type is valid option
✔ Issuer is valid address format
✔ Issuance date is valid RFC3339 format
✔ Subject is valid address format
✔ Credential data is present
✔ Authorization array is valid or omitted
✔ Credential subject passed validation
✔ Type string is present
✔ Created timestamp is valid RFC3339 format
✔ Creator is valid address format
✔ Valid data node version: batch
✔ Valid batch layer 2 hash format
✔ Valid batch attestation signature format
✔ Valid batch attestation signature
✔ Valid subject signature format
✔ Valid request nonce format
✔ Valid layer 2 hash format
✔ Valid root hash format
✔ Valid root hash nonce format
✔ Valid merkle proof position
✔ Valid merkle leaf data format
✔ Valid merkle proof position
✔ Valid merkle leaf data format
✔ Valid merkle proof position
✔ Valid merkle leaf data format
✔ Valid merkle proof position
✔ Valid merkle leaf data format
✔ Valid Merkle proof array
✔ Valid network stage
✔ Valid data node
✔ Valid attester address format
✔ Valid subject address format
✔ Verified data passed validation
✔ Merkle proof passed validation
✔ Credential proof passed validation
✔ Credential proof subject matches embedded subject
✔ Validated array of Verifiable Credentials
✔ Presentation type is present
✔ Presentation creaded date is valid RFC3339 format
✔ Creator is valid address format
✔ Nonce is present
✔ Domain is present
✔ Credential hash is valid format
✔ Validated presentation proof
✔ Embedded credential hash matches the computed credential hash
✔ Signature digest matches the computed credential hash
✔ Signature string is formatted correctly
✔ Signature matches the proof creator
✔ Token matches the proof nonce
Verified data of type income from subject 0xd0d45aac45bf6d33b0f6d7544522866d929f3125
Verified data: {"data":{"lastupdated":"2019-09-17","high":{"value":4999},"source":"2","classification":"C","low":{"value":4000}}}
Completed verification
Encrypted Data Storage
When you create an account, an AES encryption key is automatically generated. If you generated an account before this feature was available, you can either generate a new account or add an encryption key to an existing account.
bin/ts-start.sh account updateKey --account subject@bloom.co --type Encryption
Share Kit Integration
The CLI can communicate with any deployed Bloom Share Kit instance. In order to POST the signed Verifiable Presentation to a destination, specify the requestData
field in the share
command. The snippet below uses the JSON retrieved from a Share Kit QR code on https://bloom-starter-ndi.herokuapp.com.
bin/ts-start.sh share share --id 15 --requestData {"action":"request_attestation_data","token":"9a70cc32-dc86-471e-9b4a-1489e5064eaa","url":"https://bloom-starter-ndi.herokuapp.com/scan?share-kit-from=qr","org_logo_url":"https://bloom.co/favicon.png","org_name":"Bloom Starter","org_usage_policy_url":"https://bloom.co/legal/terms","org_privacy_policy_url":"https://bloom.co/legal/privacy","types":["email","full-name","address","phone","income"]}
Command Replay
The CLI also has the ability to replay recent commands while in interactive mode.
Extending the playground
It should be easy to add additional issuer types to the demo. See how it is done in src/issuers/ndi.ts
and src/issuers/base.ts > loadData, getClaimNodes
.
What's next for Bloom?
The Bloom Credential Playground demonstrates the power of the Bloom Protocol. The same technology is at the core of our consumer applications as well as our enterprise SDKs.
Download the Bloom App for Android or iOS to secure your identity and take back control of your data.
Get in touch with us to learn how to integrate our SDKs to reduce fraud in your app's signup process and enhance your users' data privacy. Bloom is fully compliant with GDPR, LGPD, and CCPA. Reach out to us at team@bloom.co for more information.
We're hiring!
We have opportunities for developers who want to become an expert in multiple rapidly growing fields, including DeFi, data privacy and fintech. All developers are remote and can work from anywhere. Our team meets throughout the year at off-sites, conferences, client meetings and weekly Zoom calls.
Check out our job postings here: https://angel.co/company/bloom-protocol/jobs