package nlib.cmm.crypto;

import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import egovframework.rte.fdl.cryptography.EgovPasswordEncoder;
import egovframework.rte.fdl.cryptography.impl.EgovARIACryptoServiceImpl;
import nlib.cmm.service.NlibProperty;
import nlib.util.StringUtil;

/**
 * <pre>
 * @Class Name : AriaCrypto.java
 * 
 * @Description : 양방향 Aria 알고리즘 암복호화 처리 클래스 (egov Aria 알고리즘 구현체 사용) 
 * 
 * 
 * @프로젝트명: 지방문화원 통합자료관리시스템 구축사업 (2021)
 *
 * </pre>
 *
 * @ ------------    --------    ---------------------------
 * @ 수정일                     수정자             수정내용
 * @ ------------    --------    ---------------------------
 * @ 2021. 7. 8.     KNKIM       최초 생성
 *
 * 
 * @author 이씨플라자 * DIGITALSHIP KNKIM
 * @since 2021. 7. 8.
 * @version 1.0
 *
 */
@Component("ariaCrypto")
public class AriaCrypto {
	
	private static final Logger log = LoggerFactory.getLogger(AriaCrypto.class); 
	
    /**
     * 암호처리 시, 기본 키 
     */
    private static String ARIA_DEFAULT_KEY = NlibProperty.getProperty("crypto.aria.defaultKey");
    
    /**
     * 기본키를 가지고 암호화한다. 
     * 
     * @param value
     * @return
     */
    public static String encode(String value) {
    	
    	String ret = null;
    	
    	try {
    		ret = AriaUtil.ariaEncrypt(value);
    	} catch(Exception e) {
    		log.error("ERROR at AriaCrypto.encode : " + e.toString());
    		e.printStackTrace();
    		ret = null;
    	}
    	
    	return ret;
    }
    
    /**
     * 기본키를 가지고 Egov 모듈을 사용하여 암호화한다. 
     * 
     * @param value
     * @return
     */
    public static String encodeEgov(String value) {
    	log.info("encode : 암호화에 사용할 키 정보가 없으므로 기본키 정보를 사용합니다 : " + ARIA_DEFAULT_KEY);
    	return encodeEgov(value, ARIA_DEFAULT_KEY);
    }
    
    
	/**
	 * 전달받은 key(사용자고유번호 혹은 메일주소 등 salt값)로 Egov 모듈을 사용하여 암호화한다. 
	 * 
	 * @param value
	 * @param key
	 * @return
	 */
	public static String encodeEgov(String value, String key) {
		
		if(StringUtil.isEmpty(value)) {
			log.error("encode : 암호화할 문자열 정보가 없습니다.");
			return null;
		}

		if(StringUtil.isEmpty(key)) {
			log.error("encode : 암호화에 사용할 키 정보가 없습니다.");
			return null;
		}

		EgovPasswordEncoder egovPasswordEncoder = new EgovPasswordEncoder();
		
		String hashedPassword = egovPasswordEncoder.encryptPassword(key);
		egovPasswordEncoder.setHashedPassword(hashedPassword);
		egovPasswordEncoder.setAlgorithm("SHA-256");
		
		EgovARIACryptoServiceImpl egovARIACryptoServiceImpl = new EgovARIACryptoServiceImpl();
		egovARIACryptoServiceImpl.setPasswordEncoder(egovPasswordEncoder);
		egovARIACryptoServiceImpl.setBlockSize(1025);
		
		return Base64.encodeBase64String(egovARIACryptoServiceImpl.encrypt(value.getBytes(), key));
	}
	
    /**
     * 기본키를 가지고 복호화한다. 
     * 
     * @param value
     * @return
     */
    public static String decode(String value) {
    	
    	String ret = null;
    	
    	try {
    		ret = AriaUtil.ariaDecrypt(value);
    	} catch(Exception e) {
    		log.error("ERROR at AriaCrypto.decode : " + e.toString());
    		e.printStackTrace();
    		ret = null;
    	}
    	
    	return ret;
    }

    /**
     * 기본키를 가지고 Egov 모듈을 사용하여 복호화한다. 
     * 
     * @param value
     * @return
     */
    public static String decodeEgov(String value) {
    	log.info("decode : 복호화에 사용할 키 정보가 없으므로 기본키 정보를 사용합니다 : " + ARIA_DEFAULT_KEY);
    	return decodeEgov(value, ARIA_DEFAULT_KEY);
    }

	/**
	 * 전달받은 key(사용자고유번호 혹은 메일주소 등 salt값)로 Egov 모듈을 사용하여 복호화한다.
	 * @param value
	 * @param key
	 * @return
	 */
	public static String decodeEgov(String value, String key) {

		if(StringUtil.isEmpty(value)) {
			log.error("decode : 복호화할 암호문자열 정보가 없습니다.");
			return null;
		}

		if(StringUtil.isEmpty(key)) {
			log.error("decode : 복호화에 사용할 키 정보가 없습니다.");
			return null;
		}
		
		EgovPasswordEncoder egovPasswordEncoder = new EgovPasswordEncoder();
		
		String hashedPassword = egovPasswordEncoder.encryptPassword(key);
		egovPasswordEncoder.setHashedPassword(hashedPassword);
		egovPasswordEncoder.setAlgorithm("SHA-256");
		
		EgovARIACryptoServiceImpl egovARIACryptoServiceImpl = new EgovARIACryptoServiceImpl();
		egovARIACryptoServiceImpl.setPasswordEncoder(egovPasswordEncoder);
		egovARIACryptoServiceImpl.setBlockSize(1025);
		
		return new String(egovARIACryptoServiceImpl.decrypt(Base64.decodeBase64(value), key));
	}
}
