admob-ssv
Version:
Tool for validate AdMob rewarded ads signatures SSV
59 lines • 2.1 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseQueryString = parseQueryString;
exports.parseMessage = parseMessage;
const node_crypto_1 = require("node:crypto");
const node_querystring_1 = __importDefault(require("node:querystring"));
const debug_1 = __importDefault(require("debug"));
const provider_1 = __importDefault(require("./keydict/provider"));
const debug = (0, debug_1.default)('admob-ssv:verifier');
function parseQueryString(raw) {
debug(`Parsing query string`);
return node_querystring_1.default.parse(raw);
}
function parseMessage(data) {
debug(`Parsing message`);
const { key_id, signature, ...fdata } = data;
const qs = node_querystring_1.default
.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'),
};
}
class Verifier {
constructor(options = {}) {
this.keyProvider =
options.keyProvider ||
new provider_1.default({
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 = (0, node_crypto_1.createVerify)('RSA-SHA256');
verifier.update(body);
debug(`\tVerifying`);
return verifier.verify(key, signature);
}
}
exports.default = Verifier;
//# sourceMappingURL=verifier.js.map