Zum Hauptinhalt springen

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})

Warnung

 Die Reihenfolge der Parameter des Message Packs ist wichtig, da sie die Definition der Fingerprinting beeinflussen kann.

Warnung

Fingerabdrücke können von der Message-Pack-Implementierung abhängen.

Warnung

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üssels s ist
  • se das Geheimnis des öffentlichen Schlüssels e 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...0000
  • s = COSE-PublicKey, wie von der Fido2-Attestation extrahiert
  • e 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 wird
  • t 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 Begriffe hybrid, 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