tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

file_indexedDB.html (2291B)


      1 <!DOCTYPE html>
      2 <html>
      3 <head>
      4  <meta charset="utf-8">
      5  <title>Bug 1188750 - WebCrypto must ensure NSS is initialized before deserializing</title>
      6 </head>
      7 <body>
      8  <script type="application/javascript">
      9    let db;
     10 
     11    function err(resolve) {
     12      return e => resolve(e.target.error.message);
     13    }
     14 
     15    function openDatabase() {
     16      return new Promise((resolve, reject) => {
     17        let request = indexedDB.open("keystore", 1);
     18 
     19        request.onerror = err(reject);
     20        request.onsuccess = function(event) {
     21          db = event.target.result;
     22          resolve();
     23        };
     24 
     25        request.onupgradeneeded = function(event) {
     26          db = event.target.result;
     27          let objectStore = db.createObjectStore("keys", {autoIncrement: true});
     28          objectStore.transaction.oncomplete = resolve;
     29        };
     30      });
     31    }
     32 
     33    function storeKey(key) {
     34      return new Promise((resolve, reject) => {
     35        let transaction = db.transaction("keys", "readwrite");
     36        transaction.objectStore("keys").put(key, key.type);
     37 
     38        transaction.onabort = err(reject);
     39        transaction.onerror = err(reject);
     40 
     41        transaction.oncomplete = function() {
     42          resolve(key);
     43        };
     44      });
     45    }
     46 
     47    function retrieveKey() {
     48      return new Promise((resolve, reject) => {
     49        let transaction = db.transaction("keys", "readonly");
     50        let cursor = transaction.objectStore("keys").openCursor();
     51 
     52        cursor.onerror = err(reject);
     53        cursor.onabort = err(reject);
     54 
     55        cursor.onsuccess = function(event) {
     56          try {
     57            let result = event.target.result;
     58            resolve(result && result.value);
     59          } catch (e) {
     60            reject(e.message);
     61          }
     62        };
     63      });
     64    }
     65 
     66    function generateKey() {
     67      let algorithm = {
     68        name: "RSASSA-PKCS1-v1_5",
     69        hash: "SHA-256",
     70        modulusLength: 1024,
     71        publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
     72      };
     73 
     74      return crypto.subtle.generateKey(algorithm, true, ["sign", "verify"]);
     75    }
     76 
     77    openDatabase()
     78      .then(retrieveKey).then(generateKey).then(storeKey)
     79      .then(() => parent.postMessage("ok", "*"))
     80      .catch(error => {
     81        parent.postMessage(String(error), "*");
     82      });
     83  </script>
     84 </body>
     85 </html>