Я пытаюсь реализовать webauthn, но не могу заставить работать проверку подписи. Согласно https://w3c.github.io/webauthn/#verifying-assertion Я должен проверить подпись по следующим данным:
authData || sha256 (clientDataJSON)
AuthData и хэш sha256 должны быть «двоично объединены». Я понятия не имею, что именно они имеют в виду, но предполагаю, что они просто имеют в виду поставить байты рядом друг с другом, хотя понятия не имею, что именно будет «двоичным» в этом отношении.
Итак, учитывая аттестацию PublicKeyCredential с именем, я могу сгенерировать данные, на основе которых создается подпись, следующим образом:
var auth_data = new Uint8Array(attestation.response.authenticatorData);
var data_hash = sha256(new Uint8Array(attestation.response.clientDataJSON));
var signed = new Uint8Array(auth_data.length + data_hash.length);
signed.set(auth_data);
signed.set(data_hash, auth_data.length);
Я, конечно, пробовал проверить это «подписанное» значение напрямую, и я тоже пробовал его хешировать. Ни один из них не подтверждает. Что я делаю неправильно при вычислении подписанных данных?
У меня есть эквивалентный код на стороне сервера (на C ++), где я создаю то же значение, а затем проверяю его с помощью OpenSSL. Этот подписанный расчет предназначен только для того, чтобы показать, что я делаю - я, конечно, не буду доверять этому значению на стороне сервера.