/**
 * 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 org.apache.hadoop.crypto;

import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.util.StringUtils;

/**
 * Defines properties of a CipherSuite. Modeled after the ciphers in
 * {@link javax.crypto.Cipher}.
 */
@InterfaceAudience.Private
public enum CipherSuite {
  UNKNOWN("Unknown", 0),
  AES_CTR_NOPADDING("AES/CTR/NoPadding", 16);

  private final String name;
  private final int algoBlockSize;

  private Integer unknownValue = null;

  CipherSuite(String name, int algoBlockSize) {
    this.name = name;
    this.algoBlockSize = algoBlockSize;
  }

  public void setUnknownValue(int unknown) {
    this.unknownValue = unknown;
  }

  public int getUnknownValue() {
    return unknownValue;
  }

  /**
   * @return name of cipher suite, as in {@link javax.crypto.Cipher}
   */
  public String getName() {
    return name;
  }

  /**
   * @return size of an algorithm block in bytes
   */
  public int getAlgorithmBlockSize() {
    return algoBlockSize;
  }

  @Override
  public String toString() {
    StringBuilder builder = new StringBuilder("{");
    builder.append("name: " + name);
    builder.append(", algorithmBlockSize: " + algoBlockSize);
    if (unknownValue != null) {
      builder.append(", unknownValue: " + unknownValue);
    }
    builder.append("}");
    return builder.toString();
  }
  
  /**
   * Convert to CipherSuite from name, {@link #algoBlockSize} is fixed for
   * certain cipher suite, just need to compare the name.
   * @param name cipher suite name
   * @return CipherSuite cipher suite
   */
  public static CipherSuite convert(String name) {
    CipherSuite[] suites = CipherSuite.values();
    for (CipherSuite suite : suites) {
      if (suite.getName().equals(name)) {
        return suite;
      }
    }
    throw new IllegalArgumentException("Invalid cipher suite name: " + name);
  }
  
  /**
   * Returns suffix of cipher suite configuration.
   * @return String configuration suffix
   */
  public String getConfigSuffix() {
    String[] parts = name.split("/");
    StringBuilder suffix = new StringBuilder();
    for (String part : parts) {
      suffix.append(".").append(StringUtils.toLowerCase(part));
    }
    
    return suffix.toString();
  }
}
