public byte[] wrap(byte[] data, int offset, int len) throws SaslException {
    // mac
    byte[] mac = integrity.getHMAC(data, offset, len);
    integrity.incMySeqNum();

    // encrypt
    byte[] encrypted = new byte[len + 10];
    try {
      int n = encryptor.update(data, offset, len, encrypted, 0);
      encryptor.update(mac, 0, 10, encrypted, n);
    } catch (ShortBufferException sbe) {
      // this should not happen
      throw new SaslException("Error happens during encrypt data", sbe);
    }

    // append seqNum used for mac
    byte[] wrapped = new byte[encrypted.length + 4];
    System.arraycopy(encrypted, 0, wrapped, 0, encrypted.length);
    System.arraycopy(integrity.getSeqNum(), 0, wrapped, encrypted.length, 4);

    return wrapped;
  }
Encrypts input data. The result composes of (msg, padding if needed, mac) and sequence num.
@param data   the input byte array
@param offset the offset in input where the input starts
@param len    the input length
@return the new encrypted byte array.
@throws SaslException if error happens
hbase-common/src/main/java/org/apache/hadoop/hbase/io/crypto/aes/CryptoAES.java