text: 'use strict';
  
  // Tools for encrypting and decrypting passwords.
  // Basically promise-friendly wrappers for bcrypt.
  var bcrypt = require('bcryptjs');
  
  try {
    bcrypt = require('bcrypt');
  } catch (e) {} /* */
  
  // Returns a promise for a hashed password string.
  function hash(password) {
    return new Promise(function (fulfill, reject) {
      bcrypt.hash(password, 10, function (err, hashedPassword) {
        if (err) {
          reject(err);
        } else {
          fulfill(hashedPassword);
        }
      });
    });
  }
  
  // Returns a promise for whether this password compares to equal this
  // hashed password.
  function compare(password, hashedPassword) {
    return new Promise(function (fulfill, reject) {
      // Cannot bcrypt compare when one is undefined
      if (!password || !hashedPassword) {
        return fulfill(false);
      }
      bcrypt.compare(password, hashedPassword, function (err, success) {
        if (err) {
          reject(err);
        } else {
          fulfill(success);
        }
      });
    });
  }
  
  module.exports = {
    hash: hash,
    compare: compare
  };