'use strict'; function ssecMiddleware(options) { return (next) => async (args) => { const input = { ...args.input }; const properties = [ { target: "SSECustomerKey", hash: "SSECustomerKeyMD5", }, { target: "CopySourceSSECustomerKey", hash: "CopySourceSSECustomerKeyMD5", }, ]; for (const prop of properties) { const value = input[prop.target]; if (value) { let valueForHash; if (typeof value === "string") { if (isValidBase64EncodedSSECustomerKey(value, options)) { valueForHash = options.base64Decoder(value); } else { valueForHash = options.utf8Decoder(value); input[prop.target] = options.base64Encoder(valueForHash); } } else { valueForHash = ArrayBuffer.isView(value) ? new Uint8Array(value.buffer, value.byteOffset, value.byteLength) : new Uint8Array(value); input[prop.target] = options.base64Encoder(valueForHash); } const hash = new options.md5(); hash.update(valueForHash); input[prop.hash] = options.base64Encoder(await hash.digest()); } } return next({ ...args, input, }); }; } const ssecMiddlewareOptions = { name: "ssecMiddleware", step: "initialize", tags: ["SSE"], override: true, }; const getSsecPlugin = (config) => ({ applyToStack: (clientStack) => { clientStack.add(ssecMiddleware(config), ssecMiddlewareOptions); }, }); function isValidBase64EncodedSSECustomerKey(str, options) { const base64Regex = /^(?:[A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/; if (!base64Regex.test(str)) return false; try { const decodedBytes = options.base64Decoder(str); return decodedBytes.length === 32; } catch { return false; } } exports.getSsecPlugin = getSsecPlugin; exports.isValidBase64EncodedSSECustomerKey = isValidBase64EncodedSSECustomerKey; exports.ssecMiddleware = ssecMiddleware; exports.ssecMiddlewareOptions = ssecMiddlewareOptions;