| 
								
							 | 
							
								'use strict';
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								var crypto = require('crypto');
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								/**
							 | 
						
						
						
							| 
								
							 | 
							
								 * hash
							 | 
						
						
						
							| 
								
							 | 
							
								 *
							 | 
						
						
						
							| 
								
							 | 
							
								 * @param {String} method hash method, e.g.: 'md5', 'sha1'
							 | 
						
						
						
							| 
								
							 | 
							
								 * @param {String|Buffer|Object} s
							 | 
						
						
						
							| 
								
							 | 
							
								 * @param {String} [format] output string format, could be 'hex' or 'base64'. default is 'hex'.
							 | 
						
						
						
							| 
								
							 | 
							
								 * @return {String} md5 hash string
							 | 
						
						
						
							| 
								
							 | 
							
								 * @public
							 | 
						
						
						
							| 
								
							 | 
							
								 */
							 | 
						
						
						
							| 
								
							 | 
							
								exports.hash = function hash(method, s, format) {
							 | 
						
						
						
							| 
								
							 | 
							
								  var sum = crypto.createHash(method);
							 | 
						
						
						
							| 
								
							 | 
							
								  var isBuffer = Buffer.isBuffer(s);
							 | 
						
						
						
							| 
								
							 | 
							
								  if (!isBuffer && typeof s === 'object') {
							 | 
						
						
						
							| 
								
							 | 
							
								    s = JSON.stringify(sortObject(s));
							 | 
						
						
						
							| 
								
							 | 
							
								  }
							 | 
						
						
						
							| 
								
							 | 
							
								  sum.update(s, isBuffer ? 'binary' : 'utf8');
							 | 
						
						
						
							| 
								
							 | 
							
								  return sum.digest(format || 'hex');
							 | 
						
						
						
							| 
								
							 | 
							
								};
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								/**
							 | 
						
						
						
							| 
								
							 | 
							
								 * md5 hash
							 | 
						
						
						
							| 
								
							 | 
							
								 *
							 | 
						
						
						
							| 
								
							 | 
							
								 * @param {String|Buffer|Object} s
							 | 
						
						
						
							| 
								
							 | 
							
								 * @param {String} [format] output string format, could be 'hex' or 'base64'. default is 'hex'.
							 | 
						
						
						
							| 
								
							 | 
							
								 * @return {String} md5 hash string
							 | 
						
						
						
							| 
								
							 | 
							
								 * @public
							 | 
						
						
						
							| 
								
							 | 
							
								 */
							 | 
						
						
						
							| 
								
							 | 
							
								exports.md5 = function md5(s, format) {
							 | 
						
						
						
							| 
								
							 | 
							
								  return exports.hash('md5', s, format);
							 | 
						
						
						
							| 
								
							 | 
							
								};
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								/**
							 | 
						
						
						
							| 
								
							 | 
							
								 * sha1 hash
							 | 
						
						
						
							| 
								
							 | 
							
								 *
							 | 
						
						
						
							| 
								
							 | 
							
								 * @param {String|Buffer|Object} s
							 | 
						
						
						
							| 
								
							 | 
							
								 * @param {String} [format] output string format, could be 'hex' or 'base64'. default is 'hex'.
							 | 
						
						
						
							| 
								
							 | 
							
								 * @return {String} sha1 hash string
							 | 
						
						
						
							| 
								
							 | 
							
								 * @public
							 | 
						
						
						
							| 
								
							 | 
							
								 */
							 | 
						
						
						
							| 
								
							 | 
							
								exports.sha1 = function sha1(s, format) {
							 | 
						
						
						
							| 
								
							 | 
							
								  return exports.hash('sha1', s, format);
							 | 
						
						
						
							| 
								
							 | 
							
								};
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								/**
							 | 
						
						
						
							| 
								
							 | 
							
								 * sha256 hash
							 | 
						
						
						
							| 
								
							 | 
							
								 *
							 | 
						
						
						
							| 
								
							 | 
							
								 * @param {String|Buffer|Object} s
							 | 
						
						
						
							| 
								
							 | 
							
								 * @param {String} [format] output string format, could be 'hex' or 'base64'. default is 'hex'.
							 | 
						
						
						
							| 
								
							 | 
							
								 * @return {String} sha256 hash string
							 | 
						
						
						
							| 
								
							 | 
							
								 * @public
							 | 
						
						
						
							| 
								
							 | 
							
								 */
							 | 
						
						
						
							| 
								
							 | 
							
								exports.sha256 = function sha256(s, format) {
							 | 
						
						
						
							| 
								
							 | 
							
								  return exports.hash('sha256', s, format);
							 | 
						
						
						
							| 
								
							 | 
							
								};
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								/**
							 | 
						
						
						
							| 
								
							 | 
							
								 * HMAC algorithm.
							 | 
						
						
						
							| 
								
							 | 
							
								 *
							 | 
						
						
						
							| 
								
							 | 
							
								 * Equal bash:
							 | 
						
						
						
							| 
								
							 | 
							
								 *
							 | 
						
						
						
							| 
								
							 | 
							
								 * ```bash
							 | 
						
						
						
							| 
								
							 | 
							
								 * $ echo -n "$data" | openssl dgst -binary -$algorithm -hmac "$key" | openssl $encoding
							 | 
						
						
						
							| 
								
							 | 
							
								 * ```
							 | 
						
						
						
							| 
								
							 | 
							
								 *
							 | 
						
						
						
							| 
								
							 | 
							
								 * @param {String} algorithm, dependent on the available algorithms supported by the version of OpenSSL on the platform.
							 | 
						
						
						
							| 
								
							 | 
							
								 *   Examples are 'sha1', 'md5', 'sha256', 'sha512', etc.
							 | 
						
						
						
							| 
								
							 | 
							
								 *   On recent releases, `openssl list-message-digest-algorithms` will display the available digest algorithms.
							 | 
						
						
						
							| 
								
							 | 
							
								 * @param {String} key, the hmac key to be used.
							 | 
						
						
						
							| 
								
							 | 
							
								 * @param {String|Buffer} data, content string.
							 | 
						
						
						
							| 
								
							 | 
							
								 * @param {String} [encoding='base64']
							 | 
						
						
						
							| 
								
							 | 
							
								 * @return {String} digest string.
							 | 
						
						
						
							| 
								
							 | 
							
								 */
							 | 
						
						
						
							| 
								
							 | 
							
								exports.hmac = function hmac(algorithm, key, data, encoding) {
							 | 
						
						
						
							| 
								
							 | 
							
								  encoding = encoding || 'base64';
							 | 
						
						
						
							| 
								
							 | 
							
								  var hmac = crypto.createHmac(algorithm, key);
							 | 
						
						
						
							| 
								
							 | 
							
								  hmac.update(data, Buffer.isBuffer(data) ? 'binary' : 'utf8');
							 | 
						
						
						
							| 
								
							 | 
							
								  return hmac.digest(encoding);
							 | 
						
						
						
							| 
								
							 | 
							
								};
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								/**
							 | 
						
						
						
							| 
								
							 | 
							
								 * Base64 encode string.
							 | 
						
						
						
							| 
								
							 | 
							
								 *
							 | 
						
						
						
							| 
								
							 | 
							
								 * @param {String|Buffer} s
							 | 
						
						
						
							| 
								
							 | 
							
								 * @param {Boolean} [urlsafe=false] Encode string s using a URL-safe alphabet,
							 | 
						
						
						
							| 
								
							 | 
							
								 *   which substitutes - instead of + and _ instead of / in the standard Base64 alphabet.
							 | 
						
						
						
							| 
								
							 | 
							
								 * @return {String} base64 encode format string.
							 | 
						
						
						
							| 
								
							 | 
							
								 */
							 | 
						
						
						
							| 
								
							 | 
							
								exports.base64encode = function base64encode(s, urlsafe) {
							 | 
						
						
						
							| 
								
							 | 
							
								  if (!Buffer.isBuffer(s)) {
							 | 
						
						
						
							| 
								
							 | 
							
								    s = typeof Buffer.from === 'function' ? Buffer.from(s) : new Buffer(s);
							 | 
						
						
						
							| 
								
							 | 
							
								  }
							 | 
						
						
						
							| 
								
							 | 
							
								  var encode = s.toString('base64');
							 | 
						
						
						
							| 
								
							 | 
							
								  if (urlsafe) {
							 | 
						
						
						
							| 
								
							 | 
							
								    encode = encode.replace(/\+/g, '-').replace(/\//g, '_');
							 | 
						
						
						
							| 
								
							 | 
							
								  }
							 | 
						
						
						
							| 
								
							 | 
							
								  return encode;
							 | 
						
						
						
							| 
								
							 | 
							
								};
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								/**
							 | 
						
						
						
							| 
								
							 | 
							
								 * Base64 string decode.
							 | 
						
						
						
							| 
								
							 | 
							
								 *
							 | 
						
						
						
							| 
								
							 | 
							
								 * @param {String} encode, base64 encoding string.
							 | 
						
						
						
							| 
								
							 | 
							
								 * @param {Boolean} [urlsafe=false] Decode string s using a URL-safe alphabet,
							 | 
						
						
						
							| 
								
							 | 
							
								 *   which substitutes - instead of + and _ instead of / in the standard Base64 alphabet.
							 | 
						
						
						
							| 
								
							 | 
							
								 * @param {encoding} [encoding=utf8] if encoding = buffer, will return Buffer instance
							 | 
						
						
						
							| 
								
							 | 
							
								 * @return {String|Buffer} plain text.
							 | 
						
						
						
							| 
								
							 | 
							
								 */
							 | 
						
						
						
							| 
								
							 | 
							
								exports.base64decode = function base64decode(encodeStr, urlsafe, encoding) {
							 | 
						
						
						
							| 
								
							 | 
							
								  if (urlsafe) {
							 | 
						
						
						
							| 
								
							 | 
							
								    encodeStr = encodeStr.replace(/\-/g, '+').replace(/_/g, '/');
							 | 
						
						
						
							| 
								
							 | 
							
								  }
							 | 
						
						
						
							| 
								
							 | 
							
								  var buf = typeof Buffer.from === 'function' ? Buffer.from(encodeStr, 'base64') : new Buffer(encodeStr, 'base64');
							 | 
						
						
						
							| 
								
							 | 
							
								  if (encoding === 'buffer') {
							 | 
						
						
						
							| 
								
							 | 
							
								    return buf;
							 | 
						
						
						
							| 
								
							 | 
							
								  }
							 | 
						
						
						
							| 
								
							 | 
							
								  return buf.toString(encoding || 'utf8');
							 | 
						
						
						
							| 
								
							 | 
							
								};
							 | 
						
						
						
							| 
								
							 | 
							
								
							 | 
						
						
						
							| 
								
							 | 
							
								function sortObject(o) {
							 | 
						
						
						
							| 
								
							 | 
							
								  if (!o || Array.isArray(o) || typeof o !== 'object') {
							 | 
						
						
						
							| 
								
							 | 
							
								    return o;
							 | 
						
						
						
							| 
								
							 | 
							
								  }
							 | 
						
						
						
							| 
								
							 | 
							
								  var keys = Object.keys(o);
							 | 
						
						
						
							| 
								
							 | 
							
								  keys.sort();
							 | 
						
						
						
							| 
								
							 | 
							
								  var values = [];
							 | 
						
						
						
							| 
								
							 | 
							
								  for (var i = 0; i < keys.length; i++) {
							 | 
						
						
						
							| 
								
							 | 
							
								    var k = keys[i];
							 | 
						
						
						
							| 
								
							 | 
							
								    values.push([k, sortObject(o[k])]);
							 | 
						
						
						
							| 
								
							 | 
							
								  }
							 | 
						
						
						
							| 
								
							 | 
							
								  return values;
							 | 
						
						
						
							| 
								
							 | 
							
								}
							 |