325 lines
13 KiB
TypeScript
325 lines
13 KiB
TypeScript
import * as RustSdkCryptoJs from "@matrix-org/matrix-sdk-crypto-wasm";
|
|
import type { IEventDecryptionResult, IMegolmSessionData } from "../@types/crypto";
|
|
import type { IDeviceLists, IToDeviceEvent } from "../sync-accumulator";
|
|
import type { IEncryptedEventInfo } from "../crypto/api";
|
|
import { MatrixEvent } from "../models/event";
|
|
import { Room } from "../models/room";
|
|
import { RoomMember } from "../models/room-member";
|
|
import { CryptoBackend, OnSyncCompletedData } from "../common-crypto/CryptoBackend";
|
|
import { IHttpOpts, MatrixHttpApi } from "../http-api";
|
|
import { UserTrustLevel } from "../crypto/CrossSigning";
|
|
import { BootstrapCrossSigningOpts, CreateSecretStorageOpts, CrossSigningKey, CrossSigningStatus, CryptoCallbacks, DeviceVerificationStatus, GeneratedSecretStorageKey, ImportRoomKeysOpts, VerificationRequest } from "../crypto-api";
|
|
import { DeviceMap } from "../models/device";
|
|
import { ServerSideSecretStorage } from "../secret-storage";
|
|
import { CryptoEvent } from "../crypto";
|
|
import { TypedEventEmitter } from "../models/typed-event-emitter";
|
|
/**
|
|
* An implementation of {@link CryptoBackend} using the Rust matrix-sdk-crypto.
|
|
*
|
|
* @internal
|
|
*/
|
|
export declare class RustCrypto extends TypedEventEmitter<RustCryptoEvents, RustCryptoEventMap> implements CryptoBackend {
|
|
/** The `OlmMachine` from the underlying rust crypto sdk. */
|
|
private readonly olmMachine;
|
|
/**
|
|
* Low-level HTTP interface: used to make outgoing requests required by the rust SDK.
|
|
*
|
|
* We expect it to set the access token, etc.
|
|
*/
|
|
private readonly http;
|
|
/** The local user's User ID. */
|
|
private readonly userId;
|
|
/** Interface to server-side secret storage */
|
|
private readonly secretStorage;
|
|
/** Crypto callbacks provided by the application */
|
|
private readonly cryptoCallbacks;
|
|
globalErrorOnUnknownDevices: boolean;
|
|
private _trustCrossSignedDevices;
|
|
/** whether {@link stop} has been called */
|
|
private stopped;
|
|
/** whether {@link outgoingRequestLoop} is currently running */
|
|
private outgoingRequestLoopRunning;
|
|
/** mapping of roomId → encryptor class */
|
|
private roomEncryptors;
|
|
private eventDecryptor;
|
|
private keyClaimManager;
|
|
private outgoingRequestProcessor;
|
|
private crossSigningIdentity;
|
|
constructor(
|
|
/** The `OlmMachine` from the underlying rust crypto sdk. */
|
|
olmMachine: RustSdkCryptoJs.OlmMachine,
|
|
/**
|
|
* Low-level HTTP interface: used to make outgoing requests required by the rust SDK.
|
|
*
|
|
* We expect it to set the access token, etc.
|
|
*/
|
|
http: MatrixHttpApi<IHttpOpts & {
|
|
onlyData: true;
|
|
}>,
|
|
/** The local user's User ID. */
|
|
userId: string,
|
|
/** The local user's Device ID. */
|
|
_deviceId: string,
|
|
/** Interface to server-side secret storage */
|
|
secretStorage: ServerSideSecretStorage,
|
|
/** Crypto callbacks provided by the application */
|
|
cryptoCallbacks: CryptoCallbacks);
|
|
stop(): void;
|
|
encryptEvent(event: MatrixEvent, _room: Room): Promise<void>;
|
|
decryptEvent(event: MatrixEvent): Promise<IEventDecryptionResult>;
|
|
getEventEncryptionInfo(event: MatrixEvent): IEncryptedEventInfo;
|
|
checkUserTrust(userId: string): UserTrustLevel;
|
|
/**
|
|
* Get the cross signing information for a given user.
|
|
*
|
|
* The cross-signing API is currently UNSTABLE and may change without notice.
|
|
*
|
|
* @param userId - the user ID to get the cross-signing info for.
|
|
*
|
|
* @returns the cross signing information for the user.
|
|
*/
|
|
getStoredCrossSigningForUser(userId: string): null;
|
|
/**
|
|
* This function is unneeded for the rust-crypto.
|
|
* The cross signing key import and the device verification are done in {@link CryptoApi#bootstrapCrossSigning}
|
|
*
|
|
* The function is stub to keep the compatibility with the old crypto.
|
|
* More information: https://github.com/vector-im/element-web/issues/25648
|
|
*
|
|
*
|
|
* Implementation of {@link CryptoBackend#checkOwnCrossSigningTrust}
|
|
*/
|
|
checkOwnCrossSigningTrust(): Promise<void>;
|
|
globalBlacklistUnverifiedDevices: boolean;
|
|
/**
|
|
* Implementation of {@link CryptoApi.userHasCrossSigningKeys}.
|
|
*/
|
|
userHasCrossSigningKeys(): Promise<boolean>;
|
|
prepareToEncrypt(room: Room): void;
|
|
forceDiscardSession(roomId: string): Promise<void>;
|
|
exportRoomKeys(): Promise<IMegolmSessionData[]>;
|
|
importRoomKeys(keys: IMegolmSessionData[], opts?: ImportRoomKeysOpts): Promise<void>;
|
|
/**
|
|
* Get the device information for the given list of users.
|
|
*
|
|
* @param userIds - The users to fetch.
|
|
* @param downloadUncached - If true, download the device list for users whose device list we are not
|
|
* currently tracking. Defaults to false, in which case such users will not appear at all in the result map.
|
|
*
|
|
* @returns A map `{@link DeviceMap}`.
|
|
*/
|
|
getUserDeviceInfo(userIds: string[], downloadUncached?: boolean): Promise<DeviceMap>;
|
|
/**
|
|
* Get the device list for the given user from the olm machine
|
|
* @param userId - Rust SDK UserId
|
|
*/
|
|
private getUserDevices;
|
|
/**
|
|
* Download the given user keys by calling `/keys/query` request
|
|
* @param untrackedUsers - download keys of these users
|
|
*/
|
|
private downloadDeviceList;
|
|
/**
|
|
* Implementation of {@link CryptoApi#getTrustCrossSignedDevices}.
|
|
*/
|
|
getTrustCrossSignedDevices(): boolean;
|
|
/**
|
|
* Implementation of {@link CryptoApi#setTrustCrossSignedDevices}.
|
|
*/
|
|
setTrustCrossSignedDevices(val: boolean): void;
|
|
/**
|
|
* Implementation of {@link CryptoApi#getDeviceVerificationStatus}.
|
|
*/
|
|
getDeviceVerificationStatus(userId: string, deviceId: string): Promise<DeviceVerificationStatus | null>;
|
|
/**
|
|
* Implementation of {@link CryptoApi#isCrossSigningReady}
|
|
*/
|
|
isCrossSigningReady(): Promise<boolean>;
|
|
/**
|
|
* Implementation of {@link CryptoApi#getCrossSigningKeyId}
|
|
*/
|
|
getCrossSigningKeyId(type?: CrossSigningKey): Promise<string | null>;
|
|
/**
|
|
* Implementation of {@link CryptoApi#boostrapCrossSigning}
|
|
*/
|
|
bootstrapCrossSigning(opts: BootstrapCrossSigningOpts): Promise<void>;
|
|
/**
|
|
* Implementation of {@link CryptoApi#isSecretStorageReady}
|
|
*/
|
|
isSecretStorageReady(): Promise<boolean>;
|
|
/**
|
|
* Implementation of {@link CryptoApi#bootstrapSecretStorage}
|
|
*/
|
|
bootstrapSecretStorage({ createSecretStorageKey, setupNewSecretStorage, }?: CreateSecretStorageOpts): Promise<void>;
|
|
/**
|
|
* Add the secretStorage key to the secret storage
|
|
* - The secret storage key must have the `keyInfo` field filled
|
|
* - The secret storage key is set as the default key of the secret storage
|
|
* - Call `cryptoCallbacks.cacheSecretStorageKey` when done
|
|
*
|
|
* @param secretStorageKey - The secret storage key to add in the secret storage.
|
|
*/
|
|
private addSecretStorageKeyToSecretStorage;
|
|
/**
|
|
* Check if a secret storage AES Key is already added in secret storage
|
|
*
|
|
* @returns True if an AES key is in the secret storage
|
|
*/
|
|
private secretStorageHasAESKey;
|
|
/**
|
|
* Implementation of {@link CryptoApi#getCrossSigningStatus}
|
|
*/
|
|
getCrossSigningStatus(): Promise<CrossSigningStatus>;
|
|
/**
|
|
* Implementation of {@link CryptoApi#createRecoveryKeyFromPassphrase}
|
|
*/
|
|
createRecoveryKeyFromPassphrase(password?: string): Promise<GeneratedSecretStorageKey>;
|
|
/**
|
|
* Returns to-device verification requests that are already in progress for the given user id.
|
|
*
|
|
* Implementation of {@link CryptoApi#getVerificationRequestsToDeviceInProgress}
|
|
*
|
|
* @param userId - the ID of the user to query
|
|
*
|
|
* @returns the VerificationRequests that are in progress
|
|
*/
|
|
getVerificationRequestsToDeviceInProgress(userId: string): VerificationRequest[];
|
|
/**
|
|
* Finds a DM verification request that is already in progress for the given room id
|
|
*
|
|
* Implementation of {@link CryptoApi#findVerificationRequestDMInProgress}
|
|
*
|
|
* @param roomId - the room to use for verification
|
|
*
|
|
* @returns the VerificationRequest that is in progress, if any
|
|
*
|
|
*/
|
|
findVerificationRequestDMInProgress(roomId: string): undefined;
|
|
/**
|
|
* The verification methods we offer to the other side during an interactive verification.
|
|
*/
|
|
private _supportedVerificationMethods;
|
|
/**
|
|
* Set the verification methods we offer to the other side during an interactive verification.
|
|
*
|
|
* If `undefined`, we will offer all the methods supported by the Rust SDK.
|
|
*/
|
|
setSupportedVerificationMethods(methods: string[] | undefined): void;
|
|
/**
|
|
* Send a verification request to our other devices.
|
|
*
|
|
* If a verification is already in flight, returns it. Otherwise, initiates a new one.
|
|
*
|
|
* Implementation of {@link CryptoApi#requestOwnUserVerification}.
|
|
*
|
|
* @returns a VerificationRequest when the request has been sent to the other party.
|
|
*/
|
|
requestOwnUserVerification(): Promise<VerificationRequest>;
|
|
/**
|
|
* Request an interactive verification with the given device.
|
|
*
|
|
* If a verification is already in flight, returns it. Otherwise, initiates a new one.
|
|
*
|
|
* Implementation of {@link CryptoApi#requestDeviceVerification}.
|
|
*
|
|
* @param userId - ID of the owner of the device to verify
|
|
* @param deviceId - ID of the device to verify
|
|
*
|
|
* @returns a VerificationRequest when the request has been sent to the other party.
|
|
*/
|
|
requestDeviceVerification(userId: string, deviceId: string): Promise<VerificationRequest>;
|
|
/**
|
|
* Fetch the backup decryption key we have saved in our store.
|
|
*
|
|
* Implementation of {@link CryptoApi#getSessionBackupPrivateKey}.
|
|
*
|
|
* @returns the key, if any, or null
|
|
*/
|
|
getSessionBackupPrivateKey(): Promise<Uint8Array | null>;
|
|
/**
|
|
* Store the backup decryption key.
|
|
*
|
|
* Implementation of {@link CryptoApi#storeSessionBackupPrivateKey}.
|
|
*
|
|
* @param key - the backup decryption key
|
|
*/
|
|
storeSessionBackupPrivateKey(key: Uint8Array): Promise<void>;
|
|
/**
|
|
* Apply sync changes to the olm machine
|
|
* @param events - the received to-device messages
|
|
* @param oneTimeKeysCounts - the received one time key counts
|
|
* @param unusedFallbackKeys - the received unused fallback keys
|
|
* @param devices - the received device list updates
|
|
* @returns A list of preprocessed to-device messages.
|
|
*/
|
|
private receiveSyncChanges;
|
|
/** called by the sync loop to preprocess incoming to-device messages
|
|
*
|
|
* @param events - the received to-device messages
|
|
* @returns A list of preprocessed to-device messages.
|
|
*/
|
|
preprocessToDeviceMessages(events: IToDeviceEvent[]): Promise<IToDeviceEvent[]>;
|
|
/** called by the sync loop to process one time key counts and unused fallback keys
|
|
*
|
|
* @param oneTimeKeysCounts - the received one time key counts
|
|
* @param unusedFallbackKeys - the received unused fallback keys
|
|
*/
|
|
processKeyCounts(oneTimeKeysCounts?: Record<string, number>, unusedFallbackKeys?: string[]): Promise<void>;
|
|
/** called by the sync loop to process the notification that device lists have
|
|
* been changed.
|
|
*
|
|
* @param deviceLists - device_lists field from /sync
|
|
*/
|
|
processDeviceLists(deviceLists: IDeviceLists): Promise<void>;
|
|
/** called by the sync loop on m.room.encrypted events
|
|
*
|
|
* @param room - in which the event was received
|
|
* @param event - encryption event to be processed
|
|
*/
|
|
onCryptoEvent(room: Room, event: MatrixEvent): Promise<void>;
|
|
/** called by the sync loop after processing each sync.
|
|
*
|
|
* TODO: figure out something equivalent for sliding sync.
|
|
*
|
|
* @param syncState - information on the completed sync.
|
|
*/
|
|
onSyncCompleted(syncState: OnSyncCompletedData): void;
|
|
/**
|
|
* Handle an incoming m.key.verification request event
|
|
*
|
|
* @param sender - the sender of the event
|
|
* @param content - the content of the event
|
|
*/
|
|
private onIncomingKeyVerificationRequest;
|
|
/** called by the MatrixClient on a room membership event
|
|
*
|
|
* @param event - The matrix event which caused this event to fire.
|
|
* @param member - The member whose RoomMember.membership changed.
|
|
* @param oldMembership - The previous membership state. Null if it's a new member.
|
|
*/
|
|
onRoomMembership(event: MatrixEvent, member: RoomMember, oldMembership?: string): void;
|
|
/** Callback for OlmMachine.registerRoomKeyUpdatedCallback
|
|
*
|
|
* Called by the rust-sdk whenever there is an update to (megolm) room keys. We
|
|
* check if we have any events waiting for the given keys, and schedule them for
|
|
* a decryption retry if so.
|
|
*
|
|
* @param keys - details of the updated keys
|
|
*/
|
|
onRoomKeysUpdated(keys: RustSdkCryptoJs.RoomKeyInfo[]): Promise<void>;
|
|
private onRoomKeyUpdated;
|
|
private outgoingRequestLoop;
|
|
}
|
|
type RustCryptoEvents = CryptoEvent.VerificationRequestReceived | CryptoEvent.UserTrustStatusChanged;
|
|
type RustCryptoEventMap = {
|
|
/**
|
|
* Fires when a key verification request is received.
|
|
*/
|
|
[CryptoEvent.VerificationRequestReceived]: (request: VerificationRequest) => void;
|
|
/**
|
|
* Fires when the cross signing keys are imported during {@link CryptoApi#bootstrapCrossSigning}
|
|
*/
|
|
[CryptoEvent.UserTrustStatusChanged]: (userId: string, userTrustLevel: UserTrustLevel) => void;
|
|
};
|
|
export {};
|
|
//# sourceMappingURL=rust-crypto.d.ts.map
|