import { type ACPKMConstructor, type ACPKMParameters, type CipherFunc } from "./utils";
export { type ACPKMClass, type ACPKMConstructor, type ACPKMParameters, type CipherFunc, KEYSIZE } from "./utils";
export { MGM } from "./mgm";
export declare const isEqual: (a: Uint8Array, b: Uint8Array) => boolean;
/**
 * Calculate length of padding bytes needed for specific block size.
 *
 * @param dataLength Length of input data
 * @param blockSize Target block size
 */
export declare const getPadLength: (dataLength: number, blockSize: number) => number;
/**
 * Procedure 1 (aka `Процедура 1`)
 *
 * Just fill in with zeros if necessary
 * @param data Input data
 * @param blockSize Target block size
 */
export declare const pad1: (data: Uint8Array, blockSize: number) => Uint8Array;
/**
 * Procedure 2 (aka `Процедура 2` aka `ISO/IEC 7816-4`)
 * @param data Input data
 * @param blockSize Target block size
 */
export declare const pad2: (data: Uint8Array, blockSize: number) => Uint8Array;
/**
 * Unpadding for Procedure 2
 * @param data Input data
 * @param blockSize Target block size
 */
export declare const unpad2: (data: Uint8Array, blockSize: number) => Uint8Array;
/**
 * Procedure 3 (aka `Процедура 3`)
 *
 * If length of data matches block size, do nothing; otherwise, use Procedure 2 (`pad2`)
 * @param data Input data
 * @param blockSize Block size
 */
export declare const pad3: (data: Uint8Array, blockSize: number) => Uint8Array;
/**
 * Wrapper for Electronic Codebook (ECB) mode
 * @param encrypter Encrypting function, that takes block as input
 * @param blockSize Cipher block size
 * @param data Input data
 */
export declare const ecb_encrypt: (encrypter: CipherFunc, blockSize: number, data: Uint8Array) => Uint8Array;
/**
 * Wrapper for Electronic Codebook (ECB) mode
 * @param decrypter Decrypting function, that takes block as input
 * @param blockSize Cipher block size
 * @param data Input data
 */
export declare const ecb_decrypt: (decrypter: CipherFunc, blockSize: number, data: Uint8Array) => Uint8Array;
/**
 * Wrapper for Output Feedback (OFB) mode
 *
 * For decryption you SHOULD use this function again
 * @param encrypter Encrypting function, that takes block as input
 * @param blockSize Cipher block size
 * @param data Input data
 * @param iv Initialization vector
 */
export declare const ofb: (encrypter: CipherFunc, blockSize: number, data: Uint8Array, iv: Uint8Array) => Uint8Array;
/**
 * Wrapper for Cipher Block Chaining (CBC) mode
 * @param encrypter Encrypting function, that takes block as input
 * @param blockSize Cipher block size
 * @param data Input data
 * @param iv Initialization vector
 */
export declare const cbc_encrypt: (encrypter: CipherFunc, blockSize: number, data: Uint8Array, iv: Uint8Array) => Uint8Array;
/**
 * Wrapper for Cipher Block Chaining (CBC) mode
 * @param decrypter Decrypting function, that takes block as input
 * @param blockSize Cipher block size
 * @param data Input data
 * @param iv Initialization vector
 */
export declare const cbc_decrypt: (decrypter: CipherFunc, blockSize: number, data: Uint8Array, iv: Uint8Array) => Uint8Array;
/**
 * Wrapper for Cipher Feedback (CFB) mode
 * @param encrypter Encrypting function, that takes block as input
 * @param blockSize Cipher block size
 * @param data Input data
 * @param iv Initialization vector
 */
export declare const cfb_encrypt: (encrypter: CipherFunc, blockSize: number, data: Uint8Array, iv: Uint8Array) => Uint8Array;
/**
 * Wrapper for Cipher Feedback (CFB) mode
 * @param decrypter Decrypting function, that takes block as input
 * @param blockSize Cipher block size
 * @param data Input data
 * @param iv Initialization vector
 */
export declare const cfb_decrypt: (decrypter: CipherFunc, blockSize: number, data: Uint8Array, iv: Uint8Array) => Uint8Array;
/**
 * Wrapper for counter (CTR) mode
 *
 * For decryption you SHOULD use this function again
 * @param encrypter Encrypting function, that takes block as input
 * @param blockSize Cipher block size
 * @param data Input data
 * @param iv Initialization vector (Half of block size)
 * @param acpkm Optional. Parameters for CTR-ACPKM mode
 */
export declare const ctr: (encrypter: CipherFunc, blockSize: number, data: Uint8Array, iv: Uint8Array, acpkm?: ACPKMParameters) => Uint8Array;
/**
 * Wrapper for MAC (CMAC/OMAC1) mode
 * @param encrypter Encrypting function, that takes block as input
 * @param blockSize Cipher block size
 * @param data Input data
 */
export declare const mac: (encrypter: CipherFunc, blockSize: number, data: Uint8Array) => Uint8Array;
/**
 * ACPKM key derivation
 * @param encrypter Encrypting function, that takes block as input
 * @param blockSize Cipher block size
 */
export declare const acpkmDerivation: (encrypter: CipherFunc, blockSize: number) => Uint8Array;
/**
 * Wrapper for Counter with Advance Cryptographic Prolongation of Key Material (CTR-ACPKM) mode
 *
 * For decryption you SHOULD use this function again
 * @param cipherClass Cipher class (see `ACPKMConstructor` and `ACPKMClass`)
 * @param encrypter Encrypting function, that takes block as input
 * @param sectionSize ACPKM section size (N)
 * @param blockSize Cipher block size
 * @param data Input data
 * @param iv Initialization vector (Half of block size)
 */
export declare const ctr_acpkm: (cipherClass: ACPKMConstructor, encrypter: CipherFunc, sectionSize: number, blockSize: number, data: Uint8Array, iv: Uint8Array) => Uint8Array;
/**
 * ACPKM master key derivation
 * @param cipherClass Cipher class (see `ACPKMConstructor` and `ACPKMClass`)
 * @param encrypter Encrypting function, that takes block as input
 * @param keySectionSize ACPKM key section size (T*)
 * @param blockSize Cipher block size
 * @param keyMaterialLength Length of key material
 */
export declare const acpkmDerivationMaster: (cipherClass: ACPKMConstructor, encrypter: CipherFunc, keySectionSize: number, blockSize: number, keyMaterialLength: number) => Uint8Array;
/**
 * Wrapper for MAC with Advance Cryptographic Prolongation of Key Material (OMAC-ACPKM) mode
 * @param cipherClass Cipher class (see `ACPKMConstructor` and `ACPKMClass`)
 * @param encrypter Encrypting function, that takes block as input
 * @param keySectionSize ACPKM key section size (T*)
 * @param sectionSize ACPKM section size (N)
 * @param blockSize Cipher block size
 * @param data Input data
 */
export declare const omac_acpkm_master: (cipherClass: ACPKMConstructor, encrypter: CipherFunc, keySectionSize: number, sectionSize: number, blockSize: number, data: Uint8Array) => Uint8Array;
/**
 * KExp15 key exporting
 * @param encrypter_key Encrypting function for key encryption, that takes block as input
 * @param encrypter_mac Encrypting function for key authentication, that takes block as input
 * @param blockSize Cipher block size
 * @param key Key to export
 * @param iv Initialization vector (Half of block size)
 */
export declare const kexp15: (encrypter_key: CipherFunc, encrypter_mac: CipherFunc, blockSize: number, key: Uint8Array, iv: Uint8Array) => Uint8Array;
/**
 * KImp15 key importing
 * @param encrypter_key Encrypting function for key decryption, that takes block as input
 * @param encrypter_mac Encrypting function for key authentication, that takes block as input
 * @param blockSize Cipher block size
 * @param kexp Key to import
 * @param iv Initialization vector (Half of block size)
 */
export declare const kimp15: (encrypter_key: CipherFunc, encrypter_mac: CipherFunc, blockSize: number, kexp: Uint8Array, iv: Uint8Array) => Uint8Array;
