DGCServerVerifier/src/Services/dgcVerifier/Verifier.ts

75 lines
2.7 KiB
TypeScript
Raw Normal View History

2021-09-26 15:42:30 +02:00
import { CertificateDownloader } from '../SettingsDownloader/CertificateDownloader';
import { RuleDownloader } from '../SettingsDownloader/RuleDownloader';
2021-09-26 20:00:33 +02:00
import { CheckResult, VaccineVerifier } from './VaccineVerifier';
2021-09-23 15:38:13 +02:00
import {DCC} from 'dcc-utils';
2021-09-25 14:15:49 +02:00
import jsrsasign from 'jsrsasign';
2021-09-26 20:00:33 +02:00
interface certificateResponse {
signature:{
valid: boolean
},
valid:CheckResult,
info:{
identity:{
fnt:string,
fn:string,
gnt:string,
gn:string
},
dob:string
}
}
2021-09-23 15:38:13 +02:00
export default class Verifier {
2021-09-23 17:17:00 +02:00
static instance: Verifier|undefined = undefined;
private certDownloader: CertificateDownloader;
private ruleDownloader: RuleDownloader;
private constructor(){
this.certDownloader = new CertificateDownloader();
this.ruleDownloader = new RuleDownloader();
2021-09-23 15:38:13 +02:00
}
2021-09-23 17:17:00 +02:00
public static async instanceVerifier(): Promise<Verifier>{
if (Verifier.instance == undefined){
Verifier.instance = new Verifier();
2021-09-24 15:21:24 +02:00
await Verifier.instance.certDownloader.getCertificates();
await Verifier.instance.ruleDownloader.getRules();
2021-09-23 17:17:00 +02:00
}
return Verifier.instance;
}
2021-09-26 20:00:33 +02:00
async checkCertificate(certificate:string): Promise<certificateResponse>{
2021-09-26 20:31:28 +02:00
let result:certificateResponse = {signature:{valid: false}, valid:{valid:false, message:'nd'}, info:{identity:{fnt:'nd',fn:'nd',gnt:'nd',gn:'nd'},dob:'nd'}};
2021-09-26 20:00:33 +02:00
try {
const dcc = await DCC.fromRaw(certificate);
const signatureValidity = (await this.checkKey(dcc)).valid;
const vaccineVerifier = new VaccineVerifier(await this.ruleDownloader.getRules());
result = {signature:{valid: signatureValidity}, valid: vaccineVerifier.checkCertifcate(dcc.payload), info:{identity:dcc.payload.nam,dob:dcc.payload.dob}};
} catch (error) {
console.log(error);
2021-09-27 18:54:27 +02:00
result = {signature:{valid: false}, valid:{valid:false, message:'nd'}, info:{identity:{fnt:'nd',fn:'nd',gnt:'nd',gn:'nd'},dob:'nd'}};
2021-09-26 20:00:33 +02:00
}
2021-09-23 17:17:00 +02:00
return result;
2021-09-23 15:38:13 +02:00
}
2021-09-25 14:15:49 +02:00
async checkKey(dcc:DCC):Promise<{valid:boolean, key?:string}>{
const publicCertificateCollection = await this.certDownloader.getCertificates();
const result = {valid:false, key: ''};
for(const tupla of publicCertificateCollection){
try {
const cECDSA = (jsrsasign.KEYUTIL
.getKey('-----BEGIN CERTIFICATE-----\n' + tupla.certificate+ '-----END CERTIFICATE-----') as jsrsasign.KJUR.crypto.ECDSA).getPublicKeyXYHex();
const signCheckResult = await dcc.checkSignature(cECDSA);
if(signCheckResult){
result.valid = true;
result.key = tupla.kid;
break;
}
} catch (error) {
if(error.message != 'Signature missmatch')
console.log(error); //to silence the errors
}
}
return result;
}
2021-09-23 15:38:13 +02:00
}