javascript - Kako dešifrirati podatke iz rezultata IE 11 operacije enkripcije koristeći AES-GCM


Uspio sam šifrirati neke podatke pomoću AES-GCM koristeći IE 11 na Windows 10, ali ne mogu dobiti da dešifriranje radi. Primjer JS koda za šifriranje:

let plainText = new Uint8Array([1]);
let key;
let keyBuf = window.msCrypto.getRandomValues(new Uint8Array(32));
let iv = window.msCrypto.getRandomValues(new Uint8Array(12));
let additionalData = window.msCrypto.getRandomValues(new Uint8Array(16));
let encResult;
let importOp = window.msCrypto.subtle.importKey('raw', 
    keyBuf,
    { name: 'AES-GCM' }, 
    false, 
    ['encrypt', 'decrypt']);
importOp.oncomplete = function(e) {
    key = e.target.result;
    let encryptOp = window.msCrypto.subtle.encrypt({
        name: 'AES-GCM',
        iv: iv,
        tagLength: 128,
        additionalData: additionalData
    }, key, plainText);
    encryptOp.oncomplete = function (e) {
        encResult = e.target.result;
    };
};

Rezultirajući predmet (encResult) je AesGcmEncryptResult, koji ima šifriranu vrijednost i oznaku u 2 različita svojstva. Koliko shvaćam, trebam ih spojiti i proslijediti kao šifrirani tekst za dešifriranje, kao u:

let cipherText = new Uint8Array(plainText.length + 16); // tagLength / 8
cipherText.set(new Uint8Array(encResult.ciphertext), 0);
cipherText.set(new Uint8Array(encResult.tag), plainText.length);
let decryptOp = window.msCrypto.subtle.decrypt({
    name: 'AES-GCM',
    iv: iv,
    tagLength: 128,
    additionalData: additionalData
}, key, cipherText);

Zatim povežem oncomplete i onerror, i onerror se pokreće. Nažalost, IE-ov Event objekt nema ništa što bi mi rekao, osim tipa="error".

Na webu postoji vrlo malo informacija o korištenju AES-GCM u IE 11.

Molim te, nemoj mi govoriti da koristim drugi preglednik. Sve ovo radi dobro (ali drugačije) na Chromeu i Firefoxu. Posebno pokušavam da ovo radi u IE 11.

Što mi nedostaje?

Odgovor #1

Pronašao sam ovu podlošku koja (nejasno) pokazuje da vrijednost oznake ide u objekt algoritma, a samo šifrirani tekst ide u treći argument. Npr.

let decryptOp = window.msCrypto.subtle.decrypt({
    name: 'AES-GCM',
    iv: iv,
    additionalData: additionalData,
    tag: new Uint8Array(encResult.tag)
    }, key, new Uint8Array(encResult.ciphertext));

Zašto je ovo bilo tako teško pronaći? Zašto ne postoje blog postovi o ovoj značajci? Zašto su MS-ova dokumentacija tako kratka na detaljima?