Blame view

node_modules/node-forge/lib/mgf1.js 1.61 KB
aaac7fed   liuqimichale   add
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
  /**
   * Javascript implementation of mask generation function MGF1.
   *
   * @author Stefan Siegl
   * @author Dave Longley
   *
   * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>
   * Copyright (c) 2014 Digital Bazaar, Inc.
   */
  var forge = require('./forge');
  require('./util');
  
  forge.mgf = forge.mgf || {};
  var mgf1 = module.exports = forge.mgf.mgf1 = forge.mgf1 = forge.mgf1 || {};
  
  /**
   * Creates a MGF1 mask generation function object.
   *
   * @param md the message digest API to use (eg: forge.md.sha1.create()).
   *
   * @return a mask generation function object.
   */
  mgf1.create = function(md) {
    var mgf = {
      /**
       * Generate mask of specified length.
       *
       * @param {String} seed The seed for mask generation.
       * @param maskLen Number of bytes to generate.
       * @return {String} The generated mask.
       */
      generate: function(seed, maskLen) {
        /* 2. Let T be the empty octet string. */
        var t = new forge.util.ByteBuffer();
  
        /* 3. For counter from 0 to ceil(maskLen / hLen), do the following: */
        var len = Math.ceil(maskLen / md.digestLength);
        for(var i = 0; i < len; i++) {
          /* a. Convert counter to an octet string C of length 4 octets */
          var c = new forge.util.ByteBuffer();
          c.putInt32(i);
  
          /* b. Concatenate the hash of the seed mgfSeed and C to the octet
           * string T: */
          md.start();
          md.update(seed + c.getBytes());
          t.putBuffer(md.digest());
        }
  
        /* Output the leading maskLen octets of T as the octet string mask. */
        t.truncate(t.length() - maskLen);
        return t.getBytes();
      }
    };
  
    return mgf;
  };