/// <reference types="node" />
import { Readable, Writable } from "stream";
export declare type BufferLike = Buffer | ArrayBuffer;
export declare type DataLike = string | Buffer | ArrayBuffer;
export interface DerivedKeyInfo {
    salt: string;
    key: Buffer | ArrayBuffer;
    hmac: Buffer | ArrayBuffer | null;
    rounds: number;
}
export interface EncryptedBinaryComponents extends EncryptedComponentsBase {
    content: Buffer | ArrayBuffer;
}
export interface EncryptedComponents extends EncryptedComponentsBase {
    content: string;
}
export declare type EncryptedComponentsBase = EncryptedPayloadHeader & EncryptedPayloadFooter;
export interface EncryptedPayloadFooter {
    auth: string;
}
export interface EncryptedPayloadHeader {
    iv: string;
    salt: string;
    rounds: number;
    method: EncryptionAlgorithm;
}
export declare enum EncryptionAlgorithm {
    CBC = "cbc",
    GCM = "gcm"
}
export interface EncryptFunction {
    (target: string | BufferLike, options?: EncryptFunctionOptions): Promise<any>;
}
export interface EncryptFunctionOptions {
    algo?: EncryptionAlgorithm;
}
export interface IocaneAdapterBase {
    algorithm: EncryptionAlgorithm;
    decrypt: (encrypted: DataLike, password: string) => Promise<DataLike>;
    decryptCBC: (encryptedComponents: EncryptedComponents | EncryptedBinaryComponents, keyDerivationInfo: DerivedKeyInfo) => Promise<string | BufferLike>;
    decryptGCM: (encryptedComponents: EncryptedComponents | EncryptedBinaryComponents, keyDerivationInfo: DerivedKeyInfo) => Promise<string | BufferLike>;
    derivationRounds: number;
    deriveKey: (password: string, salt: string) => Promise<DerivedKeyInfo>;
    encrypt: (text: DataLike, password: string) => Promise<DataLike>;
    encryptCBC: (content: string | BufferLike, keyDerivationInfo: DerivedKeyInfo, iv: BufferLike) => Promise<EncryptedComponents | EncryptedBinaryComponents>;
    encryptGCM: (content: string | BufferLike, keyDerivationInfo: DerivedKeyInfo, iv: BufferLike) => Promise<EncryptedComponents | EncryptedBinaryComponents>;
    generateIV: () => Promise<BufferLike>;
    generateSalt: (length: number) => Promise<string>;
    packData: (encryptedComponents: EncryptedBinaryComponents | EncryptedComponentsBase) => BufferLike;
    packText: (encryptedComponents: EncryptedComponents) => PackedEncryptedText;
    setAlgorithm: (algo: EncryptionAlgorithm) => IocaneAdapterBase;
    setDerivationRounds: (rounds: number) => IocaneAdapterBase;
    unpackData: (encryptedContent: BufferLike) => EncryptedBinaryComponents;
    unpackText: (encryptedContent: PackedEncryptedText) => EncryptedComponents;
}
export interface IocaneAdapter extends IocaneAdapterBase {
    createDecryptStream: (password: string) => Readable;
    createEncryptStream: (password: string) => Writable;
}
export declare type PackedEncryptedText = string;
