{"version":3,"file":"gcm.mjs","sources":["../../src/aes/gcm.ts"],"sourcesContent":["import { randomBytes } from 'node:crypto';\nimport type { BinaryLike } from 'node:crypto';\nimport type { TransformOptions } from 'node:stream';\n\nimport type {\n    HasAuthTagAesCipherEncodingOptions,\n    Result,\n} from '../types';\n\nimport { BaseAesCipher } from './base';\n\nexport class Gcm extends BaseAesCipher<HasAuthTagAesCipherEncodingOptions> {\n    readonly #ivLength: number;\n\n    constructor(key: BinaryLike, encodingOptions?: HasAuthTagAesCipherEncodingOptions, ivLength: number = 12) {\n        super(key, 'gcm', encodingOptions);\n        this.#ivLength = ivLength;\n    }\n\n    decrypt(\n        encryptedData: BinaryLike,\n        iv: BinaryLike,\n        authTag: BinaryLike,\n        authTagLength?: number,\n        encodingOptions?: HasAuthTagAesCipherEncodingOptions.Decrypt,\n        decipherOptions?: TransformOptions,\n    ): Result<string> {\n        try {\n            const decipher = this.createDecipher(\n                this.dataToBuffer(iv, encodingOptions?.iv || this.encodingOptions.iv),\n                {\n                    authTagLength,\n                    ...decipherOptions,\n                },\n            );\n\n            decipher.setAuthTag(this.dataToBuffer(authTag, encodingOptions?.authTag || this.encodingOptions.authTag));\n            return this.createOkResult(this.getDecipherResult(decipher, encryptedData, encodingOptions));\n        } catch (error) {\n            return this.createErrorResult(error);\n        }\n    }\n\n    decryptToJson<T = any>(\n        encryptedData: BinaryLike,\n        iv: BinaryLike,\n        authTag: BinaryLike,\n        authTagLength?: number,\n        encodingOptions?: HasAuthTagAesCipherEncodingOptions.Decrypt,\n        decipherOptions?: TransformOptions,\n    ): Result<T> {\n        const result = this.decrypt(encryptedData, iv, authTag, authTagLength, encodingOptions, decipherOptions);\n        if (!result.ok) return result;\n        return this.parseJson<T>(result.value);\n    }\n\n    encrypt(\n        data: BinaryLike,\n        authTagLength?: number,\n        ivLength: number = this.#ivLength,\n        encodingOptions?: HasAuthTagAesCipherEncodingOptions.Encrypt,\n        cipherOptions?: TransformOptions,\n    ): Result<{ authTag: string; authTagLength?: number; data: string; iv: string }> {\n        const iv = randomBytes(ivLength);\n        try {\n            const cipher = this.createCipher(\n                iv,\n                {\n                    authTagLength,\n                    ...cipherOptions,\n                },\n            );\n\n            const encryptedData = this.getCipherResult(cipher, data, encodingOptions);\n            return this.createOkResult({\n                authTag: cipher.getAuthTag().toString(encodingOptions?.authTag || this.encodingOptions.authTag),\n                authTagLength,\n                data: encryptedData,\n                iv: iv.toString(encodingOptions?.iv || this.encodingOptions.iv),\n            });\n        } catch (error) {\n            return this.createErrorResult(error);\n        }\n    }\n\n    encryptJson(\n        data: any,\n        authTagLength?: number,\n        ivLength: number = this.#ivLength,\n        encodingOptions?: HasAuthTagAesCipherEncodingOptions.Encrypt,\n        cipherOptions?: TransformOptions,\n    ): Result<{ authTag: string; authTagLength?: number; data: string; iv: string }> {\n        try {\n            return this.encrypt(JSON.stringify(data), authTagLength, ivLength, encodingOptions, cipherOptions);\n        } catch (error) {\n            return this.createErrorResult(error);\n        }\n    }\n}\n"],"names":[],"mappings":"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"}