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.
57 lines
1.6 KiB
57 lines
1.6 KiB
/** |
|
* 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; |
|
};
|
|
|