From bae841ebd50f6a0e91d579943524c64ca38ba014 Mon Sep 17 00:00:00 2001 From: Phil Seeley Date: Tue, 16 Jun 2020 21:20:28 +1000 Subject: [PATCH] Updated README. --- README.md | 22 +++++++----------- .../{ => screenshots}/app-add-card-icon.png | Bin .../{ => screenshots}/app-list-cards-icon.png | Bin examples/{ => screenshots}/app-list-cards.png | Bin .../{ => screenshots}/app-qrcode-data.png | Bin .../{ => screenshots}/app-qrcode-expired.png | Bin .../screenshots/app-qrcode-unverified.png | Bin 0 -> 19544 bytes examples/{ => screenshots}/app-qrcode.png | Bin examples/{ => screenshots}/app-scan-icon.png | Bin 9 files changed, 9 insertions(+), 13 deletions(-) rename examples/{ => screenshots}/app-add-card-icon.png (100%) rename examples/{ => screenshots}/app-list-cards-icon.png (100%) rename examples/{ => screenshots}/app-list-cards.png (100%) rename examples/{ => screenshots}/app-qrcode-data.png (100%) rename examples/{ => screenshots}/app-qrcode-expired.png (100%) create mode 100644 examples/screenshots/app-qrcode-unverified.png rename examples/{ => screenshots}/app-qrcode.png (100%) rename examples/{ => screenshots}/app-scan-icon.png (100%) diff --git a/README.md b/README.md index 0d1348e..4efcbb7 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # ECard - Electronic Club Membership Cards -ECards are digitally signed QR Codes for club membership cards. Because they are digitally signed, they can be scanned for verification using the ECard Android or iPhone app. +ECards are digitally signed QR Codes for club membership cards. They are digitally signed, so they can be scanned for verification using the ECard Android or iPhone app. ## Generating Public/Private Key Pairs @@ -26,9 +26,7 @@ The stamp image is added to all issued ecards and shown when a QR Code if verifi ## Generate Signed QR Code ECards -Once you have your keys, you can issue ecards. The data in an ecard consists of name/value -pairs, one per line and separated by a ":". Any names and values can be used, but special -processing is performed if the name represents a data in the form **YYYY-MM-DD** and the card is considered expired if the value is **"Expires"**. For example the file **joe-blogs.txt** could contain: +Once you have your keys, you can issue ecards. The data in an ecard consists of name/value pairs, one per line and separated by a ":". Any names and values can be used, but special processing is performed if the name represents a date in the form **YYYY-MM-DD** and the card is considered expired if the value is **"Expires"**. For example the file **joe-blogs.txt** could contain: ``` Member#:1234 2021-08-21:Expires @@ -68,18 +66,16 @@ The **.ecard** can be loaded into the ECard phone app for display, but also to e **Note:** you must load an **.ecard** into the phone app in order to verify QR Codes for that club. -After emailing the **.ecard**, save to the phone and then load into the ECard app through the ![](./examples/app-list-cards-icon.png) and ![](./examples/app-add-card-icon.png) buttons: +After receiving your **.ecard** by email, save it to your phone and then load it into the ECard app through the ![](./examples/screenshots/app-list-cards-icon.png) and ![](./examples/screenshots/app-add-card-icon.png) buttons. If you have added than one ECard, you can select which ECard is displayed when the app is opened: -![](./examples/app-list-cards.png) +![](./examples/screenshots/app-list-cards.png) -Selecting the imported ecard will display its QR Code: +Selecting the imported ECard will display its QR Code and if you press and hold the QR Code its data will be displayed, with any expired items marked with an **X**: -![](./examples/app-qrcode.png) +![](./examples/screenshots/app-qrcode.png) ![](./examples/screenshots/app-qrcode-data.png) -If you press and hold the QR Code its data will be displayed: +Once you have loaded an **.ecard** into the app, you can then use the ![](./examples/screenshots/app-scan-icon.png) button to scan and verify other QR Codes: -![](./examples/app-qrcode-data.png) +![](./examples/screenshots/app-qrcode-expired.png) ![](./examples/screenshots/app-qrcode-unverified.png) -Once you have loaded a **.ecard** into the app, you can then use the ![](./examples/app-scan-icon.png) button to scan and verify other QR Codes: - -![](./examples/app-qrcode-expired.png) +An **Expired** result indicates that the signature was correctly verified, but the ECard has expired. An **Unverified** result indicates that either no signature was found or the data has been modified since the ECard was issued. \ No newline at end of file diff --git a/examples/app-add-card-icon.png b/examples/screenshots/app-add-card-icon.png similarity index 100% rename from examples/app-add-card-icon.png rename to examples/screenshots/app-add-card-icon.png diff --git a/examples/app-list-cards-icon.png b/examples/screenshots/app-list-cards-icon.png similarity index 100% rename from examples/app-list-cards-icon.png rename to examples/screenshots/app-list-cards-icon.png diff --git a/examples/app-list-cards.png b/examples/screenshots/app-list-cards.png similarity index 100% rename from examples/app-list-cards.png rename to examples/screenshots/app-list-cards.png diff --git a/examples/app-qrcode-data.png b/examples/screenshots/app-qrcode-data.png similarity index 100% rename from examples/app-qrcode-data.png rename to examples/screenshots/app-qrcode-data.png diff --git a/examples/app-qrcode-expired.png b/examples/screenshots/app-qrcode-expired.png similarity index 100% rename from examples/app-qrcode-expired.png rename to examples/screenshots/app-qrcode-expired.png diff --git a/examples/screenshots/app-qrcode-unverified.png b/examples/screenshots/app-qrcode-unverified.png new file mode 100644 index 0000000000000000000000000000000000000000..add526fd15dfd1a161b549f530f990106a8af6a4 GIT binary patch literal 19544 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 literal 0 HcmV?d00001 diff --git a/examples/app-qrcode.png b/examples/screenshots/app-qrcode.png similarity index 100% rename from examples/app-qrcode.png rename to examples/screenshots/app-qrcode.png diff --git a/examples/app-scan-icon.png b/examples/screenshots/app-scan-icon.png similarity index 100% rename from examples/app-scan-icon.png rename to examples/screenshots/app-scan-icon.png