net.i2p.crypto

## Class HMACGenerator

- java.lang.Object
- - net.i2p.crypto.HMACGenerator

- Direct Known Subclasses:
    HMAC256Generator

      public class HMACGenerator
      extends Object

  Calculate the HMAC-MD5-128 of a key+message. All the good stuff occurs in `I2PHMac` and `MD5Digest`. Keys are always 32 bytes. This is used only by UDP. Use deprecated outside the router, this may move to router.jar. NOTE THIS IS NOT COMPATIBLE with javax.crypto.Mac.getInstance("HmacMD5") as we tell I2PHMac that the digest length is 32 bytes, so it generates a different result. Quote jrandom: "The HMAC is hardcoded to use SHA256 digest size for backwards compatability. next time we have a backwards incompatible change, we should update this." Does this mean he intended it to be compatible with MD5? See also 2005-07-05 status notes.

- - ### Field Summary

    Fields
    Modifier and Type | Field and Description
    --- | ---
    `protected LinkedBlockingQueue<I2PHMac>` | `_available` set of available HMAC instances for calculate

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `HMACGenerator(I2PAppContext context)`

  - ### Method Summary

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `protected I2PHMac` | `acquire()`
    `Hash` | `calculate(SessionKey key, byte[] data)` Deprecated. unused
    `void` | `calculate(SessionKey key, byte[] data, int offset, int length, byte[] target, int targetOffset)` Calculate the HMAC of the data with the given key
    `boolean` | `verify(SessionKey key, byte[] curData, int curOffset, int curLength, byte[] origMAC, int origMACOffset, int origMACLength)` Verify the MAC inline, reducing some unnecessary memory churn.

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Field Detail

    - #### _available

          protected final LinkedBlockingQueue<I2PHMac> _available

      set of available HMAC instances for calculate

  - ### Constructor Detail

    - #### HMACGenerator

          public HMACGenerator(I2PAppContext context)

      Parameters:
        `context` - unused

  - ### Method Detail

    - #### calculate

          public Hash calculate(SessionKey key,
                       byte[] data)

      Deprecated. unused
      Calculate the HMAC of the data with the given key
      Returns:
        the first 16 bytes contain the HMAC, the last 16 bytes are zero

    - #### calculate

          public void calculate(SessionKey key,
                       byte[] data,
                       int offset,
                       int length,
                       byte[] target,
                       int targetOffset)

      Calculate the HMAC of the data with the given key

    - #### verify

          public boolean verify(SessionKey key,
                       byte[] curData,
                       int curOffset,
                       int curLength,
                       byte[] origMAC,
                       int origMACOffset,
                       int origMACLength)

      Verify the MAC inline, reducing some unnecessary memory churn.
      Parameters:
        `key` - session key to verify the MAC with
        `curData` - MAC to verify
        `curOffset` - index into curData to MAC
        `curLength` - how much data in curData do we want to run the HMAC over
        `origMAC` - what do we expect the MAC of curData to equal
        `origMACOffset` - index into origMAC
        `origMACLength` - how much of the MAC do we want to verify

    - #### acquire

          protected I2PHMac acquire()