| /** | 
|  * 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; | 
| }; |