/*
 * Copyright (c) 2015. Ncomz. All Rights Reserved
 */

package com.ntels.kneet.v3.common.security;

import java.io.UnsupportedEncodingException;

/**
 * Seed 블럭암호 API <br />
 * 한국정보보호진흥원에서 제공하는 Java API를 조금 수정 함. <br />
 * Padding은 ANSI X.923을 사용 함.
 */

public interface SeedCipherSvc {

    /**
     * 입력 받은 바이트 데이터를 암호화 하여 리턴한다.
     *
     * @param inData String 평문
     * @param szKey  byte[] key
     * @return byte[] 암호화 된 데이터
     */
    public byte[] encrypt(byte[] sbuffer, byte szKey[]);

    /**
     * 입력 받은 문자열을 암호화 하여 리턴한다.
     *
     * @param inData String 평문
     * @param szKey  byte[] key
     * @return byte[] 암호화 된 데이터
     */
    public byte[] encrypt(String inData, byte szKey[]);

    /**
     * 입력 받은 문자열을 특정 Charset으로 변환하여 암호화 하여 리턴한다.
     *
     * @param inData  String 평문
     * @param szKey   byte[] key
     * @param charset String String을 byte 데이터로 변환할때 사용할 charset
     * @return byte[] 암호화 된 데이터
     */
    public byte[] encrypt(String inData, byte szKey[], String charset) throws UnsupportedEncodingException;

    /**
     * Base64를 기반으로 암호롸를 처리한다.
     *
     * @param inData  String 평문
     * @param charset String String을 byte 데이터로 변환할때 사용할 charset
     * @return byte[] 암호화 된 데이터
     */
    public String encryptBase64(String inData) throws UnsupportedEncodingException;

    /**
     * Base64를 기반으로 암호롸를 처리한다. 그후 URLEncoder 로 다시 인코딩한다..
     *
     * @param inData  String 평문
     * @param charset String String을 byte 데이터로 변환할때 사용할 charset
     * @return byte[] 암호화 된 데이터
     */
    public String encryptBase64ByURLEncooder(String inData) throws UnsupportedEncodingException;

    /**
     * 암호화 된 바이트 데이터를 받아서 복호화한다.
     *
     * @param encryptBytes byte[] 암호화 된 바이트 데이터
     * @param szKey        byte[] key
     * @return byte[] 복호화 된 바이트 데이터
     */
    public byte[] decrypt(byte[] encryptBytes, byte[] szKey);

    /**
     * 암호화 된 바이트 데이터를 받아서 복호화하여 문자열로 반환한다.
     *
     * @param encryptBytes byte[] 암호화 된 바이트 데이터
     * @param szKey        byte[] key
     * @return byte[] 복호화 된 바이트 데이터
     */
    public String decryptAsString(byte[] encryptBytes, byte[] szKey);

    /**
     * 암호화 된 바이트 데이터를 받아서 복호화하여 지정한 charset으로 문자열로 반환한다.
     *
     * @param encryptBytes byte[] 암호화 된 바이트 데이터
     * @param szKey        byte[] key
     * @param String       charset 복호화 된 바이트 데이터를 문자열로 변환할 때 사용할 Charset
     * @return byte[] 복호화 된 바이트 데이터
     */
    public String decryptAsString(byte[] encryptBytes, byte[] pbUserKey, String charset) throws UnsupportedEncodingException;

    /**
     * BASE64 를 기반으로 복호화 를 처리한다.
     *
     * @param encryptBytes byte[] 암호화 된 바이트 데이터
     * @param szKey        byte[] key
     * @param String       charset 복호화 된 바이트 데이터를 문자열로 변환할 때 사용할 Charset
     * @return byte[] 복호화 된 바이트 데이터
     */
    public String decryptAsStringBase64(String inData) throws UnsupportedEncodingException;

    /**
     * BASE64 를 기반으로 복호화 를 처리한다.
     *
     * @param encryptBytes byte[] 암호화 된 바이트 데이터
     * @param szKey        byte[] key
     * @param String       charset 복호화 된 바이트 데이터를 문자열로 변환할 때 사용할 Charset
     * @return byte[] 복호화 된 바이트 데이터
     */
    public String decryptAsStringBase64ByURLDecoder(String inData) throws UnsupportedEncodingException;

    /**
     * true : 암호화, false : 비암호화 처리한다.
     *
     * @return
     */
    public boolean isTest();

    /**
     * true : 암호화, false : 비암호화 처리한다.
     *
     * @param isTest
     */
    // public void setTest(boolean isTest);

}
