Skip to content

Commit 6e86c6a

Browse files
authored
Merge pull request #3 from spritz-group/develop
Release version v1.0.1
2 parents cd269de + ae102dd commit 6e86c6a

File tree

6 files changed

+71
-14
lines changed

6 files changed

+71
-14
lines changed

CHANGELOGS.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# QRFuzz Changelogs
22

3+
**v1.0.1** (2023-03-16)
4+
5+
- Re-added VerificaC19 inspector and builder from previous tests
6+
37
**v1.0.0** (2023-03-12)
48

59
- Initial public release

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ A fuzzing toolkit to test malicious QR Codes in mobile applications.
44

55
![QRFuzz banner](docs/images/qrfuzz-banner.png)
66

7-
**Current release**: v1.0.0 (2023-03-12)
7+
**Current release**: v1.0.1 (2023-03-16)
88

99
You can find toolkit updates in the [CHANGELOGS](CHANGELOGS.md) page.
1010

tools/QRCodeFuzzer/inspectors/verificac19.js

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,19 @@ class Inspector {
33
app_package = "it.ministerodellasalute.verificaC19";
44
app_activity = "it.ministerodellasalute.verificaC19.ui.SplashScreenActivity";
55

6-
// Note: only the first QR gives a different error (that is QR not recognized because does not start with the URL required).
7-
86
async goToScan(driver) {
9-
// let scan = await driver.findElement("xpath", '/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.ScrollView/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView[1]/android.view.ViewGroup[1]');
10-
11-
let scan = await driver.findElement("id", 'posteitaliane.posteapp.appbpol:id/access_qr');
7+
let scan = await driver.findElement("id", 'it.ministerodellasalute.verificaC19:id/qrButton');
128
await driver.elementClick(scan.ELEMENT);
139
}
1410

1511
async getResultView(driver) {
16-
return await driver.findElement("id", "posteitaliane.posteapp.appbpol:id/md_titleFrame");
12+
return await driver.findElement("id", "it.ministerodellasalute.verificaC19:id/certificate_valid");
1713
}
1814

1915
async goBackToScan(driver) {
20-
let ok = await driver.findElement("id", 'posteitaliane.posteapp.appbpol:id/md_buttonDefaultPositive');
21-
await driver.elementClick(ok.ELEMENT);
22-
23-
// let scan = await driver.findElement("id", 'posteitaliane.posteapp.appbpol:id/access_qr');
24-
// await driver.elementClick(scan.ELEMENT);
16+
driver.back();
17+
// let ok = await driver.findElement("id", 'it.ministerodellasalute.verificaC19:id/close_button');
18+
// await driver.elementClick(ok.ELEMENT);
2519
}
2620

2721
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
from zlib import compress
2+
from binascii import unhexlify
3+
from base45 import b45encode
4+
from flynn import encoder as flynn_encoder
5+
from flynn import decoder as flynn_decoder
6+
from cose.messages import Sign1Message
7+
from cose.headers import Algorithm, KID
8+
from cose.algorithms import EdDSA
9+
from cose.keys.curves import Ed25519
10+
from cose.keys import OKPKey
11+
from base64 import b64decode
12+
from datetime import *
13+
14+
# --------------------
15+
# Green Pass Builder for VerificaC19
16+
# Script edited from ps1dr3x (github.com/ps1dr3x/greenpass-generator)
17+
# --------------------
18+
19+
PRIVKEY = b"9d370d925476752486ab0e4a8e088228e493da12d1586fafae9f35880dbcfe03"
20+
HEADER = b""
21+
22+
yesterday = datetime.timestamp(datetime.now()) - 86400
23+
tomorrow = datetime.timestamp(datetime.now()) + (7 * 86400)
24+
25+
def get_pass(payload: str):
26+
return {payload}
27+
28+
def get_cose(data):
29+
return Sign1Message(
30+
phdr={Algorithm: EdDSA, KID: b64decode("NJpCsMLQco4=")},
31+
payload=flynn_encoder.dumps(data)
32+
)
33+
34+
def add_cose_key(msg, privkey):
35+
privkey = unhexlify(privkey)
36+
key = OKPKey(crv=Ed25519, d=privkey, optional_params={"ALG": "EDDSA"})
37+
msg.key = key
38+
return msg
39+
40+
def flynn(signed_encoded, header=b""):
41+
(_, (header_1, header_2, cbor_payload, sign)) = flynn_decoder.loads(signed_encoded)
42+
if header:
43+
header_1 = header
44+
return flynn_encoder.dumps((header_1, header_2, cbor_payload, sign))
45+
46+
def b45(msg):
47+
return b45encode(compress(msg))
48+
49+
def get_qr(p):
50+
msg = get_cose(get_pass(p))
51+
msg = add_cose_key(msg, PRIVKEY)
52+
msg = flynn(msg.encode(), HEADER)
53+
msg = b45(msg)
54+
msg = b"HC1:" + msg
55+
return msg

tools/QRCodeGenerator/qr_builder.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from app_specific.verificac19 import get_qr
12

23
class qrbuilder:
34
""" QR Builder Class
@@ -86,7 +87,7 @@ def messages(payload: str):
8687
return "https://support.google.com/messages/?p=web_computer#?c=" + payload
8788

8889
def verificac19(payload: str):
89-
return payload
90+
return get_qr(payload)
9091

9192
def line(payload: str):
9293
return payload # "https://line.me/R/ti/g/"+payload
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
qrcode~=7.4.2
2-
Pillow~=9.4.0
2+
Pillow~=9.4.0
3+
base45~=0.4.4
4+
flynn~=1.0.0b2
5+
cose~=0.9.dev8

0 commit comments

Comments
 (0)