2017-03-21 15 views
3

Chrome(最初のWeb暗号化サポート以来)、Firefox(最初のWeb暗号化サポート以来)、さらにはSafari TP(10.2)でもWeb暗号化API WebCrypto API(https://github.com/PeculiarVentures/webcrypto-liner)用のポリールフィルであるWebCrypto Linerをサポートしています。Microsoft Edge(38.14393.0.0)を使用したWeb Crypto API

今、Microsoft Edgeを使用してコードをテストしたいと思います。しかし、サンプルのArrayBufferの暗号化と復号化はすでに失敗しています。ここでは、コードは:そのはクロム、FirefoxとさえSafariで正常に動作している間

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); 
    }); 
} 

このコードは、エッジ上の解読相(コードのステップ3)で失敗しています。

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

これは、マイクロソフトのエッジに失敗した理由を誰もが手掛かりを持っています:decryptedDataPromiseは例外で拒否されたが、返されたデータがまったく例外のように見えるdoesntのこと、有線部分、それ?コメントで示唆したように

+3

このライブサンプルhttps://diafygi.github.io/webcrypto-examples/では、EdgeでAES-GCMが動作することを示しています。したがって、パラメータのわずかな違いが原因です。 16の代わりに12のサイズのIVで試してみませんか? – pedrofb

+1

さらに上記のコメントには、 'var tempAdditionalData = new Uint8Array(1);' note:1 not 0 –

答えて

2

、代わりに01を含める代わりに16と追加データのサイズ12にIVを変化エッジで問題を解決

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

追加データ「//エッジのために必要な程度コメント追加のデータ欠落解読が失敗した場合 "は実際には必要ありません。 additionalDataは無効です

私はMSDNのencrypt操作について調べていましたが、この動作は文書化されていません。 WebCryptoの実装はまだ成熟しておらず、小さなバグが残っていると思います。

関連する問題