Merge pull request #299 from open-reception/fix/passkeys-work-with-plain-array-prf-response

Passkeys now work with plain Array prf responses
This commit is contained in:
Karl Ludwig Weise
2026-06-19 16:01:25 +02:00
committed by GitHub
+24 -32
View File
@@ -251,21 +251,31 @@ export const getPRFOutputAfterRegistration = async ({
} }
// PRF output is BufferSource, ensure we return ArrayBuffer // PRF output is BufferSource, ensure we return ArrayBuffer
const prfOutput = prfResults.results.first; return getPrfOutput(prfResults.results);
if (prfOutput instanceof ArrayBuffer) { };
return prfOutput;
} else { const getPrfOutput = (results: AuthenticationExtensionsPRFValues): ArrayBuffer => {
// Convert ArrayBufferView to ArrayBuffer const first = prfResultsToArrayBuffer(results.first);
console.log("⚠️ Detected non-ArrayBuffer PRF output, trying to convert manually"); return first.buffer;
return prfOutput.buffer.slice( };
prfOutput.byteOffset,
prfOutput.byteOffset + prfOutput.byteLength, const prfResultsToArrayBuffer = (result: BufferSource): Uint8Array<ArrayBuffer> => {
) as ArrayBuffer; if (result instanceof ArrayBuffer) {
return new Uint8Array(result);
} }
if (ArrayBuffer.isView(result)) {
return new Uint8Array(result.buffer as ArrayBuffer, result.byteOffset, result.byteLength);
}
if (Array.isArray(result)) {
console.log("⚠️ Detected non-ArrayBuffer PRF output, trying to convert manually");
return Uint8Array.from(result as number[]);
}
throw Error("PRF result is not convertible");
}; };
export type GetCredentialResponse = PublicKeyCredential & { export type GetCredentialResponse = PublicKeyCredential & {
prfOutput?: ArrayBuffer; // PRF output if enablePRF was true prfOutput?: ArrayBuffer;
}; };
export const getCredential = async ({ export const getCredential = async ({
@@ -320,27 +330,9 @@ export const getCredential = async ({
// Extract PRF output if it was enabled // Extract PRF output if it was enabled
if (enablePRF) { if (enablePRF) {
const extensionResults = credential.getClientExtensionResults() as { const extensionResults = credential.getClientExtensionResults();
prf?: { if (extensionResults.prf?.results) {
enabled?: boolean; prfOutput = getPrfOutput(extensionResults.prf.results);
results?: {
first?: BufferSource;
};
};
};
if (extensionResults.prf?.results?.first) {
const prfResult = extensionResults.prf.results.first;
// Convert BufferSource to ArrayBuffer
if (prfResult instanceof ArrayBuffer) {
prfOutput = prfResult;
} else {
console.log("⚠️ Detected non-ArrayBuffer PRF output, trying to convert manually");
prfOutput = prfResult.buffer.slice(
prfResult.byteOffset,
prfResult.byteOffset + prfResult.byteLength,
) as ArrayBuffer;
}
} }
} }