Как создать JavaScript ArrayBuffer, который похож на ArrayBuffer WebAuthN? - PullRequest
0 голосов
/ 12 октября 2018

В настоящее время я пишу проверочное веб-приложение для интеграции WebAuthN (FIDO U2F, FIDO2).

Тип данных возвращаемого поля cred.rawId равен ArrayBuffer.В консоли разработчика Chromes это поле отображается следующим образом:

Chromes' developer console view on original cred.rawId data

Когда я пытаюсь воспроизвести этот ArrayBuffer, я получаю следующее:

Chromes' developer console view on own rawId implementation

Обратите внимание на «другие представления» (например, [[Int8Array]]), которые все обнулены!Кроме того, мой ArrayBuffer выглядит как обычный массив, в то время как данные не отображаются (таким образом) на первом оригинальном скриншоте.

Это исходный код (помните: состояние PoC) для получения rawId из сохраненного представления Base64:

function StringToByteArray(str) {
  var bytes = new ArrayBuffer();
  for (var i = 0; i < str.length; ++i) {
    var code = str.charCodeAt(i);
    var _bytes = new ArrayBuffer(bytes.byteLength + 1);
    for ( var j = 0; j < bytes.byteLength; j++ ) {
      _bytes[j] = bytes[j];
    }
    _bytes[bytes.byteLength] = code;
    bytes = _bytes
  }
  return bytes;
}

var x_rawId = StringToByteArray(base64.decode(cred.id.replace(/-/g, '+').replace(/_/g, '/').padRight(cred.id.length + (4 - cred.id.length % 4) % 4, '=')));

Класс Base64 из Ника Basebreaths Base64 для реализации JavaScript .

Текущий rawId может работать, однакоЯ хотел бы воспроизвести его на 100%, чтобы свести к минимуму вероятность его сбоя в другом браузере в какой-либо будущей версии браузера.

Как добиться представления, показанного на скриншоте Chrome?

1 Ответ

0 голосов
/ 29 мая 2019

Не могли бы вы попробовать заменить эту функцию следующим образом:

function StringToByteArray(str) {
  return Uint8Array.from(str, c => c.charCodeAt(0));
}

Это очень просто, но это помогает мне в одном из моих проектов.

...