Re: [webauthn] Device-bound key extension (#1658)

So if I understand this correctly, a `packed` format `AttObjForDevicePublicKey` would be constructed like this?

```
AttObjForDevicePublicKey = {
  sig:     bstr,  ; result of sign((clientDataHash || userCredentialId), devicePrivateKey)
  aaguid:  bstr,  ; authenticator's AAGUID (16 bytes fixed-length)
  dpk:     bstr,  ; the Device Public Key (self-describing variable length, COSE_Key format, CBOR-encoded)).
  context: "device" / "app"

  fmt: "packed",
  attStmt: {
    alg: -7,      ; COSEAlgorithmIdentifier for attestation key pair
    sig: bstr,    ; result of sign((aaguid || dpk), attestationPrivateKey)
                  ; instead of the usual sign((authenticatorData || clientDataHash), attestationPrivateKey)
    x5c: [ attestnCert: bytes, * (caCert: bytes) ]
  }
}
```

I feel like the custom signing procedure might be a bit too confusing, being _almost_ the same as usual but not quite. It looks like this is going to require custom verification logic either way, so maybe we can move the difference around a bit? For example, here's one idea:

Instead of modifying the signing procedure arguments, run the signing procedure as usual and store the resulting attestation object and client data. In subsequent re-runs, send all of it back to the RP. So it might instead look something like this:

```
AttObjForDevicePublicKey = {
  sig:     bstr,  ; result of sign((clientDataHash || userCredentialId), devicePrivateKey)
                  ; Maybe this could also sign over attObj and/or attObjClientDataJSON.
  aaguid:  bstr,  ; authenticator's AAGUID (16 bytes fixed-length)
  dpk:     bstr,  ; the Device Public Key (self-describing variable length, COSE_Key format, CBOR-encoded)).
  context: "device" / "app"

  attObjClientDataJSON: bstr,  ; the (cached) clientDataJSON for the ceremony when dpk was created
  attObj: {                    ; the (cached) attestation object for the ceremony when dpk was created
    fmt: "packed",
    authData: bytes ;          ; the (cached) authenticator data for the ceremony when dpk was created
    attStmt: {
      alg: -7,                 ; COSEAlgorithmIdentifier for attestation key pair
      sig: bstr,               ; (cached) result of sign((authData || sha256(attObjClientDataJSON)), attestationPrivateKey)
      x5c: [ attestnCert: bytes, * (caCert: bytes) ]
    }
  }
}
```

Of course, this only moves the complexity slightly, but to me it seems a bit cleaner that the existing attestation signing and verification procedures can be used as-is as a larger unmodified "block". Composition instead of polymorphism, I guess.


-- 
GitHub Notification of comment by emlun
Please view or discuss this issue at https://github.com/w3c/webauthn/issues/1658#issuecomment-895473466 using your GitHub account


-- 
Sent via github-notify-ml as configured in https://github.com/w3c/github-notify-ml-config

Received on Monday, 9 August 2021 19:13:46 UTC