UNPKG

proteus-hd

Version:

Signal Protocol (with header encryption) implementation for JavaScript. Based on Proteus.js.

404 lines (320 loc) 13.2 kB
import * as CBOR from 'wire-webapp-cbor'; export declare module derived { class CipherKey { constructor(); key: Uint8Array; static decode(d: CBOR.Decoder): derived.CipherKey; decrypt(ciphertext: Uint8Array, nonce: Uint8Array): Uint8Array; encode(e: CBOR.Encoder): CBOR.Encoder; encrypt(plaintext: ArrayBuffer|string|Uint8Array, nonce: Uint8Array): Uint8Array; static new(key: Uint8Array): derived.MacKey; } interface InitialDerivedSecrets extends derived.DerivedSecrets { head_key: derived.HeadKey; } class DerivedSecrets { constructor(); cipher_key: derived.CipherKey; mac_key: derived.MacKey; next_head_key: derived.HeadKey; static kdf(input: Array<number>, salt: Uint8Array, info: string): derived.DerivedSecrets; static kdf_init(input: Array<number>, salt: Uint8Array, info: string): derived.InitialDerivedSecrets; static kdf_without_salt(input: Array<number>, info: string): derived.InitialDerivedSecrets; } class HeadKey { constructor(); key: Uint8Array; static decode(d: CBOR.Decoder): derived.HeadKey; decrypt(encrypted_header: Uint8Array, nonce: Uint8Array): Uint8Array; encode(e: CBOR.Encoder): CBOR.Encoder; encrypt(header: ArrayBuffer, nonce: Uint8Array): Uint8Array; static index_as_nonce(idx: number): Uint8Array; static new(key: Uint8Array): derived.HeadKey; } class MacKey { constructor(); key: Uint8Array; static decode(d: CBOR.Decoder): derived.MacKey; encode(e: CBOR.Encoder): CBOR.Encoder; static new(key: Uint8Array): derived.MacKey; sign(msg: string|Uint8Array): Uint8Array; verify(signature: Uint8Array, msg: Uint8Array): boolean; } } export declare module errors { class DecodeError extends ProteusError { constructor(message?: string, code?: string); code: string; message: string; } class DecryptError extends ProteusError { constructor(message?: string, code?: string); code: string; message: string; } class DontCallConstructor extends ProteusError { constructor(message?: string, code?: string); code: string; message: string; } class HeaderDecryptionFailed extends DecryptError { constructor(message?: string, code?: string); code: string; message: string; } class InputError extends ProteusError { constructor(message?: string, code?: string); code: string; message: string; } class InvalidHeader extends DecryptError { constructor(message?: string, code?: string); code: string; message: string; } class ProteusError extends Error { constructor(message?: string, code?: string); code: string; message: string; } } export declare module keys { class IdentityKey { constructor(); public_key: keys.PublicKey; static decode(d: CBOR.Decoder): keys.IdentityKey; encode(e: CBOR.Encoder): CBOR.Encoder; fingerprint(): string; static new(public_key: keys.PublicKey): keys.IdentityKey; toString(): string; } class IdentityKeyPair { constructor(); public_key: keys.IdentityKey; secret_key: keys.SecretKey; version: number; static decode(d: CBOR.Decoder): keys.IdentityKeyPair; static deserialise(buf: ArrayBuffer): keys.IdentityKeyPair; encode(e: CBOR.Encoder): CBOR.Encoder; static new(): keys.IdentityKeyPair; serialise(): ArrayBuffer; } class KeyPair { constructor(); secret_key: keys.SecretKey; public_key: keys.PublicKey; private _construct_private_key(ed25519_key_pair: Object): keys.SecretKey; private _construct_public_key(ed25519_key_pair: Object): keys.PublicKey; static decode(d: CBOR.Decoder): keys.KeyPair; encode(e: CBOR.Encoder): CBOR.Encoder; static new(): keys.KeyPair; } class PreKey { constructor(); key_id: number; key_pair: keys.KeyPair; static MAX_PREKEY_ID: number; version: number; static decode(d: CBOR.Decoder): keys.PreKey; static deserialise(buf: ArrayBuffer): keys.PreKey; encode(e: CBOR.Encoder): CBOR.Encoder; static generate_prekeys(start: number, size: number): Array<keys.PreKey>; static last_resort(): keys.PreKey; static new(pre_key_id: number): keys.PreKey; serialise(): ArrayBuffer; } type PreKeyAuth = 'Invalid' | 'Unknown' | 'Valid'; class PreKeyBundle { constructor(); identity_key: keys.IdentityKey; prekey_id: number; public_key: keys.PublicKey; signature: Uint8Array; version: number; static decode(d: CBOR.Decoder): keys.PreKeyBundle; static deserialise(buf: ArrayBuffer): keys.PreKeyBundle; encode(e: CBOR.Encoder): CBOR.Encoder; static new(identity_key: keys.IdentityKey, prekey: keys.PreKey): keys.PreKeyBundle; serialise(): ArrayBuffer; serialised_json(): {id: number, key: string}; static signed(identity_key: keys.IdentityKeyPair, prekey: keys.PreKey): keys.PreKeyBundle; verify(): keys.PreKeyAuth; } class PublicKey { constructor(); pub_curve: Uint8Array; pub_edward: Uint8Array; static decode(d: CBOR.Decoder): keys.PublicKey; encode(e: CBOR.Encoder): CBOR.Encoder; fingerprint(): string; static new(pub_edward: Uint8Array, pub_curve: Uint8Array): keys.PublicKey; verify(signature: Uint8Array, message: string): boolean; } class SecretKey { constructor(); sec_curve: Uint8Array; sec_edward: Uint8Array; static decode(d: CBOR.Decoder): keys.SecretKey; encode(e: CBOR.Encoder): CBOR.Encoder; shared_secret(public_key: keys.PublicKey): Uint8Array; sign(message: string): Uint8Array; static new(pub_edward: Uint8Array, pub_curve: Uint8Array): keys.SecretKey; } } export declare module message { class Envelope { constructor(); _message_enc: Uint8Array; mac: Uint8Array; message: message.Message; version: number; static decode(d: CBOR.Decoder): message.Envelope; static deserialise(buf: ArrayBuffer): message.Envelope; encode(e: CBOR.Encoder): CBOR.Encoder; static new(mac_key: derived.MacKey, message: message.Message): message.Envelope; serialise(): ArrayBuffer; verify(mac: derived.MacKey): boolean; } class Header { constructor(); couter: number; prev_counter: number; ratchet_key: keys.PublicKey static decode(d: CBOR.Decoder): message.Header; static deserialise(buf: ArrayBuffer): message.Header; encode(e: CBOR.Encoder): CBOR.Encoder; static new(counter: number, prev_counter: number, ratchet_key: keys.PublicKey): message.Header; serialise(): ArrayBuffer; } class Message { constructor(); static deserialise(buf: ArrayBuffer): message.Message; serialise(): ArrayBuffer; } class HeaderMessage { constructor(); cipher_text: Uint8Array; header: Uint8Array; static decode(d: CBOR.Decoder): message.HeaderMessage; encode(e: CBOR.Encoder): CBOR.Encoder; static new(encrypted_header: Uint8Array, cipher_text: Uint8Array): message.HeaderMessage; } class PreKeyMessage { constructor(); base_key: keys.PublicKey; identity_key: keys.IdentityKey; message: message.HeaderMessage; prekey_id: number; static decode(d: CBOR.Decoder): message.PreKeyMessage; encode(e: CBOR.Encoder): CBOR.Encoder; static new(prekey_id: number, base_key: keys.PublicKey, identity_key: keys.IdentityKey, message: message.HeaderMessage): message.PreKeyMessage; } } export declare module session { class ChainKey { constructor(); idx: number; key: derived.MacKey; static decode(d: CBOR.Decoder): session.ChainKey; encode(e: CBOR.Encoder): CBOR.Encoder; static from_mac_key(key: derived.MacKey, counter: number): session.ChainKey; message_keys(): session.MessageKeys; next(): session.ChainKey; } class MessageKeys { constructor(); cipher_key: derived.CipherKey; counter: number; mac_key: derived.MacKey; private _counter_as_nonce(): Uint8Array; static decode(d: CBOR.Decoder): session.MessageKeys; decrypt(ciphertext: Uint8Array): Uint8Array; encode(e: CBOR.Encoder): CBOR.Encoder; encrypt(plaintext: string|Uint8Array): Uint8Array; static new(key: Uint8Array): derived.MacKey; } abstract class PreKeyStore { public prekeys: Array<keys.PreKey> | Array<number>; abstract get_prekey(prekey_id: number): Promise<keys.PreKey>; abstract remove(prekey_id: number): Promise<number>; } class RecvChain { constructor(); static MAX_COUNTER_GAP: number; chain_key: session.ChainKey; ratchet_key: keys.PublicKey; head_key: derived.HeadKey; final_count: any; message_keys: Array<session.MessageKeys>; private static _try_head_key(start_index: number, end_index: number, encrypted_header: Uint8Array, head_key: derived.HeadKey): message.Header; commit_message_keys(keys: Array<session.MessageKeys>): void; static decode(d: CBOR.Decoder): session.RecvChain; encode(e: CBOR.Encoder): CBOR.Encoder; static new(chain_key: session.ChainKey, public_key: keys.PublicKey, head_key: derived.HeadKey): session.RecvChain; stage_message_keys(header: message.Header): Array<session.ChainKey|session.MessageKeys>; try_head_key(encrypted_header: Uint8Array): message.Header; try_message_keys(envelope: message.Envelope, header: message.Header, cipher_text: Uint8Array): Uint8Array; static try_next_head_key(encrypted_header: Uint8Array, next_head_key: derived.HeadKey): message.Header; } class RootKey { constructor(); key: derived.CipherKey; static decode(d: CBOR.Decoder): session.RootKey; dh_ratchet(ours: keys.KeyPair, theirs: keys.PublicKey): Array<session.RootKey|session.ChainKey|derived.HeadKey>; encode(e: CBOR.Encoder): CBOR.Encoder; static from_cipher_key(cipher_key: derived.CipherKey): session.RootKey; } class SendChain { constructor(); chain_key: session.ChainKey; ratchet_key: keys.KeyPair; head_key: derived.HeadKey; static decode(d: CBOR.Decoder): session.SendChain; encode(e: CBOR.Encoder): CBOR.Encoder; static new(chain_key: session.ChainKey, keypair: keys.KeyPair, head_key: derived.HeadKey): session.SendChain; } interface SessionFromMessageTuple extends Array<session.Session | Uint8Array> { 0: session.Session; 1: Uint8Array; } interface PendingTuple extends Array<number | keys.PublicKey> { 0: number; 1: keys.PublicKey; } class Session { constructor(); static readonly MAX_RECV_CHAINS: 5; static readonly MAX_SESSION_STATES: 100; local_identity: any; pending_prekey: any; remote_identity: any; session_states: Array<session.SessionState>; version: number; private _decrypt_header_message(envelope: message.Envelope, msg: message.Message, state_index: number): Uint8Array; private _decrypt_prekey_message(envelope: message.Envelope, msg: message.Message, prekey_store: session.PreKeyStore): Promise<Uint8Array>; private _insert_session_state(state: session.SessionState): boolean; private _new_state(prekey_store: session.PreKeyStore, prekey_message: message.PreKeyMessage): Promise<session.SessionState>; private _try_decrypt_header_message(envelope: message.Envelope, message: message.Message, start: number): Promise<Uint8Array> static decode(local_identity: keys.IdentityKeyPair, d: CBOR.Decoder): session.Session; decrypt(prekey_store: session.PreKeyStore, envelope: message.Envelope): Promise<Uint8Array>; static deserialise(local_identity: keys.IdentityKeyPair, buf: ArrayBuffer): session.Session; encode(e: CBOR.Encoder): CBOR.Encoder; encrypt(plaintext: string|Uint8Array, confuse_pre_key_id?: number): Promise<message.Envelope>; get_local_identity(): keys.PublicKey; static init_from_message(our_identity: keys.IdentityKeyPair, prekey_store: session.PreKeyStore, envelope: message.Envelope): Promise<SessionFromMessageTuple>; static init_from_prekey(local_identity: keys.IdentityKeyPair, remote_pkbundle: keys.PreKeyBundle): Promise<session.Session>; serialise(): ArrayBuffer; } class SessionState { constructor(); next_recv_head_key: derived.HeadKey; next_send_head_key: derived.HeadKey; prev_counter: number; recv_chains: Array<session.RecvChain>; root_key: session.RootKey; send_chain: session.SendChain; static decode(d: CBOR.Decoder): session.SessionState; decrypt(envelope: message.Envelope, msg: message.HeaderMessage): Uint8Array; static deserialise(buf: ArrayBuffer): session.SessionState; encode(e: CBOR.Encoder): CBOR.Encoder; encrypt(identity_key: keys.IdentityKey, pending: PendingTuple, plaintext: string|Uint8Array, confuse_pre_key_id?: number): message.Envelope; static init_as_alice(alice_identity_pair: keys.IdentityKeyPair, alice_base: keys.KeyPair, bob_pkbundle: keys.PreKeyBundle): session.SessionState; static init_as_bob(bob_ident: keys.IdentityKeyPair, bob_prekey: keys.KeyPair, alice_ident: keys.IdentityKey, alice_base: keys.PublicKey): session.SessionState; ratchet(ratchet_key: keys.KeyPair, prev_counter: number): void; serialise(): ArrayBuffer; } }