194 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var apx = apx || {};
 | |
| 
 | |
| apx.crypto = apx.crypto || {};
 | |
| apx.indexedDB = apx.indexedDB || {};
 | |
| 
 | |
| apx.crypto.genKey = async (uuid) => {
 | |
|     return await openpgp.generateKey(
 | |
|         {
 | |
|             type: "ecc",
 | |
|             curve: "curve25519",
 | |
|             userIDs: [
 | |
|                 {
 | |
|                     alias: uuid
 | |
|                 }
 | |
|             ],
 | |
|             passphrase: "",
 | |
|             format: "armored",
 | |
|         }
 | |
|     );
 | |
| };
 | |
| 
 | |
| apx.crypto.encryptMessage = async (message, publicKey) => {
 | |
|     publicKey = await openpgp.readKey(
 | |
|         {
 | |
|             armoredKey: publicKey
 | |
|         }
 | |
|     );
 | |
| 
 | |
|     return await openpgp.encrypt(
 | |
|         {
 | |
|             message: await openpgp.createMessage(
 | |
|                 {
 | |
|                     text: message
 | |
|                 }
 | |
|             ),
 | |
|             encryptionKeys: publicKey
 | |
|         }
 | |
|     );
 | |
| };
 | |
| 
 | |
| apx.crypto.decryptMessage = async (encryptedMessage, privateKey) => {
 | |
|     privateKey = await openpgp.readPrivateKey(
 | |
|         {
 | |
|             armoredKey: privateKey
 | |
|         }
 | |
|     );
 | |
| 
 | |
|     const message = await openpgp.readMessage(
 | |
|         {
 | |
|             armoredMessage: encryptedMessage
 | |
|         }
 | |
|     );
 | |
| 
 | |
|     return await openpgp.decrypt(
 | |
|         {
 | |
|             message,
 | |
|             decryptionKeys: privateKey
 | |
|         }
 | |
|     );
 | |
| };
 | |
| 
 | |
| apx.crypto.sign = async (message, privateKey) => {
 | |
|     privateKey = await openpgp.readPrivateKey(
 | |
|         {
 | |
|             armoredKey: privateKey
 | |
|         }
 | |
|     );
 | |
| 
 | |
|     return await openpgp.sign(
 | |
|         {
 | |
|             message: await openpgp.createMessage(
 | |
|                 {
 | |
|                     text: message
 | |
|                 }
 | |
|             ),
 | |
|             signingKeys: privateKey
 | |
|         }
 | |
|     );
 | |
| };
 | |
| 
 | |
| apx.crypto.verifySignature = async (message, signature, publicKey) => {
 | |
|     publicKey = await openpgp.readKey(
 | |
|         {
 | |
|             armoredKey: publicKey
 | |
|         }
 | |
|     );
 | |
| 
 | |
|     const verified = await openpgp.verify(
 | |
|         {
 | |
|             message: await openpgp.createMessage(
 | |
|                 {
 | |
|                     text: message
 | |
|                 }
 | |
|             ),
 | |
|             signature: await openpgp.readSignature(
 | |
|                 {
 | |
|                     armoredSignature: signature
 | |
|                 }
 | |
|             ),
 | |
|             verificationKeys: publicKey
 | |
|         }
 | |
|     );
 | |
| 
 | |
|     if (await verified.signatures[0].verified) {
 | |
|         return true;
 | |
|     } else {
 | |
|         return false;
 | |
|     };
 | |
| };
 | |
| 
 | |
| apx.indexedDB.set = async (db, storeName, value) => {
 | |
|     return new Promise((resolve, reject) => {
 | |
|         const request = indexedDB.open(db, 1);
 | |
| 
 | |
|         request.onupgradeneeded = (event) => {
 | |
|             const db = event.target.result;
 | |
| 
 | |
|             if (!db.objectStoreNames.contains("threads")) {
 | |
|                 db.createObjectStore("threads", { keyPath: "uuid" });
 | |
|             };
 | |
| 
 | |
|             if (!db.objectStoreNames.contains("messages")) {
 | |
|                 db.createObjectStore("messages", { keyPath: "privatriid" });
 | |
|             };
 | |
|         };
 | |
| 
 | |
|         request.onsuccess = (event) => {
 | |
|             const db = event.target.result;
 | |
| 
 | |
|             if (!db.objectStoreNames.contains(storeName)) {
 | |
|                 return resolve();
 | |
|             };
 | |
| 
 | |
|             const transaction = db.transaction(storeName, "readwrite");
 | |
|             const store = transaction.objectStore(storeName);
 | |
| 
 | |
|             const putRequest = store.put(value);
 | |
|             putRequest.onsuccess = () => resolve();
 | |
|             putRequest.onerror = (error) => reject(error);
 | |
|         };
 | |
| 
 | |
|         request.onerror = (error) => reject(error);
 | |
|     });
 | |
| };
 | |
| 
 | |
| apx.indexedDB.get =  async (db, storeName, key) => {
 | |
|     return new Promise((resolve, reject) => {
 | |
|         const request = indexedDB.open(db, 1);
 | |
| 
 | |
|         request.onsuccess = (event) => {
 | |
|             const db = event.target.result;
 | |
|             if (!db.objectStoreNames.contains(storeName)) {
 | |
|                 return resolve(null);
 | |
|             }
 | |
|             const transaction = db.transaction(storeName, "readonly");
 | |
|             const store = transaction.objectStore(storeName);
 | |
|             
 | |
|             const getRequest = store.get(key);
 | |
|             
 | |
|             getRequest.onsuccess = () => {
 | |
|                 resolve(getRequest.result || null);
 | |
|             };
 | |
| 
 | |
|             getRequest.onerror = () => resolve(null);
 | |
|         };
 | |
| 
 | |
|         request.onerror = (error) => reject(error);
 | |
|     });
 | |
| };
 | |
| 
 | |
| apx.indexedDB.del = async (db, storeName, key) => {
 | |
|     return new Promise((resolve, reject) => {
 | |
|         const request = indexedDB.open(db, 1);
 | |
| 
 | |
|         request.onsuccess = (event) => {
 | |
|             const db = event.target.result;
 | |
| 
 | |
|             if (!db.objectStoreNames.contains(storeName)) {
 | |
|                 return resolve();
 | |
|             };
 | |
| 
 | |
|             const transaction = db.transaction(storeName, "readwrite");
 | |
|             const store = transaction.objectStore(storeName);
 | |
| 
 | |
|             const deleteRequest = store.delete(key);
 | |
|             deleteRequest.onsuccess = () => resolve();
 | |
|             deleteRequest.onerror = (error) => reject(error);
 | |
|         };
 | |
| 
 | |
|         request.onerror = (error) => reject(error);
 | |
|     });
 | |
| };
 | |
| 
 | |
| export default apx; |