2key-ratchet
Version:
2key-ratchet is an implementation of a Double Ratchet protocol and X3DH in TypeScript utilizing WebCrypto.
90 lines (89 loc) • 2.54 kB
TypeScript
/**
*
* 2key-ratchet
* Copyright (c) 2016 Peculiar Ventures, Inc
* Based on https://whispersystems.org/docs/specifications/doubleratchet/ and
* https://whispersystems.org/docs/specifications/x3dh/ by Open Whisper Systems
*
*/
import { HMACCryptoKey, ISymmetricKDFResult } from "./type";
import { IJsonSerializable } from "./type";
/**
* Encrypt/Decrypt result for Symmetric ratchets
*
* @export
* @interface CipherMessage
*/
export interface ICipherMessage {
/**
* Encrypted or decrypted message
*/
cipherText: ArrayBuffer;
/**
* HMAC key for SignedMessage calculations
*/
hmacKey: CryptoKey;
}
export interface IJsonSymmetricRatchet {
counter: number;
rootKey: CryptoKey;
}
export declare abstract class SymmetricRatchet implements IJsonSerializable {
static fromJSON<T extends SymmetricRatchet>(this: new (rootKey: CryptoKey) => T, obj: IJsonSymmetricRatchet): Promise<T>;
counter: number;
/**
* Current symmetric ratchet key
*/
rootKey: HMACCryptoKey;
constructor(rootKey: CryptoKey);
toJSON(): Promise<IJsonSymmetricRatchet>;
fromJSON(obj: IJsonSymmetricRatchet): Promise<void>;
/**
* calculates new keys by rootKey KDF_CK(ck)
* https://whispersystems.org/docs/specifications/doubleratchet/#external-functions
*
* @protected
* @param {CryptoKey} rootKey
* @returns
*
* @memberOf SymmetricRatchet
*/
protected calculateKey(rootKey: CryptoKey): Promise<ISymmetricKDFResult>;
/**
* Move to next step of ratchet
*
* @protected
* @returns
*
* @memberOf SymmetricRatchet
*/
protected click(): Promise<ArrayBuffer>;
}
/**
* Implementation of Sending chain
*
* @export
* @class SendingRatchet
* @extends {SymmetricRatchet}
*/
export declare class SendingRatchet extends SymmetricRatchet {
/**
* Encrypts message
*
* @param {ArrayBuffer} message
* @returns CipherMessage type
*
* @memberOf SendingRatchet
*/
encrypt(message: ArrayBuffer): Promise<ICipherMessage>;
}
export interface IJsonReceivingRatchet extends IJsonSymmetricRatchet {
keys: ArrayBuffer[];
}
export declare class ReceivingRatchet extends SymmetricRatchet {
protected keys: ArrayBuffer[];
toJSON(): Promise<IJsonReceivingRatchet>;
fromJSON(obj: IJsonReceivingRatchet): Promise<void>;
decrypt(message: ArrayBuffer, counter: number): Promise<ICipherMessage>;
protected getKey(counter: number): Promise<ArrayBuffer>;
}