3

J'utilise l'API Web Crypto (https://www.w3.org/TR/WebCryptoAPI/) avec succès sur Chrome (depuis le premier support Web Crypto), Firefox (depuis le premier support Web Crypto) et même sur Safari TP (10.2) avec le support d'un WebCrypto Liner un pollyfill pour API WebCrypto (https://github.com/PeculiarVentures/webcrypto-liner).API Web Crypto utilisant Microsoft Edge (38.14393.0.0)

Maintenant, je veux tester notre code en utilisant Microsoft Edge. Mais chiffrer et déchiffrer un exemple ArrayBuffer échoue déjà. Voici le code:

var crypto = window.crypto; 
if (crypto.subtle) { 
    var aesGcmKey = null; 
    // always create a new, random iv in production systems!!! 
    var tempIv = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]); 
    // needed for edge, if additional data missing decrypting is failing 
    var tempAdditionalData = new Uint8Array(0); 
    var dataToEncrypt = new Uint8Array([1, 2, 3, 4, 5]); 

    // 1.) generate key 
    var generateKeyPromise = crypto.subtle.generateKey(
     {name: "AES-GCM", length: 256}, true, ["encrypt", "decrypt"] 
    ); 
    generateKeyPromise.then(function (tempKey) { 
     aesGcmKey = tempKey; 
     // 2.) start encryption with this key 
     var encryptedDataPromise = crypto.subtle.encrypt(
      {name: "AES-GCM", iv: tempIv, additionalData: tempAdditionalData, tagLength: 128}, 
      aesGcmKey, 
      dataToEncrypt 
     ); 
     encryptedDataPromise.then(function (encryptedData) { 
      // 3.) decrypt using same key 
      var decryptedDataPromise = crypto.subtle.decrypt(
       {name: "AES-GCM", iv: tempIv, additionalData: tempAdditionalData, tagLength: 128}, 
       aesGcmKey, 
       encryptedData 
      ); 
      decryptedDataPromise.then(function (decryptedData) { 
       // 4.) compare decrypted array buffer and inital data 
       console.log('data decrypted!'); 
       console.log(decryptedData); 
      }); 
      decryptedDataPromise.catch(function (error) { 
       console.log('decrypting sample data failed'); 
       console.log(error); 
      }); 
     }); 
     // if 2.) is failing 
     encryptedDataPromise.catch(function (error) { 
      console.log('encrypting sample data failed'); 
      console.log(error); 
     }); 
    }); 
    // if 1.) is failing 
    generateKeyPromise.catch(function (error) { 
     console.log('creating aec gcm key failed'); 
     console.log(error); 
    }); 
} 

Ce code échoue dans la phase de décryptage (étape 3 dans le code) sur le bord, tandis que son travail bien sur Chrome, Firefox et Safari même. La partie filaire il que le decryptedDataPromise est rejeté avec une exception, mais les données renvoyées ne ressemble pas à une exception du tout:

[object Object] {additionalData: Uint8Array {...}, iv: Uint8Array {...}, name: "AES-GCM", tagLength: 128} 

Est-ce que quelqu'un a une idée de pourquoi cela ne fonctionne pas sur Microsoft Edge?

+3

cet exemple live https://diafygi.github.io/webcrypto-examples/ montre qu'AES-GCM fonctionne dans Edge. Donc, cela sera dû à une petite différence dans les paramètres. Pourriez-vous essayer avec un IV de taille 12 au lieu de 16? – pedrofb

+1

suite au commentaire ci-dessus, il semble que vous ayez besoin de 'var tempAdditionalData = new Uint8Array (1);' note: 1 pas 0 –

Répondre

2

Comme suggéré dans les commentaires, changer IV à la taille 12 au lieu de 16 et des données supplémentaires pour contenir 1 au lieu de résoudre le problème 0 Edge

var tempIv = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]); 
var tempAdditionalData = new Uint8Array(1); 

Vos commentaires sur les données supplémentaires « // nécessaire pour le bord , si des données supplémentaires manquant décryptage échoue " n'est vraiment pas nécessaire. additionalData peut être vide

Je regardais MSDN sur l'opération encrypt, mais ce comportement n'est pas documenté. Donc, je pense que l'implémentation de WebCrypto n'est pas assez mature et qu'il y a toujours de petits bugs