import java.security.MessageDigest;
/**
* 掩模生成函数
* mask generator function, as described in PKCS1v2.
*/
public class MGF1
{
private MessageDigest digest;
/**
* Create a version of MGF1 for the given digest.
*
* @param digest
* digest to use as the basis of the function.
*/
public MGF1(MessageDigest digest)
{
this.digest = digest;
}
/**
* int to octet string.
*/
private void I2OSP(int i, byte[] sp)
{
sp[0] = (byte) (i >>> 24);
sp[1] = (byte) (i >>> 16);
sp[2] = (byte) (i >>> 8);
sp[3] = (byte) (i >>> 0);
}
/**
* Generate the mask.
*
* @param seed
* source of input bytes for initial digest state
* @param length
* length of mask to generate
*
* @return a byte array containing a MGF1 generated mask
*/
public byte[]
generateMask(byte[] seed, int length)
{
byte[] mask = new byte[length];
byte[] C = new byte[4];
int counter = 0;
int hLen = digest.getDigestLength();
digest.reset();
while (counter < (length / hLen))
{
I2OSP(counter, C);
digest.update(seed);
digest.update(C);//update 就是把之前的跟现在的连接在一起
System.arraycopy(digest.digest(), 0, mask, counter * hLen, hLen);
counter++;
}
if ((counter * hLen) < length)
{
I2OSP(counter, C);
digest.update(s