When window.crypto.subtle.digest() is called before window.navigator.credentials.get(), the first time will not error but calling it a second time will. The code below shows how to reproduce. const getBtn = document.getElementById("get"); getBtn.addEventListener("click", async () => { try { /* remove the call to crypto.suble.digest and it will work without error */ const digest = await window.crypto.subtle.digest( "SHA-512", CHALLENGE_BUFFER, ) let credential = (await window.navigator.credentials.get({ publicKey: { challenge: CHALLENGE_BUFFER, timeout: 30000, userVerification: "discouraged", allowCredentials: [ { transports: ["nfc", "usb"], id: credentialId, type: "public-key", }, ], }, })) console.log({credential}) } catch (e) { alert(`error ${e.message}`) } })
<rdar://problem/92822521>
Does not reproduce on Trunk.