Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package org.bouncycastle.crypto.macs;
  
  
HMAC implementation based on RFC2104 H(K XOR opad, H(K XOR ipad, text))
 
 public class HMac
     implements Mac
 {
     private final static byte IPAD = (byte)0x36;
     private final static byte OPAD = (byte)0x5C;
 
     private Digest digest;
     private int digestSize;
     private int blockLength;
     private Memoable ipadState;
     private Memoable opadState;
 
     private byte[] inputPad;
     private byte[] outputBuf;
 
     private static Hashtable blockLengths;
     
     static
     {
          = new Hashtable();
         
         .put("GOST3411", Integers.valueOf(32));
         
         .put("MD2", Integers.valueOf(16));
         .put("MD4", Integers.valueOf(64));
         .put("MD5", Integers.valueOf(64));
         
         .put("RIPEMD128", Integers.valueOf(64));
         .put("RIPEMD160", Integers.valueOf(64));
         
         .put("SHA-1", Integers.valueOf(64));
         .put("SHA-224", Integers.valueOf(64));
         .put("SHA-256", Integers.valueOf(64));
         .put("SHA-384", Integers.valueOf(128));
         .put("SHA-512", Integers.valueOf(128));
         
         .put("Tiger", Integers.valueOf(64));
         .put("Whirlpool", Integers.valueOf(64));
     }
     
     private static int getByteLength(
         Digest digest)
     {
         if (digest instanceof ExtendedDigest)
         {
             return ((ExtendedDigest)digest).getByteLength();
         }
         
         Integer  b = (Integer).get(digest.getAlgorithmName());
         
         if (b == null)
         {       
             throw new IllegalArgumentException("unknown digest passed: " + digest.getAlgorithmName());
         }
         
         return b.intValue();
     }
    
    
Base constructor for one of the standard digest algorithms that the byteLength of the algorithm is know for.

Parameters:
digest the digest.
 
     public HMac(
         Digest digest)
     {
         this(digestgetByteLength(digest));
     }
 
     private HMac(
         Digest digest,
         int    byteLength)
     {
         this. = digest;
         this. = digest.getDigestSize();
         this. = byteLength;
         this. = new byte[];
         this. = new byte[ + ];
     }
 
     public String getAlgorithmName()
    {
        return .getAlgorithmName() + "/HMAC";
    }
    public Digest getUnderlyingDigest()
    {
        return ;
    }
    public void init(
        CipherParameters params)
    {
        .reset();
        byte[] key = ((KeyParameter)params).getKey();
        int keyLength = key.length;
        if (keyLength > )
        {
            .update(key, 0, keyLength);
            .doFinal(, 0);
            
            keyLength = ;
        }
        else
        {
            System.arraycopy(key, 0, , 0, keyLength);
        }
        for (int i = keyLengthi < .i++)
        {
            [i] = 0;
        }
        System.arraycopy(, 0, , 0, );
        xorPad();
        xorPad();
        if ( instanceof Memoable)
        {
             = ((Memoable)).copy();
            ((Digest)).update(, 0, );
        }
        .update(, 0, .);
        if ( instanceof Memoable)
        {
             = ((Memoable)).copy();
        }
    }
    public int getMacSize()
    {
        return ;
    }
    public void update(
        byte in)
    {
        .update(in);
    }
    public void update(
        byte[] in,
        int inOff,
        int len)
    {
        .update(ininOfflen);
    }
    public int doFinal(
        byte[] out,
        int outOff)
    {
        if ( != null)
        {
            ((Memoable)).reset();
            .update(.getDigestSize());
        }
        else
        {
            .update(, 0, .);
        }
        int len = .doFinal(outoutOff);
        for (int i = i < .i++)
        {
            [i] = 0;
        }
        if ( != null)
        {
            ((Memoable)).reset();
        }
        else
        {
            .update(, 0, .);
        }
        return len;
    }

    
Reset the mac generator.
    public void reset()
    {
        /*
         * reset the underlying digest.
         */
        .reset();
        /*
         * reinitialize the digest.
         */
        .update(, 0, .);
    }
    private static void xorPad(byte[] padint lenbyte n)
    {
        for (int i = 0; i < len; ++i)
        {
            pad[i] ^= n;
        }
    }
New to GrepCode? Check out our FAQ X