export declare class CryptoError extends Error {
    constructor(message: string);
}
/**
 * Chiffrement par enveloppe.
 *
 *  - KEK (Key Encryption Key) : issue de MASTER_KEK (32 octets base64), versionnée.
 *  - DEK (Data Encryption Key) : aléatoire par connexion, wrappée (AES-256-GCM) sous la KEK.
 *  - App password : chiffré (AES-256-GCM) avec la DEK, AAD = family_id
 *    (un blob ne peut pas être rejoué d'une famille sur une autre).
 *
 * Format binaire des blobs : nonce(12) || ciphertext || tag(16).
 *
 * Réutilisé tel quel depuis l'ancien backend — servira à chiffrer les
 * futurs secrets locaux (clé de maintenance persistée, etc.).
 */
export declare function generateDek(): Buffer;
export declare function generateKek(): Buffer;
/** Parse MASTER_KEK depuis l'environnement (base64). */
export declare function kekFromBase64(base64: string): Buffer;
/** Wrappe une DEK sous une KEK. */
export declare function wrapDek(kek: Buffer, dek: Buffer): string;
/** Dé-wrappe une DEK. */
export declare function unwrapDek(kek: Buffer, wrapped: string): Buffer;
/**
 * Chiffre un secret d'application (app password) avec la DEK.
 * AAD = familyId : le blob chiffré n'est valide que pour cette famille.
 */
export declare function encryptSecret(dek: Buffer, familyId: string, secret: string): {
    ciphertext: string;
    nonce: string;
};
/** Déchiffre un secret ; échoue si l'AAD (familyId) ou la DEK ne correspondent pas. */
export declare function decryptSecret(dek: Buffer, familyId: string, ciphertext: string, nonce: string): string;
/**
 * Rotation de KEK : re-wrappe une DEK sous une nouvelle KEK.
 * Ne déchiffre jamais l'app password lui-même.
 */
export declare function rewrapDek(oldKek: Buffer, newKek: Buffer, wrappedDek: string): string;
/** Empreinte stable (non réversible) d'un token de refresh, pour le stockage. */
export declare function sha256(input: string): string;
export declare function constantTimeEqual(a: string, b: string): boolean;
