{"version":3,"file":"index.cjs","names":["algorithm: string","key: crypto.BinaryLike | crypto.KeyObject","body: string","request: middy.Request","key: SignatureOption['key']","options: Options","beforeFn: middy.MiddlewareFn","afterFn: middy.MiddlewareFn"],"sources":["../src/mac.ts","../src/index.ts"],"sourcesContent":["import crypto from 'node:crypto'\n\n/**\n * MAC値を算出する\n * @param algorithm HMAC値算出アルゴリズム\n * @param key キー\n * @param body リクエスト/レスポンスメッセージ\n * @returns MAC値\n */\nconst calcMessageMAC = (algorithm: string, key: crypto.BinaryLike | crypto.KeyObject, body: string): string | null => {\n  const hmac = crypto.createHmac(algorithm, key)\n  hmac.update(body)\n  return hmac.digest('base64')\n}\n\nexport { calcMessageMAC }\n","import type crypto from 'node:crypto'\nimport type middy from '@middy/core'\nimport { createError, normalizeHttpResponse } from '@middy/util'\nimport { calcMessageMAC } from './mac'\n\ntype KeyType = crypto.BinaryLike | crypto.KeyObject\n\ntype SignatureOption = {\n  headerName: string\n  algorithm: string\n  key: KeyType | ((request: middy.Request) => KeyType | PromiseLike<KeyType>)\n}\n\ntype Options = {\n  input?: SignatureOption\n  output?: SignatureOption\n}\n\nconst generateKey = async (request: middy.Request, key: SignatureOption['key']): Promise<KeyType> => {\n  return typeof key === 'function' ? await key(request) : key\n}\n\nexport default (options: Options): middy.MiddlewareObj => {\n  const { input, output } = options\n\n  const beforeFn: middy.MiddlewareFn = async (request) => {\n    if (!input) {\n      return\n    }\n    const { algorithm, key, headerName } = input\n    const { headers, body } = request.event\n\n    // Base64エンコードされている場合、デコードする\n    const data = request.event.isBase64Encoded ? Buffer.from(body, 'base64').toString() : body\n    request.event.body = data\n    request.event.isBase64Encoded = false\n\n    const signature = headers[headerName]\n    if (signature) {\n      const macKey = await generateKey(request, key)\n      const mac = calcMessageMAC(algorithm, macKey, data)\n      if (mac !== signature) {\n        throw createError(400, 'Bad signature', {\n          cause: {\n            package: '@gahojin-inc/middy-http-signature',\n          },\n        })\n      }\n    }\n  }\n\n  const afterFn: middy.MiddlewareFn = async (request) => {\n    if (!output) {\n      return\n    }\n    const { algorithm, key, headerName } = output\n    normalizeHttpResponse(request)\n\n    const body = request.response.body\n    if (typeof body !== 'string') {\n      return\n    }\n    const macKey = await generateKey(request, key)\n    request.response.headers[headerName] = calcMessageMAC(algorithm, macKey, body)\n  }\n  return {\n    before: input ? beforeFn : undefined,\n    after: output ? afterFn : undefined,\n  }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,MAAM,iBAAiB,CAACA,WAAmBC,KAA2CC,SAAgC;CACpH,MAAM,OAAO,oBAAO,WAAW,WAAW,IAAI;AAC9C,MAAK,OAAO,KAAK;AACjB,QAAO,KAAK,OAAO,SAAS;AAC7B;;;;ACKD,MAAM,cAAc,OAAOC,SAAwBC,QAAkD;AACnG,eAAc,QAAQ,aAAa,MAAM,IAAI,QAAQ,GAAG;AACzD;AAED,kBAAe,CAACC,YAA0C;CACxD,MAAM,EAAE,OAAO,QAAQ,GAAG;CAE1B,MAAMC,WAA+B,OAAO,YAAY;AACtD,OAAK,MACH;EAEF,MAAM,EAAE,WAAW,KAAK,YAAY,GAAG;EACvC,MAAM,EAAE,SAAS,MAAM,GAAG,QAAQ;EAGlC,MAAM,OAAO,QAAQ,MAAM,kBAAkB,OAAO,KAAK,MAAM,SAAS,CAAC,UAAU,GAAG;AACtF,UAAQ,MAAM,OAAO;AACrB,UAAQ,MAAM,kBAAkB;EAEhC,MAAM,YAAY,QAAQ;AAC1B,MAAI,WAAW;GACb,MAAM,SAAS,MAAM,YAAY,SAAS,IAAI;GAC9C,MAAM,MAAM,eAAe,WAAW,QAAQ,KAAK;AACnD,OAAI,QAAQ,UACV,OAAM,8BAAY,KAAK,iBAAiB,EACtC,OAAO,EACL,SAAS,oCACV,EACF,EAAC;EAEL;CACF;CAED,MAAMC,UAA8B,OAAO,YAAY;AACrD,OAAK,OACH;EAEF,MAAM,EAAE,WAAW,KAAK,YAAY,GAAG;AACvC,0CAAsB,QAAQ;EAE9B,MAAM,OAAO,QAAQ,SAAS;AAC9B,aAAW,SAAS,SAClB;EAEF,MAAM,SAAS,MAAM,YAAY,SAAS,IAAI;AAC9C,UAAQ,SAAS,QAAQ,cAAc,eAAe,WAAW,QAAQ,KAAK;CAC/E;AACD,QAAO;EACL,QAAQ,QAAQ;EAChB,OAAO,SAAS;CACjB;AACF"}