Hi @Nguyễn Văn Toàn , and thanks for posting your question.
Based on the currently published Microsoft API documentation, the requested guarantees are not defined as part of the public contract for WebAuthNPluginPerformUserVerification2.
Q1: Display-to-sign binding
WEBAUTHN_PLUGIN_USER_VERIFICATION_REQUEST_2 documents pwszDisplayHint as the text shown in the Windows Hello prompt and pbBufferToSign as the optional buffer to be signed. However, it does not state that Windows:
- Compares the displayed text with
pbBufferToSign. - Cryptographically binds
pwszDisplayHint, or its rendered representation, to the signature. - Rejects a request that displays “Transaction A” while signing bytes for “Transaction B.”
- Guarantees complete visibility or defines security-relevant behavior for truncation, scrolling, wrapping, Unicode normalization, bidirectional text, or confusable characters.
Therefore, the public documentation does not establish a WYSIWYS guarantee or protection against a malicious caller that controls both values. This does not prove that no internal association exists. It means that such an association is not documented as a supported security property.
WEBAUTHN_PLUGIN_USER_VERIFICATION_REQUEST_2 structure
Q2: Response verification and correlation
WebAuthNPluginPerformUserVerification2 returns an opaque response through ppbResponse and pcbResponse. WebAuthNPluginGetUserVerificationPublicKey provides the associated user-verification public-key buffer.
The published documentation does not normatively specify:
- The complete byte sequence authenticated by
ppbResponse. - The signature algorithm, parameters, or encoding.
- The public-key encoding.
- A supported procedure or API for independently verifying the response.
- Whether
pGuidTransactionIdis included in the cryptographically authenticated data. - Whether the response contains or binds the text actually rendered from
pwszDisplayHint.
Although pGuidTransactionId associates the user-verification request with the corresponding plugin operation at the API level, the documentation does not say that this identifier is cryptographically included in the returned response.
WebAuthNPluginPerformUserVerification2 function
WebAuthNPluginGetUserVerificationPublicKey function
WebAuthNPluginFreeUserVerificationResponse function
WEBAUTHN_PLUGIN_OPERATION_REQUEST structure
The available public documentation is insufficient to confirm that this API provides exact-operation human confirmation, display-to-sign binding, or cryptographic correlation among pwszDisplayHint, pbBufferToSign, pGuidTransactionId, and ppbResponse.
An authoritative answer about the actual implementation requires confirmation from the Windows WebAuthn product team, specifically covering the signed-data construction, key and response formats, verification procedure, transaction-ID binding, display binding, and rendering guarantees. Until those properties are officially documented or confirmed, they should not be assumed as guarantees of the supported API contract.
If this instruction is applicable to your situation, I would greatly appreciate it if you could follow the instruction here so others experiencing similar behavior can benefit from it as well.