1 DID
1.1 Allgemeine Form
Ein Identifier (VaultysId) setzt sich zusammen aus
- einem Typ (1 Byte)
type
- einer Version (1 Byte)
v
=0
- einem Nachweis (32 Byte)
p
- einem öffentlichen Signaturschlüssel (variabel)
s
- einem öffentlichen Verschlüsselungsschlüssel (variabel)
e
1.1.1 Serialisierung und Deserialisierung
Wir verwenden die Serialisierung von messagepack
. MessagePack ist eine Art JSON-Kompressor https://msgpack.org/. Die Wahl dieses Designs basiert auf folgenden Überlegungen:
- Wir benötigen keinen sehr kleinen Footprint für die Daten, da die Speichergröße kein Problem darstellt.
- Wir möchten freundlich genug für Implementierungen von Dritten sein, vor allem.
- Diese Serialisierung wird auch für saltpack https://saltpack.org/ verwendet, um verschlüsselte Daten zu streamen, und dies kann für den Verschlüsselungsteil genutzt werden.
Einschränkungen: Die Implementierung kann variieren, d.h. die VaultysId kann variieren, wenn eine andere Implementierung verwendet wird. Es ist auch möglich, einige Teile der MessagePack-Daten zu ändern und dennoch zu den gleichen Daten zu deserialisieren. (siehe Tests)
VaultysId = type | messagepack({v, p, s, e})
Die Reihenfolge der Parameter des Message Packs ist wichtig, da sie die Definition der Fingerprinting beeinflussen kann.
Fingerabdrücke können von der Message-Pack-Implementierung abhängen.
Fingerabdrücke sollten NIEMALS auf Protokollebene verwendet werden. Sie können als Möglichkeit verwendet werden, eine Liste von VaultysId zu indizieren. Es wird nicht empfohlen, Fingerabdrücke als Schlüsselaustauschverifikation zu verwenden (wie beim PGP-Schlüsselaustausch).
1.1.2 Fingerabdruck
Fingerabdruck = die ersten 40 Zeichen von sha256(VaultysId)
1.1.3 DiD
Dezentrale ID = did:vaultys:<Fingerabdruck>
1.1.4 Geheimnis
Zur Sicherung von VaultysId-Geheimnissen wird die folgende Serialisierung verwendet
secret = type | messagepack({v, p, ss, se})
wobei:
ss
das Geheimnis des öffentlichen Schlüsselss
istse
das Geheimnis des öffentlichen Schlüsselse
ist
2.2 Definierter Typ
Es gibt 3 definierte Typen im aktuellen Stand des Protokolls
type
= 0
: Identifizierung eines Geräts (Server, Computer etc...)
type
= 1
: Identifizierung einer Person.
type
= 3
: Identifizierung einer Person über ein Fido2-Gerät.
1.2.1 Typ 3 Serialisierungen
Da es kein Konzept des Nachweises für Fido2 gibt, sind die folgenden Parameter festgelegt:
p
= 0000...0000s
= COSE-PublicKey, wie von der Fido2-Attestation extrahierte
wird generiert nicht vom Fido2-Gerät behandelt
Da es kein Backup vom Fido2-Gerät gibt, wie von der Zertifizierung empfohlen, wird das folgende Geheimnis verwendet, um die VaultysId auf verschiedenen Geräten zu übertragen:
secret = type | messagepack({v, fid, t, s, se})
wobei:
fid
ist die Fido2-ID, die bei der Attestation bei der Erstellung vergeben wirdt
ist der Webauthn Transport, der zum Verbinden mit dem Gerät verwendet wird (um einen komplexen UI-Handling für die Webauthn-Schnittstelle zu verhindern).t = hybrid | ble | nfc | usb
Die Begriffehybrid
,ble
,nfc
,usb
sind in den Fido2-Spezifikationen zu finden. zum Beispiel bedeutet t =0011
, dass das Fido2-Gerät nur über die NFC- und USB-Transporte erreicht werden kann
Zu Informationszwecken wird unsere Implementierung für die Attestationserstellung mit den folgenden Parametern verwendet:
navigator.credentials.create({
publicKey: {
challenge: randomBytes(32),
rp: {
name: "Vaultys ID",
},
user: {
id: Buffer.from("Vaultys ID", "utf-8"),
name: "Vaultys ID",
displayName: "Vaultys Wallet ID",
},
attestation: safari ? "none" : "direct",
authenticatorSelection: {
authenticatorAttachment: "cross-platform",
userVerification: "preferred"
},
pubKeyCredParams: [
{
"type": "public-key",
"alg": -7, // P256
},
{
"type": "public-key",
"alg": -8, // Ed25519/EdDSA
},
]
}
})
1.2.2 Typ 3 Signaturen
Webauthn-Signaturen haben ihr eigenes Payload, wir verwenden Attestation für