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>