UNPKG

admob-ssv

Version:

Tool for validate AdMob rewarded ads signatures SSV

51 lines 1.67 kB
import { createVerify } from 'node:crypto'; import querystring from 'node:querystring'; import debugLib from 'debug'; import KeyProvider from './keydict/provider'; const debug = debugLib('admob-ssv:verifier'); export function parseQueryString(raw) { debug(`Parsing query string`); return querystring.parse(raw); } export function parseMessage(data) { debug(`Parsing message`); const { key_id, signature, ...fdata } = data; const qs = querystring .stringify(fdata, undefined, undefined, { encodeURIComponent: (s) => s }) .split('&') .sort() .join('&'); return { keyId: Number.parseInt(key_id, 10), signature: Buffer.from(signature, 'base64'), body: Buffer.from(qs, 'utf8'), }; } export default class Verifier { constructor(options = {}) { this.keyProvider = options.keyProvider || new KeyProvider({ cache: options.keyCache, }); } async verify(data) { debug(`Verify`); const parsedData = typeof data === 'string' ? parseMessage(parseQueryString(data)) : !data.body ? parseMessage(data) : data; const { keyId, signature, body } = parsedData; debug(`\tGetting key ${keyId}`); const key = await this.keyProvider.get(keyId); if (!key) { throw new Error('Key not found'); } const verifier = createVerify('RSA-SHA256'); verifier.update(body); debug(`\tVerifying`); return verifier.verify(key, signature); } } //# sourceMappingURL=verifier.js.map