@Override
  public ByteBuffer encryptKey(SecretKeySpec toEncrypt, SecretKeySpec key) throws GeneralSecurityException {
    byte[] encodedKey = toEncrypt.getEncoded();
    ByteBuffer keyRecordBuffer =
        ByteBuffer.allocate(KeyRecord_Format_V1.getKeyRecordSize(encodedKey, toEncrypt.getAlgorithm()));
    KeyRecord_Format_V1.serializeKeyRecord(keyRecordBuffer, encodedKey, toEncrypt.getAlgorithm());
    keyRecordBuffer.flip();
    return encrypt(keyRecordBuffer, key);
  }
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