admob-ssv
Version:
Tool for validate AdMob rewarded ads signatures SSV
51 lines • 1.67 kB
JavaScript
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