covid-certificate
Version:
Parse and verify a european digital covid certificate (dcc)
48 lines (47 loc) • 2.02 kB
JavaScript
;
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;