Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add new characteristics #3

Open
wants to merge 46 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
5c84d6a
made table columns configurable, flattened the blockchain structure
samuelmr Jun 14, 2023
5a147a1
Added new columns, added titles to column headers
samuelmr Jun 14, 2023
9318f9d
updated JSON template and instructions
samuelmr Jun 14, 2023
52fa653
print JSON template to console (commented out by default)
samuelmr Jun 14, 2023
0744561
different keyHistory and keyRotation for holders and issuers
samuelmr Jun 14, 2023
515a6a6
added new attributes
samuelmr Jun 14, 2023
9cdf1ad
updated information on existing wallets
samuelmr Jun 14, 2023
71f6fcc
Added some wallets (mostly from EBSI conformance registry
samuelmr Jun 14, 2023
01884b3
Added Findy Agency
samuelmr Jun 14, 2023
e11b9ba
Added row numbering
samuelmr Jun 14, 2023
982b1dd
Added Indicio's Holdr+ and Proven
samuelmr Jun 15, 2023
7d95d5d
Added BC Wallet
samuelmr Jun 15, 2023
9b31c6b
Updated ZADA
samuelmr Jun 15, 2023
9d555f2
Updated Talao source code
samuelmr Jun 15, 2023
b23d537
Updated Sphereon source code
samuelmr Jun 15, 2023
8aa03b2
Updated Selfkey source code
samuelmr Jun 15, 2023
9a0916f
Updated Jolocom source code
samuelmr Jun 15, 2023
589c3d0
Updated Blockcerts
samuelmr Jun 15, 2023
da0cf2f
arranged keys to match table column order
samuelmr Jun 15, 2023
14c7e2b
Added new fields: users and deployment
samuelmr Jun 15, 2023
548ea49
cleanup
samuelmr Jun 15, 2023
8bc8849
populated content for new characteristics (users, deployment)
samuelmr Jun 15, 2023
1c5453f
Added Bosch OrgWallet
samuelmr Jun 15, 2023
e45cf8d
updated JSON template
samuelmr Jun 15, 2023
8401bdb
updated template creation (removed sorting)
samuelmr Jun 15, 2023
f6f42cc
Added Dock Certs, fixed typos
samuelmr Jun 16, 2023
ca0e5e4
added Dock Wallet
samuelmr Jun 16, 2023
ef373b1
added Credible by SpruceID
samuelmr Jun 16, 2023
d878dc8
Added open in Excel link
samuelmr Jun 17, 2023
4c74708
Display all table header tooltips when header row is clicked
samuelmr Jun 19, 2023
b11a9c6
Added Lissi Agent, updated Lissi Wallet
samuelmr Jun 19, 2023
3aa4b01
updated Findy Agency
samuelmr Jun 22, 2023
6c5b75f
fixed formatting error
samuelmr Jul 21, 2023
fb894a9
Added Paradym wallet
samuelmr Jul 21, 2023
6c8b1c2
Set FindyFi as the owner of the repo
samuelmr Jul 21, 2023
2d32d14
changed sentence order
samuelmr Jul 21, 2023
df842da
Added Orbit Enterprise and Orbit Edge Wallet
samuelmr Jul 21, 2023
dbfa6b2
fixed Orbit Enterprise info
samuelmr Jul 21, 2023
1b76419
added Animo's white label wallet
samuelmr Jul 21, 2023
8df7d23
updated some Apple Wallet basics
samuelmr Jul 21, 2023
cf8220f
Added Altme contact email
samuelmr Jul 21, 2023
26c5b15
Added KayTrust contact email
samuelmr Jul 21, 2023
37a77a0
fixed MyNextID email
samuelmr Jul 21, 2023
952a49c
updated walt.id
samuelmr Sep 1, 2023
c4829b1
Update README.md
samuelmr Sep 21, 2023
d616e04
Update README.md
samuelmr Apr 23, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
114 changes: 68 additions & 46 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,70 +1,92 @@
# Overview of SSI Wallets and their Characteristics
# Overview of SSI Agents and their Characteristics

This is the repository for TNO's overview of SSI wallets. The actual overview can be found [here](https://tno-ssi-lab.github.io/wallet-overview/).
This repository is outdated. Please see the OpenWallet Foundation's [digital wallet and agent overview](https://github.com/openwallet-foundation/digital-wallet-and-agent-overviews-sig) instead.

The rendered overview can be found [here](https://FindyFi.github.io/wallet-overview/).

This is a fork of the repository for [TNO's overview of SSI wallets](https://github.com/tno-ssi-lab/wallet-overview).

## Sources
The information is aggregated from input from wallet vendors (via a [form](https://docs.google.com/forms/d/e/1FAIpQLSdM1h1n-LtbaB5ug8YEnT7pfa__2Y4ehhNobdsPdNMA63c4YQ/viewform?usp=sf_link?hl=en)), TNO internal overviews and our [IIW/RWOT work on credential profiles](https://github.com/vcstuff/credential-profile-comparison).
The original information was aggregated byt TNO from input from wallet vendors (via a [form](https://docs.google.com/forms/d/e/1FAIpQLSdM1h1n-LtbaB5ug8YEnT7pfa__2Y4ehhNobdsPdNMA63c4YQ/viewform?usp=sf_link?hl=en)), TNO internal overviews and the [IIW/RWOT work on credential profiles](https://github.com/vcstuff/credential-profile-comparison). More information is added by Findynet's research.

## Goal
The overview serves the following purposes:
- Issuers, verifiers and holders can use it to make a choice in wallet, based on their preferred characteristics.
- It offers insight in which wallets are interoperable with each other.
- It allows us to prioritise for which wallet a connector to our [TNO EASSI gateway](https://eassi.ssi-lab.nl/) should be developed.

See [below](#characteristics) for a description of the characteristics included.

## How to contribute
You can contribute to the overview by:
- Filling in the [form](https://docs.google.com/forms/d/e/1FAIpQLSdM1h1n-LtbaB5ug8YEnT7pfa__2Y4ehhNobdsPdNMA63c4YQ/viewform?usp=sf_link?hl=en) if you are a wallet vendor.
- Sharing this repository in your network.
- Directly contributing to the overview through forking. See [below](#modifying-json) on how to do this concretely.

<h3 id="modifying-json">Modifying <code>wallets.json </code></h3>
<h3 id="modifying-json">Modifying <code>wallets.json</code></h3>

To update the overview, you just have to update `wallets.json`. Search for your wallet and update the characteristic(s) you want to change. If you want to add a new wallet, add and fill in the [format](#format) to `wallets.json`.
To update the overview, you just have to update [wallets.json](wallets.json). Search for your wallet and update the characteristic(s) you want to change. If you want to add a new wallet, add and fill in the [format](#format) to `wallets.json`.

Note that you can't add new types of characteristics. If you feel that a new characteristic should be added, create an [issue](https://github.com/tno-ssi-lab/wallet-overview/issues/new).
Note that you can't add new types of characteristics. If you feel that a new characteristic should be added, create an [issue](https://github.com/FindyFi/wallet-overview/issues/new).

After your merge request has been accepted, you will see the updated version of the overview on the [overview page](https://tno-ssi-lab.github.io/wallet-overview/). If you want to see locally what the modified HTML looks like, open a terminal in your local copy of the repository and type `python -m http.server 8080`, then you should see the modified overview [here](http://localhost:8080/).
After your merge request has been accepted, you will see the updated version of the overview on the [overview page](https://FindyFi.github.io/wallet-overview/). If you want to see locally what the modified HTML looks like, open a terminal in your local copy of the repository and type `python -m http.server 8080`, then you should see the modified overview [here](http://localhost:8080/).

<h3 id="format">Format</h3>

If you want to add/change the logo, add the logo to `wallet-overview/static/` and change `"logo": "static/<your-wallet>.png"`.

{
"blockchain": {
"used": "",
"type": "",
"purpose": ""
},
"company": "",
"connectionTypes": "",
"credExchangeProtocol": "",
"credentialFormat": "",
"cryptoAgility": "",
"deepLinking": "",
"eassi": "",
"encodingScheme": "",
"hardwareSupport": "",
"identifierHolder": "",
"identifierIssuer": "",
"keyHistoryHolder": "",
"keyHistoryIssuer": "",
"keyRotationHolder": "",
"keyRotationIssuer": "",
"logo": "",
"name": "",
"observability": "",
"offlineFriendly": "",
"openSource": "",
"peer2peerProtocols": "",
"postQuantumSecure": "",
"predicates": "",
"revocationAlgorithm": "",
"selectiveDisclosure": "",
"signatureAlgorithm": "",
"verifierUnlinkability": ""
},
If you want to add/change the logo, add the logo to [static/](static/) and change `"logo": "static/<your-wallet>.png"`.

Descriptions of fields can be seen on the [overview page](https://FindyFi.github.io/wallet-overview/) or in [script.js](script.js).

```json
{
"logo": "",
"name": "",
"company": "",
"scope": "",
"users": "",
"deployment": "",
"isHolderWallet": "",
"isIssuerAgent": "",
"isVerifierAgent": "",
"connectionTypes": "",
"peer2peerProtocols": "",
"credExchangeProtocol": "",
"selectiveDisclosure": "",
"predicates": "",
"identifierHolder": "",
"identifierIssuer": "",
"revocationAlgorithm": "",
"verifierUnlinkability": "",
"observability": "",
"keyHistoryHolder": "",
"keyRotationHolder": "",
"keyHistoryIssuer": "",
"keyRotationIssuer": "",
"transferability": "",
"credentialFormat": "",
"encodingScheme": "",
"signatureAlgorithm": "",
"cryptoAgility": "",
"hardwareSupport": "",
"postQuantumSecure": "",
"blockchainUsed": "",
"blockchainType": "",
"blockchainPurpose": "",
"deepLinking": "",
"offlineFriendly": "",
"support": "",
"license": "",
"openSource": "",
"sourceCode": "",
"api": "",
"eassi": "",
"ebsi": "",
"website": "",
"appstore": "",
"googlePlay": "",
"webApp": "",
"email": "",
"supportEmail": ""
}
```

<h3 id="characteristics">Characteristics</h3>

Expand All @@ -76,7 +98,7 @@ The characteristics included are listed [above](#format). Here we will give a sh

**deepLinking** allows for sending the user to the wallet app instead of to a website, such that the user can have a mobile-only workflow.

**eassi** is whether the wallet connected to our [TNO EASSI gateway](https://eassi.ssi-lab.nl/).
**eassi** is whether the wallet connected to [TNO EASSI gateway](https://eassi.ssi-lab.nl/).

**hardwareSupport** is about whether the signature algorithm(s) is implemented in a commonly used cryptographic hardware modules, such as HSMs, TEEs, etc.

Expand Down
72 changes: 33 additions & 39 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,45 +15,39 @@
</head>
<body>
<h1>Wallet Overview</h1>
<div class="tableFixHead">
<table id="myTable">
<thead>
<tr>
<th>Image</th>

<!-- <th onclick="sortTable(1)">Wallet <i class="fa-solid fa-sort"></i></th> -->
<th>Wallet<button class="btn" onclick="sortTable(1)"><i class="fa-solid fa-sort"></i></button></th>
<th>Company<button class="btn" onclick="sortTable(2)"><i class="fa-solid fa-sort"></i></button></th>
<th>Open Source<button class="btn" onclick="sortTable(3)"><i class="fa-solid fa-sort"></i></button></th>
<th>Connected to TNO EASSI<button class="btn" onclick="sortTable(4)"><i class="fa-solid fa-sort"></i></button></th>
<th>Credential Format<button class="btn" onclick="sortTable(5)"><i class="fa-solid fa-sort"></i></button></th>
<th>Encoding Scheme<button class="btn" onclick="sortTable(6)"><i class="fa-solid fa-sort"></i></button></th>
<th>Signature Algorithm<button class="btn" onclick="sortTable(7)"><i class="fa-solid fa-sort"></i></button></th>
<th>Holder Identifier<button class="btn" onclick="sortTable(8)"><i class="fa-solid fa-sort"></i></button></th>
<th>Issuer Identifier<button class="btn" onclick="sortTable(9)"><i class="fa-solid fa-sort"></i></button></th>
<th>Revocation Algorithm<button class="btn" onclick="sortTable(10)"><i class="fa-solid fa-sort"></i></button></th>
<th>Peer-to-Peer Protocol<button class="btn" onclick="sortTable(11)"><i class="fa-solid fa-sort"></i></button></th>
<th>Blockchain Used<button class="btn" onclick="sortTable(12)"><i class="fa-solid fa-sort"></i></button></th>
<th>Blockchain Type<button class="btn" onclick="sortTable(13)"><i class="fa-solid fa-sort"></i></button></th>
<th>Blockchain Purpose<button class="btn" onclick="sortTable(14)"><i class="fa-solid fa-sort"></i></button></th>
<th>Credential Exchange Protocol<button class="btn" onclick="sortTable(15)"><i class="fa-solid fa-sort"></i></button></th>
<th>Connection Type<button class="btn" onclick="sortTable(16)"><i class="fa-solid fa-sort"></i></button></th>
<th>Deep Linking<button class="btn" onclick="sortTable(17)"><i class="fa-solid fa-sort"></i></button></th>
<th>Offline Friendliness<button class="btn" onclick="sortTable(18)"><i class="fa-solid fa-sort"></i></button></th>
<th>Selective Disclosure<button class="btn" onclick="sortTable(19)"><i class="fa-solid fa-sort"></i></button></th>
<th>Predicates<button class="btn" onclick="sortTable(20)"><i class="fa-solid fa-sort"></i></button></th>
<th>Verifier Unlinkability<button class="btn" onclick="sortTable(21)"><i class="fa-solid fa-sort"></i></button></th>
<th>Crypto Agility<button class="btn" onclick="sortTable(22)"><i class="fa-solid fa-sort"></i></button></th>
<th>Post-Quantum Secure<button class="btn" onclick="sortTable(23)"><i class="fa-solid fa-sort"></i></button></th>
</tr>
</thead>
<tbody id="data-output">
<noscript>Javascript required.</noscript>
<div class="tableFixHead">
<table id="myTable">
<thead id="table-headers">
</thead>
<tbody id="data-output">
<!-- Wallets from javascript file in here. -->
</tbody>
</table>
</div>
</tbody>
</table>
</div>

<script>

const dType = 'application/vnd.ms-excel'
const fName = 'wallet-overview.xls'
const tbl = document.getElementById('myTable')
const a = document.createElement('a')
a.appendChild(document.createTextNode('Open in Excel'))
a.className = 'download'
a.download = fName
a.href = `data:${dType}, ${tbl.outerHTML.replace(/ /, '%20')}`
a.onclick = function(e) {
const tableData = tbl.outerHTML.replace(/<img[^>]*src="([^"]*)"[^>]*>/g, '$1')
this.href = `data:${dType},${encodeURIComponent(tableData)}`
}
a.onmousedown = function(e) {
this.classList.add('clicked')
}
a.onmouseup = a.onblur = function(e) {
this.classList.remove('clicked')
}
tbl.parentNode.insertBefore(a, tbl)

<script>
function sortTable(n) {
var table, rows, switching, i, x, y, shouldSwitch, dir, switchcount = 0;
table = document.getElementById("myTable");
Expand Down Expand Up @@ -108,7 +102,7 @@ <h1>Wallet Overview</h1>
}
}
}
</script>
<script src="script.js"></script> <!-- Link to the javascript file -->
</script>
<script src="script.js"></script> <!-- Link to the javascript file -->
</body>
</html>
132 changes: 95 additions & 37 deletions script.js
Original file line number Diff line number Diff line change
@@ -1,45 +1,103 @@
const columns = {
logo: {header: 'Logo', title: '', type: 'img', class: ''},
name: {header: 'Wallet', title: ''},
company: {header: 'Company', title: ''},
scope: {header: 'Scope', title: 'Is there a national, industry doman, or other specific scope?', class: 'td-wrap'},
users: {header: 'Target users', title: 'Targeted for individuals, companies, developers, ...'},
deployment: {header: 'Deployment', title: 'Where it\'s run? Mobile, SaaS, self-hosted, ...'},
isHolderWallet: {header: 'Holder Wallet', title: 'Can hold and present verifiable credentials?'},
isIssuerAgent: {header: 'Issuer Agent', title: 'Can issue verifiable credentials?'},
isVerifierAgent: {header: 'Verifier Agent', title: 'Can verify verifiable credentials?'},
connectionTypes: {header: 'Connection Types', title: 'Types of connections the wallet can handle, i.e. either direct communication via QR-codes, bluetooth, etc. versus connection-based.'},
peer2peerProtocols: {header: 'Peer-to-Peer Protocols', title: ''},
credExchangeProtocol: {header: 'Credential Exchange Protocols', title: ''},
selectiveDisclosure: {header: 'Selective Disclosure', title: 'Can users present only selected attributes from their credentials?'},
predicates: {header: 'Predicates', title: ''},
identifierHolder: {header: 'Holder Identifier', title: ''},
identifierIssuer: {header: 'Issuer Identifier', title: ''},
revocationAlgorithm: {header: 'Revocation Algorithms', title: ''},
verifierUnlinkability: {header: 'Verifier Unlinkability', title: ''},
observability: {header: 'Observability', title: 'Can the verifier observe the revocation status of the credential beyond the presentation?'},
keyHistoryHolder: {header: 'Key History for Holder', title: 'Is it possible to retain and obtain the history of keys related to a certain identifier?'},
keyRotationHolder: {header: 'Key Rotation for Holder', title: 'Can the key referred to in a credential can be replaced by a new key?'},
keyHistoryIssuer: {header: 'Key History for Issuer', title: 'Is it possible to retain and obtain the history of keys related to a certain identifier?'},
keyRotationIssuer: {header: 'Key Rotation for Issuer', title: 'Can the key referred to in a credential can be replaced by a new key?'},
transferability: {header: 'Transferability', title: 'Can credentials be exported and imported into another wallet?'},
credentialFormat: {header: 'Credential Formats', title: ''},
encodingScheme: {header: 'Encoding Schemes', title: ''},
signatureAlgorithm: {header: 'Signature Algorithms', title: ''},
cryptoAgility: {header: 'Crypto Agility', title: 'Is the credential format capable of working with various signature algorithms?'},
hardwareSupport: {header: 'Hardware Support', title: 'At least one signature algorithm is implemented in a commonly used cryptographic hardware module, such as HSMs, TEEs, etc.'},
postQuantumSecure: {header: 'Post-Quantum Secure', title: 'Signatures cannot be cracked using quantum computers?'},
blockchainUsed: {header: 'Blockchain Used', title: 'Uses blockchain (always, optionally, never)?'},
blockchainType: {header: 'Blockchain Type', title: 'What kind of blockchain can be used?', class: 'td-wrap'},
blockchainPurpose: {header: 'Blockchain Purpose', title: 'The purpose of the use of the blockchain.', class: 'td-wrap'},
deepLinking: {header: 'Deep Linking', title: 'The user can be sent to the wallet app instead of to a website, such that the user can have a mobile-only workflow. For web-based wallets, ability to link directly to a specific task like credential offer.'},
offlineFriendly: {header: 'Offline Friendliness', title: 'Can be used without Internet access?'},
support: {header: 'Support', title: 'What kind of support is available (commercial, community, developer)'},
license: {header: 'License', title: 'Type of licensing (pricing model and price, open-source license)'},
openSource: {header: 'Open Source', title: 'Source code is available?'},
sourceCode: {header: 'Source code', title: 'Location of the source code', type: 'link'},
api: {header: 'API/SDK', title: 'Functionality can be enhanced using an API or an SDK'},
eassi: {header: 'Connected to TNO EASSI', title: 'Is the wallet connected to the TNO EASSI gateway (https://eassi.ssi-lab.nl/)?'},
ebsi: {header: 'EBSI conformant', title: 'Has passed EBSI conformance testing (https://ec.europa.eu/digital-building-blocks/wikis/display/EBSI/Conformant+wallets)'},
website: {header: 'Website', title: 'Site for information about the wallet', type: 'link'},
appstore: {header: 'App Store', title: 'Download link in Apple\'s App Store', type: 'link'},
googlePlay: {header: 'Google Play', title: 'Download link in Google Play store', type: 'link'},
webApp: {header: 'Web app', title: 'Launch URL for the web app', type: 'link'},
email: {header: 'Contact e-mail', title: 'Address for general and commercial enquiries', type: 'mail'},
supportEmail: {header: 'Support e-mail', title: 'Address for support requests', type: 'mail'},
}
/* the rows below display a JSON template with the keys in alphabetical order – e.g., for updating README.md */
// const template = {}
// Object.keys(columns).map(key => {template[key] = ''})
// console.log(JSON.stringify(template, null, 4))

let headerPlaceholder = document.querySelector("#table-headers")
let ths = `<tr onclick="this.classList.toggle('verbose')"><th>#</th>`
let count = 1
for (let col in columns) {
ths += `<th title="${columns[col].title}">${columns[col].header}`
if (columns[col].type != 'img') {
ths += ` <button class="btn" onclick="arguments[0]?.stopPropagation(); sortTable(${count})"><i class="fa-solid fa-sort"></i></button>`
}
ths += `</th>`
count++
}
ths += '</tr>\n'
headerPlaceholder.innerHTML = ths

fetch("wallets.json")
.then(function(response){
return response.json();
return response.json()
})
.then(function(wallets){
let placeholder = document.querySelector("#data-output");
let out = "";
let placeholder = document.querySelector("#data-output")
let out = ""
let rowCount = 0
for(let wallet of wallets){
out += `
<tr>
<td><img src='${wallet.logo}'></td>
<td>${wallet.name}</td>
<td>${wallet.company}</td>
<td>${wallet.openSource}</td>
<td>${wallet.eassi}</td>
<td>${wallet.credentialFormat}</td>
<td>${wallet.encodingScheme}</td>
<td>${wallet.signatureAlgorithm}</td>
<td>${wallet.identifierHolder}</td>
<td>${wallet.identifierIssuer}</td>
<td>${wallet.revocationAlgorithm}</td>
<td>${wallet.peer2peerProtocols}</td>
<td>${wallet.blockchain.used}</td>
<td class="td-wrap">${wallet.blockchain.type}</td>
<td class="td-wrap">${wallet.blockchain.purpose}</td>
<td>${wallet.credExchangeProtocol}</td>
<td>${wallet.connectionTypes}</td>
<td>${wallet.deepLinking}</td>
<td>${wallet.offlineFriendly}</td>
<td>${wallet.selectiveDisclosure}</td>
<td>${wallet.predicates}</td>
<td>${wallet.verifierUnlinkability}</td>
<td>${wallet.cryptoAgility}</td>
<td>${wallet.postQuantumSecure}</td>
</tr>
`;
out += `<tr><td>${++rowCount}</td>`
for (let param in columns) {
if (wallet[param] === undefined || wallet[param] === '' || wallet[param] === '-') {
out += '<td>-</td>'
continue
}
switch (columns[param].type) {
case 'img':
out += `<td><img src='${wallet[param]}'></td>`
break
case 'link':
out += `<td><a href="${wallet[param]}">${wallet[param]}</a></td>`
break;
case 'mail':
out += `<td><a href="mailto:${wallet[param]}">${wallet[param]}</a></td>`
break;
default:
out += `<td class="${columns[param].class}">${wallet[param]}</td>`
}
}
out += '</tr>\n'
}

placeholder.innerHTML = out;
});
// <td>${wallet.blockchain.type}</td>
// <td>${wallet.blockchain.purpose}</td>
// needs wrapping!
// <td style="white-space: nowrap; text-overflow:ellipsis; overflow: hidden; max-width:200px;">${wallet.encodingScheme}</td>
placeholder.innerHTML = out
})
Binary file added static/paradym-wallet.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading