@Override
  public SecretKeySpec decryptKey(ByteBuffer toDecrypt, SecretKeySpec key) throws GeneralSecurityException {
    ByteBuffer decryptedKey = decrypt(toDecrypt, key);
    DeserializedKey deserializedKey = null;
    try {
      deserializedKey = deserializeKey(new ByteBufferInputStream(decryptedKey));
    } catch (Exception e) {
      throw new GeneralSecurityException("Exception thrown on deserializing key");
    }
    return new SecretKeySpec(deserializedKey.getEncodedKey(), deserializedKey.getKeyGenAlgo());
  }
Helper function to encrypt ByteBuf with the given key. When useFixedIv is true, don't use a random iv byte
array, using a all zero byte array instead. Only set it to be true in test.
@param toEncrypt {@link ByteBuf} that needs to be encrypted
@param key the secret key (of type T) to use to encrypt
@param iv If null, will create a random byte array serve as iv bytes.
@return the {@link ByteBuf} containing the encrypted content. Ensure the result has all
the information like the IV along with the encrypted content, in order to decrypt the content with a given key
@throws {@link GeneralSecurityException} on any exception with encryption
ambry-router/src/main/java/com/github/ambry/router/GCMCryptoService.java