You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					58 lines
				
				1.6 KiB
			
		
		
			
		
	
	
					58 lines
				
				1.6 KiB
			| 
								 
											2 years ago
										 
									 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * 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;
							 | 
						||
| 
								 | 
							
								};
							 |