/** * @file cipher.ts * @description AEAD record protection for DTLS 1.2 with AES-128-GCM. * @module dtls/cipher * * Implements key derivation and the GCM record encrypt/decrypt for the suite * TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (RFC 5288 / RFC 6347). * * Key block layout for AEAD (no MAC keys): * client_write_key[16] | server_write_key[16] | * client_write_IV[4] | server_write_IV[4] (implicit salt) * * GCM nonce = write_IV (4) || explicit_nonce (8) * Record = explicit_nonce (8) || ciphertext || tag (16) * AAD (DTLS) = seq_num (8 = epoch||seq) || type (1) || version (2) || plaintext_len (2) */ /** * Per-direction keys/IVs produced by {@link deriveKeys}. */ export interface DerivedKeys { clientKey: Buffer; serverKey: Buffer; clientIV: Buffer; serverIV: Buffer; } /** * Derive the master secret from the pre-master secret (RFC 5246 ยง8.1). * @param {Buffer} preMasterSecret * @param {Buffer} clientRandom - 32 bytes * @param {Buffer} serverRandom - 32 bytes * @returns {Buffer} 48-byte master secret */ export declare function deriveMasterSecret(preMasterSecret: Buffer, clientRandom: Buffer, serverRandom: Buffer): Buffer; /** * Derive the extended master secret (RFC 7627) using the handshake hash. * @param {Buffer} preMasterSecret * @param {Buffer} sessionHash - hash of handshake messages through CKE * @returns {Buffer} 48-byte master secret */ export declare function deriveExtendedMasterSecret(preMasterSecret: Buffer, sessionHash: Buffer): Buffer; /** * Expand the key block and split it into per-direction keys/IVs. * @param {Buffer} masterSecret * @param {Buffer} clientRandom * @param {Buffer} serverRandom * @returns {DerivedKeys} */ export declare function deriveKeys(masterSecret: Buffer, clientRandom: Buffer, serverRandom: Buffer): DerivedKeys; /** * @class GcmCipher * @description Holds the key/IV for one direction and does record AEAD. */ export declare class GcmCipher { #private; /** * @param {Buffer} key - 16-byte AES key * @param {Buffer} fixedIv - 4-byte implicit salt */ constructor(key: Buffer, fixedIv: Buffer); /** * Encrypt a record fragment. * @param {number} epoch * @param {number} seq * @param {number} type * @param {number} version * @param {Buffer} plaintext * @returns {Buffer} explicit_nonce || ciphertext || tag */ encrypt(epoch: number, seq: number, type: number, version: number, plaintext: Buffer): Buffer; /** * Decrypt a record fragment. * @param {number} epoch * @param {number} seq * @param {number} type * @param {number} version * @param {Buffer} record - explicit_nonce || ciphertext || tag * @returns {Buffer} plaintext * @throws on authentication failure */ decrypt(epoch: number, seq: number, type: number, version: number, record: Buffer): Buffer; }