SD-JWT Library

An implementation of the SD-JWT specification for selective disclosure when sharing data.

The SD-JWT for Dart package provides libraries and tools to enable selective disclosure, enhancing security and privacy in the data-sharing process. It implements the IETF’s Selective Disclosure for JWTs (SD-JWT) specification.

The SD-JWT for Dart package enables:

  • Issuer to create JWTs with selectively disclosable claims.
  • Holder to present only specific claims to verifiers.
  • Verifier to validate the authenticity of the presented claims.
  • Key binding to prevent unauthorized presentations.

Core Concepts

SD-JWT introduces several key concepts:

  • Selective Disclosure: Claims can be selectively disclosed based on need
  • Cryptographic Binding: Claims are cryptographically bound to the JWT
  • Key Binding: Ensures only the intended holder can present the SD-JWT
  • Disclosures: Individual pieces of information that can be selectively shared

Supported Algorithms

The package supports the following signing algorithms:

  • ES256 - ECDSA using P-256 curve and SHA-256
  • ES256K - ECDSA using secp256k1 curve and SHA-256
  • RS256 - RSASSA-PKCS1-v1_5 using SHA-256
  • HS256 - HMAC using SHA-256
  • EdDSA (Ed25519) - Edwards-curve Digital Signature Algorithm using Ed25519
  • Additional algorithms: RS384, RS512, ES384, ES512, HS384, and HS512

For hash calculation in disclosures:

  • SHA-256 (default)
  • SHA-384
  • SHA-512

You can create your custom signer, hasher, and verifier to extend support for other algorithms. Refer to this example on how to do this.

Get Started

Prerequisite

  • Dart SDK version ^3.6.0

Installation

Run:

dart pub add selective_disclosure_jwt

or manually, add the package into your pubspec.yaml file:

dependencies: selective_disclosure_jwt: ^<version_number>

and then run the command below to install the package:

dart pub get

Sample Usage

After successfully installing the package, import it into your Dart code.

import 'package:selective_disclosure_jwt/selective_disclosure_jwt.dart'; void main() async { // Always generate and use your own secure keys for real-world use. final issuerPrivateKey = SdPrivateKey(""" ... """, SdJwtSignAlgorithm.es256k); final issuerPublicKey = SdPublicKey(""" ... """, SdJwtSignAlgorithm.es256k); // 1. Create SD-JWT with selective disclosures final SdJwtHandlerV1 handler = SdJwtHandlerV1(); final Map<String, String> claims = { 'given_name': 'Alice', 'family_name': 'Smith', 'email': 'alice@example.com', }; // Specify which claims should be selectively disclosable final disclosureFrame = { '_sd': ['given_name', 'email'], }; // Sign the claims to produce the SD-JWT final SdJwt sdJwt = await handler.sign( claims: claims, disclosureFrame: disclosureFrame, signer: SDKeySigner(issuerPrivateKey), ); print('SD-JWT: ${sdJwt.serialized}'); // 2. Decode and verify the SD-JWT final SdJwt verified = handler.decodeAndVerify( sdJwtToken: sdJwt.serialized, verifier: SDKeyVerifier(issuerPublicKey), ); print('Verified claims: ${verified.claims}'); // Output: {family_name: Smith, given_name: Alice, email: alice@example.com} }

For more examples, go to the example folder.

API Reference

For the available operations, go to the API reference page.