Privacy/Features/DOMCryptAPI/UseCases

< Privacy‎ | Features‎ | DOMCryptAPI
Revision as of 22:41, 31 May 2011 by Ddahl (talk | contribs)

DOMCrypt API Use Cases

Messaging

  • Natasha and Boris would like to message one another privately via a web application. The server is untrusted and all message data that Natasha sends to the server should be encrypted so only Boris can read it after downloading. A server compromise will net the server's attacker only blobs of useless data. This web application will use the Public Key API.

Example Code:

var publicKey = messagingApp.getPublicKey("boris");

var plainText = "Hey, wanna grab a root beer with me after work?";

window.cipher.pk.encrypt(plainText, publicKey, function callback(aCipherMessage) {
  // Asynchronous crypto API - the plainText is encrypted and the CipherMessage object is returned to this callback function
  // aCipherMessage is a JS object literal: 
  //   { content: <ENCRYPTED, BASE64 Encoded String>, 
  //     pubKey: <PUBLICKEY used to encrypt the a symmetric key>, 
  //     wrappedKey: <SYMMETRIC KEY wrapped with the recipient's public key>,
  //     iv: <Initialization Vector> 
  //   }
  messagingApp.sendMessage(aCipherMessage, {from: 'natasha', to: 'boris'});
});

General Purpose Symmetric Crypto

  • A web developer would like to use localStorage or IndexedDB in her diary web application, but would really like all data stored locally to be encrypted should the machine get stolen or 'borrowed' by an unauthorized user.

Example Code:

// create an encryption key and keep it around for later use - perhaps it is also saved to the server...

window.cipher.sym.generateKey(function callback(key){
  document.currentKey = key;
  diaryApp.saveKeyToServer(key);
});

// save the current diary entry:
var diaryEntry = document.getElementById("diary-entry").textContent;

window.cipher.sym.encrypt(diaryEntry, document.currentKey, function callback(cipherText){
  var entryID = diaryApp.getSequence();
  localStorage.setItem(entryID, cipherText);
  alert("Diary entry saved successfully");
});

// decryption

window.cipher.sym.decrypt(localStorage.getItem(entryID), document.currentKey, function callback(plainText){
  document.getElementById("diary-entry").textContent = plainText;
});