import { DotenvVariable } from "./dotenv_variable";
import { CryptoKeyManager } from "./crypto_key_manager";
import { JWK } from "jose";
/**
 * Status of an attempt to encrypt or decrypt a dotenv variable
 */
export declare enum StatusCryptoWrapperResult {
    /**
     * Operation successful
     */
    success = "success",
    /**
     * Encryption key could not be found
     */
    missingEncryptionKey = "missingEncryptionKey",
    /**
     * An exception occurred during the encryption or decryption
     */
    exception = "exception",
    /**
     * All the encryption keys were tried but none were successful.
     */
    wildcardNoKeysMatch = "wildcardNoKeysMatch"
}
/**
 * Convert an error to something human readable
 */
export declare const statusCryptoWrapperToText: (status: StatusCryptoWrapperResult, keyName: string, exception?: Error | undefined) => string;
/**
 * Status of an attempt to encrypt or decrypt a dotenv variable
 */
export interface CryptoWrapperResult {
    status: StatusCryptoWrapperResult;
    /**
     * If the encryption or decryption was successful, then the result is stored in this property.
     */
    result?: string;
    /**
     * List of failure reasons
     */
    failureExplanation: string[];
    /**
     * If encrypting: This contains the name of the unencrypted variable
     * If decrypting: This contains the name of the ciphered variable
     */
    oldDotenvVariableName: string;
    /**
     * If encrypting: This contains the name of the ciphered variable
     * If decrypting: This contains the name of the unencrypted variable
     */
    newDotenvVariableName: string;
}
/**
 * Interface for encryption decryption
 */
export interface CryptoWrapperInterface {
    /**
     * Encryption decryption algorithm name
     */
    algo(): string;
    /**
     * @see CryptoWrapperResult.newDotenvVariableName
     */
    newDotEnvVariableName(dv: DotenvVariable): string;
    encryptWithKeyManager(plainText: DotenvVariable[]): CryptoWrapperResult[];
    decryptWithKeyManager(cipherText: DotenvVariable[]): CryptoWrapperResult[];
    encrypt(plainText: DotenvVariable, key: JWK.Key): CryptoWrapperResult;
    decrypt(cipherText: DotenvVariable, key: JWK.Key): CryptoWrapperResult;
}
export declare class CryptoWrapperAes256Gcm implements CryptoWrapperInterface {
    static readonly SYM_ENC_ALGO = "aes-256-gcm";
    static readonly SYM_ENC_KEY_LENGTH = 32;
    static readonly SYM_ENC_IV_LENGTH = 12;
    static readonly SYM_ENC_TAG_LENGTH = 16;
    /**
     * Used exclusively for testing to force the IV to be the same value, so encrypted
     * always match the expected value. If TRUE, this weakens the strength of the encryption.
     */
    private forceIvToFixedValue;
    cryptoMgr: CryptoKeyManager;
    constructor(cryptoMgr: CryptoKeyManager, forceIvToFixedValue?: boolean);
    algo(): string;
    newDotEnvVariableName(dv: DotenvVariable): string;
    encryptWithKeyManager(dotenvPlainTextVariables: DotenvVariable[]): CryptoWrapperResult[];
    decryptWithKeyManager(dotenvCipherVariables: DotenvVariable[]): CryptoWrapperResult[];
    encrypt(plainText: DotenvVariable, key: JWK.Key): CryptoWrapperResult;
    decrypt(cipherText: DotenvVariable, key: JWK.Key): CryptoWrapperResult;
}
