/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.intel.chimera;

import java.nio.ByteBuffer;
import java.security.NoSuchAlgorithmException;

import javax.crypto.NoSuchPaddingException;
import javax.crypto.ShortBufferException;

import org.junit.Assert;
import org.junit.Assume;
import org.junit.Test;

import com.intel.chimera.cipher.Openssl;

public class OpensslCipherTest {
  private static final byte[] key = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
    0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16};
  private static final byte[] iv = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
    0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};

  @Test(timeout=120000)
  public void testGetInstance() throws Exception {
    Assume.assumeTrue(Openssl.getLoadingFailureReason() == null);
    Openssl cipher = Openssl.getInstance("AES/CTR/NoPadding");
    Assert.assertTrue(cipher != null);

    try {
      cipher = Openssl.getInstance("AES2/CTR/NoPadding");
      Assert.fail("Should specify correct algorithm.");
    } catch (NoSuchAlgorithmException e) {
      // Expect NoSuchAlgorithmException
    }

    try {
      cipher = Openssl.getInstance("AES/CTR/NoPadding2");
      Assert.fail("Should specify correct padding.");
    } catch (NoSuchPaddingException e) {
      // Expect NoSuchPaddingException
    }
  }

  @Test(timeout=120000)
  public void testUpdateArguments() throws Exception {
    Assume.assumeTrue(Openssl.getLoadingFailureReason() == null);
    Openssl cipher = Openssl.getInstance("AES/CTR/NoPadding");
    Assert.assertTrue(cipher != null);

    cipher.init(Openssl.ENCRYPT_MODE, key, iv);

    // Require direct buffers
    ByteBuffer input = ByteBuffer.allocate(1024);
    ByteBuffer output = ByteBuffer.allocate(1024);

    try {
      cipher.update(input, output);
      Assert.fail("Input and output buffer should be direct buffer.");
    } catch (IllegalArgumentException e) {
      Assert.assertTrue(e.getMessage().contains("Direct buffers are required"));
    }

    // Output buffer length should be sufficient to store output data
    input = ByteBuffer.allocateDirect(1024);
    output = ByteBuffer.allocateDirect(1000);
    try {
      cipher.update(input, output);
      Assert.fail("Output buffer length should be sufficient " +
          "to store output data");
    } catch (ShortBufferException e) {
      Assert.assertTrue(e.getMessage().contains("Output buffer is not sufficient"));
    }
  }

  @Test(timeout=120000)
  public void testDoFinalArguments() throws Exception {
    Assume.assumeTrue(Openssl.getLoadingFailureReason() == null);
    Openssl cipher = Openssl.getInstance("AES/CTR/NoPadding");
    Assert.assertTrue(cipher != null);

    cipher.init(Openssl.ENCRYPT_MODE, key, iv);

    // Require direct buffer
    ByteBuffer output = ByteBuffer.allocate(1024);

    try {
      cipher.doFinal(output);
      Assert.fail("Output buffer should be direct buffer.");
    } catch (IllegalArgumentException e) {
      Assert.assertTrue(e.getMessage().contains("Direct buffer is required"));
    }
  }
}
