@dwn-protocol/id-sdk
Version:
SDK for accessing the features and capabilities
442 lines (385 loc) • 12.9 kB
text/typescript
import type { IDCrypto } from '../../crypto/index.js';
import type { RequireOnly } from '../../common/index.js';
import { IDManagedAgent } from './agent.js';
export interface CryptoManager {
agent: IDManagedAgent;
decrypt(options: DecryptOptions): Promise<Uint8Array>;
deriveBits(options: DeriveBitsOptions): Promise<Uint8Array>;
encrypt(options: EncryptOptions): Promise<Uint8Array>;
/**
* Generate a new ManagedKey within a CryptoManager implementation.
*/
generateKey<T extends GenerateKeyOptionTypes>(options: GenerateKeyOptions<T>): Promise<GenerateKeyType<T>>;
/**
* Retrieves detailed information about a ManagedKey or ManagedKeyPair object.
*
* @param options - The options for retrieving the key.
* @param options.keyRef - The reference identifier for the key. Can specify the id or alias property of the key.
* @returns A promise that resolves to either a ManagedKey or ManagedKeyPair object.
*/
getKey(options: { keyRef: string }): Promise<ManagedKey | ManagedKeyPair | undefined>;
importKey(options: PortableKeyPair): Promise<ManagedKeyPair>;
importKey(options: PortableKey): Promise<ManagedKey>;
importKey(options: ImportKeyOptions): Promise<ManagedKey | ManagedKeyPair>;
sign(options: SignOptions): Promise<Uint8Array>;
updateKey(options: UpdateKeyOptions): Promise<boolean>;
verify(options: VerifyOptions): Promise<boolean>;
}
/**
* Input arguments for implementations of the CryptoManager interface
* {@link CryptoManager.encrypt | encrypt} method.
*
* @public
*/
export type DecryptOptions = {
/**
* An object defining the cipher algorithm to use and its parameters.
*/
algorithm: IDCrypto.AlgorithmIdentifier | IDCrypto.AesCtrOptions | IDCrypto.AesGcmOptions;
/**
* A Uint8Array object containing the data to be decrypted
* (also known as the ciphertext).
*/
data: Uint8Array;
/**
* An identifier of the ManagedKey to be used for decryption.
* You can use the id or alias property of the key.
*/
keyRef: string;
}
/**
* Input arguments for implementations of the CryptoManager interface
* {@link CryptoManager.deriveBits | deriveBits} method.
*
* @public
*/
export type DeriveBitsOptions = {
/**
* An object defining the derivation algorithm to use and its parameters.
*/
// algorithm: IDCrypto.AlgorithmIdentifier | IDCrypto.EcdhDeriveKeyOptions;
algorithm: IDCrypto.AlgorithmIdentifier | IDCrypto.EcdhDeriveKeyOptions | IDCrypto.Pbkdf2Options;
/**
* An identifier of the ManagedKey that will be the input to the
* derivation algorithm.
*
* If the algorithm is ECDH, this identifier will refer to an ECDH key pair.
* For PBKDF2, it might be a password.
* For HDKF, it might be the shared secret output of an ECDH key agreement operation.
*/
baseKeyRef: string;
/**
* A number representing the number of bits to derive. To be compatible with
* all browsers, the number should be a multiple of 8.
*/
length?: number;
}
/**
* Input arguments for implementations of the CryptoManager interface
* {@link CryptoManager.encrypt | encrypt} method.
*
* @public
*/
export type EncryptOptions = {
/**
* An object defining the cipher algorithm to use and its parameters.
*/
algorithm: IDCrypto.AlgorithmIdentifier | IDCrypto.AesCtrOptions | IDCrypto.AesGcmOptions;
/**
* An Uint8Array object containing the data to be encrypted
* (also known as the plaintext).
*/
data: Uint8Array;
/**
* An identifier of the ManagedKey to be used for encryption.
* You can use the id or alias property of the key.
*/
keyRef: string;
}
export type GenerateKeyOptions<T extends GenerateKeyOptionTypes> = {
algorithm: T;
alias?: string;
extractable?: boolean;
keyUsages: IDCrypto.KeyUsage[];
metadata?: KeyMetadata;
};
export type GenerateKeyOptionTypes =
| IDCrypto.AlgorithmIdentifier
// | RsaHashedGenerateKeyOptions
| IDCrypto.AesGenerateKeyOptions
| IDCrypto.EcdsaGenerateKeyOptions
| IDCrypto.EdDsaGenerateKeyOptions
// | HmacGenerateKeyOptions
// | Pbkdf2Params;
export type GenerateKeyType<T> = T extends IDCrypto.EcGenerateKeyOptions ? ManagedKeyPair :
T extends IDCrypto.AesGenerateKeyOptions /*| HmacGenerateKeyOptions | Pbkdf2Params*/ ? ManagedKey :
T extends IDCrypto.AlgorithmIdentifier ? ManagedKey | ManagedKeyPair :
never;
export type PortableKey =
RequireOnly<
ManagedKey,
'algorithm' | 'extractable' | 'type' | 'usages',
'id' | 'material' | 'state'
>
& { material: Uint8Array; };
export interface PortableKeyPair {
privateKey: PortableKey;
publicKey: PortableKey;
}
export type ImportKeyOptions =
| PortableKey
| PortableKeyPair
/**
* Base interface to be implemented by key management systems.
*/
export type KeyManagementSystem = CryptoManager;
/**
* KeyMetadata
*
* Implementations of KeyManagementSystem can populate this object with KMS platform
* specific data about each key.
*
* This property can also be used to add various tags to the keys under management.
*/
export type KeyMetadata = {
/**
* Additional properties of any type.
*/
[key: string]: any;
}
/**
* KeyState
*
* The read-only `state` property of the `ManagedKey` interface indicates the
* status of the ManagedKey.
*
* It can have the following string values:
*
* "Enabled": The key is ready for use.
*
* "Disabled": The key may not be used, but the key material is still available,
* and the key can be placed back into the Enabled state.
*
* "PendingCreation": The key is still being created. It may not be used,
* enabled, disabled, or destroyed yet. The KMS will
* automatically change the state to enabled as soon
* as the key is ready.
*
* "PendingDeletion": The key is scheduled for deletion. It can be placed back
* into the Disabled state up until the time of deletion
* using the CancelKeyDeletion() method. Once the key has
* been deleted, any ciphertext encrypted with this key
* is no longer recoverable. Minimum and maximum waiting
* periods are defined by each KMS implementation.
*
* "PendingImport": The key is still being imported. It may not be used, enabled,
* disabled, or deleted yet. The KMS will automatically change
* the state to Enabled once the key is ready.
*
* "PendingUpdate": The key is still being updated. It may not be used, enabled,
* disabled, or deleted until the update process completes.
* The KMS will automatically change the state to Enabled
* once the key is ready.
*/
export type KeyState = 'Enabled' | 'Disabled' | 'PendingCreation' | 'PendingDeletion' | 'PendingImport' | 'PendingUpdate';
/**
* ManagedKey
*
* A ManagedKey represents a cryptographic key used by a cipher for
* encryption or decryption or an algorithm for signing or verification.
*/
export interface ManagedKey {
/**
* A unique identifier for the Key, autogenerated by a KMS.
*/
id: string;
/**
* An object detailing the algorithm for which the key can be used along
* with additional algorithm-specific parameters.
*/
// algorithm: IDCrypto.GenerateKeyOptions;
algorithm: IDCrypto.KeyAlgorithm | IDCrypto.GenerateKeyOptions;
/**
* An alternate identifier used to identify the key in a KMS.
* This property can be used to associate a DID document key ID with a ManagedKey.
*/
alias?: string;
/**
* A boolean value that is `true` if the key can be exported and `false` if not.
*/
extractable: boolean;
/**
* Name of a registered key management system.
*/
kms: string;
/**
* Key material as a raw binary data buffer.
*/
material?: Uint8Array;
/**
* Optional. Additional Key metadata.
*/
metadata?: KeyMetadata;
/**
* A registered string value specifying the algorithm and any algorithm
* specific parameters.
* Supported algorithms vary by KMS.
*/
spec?: string;
/**
* The current status of the ManagedKey.
*/
state: KeyState;
/**
* The type of key.
*/
type: IDCrypto.KeyType;
/**
* Indicates which cryptographic operations are permissible to be used with this key.
*/
usages: IDCrypto.KeyUsage[];
}
/**
* Represents information about a managed key.
* Private or secret key material is NOT present.
*
*/
export type ManagedKeyInfo = Omit<ManagedKey, 'material'>;
export type ManagedKeyOptions = Omit<ManagedKey, 'toJwk'>
/** ManagedKeyPair
*
* A ManagedKeyPair represents a key pair for an asymmetric cryptography algorithm,
* also known as a public-key algorithm.
*
* A ManagedKeyPair object can be obtained using `generateKey()`, when the
* selected algorithm is one of the asymmetric algorithms: ECDSA or ECDH.
*/
export interface ManagedKeyPair {
/**
* A ManagedKey object representing the private key. For encryption and
* decryption algorithms, this key is used to decrypt. For signing and
* verification algorithms it is used to sign.
*/
privateKey: ManagedKey;
/**
* A ManagedKey object representing the public key. For encryption and
* decryption algorithms, this key is used to encrypt. For signing and
* verification algorithms it is used to verify signatures.
*/
publicKey: ManagedKey;
}
/**
* ManagedKeyStore
*
* This interface should be implemented to provide platform specific
* implementations that are usable by KeyManager and implementations
* of KeyManagementSystem.
*
* Implementations of this class can be used to store:
* ManagedKey and ManagedKeyPair
* or:
* ManagedPrivateKey
* objects.
*
* @public
*/
export interface ManagedKeyStore<K, V> {
deleteKey(options: { id: K, agent?: IDManagedAgent, context?: string }): Promise<boolean>
findKey(options: { id: K, agent?: IDManagedAgent, context?: string }): Promise<V | undefined>;
findKey(options: { alias: K, agent?: IDManagedAgent, context?: string }): Promise<V | undefined>;
getKey(options: { id: K, agent?: IDManagedAgent, context?: string }): Promise<V | undefined>
importKey(options: { key: Omit<V, 'id'>, agent?: IDManagedAgent, context?: string }): Promise<K>
listKeys(options?: { agent?: IDManagedAgent, context?: string }): Promise<V[]>
updateKey(options: { id: K, agent?: IDManagedAgent, context?: string } & Partial<V>): Promise<boolean>
}
/**
* Represents a private key.
*
* The `alias` is used to refer to the key material which is stored as the hex encoding of the raw byte array
* (`privateKeyHex`).
*
* The `type` refers to the type of key that is represented.
*
* @public
*/
export interface ManagedPrivateKey {
/**
* A unique identifier for the Key, autogenerated by a KMS.
*/
id: string
/**
* Key material as raw binary data.
*/
material: Uint8Array;
/**
* The type of key.
*/
type: IDCrypto.PrivateKeyType;
}
/**
* Input arguments for implementations of the CryptoManager interface {@link CryptoManager.sign | sign} method.
*
* @public
*/
export type SignOptions = {
/**
* An object that specifies the signature algorithm to use and its parameters.
*/
algorithm: IDCrypto.AlgorithmIdentifier | IDCrypto.EcdsaOptions | IDCrypto.EdDsaOptions;
/**
* An Uint8Array object containing the data to be signed.
*/
data: Uint8Array;
/**
* An identifier of the ManagedKey to sign with.
* You can use the id or alias property of the key.
*/
keyRef: string;
}
/**
* Input arguments for implementations of the CryptoManager interface
* {@link CryptoManager.updateKey | updateKey} method.
*
* @public
*/
export type UpdateKeyOptions = {
/**
* An alternate identifier used to identify the key in a KMS.
* This property can be used to associate a DID document key ID with a ManagedKey.
*/
alias?: string;
/**
* An identifier of the ManagedKey to be used for decryption.
* You can use the id or alias property of the key.
*/
keyRef: string;
/**
* Optional. Additional Key metadata.
*/
metadata?: KeyMetadata;
}
/**
* Input arguments for implementations of the CryptoManager interface
* {@link CryptoManager.verify | verify} method.
*
* @public
*/
export type VerifyOptions = {
/**
* An object that specifies the algorithm to use and its parameters.
*/
algorithm: IDCrypto.AlgorithmIdentifier | IDCrypto.EcdsaOptions | IDCrypto.EdDsaOptions;
/**
* An Uint8Array object containing the data whose signature is to be verified.
*/
data: Uint8Array;
/**
* An identifier of the ManagedKey to sign with.
* You can use the id or alias property of the key.
*/
keyRef: string;
/**
* A Uint8Array containing the signature to verify.
*/
signature: Uint8Array;
}