package kcg.faics.sec.service.impl;

import org.springframework.security.crypto.codec.Base64;
import org.springframework.security.crypto.password.PasswordEncoder;

import egovframework.rte.fdl.cryptography.EgovARIACryptoService;

/**
 * AriaPasswordEncoder.java
 * 
 * @author 임새미
 * @since 2016. 10. 10.
 *
 *  	 수정일                     수정자                                       수정내용
 *  -------------	--------	---------------------------
 *  2016. 10. 10. 	    임새미				       최초생성
 * 
 */
public class AriaPasswordEncoder implements PasswordEncoder {

	/* EgovARIACryptoService */
	private EgovARIACryptoService ariaCryptoService;
	
	/* HashKey */
	private String hashKey;

	/**
	 * 해쉬 키를 입력 받는다.
	 * 
	 * @param hashedPassword 해시비밀번호
	 */
	public void setHashKey(String hashKey) {
		this.hashKey = hashKey;
	}

	/**
	 * 전자정부프레임워크 Aria 암호화 서비스 객체를 설정한다.
	 * 
	 * @param ariaCryptoService EgovARIACryptoService 서비스 객체
	 */
	public void setAriaCryptoService(EgovARIACryptoService ariaCryptoService) {
		this.ariaCryptoService = ariaCryptoService;
	}

	/**
	 * 입력받은 비밀번호를 암호화 한다.
	 * 
	 * @param rawPassword 로그인 시 입력한 비밀번호
	 * @return 비밀번호 -> ARIA -> Base64 로 암호화된 문자열
	 */
	@Override
	public String encode(CharSequence rawPassword) {
		String password = rawPassword.toString();
		String result = null;
		try {
			byte[] encrypted = ariaCryptoService.encrypt(password.getBytes("UTF-8"), hashKey);
			byte[] encoded = Base64.encode(encrypted);
 			result = new String(encoded, 0, encoded.length, "UTF-8");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * DB에 저장된 사용자 비밀번호와 입력받은 비밀번호의 일치여부를 판단한다.
	 * 
	 * @param rawPassword 로그인 시 입력한 비밀번호
	 * @return 비밀번호 일치여부
	 */
	@Override
	public boolean matches(CharSequence rawPassword, String encodedPassword) {
		String encrypted = encode(rawPassword);
		if(encrypted.equals(encodedPassword)){
			return true;
		} 
		return false;
	}
	
	/* hash key 생성을 위한 main 함수
	public static void main(String[] args) {
		EgovPasswordEncoder encoder = new EgovPasswordEncoder();
		encoder.setAlgorithm("SHA-256");
		System.out.println("Digested Password : " + encoder.encryptPassword("faics1234567"));
	}*/
}
