import { CryptoModule } from 'expo-crypto-universal';
import { Identity } from '@dfinity/agent';
import { JSX as JSX_2 } from 'react/jsx-runtime';
import { Storage as Storage_2 } from 'expo-storage-universal';
import { Uint8ArrayValueStorageWrapper } from 'expo-storage-universal';

/**
 * Interface defining the backend operations required for AES key management
 */
export declare interface AesBackend {
    /**
     * Retrieves asymmetric keys for encryption/decryption
     * @param transportPublicKey - The public key used for transport
     * @returns Promise resolving to the asymmetric keys result
     */
    asymmetricKeys: (transportPublicKey: Uint8Array) => Promise<AsymmetricKeysResult>;
    /**
     * Saves an encrypted AES key to the backend
     * @param encryptedAesKey - The encrypted AES key to save
     * @returns Promise that resolves when the key is saved
     */
    asymmetricSaveEncryptedAesKey: (encryptedAesKey: Uint8Array) => Promise<void>;
}

export declare const AesProcessingView: () => JSX_2.Element;

/**
 * AesRawKeyStorage is a specialized storage wrapper for AES raw keys.
 * It extends the Uint8ArrayValueStorageWrapper to provide specific functionality
 * for storing AES raw keys.
 */
export declare class AesRawKeyStorage extends Uint8ArrayValueStorageWrapper {
    /**
     * Creates an instance of AesRawKeyStorage.
     *
     * @param {Storage} storage - The storage instance to be used for storing the AES raw key.
     */
    constructor(storage: Storage_2);
}

/**
 * Result type for asymmetric key operations
 */
export declare type AsymmetricKeysResult = {
    /** The public key used for encryption */
    publicKey: Uint8Array;
    /** The encrypted AES key if it exists */
    encryptedAesKey: Uint8Array | undefined;
    /** The encrypted key if it exists */
    encryptedKey: Uint8Array | undefined;
};

/**
 * Hook for managing AES key generation, encryption, and storage
 *
 * This hook handles the lifecycle of AES keys:
 * 1. Generates new AES keys when no identity is present
 * 2. Retrieves and decrypts existing AES keys when an identity is present
 * 3. Encrypts and saves new AES keys when needed
 *
 * @param args - The arguments required for AES key management
 * @returns Object containing processing state and any errors
 */
export declare const useAesKey: ({ cryptoModule, aesRawKeyStorage, identity, backend, }: UseAesKeyArgs) => {
    isProcessingAes: boolean;
    aesError: unknown;
};

/**
 * Arguments required for the useAesKey hook
 */
declare type UseAesKeyArgs = {
    /** The crypto module for cryptographic operations */
    cryptoModule: CryptoModule;
    /** Storage wrapper for AES key persistence */
    aesRawKeyStorage: Uint8ArrayValueStorageWrapper;
    /** The user's identity, if authenticated */
    identity: Identity | undefined;
    /** The backend service for key operations */
    backend: AesBackend;
};

export { }
