export declare namespace CryptoTypes {
  export interface Participant {
    publicKey: string;
  }
  export interface KeyPair {
    privateKey: string;
    publicKey: string;
  }
  export interface EncryptParams {
    message: string;
    symKey: string;
    type?: number;
    iv?: string;
    senderPublicKey?: string;
  }
  export interface DecryptParams {
    symKey: string;
    encoded: string;
  }
  export interface EncodingParams {
    type: Uint8Array;
    sealed: Uint8Array;
    iv: Uint8Array;
    senderPublicKey?: Uint8Array;
  }
  export interface EncodeOptions {
    type?: number;
    senderPublicKey?: string;
    receiverPublicKey?: string;
  }
  export interface DecodeOptions {
    receiverPublicKey?: string;
  }
  export interface EncodingValidation {
    type: number;
    senderPublicKey?: string;
    receiverPublicKey?: string;
  }
  export interface TypeOneParams {
    type: 1;
    senderPublicKey: string;
    receiverPublicKey: string;
  }
}
export abstract class ICrypto {
  public abstract name: string;
  public abstract readonly context: string;
  public abstract keychain: IKeyChain;
  constructor(
    public core: ICore,
    public logger: Logger,
    keychain?: IKeyChain
  ) {}
  public abstract init(): Promise<void>;
  public abstract hasKeys(tag: string): boolean;
  public abstract generateKeyPair(): Promise<string>;
  public abstract generateSharedKey(
    selfPublicKey: string,
    peerPublicKey: string,
    overrideTopic?: string
  ): Promise<string>;
  public abstract setSymKey(
    symKey: string,
    overrideTopic?: string
  ): Promise<string>;
  public abstract deleteKeyPair(publicKey: string): Promise<void>;
  public abstract deleteSymKey(topic: string): Promise<void>;
  public abstract encode(
    topic: string,
    payload: JsonRpcPayload,
    opts?: CryptoTypes.EncodeOptions
  ): Promise<string>;
  public abstract decode(
    topic: string,
    encoded: string,
    opts?: CryptoTypes.DecodeOptions
  ): Promise<JsonRpcPayload>;
}