Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package org.bouncycastle.crypto.agreement.kdf;
  
  
RFC 2631 Diffie-hellman KEK derivation function.
 
 public class DHKEKGenerator
     implements DerivationFunction
 {
     private final Digest digest;
 
     private ASN1ObjectIdentifier algorithm;
     private int                 keySize;
     private byte[]              z;
     private byte[]              partyAInfo;
 
     public DHKEKGenerator(
         Digest digest)
     {
         this. = digest;
     }
 
     public void init(DerivationParameters param)
     {
         DHKDFParameters params = (DHKDFParameters)param;
 
         this. = params.getAlgorithm();
         this. = params.getKeySize();
         this. = params.getZ();
         this. = params.getExtraInfo();
     }
 
     public Digest getDigest()
     {
         return ;
     }
 
     public int generateBytes(byte[] outint outOffint len)
     {
         if ((out.length - len) < outOff)
         {
             throw new DataLengthException("output buffer too small");
         }
 
         long    oBytes = len;
         int     outLen = .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[.getDigestSize()];
 
         int counter = 1;
 
         for (int i = 0; i < cThresholdi++)
         {
             .update(, 0, .);
 
             // OtherInfo
             ASN1EncodableVector v1 = new ASN1EncodableVector();
             // KeySpecificInfo
             ASN1EncodableVector v2 = new ASN1EncodableVector();
 
             v2.add();
             v2.add(new DEROctetString(Pack.intToBigEndian(counter)));
 
             v1.add(new DERSequence(v2));
 
             if ( != null)
             {
                 v1.add(new DERTaggedObject(true, 0, new DEROctetString()));
             }
 
             v1.add(new DERTaggedObject(true, 2, new DEROctetString(Pack.intToBigEndian())));
 
            try
            {
                byte[] other = new DERSequence(v1).getEncoded(.);
                .update(other, 0, other.length);
            }
            catch (IOException e)
            {
                throw new IllegalArgumentException("unable to encode parameter info: " + e.getMessage());
            }
            .doFinal(dig, 0);
            if (len > outLen)
            {
                System.arraycopy(dig, 0, outoutOffoutLen);
                outOff += outLen;
                len -= outLen;
            }
            else
            {
                System.arraycopy(dig, 0, outoutOfflen);
            }
            counter++;
        }
        .reset();
        return (int)oBytes;
    }
New to GrepCode? Check out our FAQ X