All files / src/util Crypto.js

96.15% Statements 25/26
100% Branches 0/0
100% Functions 4/4
96.15% Lines 25/26
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65                              3x 3x   3x 3x       3x 3x 3x 3x             138x 138x 138x 138x   3x         69x 69x 69x 69x 69x   6x         9x 9x 72x 72x   9x       3x  
/**
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
'use strict';
 
var crypto = require('crypto');
var ybase64 = require('./YBase64');
 
var SALT_LENGTH = 8;
var SALT_CHARS = '0123456789abcdef';
 
class Crypto {
  static hmac(message, sharedSecret) {
    try {
      var hmac = crypto.createHmac('sha256', sharedSecret);
      hmac.update(message);
      return ybase64.ybase64Encode(hmac.digest());
    } catch (e) {
      throw new Error('Crypto:hmac:' + e.message);
    }
  }
 
  static sign(message, key, digestAlgorithm) {
    try {
      var sign = crypto.createSign(digestAlgorithm);
      sign.update(message);
      return ybase64.ybase64Encode(sign.sign(key));
    } catch (e) {
      throw new Error('Crypto:sign:' + e.message);
    }
  }
 
  static verify(message, key, signature, digestAlgorithm) {
    try {
      var sig = ybase64.ybase64Decode(signature);
      var verify = crypto.createVerify(digestAlgorithm);
      verify.update(message);
      return verify.verify(key, sig);
    } catch (e) {
      throw new Error('Crypto:verify:' + e.message);
    }
  }
 
  static randomSalt() {
    var c, i, salt = '';
    for (c = 0; c < SALT_LENGTH; c++) {
      i = Math.floor(Math.random() * SALT_CHARS.length);
      salt += SALT_CHARS.charAt(i);
    }
    return salt;
  }
}
 
module.exports = Crypto;