did-jwt
Version:
Library for Signing and Verifying JWTs that use DIDs as issuers and JWEs that use DIDs as recipients
149 lines • 4.41 kB
TypeScript
import { JsonWebKey } from '../util.js';
/**
* A wrapper around `mySecretKey` that can compute a shared secret using `theirPublicKey`.
* The promise should resolve to a `Uint8Array` containing the raw shared secret.
*
* This method is meant to be used when direct access to a secret key is impossible or not desired.
*
* @param theirPublicKey `Uint8Array` the other party's public key
* @returns a `Promise` that resolves to a `Uint8Array` representing the computed shared secret
*/
export type ECDH = (theirPublicKey: Uint8Array) => Promise<Uint8Array>;
export type ProtectedHeader = Record<string, any> & Partial<RecipientHeader>;
/**
* The JWK representation of an ephemeral public key.
* See https://www.rfc-editor.org/rfc/rfc7518.html#section-6
*/
export interface EphemeralPublicKey {
kty?: string;
crv?: string;
x?: string;
y?: string;
n?: string;
e?: string;
}
/**
* A pair of an ephemeral public key (JWK) and its corresponding secret key.
* This is used to encrypt content encryption key (cek) for a recipient.
*
* @see {@link KekCreator}
*/
export interface EphemeralKeyPair {
publicKeyJWK: EphemeralPublicKey;
secretKey: Uint8Array;
}
export interface RecipientHeader {
alg?: string;
iv?: string;
tag?: string;
epk?: EphemeralPublicKey;
kid?: string;
apv?: string;
apu?: string;
}
export interface Recipient {
header: RecipientHeader;
encrypted_key: string;
}
export interface JWE {
protected: string;
iv: string;
ciphertext: string;
tag: string;
aad?: string;
recipients?: Recipient[];
}
export interface EncryptionResult {
ciphertext: Uint8Array;
tag?: Uint8Array;
iv?: Uint8Array;
protectedHeader?: string;
recipient?: Recipient;
cek?: Uint8Array;
}
export interface WrappingResult {
ciphertext: Uint8Array;
tag?: Uint8Array;
iv?: Uint8Array;
}
/**
* An object that can perform content encryption and optionally key wrapping and key generation.
*/
export interface Encrypter {
alg: string;
enc: string;
encrypt: (cleartext: Uint8Array, protectedHeader: ProtectedHeader, aad?: Uint8Array, ephemeralKeyPair?: EphemeralKeyPair) => Promise<EncryptionResult>;
encryptCek?: (cek: Uint8Array, ephemeralKeyPair?: EphemeralKeyPair) => Promise<Recipient>;
genEpk?: () => EphemeralKeyPair;
}
/**
* An object that can perform decryption of a ciphertext.
* It also describes the content encryption (enc) and key agreement + wrapping (alg) algorithms it supports.
*/
export interface Decrypter {
alg: string;
enc: string;
decrypt: (sealed: Uint8Array, iv: Uint8Array, aad?: Uint8Array, recipient?: Recipient) => Promise<Uint8Array | null>;
}
/**
* An object that can perform key unwrapping.
*/
export type KeyWrapper = {
/**
* Create a key wrapper from a key encryption key (kek).
* @param kek
*/
from: (kek: Uint8Array) => {
wrap: (cek: Uint8Array, options?: any) => Promise<WrappingResult>;
};
alg: 'A256KW' | 'XC20PKW' | string;
};
export type KekCreator = {
createKek(recipientPublicKey: Uint8Array, senderSecret: Uint8Array | ECDH | undefined, alg: string, apu: string | undefined, apv: string | undefined, ephemeralKeyPair: EphemeralKeyPair | undefined): Promise<{
epk: JsonWebKey;
kek: Uint8Array;
}>;
alg: 'ECDH-ES' | 'ECDH-1PU' | string;
};
export type ContentEncrypter = {
/**
* Create a content `Encrypter` from a content encryption key (cek).
* @param cek
*/
from(cek: Uint8Array): Encrypter;
enc: 'XC20P' | 'A256GCM' | 'A256CBC-HS512' | string;
};
/**
* Extra parameters for JWE using authenticated encryption
*/
export type AuthEncryptParams = {
/**
* recipient key ID
*/
kid?: string;
/**
* See {@link https://datatracker.ietf.org/doc/html/rfc7518#section-4.6.1.2}
* base64url encoded
*/
apu?: string;
/**
* See {@link https://datatracker.ietf.org/doc/html/rfc7518#section-4.6.1.3}
* base64url encoded
*/
apv?: string;
};
/**
* Extra parameters for JWE using anonymous encryption
*/
export type AnonEncryptParams = {
/**
* recipient key ID
*/
kid?: string;
/**
* See {@link https://datatracker.ietf.org/doc/html/rfc7518#section-4.6.1.3}
* base64url encoded
*/
apv?: string;
};
//# sourceMappingURL=types.d.ts.map