mirror of
https://github.com/gchq/CyberChef.git
synced 2025-05-09 07:45:00 -04:00
Added SHC Operation
This commit is contained in:
parent
84011371b7
commit
5dc13c2f44
4 changed files with 199 additions and 1 deletions
|
@ -118,7 +118,8 @@
|
||||||
"Multiple Bombe",
|
"Multiple Bombe",
|
||||||
"Typex",
|
"Typex",
|
||||||
"Lorenz",
|
"Lorenz",
|
||||||
"Colossus"
|
"Colossus",
|
||||||
|
"From SHC"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
73
src/core/operations/FromSHC.mjs
Normal file
73
src/core/operations/FromSHC.mjs
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
/**
|
||||||
|
* @author marx314 [shc_gchq@maubry.ca]
|
||||||
|
* @copyright Crown Copyright 2021
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
import Operation from "../Operation.mjs";
|
||||||
|
import RawInflate from "./RawInflate.mjs";
|
||||||
|
import JSONBeautify from "./JSONBeautify.mjs";
|
||||||
|
import {fromBase64} from "../lib/Base64.mjs";
|
||||||
|
import Utils from "../Utils.mjs";
|
||||||
|
import OperationError from "../errors/OperationError.mjs";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* From SHC operation
|
||||||
|
*/
|
||||||
|
class FromSHC extends Operation {
|
||||||
|
/**
|
||||||
|
* FromSHC constructor
|
||||||
|
*/
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.name = "From SHC";
|
||||||
|
this.module = "Default";
|
||||||
|
this.description = "Smart Health Card reader";
|
||||||
|
this.infoURL = "https://github.com/smart-on-fhir/health-cards/blob/main/docs/index.md";
|
||||||
|
this.inputType = "string";
|
||||||
|
this.outputType = "string";
|
||||||
|
this.args = [
|
||||||
|
{
|
||||||
|
name: "Include header and signature",
|
||||||
|
type: "boolean",
|
||||||
|
value: false
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} input
|
||||||
|
* @param {Object[]} args
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
run(input, args) {
|
||||||
|
let jws = input
|
||||||
|
.match(/^shc:\/(.+)$/)[1]
|
||||||
|
.match(/(..?)/g)
|
||||||
|
.map((num) => String.fromCharCode(parseInt(num, 10) + 45))
|
||||||
|
.join("");
|
||||||
|
let header = fromBase64(jws.split(".")[0], "A-Za-z0-9-_");
|
||||||
|
let payload = fromBase64(jws.split(".")[1], "A-Za-z0-9-_", "byteArray");
|
||||||
|
let decompressPayload = this.rawInflate(payload);
|
||||||
|
|
||||||
|
let output = decompressPayload;
|
||||||
|
if (args[0]) {
|
||||||
|
output = '{"header": ' + finalHeader + ',\
|
||||||
|
"payload":' + decompressPayload + ',\
|
||||||
|
"signature":"' + jws.split(".")[2] + '"\
|
||||||
|
}';
|
||||||
|
}
|
||||||
|
|
||||||
|
return (new JSONBeautify).run(output,[" ", false]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} input
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
rawInflate(input) {
|
||||||
|
return Utils.arrayBufferToStr((new RawInflate()).run(input, [0, 0, "Adaptive", false, false]))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default FromSHC;
|
|
@ -107,6 +107,7 @@ import "./tests/CBORDecode.mjs";
|
||||||
import "./tests/JA3Fingerprint.mjs";
|
import "./tests/JA3Fingerprint.mjs";
|
||||||
import "./tests/JA3SFingerprint.mjs";
|
import "./tests/JA3SFingerprint.mjs";
|
||||||
import "./tests/HASSH.mjs";
|
import "./tests/HASSH.mjs";
|
||||||
|
import "./tests/SHC.mjs";
|
||||||
|
|
||||||
|
|
||||||
// Cannot test operations that use the File type yet
|
// Cannot test operations that use the File type yet
|
||||||
|
|
123
tests/operations/tests/SHC.mjs
Normal file
123
tests/operations/tests/SHC.mjs
Normal file
|
@ -0,0 +1,123 @@
|
||||||
|
/**
|
||||||
|
* From SHC tests.
|
||||||
|
*
|
||||||
|
* @author marx314 [shc_gchq@maubry.ca]
|
||||||
|
* @copyright Crown Copyright 2021
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
import TestRegister from "../../lib/TestRegister";
|
||||||
|
|
||||||
|
TestRegister.addTests([
|
||||||
|
{
|
||||||
|
name: "From SHC generate a valid payload - https://spec.smarthealth.cards/examples/example-00-g-qr-code-0.svg",
|
||||||
|
input: "shc:/5676290952432060346029243740446031222959532654603460292540772804336028702864716745222809286133314564376531415906402203064504590856435503414245413640370636654171372412363803043756220467374075323239254334433260573601064529355312367424324250386141547003645474640706331045282136072860542825105427697726093250225676655259316356503461275469226467100766377324775050503308771062272722220603303605756952660766226861633827043024066838764123257672116206447426227138617560582031575336767242635041383126644166696268442531360662320923586171121250327306267339703422210328126912354261621050632463101209293600406306445806532063392023630638036574455577123629535203100643075960247667074343454103300773274377565809580974292635034425330864000623563032087536276361602745763659562428054062116461320405212811272200694065743223742150627575092375063022055628332968367775070903583944691061662255030634332706503411304224104011225567732373452630424231113760046670645969647243613861436145774454503007082967612764723577582257642129686440556561717203753673713572622806274403756677501135734075734168403559076853695231723061435524402363621223403008600654742723724429704507112127437110062222297325296176257054126353532409312958427234374143715753230335102843684528356134750327287732554209723105103644452364076905355803103840252540667327670305590657213968733238772339535045443533006311067234303364554473016258627227424520202406236458553705005976557343442472214232334457607426612473586868254269402028434262110437672108247239395369110845362854715845203405243705290759637141296658",
|
||||||
|
expectedOutput: `{
|
||||||
|
"iss": "https://spec.smarthealth.cards/examples/issuer",
|
||||||
|
"nbf": 1630616666.128,
|
||||||
|
"vc": {
|
||||||
|
"type": [
|
||||||
|
"https://smarthealth.cards#health-card",
|
||||||
|
"https://smarthealth.cards#immunization",
|
||||||
|
"https://smarthealth.cards#covid19"
|
||||||
|
],
|
||||||
|
"credentialSubject": {
|
||||||
|
"fhirVersion": "4.0.1",
|
||||||
|
"fhirBundle": {
|
||||||
|
"resourceType": "Bundle",
|
||||||
|
"type": "collection",
|
||||||
|
"entry": [
|
||||||
|
{
|
||||||
|
"fullUrl": "resource:0",
|
||||||
|
"resource": {
|
||||||
|
"resourceType": "Patient",
|
||||||
|
"name": [
|
||||||
|
{
|
||||||
|
"family": "Anyperson",
|
||||||
|
"given": [
|
||||||
|
"John",
|
||||||
|
"B."
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"birthDate": "1951-01-20"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fullUrl": "resource:1",
|
||||||
|
"resource": {
|
||||||
|
"resourceType": "Immunization",
|
||||||
|
"status": "completed",
|
||||||
|
"vaccineCode": {
|
||||||
|
"coding": [
|
||||||
|
{
|
||||||
|
"system": "http://hl7.org/fhir/sid/cvx",
|
||||||
|
"code": "207"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"patient": {
|
||||||
|
"reference": "resource:0"
|
||||||
|
},
|
||||||
|
"occurrenceDateTime": "2021-01-01",
|
||||||
|
"performer": [
|
||||||
|
{
|
||||||
|
"actor": {
|
||||||
|
"display": "ABC General Hospital"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"lotNumber": "0000001"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"fullUrl": "resource:2",
|
||||||
|
"resource": {
|
||||||
|
"resourceType": "Immunization",
|
||||||
|
"status": "completed",
|
||||||
|
"vaccineCode": {
|
||||||
|
"coding": [
|
||||||
|
{
|
||||||
|
"system": "http://hl7.org/fhir/sid/cvx",
|
||||||
|
"code": "207"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"patient": {
|
||||||
|
"reference": "resource:0"
|
||||||
|
},
|
||||||
|
"occurrenceDateTime": "2021-01-29",
|
||||||
|
"performer": [
|
||||||
|
{
|
||||||
|
"actor": {
|
||||||
|
"display": "ABC General Hospital"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"lotNumber": "0000007"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}`,
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
op: "From SHC",
|
||||||
|
args: [false]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "From SHC empty",
|
||||||
|
input: "",
|
||||||
|
expectedOutput: "From SHC - Cannot read property '1' of null",
|
||||||
|
recipeConfig: [
|
||||||
|
{
|
||||||
|
op: "From SHC",
|
||||||
|
args: [false]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
},
|
||||||
|
]);
|
Loading…
Add table
Add a link
Reference in a new issue