dhkekgenerator.java

来自「kmlnjlkj nlkjlkjkljl okopokipoipo oipipi」· Java 代码 · 共 133 行

JAVA
133
字号
package org.bouncycastle.crypto.agreement.kdf;import org.bouncycastle.asn1.ASN1EncodableVector;import org.bouncycastle.asn1.DERObjectIdentifier;import org.bouncycastle.asn1.DEROctetString;import org.bouncycastle.asn1.DERSequence;import org.bouncycastle.asn1.DERTaggedObject;import org.bouncycastle.crypto.DataLengthException;import org.bouncycastle.crypto.DerivationFunction;import org.bouncycastle.crypto.DerivationParameters;import org.bouncycastle.crypto.Digest;/** * RFC 2631 Diffie-hellman KEK derivation function. */public class DHKEKGenerator    implements DerivationFunction{    private final Digest digest;    private DERObjectIdentifier algorithm;    private int                 keySize;    private byte[]              z;    private byte[]              partyAInfo;    public DHKEKGenerator(        Digest digest)    {        this.digest = digest;    }    public void init(DerivationParameters param)    {        DHKDFParameters params = (DHKDFParameters)param;        this.algorithm = params.getAlgorithm();        this.keySize = params.getKeySize();        this.z = params.getZ();        this.partyAInfo = params.getExtraInfo();    }    public Digest getDigest()    {        return digest;    }    public int generateBytes(byte[] out, int outOff, int len)        throws DataLengthException, IllegalArgumentException    {        if ((out.length - len) < outOff)        {            throw new DataLengthException("output buffer too small");        }        long    oBytes = len;        int     outLen = digest.getDigestSize();        //        // this is at odds with the standard implementation, the        // maximum value should be hBits * (2^32 - 1) where hBits        // is the digest output size in bits. We can't have an        // array with a long index at the moment...        //        if (oBytes > ((2L << 32) - 1))        {            throw new IllegalArgumentException("Output length too large");        }        int cThreshold = (int)((oBytes + outLen - 1) / outLen);        byte[] dig = new byte[digest.getDigestSize()];        int counter = 1;        for (int i = 0; i < cThreshold; i++)        {            digest.update(z, 0, z.length);            // OtherInfo            ASN1EncodableVector v1 = new ASN1EncodableVector();            // KeySpecificInfo            ASN1EncodableVector v2 = new ASN1EncodableVector();            v2.add(algorithm);            v2.add(new DEROctetString(integerToBytes(counter)));            v1.add(new DERSequence(v2));            if (partyAInfo != null)            {                v1.add(new DERTaggedObject(true, 0, new DEROctetString(partyAInfo)));            }            v1.add(new DERTaggedObject(true, 2, new DEROctetString(integerToBytes(keySize))));            byte[] other = new DERSequence(v1).getDEREncoded();            digest.update(other, 0, other.length);            digest.doFinal(dig, 0);            if (len > outLen)            {                System.arraycopy(dig, 0, out, outOff, outLen);                outOff += outLen;                len -= outLen;            }            else            {                System.arraycopy(dig, 0, out, outOff, len);            }            counter++;        }        digest.reset();        return len;    }    private byte[] integerToBytes(int keySize)    {        byte[] val = new byte[4];        val[0] = (byte)(keySize >> 24);        val[1] = (byte)(keySize >> 16);        val[2] = (byte)(keySize >> 8);        val[3] = (byte)keySize;        return val;    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?