Как импортировать Base64 PublicKey через WebCrypto "importKey" в сценарии ReactJS? - PullRequest
0 голосов
/ 25 мая 2019

Я пытаюсь импортировать Base64 PublicKey с помощью функции API-ключа Web Crypto importKey. Цель состоит в том, чтобы создать простой модал для парсинга PublicKey и включения шифрования пароля.

Я пытался импортировать PublicKey как Uint8Array, используя метод «raw» для функции importKey - см. Скрипт ниже:

import buffer from 'buffer'

let kpub = "U6uvqoxXGj17tFS5C05tSWohDQl2u1ugiHyNKXB9WF0UiYaxa5FxiLX/LxGeDUPMyLmWBGBUjpTzh1owF9RWug=="
let buff = new Buffer(kpub, 'base64');  

window.crypto.subtle.importKey(
  "raw",  
  buff,
  {    
      name: "ECDH",
      namedCurve: "P-256", 
  },
  false,  
  []  
)
.then(function(publicKey){
  console.log(publicKey);
})
.catch(function(err){
  console.error(err);
});

Я ожидал, что это создаст импортированную версию ввода, kpub. Однако вывод не отображается в консоли - и когда обработка ошибок включена, вместо этого я получаю DOMException.

Есть идеи, какую часть я делаю не так?

В качестве альтернативы может быть проще преобразовать publicKey в формат JWK. В качестве примера я подтвердил, что приведенный ниже JWK работает так, как задумано в функции importKey. Однако, если я буду использовать это, я буду бороться с тем, как преобразовать мой входной kpub в координаты x и y:

const jwkKey = {
  "kty":"EC",
  "crv":"P-256",
  "x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU",
  "y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0",
  "kid":"Id that can be uniquely Identified"
}

Любая помощь очень ценится.

1 Ответ

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

С некоторой помощью Дмитрия Честных я заработал, добавив один байт, 0x04:

const device_kpub_base64 = "U6uvqoxXGj17tFS5C05tSWohDQl2u1ugiHyNKXB9WF0UiYaxa5FxiLX/LxGeDUPMyLmWBGBUjpTzh1owF9RWug=="
const prepend_byte = new Buffer([4])
let device_kpub_buffer = new Buffer(device_kpub_base64, 'base64');  
device_kpub_buffer = Buffer.concat([prepend_byte, device_kpub_buffer])

// Import the device public key into the web crypto API
window.crypto.subtle.importKey(
  "raw",  
  device_kpub_buffer,
  {    
      name: "ECDH",
      namedCurve: "P-256", 
  },
  true,  
  []  
)
.then(function(devicePublicKey){
  console.log(devicePublicKey);
})
.catch(function(err){
  console.error(err);
});
...