Невозможно получить свойство 'message' с неопределенной или нулевой ссылкой - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь использовать API-интерфейс webcrypto для IE 11 и chrome. Я получаю ошибку Unable to get property 'message' of undefined or null reference при использовании реализации IE.

Я использую реализацию, показанную здесь https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/dev-guides/dn265046(v=vs.85).

export function verifySocketMessage(signature: string, convertedData: any, publicKey: string) {
    publicKey = publicKey.replace(/(\r\n|\n|\r)/gm, "").split("-----")[2];

    let crypto = window.crypto || (<any>window).msCrypto;

    // IE 11 implementation
    let importOp = crypto.subtle.importKey("spki",
        base64ToArrayBufferEx(publicKey),
        {
            name: "RSASSA-PKCS1-v1_5",
            hash: { name: "SHA-256" }
        },
        true, ["verify"]);

    return Promise.resolve(importOp).then((key) => {
        let keyRes;
        key.oncomplete = (e) => {
            keyRes = e.target.result;
            console.log("onComplete", keyRes);

            let verifyOp = crypto.subtle.verify("RSASSA-PKCS1-v1_5",
                keyRes, base64ToArrayBufferEx("signature"), strToAB("convertedData"));

            console.log("verifyOp", verifyOp); // This contains the error

            return Promise.resolve(verifyOp).then(verified => {
                console.log("in verified", verified);
                verified.onerror = (err) => {
                    console.log("in verified err", err);
                };

                verified.oncomplete = (e) => {
                    console.log("verified complete", e);
                };
            });
        };
    });


    // Chrome implementation
    // return crypto.subtle.importKey("spki",
    //     base64ToArrayBufferEx(publicKey),
    //     {
    //         name: "RSASSA-PKCS1-v1_5",
    //         hash: { name: "SHA-256" }
    //     },
    //     true, ["verify"]).then(key => {
    //         console.log("key", key)
    //         return crypto.subtle.verify({
    //             name: "RSASSA-PKCS1-v1_5"
    //         } as any, key, base64ToArrayBufferEx(signature),
    //             strToAB(convertedData)).then(verified => {
    //                 console.log("verified", verified)
    //                 return Promise.resolve(verified);
    //             }, (err) => {
    //                 console.log("up err", err);
    //             });
    //     });

}

Параметры работают просто отлично и проверяют сообщение в chrome, но терпят неудачу в IE 11. Когда я пытаюсь выполнить точную реализацию, включая генерацию и подписание ключей, показанных в документах IE11, все работает нормально.

Есть ли что-то отличное в том, как генерируются ключи IE11 и хромированные ключи? Используемые мной данные и ключи создаются в браузере Chrome.

...