UNPKG

covid-certificate

Version:

Parse and verify a european digital covid certificate (dcc)

48 lines (47 loc) 2.02 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.readCertificate = void 0; const SingleSignedMessage_1 = require("../cose/SingleSignedMessage"); const pako_1 = require("pako"); const base45_1 = require("./base45"); const strip_header_1 = require("./strip_header"); const cbor_1 = require("cbor"); const ChainValidator_1 = __importDefault(require("../validate/ChainValidator")); const IsCoseSingleSignedMessageValidator_1 = __importDefault(require("../validate/cbor/IsCoseSingleSignedMessageValidator")); /** * Parse a certificate string into a COSE single signed message * * @example * Here is an example: * ``` * const cert = readCertificate("HC1:data_from_QR_scanner"); * ``` * * @param certificate - The base45 encoded, zlib deflated, CBor encoded string. Normally one can obtain * such string by scanning a QR-code */ const readCertificate = (certificate) => { const coseMessage = (0, pako_1.inflate)((0, base45_1.decode)((0, strip_header_1.strip_header)(certificate))); const data = (0, cbor_1.decode)(coseMessage); // Create validator const cborValidator = new ChainValidator_1.default([ new IsCoseSingleSignedMessageValidator_1.default(), ]); // Validate data const validationResult = cborValidator.validate(data); if (!validationResult.isValid()) { throw new Error("Given certificate string not valid: " + validationResult.getMessage()); } // Create single signed cose message const [protectedHeaders, unprotectedHeaders, payload, signature] = data.value; const message = new SingleSignedMessage_1.SingleSignedMessage(); message.setProtectedHeaders(protectedHeaders); message.setUnprotectedHeaders(unprotectedHeaders); message.setPayload(payload); message.setSignature(signature); return message; }; exports.readCertificate = readCertificate;